macOS · Docker Desktop & Colima

DockerSpace

See what Docker takes up on disk, project by project — and delete only what is genuinely unused.

SwiftSwiftUIDockermacOS
local scan
ACTIVE
SHARED
ORPHANED
// 01 — the problem

Docker quietly accumulates tens of gigabytes in images, volumes and build cache. DockerSpace groups it by project, shows you what is in use and what is not, and gives you per-project cleanup instead of all-or-nothing.

Docker will not tell you who owns what. You see 90 images and 40 volumes with no idea which belong to the project you are working on and which are left over from one you finished a year ago.

The alternative is prune, which draws no distinction — or deleting by hand, which requires remembering what created each thing.

// 02 — manifest

What DockerSpace does

01

Groups containers, images, volumes and build cache by Compose project

02

Classifies every resource: active, shared, base image or orphaned

03

Per-project cleanup that keeps whatever other projects still use

04

Images in use are matched by their real identifier, not by name

05

Stopped containers count too, so their image is not deleted underneath them

06

The last scan is kept on disk — opening the app shows state immediately

07

Works with both Docker Desktop and Colima

// 03 — flow

How it works, step by step

Six steps, in the order they happen. Nothing is deleted before step 05.

01ScanRuns `docker ps -a`, `docker images -a`, `docker volume ls` and `docker system df -v` locally — nothing leaves for any server.
02GroupReads the `com.docker.compose.project` label off every container, image and volume and buckets them by the project that created them.
03ClassifyChecks every image by its real identifier, not by name, against both running and stopped containers. Every volume gets one of five states, not just "in use" or "orphan".
04ShowNothing is deleted until you pick a specific project and confirm.
05Clean per projectRemoves that project's own containers, images and volumes, keeping whatever else still uses them.
06Save stateThe last scan stays on disk — reopening the app shows what it found immediately, without waiting for a fresh scan.
// 04 — classification

Every resource is sorted before it gets deleted

Active
Shared
Orphaned
// 05 — under the hood

Technical detail

terminal

$ docker system prune has two settings: delete nothing, or delete everything Docker thinks is unused — including things you needed.

DockerSpace scans your local state and groups it by the Compose project that created it. For every resource it tells you whether it is active, shared between projects, a base image, or orphaned — and only then offers to delete it.

Images in use are matched by their real identifier rather than by name, so an image used by a stopped container is not lost. Per-project cleanup removes that project's own containers, images and volumes while keeping what is shared.

The last scan is kept on disk, so opening the app shows you the previous state immediately instead of making you wait.

// 06 — trust

Why you can trust it

Four things you can check in the app's source, each with the file it was read from.

Matched by real identifier, not by name

An image counts as "in use" only if its real identifier shows up among existing containers — running or stopped. A stopped container's image will not disappear from under it.

Core/Classify.swift — classifyImage(), usedImageIDs.contains(img.id)

Five states per volume, not two

A volume can be in use, orphaned with a project label, an anonymous orphan, "disputed" (the app's own scan and Docker's filter disagree — held back from any cleanup until that's resolved), or "unknown" when the inspect was incomplete.

Core/Classify.swift — enum VolumeUsage

The bug that forced a fix has a test of its own

The suite covers label parsing, image and volume classification — and includes a test written for the base image that had been offered for deletion, so that particular mistake cannot come back.

Tests/ — regresie dedicată pentru fe905f6

Update checks are opt-in

The app ships with Sparkle for updates, but automatic checking is off by default — it only reaches the network when you click "Check for Updates".

App/Updater.swift + Info.plist, SUEnableAutomaticChecks = false

// 07 — what it does not do yet

What it does not do yet

The old product page implied the items below too. In this build, none of them have a line of code.

A trial with one free teardownNot started

None of these are part of the app as it stands today.

// 08 — requirements

Requirements

System
macOS 14.0 or later
Package.swift — platforms: [.macOS(.v14)]
Docker
Docker Desktop or Colima
Sources/…/DockerClient.swift
Network
The scan is local; the only network call is the manual update check
App/Updater.swift, SUEnableAutomaticChecks = false
Licence
One payment, €24 — not enforced in code yet
grep over Sources/ — 0 licensing-code hits
// 09 — questions

Questions

No. The scan runs locally, through the Docker CLI on your machine. The only network call in the app is the manual update check, and it is off by default.

No. An image counts as "in use" if its real identifier shows up on a container — running or stopped. The container's or project's name plays no part.

It stays "unknown". The app never assumes a volume is orphaned just because it could not check — that is exactly what would turn a live database volume into a false orphan.

€24, one payment. The app does check a licence — the Ed25519 public key and the verifier are both in the binary you download from this page.

Both — the app reads straight from the `docker` CLI regardless of what is running behind it.

// 10 — technologies
Swift
SwiftUI
Docker
macOS
// 11 — purchase

DockerSpace

€24

+ VAT, calculated at checkout for your country

Activation

How to activate your licence

Download the app

Download version 0.7.4

2.7 MB

Open the app, go to Preferences → Licence and paste the key from the email.