Kristopher Baker iOS roots · Product systems · AI-assisted workflows
← Sparra

shipped · 2026.07.14 · 3 min read

Sparra runs without my laptop now

Sparra already had two ways to work: steer it live from a Claude Code session, or hand off a plan → freeze → build → reflect run and let it work unattended. Both still needed my laptop to be the machine doing the running. This week I closed that gap from two directions. sparra conduct "<prompt>" is a new headless conductor that takes one prompt, breaks it into units, and drives each one through contract-negotiate, generate, cross-model evaluate, and decide, the same loop I steer by hand in /sparra-loop, but without me at the wheel. By default it runs in a hybrid brain mode: the deterministic loop does the driving, and an LLM conductor role only gets consulted at the handful of judgment points that actually need a call, like a borderline pass or a contract that will not converge. Hand it --auto and the brain decides everything.

The second piece is what makes that useful when I am not home. A small HTTP bridge runs as a launchd service on my Mac and lets a Tailscale-connected device, my phone, another laptop, trigger and watch a run over the network. I spent more time on what it refuses to do than on what it does: it will not bind a public address under any configuration, every route but the health check needs a bearer token checked in constant time, every path a caller sends has to resolve inside an allowlisted root before anything touches the filesystem, and no endpoint ever returns raw role output or holdout text, only the same redacted summary the interactive conductor already sees. Installing it is one command that generates a random token, writes the launch agent, and prints the token exactly once. When a run parks a decision now, it is not a terminal waiting for me. It is a dashboard page I can open from my phone.

It was not clean the whole way. The bridge kept failing to start in a way that made no sense until I remembered that launchd runs services under a stripped environment, no shell profile, no PATH the way an interactive terminal has one, so a script that worked fine by hand from my own shell failed silently as a background service. That is the kind of bug that only shows up once you actually try to run something unattended, which was the entire point of building this.