The Docker you wish Docker shipped.
Morbstack runs unmodified upstream Moby — dockerd and containerd, stock, no engine patch — inside one shared, lightweight Linux VM on Apple's Virtualization.framework — free forever, Apache-2.0, no account, no telemetry.
Six claims, each one checkable.
No embellishment — every line below is true today and traceable to this repository's own license file, source tree, or docs.
Free forever
No tier, no seat limit, no company-size threshold. Every feature that runs on your machine costs nothing, for anyone.
Apache-2.0
The whole project — daemon, CLI, app, guest init — is Apache-2.0. See LICENSE and NOTICE in the repository.
No account
Nothing to sign in to. Nothing phones home to check a license. There is no account system anywhere in this codebase.
No telemetry, no license nags
No analytics, no crash reporting service, no "upgrade to Pro" interstitials. What you run is what's in the repo.
Unmodified upstream Docker Engine
A static upstream Docker Engine build runs inside the guest, not a reimplementation — dockerd and containerd are both stock, archive-hash-pinned binaries with no downstream patch. Published ports (including docker run -P) are held on the Mac by a small Morbstack userland proxy, invoked through dockerd's own stock --userland-proxy-path hook.
Native SwiftUI, zero web views
No Electron, no Chromium, no embedded browser anywhere in the app. SwiftUI and Foundation, the same frameworks a Mac-native app is supposed to use.
Measured numbers, and separately, targets.
Every number below is labelled with the file it came from. The two groups are not the same kind of claim — conflating them is exactly the kind of dishonesty this project exists to avoid.
MeasuredReal, timed runs against a live build — not simulated, not estimated. See docs/roadmap.md and docs/parity.md.
docker run hello-world completing — socket-activated, no pre-warmed VM state.morb stop takes 10.7s; morb start brings a --restart unless-stopped container back running, no manual restart.These are commitments, not results. docs/roadmap.md commits Morbstack to publishing accurate, current status against every one of these via morb bench from milestone M2 onward.
| Target | Goal |
|---|---|
| Cold boot | ≤ 2.0 s |
| Resume (from suspend-to-zero) | ≤ 500 ms |
| Idle host CPU | ≤ 0.1 % |
| Idle wakeups | < 20 / s |
Host RSS (morbstackd, idle) | ≤ 120 MB |
| Guest memory floor | ≤ 256 MB |
git status on a bind-mounted Linux tree, vs. native | ≤ 2x native |
npm install on a bind-mounted project, vs. native | ≤ 1.5x native |
Source: docs/roadmap.md, "Public performance target table".
Pre-release. Here's exactly where it stands.
- No
*.morb.localdomains or local HTTPS. Those need a narrowly-scoped DNS and trust design; neither is claimed today. - Hot-reload still lacks an inotify bridge. A host-side edit is correct the instant you read it, but watchers need polling until the explicitly-scoped FSEvents bridge has a guest injection endpoint.
- Published-port parity is intentionally narrow. Fixed loopback TCP has synchronous admission; dynamic/range ports, VM-stop persistence, and any not-yet-implemented protocol remain unavailable rather than silently misrepresented.
- Migration is images-only. The native review/transfer/verification workflow deliberately excludes volumes, bind mounts, containers, credentials, and registry access until each can be proven safely.
- Core CLI surface —
ps/images/pull/run/exec/logs/inspect/cp/stats/events— byte-for-byte the shape real Docker produces. - Multi-service Compose stacks with healthchecks, named volumes, and custom networks.
- Bundled Docker, Compose, and Buildx through an explicit, reversible setup transaction; direct socket discovery is created only when it is safe.
- Published ports, outbound container networking, and disk persistence across
morb stop/morb start. - amd64 images via Rosetta, verified bit-identical against native output.
- A native operations app with actual container, stack, image, volume, network, BuildKit, Kubernetes, disk, and migration routes.
What it looks like.
The dark containers screen (also the hero) and the Kubernetes screen are unedited real window captures from a Mac mini on Aug 26, 2026. The other screens are still renders from the app's own screenshot harness, not mockups. Some fixture data (container names, version strings) is placeholder test data, not a claim about the current release.
docker images would show.
morb k8s single-node cluster, wired to the same engine as everything else.