* Initial Responder port — core content serving working Homepage, markdown pages, directory listings, image galleries all rendering. Flask template compatibility via RequestWrapper and FakeConfig shims. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Complete Responder port — all routes working Ported all routes from Flask blueprints: archive, search, OG images, RSS, sitemap, robots.txt, API endpoints, directory browser. All 25+ routes returning 200. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update Dockerfile for Responder, warm caches on import CMD now runs engine_responder:api via uvicorn. Cache warming happens on module import for production. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Rename engine_responder.py to engine.py Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update colophon for Responder Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix essay pages, OG images, and PDF export - Fix find_related_posts and find_adjacent_posts call signatures - Fix OG image route to use path:path for nested paths - Add PDF export route with WeasyPrint - All test plan items passing Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.7 KiB
Colophon
This site is mine. My words, my domain, my infrastructure. After eighteen years of platforms coming and going, that matters more than it sounds.
The Stack
- Framework: Responder, my own Python web framework, with a custom CMS layer called TufteCMS.
- Typography: Tufte CSS. Edward Tufte understood that margins are for thinking.
- Content: Markdown files in a directory. No database. Just files.
- Hosting: Fly.io.
- Deployment: Docker containers with uv for Python dependency management.
- Search: Client-side JavaScript with caching and autocomplete.
- Icons: Procedurally generated SVG patterns. Every essay gets a unique visual signature derived from its title.
- Source: Open on GitHub.
The Design
Inspired by books. Wide margins for your thoughts. Readable typography. No dark patterns, no pop-ups, no newsletter modals, no cookie banners. Just words on a page.
The sidenotes are Tufte-style margin notes. Sometimes the most interesting part of a book is what's scribbled in the margins.
The Philosophy
No JavaScript frameworks. No build process. No npm dependencies. Just Python, Markdown, and CSS.
If Fly.io disappears tomorrow, I can have this running on a Raspberry Pi in 10 minutes. Portability is a form of independence. Plain text is the universal solvent for ideas.
The Collaboration
I work with Claude. The essays are genuine collaborations where I direct the thinking and the AI helps me write at the scale and speed my brain wants to move. Some of the best ideas emerge in the space between human and artificial intelligence. I've written about this extensively.
These aren't AI-generated posts with my name on them. They're my ideas, my voice, my direction, shaped through a partnership that I take seriously.
The Evolution
This site has been:
- WordPress (2008-2010)
- Jekyll on GitHub Pages (2010-2013)
- Ghost (2013-2015)
- Medium (briefly, regrettably)
- Squarespace (2016-2023)
- Custom TufteCMS on Flask (2024-2026)
- Custom TufteCMS on Responder (2026-present)
Every migration taught me the same lesson: platforms come and go, but your own domain is forever.
Credits
- Sarah, for everything.
- Claude, for being a genuine thought partner.
- The Python community, for teaching me that code can be beautiful.
- My brain, for somehow still working despite everything I've put it through.
License
The words are mine. The code is open source. Build your own.
Built with caffeine, gabapentin, and a stubborn refusal to use React.