Skip to content

Reference site scaffold

Full playbook: /home/justinwieb/forge/docs/sites-playbook.md.

Locations

  • sites/_shared/ — tokens.css, base.css, header.html, footer.html, forge-include.js, README.md
  • sites/_templates/single-page.html — PressYourLuck-style, fully self-contained
  • sites/_templates/content-page.html — uses shared header/footer via forge-include.js
  • scripts/sites/new-page.sh — scaffold a new page from a template
  • scripts/sites/preview.sh — serve via python http.server on first free port in 8090-8097, emits Tailscale URL (100.97.43.104:PORT) for Venus
  • scripts/sites/screenshot.sh — desktop + mobile Playwright screenshots to logs/site-screenshots/
  • scripts/sites/deploy.sh — generic tar-and-push to CT 102. Delegates to site's own deploy.sh if one exists (justinandkrystal.com)

Typical flow

scripts/sites/new-page.sh justinsforge.com bbq-map --template content --title "BBQ Map" --desc "..."
scripts/assets/run search "texas bbq brisket" --engine google --count 10 --out sites/justinsforge.com/bbq-map/assets/_raw
scripts/assets/run optimize sites/justinsforge.com/bbq-map/assets/_raw --out sites/justinsforge.com/bbq-map/assets
scripts/sites/preview.sh justinsforge.com
scripts/sites/deploy.sh justinsforge.com

Include loader

<div data-forge-include="/_shared/header.html"> fetches and inlines the shared file. Override slots with <template data-forge-slot="name">…</template> children. Pure vanilla JS, 40 LOC, no build.

Brand override

Set a brand-tokens.css per site that redeclares :root CSS variables from sites/_shared/tokens.css. Load order: tokens.css → brand-tokens.css → base.css.

Not included (by design)

  • No static site generator (no 11ty, Astro, Vite). Justin likes direct editing, no node_modules sprawl.
  • No build step. forge-include.js is the only client-side glue.
  • No auto Cloudflare cache purge (see playbook "Open decisions" for the hook point if needed).