CCBaga Swaps Your Claude Identity. The Real Craft Is in the Undo.
A Rust and Tauri desktop toolkit for rotating Claude Code profiles, browser fingerprints, and system regions. Its most interesting idea is treating an identity switch as a database transaction.
- CCBaga is a local desktop app for swapping Claude Code identities, browser fingerprints, and system regions, and it treats that switch as a database transaction rather than a file copy.
- Its two-phase browser binding records a recoverable intermediate state, so a crash mid-switch rolls the pointer back instead of losing an identity or a profile.
- The vault refuses to mint a new encryption key when archives already exist, and archive extraction rejects path traversal, links, and unauthenticated endings.
- The README is candid about the edges: a green environment check is not anonymity and not account acceptance, and confirmed cleanup deletes files with no undo.
The Tool That Won't Promise You Anything
A desktop app whose stated job is swapping identities and rotating browser fingerprints arrives with a terms-of-service disclaimer stapled to the front. You would brace for a pile of shell scripts and wishful thinking.
CCBaga is not that. Underneath the surface it ships an encrypted, versioned identity vault, a two-phase commit for browser binding, path-traversal-hardened archive extraction, and a crash-recovery sweep. That is the tooling of a transaction system, not a cleanup script.
The README flinches at its own purpose. It states plainly that use violating Anthropic's official terms of service is prohibited, and then lists what the tool explicitly does not guarantee. A utility built for a job it has to disclaim, engineered this carefully, is a more interesting object than the job itself.
What CCBaga Actually Does
CCBaga is two cooperating apps. CCBaga-A is a Tauri 2 native shell that manages identities and system settings. CCBaga-B is a launcher around a patched Chromium build, Fingerprint Chromium, that runs in an isolated profile and reports its readings back to A over a local session.
- Local Claude identities: archive the current state, switch to a saved identity, or start empty, with a per-category policy deciding which data stays shared.
- Fingerprint and restart: generate a seed, apply a region's language and timezone, then restart the browser.
- Environment checks: compare browser and OS readings against the actual network exit.
- System settings: apply timezone, language, and region, and open OS permission panels.
- Claude CLI management: detect, uninstall, or reinstall Claude Code through native, npm/bun, Homebrew, or WinGet.
The support surface is narrow on purpose. macOS 12+ on Apple Silicon and Linux x86_64 only. Intel macOS, Linux ARM64, and Windows are not supported. Rust accounts for roughly half the bytes, with TypeScript, Python, and a small Objective-C macOS layer filling in the rest.
"Applying a Setting and Verifying It Are Separate Steps"
That line from the README is the whole design philosophy in one sentence. Flipping a region setting does not change your network exit. So the tool does not pretend it did. It measures, and it reports the gap.
Once you accept that applying and verifying are different acts, the next question is what happens when the act succeeds and the verification does not. That is where the transaction pattern comes from.
Changing a setting and verifying its effect are separate steps.
The Switch That Can Survive a Crash
An identity switch touches two things that can disagree: the files on disk and the browser profile pointer. Swap the files, then crash before updating the pointer, and the next launch opens a browser profile that belongs to someone else. CCBaga handles this the way a database handles a multi-step write.
Each identity binds to a browser slot and a fingerprint seed. The seed is the first four bytes of SHA-256 over the namespaced string CCBaga/browser/{id}/{attempt}, retried up to 1024 times until it finds a value that is nonzero and unused. The result is deterministic for one identity and unique across the database.
The commit has two phases. pending() runs before the switch: it copies the current active slot into browser.previous, records the target slot as browser.next, and binds the outgoing identity to the slot it already owns. complete() runs only after the file switch lands: it promotes next into active, or keeps previous if the switch did not take, then clears the transient keys.
The value is that intermediate state. If the process dies between the two calls, the recovery sweep reads previous and rolls the pointer back. No identity and no profile is lost, because the tool never let the two halves of the state drift apart.
The Vault That Refuses to Overwrite Itself
Store::open does one small, important thing. If the key file is missing but archives already exist, it refuses to mint a new key. Regenerating the key would silently render every saved identity unreadable. The tool would rather fail loudly than destroy data quietly.
Then the crash-recovery sweep. Any .stage-<id> working directory is disposable and gets deleted. Any .trash-<id> entry is reconciled against the records: if a matching record exists and its archive is gone, the file is renamed back; if no record matches, it is purged. A 250 ms rate-limited process guard also interrupts long file operations if Claude launches mid-write.
Extraction is defensive throughout. Every tar member must be a normal path component, which rejects .. and absolute paths. Duplicates are rejected. Symlinks, hardlinks, and device files are rejected. After tar finishes, the code drains the compressed and encrypted stream to a sink so the AEAD tag is verified rather than trusting the tar structure. The manifest is then checked against the record id, the current home directory, the platform, and the exact set of data members.
Code Written for Machines to Read
Nearly every directory in the repository carries a CLAUDE.md, and nearly every source file opens with a structured header: [INPUT], [OUTPUT], [POS], [PROTOCOL]. The header states what the file depends on, what it emits, where it sits in the system, and an instruction to update the header and the nearest CLAUDE.md whenever the file changes.
// [INPUT] store.rs, archive.rs, codec.rs
// [OUTPUT] BrowserBinding, seed()
// [POS] identities/ -> browser_link.rs -> SQLite state table
// [PROTOCOL] Update this header and the nearest CLAUDE.md when this file changes.
Read the headers as a hint about how the repo was built. When coding agents are in the loop, a header that tells the next agent what a file does is cheaper than a comment written for a human who already knows. It is a small convention, and an easy one to steal.
How CCBaga Compares
The adjacent categories are anti-detect browsers and cleanup scripts. Neither is the same product, and CCBaga's edge is not a single feature. It is the integration.
| Tool | What it does | Browser fingerprint control | Native OS region/timezone | Applies and verifies separately | Local-only by default | Open source |
|---|---|---|---|---|---|---|
| CCBaga | Identity vault, companion browser, OS region control, environment checks | Yes, companion Chromium | Yes | Yes | Yes | Yes |
| Camoufox | Anti-detect Firefox build | Yes, core purpose | No | No | Yes | Yes |
| Multilogin / GoLogin / AdsPower | Commercial multi-profile browser and identity management | Yes | No | No | No, cloud sync typical | No |
| claude-cleanup skill | Finds and removes local Claude data | No | No | No | Yes | Yes |
| Standalone cleanup scripts | Delete selected local Claude files | No | No | No | Yes | Varies |
No single column is unique to CCBaga. Browser fingerprinting belongs to Camoufox and the commercial suites. Local deletion belongs to the cleanup scripts. Region control belongs to the operating system. What CCBaga adds is the combination in one local workflow, plus the habit of measuring whether the change actually took.
What It Can't Do
The README is unusually candid about the edges. Region selection does not change your public IP. IP geolocation is an estimate. DNS and WebRTC leak checks are not independently verified. A green result is not anonymity, and it is not account acceptance.
DNS and WebRTC leak checks are not independently verified.
Confirmed cleanup permanently deletes the selected files. No Trash, no undo. Network setup lives in a separate skill that an agent installs, and it requires approval before it touches a remote server. The app itself does not collect SSH keys or proxy credentials.
A tool that tells you what it cannot promise is more trustworthy than one that promises everything. That honesty, more than the transaction pattern, is the part worth copying.





