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.

curl -fsSL https://wyd.sh/install.sh | sh
View on GitHub
The wyd TUI: a narrow overview sidebar counting agents, MCP servers, browsers, dev servers, databases, workers, Docker, ports, projects, leftovers and sessions, next to a runtime tree grouping each agent with its MCP servers and dev servers by project, with a bottom summary of the current view's RAM and CPU.
Fig. 00 — wyd --demo, 5 agent sessions

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 Managed runs

Let the agent run tests — on your terms.

wyd run starts a command under a local supervisor: a deadline, a process group wyd owns, bounded logs, and a shared admission budget so several agents on one machine do not all start at once.

wyd run --timeout 120s -- npm test

01

Hard deadline, full cleanup

A hung test cannot hang you.

The run gets its own process group; on timeout, cancel or Ctrl-C wyd stops it gracefully, then for real — and reports what remains honestly.

02

One admission budget

Many agents, one queue.

Slots, per-project caps and a bounded queue with starvation bypass; memory reservations form a shared budget. On Linux, hard limits come from a delegated cgroup v2 subtree.

03

Read the aftermath

Durable, daemon-free reads.

wyd runs, wyd logs <id> --follow, wyd cancel <id> — and the same answers over stdio MCP with wyd mcp --allow-run.

06 WebMCP fig. 03

Your browser agent investigates with you.

wyd web is a loopback dashboard with a WebMCP tool surface. A browser agent can ask about leftovers, and the visible UI reflects its reasoning — while you keep control of every destructive action.

Try the live WebMCP demo
The wyd web dashboard: an Overview sidebar counting categories, leftovers, RAM and CPU, a Runtime tree grouping agents with their MCP servers and browsers, Ports, Projects, Docker and Sessions sections, and a details drawer showing a resource verdict, score and provenance.
Fig. 03 — wyd web, browser agent + human in one UI

01

Agent reasons, UI reflects it

The dashboard is the tool surface.

focus_resource and propose_cleanup visibly update the page you’re looking at — not a hidden backend.

02

Human stays in control

No destructive WebMCP tool.

Terminate re-validates PID + start time and asks inline; cleanup is confirmed by hand.

03

Structured tools, not UI guessing

Machine-readable by design.

The agent gets typed tools for sessions, leftovers, provenance and cleanup proposals instead of scraping text or guessing from screenshots.

07 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.

08 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.

09 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

10 Install

Find out what you’re still running.

Shell
curl -fsSL https://wyd.sh/install.sh | sh
Homebrew
brew install oxyplay/tap/wyd
Cargo
cargo install wyd
Run
wyd

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