Claude Code · the agent on the keyboard

One orchestrating,
one driving.

Every page on this site describes something that got built. This one is about how. Kevin orchestrates — the vision, the soldering iron, the calls only a person can make. Claude Code drives — on the keyboard and over SSH into the Pi, reverse-engineering protocols, writing the config, and debugging live until the thing actually works. This is the working relationship, the method, and the war stories.

Human + agent SSH into the Pi Reverse-engineered live Debugged in the loop

1 + 1human + agent
7strands shipped
40+devices freed
0of it in the cloud
01 · How we work

Orchestrating, and driving

It's a clean division of labour. One side sets the direction and does everything that happens in the physical world; the other side lives on the keyboard and makes the software real. Neither could ship this alone.

The human · orchestrating
Kevin
  • The vision. What to build, what it should feel like, and when it's good enough — the brief every session starts from.
  • The physical world. Soldering the relay, wiring the ESP32, tapping the fob, printing and mounting the case, turning a TV on so it can be found.
  • The accounts. His Google Home, the Harmony app, the phone that captures the app's traffic — logins an agent shouldn't hold.
  • The judgement. The calls with real-world stakes — "add a no-PIN disarm", "leave the lounge TV alone for now", "that's a win, bank it".
  • Ground truth. The eyes in the room: the volume went up from mute, the blue LED self-extinguishes. The feedback that closes the loop.
The agent · driving
Claude Code
  • The keyboard. SSH into the Pi, into the Home Assistant container, into the ESPHome build — reading state, writing config, restarting services.
  • Reverse-engineering. Decoding the alarm's radio, pulling a bulb mesh's keys out of captured traffic, fingerprinting the network to find what's really there.
  • The build. The YAML dashboards and the Python that generates them, the ESPHome firmware, the templates, the automations, the scans.
  • The debugging. Chasing a symptom through the logs to a root cause, forming a theory, testing it, and not stopping at "it returned success".
  • The write-up. This site, the memory of what's been done and why, and the honest report at the end of each thread — including what didn't work.
Kevindirection · hands Claude Codekeyboard · SSH One Pithe whole house

The rule that makes it safe: the agent proposes and executes on software; the human owns anything physical, irreversible, or account-bound — and every risky change is backed up before it's made.

02 · The journey

What we drove, in order

It didn't arrive as a plan. It grew — one thread pulling the next — from a dead alarm to a house that answers to its own voice, its own wall, and nothing in the cloud.

01

Raising a cloud-dead alarm

The GlobalGuard's manufacturer cloud died years ago and took its alerts with it. We read its local radio protocol off the LAN and gave it a new brain in Home Assistant — phone alerts, a full sensory intruder response, and a template alarm panel — without touching a single sensor.

02

Freeing forty devices from their apps

Tuya plugs and lights pulled local, a whole Bluetooth bulb mesh reverse-engineered from its app's own traffic, Nanoleaf, Ring, and a 12.6 kWp Victron solar array read live over Modbus — every one talking to the LAN, none to a vendor cloud.

03

Turning a dead tablet into the best screen in the house

A 2014 Galaxy Note, dead in a drawer, became a no-scroll wall panel: a hand-written grid generated by a Python builder, live solar at five-second resolution, and a tile that measures its own charge trend because the tablet won't report current. Housed in a two-part printed clamshell generated by constructive solid geometry, verified by fifty geometric assertions.

04

Giving the house warmth it can show

A Wunda heating system brought in fully locally, then a Heating tab where eight rooms tint from cool blue to warm amber by temperature, each with a 24-hour trend, humidity, and a hot-water boost. The four solar tiles merged into one card to make room.

05

Routing the alarm through a real remote

An ESP32 driving an opto-isolated relay taps the alarm's own key fob — so arm, part-arm, disarm and a held panic all fire instantly through the panel's genuine radio, from Home Assistant and from Google voice with Kevin's own trigger words, including a no-PIN "disarm security".

06

Wiring in the screens

Both Samsung TVs, the Shield, the Nest displays and Linda's cast TV pulled into a Media tab that shows a room's album art the moment it starts playing — after a genuinely stubborn fight to make a Samsung wake over Wi-Fi, and a networking dead-end that turned out to be nothing of the sort.

07

Scanning the house for what's next

A full network sweep to inventory every device and find the gaps — which surfaced a Harmony hub for the IR-only set-top boxes, and research confirming a set of cheap mesh bulbs would extend the reverse-engineered bulb network rather than fragment it.

03 · War stories

The bugs that earned their keep

The interesting part of driving isn't the config that works first time — it's the config that lies to you. A few that took a theory, a test, and a refusal to accept "success" at face value.

01The remote that only worked with its ground cut off

Symptom
"With the design you gave me, the remote doesn't work — I take the ground off the remote, then it works."
Cause
The fob's electronics float. Bonding its ground to the ESP32's — as a simple transistor switch demands — jams it solid.
Fix
Scrap the transistor for a fully opto-isolated relay: dry contacts across the fob's button, no shared ground anywhere. Kevin's observation was the whole diagnosis.

02A panic that had to be held

Symptom
A rapid pulse-train on the panic channel did nothing.
Cause
The panel wants a sustained hold, not a tap — "a 3–4 second latched signal, not a repeated pulse."
Fix
Re-flashed the ESPHome firmware: momentary taps for arm and disarm, a clean 3.5-second latch for panic.

03Solar reading zero while the sun was out

Symptom
The whole solar feed frozen at zero, though the array was plainly generating and every Victron app said "online".
Cause
The Cerbo GX is Wi-Fi-only and had quietly hopped networks — the integration was still polling its old wired address into the void.
Fix
Repointed it at the address it had wandered to, cleared the retry-backoff, and it came straight back to life.

04The Samsung that said "on" but stayed dark

Symptom
"Turn on Kev's TV" reached Home Assistant and returned SUCCESS in the logs — and the screen stayed off.
Cause
Two layers. The Pi is dual-homed, so the wake packet went out the wrong network leg; and even fixed, a Wi-Fi mesh won't forward a broadcast wake to a sleeping TV.
Fix
Send the magic packet as a unicast straight to the TV's own address — proven by watching it wake from cold in four seconds — and read on/off from the media player, not an unreliable ping.

05A switch that refused to exist

Symptom
The new TV switch showed permanently offline in Google, and Home Assistant reported it "unavailable" no matter what.
Cause
The version of Home Assistant had just removed the old template-switch format entirely; every attempt was being silently rejected, leaving a ghost.
Fix
Read it from the logs, switched to a native wake-on-LAN switch — a real entity that can't go offline — and it worked.

06A ghost in Google Home

Symptom
Voice control of the TV kept failing even once everything downstream was proven working.
Cause
A dead Harmony device, orphaned in Google's backend, was quietly intercepting the command.
Fix
Gave the real device a distinct name so voice couldn't confuse the two — and it obeyed.
04 · The boundary

What an agent should — and shouldn't — touch

Driving fast only works with clear lines. Some things belong to the person, and a good agent asks rather than assumes.

Claude drives

Reading and writing config and firmware, reverse-engineering protocols, scanning the network, debugging through logs, backing things up, and reporting honestly — including the parts that failed. Software all the way down.

Kevin owns

The soldering iron and the wall drill, the physical taps and mounts, the app and account logins, and every irreversible or judgement call. The agent surfaces the options and waits for a real yes.

Why it holds: instructions come from Kevin, not from a web page, a device, or a file the agent happened to read; risky changes are backed up first and validated before they go live; and when something is the human's call — a no-PIN disarm, powering the servers down for the night — the agent stops and asks. Fast, but not reckless.

The workshop

A house rebuilt by two hands and a keyboard that never gets tired.

Kevin brought the vision, the soldering iron, and the eyes in the room. Claude Code brought the keyboard, the patience for a five-restart debugging session, and a memory of every wire. Between them: a dead alarm answering the door again, forty devices off the cloud, and the oldest tablet in the house lit up on the wall — none of it phoning home.

orchestrated by Kevin·driven by Claude Code·one Pi · £0 / month