ISS
← Field Notes
AI & AGENTS
March 29, 2026 · AI & Agents · 2 min read

Running a Portable Offline AI Stack on Apple Silicon With Podman

A self-contained offline knowledge and AI server stack for macOS where every heavy asset lives on an external drive, so the whole thing moves between machines.

N.O.M.A.D. is a portable, offline knowledge and AI server stack. The upstream project runs the containerized services; this repo is the configuration and documentation for making it run cleanly on Apple Silicon Macs via Podman, with one specific constraint driving every decision: everything large has to live on an external drive so the whole setup is portable between machines.

The portability constraint

The requirement sounds simple and turns out to shape the entire architecture. If you want to unplug a drive, carry it to another Mac, and pick up where you left off, then nothing heavy can be pinned to the internal disk. That means the container VM, the LLM models, the source code, and the routing data all need to sit on the external volume.

The setup was built and tested on a MacBook Pro with an M2 Max, 32GB of unified memory, and 30 GPU cores, with a 3.5TB external volume mounted at /Volumes/GitStuff. Every path in the config is written against a $NOMAD_VOLUME variable rather than a hardcoded location, so the same instructions work regardless of where a given machine mounts the drive.

Getting Podman's VM onto the external disk

The trickiest piece is the Podman machine itself. By default the VM disk lives under ~/.local/share/containers/podman/machine/applehv/, which is exactly the internal-disk location portability forbids. And Podman cannot resize an existing VM disk after creation, so you cannot lazily fix this later.

The approach is to symlink that machine directory out to the external volume, so all container data follows the models and source code onto the removable drive. Get this right up front and the VM, its images, and everything it writes live where they belong.

Ollama needs similar handling. You create a models directory on the external volume and configure the Homebrew service with OLLAMA_MODELS pointing there, bind it to all interfaces so the Podman VM can reach it, and enable the Apple Silicon performance flags. One honest gotcha the docs call out: brew upgrade ollama and brew services restart ollama will overwrite that plist, so after any upgrade you have to reapply the changes. That is the kind of footgun worth writing down, because you will hit it months later and not remember why Ollama suddenly forgot where its models are.

The takeaway

Portability is not a feature you bolt on, it is a constraint that has to be respected at every layer or it does not hold. The pattern that made this work was routing every path through one volume variable and moving each service's heavy state, VM disk, models, data, out to the external drive before first run, not after. Do it in the right order and the stack genuinely travels. Do it after the fact and you are fighting tools like Podman that will not let you move state once it exists.

Have something that needs building, or stabilizing?

These notes are the work log. The paid work runs through Moonshine Labs, my product and engineering studio. Tell us what you're building, or grab a call.

Work with us →
the studio: moonshinelabs.io