Macs were designed for power efficiency! They sleep when the lid is down and wake instantly when opened. They sleep when a timer runs down and nobody pressed the shift key for a bit. Fine if you’re working on a laptop all day and didn’t bring your charger. But run an LLM on a Mac Mini in a closet it feels like your Mac caught a case of digital narcolepsy. For what I do in my hobbies and work a sleepy Mac just won’t do; it must remain wide awake and perpetually caffeinated.
Running a local LLM on my Macs was drop dead simple: I downloaded Ollama, opened the GUI and started a chat with an LLM. Yet I needed them to behave like proper headless servers, and like every good PM I began to think about the requirements. That starts with minimizing the need for the keyboard, monitor and mouse but more’s required.
So off I went all optimistic and hopeful, believing someone else likely solved these problems, but actually not so much.
A decent amount of work already exists, but it’s never been assembled under the same tent nor the same way twice.
anurmatov/mac-studio-server, and two others...By far this is the closest single competitive open source project. Composed of shell scripts and plists it focuses on headless Ollama on Apple Silicon. mac-studio-server contains features like sleep prevention, LaunchDaemon autostart, SSH remote management, and service suppression that claims to cut memory use from 11GB to 3GB. It's well recognized with 352 stars and 39 forks. Yet, it’s Ollama-only, plain shell, seven commits total with the most recent sometime last year, lacks pre-check/verify/restore lifecycle, no storage-volume automation, and no hardware telemetry. A couple of other projects, jpalat/local-llm-setup and mrmoe28/mac-mini-llm-setup, cover similar ground with less structure, closer to notes than to tools.
A second category of projects/tools solve a different part of the problem.
But all of these miss OS hardening and setting the system up to be resilient when restarted meaning: no pmset, no sysctl, no SIP handling, a missing service account, no SSH hardening, no LaunchDaemon management, and no storage-volume work.
There were clear gaps where my needs diverged from the field. I wanted an appliance-like system with associated hardening (i.e., pmset, sysctl, SIP, SSH, a dedicated service account, LaunchDaemon conventions). I needed it idempotent in case we needed to stop mid-way and restart, auditability plus reversibility to revert back, multi-tool serving orchestration, storage-volume automation, and hardware telemetry. My sense was these all needed to be in one tool, for one machine and not loosely linked together in my own head. So off I went, with my new friend Claude and some critical thinking, to build the thing stitching them all together.
headless-macs is a Go binary with an interactive terminal UI (TUI) plus equivalent CLI subcommands. This way it works as you're remotely SSH'ed in and want to start from a menu driven experience or you want to remotely execute from a central system. Here’s a walk through of general steps it takes.
There’s even a live dashboard to quickly show key service state, PIDs, memory, CPU%, plus hardware telemetry (CPU/GPU power draw, temperature) if you turn on macmon. The config lives in a single JSON file, seeded from a template on first run. By design there's no CLI flag to edit config values directly, instead you edit the file or use the TUI editor, and the subcommands only run things. That separation enshrines the config values cleanly and prevents me from forgetting a flag I typed six months ago.
The first version wasn’t based on Go at all, instead it was two bash scripts (i.e., pmset_to_ollama.sh & setup_colima.sh) to perform power management and Docker/Colima setup with no shared structure between them. That quickly change growing into a proper bash pipeline (i.e., precheck.sh, setup.sh, install-tools.sh, verify.sh and restore.sh) and a shared library with consistent messaging. This was a significant improvement, but not good enough for me. Eventually the shell pipeline became was cleaned up by using Go and a proper TUI plus CLI was generated. If the reader is curious the old bash scripts are still in the repo, printing a deprecation notice and exit 0 rather than vanishing. At some point they will be removed, but I leave them just in case there’s a copy running someplace I don’t know about. I suppose breaking a thing is worse than leaving a fossil behind.
headless-macs doesn't marry you to a single inferencing service, and that’s because no single one wins every time. If you simply need something for embeddings/reranking, Infinity is the right fit. Want to run a large model and have a collection of Macs with the right interconnect, then Exo is your best bet. This was a primary design point for headless-macs: give choice to the administrator to tailor the system to match the need at hand.
Instead of letting you “hunt and peck” with/for various models, headless-macs, includes a list of several models to consider as a starting point. This list is not an endorsement just some suggestions for models that will fit. To get to the right model, context window, concurrency approach, etc. you have to understand your usage scenario, Mac, workload, etc.
Apple announced M5 Max and M5 Ultra in August 2026, with units shipping by September 22. This update restores higher RAM ceilings, with a 512 GB configuration following the September release in October. I’m sure there will be new news about how models behave on these newer versions. Additionally, for both work and my hobbies I’ll be updating the list with real use cases, workloads and behaviors on my Mac home lab. So stay tuned…
Apple’s opinionated design makes usability and personal productivity super first class. Practically, it means that for several configuration changes manual intervention is needed and in some cases physical access is required. Most of these remaining warts can’t be overcome through automation.
In other cases limitations were observed but automation was still possible. That means these warts were overcome.
For cases like SIP, RDMA, and High Power Mode, Apple would need to take action: either bring forward their Private Cloud Compute server infrastructure, or build a proper server distribution of MacOS. Recovery Mode access could also use something like Dell’s iDRAC for enterprise remote management. We’ll see what Apple does.
At this stage it’s a deliberate, documented design choice to make headless-macs focused on home-lab deployments. Because of this design choice, headless-macs installs and binds services to plain HTTP ports, without authentication or TLS. This means exposing headless-macs services to an untrusted network is a terrible idea shouldn’t be done. However, this is recognized technical debt and something to be remedied with a design sketch already sitting in the project’s futures doc. Caddy is the leading candidate, mostly because setting up TLS with it is pretty straightforward.
If you’re sitting on a Mac Mini that’s mostly asleep, or you’ve been putting off building a home LLM node because the setup felt like more trouble than it was worth, that’s the exact problem I built headless-macs to solve. Wake the thing up and give it a spin.