Tools & Dev Environment3 min read

My one-person agent factory: the setup

34 web apps, a handful of paper-trading bots, and a multilingual video pipeline — all run from a 2017 Intel laptop that just stays on. Here's the whole setup and why the old hardware helped.

#setup#launchd#macos#automation#homelab
My one-person agent factory: the setup

The whole thing runs on a laptop old enough that people ask why I haven't replaced it. That's kind of the point.

The machine

An Intel Core i7-7700HQ — a 2017-era mobile chip, x86_64, not Apple Silicon. It never sleeps. That single property (always-on) is what makes it a server: it hosts scheduled jobs, bot dashboards, and the render pipeline around the clock.

What lives on it:

  • ~34 small web apps — built and deployed from here.
  • A few paper-trading bots — running experiments, not real money.
  • A video pipeline — text-to-Shorts, rendered locally.
  • Scheduled automation via launchd — e.g. a daily publish job.

The pieces

  • Agent orchestration: I run coding agents (Claude Code, Codex) to do most of the building. The environment I run them in evolved from a plain terminal → cmux → Orca — that's its own post.
  • Scheduling: launchd LaunchAgents for anything recurring. One catch that bit me: LaunchAgents only load when the GUI user is actually logged in — sit at the macOS login screen after a reboot and nothing boots.
  • Remote access: Tailscale, so I can check the bot dashboards from my phone without exposing anything publicly.
  • Alerts: Telegram for the bots whose output I'd actually act on (and deliberately silent for the paper ones).

The setup at a glance — always-on Intel Mac hosting apps, bots, and jobs Placeholder — real diagram pending.

Why the old hardware actually helped

An old Intel Mac on a recent Python (3.14) is a great forcing function. Video/media wheels don't always have prebuilt binaries, so instead of fighting compilation I lean on a static ffmpeg (via imageio-ffmpeg) and deterministic, diffable pipelines. The constraints pushed me toward the things you want anyway: pinned static binaries, absolute paths in launchd (its PATH doesn't include /usr/sbin), and no reliance on anything that needs a fresh machine.

The honest part

You don't need new hardware or a cloud bill to run a surprising amount as one person. You need a machine that stays on and a discipline that survives crashes and reboots: scheduled jobs that are idempotent, binaries that don't drift, and remote eyes on the dashboards. The old laptop isn't a limitation I'm working around — it's the constraint that keeps the whole thing honest.

The individual pieces — the agent environment, Tailscale, Telegram, the launchd gotchas — each get their own post. This is the map.

Related