Everything Vitals sees, in your terminal.

Type vitals and get the apps using your Mac, the ports and dev servers each project holds, your coding agents and what is left of your AI plans. A table you can read, JSON your scripts can parse, and nothing stopped without your yes.

Terminal — zsh
~ vitals status
● CPU 27% · Apple M4 Pro, 14 cores
● Memory 52.6 GB of 64 GB · pressure normal
● GPU 18%
● Disk 412 GB free of 1 TB
● Network down 1.2 MB/s · up 84 KB/s
● Battery 82% · 4h 10m left
● Heat CPU 52° · fans 1,800 rpm
~ vitals top memory 4
APP MEMORY CPU PROCS
Google Chrome 21.2 GB 48% 96
VS Code 8.2 GB 14% 31
Terminal 3.9 GB 3% 12
Figma 2.8 GB 6% 8
62 apps running · by memory
~ vitals ports
PORT PROCESS PROJECT OPEN TO
3000 node storefront-web network
4322 node docs-site this Mac
5432 postgres – this Mac
8080 python api this Mac
4 ports listening · 1 open to the network
~ vitals stop --idle
✓ Safe to quit node (48211) of docs-site · port 4322
Idle for 3 days. Stopping it frees 458 MB.
Continue? [y/N] y
Stopped node (48211). Port 4322 is free.
~ vitals agents
AGENT PROJECT STATUS MEMORY
Claude Code storefront-web working 412 MB
Codex api waiting for you 4m 287 MB
Gemini CLI docs-site working 198 MB
3 sessions · 6 processes started
~ vitals limits
TOOL LIMIT LEFT RESETS PACE
Claude 5-hour session 59% in 2h 10m on pace
Claude This week 72% Mon 9:00 on pace
Codex This week 38% Thu 14:00 runs out Wed
Cursor This month 81% Nov 3 on pace

The numbers are simulated: a web page cannot read your Mac, and should not.

01Install

It comes with the app, or with Homebrew.

The command is inside Vitals. Turn on Let AI Assistants Ask Vitals in Settings → Integrations and Vitals puts vitals on your PATH, with its manual page and tab completion. Or install the app and the command together with one Homebrew line.

  • Linked into /opt/homebrew/bin or /usr/local/bin
  • A manual page: man vitals
  • Tab completion for zsh, bash and fish
  • One Homebrew line installs the app and the command
~ brew install --cask foredotstudio/tap/vitals
==> Installing Cask vitals
==> Linking Binary 'vitals'
==> Linking Manpage 'vitals.1'
==> Linking Zsh Completion '_vitals'
🍺 vitals was successfully installed!
~ vitals version
vitals 1.8.0
Vitals is running and answering.
The app and the command, together Or from Settings → Integrations
02Reading

What the window shows, as a table.

vitals status gives a line per reading with a bar. vitals top lists the apps using the most memory, CPU, power, disk or network, right now or over a year. Ports, projects, containers, agents and AI limits each have a command, and every answer says when it was measured.

  • Apps with their helpers counted in, as in the window
  • Each reading in the app’s own color
  • Which ports are open to the network, and which to this Mac only
  • --watch refreshes the answer every two seconds
~ vitals status
● CPU 27%
● Memory 52.6 GB of 64 GB
● GPU 18%
● Disk 412 GB free
● Battery 82%
Measured just now
A line per reading In the app’s own colors
03Scripts

JSON for scripts, CSV for spreadsheets.

Add --json and any answer is JSON a script can read, the same answer the MCP server gives. --csv gives the main list for a spreadsheet. In a pipe nothing is clipped, so a script or an agent reads every word.

  • --json on every command
  • --csv for the main list
  • Plain text in a pipe, nothing clipped
  • Exit code 1 when Vitals didn’t answer
~ vitals top --json | jq '.apps[0]'
{
"name": "Google Chrome",
"memory_mb": 21709,
"cpu_percent": 48.2,
"processes_count": 96
}
~ vitals ports --csv > ports.csv
JSON a script can read CSV for a spreadsheet
04Stopping

It asks before it stops anything.

vitals can-quit says whether something is safe to quit, why, and what would stop with it. vitals quit and vitals stop show that verdict first and wait for your yes. What needs a person is refused without a terminal, even with --yes, so a script or an agent can't wave it through.

  • Safe, ask first or don’t, with the reason
  • stop --idle stops every dev server nobody is using
  • Apps quit the way ⌘Q quits them, so they can ask to save
  • Every quit is logged in Settings → Integrations
~ vitals stop --port 4322
✓ Safe to quit node (48211) of docs-site
Idle for 3 days. Stopping it frees 458 MB.
Continue? [y/N] y
Stopped node (48211).
~ vitals stop WindowServer
✗ Leave it alone WindowServer (615) of macOS
A verdict before anything stops Nothing stops without your yes
Reference

Install it, then every command

From the app

Settings → Integrations → Let AI Assistants Ask Vitals. The Terminal section there says where the command is.

$ vitals version
With Homebrew

The app and the command together, with the manual page and tab completion for zsh, bash and fish.

$ brew install --cask foredotstudio/tap/vitals
vitals help
Commands
CommandWhat it answers
vitals status [<part>…] CPU, memory, GPU, Neural Engine, disk, network, battery, power and heat, a line each; or only the parts you name
vitals top [<by>] [<period>] [N] The apps using the most memory, CPU, power, disk or network, now or over an hour, a day, a week, a month, a quarter, half a year or a year
vitals app <name> One app: its processes, ports, projects and containers, and what it used over a period
vitals find <name|pid|:port> A process by name, PID or port
vitals ports [<port>…] What is listening on which port, with its process, app and project, and whether it is open to this Mac or the network
vitals projects [<name>] Project folders with something running, their ports, memory and CPU, and dev servers nobody is using
vitals containers [<name>] Running containers in Docker, OrbStack, Podman or Colima, with their memory, CPU, network and ports
vitals agents [<name>] Coding agents running right now: each session’s project, whether it is working or waiting for you, and what it started
vitals limits [<tool>] What is left of each AI plan, when each limit resets, and whether it lasts at the rate you are going
vitals awake What is keeping the Mac awake
vitals battery The battery, and the apps drawing the most power
vitals history [<reading>…] [<period>] How hard the Mac was pushed over a period, and when
vitals whats-wrong What Vitals has noticed: apps holding the CPU or growing in memory, memory pressure, heat, and dev servers left behind
vitals can-quit [<app>] Whether something is safe to quit, with the reason and what would stop with it. By name, --pid, --port or --project
vitals quit <app> Quits an app after its verdict and your yes. --force ends it at once
vitals stop [<name>] Stops one of your processes the same way, by name, --pid or --port; --idle stops every idle dev server
vitals completions <shell> Tab completion for zsh, bash or fish
vitals mcp Speaks MCP on standard input and output, for an AI assistant
vitals help Every command and option
Options
OptionWhat it does
--json The answer as JSON, for a script
--csv The main list as CSV, for a spreadsheet
--watch Refreshes every two seconds until Control-C; --every N for another pace
--no-color Plain text; NO_COLOR in the environment does the same
Why it matters

Command line, before and after

macOS gives the terminal top and ps. Both list processes, about a thousand of them, with no idea which app or project each belongs to, and nothing about yesterday. Finding what holds port 3000 means lsof, a PID, and another command to find out what that PID is.

Coding agents work in the terminal too. When one wants to know what is slowing the Mac down or what is on a port, it runs the same commands and guesses from the list.

vitals asks the running Vitals app instead. You get apps with their helpers counted in, projects with their ports, agents with what they started, AI plans with what is left, and up to a year of history, as a table you can read or JSON a script can parse. The command measures nothing itself, so asking costs your Mac almost nothing.

How to use it

Where it is in Vitals

The tab, the menu bar item and the setting, in the order you would reach for them.

  1. 01

    Install it

    Turn on Let AI Assistants Ask Vitals in Settings → Integrations, and Vitals links the command onto your PATH. If the folder needs your password, an Install button asks once. With Homebrew, brew install --cask foredotstudio/tap/vitals installs the app and the command together.

  2. 02

    Ask

    vitals status for the whole Mac, vitals top cpu day for what used the most CPU today, vitals ports for what is listening, vitals agents for your coding agents, vitals limits for your AI plans. vitals help lists every command, and man vitals explains each one.

  3. 03

    Script it

    Add --json to any command and pipe it to jq, or --csv for a spreadsheet. --watch refreshes the answer every two seconds until you press Control-C.

  4. 04

    Stop what you don’t need

    vitals can-quit --port 3000 says what holds the port and whether it is safe to stop. vitals stop --port 3000 stops it after your yes, and vitals stop --idle stops every dev server nobody is using.

Compared

Command line: Activity Monitor and Vitals

The whole comparison is row by row. These are the rows about command line.

Activity Monitor Vitals
In Terminal
Activity Monitortop and ps, a process per row
Vitalsvitals, an app per row, helpers counted in
Ports
Activity Monitorlsof, then look up the PID
Vitalsvitals ports, with the project and who can reach it
Coding agents and AI plans
Activity MonitorNothing
Vitalsvitals agents and vitals limits
The past
Activity MonitorNothing
Vitalsvitals history and vitals top, for up to a year
For scripts
Activity MonitorText to parse
VitalsJSON and CSV from every command
Stopping something
Activity Monitorkill, no questions asked
VitalsA verdict first, then your yes

The words behind it

What the numbers mean, from the Activity Monitor glossary.

Questions

The ones people ask about command line before they buy.

Does Vitals have to be running?

Yes. The command asks the running app, which already keeps the readings and the history, so asking costs your Mac almost nothing. If Vitals isn't running, or Let AI Assistants Ask Vitals is off, the command says so and what to do.

How do I install it with Homebrew?

Run brew install --cask foredotstudio/tap/vitals. It installs the app and links the vitals command, its manual page and tab completion for zsh, bash and fish. Vitals updates itself, so brew upgrade leaves it alone.

I already have Vitals. How do I get the command?

Turn on Let AI Assistants Ask Vitals in Settings → Integrations. Vitals links vitals onto your PATH, in /opt/homebrew/bin or /usr/local/bin, and the Terminal section there says where. If the folder needs your password, an Install button asks for it once.

Can an AI agent use it?

Yes. An agent with a shell can run vitals and read the answer, and in a pipe nothing is cut short. It cannot stop anything that needs a person: without a terminal to ask on, those are refused, even with --yes.

How is it different from the MCP server?

It is the same connection to the app, with the same answers. The command adds quit and stop, which ask you on the terminal. An assistant speaking MCP asks through Vitals' own window instead, and vitals mcp is that server.

Does it work with the free trial?

Yes. Everything in Vitals works during the trial, the command included.

Which shells get tab completion?

zsh, bash and fish, with app names completed from what is running. Vitals installs zsh's and fish's with the command. For bash, add eval "$(vitals completions bash)" to your .bashrc; Homebrew installs all three.

Read on

Guides that use this, and how Vitals compares with the apps people buy for it.

More of Vitals

All features

Lifetime for $15 while the launch price lasts

50 left at this price. Then $39, or $9 for a year of updates. One payment, 14-day refund.

Get Vitals for $15