What I Am Working On
Different architectural approaches to common problems: static sites, async Python APIs, Rails monoliths with Hotwire. The technologies differ, the principle doesn't. Choose the simplest architecture that solves the problem and optimise for maintainability.
swm.cc
ActiveThis site. Built with Astro 5 for zero-JavaScript-by-default architecture, Tailwind CSS 4 for modern utility-first styling, and MDX for type-safe content. Optimised for Core Web Vitals with static site generation and deployed via GitHub Pages.
Swanson AI
ActiveThis site's alter ego: the avatar in the header that has read every essay, note and project page and tells visitors what's worth their time. A Cloudflare Worker runs Haiku with the full site text in a cached system prompt, generated as a build artifact. Layered spend caps (workspace limit, request budgets, canned fallback) keep a public AI endpoint from ever running up a bill.
Thrawn
ActiveAgentic development workflow. Give it a ticket or a brief and it plans deeply with a strong model, splits the work into parallel tasks routed to the right model for the job, runs each agent in an isolated git worktree as a Herdr pane, then merges, checks and gates shipping behind a one-time code. Currently dogfooding it daily with a ledger deciding whether it survives.
second_breakfast
ActiveGrub — my recipe collection and weekly meal planner. Rails 8 monolith with PostgreSQL, Hotwire, and a documented JSON API, plus a bundled MCP server so Claude can import recipes from cookbook photos, plan whole weeks conversationally, and read back the aggregated shopping list. The current week syndicates to the eatin' page on this site.
Swanson
ActiveWith enough projects on the go, it's easy to forget one exists. Swanson keeps them all visible. The TUI lives in the terminal for when I'm deep in code. The web dashboard runs on a TV in my office. Both surface the same information: deployments, open issues, CI runs and failures, PRs waiting for review. The TUI includes an MCP server so I can ask Claude or ChatGPT about project status without leaving the conversation.
whatisonthe.tv
ActiveTV and film tracking application. FastAPI backend with async PostgreSQL and SQLAlchemy, Redis for caching TheTVDB API responses, SvelteKit frontend with Tailwind CSS 3 for minimal JavaScript overhead. Built for performance and type safety end-to-end.
thoughts.swm.cc
ActiveTwitter-inspired microblogging for quick thoughts. Rails 8 with 140-character posts, tagging, and view tracking. Built as a PWA for frictionless mobile posting. Replaced a markdown-based workflow that was too cumbersome on mobile. Part of the "own your data" philosophy.
the-mcculloughs.org
ActiveArchive of my family photos from the 1930s to present. Rails 8 monolith with Active Storage, polymorphic tagging, and mobile-first design. Migrating from Flickr to own the data and ensure longevity. Part of the "own your data" philosophy alongside Jotter and this site.
Jotter
ActiveSelf-hosted bookmark and image manager solving the problem of volatile third-party URLs. Ruby on Rails 8 with built-in authentication, polymorphic tagging across bookmarks and photos, Hotwire for progressive enhancement, Active Storage for file uploads, PostgreSQL for full-text search. Short URLs for easy sharing.
tvdb-v4-python
On HoldOfficial Python wrapper for TheTVDB API v4. Contributed throughout 2023 and 2024. Currently used in whatisonthe.tv for fetching series and movie metadata. Project appears dormant with the last commit in March 2024.
tvdb_api
ArchivedRuby gem for TheTVDB API. Created when planning to use Rails for whatisonthe.tv, but ultimately chose FastAPI for async I/O and performance. Stopped active development in 2023. Several other Ruby libraries exist for TheTVDB.
TV-Listings
ArchivedPerl-based TV listings tracker from 2002-2007. Parsed XMLTV data, augmented with season and star info, watch lists, search, and daily emails. Built before streaming existed and Sky+ was new. Migrated to GitHub in 2013 but never modernised. Pure nostalgia.
More Projects
I'm working on other projects, but these are the ones I want documented and shared publicly. Most of my GitHub repositories are private by default - I prefer to be intentional about what I publish rather than treating GitHub as a performance space. Half-finished experiments, learning exercises, and abandoned ideas don't need an audience. When something is worth sharing, it'll end up here.