Tokenade
Portable browser sessions. Export cookies (and storage) from a real browser into a .tokenade file, then launch or proxy on another machine as that session — with TLS fingerprint matching where it matters.
pip install tokenade
tokenade plugin sync
Not a Multilogin / AdsPower replacement. Tokenade is session portability (export → package → inject / proxy), not a full anti-detect browser product. Stealth is best-effort and measured — never “undetectable.”
Why Tokenade?
| You need… | Tokenade |
|---|---|
| Move a logged-in session to another device | Export → .tokenade → launch or proxy |
| Keep cookies + localStorage (e.g. Telegram Web) | Full / ecosystem packaging |
| Match donor TLS on proxied traffic | CDP proxy + curl-cffi |
| Encrypt session files at rest | AES-256-GCM (encrypt / export password) |
| Extend behavior per site | Site-handler plugins (--plugin google-handler) |
Self-hosted CLI. No cloud account required for the core loop.
Quick start
1. Install
pip install tokenade
# Python 3.10+
Optional extras: tokenade[tui], tokenade[linux], tokenade[enterprise] (LDAP — experimental).
2. Install site plugins + quit the donor browser
tokenade plugin sync
tokenade export --list-handlers
Fully quit the browser first (see Best practices). A running browser locks the cookie database.
tokenade export --list-profiles
# Hard sites use dedicated handlers that export required storage origins.
tokenade export --browser-name firefox --plugin discord-handler -o discord.tokenade
3. Use the session
Load into CloakBrowser (default automation backend):
tokenade load --file discord.tokenade
Show a browser window when needed:
tokenade load --file discord.tokenade --visible
Proxy (CDP reverse proxy with optional TLS impersonation):
tokenade proxy -s gmail.tokenade
# Open the local GUI / URL printed by the CLI (default port 9222)
Encrypt sensitive jars before sharing or storing:
tokenade encrypt -i discord.tokenade -o discord.tokenade.enc -p "my-secret"
# or: tokenade export ... --encrypt-password '…'
Full command list: tokenade --help and tokenade <command> -h. Start with docs/USER_GUIDE.md; release hardening work is tracked in docs/RELEASE_HARDENING.md.
What works (evidence-based)
| Capability | Status | Notes |
|---|---|---|
| Cookie export (Chrome / Firefox / Brave / Edge) | Works | SQLite extraction; quit browser first |
| Load + inject via CloakBrowser | Works | tokenade load --file session.tokenade |
| Google: Firefox/Brave/Edge donor → non-Chrome target | Works | Multi-browser & multi-device verified (2026-07-10) |
| Google → Chrome / Chromium target | Fails | Account chooser / signed out; avoid Google-owned browsers |
| CDP proxy + session inject (Gmail, ChatGPT) | Works | Confirmed logged-in in real runs |
| localStorage (Discord, Telegram Web) | Works | Handler-declared storage origins are exported automatically |
| AES-256-GCM session encryption | Works | Core encryptor, PBKDF2 |
| Session health scoring | Works | Heuristic on cookies — not live auth proof |
TLS fingerprint matching (curl-cffi) |
Works | Core dependency; use thoughtfully with cf_clearance |
| Hard bot labs / Cloudflare Turnstile | Often fails | Do not market as Grade A bypass |
| Enterprise LDAP / fleet / K8s generators | Code present | Not production-hardened product surfaces |
GitHub/Discord/Reddit from session-only cookies often fail when the donor never wrote durable auth cookies to disk.
Core workflows
┌──────────────┐ export ┌────────────────┐ launch / proxy
│ Donor browser│ ──────────────► │ .tokenade file │ ──────────────────► Target
│ (logged in) │ cookies (+LS) │ portable jar │ clean profile or CDP
└──────────────┘ └────────────────┘
- Export — read cookies and handler-declared storage from a real profile; package as
.tokenade. - Transfer — copy the file (optionally encrypted) to another machine or process.
- Replay —
load(CloakBrowser + inject),launch(system browser + inject), orproxy(TLS-matched reverse proxy).
Google recipe (verified): donor not Chrome → target Brave / Edge / Firefox → clean --profile-dir → open the product URL (e.g. mail.google.com), not accounts.google.com after inject. Same jar can run on multiple non-Chrome browsers/devices concurrently. Vivaldi is code-supported but not battle-tested.
Best practices
These matter more than flag trivia. Follow them and most “broken session” reports go away.
Export
- Fully quit the donor browser before export.
Chrome/Firefox/Brave hold exclusive locks on the cookies SQLite DB. “Quit” means no residual process in Task Manager / Activity Monitor /
pgrep. Otherwise you getdatabase is lockedor a partial/stale dump. - Export only the domains you need (
--domainsor a site plugin). Smaller jars are easier to reason about and safer to share. - Prefer a stable donor for high-value accounts. For Google, prefer Firefox / Brave / Edge — not Google Chrome — so cookies are portable.
- Use
--list-profileswhen multiple profiles exist; export the one that is actually logged in. - Encrypt before sharing (
encryptor--encrypt-password). Treat.tokenadelike a password dump. - Need storage (Discord, Telegram, some SPAs)? Prefer a site handler. Handlers can declare exact storage origins, so export captures the right localStorage automatically.
Launch & inject
- Always use a clean
--profile-dirfor tests and portability. Injecting into a dirty system profile mixes old cookies, risk signals, and false failures. - Navigate to the product URL, not the IdP bounce page, after inject (e.g. inbox URL, not
accounts.google.com). - Google: avoid Chrome-family targets (Chrome, Chromium, Canary). Non-Chrome targets work; Chrome clean profiles still fail in practice.
- One CDP port per concurrent browser (
--port). Parallel launches need distinct ports and profile dirs. - Site plugins (
--plugin discord-handler,--plugin telegram-handler,--plugin generic-handler) keep domain filters and storage rules consistent between export and load.
Proxy & ops
- Prefer
127.0.0.1binding for local proxy; do not expose session proxies to the network without deliberate network design. - TLS fingerprint /
--fingerprint: useful for many anti-bot stacks; can interfere with somecf_clearanceflows — verify per site. - Refresh instead of re-login when cookies age:
tokenade refresh-browserortokenade accounts refreshfor batches. - Health is a hint, not a login proof.
tokenade healthscores cookie heuristics; confirm with a real page load when it matters. - Do not commit live
.tokenadefiles to git. Add them to.gitignore; rotate if leaked.
Security habits
- Session files = full account access for cookie lifetime. Store encrypted; limit filesystem permissions.
- Prefer short-lived copies on shared machines; delete profile dirs under
/tmpwhen done. - For automation, pin Python and document the donor browser version you validated against.
Installation (dev)
git clone https://github.com/mihir0209/tokenade.git
cd tokenade
pip install -e ".[dev]"
playwright install chromium --with-deps
pytest # suite under tokenade/tests/
CloakBrowser (stealth Chromium backend) is a core dependency; its binary downloads on first use when available.
Plugins
Site handlers and other plugins customize domains, critical cookies, and launch behavior without forking core:
tokenade export --list-handlers
tokenade plugin list
tokenade launch -s gmail.tokenade --plugin google-handler --browser brave \
--profile-dir /tmp/tokenade-brave-clean --visible
Authoring guide: docs/PLUGIN_DEVELOPMENT.md. Examples: examples/plugins/.
Request framework
For automation and orchestration, Tokenade accepts a nested request.json envelope. The core validates structure only; plugin config is dynamic pass-through.
Run operation
Execute plugin operations in order:
{
"version": "1",
"operation": "run",
"plugins": [
{
"name": "generic-handler",
"required": true,
"roles": {
"run": {
"method": "process"
}
},
"config": {
"session_file": "/path/to/github.tokenade",
"site": "github"
}
}
],
"execution": {
"stop_on_error": true
}
}
tokenade run --request request.json
Gateway operation
Start a local multi-session control plane with isolated browser contexts:
{
"version": "1",
"operation": "gateway",
"sessions": {
"dir": "./sessions",
"pattern": "*.tokenade"
},
"gateway": {
"host": "127.0.0.1",
"port": 9222,
"backend": "cdp"
},
"routing": {
"object": "session",
"strategy": "health-weighted",
"switch_interval_seconds": 30,
"sticky_by": "site",
"failover": true,
"drain_existing_tabs": true
},
"plugins": []
}
tokenade gateway --request request.json
Gateway API endpoints:
GET /status— routing state and session countGET /sessions— sanitized session records (no cookies/storage)POST /route/next— select next session by strategyPOST /route/select— set active session by ID/path/siteGET /contexts— isolated browser context statePOST /contexts/prewarm— prewarm contexts for sessionsPOST /contexts/drain— close inactive contextsPOST /tabs/new— open new tab on active context
Privacy: gateway outputs session metadata only (site, cookie count, health score). Never cookies, tokens, localStorage, or proxy credentials.
Proxy resolve operation
Resolve upstream proxy provider configuration with credential redaction:
{
"version": "1",
"operation": "proxy.resolve",
"plugins": [
{
"name": "brightdata",
"required": true,
"roles": {
"proxy_provider": {
"mode": "sticky",
"nearest_to_source": true,
"fallback": "fail"
}
},
"config": {
"zone": "residential"
}
}
]
}
tokenade proxy resolve --request request.json
Output is redacted by default. Use --show-secrets to reveal credentials.
Security (short)
- Treat every
.tokenadeas credentials. - Use encryption at rest; prefer encrypt-on-export for transfers.
- Default proxy bind is loopback; SSRF protections block private/loopback targets on outbound proxy paths.
- Report security issues privately when possible; see
docs/SECURITY.md.
Documentation
| Doc | Contents |
|---|---|
docs/TUTORIAL_GETTING_STARTED.md |
Gmail→Brave golden path + Windows |
docs/TROUBLESHOOTING.md |
Locked DB, decrypt errors, proxy issues |
docs/SITE_CONFIGS.md |
Site configs live in plugins (site_config.json) |
docs/API.md |
Programmatic / server API |
docs/ARCHITECTURE.md |
Package layout and design |
docs/PLUGIN_DEVELOPMENT.md |
Plugin API |
USE-CASES.md |
Scenarios and comparisons |
docs/CONTRIBUTING.md |
Contribution guidelines |
CLI discovery beats a second manual: tokenade --help.
Project stance
- Honesty over hype — battle-tested vs “code exists” stay separated in docs and messaging.
- Session portability first — plugins, stealth, fleet tooling support that core; they are not the product by themselves.
- Evidence — Google multi-device non-Chrome recipe verified 2026-07-10; see project notes under
.agent/for campaign details (not required for end users).
License
MIT — Copyright (c) 2026 MiHiR
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tokenade-1.1.71.tar.gz.
File metadata
- Download URL: tokenade-1.1.71.tar.gz
- Upload date:
- Size: 604.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2a0baf071c1d17a1837f86439c540fe3c8eaf76d19e638e64aadec6f7f26831
|
|
| MD5 |
9d1000dfc0dc2d7859f625e0d1caaedf
|
|
| BLAKE2b-256 |
7cdf10affd289f2035e4722e1cd725929bd2b1a95cde2fd63500b0da37e8c0b0
|
File details
Details for the file tokenade-1.1.71-py3-none-any.whl.
File metadata
- Download URL: tokenade-1.1.71-py3-none-any.whl
- Upload date:
- Size: 667.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a8ae701ffd31354cf5c427c4fc1237e46185191c81a170fc1c4e92d4b23ee0c
|
|
| MD5 |
41243e675afca4f3b6e206bcd899bd1d
|
|
| BLAKE2b-256 |
64cce4e07768c2f922ae4d718052f52eb787a18697a99252bdd760af7a371517
|