Find and manage local dev servers.
One row per job: ports, project, origin, and age. Jump to its origin, open its URL, or stop it.
Install with Homebrew
brew install filipgutica/tap/devps Picker: fzf 0.66+ and terminal input; otherwise, a plain table. Install Homebrew if needed.
- Runs on
- macOS only
- Written in
- TypeScript
- License
- MIT
- Source
- filipgutica/devps
devps 0.1.1 demo output; controls updated for browse mode.
Pick
3/3 (0) ───────────────────────────────────────────────────────────────────────────────────────────────────────────── / search · q / esc quit · enter jump · ctrl-o browser · ctrl-x stop · tab multi-select · ctrl-r refresh ctrl-↑/↓ details PORTS PROJECT COMMAND ORIGIN AGE PID ▌ :4273 :8188 demo-shop [feature-cart] apps/web pnpm dev Claude Code 3f9a1c2e · Warp 12m 50339 ▌ :5173 demo-docs vite Claude Code 7b20d4e1 · Warp 7m 56319 ▌ :6006 demo-shop apps/storybook storybook dev ⚠ orphaned, was Codex thread 01a07b5e 2m 76954 ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ :4273 :8188 demo-shop [feature-cart] apps/web 12m old 1/23││ │ origin Claude Code 3f9a1c2e · Warp ││ │ jump Warp tab (exact) ││ │ cwd ~/demo-projects/worktrees/feature-cart/apps/web ││ │ cmd node ../../node_modules/.bin/pnpm dev │ │ │ │ launched by (nearest first) │ │ 50336 bash │ │ 91626 claude ttys012 │ │ 15529 zsh ttys012 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
devpsOne row per job. The preview shows the origin, the jump target, the working directory, and the chain of processes that launched it.
Orphaned
3/3 (0) ───────────────────────────────────────────────────────────────────────────────────────────────────────────── / search · q / esc quit · enter jump · ctrl-o browser · ctrl-x stop · tab multi-select · ctrl-r refresh ctrl-↑/↓ details PORTS PROJECT COMMAND ORIGIN AGE PID ▌ :4273 :8188 demo-shop [feature-cart] apps/web pnpm dev Claude Code 3f9a1c2e · Warp 12m 50339 ▌ :5173 demo-docs vite Claude Code 7b20d4e1 · Warp 7m 56319 ▌ :6006 demo-shop apps/storybook storybook dev ⚠ orphaned, was Codex thread 01a07b5e 2m 76954 ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ :6006 demo-shop apps/storybook 2m old 1/15││ │ origin orphaned, was Codex thread 01a07b5e ││ │ jump focus Codex app (thread may be gone) (+ copies `codex resume 01a07b5e-4c92-47d3-b0f8-5e1a9c7d3268`) ││ │ cwd ~/demo-projects/demo-shop/apps/storybook ││ │ cmd node ../../node_modules/.bin/storybook dev ││ │ ││ │ launched by (nearest first) │ │ 1 launchd │ │ │ │ listeners │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Down, Down A server whose launcher is gone is marked ⚠ orphaned. devps still knows which agent thread started it, and jumping copies the resume command.
List
PORTS PROJECT COMMAND ORIGIN AGE PID :4273 :8188 demo-shop [feature-cart] apps/web pnpm dev Claude Code 3f9a1c2e · Warp 12m 50339 :5173 demo-docs vite Claude Code 7b20d4e1 · Warp 7m 56319 :6006 demo-shop apps/storybook storybook dev ⚠ orphaned, was Codex thread 01a07b5e 2m 76954
devps ls The same rows as a plain table. devps prints this when a supported fzf is unavailable or standard input is not a terminal.
Stop
Stop :5173 demo-docs 1 processes: 56319 node Proceed? [y/N]
devps kill 5173 Shows the processes it will stop, then asks. -y skips the question.
Commands
Matches port first, then root or listener PID.
devpsInteractive picker.
devps lsPlain table.
devps jump 5173Focus the originating terminal, editor, or agent app.
devps open 5173Open
http://localhost:5173.devps kill 5173Stop the whole job after confirmation;
-yskips it.devps --allInclude all TCP listeners, beyond dev runtimes.
Keys in the picker
Starts in browse mode. While searching, q and / are text.
- /
Edit the filter.
- q
Quit from browse mode.
- Enter
Search: keep the filter in the header and return to browsing. Browse: jump to origin.
- Esc
Search: clear the filter and return to browsing. Browse: quit.
- Ctrl+O
Open its URL.
- Ctrl+X
Stop selected jobs after confirmation.
- Tab
Select multiple jobs.
- Ctrl+R
Refresh the list.
- Ctrl+↑ / Ctrl+↓
Scroll details. Ctrl shortcuts and multi-selection work in both modes.
- Ctrl+C
Quit from either mode.
Where jump lands
Exact targets depend on available origin information.
| Origin | Jump target |
|---|---|
| Warp, iTerm2, Terminal, tmux | Tab or pane when session information matches. |
| VS Code | Folder's window; cannot select a terminal tab. |
| Codex app, T3 Code Workbench, Claude app | App; copies codex resume <id> or claude --resume <id> for known sessions. |
Good to know
Stopping: SIGTERM to the root and children; SIGKILL to survivors after three seconds. GUI apps, PID 1, and devps's terminal or agent are protected.
Orphan origins: only allowlisted hints such as WARP_FOCUS_URL and CODEX_THREAD_ID are read. Other environment values are never printed, stored, or passed on.
Compiled servers outside your home directory may be hidden.--all includes every TCP listener.
macOS only: uses ps, lsof, open, osascript, and pbcopy. Some origins allow only app focus, not an exact tab or conversation.