FlipSide
One status bar item that shows Claude Code usage by default and toggles to
Codex usage on click. Both assistants share the same status bar slot, so the
item never moves when you switch.
$(sparkle) Claude 79% · 8% <-- click --> $(rocket) Codex 0% · 36%
The two numbers are the session and weekly windows, as used %.
Hover for a full breakdown: per-window bars, reset countdowns, plan type, and
the weekly usage split.
Automatic failover
When your preferred assistant runs out of tokens, FlipSide switches to the
other one on its own and tells you why:
Claude is out of tokens (Session (5h) limit reached). Switched to Codex.
Resets in 1h. Transferred your last prompt.
When the preferred assistant resets, FlipSide asks whether you want to
change back. Choosing Yes switches the route and opens that assistant's VS
Code extension; choosing Stay keeps the current assistant. This works in
both directions.
When both are out you get:
You currently have no tokens. Both Claude and Codex are out.
Claude resets in 1h; Codex resets in 3d 4h.
That popup is rate-limited to once every 10 minutes so a poll loop cannot spam
you, but asking explicitly always shows it.
An assistant counts as out of tokens when the backend reports a lock reason, a
limit_reached / allowed: false flag, a spend-control block, or any window at
100% utilisation.
What re-prompting can and cannot do
When a provider runs out, FlipSide reads that provider's newest human prompt
from its local session transcript for the current workspace. It then opens the
other provider's VS Code extension and submits the recovered prompt there; no
manual copy and paste is required.
Prompts sent through FlipSide: Ask are tracked directly. Prompts typed
inside Claude Code or Codex are recovered from ~/.claude/projects or
~/.codex/sessions; they must be newer than repromptMaxAgeMinutes.
Everything else — exhaustion detection, auto-switching, the status bar, and the
both-empty popup — works no matter where you prompt.
Transferred prompts keep their original line breaks. A prompt fingerprint is
remembered for 24 hours so reloads and repeated usage polls cannot submit the
same handoff twice.
Codex compatibility
The Codex VS Code extension does not currently expose a public command for
submitting arbitrary prompt text. To preserve and submit the original prompt,
FlipSide installs a narrowly scoped compatibility change in the local Codex
extension and saves a versioned backup beside the changed file. A Codex update
may require one VS Code window reload while FlipSide reapplies the bridge.
How it gets the data
| Assistant |
Credential |
Endpoint |
| Claude |
~/.claude/.credentials.json (macOS Keychain first) |
api.anthropic.com/api/oauth/usage |
| Codex |
~/.codex/auth.json |
chatgpt.com/backend-api/wham/usage |
Both are read-only GETs using the login the CLIs already wrote. Nothing is
stored or sent anywhere else. If the Claude API is unreachable, the extension
falls back to ~/.claude/usage-cache.json, which the Claude Code CLI maintains.
Usage for both assistants refreshes on every poll, so switching shows the
cached value instantly and revalidates in the background.
The claude CLI is often not on PATH; the extension falls back to the binary
bundled inside the Claude Code extension
(resources/native-binary/claude.exe).
Commands
FlipSide: Ask (auto-failover) — prompt box, routed to whoever has tokens
FlipSide: Retry Last Prompt — re-send the last prompt to whoever has tokens
FlipSide: Toggle Claude / Codex — same as clicking the item
FlipSide: Select Assistant — quick pick showing both, with live usage
FlipSide: Refresh Usage
FlipSide: Show Usage Details
Settings
All under flipSide.*:
| Setting |
Default |
Meaning |
refreshIntervalSeconds |
60 |
Poll interval (min 15) |
compact |
false |
Icon + one percentage only |
showRemaining |
false |
Show remaining % instead of used % |
warningThreshold |
60 |
Used % that turns the item yellow |
dangerThreshold |
90 |
Used % that turns the item red |
statusBarAlignment |
left |
Which side of the status bar |
statusBarPriority |
1000 |
Higher moves it further left |
codexHome |
"" |
Override ~/.codex |
autoSwitchOnExhaustion |
true |
Switch automatically when one runs out |
autoReprompt |
true |
Recover and hand off the last workspace prompt on a switch |
repromptMaxAgeMinutes |
30 |
Don't re-send prompts older than this |
claudeCliPath |
"" |
Full path to the claude CLI |
codexCliPath |
"" |
Full path to the codex CLI |
Set autoReprompt to false to be asked first via a Transfer to ... button
instead of having the prompt dispatched for you.
Hiding the standalone usage extensions
mhelbich.claude-code-usage-status and ganymede404.vscode-codex-usage each add
their own status bar item. To hide them without uninstalling, right-click the
status bar and untick Claude Usage and Codex Usage.
Publish to the VS Code Marketplace
The manifest uses publisher ID DaveArteaga, package name
flipside-ai-handoff, display name FlipSide, and version 1.0.0. It
publishes under the Marketplace identifier DaveArteaga.flipside-ai-handoff.
Before publishing publicly
- Confirm that the included MIT
LICENSE file uses the correct copyright
holder.
- A public source repository is recommended but optional. This package enables
VSCE's supported
allowMissingRepository option so you can publish without
inventing a repository URL. Add a real repository URL later if you create
one.
- Optionally add a PNG icon of at least 128x128 pixels and reference it with
the
icon field. Marketplace extension icons cannot be SVG files.
- Review the privacy and security disclosure. This extension reads local
Claude and Codex credentials and session transcripts. Its exact Codex prompt
handoff also applies a compatibility change to the installed Codex
extension because Codex does not expose a public arbitrary-prompt command.
That behavior should be clearly disclosed and made opt-in, or replaced with
a supported integration, before a public release.
Package and test
Open PowerShell in this extension directory:
npm install --global @vscode/vsce
vsce ls
vsce package
vsce ls shows every file that will be shipped. vsce package creates
flipside-ai-handoff-1.0.0.vsix. Test that exact package before
publishing:
code --install-extension .\flipside-ai-handoff-1.0.0.vsix --force
Use the generated filename if you changed the package name, then run
Developer: Reload Window and test failover in both directions.
Authenticate and publish
For a manual PAT-based publish:
In Azure DevOps, create a Personal Access Token for All accessible
organizations with Marketplace > Manage scope. Never commit or paste
that token into a source file.
Authenticate the publisher:
vsce login DaveArteaga
Paste the PAT when prompted.
Publish from this directory:
vsce publish
Alternatively, upload the generated .vsix manually from the Visual Studio
Marketplace publisher management page. Microsoft is retiring global Azure
DevOps PATs on December 1, 2026, so use Microsoft Entra ID secure automated
publishing for ongoing releases.
Publish an update
Every Marketplace release needs a new semantic version. After making and
testing changes, publish a patch update with:
vsce publish patch
That changes 1.0.0 to 1.0.1 and publishes it. Use minor for a feature
release or major for a breaking change. The official references are the
VS Code publishing guide
and extension manifest reference.
Install note
VS Code manages the installed folder and registry entry when you install the
packaged VSIX. After editing an unpacked development copy, run
Developer: Reload Window.
Layout
| File |
Role |
extension.js |
Activation, state, failover orchestration, commands |
src/claude.js |
Claude credentials, usage fetch, cache fallback |
src/codex.js |
Codex credentials, usage fetch |
src/limits.js |
Shared "is it out of tokens" rules |
src/dispatch.js |
Native extension prompt handoff, with CLI helpers |
src/prompts.js |
Workspace-scoped prompt recovery from local sessions |
src/render.js |
Status bar text, tooltip, colours |
src/http.js |
Small GET helper |