Releases: dmondello/ContainerDeck
Release list
ContainerDeck 0.6.0 — Deeper Stacks: env_file + profiles
Opens the 0.6 "deeper Stacks" cycle — two of the most-requested compose features ContainerDeck was missing.
env_file
A service can load one or more env files:
services:
api:
image: python:3.12
env_file: [api.env, common.env]
environment:
WORKERS: "8" # overrides any WORKERS from the env filesFiles are resolved relative to the compose file; inline environment takes precedence; missing files are skipped with a warning.
profiles
Services tagged with profiles: are now toggled from a chip bar in the stack view. Only enabled services start on Avvia stack — those with no profile, or whose profile you've activated. Excluded services are shown dimmed, so you can see the whole topology at a glance.
Notes
- The remaining 0.5 items (native XPC engine, Sparkle updates) are intentionally parked: both have cores that can't be verified without a signed build or runtime entitlements, so they're deferred to dedicated spikes rather than shipped half-working. Details in the README roadmap.
- Test suite grew from 56 to 63 assertions, all green.
Installation
macOS 15+ on Apple Silicon. The DMG is not notarized: after dragging the app to Applications, allow it once via System Settings → Privacy & Security → "Open Anyway".
ContainerDeck 0.5.2 — Cleanup
Maintenance release. No behavior changes — a dead-code and elegance pass after an audit of the codebase.
Removed (dead code)
- The
killaction chain that was wired end-to-end but never triggered from the UI (enum case, engine protocol method + both implementations, theperformcase). - Two orphaned localization keys left over from earlier refactors.
- The unused
DeckNetwork.pluginproperty.
Refactored (elegance)
- The seven near-identical delete confirmation dialogs collapse into one reusable
.deleteConfirmationmodifier — less boilerplate, and impossible to forget a confirmation on a new entity. - Stack orchestration moved out of
AppStateintoAppState+Stacks.swift, shrinkingAppStatefrom 452 to 280 lines.
Build clean, the 56-assertion test suite stays green, zero orphaned localization keys.
Installation
macOS 15+ on Apple Silicon. The DMG is not notarized: after dragging the app to Applications, allow it once via System Settings → Privacy & Security → "Open Anyway".
ContainerDeck 0.5.1 — Terminal crash fix
Bug-fix release for a crash introduced in 0.5.0.
Fixed
Opening the built-in terminal could crash the app (EXC_BREAKPOINT inside SwiftUI's environment lookup). The new ContainerTerminalSheet declared an unused @Environment(AppState.self); SwiftUI evaluates every declared @Environment property during a view update regardless of whether the body reads it, so on macOS 26.3 / SwiftUI 7.3.2 it could assert when the sheet's detached hosting context didn't carry that object.
The unused declaration is removed, and the app environment is now explicitly injected into every sheet and container context menu, so detached AppKit hosting contexts always have it.
No feature changes from 0.5.0; the 56-assertion test suite stays green.
Installation
macOS 15+ on Apple Silicon. The DMG is not notarized: after dragging the app to Applications, allow it once via System Settings → Privacy & Security → "Open Anyway".
ContainerDeck 0.5.0 — Built-in terminal
Starts the 0.5 "native integration & polish" cycle.
Built-in terminal
The container Shell now opens an in-app PTY terminal (SwiftTerm) running container exec --tty --interactive <id> /bin/sh — no more hand-off to Terminal.app, which stays available as a secondary option in the Shell menu. Real interactive shell, inside the app.
Stack discovery on restart
When a stack member is restarted on its own, its IP can change — so the /etc/hosts service-discovery wiring is now re-applied automatically, keeping peers reachable by name.
Under the hood
- Added SwiftTerm as a dependency (the app is now ~3.7 MB).
- The 56-assertion test suite stays green (
make test).
Still on the 0.5 roadmap: migrating the engine from the CLI to the native XPC ContainerAPIClient API, and Sparkle auto-updates.
Installation
macOS 15+ on Apple Silicon. The DMG is not notarized: after dragging the app to Applications, allow it once via System Settings → Privacy & Security → "Open Anyway".
ContainerDeck 0.4.1 — Test suite
A robustness release: ContainerDeck now ships a test suite.
Dependency-free tests
XCTest and Swift Testing both require Xcode — which this project deliberately doesn't need. So the suite is a self-contained harness run through the executable's --run-tests flag, working with the Command Line Tools alone and exiting non-zero on failure (CI-ready):
make test # or: swift run ContainerDeck --run-tests56 assertions cover the pure logic where regressions hurt most:
- Tolerant JSON access (dotted paths, array/single-object records, invalid input)
- Model mappings against the real CLI 1.0.0 schema — container (status object, CIDR-stripped IP, resources, env), image (arm64 variant size), volume, network (built-in detection), stats
runargument generation from the create form- Compose parser —
${VAR:-default}interpolation,depends_ontopological order, bare service names, build-context resolution, and skipped-mount/restartwarnings
No app behavior changes; same features as 0.4.0.
Installation
macOS 15+ on Apple Silicon. The DMG is not notarized: after dragging the app to Applications, allow it once via System Settings → Privacy & Security → "Open Anyway".
ContainerDeck 0.4.0 — Multi-log + Networks
Two more features that close the gap with other apple/container GUIs.
Combined multi-container log viewer
One logs --follow stream per container, merged into a single color-coded view:
- Per-container show/hide toggles, text filter, copy, autoscroll
- Opened from the Containers toolbar (all running containers) or a stack's toolbar (all running services) — tail your whole compose stack in one window
Networks
A Networks section alongside Volumes:
- List networks (subnet, gateway, mode) and which containers are on each
- Create and delete via
container network(the built-indefaultnetwork is protected) - Network create/delete requires macOS 26; listing works everywhere and degrades cleanly on macOS 15
Notes
- "Real-time stats" and "builder" (Orchard's other two) were assessed and deprioritized: stats are already polled near-live, and the BuildKit builder is auto-started during stack builds — neither adds much as a separate panel right now.
Installation
macOS 15+ on Apple Silicon. The DMG is not notarized: after dragging the app to Applications, allow it once via System Settings → Privacy & Security → "Open Anyway".
ContainerDeck 0.3.0 — Stacks with service discovery
The piece that makes Stacks actually usable: containers in a stack now reach each other by name.
Service discovery (verified working)
apple/container 1.0.0 has no inter-container name resolution — not on the default network, not on a custom one (container system dns create only covers container→host). ContainerDeck closes the gap itself:
- After every service is running, it collects their IPs and injects
<ip> <service>lines into each container's/etc/hosts. - Services become reachable by their plain name —
db,http://superset:8088— exactly as the compose file expects. - No admin password, works on macOS 15. Tested end-to-end: two containers reach each other by bare service name.
Because container IDs are global, service names must be unique across stacks running at the same time.
Notes
- This corrects the approach that was prototyped for 0.2.x: the DNS-domain route was tested and does not work on 1.0.0, so it was replaced with the
/etc/hostsmethod that does. - Compose subset,
${VAR:-default}interpolation, depends_on ordering and build support unchanged from 0.2.0.
Installation
macOS 15+ on Apple Silicon. The DMG is not notarized: after dragging the app to Applications, allow it once via System Settings → Privacy & Security → "Open Anyway".
ContainerDeck 0.2.0 — Stacks (docker-compose)
Stacks: docker-compose support 🎉
apple/container has no compose equivalent — now ContainerDeck fills the gap. The new Stacks section imports a docker-compose.yml and orchestrates it on the runtime:
- Supported subset:
services(image, build context/target/dockerfile, command, ports, environment, volumes, depends_on), top-level named volumes ${VAR}/${VAR:-default}interpolation from a sibling.envfile and the process environment- Start order follows
depends_on(topological sort), builds run throughcontainer buildwith automatic BuildKit builder start - Up / Stop / Tear down from the toolbar (tear down keeps named volumes), per-service status badges, activity log
- Clear warnings for what the runtime can't do:
restart,healthcheck, system socket mounts (/var/run/docker.sock), mount options
Note on service discovery: containers don't resolve each other by service name out of the box — each container has a dedicated IP. Use container system dns create or point services at container IPs.
Other
- Yams added as the only external dependency (YAML parsing)
--parse-compose <file>debug hook to inspect how a compose file is interpreted- Full EN/IT localization of the new UI
Installation
macOS 15+ on Apple Silicon. The DMG is not notarized: after dragging the app to Applications, allow it once via System Settings → Privacy & Security → "Open Anyway".
ContainerDeck 0.1.0
First public release of ContainerDeck — a native macOS GUI for apple/container, the lightweight Docker Desktop alternative for Apple Silicon.
Highlights
- Dashboard with running/stopped counts, CPU, memory and disk usage
- Container management: create, start, stop, restart, delete — with guided first-run kernel setup
- Container detail: configuration, live resource stats, mounted volumes, environment variables, raw JSON inspector
- Live log viewer with follow mode, text filter and copy
- Images: pull from OCI registries, delete, create containers via right-click
- Volumes: create, delete, see which containers use them
- Open container IPs in browser, VNC or FTP straight from the UI
- Shell into containers via Terminal.app
- English/Italian interface with live switching, light/dark theme
- Native SwiftUI, no Electron, zero external dependencies
Requirements
- macOS 15+ on Apple Silicon
- apple/container installed (optional — the app also runs in Demo mode)
Installation
The DMG is not notarized: after dragging the app to Applications, allow it once via System Settings → Privacy & Security → "Open Anyway". See the README for details.