All posts
Backend and infrastructure
Scraping: fail loudly when the page layout changesA scraper that parses nothing and exits 0 looks healthy while it fills your database with gaps. A count check and a saved fixture catch it.
2 min readscrapingweb-scrapingProjects
devutils: 33 browser-only dev tools and what the README overstateddevutils runs JSON, JWT, SQL and Base64 tools in the browser with no network calls. I checked the README against the code: the privacy claim holds, the 35+ tool count did not.
5 min readreacttypescriptBackend and infrastructure
How I track my money with Hermes: the flow, not the numbersBank SMS and email alerts flow through one parser, a dedupe hash and a Google Sheet. A morning cron job drafts the summary. Only the flow, no figures.
5 min readautomationhermesProjects
pmharden: auditing npm, pnpm and yarn config for secretspmharden audits package manager config, scans for plaintext tokens and flags risky global packages in one command. A walkthrough of the code, the 45 tests and the rough edges I still see.
5 min readtypescriptnpmAI tooling
Hermes Agent: nightly cron jobs and skills learned from correctionsHermes runs nightly CLI updates, a security PR scan every 6 hours and a 30-minute autoheal job. Every correction I make becomes a skill file. Hermes drafts, I send.
4 min readai-agentsautomationBackend and infrastructure
Scraping: back off, honour Retry-After, and never retry a 404A retry helper that backs off with jitter, reads Retry-After, and gives up fast on a 404. Run against a local server that fails on purpose.
2 min readscrapingweb-scrapingProjects
loopwork: a task queue that feeds AI coding CLIsloopwork pulls tasks from GitHub Issues or a JSON file, hands each to a coding CLI, and rotates models behind circuit breakers. 61 packages, 249 commits, the rough edges I fixed and the ones left.
6 min readtypescriptopen-sourceProjects
pagedrop-cli: a small bash script that turns an HTML file into a URLpagedrop-cli posts an HTML file to pagedrop.io and prints the share URL. How the script works, what it handles, and the silent failures I fixed.
AI tooling
9agent: run Claude Code, Pi or Hermes on any model with one commandA small launcher that points Claude Code, Pi or Hermes at a 9Router gateway, lets me pick any model, and can run the agent in Docker. It never rewrites configs.
4 min readai-agentsclaude-codeBackend and infrastructure
Scraping: look for the page's JSON before you write a CSS selectorMany pages ship their data as JSON inside the HTML. Reading that survives a redesign that breaks every class-name selector.
2 min readscrapingweb-scraping