/stack
The website's parts list.
Everything involved in making and serving this site - including the agents. The short version: static first, agent-assisted (the expensive autocomplete is supervised), and deliberately boring at the deployment boundary.
The page you get
The browser gets static HTML first. JavaScript enhances the theme, route changes, and decorative canvases; it does not hold the content hostage.
The boundary is deliberate: no permanent runtime landlord (React already packed its shit).
- Astro(opens in new tab) (a framework that renders components to static HTML)7.1
Builds every route and component into a static site. The content survives without JavaScript, while small controllers opt into interaction where it earns the bytes.
- TypeScript(opens in new tab) (JavaScript with static type checking)7.0
Types the browser controllers, content helpers, and build scripts. Strict settings stay on; the site has no React or JSX runtime between the DOM and the canvas code.
- Tailwind CSS(opens in new tab) (a build-time utility CSS compiler)4.3
Compiles the layout utilities around the shared design tokens. The identity lives in perceptual color variables and local component CSS; there is no prebuilt component theme underneath it.
- Archivo + Martian Mono(opens in new tab) (font files containing continuous ranges of weights and widths)variable fonts
Archivo carries prose and headings; Martian Mono handles metadata, code, and chrome. Both are bundled locally through Fontsource, so rendering does not wait for a third-party font host.
- Canvas + View Transitions(opens in new tab) (the browser gets one fun job)browser APIs
Draw the survey lattice and hero glyph, then choreograph route and theme changes. Every effect has a static fallback and stops when reduced motion asks it to stop.
Words, diagrams, and artifacts
Notes and project records stay in the repository. The build turns them into ordinary pages and produces the supporting artifacts before deployment.
The browser receives the artifact, not the factory (the visitor is not a build server).
- MDX(opens in new tab) (Markdown that can embed components)astro integration 7.0
Stores notes and project write-ups with typed Astro collections. Content remains diffable text; components are reserved for annotations and shared presentation.
- unified + remark + rehype(opens in new tab) (syntax-tree tools for parsing and transforming content)build pipeline
Add reading time, heading links, external-link treatment, diagrams, and code rendering. The work happens at build time instead of shipping a markdown processor to the visitor.
- Shiki(opens in new tab) (a syntax highlighter powered by editor grammar files)4.3
Produces syntax-highlighted code for both color schemes. Token colors are emitted once, then CSS selects the active light or dark set.
- Mermaid(opens in new tab) (text syntax that compiles into diagrams)build-time SVG
Turns authored diagrams into inline SVG during the build. There is no Mermaid runtime in the browser; the finished SVG is themed with the rest of the page.
- Playwright(opens in new tab) (a browser automation library)1.62
Renders Mermaid output and the social-share image set in Chromium. It runs at build time only; the production page never downloads it.
The workshop
Human decisions, agent edits, and automated checks all land in the same Git history. Agents get tools and context. Review still applies.
- OpenAI Codex(opens in new tab) (yes, this page is self-reporting)coding agent
Investigates the repository, implements changes, and runs the local verification loop. Codex helped build this version of the site, including the current vanilla canvas controllers and this page.
- coding agent
Provides another agent path for implementation, review, and hard technical questions. A second model is useful for disagreement; tests and the resulting diff still decide what stays.
- Bun(opens in new tab) (a JavaScript runtime, package manager, and script runner)package manager + runner
Installs the project, owns the lockfile, and runs the repository scripts. Node.js remains available for the Chromium-based image step where it is the proven path.
- Vite+(opens in new tab) (a toolchain for linting, formatting, testing, and Vite builds)0.2
Coordinates linting, formatting, type checks, tests, and builds. One command proves the same things locally and in a release build; the agent does not get a smaller gate.
- Astro Check + Knip + Prettier(opens in new tab) (automated checks that reject invalid changes)quality gates
Check templates and types, find dead code and dependencies, and enforce the repository format. These checks catch the expensive mistakes before nginx gets a chance to serve them.
- Git + Forgejo(opens in new tab) (version control plus self-hosted Git collaboration software)source of truth
Keep the history, repository, issues, and review boundary under direct control. Generated code gets no special authorship status; it becomes an ordinary diff and must survive ordinary review.
From commit to stoewer.one
The deployed result is a directory, not an application server. Releases are built completely, copied as a unit, and switched with one symlink.
The origin serves a directory - no control plane required (nothing to babysit).
- HTML + assets
Emits extensionless routes, hashed assets, RSS, sitemap files, and the real 404 page. There is no database or server-rendering process to keep alive for this website.
- Brotli + gzip(opens in new tab) (HTTP content-compression formats)precompressed
Produce quality-11 Brotli sidecars at build time with gzip as the server fallback. Compression belongs to the release artifact, so requests do not spend CPU recompressing unchanged files.
- nginx(opens in new tab) (a web server and reverse proxy)static origin
Terminates TLS, redirects the old domains, serves immutable assets, and maps clean routes to HTML files. Unknown paths return the designed 404 instead of falling through to a single-page-app catch-all.
- Atomic releases (rollback should be boring)filesystem deployment
Copy each complete build into a timestamped release directory and repoint the current symlink. Rollback is selecting the previous directory. I rebuilt in place during an outage exactly once; the release directories exist so the next me does not get the option.