macOS app & CLI · open source
Honeycrisp runs macOS and Linux virtual machines, and Linux containers, on
Apple silicon — from a native app or the crisp command line.
Push VMs to any OCI registry, give every CI job a fresh machine, and spread
the work over a rack of Macs.
Free and open source · macOS 27+ · Apple silicon
A simulation of the scheduler, not a screenshot. Each Mac runs at most two macOS VMs; queue more and the extras wait their turn.
A virtual machine and a container are different things, and Honeycrisp
doesn't pretend otherwise. Each gets its own commands and its own images.
crisp ps lists them side by side.
| VM | Container | |
|---|---|---|
| What it is | A whole machine: kernel, disks, display | An OCI image running a single workload |
| Guests | macOS and Linux | Linux |
| Images | Honeycrisp VM images, stored in any OCI registry | Standard OCI and Docker images |
| Runs on | Apple's Virtualization framework | Apple's container system |
Create a VM from the app's three-step sheet or one command. Honeycrisp fetches what it needs, and the machine that boots is ready to use.
Every version Apple offers for virtual Macs, a local IPSW or a URL. Set up an account, automatic login and SSH on first boot, and Setup Assistant is already done.
Debian and Ubuntu cloud images boot straight into a configured system with your SSH keys. Or use the installer for Ubuntu, Debian or Alpine, or any arm64 ISO.
Disks are copy-on-write, so a snapshot is instant. Take one of a running VM and restoring it resumes exactly where it was, open apps included.
A small guest agent runs in macOS and Linux guests and talks to your Mac over vsock. Install it from the Honeycrisp Tools disk, with no network or SSH; Linux cloud images install it on their own.
An interactive terminal sized to your window, or a command with streamed output, exit codes and stdin, as any user.
While a VM's window is open, its clipboard is shared with your Mac's.
Share a folder for one run or for good, read-only if you like. Linux guests mount it with virtiofs.
Forward ports from your Mac, put VMs on a named network so they can reach each other, or bridge onto a host interface.
Connect a device plugged into your Mac to a running VM. macOS asks you to approve each one.
See a VM's console output as it boots. Linux VMs without a display show it in the library instead of a screen.
Push a VM to GitHub's registry, GitLab's or your own, the same way you would
push a container image. crisp login keeps credentials in your
keychain, and existing docker login credentials work too.
A disk is split into compressed chunks, empty regions are skipped, and every chunk is verified.
Clone an image into an independent copy-on-write VM, or a thin overlay for throwaway CI machines.
.crispvm fileHoneycrisp is also a CI runner. Point GitLab, GitHub, Gitea or Forgejo at your Macs and they build and test your code there, macOS and iOS apps included, without a hosted runner.
Every job gets a fresh machine: a VM cloned from an image, or a new container, deleted when the job finishes. Nothing carries over from one job to the next.
A custom executor that works like GitLab's Docker executor. A Honeycrisp
VM image runs in a throwaway VM; any other OCI image, such as
node:22, runs in an Apple container that starts in a couple
of seconds.
A fleeting plugin for GitLab's autoscaling executors, and pools of VMs booted ahead of time, so a job that matches claims a ready machine in well under a second.
Pools of single-use runners. Each VM takes exactly one job and is replaced when it finishes. Registration tokens reach the VM over SSH stdin, never on a command line.
A Packer builder that starts from a restore image, an ISO, a raw disk or an existing image, provisions over SSH and pushes the result.
Link several Macs and one controller places VMs across all of them. It serves
the same API as a single Mac, so the app, crisp and the CI
runners point at it and carry on. Jobs wait in line at the controller until a
Mac has room.
Join tokens carry the CA's fingerprint, so a new Mac checks the controller before trusting it. Private keys never leave the Mac that made them.
Label a Mac xcode=26 or pool=ios and send jobs only
to Macs that match. A max-jobs label caps Linux work on a
node.
The controller is a pull-through registry cache. Each layer comes from the internet once, then from the LAN, and the least recently used layers make room when it fills.
A standby keeps a copy of the controller's CA, members, tokens, labels and
revocations, updated every ten seconds. If the controller is gone for good,
crisp cluster promote makes the standby the new one, and the
other Macs follow on their own.
A VM's address is private to the Mac it runs on, so every node runs an mTLS tunnel, and clients reach a VM's SSH port through it without being told.
The limit everything is built around: Apple lets a Mac run two macOS virtual machines at a time. Honeycrisp keeps to that rather than working around it. A cluster is how you get more: more Macs.
A background service, crispd, owns your VMs, images and
networks. The app, crisp, the CI runners and the Packer plugin
all talk to it, so a VM started in the terminal shows up in the app at once.
The app installs and starts the service the first time it opens.
Every VM as a live image of its screen, even the ones running without a window, with a bar for macOS slots, memory and processors in use.
Drop an .ipsw or .iso on the window to make a VM
from it, or a .crispvm to import one.
Start and stop VMs without opening the app. Each running VM has its own small host process, so VMs keep running when the service restarts.
Once this Mac is part of a cluster, the sidebar gains a Cluster page: how many Macs are online and how many macOS slots are in use across all of them.
The app hasn't been released yet. The download will be here when it
ships, free. Until then it builds from source: clone the repository and
run make app.
Free · open source under MIT · macOS 27+ · Apple silicon only
That is Apple's limit for virtual Macs, not Honeycrisp's. Linux VMs and containers aren't held to it. When you need more macOS machines at once, add Macs to a cluster: the controller treats every slot on every Mac as one pool.
No. Containers run on Apple's own container system, which you install from
Apple's container
releases. crisp container passes straight through to it, and
plugins such as compose work through Honeycrisp too.
No. Honeycrisp needs a Mac with Apple silicon running macOS 27 or later.
It works, and it is in early development: commands, file formats and the API may still change between versions. Expect rough edges, and please report them.
Yes. Honeycrisp is open source under the MIT license, and the code is on GitHub. There is no account and nothing to pay for.
I built Honeycrisp with heavy use of AI coding tools.
Saying so seems more useful than leaving you to guess.