Lab

The Ember Archive

A public-domain library of plain-text how-to guides, built so anyone can take the whole thing home and run it with no internet.

The Ember Archive home page — "Keep the fire going." over a grid of twelve categories, from Water to Community, on a warm bone-colored background.
Status Prototype
Started September 2026
Role Producer, product designer, and builder
Stack Claude Code · Astro · Cloudflare Workers · Pagefind · MiniSearch · GitHub Actions · zod

The brief

A library of plain-text instructions — purify water, stop a bleed, jump-start a car — that belongs to nobody and works when nothing else does. Every guide is public domain (CC0). Anyone can add one. Anyone can take the whole archive home and read it with no internet, no server and nothing to install.

The archive is the product. The website is just a reader and, eventually, an intake form. The brand is post-apocalyptic but warm: a field manual someone kept by the fire, not video-game grunge. No skulls. The tagline is Keep the fire going.

A guide page titled Stop severe bleeding, with a stamp line reading Medical, guide number, verified by no one, CC0, and a rust-bordered warning box.
Every guide carries the same stamp: verified by no one. Warnings render as a rust-bordered box above the steps.

How it works

I scoped it with Claude in a planning session first — design decisions, scale limits, and a phased build — then had Claude Code build it from that plan. Like my other projects, the rules live in one AGENTS.md file that any agent picking up the work reads first.

  • Two repos, on purpose. The guides live in their own CC0 repository: one Markdown file per guide, nothing else. The site, scripts and Worker live in a separate MIT repo. A git clone of the archive is already a complete, verifiable, incremental copy you can hand to someone over a cable.
  • One contract. Every guide’s frontmatter — title, category, difficulty, sources, warnings — is checked against a single schema, and one Markdown renderer feeds the website, the offline copies, and print. Raw HTML, images and risky links are rejected outright, not quietly stripped.
  • The site has to be pure static, because the build output is the offline copy. No server rendering.
  • Three ways to take it home, rebuilt nightly: the full site as a zip with its own little server script, the raw Markdown, and a single HTML file with everything — search included — packed inside it. A sync.sh script fetches the latest, checks every file’s hash, and does nothing if you’re already current.
The single-file offline copy of The Ember Archive, open in a browser, reading Offline copy, archive build 2026-09-11, ten plain-text guides, no internet, no server, nothing to install.
The whole archive in one 60 KB HTML file. It's locked down so it can't make a single network request.

Where I sign off

This is the part I thought hardest about. A survival guide that’s wrong can hurt someone, and I’m not going to pretend a model or a moderation queue makes that risk go away.

  • I chose open publishing, and I chose to say so. There’s no approval gate. Instead, every page says verified by no one, and the About page tells readers to use their judgment and test on something that doesn’t matter first. Honest labeling over false confidence.
  • No AI in the submission path. I kept models out of the intake on purpose: cheaper, no outside dependency, and it can’t change behavior silently. If spam gets through, the fallback is a nightly Claude job that only hides junk — it never publishes or rewrites.
  • People hide, I restore. Readers can report a guide; enough reports hide it automatically and open a GitHub issue. Putting a guide back is my call.
  • Sources on every guide. Claude drafted the ten seed guides in plain words from public-domain material — US Army field manuals, Stop the Bleed course materials — and each lists its sources and warnings up front.

What broke

  • GitHub quietly turns off scheduled jobs. Scheduled workflows get disabled after 60 days of repo inactivity — fatal for a nightly archive that might sit untouched. The Worker now runs its own daily timer that kicks off the build as a backstop.
  • An empty setting isn’t a missing one. The build fell back to a default address only when the site URL was missing; CI passed it as an empty string, so the build got a blank address. A two-character fix, and a comment explaining it.
  • The package manager refused brand-new versions. I run a seven-day waiting period on new packages as a supply-chain safeguard. Pinning exact, freshly released versions failed the install, so the rule now is to pin loosely.
  • Search doesn’t exist in dev. The search index is built from the finished site, so it only works in a full build — easy to mistake for a bug.

What’s next

The archive is built and the offline copies are verified locally, but it isn’t public yet. Next up: connecting Cloudflare and choosing a domain, the real submission form with bot protection and the report button, and growing from ten guides to a couple of hundred from public-domain sources. Food, electrical, radio, agriculture and community are still empty shelves.

← All Lab projects