Skip to content

Releases: dmondello/ContainerDeck

ContainerDeck 0.6.0 — Deeper Stacks: env_file + profiles

Choose a tag to compare

@dmondello dmondello released this 14 Jun 13:26

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 files

Files 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

Choose a tag to compare

@dmondello dmondello released this 13 Jun 09:28

Maintenance release. No behavior changes — a dead-code and elegance pass after an audit of the codebase.

Removed (dead code)

  • The kill action chain that was wired end-to-end but never triggered from the UI (enum case, engine protocol method + both implementations, the perform case).
  • Two orphaned localization keys left over from earlier refactors.
  • The unused DeckNetwork.plugin property.

Refactored (elegance)

  • The seven near-identical delete confirmation dialogs collapse into one reusable .deleteConfirmation modifier — less boilerplate, and impossible to forget a confirmation on a new entity.
  • Stack orchestration moved out of AppState into AppState+Stacks.swift, shrinking AppState from 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

Choose a tag to compare

@dmondello dmondello released this 13 Jun 09:18

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

Choose a tag to compare

@dmondello dmondello released this 13 Jun 09:01

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

Choose a tag to compare

@dmondello dmondello released this 13 Jun 08:48

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-tests

56 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
  • run argument generation from the create form
  • Compose parser — ${VAR:-default} interpolation, depends_on topological order, bare service names, build-context resolution, and skipped-mount/restart warnings

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

Choose a tag to compare

@dmondello dmondello released this 13 Jun 08:20

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-in default network 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

Choose a tag to compare

@dmondello dmondello released this 13 Jun 07:53

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/hosts method 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)

Choose a tag to compare

@dmondello dmondello released this 12 Jun 12:36

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 .env file and the process environment
  • Start order follows depends_on (topological sort), builds run through container build with 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

Choose a tag to compare

@dmondello dmondello released this 11 Jun 20:43

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.