cd /news/developer-tools/how-to-sync-messages-of-claude-code-… Β· home β€Ί topics β€Ί developer-tools β€Ί article
[ARTICLE Β· art-34789] src=github.com β†— pub= topic=developer-tools verified=true sentiment=Β· neutral

How to sync messages of Claude Code extension in VS Code and Claude Code app?

A developer released a free, open-source PowerShell script that syncs Claude Code chats started in VS Code to the Claude Code desktop app by writing missing session wrapper files, enabling users to carry conversations between both apps without editing chat data.

read12 min views1 publishedJun 20, 2026
How to sync messages of Claude Code extension in VS Code and Claude Code app?
Image: source

Make a Claude Code chat you started in VS Code show up in the Claude Code desktop app β€” so you can carry one conversation back and forth between both apps.

Windows Β· one PowerShell script Β· no install Β· never edits your chats Β· MIT licensed

Full explanations are below β€” but if you just want it done, this is the whole thing.

STEP 1   Download the script (green "Code" button β†’ Download ZIP β†’ Extract).
STEP 2   In VS Code: Terminal β†’ New Terminal. Paste ONE line, swap in your folder, press Enter:

   powershell -NoProfile -ExecutionPolicy Bypass -File "β€ΉPATH TO THE .ps1β€Ί" -ProjectPath "β€ΉYOUR VS CODE PROJECT FOLDERβ€Ί" -Apply

STEP 3   Fully quit the desktop app (tray icon β†’ Quit) and reopen it.

Done β€” your VS Code chats from that folder now appear in the desktop app's sidebar.

πŸ‘‰ Confused by β€ΉPATH TO THE .ps1β€Ί

vs β€ΉYOUR PROJECT FOLDERβ€Ί

? Read ** the 3-folders section** β€” it's the #1 thing people trip on.

Understand it (5-min read):

πŸ“– The one idea behind everythingβ€” notebook + index card❓ The WH questionsβ€” who / what / why / when / where / howπŸ”’ Is it safe?β€” yes, and exactly why

Do it (copy-paste):

πŸ“₯ Install β€” get the script onto your PC🧩 IMPORTANT: don't mix up these 3 foldersβ€”read this firstπŸš€ How to use it β€” copy-paste recipesβ€” restart the desktop app⚠️ The step everyone forgetsπŸ†˜ Red error? The two common fixes

Use it:

πŸ” Carry one chat between both apps (ping-pong)πŸ—‘οΈ How to undo🧭 Bonus: the folder β†’ "drawer" naming·⚠️ Honest limitationsπŸ“œ License

Imagine every Claude Code chat is a notebook, and there's a library index card that points to it.

THE NOTEBOOK = your actual chat (every message you and Claude wrote)
THE INDEX CARD = a tiny note that says "a notebook exists, here's its name and where it is"
  • The VS Code extension finds notebooksby looking on the shelf(the folder on your disk). - The desktop app is lazier β€” itonly reads index cards. No card = it can't see the notebook,even though the notebook is right there.

When you start a chat in the desktop app, it writes the index card for you. βœ… When you start a chat in VS Code, no card gets written. ❌ β†’ the desktop app is blind to it.

This tool writes the missing index card. That's the whole thing. One card per chat.

   YOUR VS-CODE CHAT
   notebook  βœ”  (your messages β€” already on disk, we never touch it)
   index card ✘  MISSING        ──run this tool──►   index card βœ”   ──►  desktop app sees it

Anyone who uses Claude Code in more than one place β€” the VS Code extension and the desktop app β€” and is annoyed that chats started in VS Code never appear in the desktop app's sidebar.

It creates a small "index card" file (Claude Code calls it a session wrapper) for chats that don't have one. With the card in place, the desktop app lists the chat and can open it. It adds tiny pointer files. Nothing else.

Both apps and the terminal CLI share the exact same chat file on disk. But the desktop app builds its sidebar only from index cards, and only the desktop app writes those cards β€” VS Code never does. So VS-Code-born chats are invisible to the desktop app until someone writes the card. This tool writes it.

Whenever you started a chat in VS Code and now want it in the desktop app too. Run it as often as you like β€” it skips chats that already have a card, so re-running is always safe.

THE NOTEBOOK (your chat β€” we only READ it, never change it):
   C:\Users\<you>\.claude\projects\<folder-as-dashes>\<session-id>.jsonl

THE INDEX CARD (what this tool WRITES):
   C:\Users\<you>\AppData\Roaming\Claude\claude-code-sessions\<guid>\<guid>\local_<session-id>.json

For each VS-Code-born chat in a folder, the tool:

1. Opens the chat file and reads ONLY its first ~50 lines   (a read-only peek)
2. Figures out two things:
      β€’ which folder the chat belongs to
      β€’ a friendly title (the chat's first message), with the date in front
        e.g.  "[Jun 13] hey help me find the claude's sesins..."
3. Writes a tiny index card whose pointer ("cliSessionId") aims at that chat file
4. Drops the card next to the desktop app's other cards

That's it. It reads your chats (peek only) and writes new little card files.

✘ It NEVER edits, moves, or deletes your actual chat files (.jsonl)
✘ It NEVER overwrites a card that already exists (it skips those)
✘ It NEVER deletes anything β€” it only ADDS card files
βœ” It is DRY-RUN by default β€” it writes NOTHING unless you add  -Apply
βœ” It is trivially reversible β€” delete the card file it made, and the listing is gone
   (your chat stays perfectly safe, because the card was never the chat)

You need just ONE file: register_vscode_session_in_desktop.ps1

. There is nothing to compile or install β€” you save this one file and run it. Pick either way to get it.

1. Open   https://github.com/budhasantosh010/claude-code-session-bridge
2. Click the green  "< > Code"  button  β†’  "Download ZIP"
3. Find   claude-code-session-bridge-main.zip   in your Downloads folder
4. Right-click it  β†’  "Extract All…"  β†’  choose a PERMANENT home, e.g.  C:\Users\<you>\Tools
5. You now have the script here:
   C:\Users\<you>\Tools\claude-code-session-bridge-main\register_vscode_session_in_desktop.ps1
cd C:\Users\<you>\Tools
git clone https://github.com/budhasantosh010/claude-code-session-bridge.git

Result:

C:\Users\<you>\Tools\claude-code-session-bridge\register_vscode_session_in_desktop.ps1

πŸ“Œ Keep it somewhere permanent you'll remember (a

Tools\

folder is perfect).Don't leave it in Downloadsβ€” too easy to delete by accident.

1. In File Explorer, find   register_vscode_session_in_desktop.ps1
2. Hold SHIFT, right-click it  β†’  "Copy as path"
3. The full path is now on your clipboard, e.g.:
   "C:\Users\Alex\Tools\claude-code-session-bridge\register_vscode_session_in_desktop.ps1"

Almost everyone trips on this at first β€” including the person who built this tool. There are three completely different folders in play, and they are NOT the same thing:

β‘   THE SCRIPT (the tool)        ←  a .ps1 file. Just a helper program. Lives ANYWHERE.
       C:\Users\Alex\Tools\claude-code-session-bridge\register_vscode_session_in_desktop.ps1

β‘‘  YOUR PROJECT FOLDER          ←  where YOUR code/work lives. The folder you open in VS Code.
       C:\Users\Alex\Documents\my-website

β‘’  CLAUDE'S SESSIONS FOLDER     ←  Claude's OWN private storage. You NEVER point at this.
       C:\Users\Alex\.claude\projects\...

πŸ‘‰ Folder β‘‘ β€” your project folder (the one you open in VS Code). 🚫 NOT folder β‘’ (.claude\projects\...

).

Why? The -ProjectPath

part is asking "which project's chats do you want?" β€” and you name a project by where its code lives (its human name, like ...\my-website

). The script then quietly translates that into folder β‘’ for you. You never type folder β‘’ yourself.

YOU type:        -ProjectPath "C:\Users\Alex\Documents\my-website"        ← folder β‘‘ (your code)
SCRIPT figures:  β†’ look inside C:\Users\Alex\.claude\projects\c--Users-...-my-website\   ← folder β‘’
                   (it does this itself β€” not your job)

No. Here's the key idea:

The

.ps1

file isNOT part of Claude.It's a small helper program. It has nothing to do with Claude's internal machinery, so it doesnotbelong in.claude

.

.claude\  =  Claude's house. Claude's own stuff (sessions, settings, memory).
              ── you don't store your own tools inside someone else's house ──

the .ps1  =  YOUR screwdriver. A tool. It can sit in ANY drawer you like β€”
              Desktop, a Tools\ folder, anywhere. It works exactly the same.

The script's location doesn't matter at all. What matters is that your command points at it with the -File "..."

part:

-File "C:\Users\Alex\Tools\claude-code-session-bridge\register_vscode_session_in_desktop.ps1"
       └─────────── "hey PowerShell, run THIS tool β€” it's right here" β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Move the .ps1

to C:\Tools\

? Then just change that to -File "C:\Tools\register_vscode_session_in_desktop.ps1"

and it still runs fine.

RUN this tool β‘   ──  to bookmark the chats of this project β‘‘  ──  into the desktop app.
   (-File "...ps1")        (-ProjectPath "...your code folder")

Folder β‘’ (.claude) = Claude's private storage. The tool reads it FOR you. You never name it.
β‘  SCRIPT PATH   = where you saved register_vscode_session_in_desktop.ps1   (copied just above)
β‘‘ PROJECT PATH  = the folder you open in VS Code for that chat

To copy the PROJECT PATH: in VS Code, right-click the top folder in the Explorer sidebar β†’ "Copy Path". (Or in File Explorer, Shift+right-click the folder β†’ "Copy as path".)

1. Open PowerShell:  in VS Code click  Terminal β†’ New Terminal
                     (or press the Windows key, type "PowerShell", press Enter)
2. Paste a recipe below β€” with YOUR two paths filled in
3. Press Enter

πŸ’‘

Golden habit:run itwithout-Apply

first β€” that's apreviewand writes nothing. Happy with what it lists? Add-Apply

and run again to actually write the cards.

πŸ‘‡ Every recipe below uses this ONE concrete example. Just swap in your own two paths.

Example SCRIPT PATH :  C:\Users\Alex\Tools\claude-code-session-bridge\register_vscode_session_in_desktop.ps1
Example PROJECT PATH:  C:\Users\Alex\Documents\my-website

Plain English: "Look at my-website's chats and add a card for any that doesn't have one yet."

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Users\Alex\Tools\claude-code-session-bridge\register_vscode_session_in_desktop.ps1" -ProjectPath "C:\Users\Alex\Documents\my-website" -Apply

Plain English: "Show me what you WOULD add, but don't touch anything yet."

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Users\Alex\Tools\claude-code-session-bridge\register_vscode_session_in_desktop.ps1" -ProjectPath "C:\Users\Alex\Documents\my-website"

Plain English: "I only want this single chat in the desktop app, not all of them."

Step 1 β€” find the chat's id:

1. Open File Explorer and go to:   C:\Users\<you>\.claude\projects\
2. Open the "drawer" for your project. Its name is your PROJECT PATH with every
   space and symbol turned into a dash. So:
      C:\Users\Alex\Documents\my-website   β†’   c--Users-Alex-Documents-my-website
3. Inside, each chat is a file named  <session-id>.jsonl . The filename IS the id:
      41c938f1-e81e-4d13-ad39-bde9636a51c0.jsonl
       └──────────────── this is the id β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 2 β€” run it (paste the id after -SessionId):

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Users\Alex\Tools\claude-code-session-bridge\register_vscode_session_in_desktop.ps1" -SessionId 41c938f1-e81e-4d13-ad39-bde9636a51c0 -Apply

Plain English: "Sweep all my projects at once." Note: no-ProjectPath

here β€”-AllProjects

takes its place.

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Users\Alex\Tools\claude-code-session-bridge\register_vscode_session_in_desktop.ps1" -AllProjects -Apply
powershell -NoProfile -ExecutionPolicy Bypass -File "β€ΉSCRIPT PATHβ€Ί" -ProjectPath "β€ΉPROJECT PATHβ€Ί" -Apply
                                                      └─ paste path β‘       └─ paste path β‘‘

After running with -Apply, fully QUIT and RE-OPEN the desktop app. The sidebar reads index cards

only when it starts upβ€” new cards won't appear until you restart. (Quit properly: right-click the Claude icon in the Windows tray, bottom-right near the clock β†’

Quit. Just closing the window may not be enough.)

"... cannot be loaded because running scripts is disabled ..."
   β†’ You forgot the  -ExecutionPolicy Bypass  part. Copy the WHOLE recipe line; it's already in there.

"No cabinet drawer for: C:\...\your-folder"
   β†’ That PROJECT PATH has no Claude Code chats yet, OR the path is slightly wrong.
     Fix: make sure you copied the EXACT folder you open in VS Code (Explorer β†’ right-click top
     folder β†’ "Copy Path"). Run Recipe B (preview) first to check before using -Apply.
WROTE  41c938f1   [Jun 19] read the project_log...    ← a new card was written
WOULD  9f089261   [Jun 13] hey help me find...        ← preview only (you left off -Apply)
Result: 1 new sticky-note(s), 4 already registered (skipped).
                  β”” added this run       β”” already had cards, left untouched
Flag Meaning
(none)
Dry run β€” lists what it would do, writes nothing.
-Apply
Actually write the card file(s).
-ProjectPath "<path>"
The folder you opened in VS Code (default: current folder).
-SessionId <id>
Do just one chat, by its id.
-AllProjects
Every project folder under ~/.claude/projects , not just one.

Here's the part that surprises people: there is nothing to "sync." Your messages already live in one shared notebook. No copying, no up. The only trick is each app re-reads the notebook when you OPEN the chat β€” so "syncing" just means open the chat in the other app.

   DESKTOP  ──you type, Claude replies──►  the shared notebook grows
      β”‚
      β”‚   β‘  STOP (let the reply finish)
      β–Ό
   VS CODE  ──open the SAME folder β†’ /resume β†’ pick the chat──►
            it re-reads the notebook β†’ your desktop messages are right there
      β”‚
      β”‚   β‘‘ type, Claude replies β†’ notebook grows again, then STOP
      β–Ό
   DESKTOP  ──re-open the chat from the sidebar──►
            re-reads β†’ your VS Code messages appear
πŸ”΄ THE ONE GOLDEN RULE
   Only ONE app "live" on a chat at a time.
   Finish your turn β†’ STOP β†’ switch β†’ open/resume β†’ continue.
   Never type in both at the same second (both would scribble in the same
   notebook at once and could smear a line).
   When you return to an app, OPEN THE CHAT FRESH so it re-reads from disk β€”
   don't trust a tab you left sitting open; it may still show the old page.
1. Go to:  C:\Users\<you>\AppData\Roaming\Claude\claude-code-sessions\<guid>\<guid>\
2. Find:   local_<that-session-id>.json
3. Delete it.
4. Restart the desktop app β†’ the chat is gone from the sidebar.

index card. Your actual chat (the notebook .jsonl

) is never touched and stays safe.

Claude Code files each chat under a folder name made from the chat's working directory, where every character that isn't a letter or number becomes a dash -:

C:\Users\Me\Music\my project
        β”‚   (every space / symbol β†’ dash)
        β–Ό
c--Users-Me-Music-my-project        ← the "drawer" inside  ~/.claude/projects\

That's why the exact folder matters: a parent folder, a subfolder, or a renamed folder becomes a different drawer β€” and therefore a different list of chats.

Windows only(it uses Windows paths + PowerShell). Pull requests for macOS/Linux desktop paths are very welcome.** The title is a best guessfrom the chat's first message β€” rename it inside the app if you like.- The card stamps default settings(model, effort, no MCP tools). When you open the chat, the notebook is the source of truth**; the card's settings are just defaults for the listing. - Tested against the Claude Code desktop app's card format as of mid-2026. If the desktop app changes that format later, the script may need a small update. Community tool, not affiliated with Anthropic.

MIT β€” see LICENSE. Use it, fork it, share it, ship it.

── more in #developer-tools 4 stories Β· sorted by recency
── more on @claude code 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/how-to-sync-messages…] indexed:0 read:12min 2026-06-20 Β· β€”