Claude Opus 5andbdeshi c88ca93107 serve the files a bundle owns
Every figure and gallery shipped so far emitted links a browser could not fetch: a
relative src resolves under the page's URL, and nothing answered there. Found by
fetching the pages' own links rather than by reading their markup — the evidence
runs had been checking that the right src appeared, never that it worked.

A directory bundle's files are now served under its URL. The bundle is looked up
first and the file is read only from the directory that bundle owns, never from a
path assembled out of the request: ADR-0024 requires that no route serve bundle
bytes by path alone, since every byte inside a bundle inherits its publish status.
When drafts arrive at queue 19 the filter belongs beside that lookup and nowhere
else, which is why the ordering is written down in the comment.

A single-file bundle owns nothing: its neighbours belong to the section, and its
slash-terminated URL has nothing beneath it. An author with assets writes a
directory bundle, now stated in content-model.md.

A .md inside a bundle directory is never an asset — it is a bundle with its own URL
or a fragment that was never addressable, and serving either raw would publish
source. http.ServeFileFS handles content type, conditional requests and ranges,
none of which is worth reimplementing here.
2026-07-31 02:40:03 +06:00
2026-07-31 02:40:03 +06:00
2026-07-31 02:40:03 +06:00
2026-07-30 00:34:18 +06:00
2026-07-30 01:35:50 +06:00
2026-07-30 01:35:50 +06:00
2026-07-30 01:38:17 +06:00

khosra

A flat-file personal publishing engine in Go. Point the binary at a directory of Markdown and it becomes an owned, networked home for fiction, webcomics, art, and essays, in English and Bengali. The site's content lives in its own repository, not this one (ADR-0011).

Build and run

Needs Go 1.26+ and git; nothing else.

make build                      # or: go build -o khosra ./cmd/khosra
make run SITE=/path/to/site     # or: ./khosra -site /path/to/site
make test
make verify                     # everything the project enforces — green before every commit

make help lists targets. make is a convenience wrapper; go build, go test and ./scripts/verify.sh work on their own and are what the gate uses.

A site root is a directory holding content/, and optionally static/ and templates/. It lives in its own repository, not this one — the binary is pointed at it.

If you are a human: start at HARNESS.md — what the scaffolding is, how to use it, and what to decide.

If you are an agent: start at CLAUDE.md — the constitution and the read order. It is loaded for you automatically; this file is not a prerequisite and nothing here is a rule.

S
Description
A personal publishing engine
Readme
1.1 MiB
Languages
Go 89%
Shell 7%
HTML 2.3%
CSS 1%
Makefile 0.4%
Other 0.3%