Production-grade CLI to migrate Chromium browser profiles between browsers
Chrome · Brave · Arc · Edge · Vivaldi · Opera · Chromium · and more
Quick start · Features · Browsers · CLI · Architecture · Security · Contributing
Switching browsers usually means weeks of friction: lost bookmarks, dead sessions, re-typing passwords, and hunting down extensions.
chromium-migrate copies a full Chromium user profile from one browser to another — locally, safely, and verifiably.
| Safe by default | Target profile is backed up before any write. Rollback in one command. |
| Secrets stay secret | Passwords & cookies are re-encrypted in memory. Never logged. Never written plaintext. |
| Browser-agnostic | Registry-driven paths for Chrome, Brave, Arc, Edge, Vivaldi, Opera, and more. |
| Production CLI | Progress UI, dry-run estimates, JSON/Markdown/HTML reports, batched SQLite I/O. |
chromium-migrate migrate --from arc --to brave -y| Capability | Details |
|---|---|
| Bookmarks | Full folder tree, order, dates; Arc sidebar favorites imported when source is Arc |
| History & downloads | Large profiles (100k+ history rows) via batched SQLite |
| Passwords | Keychain / Safe Storage re-encryption on macOS |
| Cookies | Network/Cookies layout + encrypted value re-keying |
| Autofill | Addresses, form history, masked card metadata |
| Extensions | Packages + local/sync settings + compatibility notes |
| Sessions | Current / Last Session & Tabs |
| Permissions | Camera, mic, notifications, location, and more |
| Preferences | Compatible Chromium prefs (theme, startup, search, zoom, …) |
| Favicons / Top Sites | Databases copied and count-verified |
| Dry-run | Item counts, disk estimate, unsupported surface list — zero writes |
| Reports | JSON · Markdown · HTML under reports/ |
| ID | Browser | Notes |
|---|---|---|
chrome |
Google Chrome | |
chrome-canary |
Chrome Canary | |
chromium |
Chromium | |
brave |
Brave | |
arc |
Arc | Spaces/Boosts not portable; sidebar → bookmarks |
edge |
Microsoft Edge | |
vivaldi |
Vivaldi | |
opera |
Opera | |
opera-gx |
Opera GX | |
thorium |
Thorium | |
dia |
Dia | Experimental |
chromium-migrate browsers # paths for your OS
chromium-migrate profiles # installed profiles + sizesAdd another Chromium browser with a single entry in src/browsers/registry.ts.
- Node.js 22+
- Build tools for native modules (
better-sqlite3,keytar) - On macOS: Xcode Command Line Tools
git clone https://github.com/IshankDev/chromium-migrate.git
cd chromium-migrate
npm install
npm run build
npm link # installs `chromium-migrate` and `cmigrate`# without linking
node dist/cli.js --help
npm run dev -- profiles# rebuild natives if install fails
npm rebuild better-sqlite3 keytarThe first password/cookie migration may prompt for OS keychain access — allow it for Safe Storage.
# 1. Discover
chromium-migrate profiles
# 2. Preview (no writes)
chromium-migrate dry-run --from arc --to brave
# 3. Migrate (terminates browsers, backs up target)
chromium-migrate migrate --from arc --to brave -y
# 4. Verify
chromium-migrate verify --from arc --to brave
# 5. Something wrong? roll back
chromium-migrate rollbackchromium-migrate migrate --from chrome --to brave -y
chromium-migrate migrate --from brave --to edge --source-profile "Profile 1"
chromium-migrate migrate --from edge --to vivaldi --no-passwords
chromium-migrate dry-run --from opera --to chrome
chromium-migrate backup create --browser brave -y| Command | Description |
|---|---|
migrate |
Migrate --from → --to |
verify |
Compare source vs target counts |
backup create / backup list |
Snapshot a profile |
rollback [id] |
Restore the latest (or given) backup |
dry-run |
Estimate without writing |
profiles |
List discovered profiles |
browsers |
List supported browsers + expected paths |
report |
Show generated reports |
clean |
Prune old backups / logs / reports |
Binaries: chromium-migrate · cmigrate · legacy arc2brave
| Flag | Description |
|---|---|
-f, --from <browser> |
Source browser id |
-t, --to <browser> |
Target browser id |
--source-profile / --target-profile |
Profile folder (default Default) |
--no-passwords / --no-cookies / … |
Skip individual stages |
--skip-backup |
Skip target snapshot |
-y, --terminate |
Quit browsers without prompting |
-v, --verbose |
Debug logging |
| Platform | Discovery | DB copy | Password / cookie re-encrypt |
|---|---|---|---|
| macOS | ✅ | ✅ | ✅ Keychain + AES-128-CBC |
| Linux | ✅ | ✅ | |
| Windows | ✅ | ✅ | ❌ DPAPI not yet — blobs copied as-is |
Paths use portable {home} templates — never hardcoded to a username or machine.
export CHROMIUM_MIGRATE_HOME=/path/to/workdir # logs, backups, reportsflowchart LR
A[Source browser<br/>profile] --> B[Discovery & preflight]
B --> C[Backup target]
C --> D[Stage migrators]
D --> E[Re-encrypt secrets]
E --> F[Verify + reports]
F --> G[Target browser<br/>profile]
src/
browsers/ Registry · discovery · process control
migration/ Stage migrators · orchestrator · verify
services/ Backup · crypto / Safe Storage
database/ Batched transactional SQLite helpers
commands/ CLI (commander)
reports/ JSON / Markdown / HTML
utils/ Logging · progress UI · helpers
chromium-migrate is designed for local migration of your own profiles.
- Decrypt only in process memory for re-encryption
- Never print, log, or persist plaintext passwords / cookie values
- Redacted logging by default
- Prefer quitting browsers cleanly before migrate
See SECURITY.md to report vulnerabilities privately.
- Browser-specific UI (Arc Spaces / Boosts, Vivaldi panels, Opera workspaces)
- Cloud sync / account session state
- Full credit-card PANs (masked / tokenized metadata only)
npm install
npm run typecheck
npm test
npm run build
npm run dev -- browsers- Windows DPAPI password/cookie re-encryption
- Stronger Linux secret-service integration
- Firefox → Chromium adapters (experimental)
- npm package publish + Homebrew formula
- Guided TUI mode
Vote with 👍 on issues — PRs welcome.
We welcome browser definitions, platform crypto work, tests, and docs.
- Read CONTRIBUTING.md
- Follow the Code of Conduct
- Open a PR with clear test notes
⭐ Star the repo if this saved you a weekend of re-logins.
MIT © chromium-migrate contributors

