![The Social Layer](https://cdn.slatesource.com/b/d/8/bd8a2887-e649-4ea6-a998-ee6410263af0.webp)

# The Social Layer

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

# Which half of this page did you come for?

This is the comment system. Not a picture of it. If you are signed in you can post here and upvote what other people wrote. Sorting is fixed: most upvotes first, then oldest. There is no threading, no editing, and no delete. Every comment on Slatesource lives inside a Thread chip like this one, which means comments are something an author opts into by placing a chip, not something bolted onto the bottom of every page.

No comments yet. Be the first.

Log in to comment

## FourFour ThingsThings at FourFour DifferentDifferent StagesStages

ReactionsReactions, commentscomments, followsfollows and notificationsnotifications getget describeddescribed togethertogether as a socialsocial layerlayer, whichwhich flattersflatters threethree of them. They were builtbuilt yearsyears apartapart, they have very differentdifferent amountsamounts of finishfinish, and pretendingpretending otherwiseotherwise wouldwould makemake this pagepage uselessuseless as a referencereference. So: in orderorder, bestbest firstfirst.

Reaction types

5

Reactions one person can leave on one chip

all 5

Comment length limit

1000

Notification types declared

5

Notification types ever produced

3

## ReactionsReactions AttachAttach to ChipsChips

LoveLove, ApplauseApplause, FireFire, InsightInsight, On pointpoint. They landland on a singlesingle chipchip ratherrather than the pagepage, so a slateslate with twelvetwelve chipschips has twelvetwelve independentindependent reactionreaction barsbars and the shapeshape of the responseresponse tellstells you whichwhich partpart landedlanded. The barbar is hiddenhidden entirelyentirely at zerozero and whilewhile editingediting, so an emptyempty pagepage staysstays quietquiet insteadinstead of showingshowing fivefive greygrey zeroeszeroes.

## Not a RadioRadio ButtonButton

The uniquenessuniqueness constraintconstraint is on the tripletriple of chipchip, useruser and reactionreaction typetype, not the pairpair. OneOne personperson can leaveleave all fivefive on the samesame chipchip. That was a choicechoice: a reactionreaction herehere is a notenote about what the chipchip is, not a singlesingle votevote, and somethingsomething can be bothboth funnyfunny and usefuluseful.

java

1

2

3

4

5

```
@Table(
    name = "chip_reactions",
    uniqueConstraints =
        @UniqueConstraint(columnNames = {"chip_id", "user_id", "reaction_type"}))
```

## NothingNothing Is CountedCounted TwiceTwice

ThereThere is no countercounter columncolumn anywhereanywhere. TotalsTotals are groupedgrouped on readread, and a wholewhole pagepage of reactionsreactions comescomes backback in oneone queryquery ratherrather than oneone perper chipchip. It costscosts a littlelittle at readread timetime and it meansmeans the numbernumber is nevernever wrongwrong, whichwhich for a featurefeature nobodynobody auditsaudits is the betterbetter tradetrade.

## They SurviveSurvive a RepublishRepublish

This is the partpart worthworth stealingstealing. When a slateslate is pushedpushed againagain from a repositoryrepository the chipschips are rebuiltrebuilt from scratchscratch, whichwhich wouldwould normallynormally orphanorphan everyevery reactionreaction. InsteadInstead, oldold and newnew chipschips are matchedmatched by their rowrow and positionposition in the gridgrid and the reactionsreactions are re-pointedre-pointed. EditEdit a typotypo on a chipchip that thirtythirty peoplepeople reactedreacted to and the thirtythirty staystay. BuildingBuilding that was slowerslower than not buildingbuilding it, and it is the differencedifference betweenbetween a featurefeature peoplepeople trusttrust and oneone they learnlearn to avoidavoid.

## FollowsFollows FollowFollow SlatesSlates

ThereThere is no user-to-useruser-to-user followfollow anywhereanywhere in the codebasecodebase. You followfollow a slateslate, whichwhich suitssuits a platformplatform where the thingthing worthworth trackingtracking is a projectproject ratherrather than a personperson. The endpointsendpoints workwork. The followfollow and unfollowunfollow hookshooks on the frontfront endend are fullyfully writtenwritten and have zerozero callcall sitessites, so therethere is no buttonbutton to presspress. The feedfeed that wouldwould listlist what you followfollow is oneone repositoryrepository methodmethod that nothingnothing callscalls.

## NotificationsNotifications Are HalfHalf a LoopLoop

ThreeThree eventsevents writewrite a notificationnotification: someonesomeone followsfollows your slateslate, you getget invitedinvited to oneone, you getget a messagemessage. ReactionsReactions and commentscomments writewrite nothingnothing, thoughthough the enumenum has valuesvalues for bothboth. The seenseen timestamptimestamp existsexists on the recordrecord and is nevernever setset by any codecode, so the unreadunread countcount only everever goesgoes up. The screenscreen that wouldwould renderrender them expectsexpects a titletitle and a bodybody the serverserver does not sendsend, and it is not importedimported by anythinganything, so it has nevernever been on screenscreen. WrittenWritten pathpath partlypartly alivealive, readread pathpath not builtbuilt.

Where the four stand today

56%

Reactions: shipped and in use

Reactions survive a republish

Comments: post and upvote

Comments: edit delete or report

Follows: endpoints live

Follows: a button anywhere

Notifications: written on follow invite and message

Notifications: marked as read

Notifications: shown to anyone

## Why PublishPublish the GapsGaps

BecauseBecause the alternativealternative is a pagepage that readsreads likelike a featurefeature listlist and teachesteaches nothingnothing. The interestinginteresting contentcontent in a socialsocial layerlayer is not that it has reactionsreactions. It is that reactionsreactions were builtbuilt to survivesurvive a rebuildrebuild and notificationsnotifications were not finishedfinished, and that bothboth of those are truetrue at the samesame timetime in a productproduct that shipsships.

> Three of these are features. One is an enum with good intentions.