All posts
Projects
My auto dark mode lasted 60 seconds, then saved itself as darkMy theme switch picks light or dark by the clock. It shared a localStorage key with next-themes, so auto mode quietly turned into a fixed theme a minute after the first visit.
Projects
opencode-9router: model discovery for OpenCode from a 9Router gatewayAn OpenCode plugin that asks a 9Router gateway for its models at startup, fills in limits and capabilities, and caches the list. v1.0.0, 26 tests after a six-fix PR.
Browser automation
Four OpenTabs plugins for Facebook, Greenhouse, Toptal and UpworkFour open-source OpenTabs plugins give a terminal agent 22 tools in my logged-in Chrome to triage friend requests, fill job forms and update freelance profiles.
8 min readmcpbrowser-automationAI tooling
A deterministic prompt injection filter for agents that read my emailCleaning out 26 spam emails led to a stdlib-only Python filter with 45 tests that catches homoglyphs, hidden tags and Base64 or ROT13 payloads before Hermes reads mail.
Projects
express-simple-proxy: an Express proxy with hooks and typed errorsexpress-simple-proxy forwards Express routes to an upstream API with error codes, a beforeRequest hook and an onResponse callback. 183 tests, two runtime dependencies, and rough edges I found.
5 min readtypescriptexpressBackend and infrastructure
My Hermes backup said DONE, but a tar exclude dropped every databaseMy agent backup script printed DONE and uploaded 346 MB. The first restore showed the databases were never in the archive. One tar exclude did it.
Backend and infrastructure
210ms to 15ms per edit
Faster code gates: a Rust hook, oxlint, and runner-bound CIA per-edit hook went from 210ms to 15ms and lint from 21s to 0.7s. The bottleneck was process startup, not code checks, and CI was bound by runners.
AI tooling
25 edits across 13 of 31 posts
Linting my blog for AI-sounding prose: what worked, what I skippedI ran a free prose linter over 31 posts, made 25 edits in 13 of them and added a pre-commit check. I skipped AI detectors and humanizers.
4 min readwritingdeveloper-toolsBrowser automation
Claiming free game rewards with a Hermes cron job and PlaywrightA cron job runs a small Playwright script every 6 hours to claim the free offers in a game web store. 50 saved runs show what it claims and how it fails.
4 min readautomationhermesAI tooling
Tailscale and Cloudflare Tunnel: my home PC with zero open portsHow I reach my home PC: Tailscale for ssh and Herdr from my own devices, Cloudflare Tunnel with Access for browser tools, and no open router ports.
5 min readself-hostingcloudflare