All features

Another running app that wants the same port, hotkey or Claude events is named

Try the real interface

Explore this workspace.

Real Torbie UI · mock sessions
Tab bar
Loading Torbie…
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>/mcp ready to copy, or stop it starting here. The hotkey actions clear this app's toggle-window or 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 app field 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.
Source commits
BuildsAdded 2026-09-2416 files+3,146 / −3 lines