$ acompose

Run your existing docker-compose.yml on Apple's container — the macOS-native, VM-per-container runtime — without rewriting it.

GitHub
$ 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

Every container is its own machine

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.

The real compose spec

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.

Dependency-ordered startup

depends_on resolved topologically, cycles rejected. condition: service_healthy approximated by TCP-polling the dependency's first published port.

Service-name DNS that just works

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.

Named volumes, natively

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 watch

A built-in supervisor for the restart: policies the runtime doesn't enforce: polls the stack, restarts exited services, re-wires DNS when IPs change.

the autoheal idea, native

acompose update

Pulls newer images and recreates only the services whose manifest digest actually moved; build: services get rebuilt.

the dockcheck idea, native

acompose dev

Compose-spec develop.watch hot reload: sync copies changed files in, rebuild recreates, restart bounces — zero extra dependencies.

acompose dns

Host-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.

Switching is de-risked

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 ui

A 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.

Loud about platform gaps

Everything the runtime can't honour — exec healthchecks, deploy: limits, x86 images — is warned about at startup. No silent surprises.

Install

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

Honest limitations

Platform-level gaps a CLI wrapper cannot fix — all warned at startup: