Run your existing docker-compose.yml on
Apple's container —
the macOS-native, VM-per-container runtime — without rewriting it.
$ acompose up :: project gitea-postgres (2 services) network gitea-postgres-net :: start order: db → gitea run db (gitea-postgres-db) run gitea (gitea-postgres-gitea) ✓ stack up db ✓ running 192.168.65.2 gitea ✓ running 192.168.65.3 localhost:3000 containers reach each other by service name via /etc/hosts; <SERVICE>_HOST env vars are the fallback for shell-less images
Apple container gives each container a lightweight VM
with its own real IP — great isolation, zero Compose support. acompose fills that gap
and leans into the IP-first model instead of fighting it.
Parsing is the official compose-go — the same library Docker Compose uses.
${VAR} interpolation, .env, override merging, profiles:
the spec implementation, not hand-rolled parsing.
depends_on resolved topologically, cycles rejected.
condition: service_healthy approximated by TCP-polling the
dependency's first published port.
Every container's name→IP is written into every peer's /etc/hosts,
immediately and bidirectionally — unmodified app code connecting to
db:5432 just works. <SERVICE>_HOST env vars
are the fallback for distroless images.
Created on up, kept on down, removed on
down -v — the same contract as docker-compose, backed by
the runtime's own container volume.
acompose watchA built-in supervisor for the restart: policies the runtime
doesn't enforce: polls the stack, restarts exited services, re-wires
DNS when IPs change.
acompose updatePulls newer images and recreates only the services whose manifest
digest actually moved; build: services get rebuilt.
acompose devCompose-spec develop.watch hot reload: sync
copies changed files in, rebuild recreates,
restart bounces — zero extra dependencies.
acompose dnsHost-side DNS names via the runtime's native
container system dns: one-time setup, then
<container>.<project> resolves from your browser
straight to the container's real IP.
acompose doctor checks your machine,
acompose check reports how well your compose file
translates — without running anything — and
acompose import-volumes brings your Docker/OrbStack
volume data across.
acompose uiA live dashboard in the same binary: every service as a card with its real IP front and center, status lamp, published ports, logs panel, stop/start. Offline, no CDN.
Everything the runtime can't honour — exec healthchecks,
deploy: limits, x86 images — is warned about at startup.
No silent surprises.
Requires macOS 26 with Apple's container CLI; Apple Silicon.
brew install htlin222/tap/acompose # or build from source git clone https://github.com/htlin222/acompose && cd acompose && make install # no compose project handy? scaffold a demo and see a page in two commands acompose init # writes a minimal docker-compose.yml acompose up # then open http://localhost:8080 # in a real project acompose up --dry-run # see the exact `container` commands first acompose up acompose ui # live dashboard on http://127.0.0.1:4242
Platform-level gaps a CLI wrapper cannot fix — all warned at startup:
restart: policies aren't enforced by the runtime itself — acompose watch supervises them from the outside insteaddeploy: resource limitsplatform: linux/amd64) images are not seamless on this runtime