![Chext](https://cdn.slatesource.com/f/d/e/fdefba99-569b-4891-a123-7a2fb71d625d.webp)

# Chext

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

## ChextChext

The formatformat this pagepage is writtenwritten in. A blockblock startsstarts at any lineline whosewhose firstfirst charactercharacter is a coloncolon and runsruns untiluntil the nextnext oneone. ThereThere is no closingclosing tagtag, no indentationindentation rulerule and no fencefence. That is nearlynearly the wholewhole specificationspecification.

## The TwoTwo ChipsChips BelowBelow Were WrittenWritten LikeLike This

SixSix lineslines. What you seesee underunder the codecode blockblock is what those sixsix lineslines producedproduced, on this pagepage, in this renderrender.

plaintext

1

2

3

4

5

6

7

```
 :NOTE
 A note is one block. Every line inside it joins into a single string.
 |
 :INFO
 The Chip Under the Note
 Line one becomes the title. Everything after it becomes the body.
```

A note is one block. Every line inside it joins into a single string.

## The ChipChip UnderUnder the NoteNote

LineLine oneone becomesbecomes the titletitle. EverythingEverything afterafter it becomesbecomes the bodybody.

## Why That CodeCode BlockBlock Is IndentedIndented

BecauseBecause a lineline whosewhose firstfirst charactercharacter is a coloncolon startsstarts a newnew blockblock, and the parserparser appliesapplies that rulerule insideinside a codecode blockblock too. To quotequote chextchext markersmarkers verbatimverbatim in chextchext, everyevery markermarker lineline needsneeds a leadingleading spacespace it does not otherwiseotherwise have. This is a genuinegenuine limitationlimitation of the formatformat, discovereddiscovered the firstfirst timetime someonesomeone triedtried to documentdocument the formatformat in the formatformat, and it is leftleft in ratherrather than special-casedspecial-cased. A parserparser with an escapeescape hatchhatch for its ownown documentationdocumentation is a parserparser with a specialspecial casecase in it foreverforever.

## ThereThere Is No RegularRegular ExpressionExpression

The blockblock parserparser is ninety-fourninety-four lineslines of stringstring indexindex arithmeticarithmetic. It splitssplits on newlinenewline, stripsstrips trailingtrailing whitespacewhitespace only, and asksasks whetherwhether the firstfirst charactercharacter is a coloncolon. LeadingLeading whitespacewhitespace is deliberatelydeliberately preservedpreserved, whichwhich is what makesmakes indentedindented codecode survivesurvive. AnythingAnything appearingappearing beforebefore the firstfirst markermarker is discardeddiscarded withoutwithout commentcomment, whichwhich is why a filefile can startstart with a notenote to yourselfyourself.

## How an AttributeAttribute Is ReadRead

FindFind the firstfirst openingopening bracketbracket on the markermarker lineline, findfind the firstfirst closingclosing bracketbracket, splitsplit what is betweenbetween them on commascommas, splitsplit eacheach piecepiece at its firstfirst coloncolon. LowercaseLowercase the keykey, keepkeep the valuevalue exactlyexactly as writtenwritten. TwoTwo consequencesconsequences followfollow directlydirectly and neitherneither is workedworked aroundaround: an attributeattribute valuevalue can nevernever containcontain a commacomma, becausebecause a commacomma alwaysalways endsends it, and it can nevernever containcontain a closingclosing bracketbracket. If you needneed eithereither, the valuevalue belongsbelongs in the bodybody.

## TwoTwo ColumnsColumns, and the PipePipe DecidesDecides

A markermarker suffixedsuffixed with .halfhalf asksasks for halfhalf widthwidth. A blockblock whosewhose lastlast non-blanknon-blank lineline is a singlesingle pipepipe charactercharacter is linkedlinked to the oneone afterafter it. RowsRows are twotwo columnscolumns widewide and that numbernumber is hardcodedhardcoded. The importantimportant partpart is that adjacencyadjacency is not what pairspairs twotwo halveshalves: the pipepipe is. TwoTwo halfhalf blocksblocks writtenwritten oneone afterafter anotheranother with no pipepipe betweenbetween them landland in twotwo separateseparate rowsrows, eacheach halfhalf emptyempty. The nextnext codecode blockblock and the pairpair beneathbeneath it are the samesame sevenseven lineslines againagain.

plaintext

1

2

3

4

5

6

7

8

```
 :INFO.half
 Left
 The pipe on the line below belongs to this block.
 |
 :INFO.half
 Right
 Which is why these two share a row.
```

## LeftLeft

The pipepipe on the lineline belowbelow belongsbelongs to this blockblock.

## RightRight

WhichWhich is why these twotwo shareshare a rowrow.

## What the PositionsPositions MeanMean

The typetype is everythingeverything beforebefore the firstfirst dotdot, and halfhalf is truetrue if .HALFHALF appearsappears anywhereanywhere in the suffixsuffix. So .halfhalf, .HALFHALF, .bigbig.halfhalf and .halfhalf.bigbig all givegive you a halfhalf chipchip, and .bigbig on its ownown givesgives you a fullfull oneone. UnknownUnknown modifiersmodifiers are ignoredignored ratherrather than rejectedrejected, so a typotypo costscosts you a layoutlayout and not a pagepage.

Chip types in the vocabulary

43

Types with a chext builder

29

Grid columns

2

Maximum input length

200,000 chars

Issue severities

2

## The FailureFailure ModelModel, PreciselyPrecisely

ThreeThree outcomesoutcomes, and they are not equallyequally loudloud. A bean-validationbean-validation failurefailure dropsdrops that oneone chipchip and recordsrecords a warningwarning, so a titletitle oneone charactercharacter over its limitlimit makesmakes the chipchip vanishvanish quietlyquietly and the restrest of the pagepage renderrender finefine. An unknownunknown chipchip typetype recordsrecords an errorerror and skipsskips the blockblock. And an exceptionexception thrownthrown insideinside a builderbuilder is caughtcaught by nothingnothing at all: it propagatespropagates out and the entireentire slateslate failsfails to syncsync. WorthWorth sayingsaying plainlyplainly: no authoringauthoring mistakemistake currentlycurrently reachesreaches that thirdthird levellevel. EveryEvery enumenum lookuplookup in the twenty-ninetwenty-nine buildersbuilders is wrappedwrapped and fallsfalls backback, and the StatsStats iconicon that usedused to failfail a wholewhole slateslate nownow resolvesresolves to a defaultdefault insteadinstead. The pathpath is openopen and nothingnothing walkswalks it todaytoday.

The quiet one is the dangerous one. A chip that silently is not there looks identical to a chip you forgot to write.

## MarchMarch 20262026, Forty-OneForty-One FilesFiles

The parserparser usedused to livelive in the browserbrowser. On the thirteenththirteenth of MarchMarch 20262026 it movedmoved to the serverserver in a singlesingle commitcommit: forty-oneforty-one filesfiles changedchanged, twotwo hundredhundred and eighty-nineeighty-nine lineslines addedadded, fourfour hundredhundred and ninetyninety removedremoved. An eighty-nineeighty-nine lineline clientclient parserparser was deleteddeleted and a chextchext blockblock was strippedstripped out of eighteeneighteen separateseparate chipchip definitiondefinition filesfiles. The reasonreason was oneone sourcesource of truthtruth. A reporepo syncsync and a pastepaste into the importimport boxbox nownow go throughthrough identicalidentical codecode, so a filefile that worksworks in oneone worksworks in the otherother.

## What the MoveMove CostCost

The oldold browserbrowser parserparser strippedstripped inlineinline commentscomments: everythingeverything afterafter a doubledouble slashslash on any lineline, markermarker or contentcontent, was cutcut. The serverserver parserparser only recognisesrecognises a commentcomment when the lineline beginsbegins with oneone. The documentationdocumentation screenscreen stillstill describesdescribes the oldold behaviourbehaviour, with an exampleexample whosewhose outputoutput wouldwould nownow containcontain the commentcomment it promisespromises to removeremove. A behaviourbehaviour was droppeddropped and its documentationdocumentation was not, whichwhich is a normalnormal thingthing to happenhappen and an abnormalabnormal thingthing to leaveleave standingstanding for fourfour monthsmonths.

## The FormatFormat Only GoesGoes OneOne WayWay

ThereThere is a serializerserializer that turnsturns chipschips backback into chextchext, and it existsexists solelysolely to serveserve the .chextchext URLURL extensionextension. It is not usedused for editingediting, and the editoreditor nevernever round-tripsround-trips throughthrough texttext. That asymmetryasymmetry has consequencesconsequences you can observeobserve: ImageImage, GalleryGallery and PortfolioPortfolio serializeserialize to a barebare markermarker with no contentcontent, and any typetype the serializerserializer does not handlehandle fallsfalls throughthrough to the samesame emptyempty resultresult. A JourneyJourney chipchip serializedserialized and re-parsedre-parsed comescomes backback with zerozero entriesentries becausebecause the twotwo sidessides disagreedisagree on the entryentry formatformat. A tasktask in progressprogress serializesserializes to a tasktask that is donedone. Round-trippingRound-tripping was nevernever a requirementrequirement, so it was nevernever truetrue, and callingcalling it a bugbug wouldwould be generousgenerous to the originaloriginal planplan.

## Twenty-NineTwenty-Nine of Forty-ThreeForty-Three

FourteenFourteen chipchip typestypes are declareddeclared in the enumenum with no builderbuilder behindbehind them. They cannotcannot be writtenwritten from a filefile and nevernever couldcould be. The gapgap betweenbetween a vocabularyvocabulary and an implementationimplementation is usuallyusually hiddenhidden; herehere it is oneone enumenum awayaway from anyoneanyone who lookslooks.

> A format small enough to hold in your head is a format you will still be able to read in three years.

[The reference, generated from the chip definitions themselves](https://slatesource.com/chips/chext?utm_source=slatesource)