Portfolio and project hub at a9l.im. The root site, eight browser projects, shared design system, Worker backend, and content pipeline live in one repository without mixing deploy artifacts into the source tree.
site/ root SPA shell and browser modules
content/ canonical copy, project registry, posts, and resume source
shared/ design-system CSS and browser globals
projects/ eight git submodules (published at their original URL roots)
worker/ Cloudflare Worker router, SSR, API, headers, and analytics
static/ copied-as-is public assets and _headers
features/surveys/ private survey data/scoring foundation (not static assets)
db/migrations/ D1 migrations
lib/wgsl/ dormant WGSL-to-JavaScript tooling
tools/ build, staging, and OG-image tools
tests/ build-layout, content, and WGSL checks
dist/ ignored deploy tree
.build/ ignored Worker/build intermediates
Physical source paths do not change public routes: projects/geon/ still deploys at /geon/, for example. Shared modules live at /shared/{name}.js and /shared/base.css; the build also emits the former /shared-*.js and /shared/base.css URLs as temporary compatibility aliases.
Visitor-facing root-site copy is canonical in content/. Each simulation's long-form documentation and SEO summary is canonical in projects/{name}/about.md. tools/build.mjs derives the homepage regions, project registry, feeds, sitemaps, discovery files, Worker metadata, and resume into dist/; generated outputs are not committed.
npm install
npm run build # recreate dist/ and .build/ from source
npm test # build, deterministic check, layout checks, API/scoring tests
./dev.sh # build, then run the pinned Wrangler dev serverFor a static-only preview after building:
python -m http.server --directory dist 8000Production deploys are manual: Cloudflare Workers Builds stays disabled, and ./deploy.sh is the authoritative path. It runs a fresh build, deploys with the pinned Wrangler version, purges the a9l.im hostname cache, and confirms that the new build marker is live. The purge-only token lives in the macOS Keychain item a9l.im-cloudflare-cache-purge; CLOUDFLARE_CACHE_PURGE_TOKEN is the non-macOS fallback. Stable public asset URLs also require browser revalidation, so a successful deploy appears immediately. A normal build must leave git status clean.
Linux builders bootstrap pinned, checksum-verified Pandoc and Tectonic binaries into the ignored .build/ cache when those tools are not already installed.
| Project | Description |
|---|---|
| Geon | Explore relativistic many-body dynamics, electromagnetism, compact objects, scalar fields, and nontrivial topologies across fifteen browser presets. |
| Cyano | Trace connected carbon metabolism, electron transport, conserved cofactor pools, enzyme feedback, and reactive oxygen species across five stylized cell presets. |
| Gerry | Draw districts on a procedural hex map, compare six fairness measures, generate pack-and-crack or neutral plans, and stress-test Monte Carlo elections. |
| Shoals | Trade stock, bonds, VXHCN volatility futures, American options, and AI-milestone binaries through the last years of the race — stochastic pricing, a hidden capability model, and six ways it ends. |
| Scripture | Read, search, annotate, compare, and listen to sixteen sacred works with chapter and verse deep links, concordance, and related passages. |
| Miasma | Seed and contain stochastic multi-strain epidemics on six hex-grid topologies with vaccination, quarantine, reservoirs, mutation, and painted interventions. |
| Pile | Operate PWR, RBMK-1000, and molten-salt reactor models with axial kinetics, xenon, plant systems, faults, procedures, and guided scenarios. |
| Plasma | Explore shocks, reconnection, waves, transport, radiation, self-gravity, and cylindrical flows in a WebGPU 2.5D magnetohydrodynamics laboratory. |