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:
launchdLaunchAgents 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).
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.