Claude Status in Window Title
Shows what Claude Code is doing in this workspace, directly in the VS Code window title — so you can see from the Dock, window switcher, or a background window whether Claude is still working, done, or waiting for your input.
Adds a ${claudeStatus} variable for the window.title setting (plus an optional status bar item).
How it works
Claude Code ──claude-vscode-status plugin (hooks)──▶ ~/.claude/vscode-claude-status/<session_id>.json
│
extension watches the directory,
matches sessions to this window by cwd
│
▼
setContext ─▶ ${claudeStatus} in window.title + status bar
The Claude Code side is handled by the companion claude-vscode-status plugin: its hooks (SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Notification, Stop, SessionEnd) run a dependency-free POSIX shell script that writes one status file per Claude session; SessionEnd deletes the file. This extension watches that directory, picks the sessions whose cwd overlaps this window's workspace folders, and exposes the aggregated status through a window title variable (VS Code 1.93+).
Statuses: working (processing a prompt / running tools), attention (waiting for permission or input), idle (session open, turn finished).
Setup
Install this extension (VS Code Marketplace, or grab the .vsix from Releases and use “Extensions: Install from VSIX…”).
Install the Claude Code plugin. Inside a claude session:
/plugin marketplace add trollfred/claude-vscode-status
/plugin install claude-vscode-status@trollfred
Installing at user scope enables it for all projects; nothing is written into any repo.
Add the variable to your title in your user settings:
"window.title": "${dirty}${activeEditorShort}${separator}${rootName}${separator}${claudeStatus}"
Start a new Claude Code session in a terminal inside the workspace — hooks are read at session start, so already-running sessions won't report.
Settings
| Setting |
Default |
Description |
claudeStatus.format |
long |
emoji → “✳”, short → “✳ working”, long → “✳ Claude working” |
claudeStatus.emoji.working / .attention / .idle |
✳ / ⚠︎ / ✓ |
Emoji per status |
claudeStatus.text.working / .attention / .idle |
working / needs you / idle |
Status word per status (short/long formats) |
claudeStatus.showStatusBarItem |
false |
Also show the status in the status bar |
claudeStatus.staleHours |
12 |
Delete session files older than this (crash cleanup) |
claudeStatus.statusDir |
~/.claude/vscode-claude-status |
Where the plugin's hooks write status files |
Notes & limitations
- Requires VS Code 1.93+ for the
${claudeStatus} title variable (registerWindowTitleVariable). On older versions/forks without it, only the status bar item works.
- If several matching sessions exist, the highest-priority status wins (
attention > working > idle), with a count suffix like (2) when several sessions share it. Hover the status bar item to see each session.
- A session's
cwd matches a window if either contains the other, so a Claude session at a monorepo root lights up windows opened on its packages.
- If Claude crashes without
SessionEnd, its file lingers until the staleHours sweep; the last written status is usually idle (from Stop), so this is rarely noticeable.
- When
${claudeStatus} is empty (no sessions), any separator you placed before it stays in the title. If that bothers you, bake separators into the label settings instead.
Development
npm install, then F5 to launch an Extension Development Host (the “Run Extension (test project)” launch config opens a sandbox folder).
- For a quick plugin test without installing it:
claude --plugin-dir /path/to/claude-vscode-status.
npm run package builds the .vsix; pushing a v* tag builds a GitHub Release with the .vsix attached, and publishes to the Marketplace when the VSCE_PAT repo secret is set (Azure DevOps PAT, scope Marketplace → Manage).
- Local publish alternative:
npx vsce publish -p <PAT>.