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.mdsites/_templates/single-page.html— PressYourLuck-style, fully self-containedsites/_templates/content-page.html— uses shared header/footer viaforge-include.jsscripts/sites/new-page.sh— scaffold a new page from a templatescripts/sites/preview.sh— serve via python http.server on first free port in 8090-8097, emits Tailscale URL (100.97.43.104:PORT) for Venusscripts/sites/screenshot.sh— desktop + mobile Playwright screenshots tologs/site-screenshots/scripts/sites/deploy.sh— generic tar-and-push to CT 102. Delegates to site's owndeploy.shif 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.jsis the only client-side glue. - No auto Cloudflare cache purge (see playbook "Open decisions" for the hook point if needed).