The stack and the discipline.
What I build with, why those choices, and the principles that shape what stays out of the stack. Tools picked for stack consistency with operational systems, not for fashion.
Async-native, type-hinted, mature ecosystem.
Async route layer, dependency injection, OpenAPI-first.
ASGI server, proxy-aware, runs under Railway.
Schema validation for content frontmatter and settings.
Server-rendered templates, macro-driven components.
Token-driven utility CSS, @theme-based design system.
Server-driven fragment swaps where they earn their keep.
IntersectionObserver reveals, nav shrink, count-ups. No framework.
Case studies, insights, architecture topics — version-controlled, schema-validated.
CommonMark rendering with table support and trusted-HTML for inline diagrams.
Frontmatter parsing into typed Pydantic models.
Build, deploy, env vars, preview environments per PR.
node:20-alpine builds CSS; python:3.12-slim runs the app.
JSON healthcheck. Railway watches it; visitors can read it.
Both auto-generated from content loaders. Discoverable, indexable.
The stack is small on purpose. Every dependency is something I am willing to operate, debug, and upgrade — not just install. New tools have to earn their place against the cost of one more thing to maintain.
No JS framework. No SPA. No bundler beyond Tailwind's CSS compile. The site renders HTML on the server because that is what an operational identity platform needs to do — show up fast, be indexable, work without JavaScript if it has to.
AI-assisted, human-supervised. Drafting, refactoring, and exploration use AI as leverage. Every load-bearing decision — architecture, copy, shipping — stays with a human. The trade is real; the discipline is the trade.
Available for systems advisory, framework architecture, and operational infrastructure work.