Your coding agent is gone.
Its processes aren’t.

ps tells you what is running.
wyd tells you why.

Agents, MCP servers, headless browsers, dev servers, workers, databases and Docker leftovers — grouped by the session and project that started them.

brew install oxyplay/tap/wyd
View on GitHub
The wyd TUI: an overview panel counting agents, MCP servers, browsers, dev servers, databases, workers, Docker resources, ports, projects, leftovers and sessions, next to a runtime tree grouping each agent with its MCP servers, dev servers and databases by project.
Fig. 00 — wyd on a real machine

01 The problem fig. 01

Agents are good at starting things.

Every task spins up servers, browsers and workers. When the agent exits, some of them stay behind — and the OS won’t tell you which, or whose.

$ ps auxnodenodenodechromiumchromiumchromiumpythonredis-servernodenode
$ wydopencode├─ chrome-devtools-mcp│  └─ Chromium ×8      1.2 GB└─ vite :5173project: ~/Work/myapp

The OS sees processes.
wyd sees a development session.

02 Ownership

Runtime ownership, not PID soup.

wyd observes coding-agent sessions and records the runtime resources they create — keyed by boot, PID and start time, so the record survives re-parenting and restarts.

When ancestry disappears, provenance doesn’t have to.
A deterministic resolver attributes resources to a recorded session — with an explainable score.

03 Leftovers fig. 02

The session ended. This didn’t.

Chromium ×8 1.2 GB
origin: opencode session ended 47m ago reason: headless browser detached
vite :5173
project: acme-dashboard running 11h reason: long-running dev server
celery worker
project: backend owner session ended reason: owning agent missing
wyd --json leftovers

04 Explain

Ask why a process exists.

wyd keeps local runtime provenance, so it can explain which recorded session owned a process — and show the evidence behind the attribution.

$wyd why 94148chrome-devtools-mcp pid 94148origin session: opencode 8f3a2c1d9e4b07a6project:        ~/Work/acme-dashboardsession:        endedattribution:    Owned (resolver v1)

05 Coverage

What wyd understands.

A signature registry over name, argv and executable — precise matches, not substring guesses. OS daemons stay hidden. Desktop Chrome stays hidden. Agent-spawned Chromium does not.

Agents
claude · codex · opencode · omp · gemini · aider · amp · crush · goose · qwen code · droid · kiro · antigravity · pi · cursor
MCP servers
chrome-devtools-mcp · playwright-mcp · filesystem · context7 · queryknight · any *-mcp
Browsers
headless Chromium · chrome helpers · chromedriver · Firefox
Dev servers
vite · next · nuxt · astro · svelte-kit · remix · nest · rails · phoenix · django · flask · uvicorn · gunicorn · webpack · parcel · rsbuild · rspack · puma · php
Workers
celery · sidekiq · horizon · laravel queue · nodemon · cargo-watch · watchexec · air · tsc --watch · tailwindcss --watch
Databases
postgres · mysql · mariadb · redis · mongodb · elasticsearch · opensearch · clickhouse · cockroachdb · cassandra · memcached · neo4j · qdrant · weaviate · milvus · meilisearch · typesense · influxdb · sql server
Language servers
rust-analyzer · gopls · typescript · copilot · pyright · clangd · lua · intelephense · vue · svelte · tailwind · eslint · yaml · bash · docker · jdtls · ruby · nix · biome
Docker
containers · dangling images · volumes · build cache

Yours isn’t listed? Add a [[signature]] rule in ~/.config/wyd/config.toml.

06 Safe by design

Useful enough to kill things.
Careful enough not to guess.

01

Process identity

PID alone is not enough.

wyd re-checks PID and process start time before signaling, and asks y first. PID reuse can’t turn a kill into a lottery.

02

Docker data

Unused doesn’t mean garbage.

Named volumes are never treated as disposable. Pruning covers only anonymous, unattached volumes — previewed with wyd prune --dry-run, confirmed with y.

03

Local

Your runtime stays on your machine.

No account. No telemetry. No cloud. Provenance lives in a local SQLite database — readable by the TUI, the CLI, or wyd serve.

07 Provenance

See the session, not just the process.

Each observed agent invocation is a session — agent, project, state, age, id — recorded locally, kept across restarts. wyd mcp serves the same answers to coding agents over stdio; wyd serve keeps them fresh as a local daemon.

agentprojectstateage
opencode~/Work/wydactive18m
claude~/Work/apiended1h
codex~/Work/frontendended3h
wyd --json sessions
$ wyd mcpagent  which session owns pid 94148?wyd    opencode · ~/Work/acme-dashboard       session ended 47m ago

08 Install

Find out what you’re still running.

Homebrew
brew install oxyplay/tap/wyd
Cargo
cargo install wyd
Run
wyd

macOS · Linux · also as binaries on GitHub Releases · upgrade with wyd upgrade