![The Discovery Feed](https://cdn.slatesource.com/1/9/1/191bd243-cf79-421b-835d-703085770326.webp)

# The Discovery Feed

- [Made in Slatesource](https://slatesource.com/@steph/the-discovery-feed)
- By [Steph](https://slatesource.com/@steph)
- Created on Jul 19, 2026

Trending slates returned

3

New slates returned

3

Spotlights

2

Cache lifetime

1 hour

Cache entries

1

Categories seeded

3,558

## The FeedFeed, StatedStated PlainlyPlainly

OneOne endpointendpoint returnsreturns fourfour thingsthings: threethree trendingtrending slatesslates, threethree newnew onesones, a chipchip of the dayday, and twotwo spotlightsspotlights. It takestakes no argumentsarguments. It is not paginatedpaginated. It is cachedcached for an hourhour in a storestore with roomroom for exactlyexactly oneone entryentry, whichwhich is a fairfair descriptiondescription of the ambitionambition: this is a frontfront doordoor, not a recommenderrecommender.

## TrendingTrending Is ImpressionsImpressions and NothingNothing ElseElse

The queryquery is namednamed afterafter likeslikes and viewsviews. LikesLikes do not appearappear in it. It countscounts distinctdistinct impressionimpression rowsrows perper publicpublic indexedindexed slateslate and ordersorders by that countcount, descendingdescending, over all timetime.

sql

1

2

3

4

5

6

7

```
 select s from Slate s
 left join SlateImpression si on s.id = si.slate.id
 where s.visibility = 'PUBLIC' and s.indexed = true
 and s.deletedAt is null
 group by s.id
 order by count(distinct si) desc
```

## No DecayDecay, and a LoopLoop

ThereThere is no timetime windowwindow and no halfhalf lifelife. A slateslate that did wellwell onceonce outranksoutranks everythingeverything afterafter it, indefinitelyindefinitely. And appearingappearing in the feedfeed recordsrecords impressionsimpressions for the slatesslates in the feedfeed, whichwhich is the exactexact numbernumber that putput them therethere. Being trendingtrending makesmakes you moremore trendingtrending. The repositoryrepository alreadyalready containscontains a windowedwindowed variantvariant that takestakes a weekweek startstart parameterparameter. DiscoveryDiscovery does not callcall it.

## NewNew Is RecencyRecency With a CliffCliff

PublicPublic, indexedindexed, createdcreated withinwithin the lastlast sevenseven daysdays, newestnewest firstfirst. No fallbackfallback, no backfillbackfill. If nothingnothing is publishedpublished for a weekweek the sectionsection is emptyempty ratherrather than reachingreaching furtherfurther backback. On a platformplatform this sizesize that is not hypotheticalhypothetical.

The category page uses the same query with ascending order, so a category's New carousel leads with the oldest slate of the past week. That is a bug, not a decision.

## EveryoneEveryone SeesSees the SameSame ThingThing

The serviceservice nevernever acceptsaccepts a useruser in the firstfirst placeplace. Its entryentry pointpoint takestakes no callercaller argumentargument, and a guestguest identityidentity is constructedconstructed afterwardsafterwards purelypurely to attributeattribute impressionimpression recordingrecording. CombinedCombined with a singlesingle entryentry cachecache, the feedfeed is identicalidentical for everyevery visitorvisitor by constructionconstruction, not by accidentaccident. ThereThere is no personalisationpersonalisation to disabledisable becausebecause nonenone was everever builtbuilt. WhetherWhether that is a deficiencydeficiency dependsdepends on whetherwhether you thinkthink a platformplatform with this muchmuch contentcontent shouldshould be guessingguessing at tastetaste yetyet.

journey·5 strengths

# How well each discovery surface actually works

1 is barely functional, 5 is solid

/

strength

"The strongest surface by some distance

"Works, but ascending order on category pages

## CategoriesCategories Are HandHand WrittenWritten

SixteenSixteen rootsroots, 477477 nodesnodes at the secondsecond levellevel, 1,863863 at the thirdthird, and a longlong thinningthinning tailtail that reachesreaches eleveneleven levelslevels deepdeep. 3,558558 rowsrows in totaltotal, seededseeded from a singlesingle SQLSQL filefile. ScienceScience and TechnologyTechnology, ArtsArts and CultureCulture, NatureNature and EnvironmentEnvironment, AnimalsAnimals and PetsPets, and twelvetwelve moremore. No languagelanguage modelmodel builtbuilt this treetree. A personperson wrotewrote the treetree, and slatesslates are assignedassigned by their authorauthor at creationcreation or reassignedreassigned by an adminadmin laterlater. It is unglamorousunglamorous and it is the partpart of discoverydiscovery that worksworks bestbest.

## The CountsCounts DriftDrift

EachEach categorycategory carriescarries a denormaliseddenormalised slateslate countcount, incrementedincremented and decrementeddecremented up the treetree on everyevery writewrite. It goesgoes wrongwrong, and the repairrepair is an adminadmin endpointendpoint that recursivelyrecursively recountsrecounts the wholewhole treetree. SinceSince rootroot orderingordering on the categorycategory listlist dependsdepends on that numbernumber, a drifteddrifted countcount quietlyquietly reordersreorders the frontfront pagepage of the taxonomytaxonomy.

## ExploreExplore Is a TabTab, Not a ScreenScreen

The ExploreExplore surfacesurface that shippedshipped on 20 MarchMarch 20262026 is describeddescribed as a gridgrid of randomrandom publicpublic chipschips. It liveslives as a tabtab insideinside the chipchip cataloguecatalogue ratherrather than a routeroute of its ownown. The randomnessrandomness is alsoalso not quitequite therethere: the queryquery ordersorders by publishpublish datedate descendingdescending, and the shuffleshuffle happenshappens afterwardsafterwards, on the pagepage that was alreadyalready fetchedfetched. ScrollScroll farfar enoughenough and you walkwalk straightstraight downdown the timelinetimeline. ShufflingShuffling a pagepage you alreadyalready have addsadds no diversitydiversity, only the appearanceappearance of it.

## SearchSearch Is a SubstringSubstring ScanScan

No fullfull texttext indexindex existsexists on the slatesslates tabletable. SearchSearch is a LIKELIKE with a leadingleading wildcardwildcard on the displaydisplay namename, whichwhich no indexindex can serveserve, so everyevery queryquery is a fullfull tabletable scanscan. It returnsreturns twelvetwelve resultsresults perper sectionsection with no orderingordering clauseclause at all: the rowsrows arrivearrive in whateverwhatever orderorder the databasedatabase handshands backback. SlateSlate The categorycategory and chipchip pathspaths lowercaselowercase bothboth sidessides beforebefore comparingcomparing; the slateslate pathpath does not. That asymmetryasymmetry is realreal in the codecode, thoughthough it is invisibleinvisible to usersusers: the tabletable collationcollation is casecase and accentaccent insensitiveinsensitive, so the matchmatch worksworks anywayanyway. It is a latentlatent bugbug ratherrather than a livelive oneone.

sql

1

2

3

4

5

6

```
 select s from Slate s LEFT JOIN s.category c
 where ((:name IS NULL OR s.displayName LIKE CONCAT('%', :name, '%'))
 AND (:industry IS NULL OR LOWER(c.name) LIKE CONCAT('%', :industry, '%')))
 AND (s.visibility = 'PUBLIC' OR (:actingUsername IS NOT NULL
 AND s.author.username = :actingUsername)) and s.deletedAt is null
```

## Only the TitleTitle Is SearchableSearchable

Not the descriptiondescription. Not the chipchip contentscontents. Not any sub-pagesub-page. A slateslate about NorwegianNorwegian fjordsfjords titledtitled PostcardsPostcards From the NorthNorth is unfindableunfindable by searchingsearching for NorwayNorway. That singlesingle limitationlimitation probablyprobably costscosts moremore discoverydiscovery than the rankingranking gapsgaps aboveabove it combinedcombined.

## The CodeCode That Was WrittenWritten and NeverNever WiredWired Up

TwoTwo queriesqueries sitsit in the repositoryrepository implementingimplementing genuinegenuine discoverydiscovery heuristicsheuristics. OneOne ordersorders by how manymany followersfollowers a slateslate has. The otherother boostsboosts underexposedunderexposed workwork: slatesslates with fewerfewer than fiftyfifty followersfollowers, publishedpublished in the lastlast thirtythirty daysdays, with the dominantdominant categorycategory excludedexcluded so oneone topictopic cannotcannot fillfill the feedfeed. NeitherNeither has a singlesingle callercaller. SomeoneSomeone thoughtthought carefullycarefully about exposureexposure balancingbalancing, builtbuilt it, and stoppedstopped beforebefore the lastlast connectionconnection. It is the mostmost interestinginteresting codecode in the modulemodule and it has nevernever runrun in productionproduction.

Discovery as it stands

50%

A curated category tree with real depth

A trending list, on an honest but crude metric

A new list, with a hard seven day edge

Search that finds a title you already half remember

Recency decay in trending

Any personalisation at all

Search across descriptions or chip content

The exposure balancing that is already written

> A feed with no decay does not rank work. It ranks whatever got lucky first.

[The chip catalogue, where Explore actually lives](https://slatesource.com/chips?utm_source=slatesource)