One native macOS GUI. One CLI that doubles as docker and docker-compose. Zero gRPC. Zero NIO. Zero daemon of its own.
Macker replaces Docker Desktop on macOS by talking directly to Apple's
apple/containerruntime — no Docker daemon, no license, no Electron, no gRPC stack.
Native SwiftUI GUI — Dashboard, Containers, Images, Builds, Volumes, Networks, Compose, Activity Monitor, Settings.
Drop-in CLI — symlink the binary as
dockeranddocker-compose.Custom Compose engine —
${VAR}interpolation,depends_onwithservice_healthy, service-name DNS, config-hash recreation.Hot reload — synthetic inotify bridge over virtiofs so Vite/webpack/nodemon rebuild on host edits.
Menu bar extra — CPU/memory rings and per-container quick actions.
Dashboard — runtime status, resource cards, live CPU/Memory/Block I/O charts, and active containers.
apple/container exposes a private XPC API (container-apiserver). Macker
talks to it through a lightweight XPC client — no gRPC, no NIO, no daemon of
its own. Operations that have no XPC route (image build, pull, push, tag,
prune) fall back to the container CLI.
The single macker binary dispatches on its arguments:
| Invocation | Mode |
|---|---|
macker |
Launches the SwiftUI GUI |
macker <args> |
Runs the headless CLI (ArgumentParser) |
Read the full module map in docs/ARCHITECTURE.md.
| macOS | 15+ (Sequoia or later) |
| CPU | Apple Silicon (arm64) |
| Runtime | apple/container installed and running (container-apiserver) |
| XPC protocol | pinned to 1.2.2 in Package.swift — client and runtime ship in lockstep |
brew install --cask djpfs/tools/macker
Installs the Macker.app bundle into /Applications (Launchpad/Spotlight
discoverable). The cask lives in the
homebrew-tools tap and points to
the latest stable .pkg from GitHub Releases.
To use the CLI as a drop-in docker replacement, symlink the bundled binary:
ln -s /Applications/Macker.app/Contents/MacOS/macker /usr/local/bin/docker
ln -s /Applications/Macker.app/Contents/MacOS/macker /usr/local/bin/docker-composeThis installs /usr/local/bin/macker. To use it as a drop-in docker
replacement:
ln -s /usr/local/bin/macker /usr/local/bin/docker
ln -s /usr/local/bin/macker /usr/local/bin/docker-compose
The GUI also has a Settings → Install CLI button that does the same thing (with an administrator password prompt).
Build a
.pkg installer and install it into /Applications:
./Scripts/build-pkg.sh 1.0.0
open dist/Macker-1.0.0.pkgOr, from the GUI, use Settings → Install app in /Applications to copy the
app bundle into /Applications.
git clone https://github.com/djpfs/macker.git
cd macker
make build # debug buildmackerThe GUI provides:
Dashboard — resource cards, daemon status, and CPU/memory/I/O charts with configurable time intervals.
Containers — list with search, start/stop/restart, and a detail pane with Info / Stats / Logs / Terminal / Files / Settings tabs.
Images — list, pull, and delete (with confirmation).
Builds — build history, build an image from a context, retry failed builds, copy the build command, and prune the build cache.
Volumes / Networks — create, inspect, and delete.
Compose — load compose files (including drag & drop), up/down, logs, and per-project actions.
Activity Monitor — per-container resource usage.
Settings — menu bar customization, storage cleanup, install CLI/app, launch at login, and more.
docker version
docker selftest
docker system status
docker ps
docker compose up -dBecause the binary is meant to be symlinked as docker, unknown top-level
subcommands are transparently routed to the docker shim. So these are
equivalent:
docker ps
macker ps Full command reference — see docs/COMMANDS.md.
| Layers, modules, and how they fit together | |
Full docker and docker compose reference |
|
How docker compose up works and the virtiofs inotify bridge |
|
| Menu bar and storage & cleanup | |
| Security policy and notes | |
| Development setup, code style, testing, releasing | |
| Known limitations and planned improvements |
- Privilege escalation: the Settings "Install CLI" and "Install app in
/Applications" actions run
osascriptwith administrator privileges. These are user-initiated and only copy the app's own binary into standard locations. See SECURITY.md. - No secrets: the project contains no hardcoded credentials, API keys, or
tokens. Do not commit
.envfiles orfirebase-adminsdk-*.json. - Keychain-backed secrets: runtime secrets can be managed with
docker secret ...and referenced askeychain://SECRET_NAMEinKEY=VALUEenvironment entries. - Shell safety: subprocesses are launched with argument arrays (not shell string interpolation), so command arguments are not shell-injected.
Contributions are welcome — bug reports, feature requests, docs, and pull requests.
make build # debug build
make test # unit tests (needs full Xcode)
make release # release build
make lint # swift-format (if installed)
make guest-agent # cross-compile the hot-reload agent
make clean # remove build artifactsTests run in CI on macOS with full Xcode (XCTest is not shipped with
CommandLineTools). The XPC protocol is not a stable public API — client and
container-apiserver ship in lockstep; bump containerVersion in
Package.swift when updating the runtime.
Full guide — see docs/CONTRIBUTING.md.













