Colophon
How this site is built, what it costs you to load it, and what it doesn’t do.
Stack
- Astro — content, not an app. Zero JavaScript by default, and none shipped.
- One dependency.
astro, and nothing else. Tailwind, MDX, an RSS builder and a sitemap integration were all removed rather than kept “in case” — every one of them was either unused or replaceable by twenty lines. - Hand-written CSS on one token layer. There used to be two parallel token systems here and one of them was dead; that is how a design drifts.
- Native view transitions between pages — no client router, no JavaScript.
- Static output, hosted at the edge.
What it doesn’t do
- No trackers. No analytics by default. No cookie banner, because there are no cookies.
- No third-party scripts, no third-party requests of any kind. This is checked against the built output on every build, not asserted.
- No JavaScript at all. The build fails if a single byte of it appears in the output.
- No fake status lights — see below.
The one design rule
Every status on this site is measured or it does not render. That is not a promise, it is a build step: the component that draws a green stamp throws an error if it isn’t handed a measurement date, and the six numbers on the homepage are read off the built site after every build, then re-read and compared. If a number drifts from the artifact, the build fails rather than publishing the stale one.
This isn’t modesty. I have watched an agent told to fully inhabit a role invent details wholesale to stay in character — every one of them fabricated, all of them plausible. The lesson generalised: immersion instructions and accuracy instructions compete, and immersion wins unless accuracy is made explicitly superior. A portfolio is an immersion instruction. So the rule isn’t written on the wall, it’s wired into the build, where it can’t be talked out of.
The design
The site is set like a printed engineer’s journal: paper first, ink serif, typewriter mono for data, and red ink as the only accent — because red ink is the colour of corrections, and publishing corrections next to the mistake is the closest thing this site has to a thesis. Where you see a red rule in the margin, something above it was wrong and was fixed in place rather than quietly rewritten.
Status chips are set as rubber stamps, slightly off-square, the way a real stamp lands. Green remains reserved for measured-alive states only. A value the site does not know is set in a deliberately soft, low-contrast grade of the display face and reads UNKNOWN in words — three signals for one state, so it survives greyscale and a screen reader as well as it survives a glance.
Type & colour
- Fraunces for display — an old-style serif with opinions, used as a variable face on both its weight and optical-size axes.
- Newsreader for body text — designed for long reading.
- Courier Prime for labels, datelines and data — the typewriter, used as a typewriter.
- Red ink
#a8382bas the single accent (brightened to#d96a57in the dark theme). -
Measured green
#3f6b3f/#7fa97afor verified-alive states only. Green is earned, never default. -
Warm paper
#f6f1e7in the light theme; a warm dark#171310after dusk — the site follows your system preference, and both themes are first-class.
Contrast is computed from the tokens at build time, not eyeballed and not typed here by hand: light theme — body ink 14.9:1, secondary ink 5.6:1, red ink 5.7:1, measured green 5.5:1, secondary on raised 5.2:1; dark theme — body ink 14.4:1, secondary ink 6.8:1, red ink 5.4:1, measured green 6.9:1, secondary on raised 6.4:1. Every pair clears the 4.5:1 the standard asks for, in both themes, including text on raised surfaces — and if one ever doesn’t, this page never gets built.
Known debt
Naming my own debt first is a rule I apply to myself, so it lives here rather than nowhere. Reviewed on every build; each entry carries its own date.
- Open The canonical domain is bought but not yet resolving. Every canonical, OG URL and sitemap entry on this site points at
shauryasingh.com. Until DNS transfers, those URLs are correct and unreachable at the same time. Nothing in the build depends on the domain resolving. Raised 2026-07-21 - Open The private voice agent has no dated health check, so it carries an Unverified stamp instead of a green one. The stamp component would refuse to draw green anyway. This is the rule costing me something, which is the only proof that it’s real. Raised 2026-07-21
- Open Dark mode has no user override. The site follows your system preference and there is no toggle, because a toggle needs JavaScript or a
:has()-based checkbox hack, and the zero-JS rule won that trade. If your OS is light and you want dark here, you can’t. That is a real cost and it belongs on this list rather than nowhere. Raised 2026-07-21 - Open Lighthouse has not been run against this build. The previous design measured well; that number belonged to that design and is not inherited. Nothing will be printed here until it is measured. Raised 2026-07-21
- Part What is measured sits on the front page, not here, taken from the built output on every build. Disk truth is not wire truth, and the number that matters to you is the wire one. Raised 2026-07-21
- Closed The Reading section on /now was a placeholder. It got deleted rather than filled — a living page with a dead section is just a dead page. Closed 2026-07-19
- Closed
Corrected 2026-07-19
Fonts were loading from a third party, contradicting the rule above. Now five self-hosted latin.woff2files, verified against the built output rather than assumed. Closed 2026-07-19 - Closed Two parallel colour-token systems, one of them dead and referenced nowhere. Merged into one. Closed 2026-07-21
- Closed The optical-size axis was declared and did nothing. The masthead and headings asked Fraunces for a specific optical size while the loaded font file didn’t carry that axis. Fixed by shipping the file that does. Closed 2026-07-21