The three-way split
A docs/wiki site built with this toolkit is assembled from three parts, each owning exactly one layer. The lines between them are not taste — each is backed by a constraint that bites when it is crossed.
§1Three layers, three owners
- astro-inkbrush (the engine): a minimal CMS — in-place block editing in the browser, block-level revision history and revert, comments, AI Q&A / rewriting / translation, inbox import. It also owns one thing that looks like it shouldn't belong to a CMS: the Markdown dialect and the content guard. The reason is hard: the grammar the editor accepts and the grammar the page renders must be the same one, or "saves fine in the editor, renders wrong on the page" is only a matter of time. So the parser rules are written once, in the engine, and consumed in three places — site rendering, CMS save validation, CI checks.
- astro-inkstone (the paper — this package): the shared appearance and pipeline layer — two-tier design tokens in two contexts, the content stylesheet
base.cssand the browse shelfbrowse.css, the component library, thesiteMarkdownpipeline preset, the taxonomy and backlink helpers this garden runs on, the Maple Mono CN code-font subset, and the render-layer probes. It does not do site identity: brand colors, layout chrome, routing and deployment are none of its business. - The site (like the garden you are reading): overrides tier-one tokens for its identity color; owns its own Sidebar and nav chrome (this site's implementation is the reference answer); decides how content is organized, what routes look like, and where it deploys.
One line to remember: the engine edits, the paper looks, the site is you.
§2Why the lines sit here
Each cut is backed by a real constraint:
The dialect belongs to the engine, because a checker whose plugin set differs from the site's is worse than no checker at all — a checker missing the math plugin misreads formula braces as JSX expressions, and one without GFM waves table pipes through. The grammar is written once and consumed in three places, so it can never drift.
Styles belong to the paper, because when several sites each maintain their own content stylesheet, one contrast fix has to be applied once per site — miss one, and that site's small text falls below AA. In a shared layer, one fix lands everywhere.
Identity belongs to the site, because the moment a shared layer absorbs one site's brand color, every other site has to fight it with overrides. Hence the two-tier tokens: a site overrides the tier-one raw palette (--p-*) and the semantic and component layers follow untouched — see design-tokens.
§3Where the browse machinery sits
The same discipline applies to what you're navigating right now. The package ships the mechanics — createTaxonomy (kind/domain/tag resolution, hub inheritance, locale mirrors), createBacklinks (the linked-mentions index), and presentational components like the note cards and facet rows on the landing page. The site owns the vocabulary and the routes: this garden's kinds and domains live in its own registry file, and its /kind/…, /domain/…, /tag/… pages are ordinary Astro pages a consuming site copies and reshapes. Same split, one level up: mechanics in the package, meaning in the site.
§4What a site gets
From the site's point of view, consuming this package plus the engine buys:
astro-inkstone/styles/tokens.css+base.css+browse.css: tokens first, then the reading column, then the browse shelf — three@importlines for the whole look;siteMarkdown(...): the entire Markdown pipeline in one line, switches described in getting-started;- components under
astro-inkstone/components/, imported by path as needed; - the taxonomy factory and backlink builder under
astro-inkstone/lib/, bound to the site's own registry; - in WIKI mode, the engine's full CMS (try it on this site with
npm run wiki); - five checks:
check-content,check-wikilinksandcheck-dist(shipped with the engine),ui_probeandcontrast_probe(shipped here) — see checks.
Every rendering effect on every page of this garden is the product of that split — the notes are the manual, and the manual is the demo.