Another running app that wants the same port, hotkey or Claude events is named
Explore this workspace.
Technical background
Running Torbie beside Tabby made three collisions silent: the MCP plugin's port, the global hotkey, and the consume-and-delete Claude hook spool. Torbie now checks when its window gains focus, names the other app and its PID, says what goes wrong in one sentence, and offers what this app can do: move its own MCP server to a free port and show the Claude Code command to match, stop starting it, or clear its own hotkey. It never touches the other app.
The problem
Torbie 1.0.0 was installed beside a Tabby running six processes with live Claude Code sessions. It copied Tabby's profile, so both carried the same plugins and the same hotkey, and three resources collided with nothing said anywhere: tabby-mcp-server reports EADDRINUSE only to its own log, the app ignores whether globalShortcut.register succeeded, and the Claude hook spool is consume-and-delete, so two readers split the events between them.
How it works
When the window gains focus, at most every 30 seconds, BuildConflictsService groups running Tabby and Torbie processes by executable, finds each other app's config (beside a portable build, under %APPDATA% for an installed one, unknown for an electron.exe source build) and compares. The MCP port comes from netstat -ano, attributed by PID; the hotkey from globalShortcut.isRegistered, for each accelerator converted the way registerGlobalHotkey converts it; Claude events from tabby-claude-status's heartbeat files. Each new conflict raises one toast naming the other app, and Settings → Builds says what goes wrong and what this app can do about it.
netstat -ano on the machine this was written on: Tabby's MCP server, once per address family
TCP 0.0.0.0:3001 0.0.0.0:0 LISTENING 5716 TCP [::]:3001 [::]:0 LISTENING 5716
Details
- The MCP actions move this app's server to the first free port from 3002, with
claude mcp add --transport http torbie-mcp http://localhost:<port>/mcpready to copy, or stop it starting here. The hotkey actions clear this app'stoggle-windowor open Settings → Hotkeys. Nothing is ever done to the other app. - Claude Code entries are read from
$CLAUDE_CONFIG_DIR/.claude.json, else~/.claude.json, and matched on loopback and on this machine's own addresses, since an entry naming the WSL adapter address reaches the same server. Query strings and headers are never shown. - A heartbeat with no
appfield comes from an older tabby-claude-status; it is attributed through the PID in its id and counted as reading events. builds.detectConflicts(on) turns it off, from Builds → Options.
What this does not claim
- The MCP port is checked on Windows only, because the socket table comes from
netstat. The hotkey and Claude checks run elsewhere but have only been exercised on Windows. - The hotkey holder is a likely one: Windows does not say which application registered a chord, so a running app whose settings bind it is named.
- A Claude Code config inside a WSL distro is not read, so entries there are not listed; the count of connections to the port still reflects those clients.