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
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.
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.
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.
brew install oxyplay/tap/wyd
cargo install wyd
wyd