Back to blog

Four years of coding with AI

Sep 20, 2026 - agents, infrastructure

In 2022, every line of code I shipped passed through my own hands. Four years later, most of it is written by agents on machines I rarely touch, and this is how that happened, one change at a time.

  1. Manual coding In 2022 the whole setup fit on one laptop: an editor, a repository and a browser tab open to the documentation. Every line of code went through my hands.

    The routine was old and familiar. I read the docs, wrote the code, ran it and searched for whatever error came back. The browser was already part of the work, though nobody would have called it a collaborator.

  2. ChatGPT arrives ChatGPT showed up late that year, in the same tab bar as everything else. It took the occasional question, and its answers came in a different register.

    At first I used it as a better search box, for explaining an error, describing an API or writing a regex. Whatever it said still had to be read, weighed and retyped by hand.

  3. The clipboard loop Soon code was traveling between the chat and the editor. I pasted a function in, pasted the error back out and kept going until something ran.

    It was the first real change in how I worked. The chat became a second editor, one without access to any files, and every round trip was manual. The model knew only what I had thought to paste.

  4. Phind and Perplexity Next came search engines that answered instead of listing links: Phind for code, Perplexity for the rest. I stayed on their free tiers.

    Both cited their sources more carefully than ChatGPT did, and both were worse at holding a conversation. They were good enough to try and not quite good enough to pay for.

  5. Kagi Assistant Kagi Assistant eventually took over the questions. Its answers came with sources and it sat where I already searched, so Phind and Perplexity fell away.

    Searching and asking became a single gesture. The browser stopped being a separate stop on the way to an answer.

  6. ChatGPT dropped With Kagi handling the same questions, I let ChatGPT go, and the clipboard loop went with it, at least for a while.

    It left one less tool to keep track of. The copy-and-paste habit hadn't died, though. It was waiting for a model good enough to bring it back.

  7. Copilot completions In 2023 GitHub Copilot arrived inside VS Code. Gray ghost text finished my lines and sometimes whole functions, the first assistant that lived in the editor itself.

    Completions shifted the unit of work from a line to a sketch. I would write a signature and a comment, then accept or reject what appeared. There were no prompts and no pasting, only typing with a faster echo.

  8. Ollama: local models By 2024 I was running small models on the laptop with Ollama, for work that shouldn't leave the machine and, honestly, out of curiosity.

    Local models were slower and less capable, but they were always on and cost nothing. They became my playground for prompts, evaluations and tooling experiments.

  9. Harbor The local setup grew into Harbor, a single command that brings up backends, interfaces and services, and it became a project in its own right. OpenRouter followed soon after, for one-off tests and small jobs through an API.

    Tending that zoo of local services by hand had stopped scaling, so I turned the tooling into a product that starts the whole stack preconfigured. It later collected a few thousand stars.

  10. Aider I tried Aider in the terminal, pointed at the repository and at local models. It never quite stuck.

    It was the first real coding agent I ran, and it edited files directly. But the loop lived outside the editor, and reviewing its diffs took about as long as writing the code myself.

  11. Roo Code Roo Code, as it was called then, brought the same idea inside VS Code. It didn't take hold either.

    An agent proposed edits from a chat panel next to the code. The tools had simply gotten ahead of the models I could afford to run through them.

  12. claude.ai and the clipboard, again In 2025 the clipboard loop came back, this time with claude.ai and a stronger model. For the larger tasks I pasted in prompts and whole files.

    Entire files went in and entire files came out. It worked well enough to justify the friction, which is usually the sign that the friction should be automated.

  13. Copilot ask chat Copilot added a chat for asking questions, and questions about my own code moved from the browser into the editor, where the open files served as context.

    I no longer had to paste anything to ask about my own project. General questions stayed in the browser; specific ones moved next to the code.

  14. Copilot agent mode Copilot's agent mode could change whole functions and modules, and I reviewed its work in the diff view. The editor became the place where the work happened.

    For the first time, an agent edited across files inside the editor while I reviewed instead of typing. The clipboard finally went quiet.

  15. RustDesk RustDesk put the laptop on my phone, and not just one app but the whole desktop: the editor, the terminal, whatever happened to be running.

    Once the machine was reachable from my pocket, the question shifted from which tool to use to which machine to reach. Long runs could continue while I was away from the desk. It was the first of several ways into the setup from the phone.

  16. Three windows at once Soon I had three VS Code windows open side by side, each with a Copilot agent working on a different project. Doing more work meant opening another editor.

    Parallelism, at that stage, meant windows. Each one had its own agent, its own repository and its own quota, and my job was mostly noticing which one needed me.

  17. A devbox for inference A Strix Halo devbox joined the home network to handle inference and the rest of the homelab, and Harbor and its stack moved off the laptop.

    The laptop went back to being a laptop. Models, interfaces and other services now ran on a box that is always on and has the memory for larger models.

  18. Tailscale Tailscale went onto the home network, and the phone could reach the laptop and the devbox from anywhere. Their web interfaces opened in the phone's browser.

    There were no ports to open and no VPN to babysit. Every machine joined one private network, and the phone became just another node on it.

  19. Haven and Zellij I wanted a real terminal on the phone. Termius came first, then Haven, a much better SSH client. Of the many multiplexers I tried, Zellij stuck, because its controls stay on screen for the moments I forget them, which is most of them.

    SSH from the phone lands in a session that outlives the connection. Whatever was running on the devbox is still there after the train comes out of the tunnel.

  20. lifeos In December 2025 I started lifeos, a single repository on the devbox for skills, agent personas, notes and infrastructure. The idea was to give the agents one place to read.

    Everything an agent needed to know about me and my projects had been scattered. lifeos gathered it: notes, a task list, agent definitions and, later, the machines themselves.

  21. RUG: Repeat Until Good RUG, short for Repeat Until Good, was a layered agent system I built for Copilot. The orchestrator never edited code itself; it launched SWE and QA subagents until the checks passed.

    The rule was strict: the orchestrator could only delegate and keep the to-do list. Fresh subagents did the actual work, so the manager's judgment didn't degrade as the session grew longer.

  22. DRUG: Develop, Run, Until Good DRUG, for Develop, Run, Until Good, added a layer above RUG. It broke a specification into milestones and started a RUG for each one.

    That made three levels. DRUG decided what to build and in what order, RUG split each milestone into features, and SWE and QA agents did the work. It was, in effect, a workflow engine with a model at every node.

  23. VS Code limits Then the limits of VS Code began to pinch: quotas, context size, one window at a time and an orchestrator that couldn't leave the editor.

    The whole system lived inside a single editor process on a single machine. When the quota ran out or the window closed, everything stopped.

  24. Claude Code In early 2026 I took out a Claude Code subscription and added its VS Code extension. The agent stopped being a feature of the editor.

    Claude Code worked from a terminal with the repository as its world, and the editor became a place to read diffs. I retired RUG and DRUG, because the model could now plan and delegate on its own.

  25. mi and the skills repo In March 2026 I built mi, a minimal harness that extends itself and mostly runs on local models, alongside a skills repository any harness can load. Skills became the unit of reuse.

    Instead of teaching each tool separately, I wrote the know-how down as skills: discipline, bugbash, integration testing, ideate. mi was the smallest harness that could load them.

  26. control/: a persistent daemon That same month lifeos grew a control module: an OpenCode daemon on pop-os and fedora, reachable over Tailscale, with custom agents and a task list to pick from.

    Agents no longer needed the laptop to be awake. A systemd service on two Linux machines ran OpenCode with four personas, LHE, BUILDER, CRITIC and PLANNER, and took its tasks from dstask.

  27. Hermes gateway In April 2026 Hermes took on the role of a gateway: an always-on agent on fedora with an OpenAI-compatible API, reachable from any device.

    If OpenCode was a worker, Hermes was a front door, handling Telegram, YouTube uploads and daily summaries of what had happened. For a while the two ran side by side.

  28. More harnesses Through April and May more harnesses arrived: Cursor, Droid, Grok CLI in a sandbox container, and Codex. Each got the same skills, and none got to be the only one.

    Different models were good at different things, and every subscription had a quota. Running several harnesses at once turned the choice of model into a scheduling problem.

  29. Watching the agents By May 2026 I needed to see what the agents were doing. skilled showed which skills the harnesses actually used, and tracequest turned session logs into a live dashboard.

    With five harnesses running, reading logs by hand had stopped working. tracequest indexed thousands of sessions and later mined 1,200 of them for patterns of failure.

  30. Long runs in the cloud That summer, Cursor Cloud and a timeboxed-iterating skill made six-hour runs possible, with subagents fanning out and writing their findings back to disk.

    The skill turns a task and a time budget into a loop of subagents, dispatched across Claude Code, Codex, Cursor, Cursor Cloud and Grok. I set the clock, and the agents choose the steps.

  31. Daemon retired, board kept In August 2026 I retired the OpenCode daemon, and pop-os dropped out. dstask gave way to Backlog.md, a task list the agents share.

    The always-on worker had done its job, and the harnesses' command-line tools ran just as well on demand. The task list outlived the daemon that used to read it.

  32. Kandev In September 2026 Kandev arrived on fedora: tasks on a board, each carried out by an agent in its own worktree, with Claude Code and Codex running as sessions.

    Terminals became sessions that something else could start, stop and read. The board replaced the shell as the place where work is visible.

  33. Fleet By Sept. 19 there were four Kandev instances, connected over Tailscale: the Mac as the controller, plus hetzner, sandbox-av and fedora. RustDesk retired, and the laptop became a controller rather than a screen.

    Each instance keeps its own database, repositories and tasks. The controller talks to them directly over MCP; all that was missing was a way to address them and a health check.

  34. fleet CLI and skills sync A single command-line tool now covers the fleet: instances, health, dispatch and a sync that mirrors control/skills to every host. A skill written on the Mac reaches every machine a minute later.

    The registry is a JSON file, and the tool is plain Python with nothing to install. Restarts refuse busy hosts, and the sync prunes whatever was removed, so the machines never drift apart.

  35. Control center A controller task on the Mac now runs the loop. It collects from every instance, sorts what it finds by evidence, acts on it and escalates only what blocks. I read summaries instead of logs.

    It is the same fleet-control-center skill that began as an automation on sandbox-av, now running across the whole fleet. My attention goes to goals and irreversible decisions, not to watching.

  36. Today Today the setup is one person with a phone, a controller, three workers, a devbox, a repository of skills and a log viewer. The editor is still there, mostly for reading diffs. The clipboard loop is a memory.

    What changed over four years was less the model than the place where the loop lives: first my hands, then the editor, a terminal, a board and, finally, a fleet.