A static site, no build step, no framework, no database. Add a burger by editing a JSON file and dropping a markdown file. That's it.
buildaburger/
├── index.html # Home — lists all burgers by state
├── burger.html # Template for individual burger pages
├── css/style.css # All styling
├── js/
│ ├── home.js # Renders the home page
│ └── viewer.js # Renders a single burger
└── burgers/
├── manifest.json # Index of all burgers (source of truth for metadata)
└── *.md # One markdown file per burger (body content)
| State | What it means |
|---|---|
| raw | Early, loose, in the puzzle space. Ingredients on the counter. |
| grill | Actively cooking. Real progress, not finished. |
| served | Plated. Conclusion reached, artifact shipped, or decision made. |
A burger can move between states. Edit its state in manifest.json.
-
Add an entry to
burgers/manifest.json:{ "slug": "my-new-burger", "title": "My New Burger", "state": "raw", "started": "Jun 2026", "summary": "One sentence on what's coming together here.", "tags": ["tag1", "tag2"], "links": [ { "label": "GitHub repo", "url": "https://github.com/..." } ] } -
Create a markdown file at
burgers/<slug>.mdwith the body content. Plain markdown — headings, paragraphs, lists, links, blockquotes all render. -
Push.
When a burger gets served, add a "served": "Mon Year" field and flip its state to "served". The home page resorts itself.
| Field | Required | Notes |
|---|---|---|
slug |
yes | URL-safe identifier. Must match the markdown filename. |
title |
yes | Display title. |
state |
yes | "raw", "grill", or "served". |
started |
optional | Free-form date string, e.g. "Mar 2026". |
served |
optional | Same format. Only meaningful when state === "served". |
summary |
yes | One-line summary for the card. |
tags |
optional | Array of strings. |
links |
optional | Array of {label, url} objects. Renders at the foot of the burger page. |
Because the site fetches manifest.json and .md files, opening index.html directly from your file system will not work (browsers block local fetch() calls). Run a simple local server instead:
# from inside the buildaburger/ directory
python3 -m http.server 8000Then visit http://localhost:8000/.
- Create a public GitHub repo and push this folder.
- In repo Settings → Pages, set Source to
mainbranch, root. - Wait a minute, then visit
https://<username>.github.io/<repo-name>/.
That's the whole deploy.
The architecture decision: public static site, no private backend. That means anything on this site is genuinely public. If you have a burger that shouldn't be visible yet — unlaunched IP, sensitive interior work — keep it out of manifest.json until you're ready to launch it. The "launch event" is the moment you add the entry.
For tracking the private burgers themselves, keep a parallel manifest.json in a private repo or local-only folder using the same schema. When one is ready to plate, move it over.
- Fonts: Archivo Black (display), Familjen Grotesk (UI), Source Serif 4 (body), JetBrains Mono (data). All from Google Fonts.
- Colors live as CSS custom properties at the top of
css/style.css. Change one variable to retheme. - The doneness stamp is the signature element. If you ever change states, the stamp colors are in the same custom-property block.
- No analytics, no third-party scripts except the marked.js markdown parser (CDN).
- Responsive, keyboard-focusable, respects
prefers-reduced-motion.
- Not a portfolio. State is a verdict on the work, not a claim about you.
- Not a wiki. There's no expectation of comprehensive coverage.
- Not serious. Until it is.