| title | date | publication | notes |
|---|---|---|---|
Multipass on macOS: My Agentic Flywheel Ubuntu VM Setup |
2026-01-11 |
The Hybrid Builder |
AI-written; collaboration recap |
I didn’t start last night by saying “I need a VM.”
I started by saying: I want to try the Agentic Coding Flywheel Setup (ACFS)—but instead of renting a VPS, I wanted to repurpose a machine I already own: an M2 Max Mac with 94GB of memory.
That’s a slightly perverse choice, because ACFS is designed to take a fresh Ubuntu VPS and turn it into a professional agentic dev environment. A Mac is not that. But as a hybrid builder, “not ideal” is often the most interesting place to run an experiment.
So the goal became: replicate the flywheel experience locally, on real hardware I control, and see what breaks.
This article documents what I ended up standardizing on:
- Multipass as the Linux substrate: an Ubuntu VM on macOS (my VM is named
agentic, running Ubuntu 24.04 LTS). - ACFS as the flywheel: the installer-driven stack I wanted to evaluate.
It’s explicitly AI-written, and it’s also explicitly a collaboration story: I’m steering the goals and constraints, and my assistant is helping me extract signal from chaos and turn it into a reproducible build.
Along the way, I kept bumping into a familiar pattern—what I’ve been calling a compound engineering loop: use it before you improve it, then systematize the working path. (If you want the meta framing, it’s the same loop I described in “Compound Engineering: Use It Before You Improve It”.)
I’m already running agents locally, and that’s part of what made this experiment possible.
Here’s what I have right now:
- On my laptop: Claude Code, Codex CLI, Gemini CLI
- On the M2 Max (native macOS): Claude Code, Codex CLI, Gemini CLI
- On the M2 Max (Ubuntu via Multipass): Claude Code, Codex CLI, Gemini CLI
- Bonus (on the M2 Max): OpenCode, for good measure
Why replicate across environments? Because different tools “want” different assumptions:
- Some want a real Linux box.
- Some are happiest natively on macOS.
- Some are fine anywhere as long as the shell + runtimes are sane.
ACFS is opinionated about Ubuntu, so the Ubuntu VM became the cleanest place to run it without constantly translating platform quirks.
I didn’t wake up thinking “I want Multipass.”
I woke up thinking:
- I want to try ACFS without renting infrastructure.
- I want a Linux environment on my Mac that feels like “SSH into a server.”
- I want to run agentic installs / bootstrap scripts repeatedly.
- I want the environment to persist between sessions.
- I want fewer “what daemon is running?” mysteries.
The thing I was building toward was a local “flywheel”: a setup where the environment is stable enough that each iteration builds on the last, instead of resetting my attention back to infrastructure.
The first instinct was the standard Docker route.
I tried:
- The Linux convenience script:
get.docker.com(useful on Linux, not the macOS answer) - Docker Desktop via Homebrew cask
That got me far enough to do quick checks like:
docker psdocker run -it ubuntu:latest /bin/bash
…but the deeper I got, the more I was building “a Linux-ish workspace” by layering assumptions inside a container.
That’s fine when you’re deploying containers. It’s less fine when you’re trying to live in the environment for hours and evolve a toolchain.
Next I pivoted to Colima:
brew install colimabrew install dockercolima start
This is a legitimately good setup when your core workflow is containers. It’s CLI-first and lighter-weight than Docker Desktop.
I used it to run a long-lived container:
docker run -d --name agentic-flywheel ubuntu:latest tail -f /dev/nullThen I exec’d in and started bootstrapping:
docker exec -it agentic-flywheel bash
apt-get update
apt-get install -y git curl sudoI even got far enough to clone and run an installer inside the container.
But I also hit the typical “container reality” friction:
- You’re always one missing capability away from wishing it was a VM.
- You’re always deciding whether state belongs in the container, a bind mount, or your host.
- When something gets weird, you’re debugging contexts/configs.
This is the point where the workflow tells you what the correct abstraction is.
For me: I didn’t want a container. I wanted a box.
The final pivot was Multipass.
On macOS:
brew install --cask multipassThen I ended up with a VM called agentic running Ubuntu 24.04 LTS.
You can verify the state with:
multipass listAnd enter it with:
multipass shell agenticThat’s the moment it clicked.
Inside the VM, the world is boring again:
apt-getbehaves like it should- paths and users behave like they should
- scripts that were written with “Ubuntu server” assumptions stop fighting you
This setup feels like the “AI memory” work I’ve been doing elsewhere: the goal is not just to solve the immediate task, but to build a substrate that accumulates progress instead of losing it. (That theme shows up strongly in “Teaching Claude Code to Remember For You” and “The AI Memory Problem: When Your Team’s Coding Assistants Don’t Talk to Each Other”.)
The “flywheel” I was experimenting with is Agentic Coding Flywheel Setup (ACFS) by Dicklesworthstone.
- Repo: https://github.com/Dicklesworthstone/agentic_coding_flywheel_setup
- Wizard site: https://agent-flywheel.com
ACFS’s core promise is simple: take a fresh Ubuntu machine (typically a VPS) and bootstrap it into a fully loaded agentic dev environment.
Two details I love as a builder:
- Idempotent installer: if it’s interrupted, you re-run it and it resumes.
- Pinning support: for reproducibility, you can pin to a tagged release or a specific commit.
Inside multipass shell agentic, you can run the same one-liner ACFS uses for VPS installs:
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/agentic_coding_flywheel_setup/main/install.sh?$(date +%s)" | bash -s -- --yes --mode vibeAfter you’ve validated the flow once, pin it:
ACFS_REF=v0.1.0 \
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/agentic_coding_flywheel_setup/v0.1.0/install.sh" \
| bash -s -- --yes --mode vibe(Replace v0.1.0 with whatever release you want to standardize on.)
The meta-pattern here is the same thing I keep rediscovering: use the fastest path to get it working, then lock it down so your environment becomes a compounding asset.
If your state is:
- images and containers → Docker-first
- packages, users, services, dotfiles, scripts, and a durable workspace → VM-first
I was clearly in the second category.
This wasn’t a “Multipass is better” story.
It was:
- try Docker Desktop → notice friction
- try Colima → notice different friction
- choose Multipass because it matched the mental model: a real Linux environment that persists
That’s compound engineering in practice: I don’t optimize first. I run the loop until it reveals what wants to be standardized.
A subtle part of why this went faster is that I wasn’t doing it alone.
The assistant helped me:
- reconstruct what I actually did (from shell history)
- separate “final setup” from “failed experiments”
- turn a messy night into a coherent checklist
That’s the meta-skill layer: building systems that make future work cheaper.
On macOS:
brew install --cask multipass
multipass list
multipass shell agenticInside Ubuntu:
sudo apt-get update
sudo apt-get install -y git curl
# then run ACFS installer (see above)Day-to-day:
multipass stop agentic
multipass start agenticThe setup is “mostly working,” which is builder-speak for “it’s good enough to use, and now the real feedback begins.”
The next upgrades I’m planning:
- A single bootstrap script that sets up the VM the way I like it (packages, dirs, aliases)
- A repo-local
READMEthat documents the golden path + failure modes - Optional: Docker inside the VM if the flywheel needs it (keeping macOS clean)
And if you’re reading this as a hybrid builder: the point isn’t Multipass.
The point is learning to treat infrastructure choices as iteration artifacts—you don’t guess the perfect stack. You run fast loops until the stack reveals itself.