Notes · no schedule, no theme

A notebook, of sorts.

Posts and talks, mostly about building software. Written when something is worth writing down, not before.

Aug 2026Post

The refactor I couldn't explain

On shipping code faster than my own understanding.

A client's Python scripts became a FastAPI service, shipped fast in an AI tool. Then their team asked how to add a new recorder, and I realised I couldn't walk them through code I had reviewed and merged myself.

Jul 2026Post

Solar surplus EV charging

Home Assistant charges the car on solar surplus alone, current sized in real time from a Shelly meter.

I built this to make the most of the solar panels and cut down on grid power for day-to-day car charging. The car charges from solar surplus only. A ShellyProEM50 reads solar production and grid import/export in real time, and the charging current adjusts every two minutes. Hysteresis keeps a passing cloud from ending the session.

Jul 2026Post

Sage: an AI farmhand that only knows my garden

How six raised beds grew a written record, a pixel-art dashboard, and an advisor. A build log.

This is the story of a vegetable garden that grew a piece of software, one layer at a time. It started as six raised beds in my backyard and ended up with a pixel-art dashboard and an AI advisor that knows my soil better than most gardening books know gardening.

May 2026Talk

Stop vibe coding: a guide to agentic centered development

Coimbra.js 2026 · On making a project legible to an AI agent.

Given at Coimbra.js 2026 ↗

The failure mode I kept seeing: an agent with full context in the chat, nothing written down where it could find it on its own. Every new task started with ten minutes of re-briefing that should have been a file.

The talk covers six primitives: CLAUDE.md for persistent context, Skills for repeatable procedures, Slash Commands for common operations, Subagents for parallel work, Hooks for automated guardrails, and Plugins for extending the agent's reach. The goal is a project an agent can pick up the same way a good README helps a new hire.

The examples are from my homelab. Agentic development is a project hygiene problem more than a prompt engineering one.

Feb 2024Post

How to properly use TailwindCSS, and React components in general

Why the utility-class approach works best when your components hold the styling logic.

Published on the Subvisual blog ↗

The verbosity problem with Tailwind is real, but it's a symptom. Utility classes piled directly onto JSX scatter styling decisions across every caller instead of keeping them in one place.

The fix isn't complicated: a Button knows what a button looks like; the parent decides where it sits. Variants become props, base and variant styles get composed with classnames, and layout is always the caller's problem. When a component is wired that way, Storybook entries practically write themselves.

The article also covers when @apply is worth reaching for (mostly outside component trees) and how to fold custom design tokens into tailwind.config.js without mangling the naming conventions.