The explanation that lived in a chat thread
Someone explains why we stopped doing something, and three months later the reasoning is buried under a thousand messages. A post keeps it findable, with the screenshot of the screen it was about.
Where we write down how we work, and what we decided not to do.
Four posts so far: a week in Growth-OS from Monday to Friday, what Growth-OS deliberately will not do, how a decision survives the month it was made in, and why every insight carries the quote it came from. A post is one typed entry, and the listing, filters, reading time, related stories and article markup all derive from it.
The mechanism end to end, as implemented in the repository.
Add a typed post
Define the post in one content file with its slug, date, description, author, tags and content blocks. The required fields are enforced by the type.
Discovery derives itself
The featured story, category filters, search, reading time and listing cards are computed from the catalog, with no wiring per post.
One shell renders every post
The shared article component renders all six block types, and a related link must point at a post that exists, so it cannot go stale.
Crawlers see what readers see
The post page emits article markup from the same metadata that renders on screen, so the two cannot disagree.
Interactive example
This walkthrough demonstrates the implemented backend contract without using an account, credentials, or provider calls.
Interactive example
Deterministic sample data only. No account, provider, or network connection is used by the interaction.
Without a shared foundation, every team rebuilds these edge cases, differently.
Someone explains why we stopped doing something, and three months later the reasoning is buried under a thousand messages. A post keeps it findable, with the screenshot of the screen it was about.
One post with no date, another with no author, a third with no description. Making those fields part of the type means an incomplete post cannot build.
Hand-rolled markup per article makes callouts, screenshots and code blocks drift apart, and writing turns into coding. Six block types through one shell keeps every post consistent.
Highlights
Add a post to one typed file and the listing, filters, reading time and related stories update on their own.
Paragraphs, lists, callouts, code, screenshots of the real workspace and quotes all render through one shared article layout, so every post reads the same way.
Date, author and description are part of the type, so an incomplete post fails the build rather than publishing with holes in it.
Engineering guarantees
Posts live in the repository and are checked at build time. A screenshot block names a capture taken from the real workspace, and a name that does not exist renders nothing rather than a broken image. RSS, stored feedback and generated social images are not built, and the disabled Sanity scaffold is not an active content system.
The boundary above is code, not a claim. These files carry the contract:
src/modules/blog/content.tssrc/modules/blog/BlogArticle.tsxsrc/routes/_public/blogThese capabilities share contracts and boundaries with this one.
The docs describe the same contracts this page demonstrates.