macOS 26 · Apple silicon

ContainerUI

A native Mac app for Apple's container tool. Run Linux containers, search Docker Hub, browse images, manage volumes and networks, and control the background service — all from one window.

Download for macOS

v0.5.0 · Requires macOS 26 on Apple silicon·build from source

ContainerUI
ContainerUI
Running
Containers5 containers · 3 running
Search containers
Run
web-frontend
nginx:1.27-alpine
192.168.64.348.2 MB
running$container stop web-frontend
api-gateway
ghcr.io/acme/api:2.4.1
192.168.64.4132 MB
running$container logs -f api-gateway
postgres-main
postgres:16
192.168.64.512%
running$container inspect postgres-main
redis-cache
redis:7.4
2 cpu
stopped$container start redis-cache
worker-batch
ghcr.io/acme/worker:latest
4 cpu
stopped$container start worker-batch
$container list --all --format jsondecoded

Live demo · filter, hover a row to reveal its command

Approach

A thin layer over the CLI

ContainerUI doesn't reimplement anything. It shells out to the supportedcontainer CLI and decodes its --format json output — so it tracks the documented command surface, not private APIs, and keeps working acrosscontainer releases instead of breaking on internal changes.

zsh — container
$ container list --format json [ { "status": "running", "configuration": { "id": "postgres-main", "image": { "reference": "postgres:16" }, "resources": { "cpus": 2, "memoryInBytes": 536870912 } }, "networks": [{ "address": "192.168.64.5/24" }] } ]
Containers
postgres-main
postgres:16
running
running
Features

The whole toolset, one window

Containers, images, Docker Hub search, volumes, networks, and the background service — each a first-class screen, with the actions you'd reach for and the touches that make it feel native.

container list

Containers

Every container, running or not, in one list.

  • List all containers, or just the running ones
  • Watch live CPU, memory, and IP
  • Inspect, then start, stop, restart, kill, or delete
  • Stream logs and exec into a shell
  • Open a shell in your own terminal — one click
  • Launch a new container from a full run form
Containers5 · 3 running
web-frontend
nginx:1.27-alpine
running
api-gateway
ghcr.io/acme/api:2.4.1
running
redis-cache
redis:7.4
stopped
container image

Images

Browse what you can run, and pull what you can't.

  • List local images
  • Inspect config, env, layers, and platforms
  • Pull with streaming progress
  • Tag or delete an image
Imagespull
redis:7.40%
nginx:1.27-alpine72 MB
postgres:16138 MB
redis:7.441 MB
hub.docker.com

Explore

Search Docker Hub and pull without leaving the app.

  • Search Docker Hub by name, instantly
  • Stars, pulls, and official badges at a glance
  • Browse a repo's tags — sizes, platforms, dates
  • Pull any tag straight into your images
Exploredocker hub
postgresofficial15K1B+
bitnami/postgresql1.1K500M+
timescale/timescaledb42090M+
container system

System

The background service, in plain view.

  • Check service status and tool versions
  • Read disk usage
  • Start or stop the system service
  • Auto-detect the container binary, or set a custom path
  • See a clear state when the tool isn't installed
Systemhealthy
Runningapiserver · launchdcontainer 0.5.0
Images
1.24 GB
18 · 12 active
Containers
384 MB
5 · 3 active
Volumes
96 MB
4 total
One-click consolecontainer exec -it

Drop into an interactive shell in your own terminal — Terminal, iTerm2, Ghostty, Warp, kitty, Alacritty, or WezTerm — straight from any running container.

Volumescontainer volume

List and inspect volumes, create them with a size and labels, then delete or prune the rest.

Networkscontainer network

See networks with their subnets and gateways, and create, delete, or prune them.

Command palette⌘K

Jump to any screen or fire an action without leaving the keyboard.

Live charts

CPU and memory plotted in real time for every running container.

Menu bar

Backend status and quick controls, one click from the menu bar.

New · Private registries

Bring your private images in

Sign in to your private registries, then pull from them like anything else. When you reach for an image on a registry you haven't signed in to, ContainerUI catches it — and puts the login one click away.

Log in to registryregistry login
SchemeAutoHTTPSHTTP
Log in
Pull an imageimage pull
nginx:1.27-alpinepublic
ghcr.io/acme/api:2.4.1
Not signed in to ghcr.ioPublic images still pull — sign in for private.Log in
  • Sign in to ghcr.io, Amazon ECR, Google Artifact Registry, or a registry you host
  • Pull private images with the same streaming progress as any other
  • A heads-up the moment you pull from a registry you're not signed in to
  • Your token goes straight to the container tool over stdin — the app never writes it to disk
Screenshots

Every surface

Containers, images, volumes, networks, and system — plus Explore, the new Docker Hub search, and the ⌘K command palette.

ContainerUI's Explore screen searching Docker Hub, listing repositories with stars, pulls, and official badges.ContainerUI's Explore screen searching Docker Hub, listing repositories with stars, pulls, and official badges.

Explore · search docker hub

Architecture

One small, testable seam

Every action follows one path. Views observe view models, which call services that build exact commands through ContainerCLI, CommandRunner, andProcess. Swap in a mock at that seam and the whole app is testable without a backend.

SwiftUI views
Features/
ViewModels
@Observable
Services
build exact argv
ContainerCLI
resolve · decode json
CommandRunner
Process
MockCommandRunner replays recorded CLI JSON in tests — no live backend, no window to launch.

Why shell out to the CLI?

The container project's Swift packages are API-stable only within a patch version, and talking to its XPC apiserver directly needs matching entitlements and tracks internal changes. The CLI is the documented, stable surface, and almost every read command supports --format json. So the app calls the CLI.

Tested at the seam

Host-less logic tests compile the UI-independent core and exercise it with a mock runner and recorded fixtures — fast, headless, and honest about the exact commands it builds.

JSON decodingexact argverror classificationformatting
Compare

ContainerUI vs Orchard

Both are native, open-source Mac apps for Apple's container. Here's how they line up — ContainerUI leans on the thin CLI layer; Orchard links the Swift packages and talks to the apiserver directly.

Feature
ContainerUI
Orchard
Live CPU / memory charts
⌘K command palette
per-tab
Live log streaming
2s poll
Build from a Dockerfile
Talks to container via
the CLI
XPC + packages
App footprint
Foundation · Process
gRPC · NIO · protobuf
One-click shell (exec)
Menu-bar controls
Auto-update
Docker Hub image search
Private registry login
Terminal
DNS domain management
Multi-container log panes

Orchard is a well-built app with more breadth today. ContainerUI's bet is the documented CLI — the surface Apple keeps stable across releases — for a smaller, faster app that tracks the tool as it ships.

Install

Download and run

Grab the DMG for the quickest start — or build from source with Xcode. Either way you'll need macOS 26 on Apple silicon, the same as container. On macOS 14 the app still launches, straight to a clear "not installed" screen.

ContainerUI v0.5.0
Apple silicon · macOS 26 · 3.8 MB
Or build from source
build
$ brew install xcodegen # one-time $ xcodegen generate # creates ContainerUI.xcodeproj $ open ContainerUI.xcodeproj # then Run ⌘R in Xcode
macOS 26Apple siliconXcode 16+XcodeGen

container isn't installed

Couldn't find Apple's container command-line tool. Install it, then point the app at the binary.

Searched
/usr/local/bin/container
/opt/homebrew/bin/container
Choose binary…RecheckDownload
Free · open source

Run your containers from a native window