010 / 025 · Dev · v0.22.0 · MIT
reunite
reunite answers the moment you sign in with your other account and the sidebar is suddenly almost empty — or the moment you archive or delete a conversation under one account and it is still sitting in the other one's sidebar. Claude's desktop app keeps a separate conversation index for each account it has been signed in as, shows you only the one belonging to whoever is signed in now, and writes every change into that one only. This makes every account hold the same conversations, in the same state, byte for byte.
- Arguments
Each optional.
[--apply][--into=all|current|<accountUuid>][--from=current|<accountUuid>][--sidebar-from=current|<accountUuid>][--no-environments][--undo][--undo-sidebar][--install-service|--uninstall-service|--service-status]
- When it fires
The prompts CI scores this skill against, on every release.
Fires on
- I signed in with my other Claude account and now the sidebar is almost empty. Where did all my conversations go?
- 换了个账号登录,session 全没了
- Can my two accounts on this machine share the same conversation list?
- I renamed a bunch of conversations under one account but my other account still shows the old titles.
- 我在一个账号里把一堆 session 归档了、删掉了,换到另一个账号它们还在,能不能让几个账号完全一致?
Stays out of
- Rename these conversations onto the dated scheme.
- Move my Claude history over to my new laptop.
Nothing was lost, and you can prove it
Two stores hold a conversation, and only one of them has ever heard of accounts.
The conversation itself — every message, every tool call — is a JSONL file under ~/.claude/projects/, filed by the directory you were working in. Open one and there is no account field anywhere in it. That is why claude --resume in a terminal has been listing all of your conversations the whole time, no matter which account is signed in.
What the sidebar reads is a second, much smaller set of files: one index entry per conversation, stored under a path that begins with your account's identifier. Sign in as a different account and the app reads a different directory. The conversations are still on disk, in full, untouched.
So the fix is much smaller than the symptom. Nothing needs recovering; the lists need aligning.
What it does
For each conversation it takes the copy you touched last and makes it every account's copy — creating it where an account has none, overwriting it where an account's copy is stale.
Plan: align 5 account index(es)
891 copies to create, +47.6MB
6912 copies to overwrite with the canonical copy
103 change title
2702 change isArchived
17 change isStarred
5536 change other fields only the app reads
0 copies to remove — 0 conversations deleted under one account
110 conversations have no transcript left; they are kept, archivedThat report is the whole of a default run. It writes nothing until you pass --apply, because thousands of rewritten files is not a decision to make on someone's behalf without showing them the numbers first. After writing, it rescans and checks that every conversation really is identical in every account, and says so — or names the ones that are not.
Archives and deletions travel too
Archiving decides what the sidebar shows, so it is not left to "whichever copy is newest". Every run records what each account held and what was archived; the next run compares against that. An archive or unarchive you made under one account reaches the others. A conversation you deleted under one account is removed from all of them, and is never copied back — which is what used to happen, and why a cleaned-up sidebar kept refilling.
The first time it runs there is no record to compare against, so copies that disagree settle on archived. Hiding is the recoverable way to be wrong. Entries whose transcript is gone are kept so the lists match, but archived, because they would open to nothing.
Everything it changes can be put back
Each file it creates is listed; the original of each file it overwrites or removes is backed up first. --undo removes what it created and restores every original, timestamps included. It never touches a transcript, and it never deletes anything you did not already delete yourself.
Your sidebar groups, too
The conversation list is only half of what the sidebar shows. The groups you made — their names, which conversations sit in each, their order, which ones are collapsed — are stored separately, per account, in the app's own browser storage. --sidebar-from=<account> copies one account's layout to every other account, dropping any grouped conversation that account does not hold.
This one needs the app fully quit (Cmd-Q), because the app keeps the layout in memory and would write over the change; the script checks and refuses otherwise, so run it from Terminal rather than from inside the app. It copies the whole storage directory first, checks the new value after writing and puts the copy back if anything is off, and --undo restores it. To take back only the latest layout change and keep your aligned conversation lists, use --undo-sidebar instead. It only reaches the desktop app's sidebar on this machine: artifacts and anything claude.ai keeps on its servers per account stay where they are.
Environments and stars
The environment picker is per account too. Every run now gives each account the same environments — the named working folders offered when a session starts — and carries a deletion to every account without ever copying it back. An account that suddenly holds none is left alone rather than read as "delete everything", because the app empties an account when it resets one. Which environments are starred is kept with the sidebar layout, so --sidebar-from copies the stars along with the groups.
Keeping it in step in the background
--install-service installs a small macOS background agent that reruns the alignment whenever the index or the environments change, and every five minutes. It waits until you have run --apply yourself once, never deletes anything you did not delete, never brings a deleted conversation or environment back, and only touches the sidebar layout while the app is quit. --service-status shows its last run; --uninstall-service removes it, and is needed before --undo.
Some things cannot be synced from this machine at all, because claude.ai keeps them on its servers per account: cloud environments, artifacts, projects, chats, and routines or scheduled tasks.
The restart
A run does not appear until the desktop app restarts. The app reads this index when it starts and does not look at the directory again while it is running.
That matters more than it sounds, because restarting interrupts whatever conversations are still running. The run tells you to restart rather than doing anything about it, and checking what is live first is worth the ten seconds.
Also in Dev
5 more skills · one installsync
/dev:syncsync does one thing: it lays out the difference between your local repository and its remote, and performs only the part of that which is unambiguously safe.
ship
/dev:shipship takes a change from your working tree to a merged pull request: branch off, run the project's own tests, commit, open the pull request, wait for CI, merge, then clean up the worktree.
cleanup
/dev:cleanupAfter a change ships, the leftovers stay: the local branch, its copy on the remote, the worktree it was built in, and sometimes a directory holding nothing but ignored files. cleanup removes those, and keeps and reports anything whose history it cannot account for.
retitle
/dev:retitleA conversation list gets hard to use not because the names are ugly but because they carry nothing you can sort on.
steward
/dev:stewardsync, ship and cleanup each work in the repository you are standing in. steward is the one that runs that loop across every repository you have actually been working in — it finds them, sweeps them, and hands back a single report of what is waiting on you: which branches are ready to merge, which pull requests are blocked and on what, which branches were written and never opened, and which worktrees a live session is still sitting in.