{
  "markdown": "# wyd\n\n**wyd?** — *what you doing?*\n\nSee what your coding agents left running.\n\nCoding agents spawn MCP servers, headless browsers, dev servers, workers, and databases.\n\n`ps` tells you what is running. `wyd` tells you **why** — which session started it, in which project, and whether it's leftover.\n\n```text\nOpenCode\n└─ chrome-devtools-mcp\n   └─ Chromium ×8       1.2 GB\n\nAgent exited 47m ago\n⚠ leftover\n```\n\nLocal, macOS and Linux. No account, no network, no telemetry.\n\n**https://wyd.sh**\n\n```bash\ncurl -fsSL https://wyd.sh/install.sh | sh\n# or\nbrew install oxyplay/tap/wyd\n# or\ncargo install wyd\nwyd\nwyd upgrade   # brew or cargo, matching the install\nwyd --demo    # deterministic synthetic dataset — screenshots/demos, no host scan\n```\n\nEach tagged release publishes the crate to crates.io and bumps\n`Formula/wyd.rb` in [oxyplay/homebrew-tap](https://github.com/oxyplay/homebrew-tap)\nautomatically, so `wyd upgrade` stays current with no manual step. `wyd upgrade`\nstill prints a hint if a formula bump is ever lagging.\n\nBinaries: [GitHub Releases](https://github.com/oxyplay/wyd/releases). From a clone: `cargo install --path .`\n\n\n![wyd TUI (wyd --demo) — 5 agent sessions, MCP servers, dev servers, databases and Docker](docs/screenshot.webp)\n\nOS daemons stay hidden. Desktop Chrome stays hidden. Agent-spawned Chromium does not.\n\n## Why wyd\n\n| | `ps` / Activity Monitor | Docker Desktop | wyd |\n|---|---|---|---|\n| Every process | yes | containers only | only dev runtime |\n| Who started it | no | compose labels | agent → MCP → browser |\n| Which project | no | sometimes | cwd / git root |\n| Leftover? | no | you guess | scored, with a reason |\n| Safe kill | you hope | stop/rm | PID + start time, `y` to confirm |\n| Volumes | — | easy to nuke | unused ≠ garbage; `D` required |\n\nBuilt for people who run coding agents all day and then ask *what did that session leave behind?*\n\n## Runtime ownership\n\nBeyond the live view, wyd tracks **coding-agent runtime sessions** — which\nresources a session spawned, keyed by `boot_id + pid + start_time`, so the\nprovenance survives process re-parenting and Wyd restarts. A deterministic\nresolver attributes resources to a session with an explainable score when\nexact ancestry is gone.\n\n- **Sessions** view in the TUI (top-level): agent · project · state · age · id, with a details panel.\n- **`wyd why <pid>`** — which session owns a process, and the evidence.\n- **`wyd --json sessions`** — recorded sessions as JSON.\n- **`wyd serve`** — a local daemon over a Unix socket (`wyd.sock`, mode 0600, single-instance). Keeps provenance fresh and answers read-only queries; vendors can register sessions with `session_start` / `session_end` (their id maps to a Wyd session as an alias).\n- **`wyd mcp`** — a Model Context Protocol server over stdio, so a coding agent can ask wyd for its sessions and who owns a PID.\n\n## MCP\n\n`wyd` also speaks the Model Context Protocol over stdio, so a coding agent\ncan ask the machine what it — or other agents — left running.\n\n```bash\nwyd mcp\n```\n\nStarts the local MCP server (read-only). It exposes two tools:\n`list_sessions` (recorded agent sessions) and `explain` (which session owns a\nprocess, by pid). No network, no account — the answers come from the local\nprovenance store.\n\nRegistered in the MCP Registry:\n\n- MCP Registry name: `mcp-name: io.github.oxyplay/wyd`\n\n## WebMCP\n\nTry the hosted demo: **https://demo.wyd.sh**\n\nwyd exposes six WebMCP tools so a browser agent can investigate leftovers in\nthe same UI the human sees: `list_sessions`, `get_session`, `list_leftovers`,\n`explain_process`, `focus_resource`, `propose_cleanup`. Nothing is killed from\na tool call — the human confirms cleanup.\n\n```bash\nwyd web         # local runtime (loopback)\nwyd web --demo  # synthetic dataset, no host data\n```\n\n### Quick test\n\nPaste this into a browser agent on the [demo](https://demo.wyd.sh) (or local `wyd web`):\n\n```text\nFind an ended OpenCode session, show me what it left running, explain Chromium PID 4102, and prepare a cleanup proposal. Do not execute cleanup.\n```\n\nWebMCP support was added during the OpenAI WebMCP Challenge on top of the\nexisting wyd CLI/TUI runtime inspector.\n\nSee [docs/webmcp.md](docs/webmcp.md).\n\n\n## Keys\n\n| Key | Action |\n|---|---|\n| `←` `→` / `h` `l` | overview / list |\n| `↑` `↓` / `j` `k` | move (scroll the details popup) |\n| `Tab` | focus overview / list |\n| `backspace` | go back (clear filter / project / section, never quits) |\n| `enter` | details popup; on a project, pin that project |\n| `space` | mark several |\n| `x` / `K` | terminate / force kill (`y` confirms) |\n| `s` | stop running Docker container (running ones sort first) |\n| `c` | Docker clean (`y`; volumes need `D`) |\n| `P` | prune unused anonymous volumes (confirm; named data kept) |\n| `o` | open the selected listener as HTTP (`o try HTTP` — an explicit assumption; listeners are shown as sockets, not URLs) |\n| `p` | projects |\n| `/` | filter |\n| `r` | refresh |\n| `?` | help |\n| `esc` | close popup, then clear filter / project, then quit |\n| `q` | quit |\n\nKill only signals the item’s own PIDs (re-checked by PID + start time). A named volume is never treated as garbage — only anonymous, unattached ones (`P`) are offered for pruning, with confirmation. The bottom hint line is context-aware: it shows the actions that apply to the currently selected row.\n\n## Scripts\n\nSame snapshot as the TUI — useful after an agent finishes a task:\n\n```bash\nwyd --json leftovers\nwyd --plain mcp\nwyd --json project myapp\nwyd --json sessions      # recorded agent sessions\nwyd why <pid>            # which session owns a process, and the evidence\nwyd serve                # local daemon: Unix-socket API + keeps provenance fresh\nwyd mcp                  # MCP server over stdio (for coding agents)\nwyd prune --dry-run      # list anonymous volumes that would be deleted\nwyd prune                # confirm, then delete them\n```\n\nFilters: `leftovers`, `mcp`, `agents`, `docker`, `project`, `sessions` (JSON only).\n\n```json\n{\n  \"runtime\": [{ \"type\": \"mcp\", \"name\": \"chrome-devtools-mcp\", \"pid\": 94148, \"status\": \"leftover\", \"reasons\": [\"owning agent missing\"] }],\n  \"docker\": [{ \"type\": \"dangling-image\", \"name\": \"abcdef012345\", \"status\": \"dangling\", \"size_bytes\": 1400000000 }]\n}\n```\n\nField names stay stable until a major version bump. Empty `ports` / `reasons` / `children` / `project` are omitted.\n\n## Config\n\n`~/.config/wyd/config.toml` — missing file is fine.\n\n```toml\n[leftovers]\nserver_age_hours = 8\n\n[persistent]\ncommands = [\"postgres\", \"redis-server\"]\n\n[projects]\nroots = [\"~/Work\"]\n\n[keys]\nquit = \"q\"\nkill = \"x\"\nforce_kill = \"K\"\nclean = \"c\"\nstop = \"s\"\nprune = \"P\"\nhelp = \"?\"\nrefresh = \"r\"\n\n[[signature]]\ncategory = \"agent\"\nnames = [\"myagent\"]\ncontains = [\"my-company-agent\"]\ndisplay = \"myagent\"\n```\n\n## License\n\nApache-2.0. Copyright 2026 Maksym Nevinchanyy.\n",
  "bytes": 6842,
  "sha": "508f9ed6621cd4f4983e9399230b45abbbeaca02b9273479625ff28a46d6e37e",
  "repo_slug": "oxyplay/wyd",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_oxyplay_wyd_30ce264d/readme"
}