Skip to content

docs: the landing page says what this is before it draws how it works - #227

Merged
lex00 merged 2 commits into
mainfrom
docs/landing-introduction
Sep 19, 2026
Merged

lex00 merged 2 commits into
mainfrom
docs/landing-introduction

Conversation

@lex00

@lex00 lex00 commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

Not filed against an issue — this came out of watching the vocabulary get hammered out against a skeptic in real time. #181's third move is adjacent but this is a different and I think better change than the reordering it proposed.

The inversion

The page order was hero → loop diagram → code comparison → platforms → proof. A cold reader met a six-node mechanism diagram before anything gave them words for it.

And the plain statement already existed — buried as the third sentence under the code:

The second one has completion and a type error on a misspelt key. It reuses one helper across repositories. The tool reads the same object from either file and never executes the second one to get it.

Phrased as a property of the tool rather than as what the thing is.

Now

Introduction between the hero and the loop, with .Content moved up to join it. Order is what it is → an example → how it moves, so the diagram illustrates something the reader already has words for.

Your configuration is a TypeScript file. A separate program reads it and works out the values itself, refusing anything it would have to run.

Not the type system, so no tsc and no types involved. Not a sandbox either. Think a JSON parser that also understands 1 + 1, spread, and references into other files.

A call to Date.now() is refused rather than executed, and that file falls back to being run normally. You are told which files those were. What comes back is reproducible from the source alone, which is the thing running it can never give you.

Three paragraphs, three jobs: what it is, which frames it is not, why that matters.

Two choices worth defending

Naming the wrong frames is deliberate. "Not the type system" and "not a sandbox" are the two readings a reader supplies unprompted — the first cost four exchanges before the idea landed at all, and the second is the standard objection. Stating them costs one sentence and saves the reader from arriving at them alone.

"Refusing", not "skipping". Skipping is what Prepack does: residualise what you cannot evaluate, emit the rest. Refusal is per file with a fallback, and the wrong verb files you in the wrong family.

Cut

The comparison paragraph loses its third sentence, which the introduction now says better and earlier. Cut rather than reworded.

Left alone

The tagline. "Compiling TypeScript to configuration." is accurate and carries none of the axis, but a wordier one was rejected earlier and the tolerance there isn't mine to guess.

Verification

121 tests in 19 files, prose lint 51 with no regressions, npm run docs:build clean, and the rendered order confirmed from docs/public/index.html.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AzfJnYw9p6rAxhJqXK3CPv

lex00 and others added 2 commits September 16, 2026 11:17
The page opened with a six-node loop diagram. A reader met the mechanism
before anything gave them words for it, and the plain statement was sitting
third in a paragraph under the code comparison, phrased as a property of the
tool rather than as what the thing is.

An introduction now sits between the hero and the loop, and `.Content` moves
with it, so the order is: what it is, an example, then the diagram of how it
moves. The diagram illustrates something the reader already has words for.

The words are the ones that worked on somebody who opened with "I don't
believe that's possible" and arrived at "typed json with arithmetic?" on his
own. Three paragraphs doing three jobs: what it is, which frames it is not,
and why that matters.

Naming the wrong frames is deliberate rather than defensive. "Not the type
system" and "not a sandbox" are the two readings a reader supplies unprompted,
and leaving them unstated cost four exchanges before the idea landed at all.

"Refusing" rather than skipping, because skipping is what Prepack does:
residualise the parts you cannot evaluate and emit the rest. Refusal is per
file and the file falls back.

The comparison's paragraph loses its third sentence, which the introduction
now says better. Cut rather than reworded.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AzfJnYw9p6rAxhJqXK3CPv
"Compiling TypeScript to configuration." is accurate and says nothing about
the only thing that distinguishes this. It reads as a description of CDK.

"TypeScript configuration, read as data and never run."

Not "a subset of TypeScript", which was the first draft and is the one opening
the epic warns against by name: "Not 'here is a statically evaluable subset of
TypeScript' — Starlark, Dhall, Nickel, Pkl, jsonnet and CUE are all in that
space and a reviewer will say so immediately". Leading with the word hands a
reader that shelf in four words, before the page can say what differs.

Both places, since the tagline is also the fallback meta description.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AzfJnYw9p6rAxhJqXK3CPv
@lex00
lex00 merged commit 710c593 into main Sep 19, 2026
3 checks passed
@lex00
lex00 deleted the docs/landing-introduction branch September 19, 2026 21:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant