# Performance

How much CPU, memory and disk Kuvo uses, how it compares with Docker Desktop, and how we measured.

Kuvo is meant to be something you leave running. These are its numbers on a real machine, next to Docker Desktop's on the same machine.

## Results

Three idle containers (nginx, redis and postgres) on Apple silicon, Kuvo 0.1.0 and Docker Desktop 4.85.0, both running Docker Engine 29.

| | Kuvo | Docker Desktop |
| --- | --- | --- |
| App size, installed | 4.3 MB | 2.1 GB |
| Launch to engine ready | 2.9 to 3.2 s | 4.2 to 4.8 s |
| Launch to all three containers running | 3.2 to 3.6 s | 4.9 s |
| Idle CPU, window open | 5.2% | 8.9% |
| Idle CPU, window closed | 4.3% | not measured |
| Memory, app and VM | 0.87 GB | 1.5 GB |
| Processes | 2 | 12 |

CPU percentages are of one core, summed across every process each app runs, including its VM.

## What the numbers mean

**Most idle CPU is the VM.** Kuvo's VM used about 3.2% and Docker Desktop's about 2.9%. A Linux kernel with Docker and three containers does a little work even when nothing is happening, and that's about the same either way.

**The difference is the app.** With the window open, Kuvo's own process used about 2.3%. Docker Desktop's interface, built on Electron, used about 4.4%, and its backend services another 1.3%.

**Kuvo gets quieter in the background.** With the window closed, Kuvo's own process drops to about 1%. We didn't measure Docker Desktop with its window closed, so we don't compare that case.

**Size is not close.** Kuvo is a 2.9 MB download and 4.3 MB installed: 2.5 MB for the program and most of the rest for its icon. On first launch it downloads about 40 MB of Alpine Linux and then installs Docker into its VM, so it isn't "Docker in 3 MB": it's a 3 MB app that sets up Docker for you.

**The VMs were sized differently.** Docker Desktop's VM had 8 CPUs and Kuvo's had 4. Both had 8 GB of memory.

## How we measured

All measurements were on one Mac, one after the other, with only one of the two apps running at a time. Container images were already downloaded for both.

- **Startup.** Time from opening the app until `docker version` got an answer from the engine, then until `docker compose up -d` returned. Two runs each.
- **CPU.** The change in total CPU time over 60 seconds for every process belonging to the app, including the virtual machine process, measured with `ps` after the containers had been idle for at least 20 seconds.
- **Memory.** The physical footprint of every one of those processes, from macOS's `footprint` tool. This counts memory actually in use, including the VM's.
- **Size.** `du` of the app bundle, and the size of the zipped app for the download.

These numbers are from one machine on one afternoon. Your Mac, your containers and the versions you run will give different results. A full day's battery test is still to come.

## What Kuvo does to stay light

- **A small VM.** Alpine Linux and the stock Docker packages, nothing else running in the guest.
- **A native app.** SwiftUI and AppKit, no browser engine.
- **Animation off the main thread.** Status dots and graphs are animated by Core Animation, which runs them in the system's render server instead of redrawing the window on every frame.
- **Stats only when visible.** Live CPU, memory and network stats stop streaming when the window is closed, minimized or covered by other windows.
- **Timers that wait.** Text like "Running for 3 minutes" only refreshes when it would actually change.