← All articles

Build Log / 2026.08.12 / 7 min read

How Do You Watch Memory Use on a 16GB Mac? I Built a Desktop Memory HUD

Kenton Memory HUD keeps the memory pressure of a 16GB Mac, plus its main App and CLI usage, pinned on the desktop, so you notice a resource squeeze earlier while you work. This article also explains the measurement basis, on-machine evidence and capability limits.

How Do You Watch Memory Use on a 16GB Mac? I Built a Desktop Memory HUD — Kenton Blog

A pinned memory dashboard for a 16GB Mac

Day to day I have the browser, ChatGPT, Codex, an IDE and a few CLI tools open at once. For a 16GB Mac, the real trouble often isn't "how much memory is used," but how hard it is to see at a glance: which App family, which Helper, or which terminal task is holding memory.

Activity Monitor can show it, of course, but every time you have to open it, sort, and figure out from a row of Renderers, Services and Helpers who they belong to. What I wanted was a dashboard pinned to the desktop: while working, glance up and see the memory pressure, and know where the main usage comes from. I didn't want a post-mortem — I wanted a clue to the resource squeeze while the work is still going.

So I built Kenton Memory HUD.

It doesn't clean memory, it won't turn 16GB into 32GB, and it doesn't promise to make the Mac faster on its own. What it does is restrained: keep the readable resource usage on the current machine continuously on the desktop.

The tool is mainly designed around heavy multitasking on a 16GB Apple Silicon Mac, and also works on Macs of other memory sizes that meet the system requirements. The source repo is currently private, and no source code or pre-built app download is provided.

What this Skill solves is "invisible while you work"

Here, the Skill I mean is the practical ability Memory HUD provides: keeping a 16GB Mac's memory pressure visible while you work. Engineering-wise, it's a native macOS app; in real use, it's like a pinned layer of memory situational awareness, keeping a state usually hidden inside Activity Monitor in your peripheral vision.

When memory pressure goes from normal to high or critical, or an App family or CLI task sits at the top of the list for a long time, you can decide for yourself whether to save your work, pause a task or close a heavy app first. It won't decide for you, but it gives you one more chance to see a clue before the problem hits.

It doesn't predict crashes, doesn't monitor the network, and certainly can't guarantee preventing app exits, task interruptions or system freezes. What it truly provides is an observation window: when a problem is in fact memory-related, you don't have to wait until the computer has already stopped responding to remember to open Activity Monitor.

What it actually shows

The HUD has three parts:

  • Current memory pressure, plus estimated used, physical memory, compressed memory, file cache and swap.
  • App Top 5, showing the summed footprint and process count of multiple processes under the same outermost .app.
  • CLI Top 3, showing command-line programs that belong to the current user, have a controlling terminal, aren't shells and aren't inside a .app, merging multiple PIDs of the same path into one line.

The full view can be dragged, pinned, collapsed, or switched to always-on-top. When collapsed, it keeps only the memory pressure and the used summary. When hidden, locked or asleep, sampling pauses.

Why you can't just watch one main process

Chrome, ChatGPT, Codex and many Electron apps split into several processes. Watching only the main PID misses the Renderer, Service and Helper; but summing all PIDs on the machine directly mixes in shared pages and unrelated background processes.

Memory HUD chose an explainable middle path: group by the outermost .app in the executable path, sum the readable PID footprints in the same bundle, and clearly show "summed process footprint" and the process count.

One App
├── main process
├── Renderer
├── Service
└── Helper
        ↓
one row: App · 4 processes · summed footprint

The number here isn't "exclusive memory." A shared page may appear in several processes' footprints, and it isn't Apple's private coalition measure, for which there's no published stable contract.

Why CLI isn't counted into Terminal

Terminal's own footprint and the Codex, Claude CLI, Node or Python task running inside Terminal aren't the same thing.

The CLI list only includes processes that meet all of:

  • Belong to the current logged-in user.
  • Have a controlling terminal.
  • An executable path not inside any .app.
  • Aren't a shell itself, like zsh or bash.
  • Merged for display when the same path has multiple PIDs.

That means background tasks with no TTY, other users' system processes, and some external-interpreter helpers won't enter the list. So the page says "summed CLI same-path processes," not "system-wide CLI ranking."

Why the main card says "estimated used"

The process ranking uses proc_pid_rusage(...).ri_phys_footprint shipped with the macOS SDK. The system main card is built from Mach VM page counts into these three:

app memory estimate = max(internal - purgeable, 0) × pageSize
estimated used = min(physical memory, app memory estimate + wired + compressed)
file cache = min(physical memory, external × pageSize)

In adjacent samples, the app-memory estimate and compressed memory can line up with Activity Monitor's corresponding values; "estimated used" can still differ by hundreds of MB, because Apple's full classification also includes page categories the tool hasn't reproduced. So the interface keeps the word "estimated," rather than pretending to be byte-for-byte identical.

How much memory it uses itself

On an Apple M4, 16GB, macOS 26.2 Mac mini, v0.3.0 Build 5 measured after about 80 seconds of stable running:

  • Main HUD: about 26.74 MB
  • Recovery helper: about 1.05 MB
  • Deduplicated total: about 27.69 MB

This is the result for a specific machine, version and sampling moment — not a constant promise across all Macs. Both instant ps CPU samples were 0.0% at the time, but that doesn't mean CPU is always zero either. The core reader, at the default two-second refresh, works out to about 0.25% of one core; the full UI's actual usage still varies with the environment.

Why it comes back after an abnormal exit

Recovery is off by default. Only after the user explicitly turns on "auto-recover on login and abnormal exit" does the app register a low-footprint user LaunchAgent.

The real-device verification done so far includes:

  • The recovery helper can recover after it exits itself.
  • The HUD, after receiving SIGTERM, can be reopened by the helper.
  • On a normal quit from the menu, it first deregisters the recovery service and deletes the plist, with no revival within three seconds.

Not-yet-verified scope includes a real WindowServer rebuild, re-login, multi-display rearrangement and Stage Manager being on. One SIGTERM test can't replace these scenarios, so they stay unverified.

Current test evidence

The current source has 47 Swift Testing cases: by default 46 pass and 1 real-process integration test is explicitly skipped; with live integration on, it's 47/47. MemoryHUDCore's line-coverage threshold is fixed at at least 80%; this round's default result is 87.81%, and the live environment, by real-process branches, is 94.85% to 96.23%.

The coverage here only represents MemoryHUDCore; it doesn't claim the AppKit main program, the LaunchAgent boundary and the C helper have the same coverage across all production code. Those are separately verified by behavior tests, a compile gate and real-device read-back.

Who it suits, and who it doesn't

It suits:

  • People on a 16GB Mac who often have the browser, AI apps, an IDE and CLI open at once.
  • Developers who want to keep watching App-family and terminal-task footprints.
  • People who accept transparent measurement over a number that looks absolutely precise.
  • People who prefer a native, offline tool that needs no admin rights.

It doesn't suit:

  • People who need history curves, alerts, cloud sync or team monitoring.
  • People who need to see all root and system processes.
  • People who need a byte-for-byte reproduction of Activity Monitor's private classification.
  • People who need a signed, notarized, ready-to-install app.

The current release boundary

Kenton Memory HUD's source repo is currently private. This article only makes the product positioning, measurement basis, on-machine test evidence and known limits public.

Currently no public download of source code, a pre-built .app, a DMG or any other installer is provided.

SOURCE AND VERIFICATION

Sources and limits

Based on the on-machine source, tests and real-device read-back of Kenton Memory HUD v0.3.0 Build 5; the source repo is currently private, and this article provides no download link.

Verification: v0.3.0 Build 5 has passed on-machine functionality, test, footprint and SIGTERM-recovery verification; the source repo is currently private.

ONE PRACTICAL NEXT STEP

The current release boundary

This article only makes the build log, measurement basis and verification boundary public. The source repo is currently private, and no pre-built installer is provided. If you want to compare notes on 16GB Mac memory monitoring, send over how your own setup behaves.

Message me
Read more articles ↗

KENTON / BUY & CONSULT

Subscriptions & software.

ChatGPT subscriptions · Zhike software
Buy directly, or talk it through first.

Opens the relevant platform, where you can view products and order or ask questions.