ccdeck

See CPU, memory and heat while your agents run

Press S in ccdeck to open This machine beside the canvas: per-core CPU, load, memory, network and, where the computer has a sensor, temperature, each with up to a day of history, and the busiest processes at the foot.

Claude Code and Codex Checked against ccdeck 3.81.3 on

You will

Before you start

Steps

  1. Open the panel

    Press S, or click the This machine icon on the stripe on the right; do the same to close it. A browser’s first visit opens it, unless the window is too narrow for it beside Usage.

    The This machine panel beside the stripe on the right, where the This machine icon is pressed. The panel reads up 3d 5h · 16 cores; CPU 78% over sixteen core columns; load average 18.62, 14.10 and 9.87, with 1.2× more work queued than cores to run it; Physical 21.6 GB of 32.0 GB with 10.4 GB available; Swap 1.2 GB of 8.0 GB; Download 2.5 MB/s, Upload 184 KB/s, Claude API 38 ms; GPU 1 · NVIDIA GeForce RTX 4070, with Utilization 7%, Video memory 1.4 GB of 12.0 GB, Temperature 54 °C and Power 31.6 W; Thermal, CPU 71 °C and GPU 54 °C; and Busiest processes at the foot.
    Demo data A 16-core Linux computer while the demo sessions run their tests.

    The panel shows this computer only, never a paired deck’s. A line under its title says when something needs attention.

    More about the panel

    It docks beside the stripe on the right, and moves one place left while the Usage panel is open. Drag its header to put it anywhere else on the board; double-click the header to send it back. The line under its title names the CPU held back to cool it, physical memory at 90% or more, or the Claude API not answering.

    Too narrow means the board would keep less than 600 px beside both panels: a window under 1,556 px wide with the accounts panel or session list open, or 1,268 px without. On a phone it always waits behind Usage. A wider window opens it again.

    Its × closes it too; Esc clears the canvas selection instead. Once closed, it stays closed in this browser. While it is open, the page asks the deck for a reading every 3 seconds.

  2. Read the CPU and the memory

    The figure beside CPU is how busy the whole computer is. The strip under it has one column per logical core, so one core stuck at 100% shows there.

    Load average is the queue for the cores over one, five and fifteen minutes: a count of tasks, not a share of the CPU. Physical is the memory in use out of the total, and its bar turns amber from 90%.

    More about the CPU and the memory
    • Hover a core’s column to read it. CPU is never coloured as a warning: at 90% the computer is doing the work you asked for.
    • When the one-minute load is above the core count, a line under it says by how much, as in 1.2× more work queued than cores to run it.
    • In use means the total less what the system can hand over without swapping, not the operating system’s own “used” figure. Sizes count in 1024s.
    • Swap follows when the computer has any. On Windows the row is Commit, because that is what Windows reports. Windows publishes no load average, so there the panel shows none.
  3. Read the network

    Download and Upload count every network interface on the computer together. Claude API is how long a connection to Claude’s API takes to open. When the traffic goes through a VPN or Tailscale, Connection details names the route.

    Claude Code only. The deck measures the Claude API only on a computer where it finds Claude Code.

    More about what leaves the computer

    The deck reads every figure on this computer. It keeps the history in memory, writes none of it to disk, and serves the readings on 127.0.0.1, which only this computer can reach.

    To time the Claude API figure, while the panel is open, the deck looks up api.anthropic.com and opens a TCP connection to its port 443 about every 30 seconds. It closes the connection as soon as it opens and sends nothing over it. To name the route, the deck asks the computer’s routing table, and Tailscale when the route is a tunnel.

    On a Mac with Apple silicon whose sensors give nothing, it also downloads macmon from GitHub once (step 4).

    The deck’s usage reports, on unless the deck was started with AGENTS_DECK_NO_REPORTS=1, carry the number of cores, the total memory and the deck’s own peak memory as a range; none of the panel’s figures or history.

  4. Read the GPUs and the temperatures

    Each NVIDIA GPU gets a section above Thermal, with its utilization, video memory, temperature and power, read every 5 seconds. It keeps no history, so its heading opens no chart.

    Thermal is drawn only where the computer gives a reading, never as a zero. Each row’s bar ends where it turns red, with a notch where it turns amber.

    On Windows, a thermal zone is not the CPU. It measures whatever the firmware wired it to, on many laptops nothing, so the deck draws a zone only once its value has changed, and names it Thermal zone.

    More about where the degrees come from
    • Linux: /sys/class/hwmon, then /sys/class/thermal. On Intel, the kernel’s throttle count adds a Throttling row: the share of time the clock was held down.
    • Windows: an ACPI thermal zone, through a performance counter, then MSAcpi_ThermalZoneTemperature; then a hardware monitor you run yourself.
    • Mac with Intel: ioreg for the GPU, and pmset for a Throttling row, which says how much of the CPU’s speed is held back to cool it.
    • Mac with Apple silicon: macmon, which the deck downloads when the Mac’s own sensors give nothing.

    On Windows, that monitor is LibreHardwareMonitor with its web server on; the deck reads it and never installs it. The deck downloads macmon from GitHub once, checks it against the release’s checksum, and keeps it in ~/.agents-deck/tools/macmon. It downloads nothing if you already have macmon on your PATH or from Homebrew, or under AGENTS_DECK_NO_DOWNLOAD=1 or AGENTS_DECK_NO_INSTALL=1.

  5. Look back at a reading

    Each section’s heading ends in a ›. Click the heading, or the figures under it, to open its chart, such as Load history. Click a minute to keep its reading under the chart; click it again, or its ×, to let it go.

    The Load history chart, since 21:12 · 1h 29m. Queued work runs near 2 for over an hour, then jumps above the dashed line at 16, the core count, for the last quarter of an hour: 18.62 now, 18.62 peak. A click kept the minute 22:35 under the chart: 16.3, 1.0× the core count, with an × to let it go. Under it, Current 1-minute load: 1.2× more work queued than cores to run it. Open the full-size picture
    Demo data The jump is the demo sessions starting their test run.

    The deck keeps up to a day of each reading in memory; a restart empties it.

    More about the charts

    The deck keeps the history whether or not the panel is open: one point per minute, holding that minute’s highest value. The header says how far back the chart goes, as in since 21:12 · 1h 29m.

    Each line shows its value now and its peak; click the peak to keep the minute it peaked. Hover over a chart to read one minute. On Load history, a minute also says how many times the core count it was. Dashed lines mark where a reading turns amber or red: memory and swap at 90%, the queue at your core count, each temperature at its own. The CPU and network charts have none.

    While the one-minute load is above your core count, Load history ends with Current 1-minute load and the panel’s line saying by how much.

    Esc, the chart’s × or a click outside it closes it.

  6. Find the busiest processes

    At the foot of the panel, click Busiest processes. The dialog lists the 40 busiest processes by CPU and the 40 largest by memory, not every process. Click any heading but pid to sort by it.

    The Busiest processes dialog, 42 of 412 running, sorted by cpu: node running vitest at 312 with 2.1 GB, esbuild at 188, node running tsc at 97, rg at 64, claude at 41, postgres at 23, then claude, codex, gnome-shell and quieter system processes. On the left, the last hour and a half of All cores 78%, Busiest core 100%, Physical RAM 68%, Swap memory 15%, Queued work 18.62, CPU temp 71° and GPU temp 54°. Open the full-size picture
    Demo data The web-api session’s tests, bundler and type check are the three busiest.

    The cpu column counts per core, so 312 is a little over three cores. To end a process, use Activity Monitor, Task Manager or a terminal: the dialog cannot.

    More about the process list
    • The memory column is the resident size, which is what ps and Task Manager show. Activity Monitor on a Mac shows a different figure.
    • After each name comes as much of its command line as tells two node processes apart. Anything shaped like a secret is removed before it leaves the deck: a filter, not a guarantee.
    • The list starts sorted by cpu. Click a heading again to reverse it.
    • The dialog reads the list every 4 seconds while it is open, and never while it is shut.
    • On Windows and Linux, the cpu column is what each process used since the previous reading, so it shows — until the second one. On Windows there is no user or command line.

If something goes wrong

There is no Thermal section

The computer gave no temperature the deck can read without administrator rights; a virtual machine never does. On a Mac with Apple silicon, wait for the deck to download macmon. Otherwise install a sensor tool or driver, such as LibreHardwareMonitor with its web server on for Windows, then restart the deck so it asks again: npx ccdeck --stop, then npx ccdeck.

The panel says “reading this machine…” and nothing else

A deck that has just started has no reading yet, so wait a few seconds. If it stays, run npx ccdeck --status to see whether the deck is running.

Network says “Can’t reach Claude”

The connection to api.anthropic.com failed, or took longer than 4 seconds. Check your connection or VPN.

Busiest processes says “Could not read the process list — retrying”

No reading has come back yet, and the dialog asks again every 4 seconds. On Windows, the first PowerShell start can take a reading or two.

S does nothing

Letter keys are ignored while a text field has the focus or a dialog is open. Close the dialog, turn on Single-key shortcuts in Settings › Keyboard, or click the This machine icon.

Something else? See Troubleshoot ccdeck: status, logs, port and hooks.

Next

All guides Troubleshoot Temperature, per machine in the README