Files
khosra/examples
Claude Opus 5andbdeshi 7136f6e2d9 let a shortcode fragment speak the reader's language
Three fragments added this session needed a word the author did not write: an
untitled :::warn told the reader nothing about being a warning, an untitled
panel fell back to whatever the browser calls <details>, and the contents list
had no label at all — an accessibility gap as much as an untranslated one. None
of them could be fixed, because `t` needs a language and Fragment had none, so
those words could only ever have been English on a site that serves Bengali.

Fragment gains Lang, captured on each call at parse time — a node renderer never
receives the parse context, the same constraint that put pictures and headings
on the node. Five phrase keys follow, and a Bengali page now reads সূচিপত্র,
সতর্কতা and বিস্তারিত where an English one reads Contents, Warning and Details.

The demo's own list.html was the better example of the problem and now shows the
answer: a site's own sentences are not in the engine's phrase table, so a
template needing its own words branches on the language it was given. That is
what theme-contract.md has always told a theme to do, demonstrated rather than
asserted, and a case proves the Bengali listing carries no English.

Two files crossed the size advisory on the way. render.go shed the contract
types to view.go, where state.md already claimed they lived and where the file's
own header said they belonged; shortcodes_test.go split to mirror its sources,
which the one-file-per-source convention already asked for. Both are pure moves.
2026-08-01 23:09:03 +06:00
..

examples/

demo-site/ is a complete khosra site, kept here to be read and served — the demonstration a person walks through to see what the engine does, and the fixture the engine tests itself against (ADR-0051).

make demo                 # serves it at localhost:8080
khosra check -site examples/demo-site

It is content, not a fixture in disguise: every file is what an author would write. Two things keep it honest, both in verify.sh:

  • TestTheExampleSiteExercisesEveryFeature (in internal/web) serves this directory through the real handler and asserts one case per feature. A feature that changes shape breaks it.
  • khosra check runs over it and must report nothing fatal.

Adding a feature means adding it here, with a case in that test. A feature the example does not show is a feature nobody can see working, and the gates are what stop that from being optional.

What each part is for

Path Demonstrates
site.yaml the two site-level settings: base and title
content/posts/day-01…11 pagination — eleven dated posts against a page size of ten
content/posts/first-light/ two languages, a directory bundle owning a picture, a figure with a caption
content/posts/only-english the fallback chain, and a canonical link naming the variant actually served
content/posts/renamed-thing/ slug moving an address, aliases keeping the old one working
content/posts/unfinished a draft: invisible without -dev on
content/posts/scheduled a future date: published by the clock, with nothing to run
content/comics/the-long-monsoon/ a series — structural membership, sparse order, prev/next/first/last, an archive, and a landing page in two languages
content/art/monsoon-studies/ a gallery: three JPEGs sized into a srcset, and an SVG left exactly as drawn
content/writing/notes-on-water/ an include whose fragment has no URL, and an extras/ tree with a nested directory
content/writing/typography what the engine does to prose, and what it deliberately does not
content/pages/* undated bundles: reachable, and absent from every feed
content/pages/bengali-only a bundle that exists in one non-default language only
content/status/* a titleless bundle — legal, and the one check warning this site expects
templates/list.html overriding a single named block and inheriting the document
static/note.txt files served verbatim

The one expected warning

khosra check reports the titleless status note. That is deliberate: titleless is legal, the theme falls back to the bundle's key, and the warning exists so an author who did not mean it finds out. A fatal finding here would fail verify.sh.