Releases: powoct/claudian-session-sync
Release list
0.3.5
Install or update via BRAT: powoct/claudian-session-sync. See the README for setup.
Upgrading from 0.3.4 needs nothing from you.
If you use Claudian 2.3.3 or later, read this if you turned on either optional records feature
Claudian 2.3.3 changed how it deletes a conversation: it now removes the conversation's record and leaves nothing behind, where it used to leave a small marker saying "deleted". Assign to this device changed the same way.
With the default settings, nothing changes for you. A deleted conversation's record is gone, so its session file simply stops syncing — exactly as before.
Two optional features, both off by default, relied on those markers, and are not yet compatible with Claudian 2.3.3:
- Claudian conversation records — for vaults whose own sync cannot carry
.claudian/, such as Obsidian Sync. A conversation you delete can come back after you restart Obsidian, because the next sync restores its record from the sync folder. Your other devices keep it either way. - Share this device's conversations — a conversation you delete can come back after a restart if you started it in that Obsidian session or used it shortly before closing Obsidian. A conversation another device deleted, or assigned to itself, can also be shared again from this machine.
No conversation is lost — no session file is ever deleted, and everything overwritten is backed up. A deleted conversation may simply reappear.
This release does not change how syncing works. It tells you, while either feature is on: directly under that setting, at the top of every sync report, and once each time Obsidian starts. It says nothing if your Claudian is older, if it cannot tell which version you have, or if neither feature is on.
Two things it cannot see:
- It only knows this device's Claudian. The sharing problems start as soon as any of your devices runs Claudian 2.3.3, so upgrade them together, or turn sharing off on the ones you have not upgraded yet.
- Obsidian Sync users: Obsidian Sync carries Claudian's small
manifest.jsonbut not Claudian itself, which is over its size limit. So a device can report one version while it runs another. Update Claudian on every device.
A proper fix is being worked on.
Also in this release
- "Assign to this device" is not supported while sharing is on. With Claudian 2.3.3 or later on any of your devices, the next sync moves the conversation back to where all devices can see it. To keep a conversation on one device, turn sharing off and leave it off.
- Corrected advice. The warning that sharing carries folder permissions as absolute paths now applies only if a device still runs Claudian 2.2.6 or earlier, because Claudian 2.2.7 removed that feature. The README now tells you to move a record rather than copy it, and to do it while Obsidian is closed on the device that created the conversation.
- The one new thing this plugin reads is Claudian's
manifest.json, to learn its version. The README's disclosure table now lists it.
For the record
gh attestation verify main.js --owner powoct
The main.js here was built by the release workflow from this commit, not uploaded by hand, and is byte-for-byte identical to a local build of the same commit. It has not been checked on a real Obsidian install yet; the one thing to confirm there is that the warnings appear. Full technical record in docs/zh-CN/ (Chinese).
0.3.4
Install or update via BRAT: powoct/claudian-session-sync. See the README for setup.
Upgrading from 0.3.3 needs nothing from you.
If you use Codex on two machines, some conversations may have been stuck in a loop
Two machines can end up holding the same Codex conversation written two different ways. Not different content — the same turns, the same records, in the same order, with the fields inside a line written in a different sequence. Codex does that on its own: the order is randomised each time it runs, so two machines converting the same old conversation produce files that differ in bytes and in nothing else.
This plugin compared bytes, so it called that a disagreement and set both copies aside for you to choose between. Then choosing made it worse: whichever version you kept became the new one the other machine disagreed with. Answer it there and the first machine disagrees again.
It does not end on its own, and answering it does not end it. Measured over five days: ten conversations going back and forth, with a fresh prompt to choose each time.
This version recognises that the two versions say the same thing and takes the one in your sync folder, on every machine. Nothing is asked of you and nothing is lost — the copy it replaces goes to your backups like any other. If you have been choosing "keep this machine's version" on Codex conversations that will not stay resolved, this is why, and it should stop after a sync or two on each machine.
Only field order is forgiven. Two versions that differ in anything else — a different reply, an edit, one machine further along — are still a disagreement and still come to you.
Notes
- A dry run was writing one file. Setting up a sync folder you are not sure about and running a dry run would still write this machine's identity file into the plugin's own state folder. It no longer does, and the report says what it skipped.
- Your machine's identity no longer changes when its name does. On a Mac without a fixed hostname, the name moves on its own as you change networks, and this plugin used to treat that as a different machine and forget everything it had observed — including the record that stops a deliberately shortened conversation from being silently restored. One machine changed identity nine times in a day. The name is now just a label.
- Not verified on real machines. This release is carried by 1,083 automated tests including two-machine simulations, CI on Linux, macOS and Windows, and deliberate sabotage of each fix to confirm the tests catch it. What has not been done is a round on two real machines with real Codex conversations — every earlier release had one. If you hit something odd, that is worth knowing when you report it.
For the record
gh attestation verify main.js --owner powoct
The main.js here was built by the release workflow from this commit, not uploaded by hand. Full technical record in docs/zh-CN/ (Chinese).
0.3.3
Install or update via BRAT: powoct/claudian-session-sync. See the README for setup.
Upgrading from 0.3.2 needs nothing from you.
If you use Codex and have ever rewound a conversation, some of it was not syncing
Codex changed how it names a conversation's file. When you rewind — undo back to an earlier point — it does not rewrite the file. It writes a new one, leaves the old one exactly where it was, and remembers internally which is current. The new file is named slightly differently, and this plugin did not recognise the new shape.
The consequence was the bad kind of quiet. The rewound conversation's newest history never left the machine, while the older file kept syncing normally and the plugin reported up to date every time. Nothing looked wrong from here; the other machine simply had less than you did.
Both files now travel, which is what Codex expects — it keeps the old ones on purpose.
Nothing you already have changes. For a conversation you have never rewound, the naming is what it always was, and this release moves nothing on disk.
And the part meant to stop this happening again
That was the third time something upstream changed shape and this plugin went silent about it rather than wrong: Claudian moved its records into a new folder, this plugin published records when you only meant to look, and now Codex renamed a file. Each time the plugin did not make a mistake — it said nothing, which is harder to notice and took longer to find.
So Codex's sessions folder is now counted, not just read. Any file there this version cannot make sense of is reported by name, in Show last sync report under Notices:
Codex's sessions folder has 1 file(s) this version does not recognise and will not sync (…). If Codex has been updated, this plugin probably needs to catch up — the conversations in them are not travelling.
It deliberately does not try to work out why a file is unfamiliar, which is what lets it fire for shapes nobody has seen yet — including the compressed .jsonl.zst files Codex is preparing but has not switched on. Normally that notice is absent, and files your sync tool or this plugin created are not counted, so it stays worth reading.
If you see it today, the file it names is one whose conversation is not reaching your other machines — that is worth knowing either way.
Notes
- A sync pass could be brought down by a single long file name. The failed backup was meant to cancel just that one file's update; instead it stopped the whole pass, for every CLI. It now cancels only what it was protecting, and says which error it hit.
- Codex conversations started outside Claudian are still not synced, and that has not changed — this plugin syncs the conversations your vault has a Claudian record for. Worth stating because a rewound conversation started from a bare terminal will not appear no matter what this release fixes.
- Not measured yet: whether Codex's compression, once enabled, needs more than the warning above; and the two-machine case for rewound conversations — this round was verified on one machine.
For the record
The build published here is byte-for-byte the build that was acceptance-tested (f891de1b…), and you can check its provenance:
gh attestation verify main.js --owner powoct
Full technical record — including the four corrections the acceptance run made to its own script, and the one observation that looked like a defect and was not — is in docs/zh-CN/ (Chinese).
0.3.2
Install or update via BRAT: powoct/claudian-session-sync. See the README for setup.
Nothing about syncing changes in this release. It exists to clear the Obsidian community listing's automated review, which failed 0.3.1 on two source-code errors. If 0.3.1 is working for you, updating changes only the things below.
What the review asked for
-
The
electronimport is now a plain literal. It used to be built at runtime purely to stop the compiler resolving a module it had no types for — which, to a reviewer, reads as importing a module chosen at runtime. It never needed to be:electronwas already excluded from the bundle. Same behaviour, honest shape. -
The settings pane no longer repeats the plugin's own name as a heading; Obsidian already prints it above the pane.
-
Timers come from
window. In a popout window that is a different object from the global one, and a timer created through one cannot be cancelled through the other. -
Release assets now carry build provenance. You can verify that the
main.jsyou installed was built by this repository's release workflow from this commit, rather than uploaded by hand:gh attestation verify main.js --owner powoct -
authorUrlpoints at the author rather than at this repository (fixed just after 0.3.1 was published).
Also removed a handful of type assertions that were doing nothing.
Still outstanding, on purpose
Obsidian 1.13.0 introduced a declarative settings API, and settings panes that do not adopt it are missing from the settings search. This release does not adopt it, because it is all-or-nothing: display() stops being called entirely once the declarative definitions exist, so the whole pane — which changes with sync state, lists whichever CLIs you have enabled, and gates the first enable behind a dry run — would have to be rebuilt at once. That is worth doing on its own, not folded into a review fix. The old method is deprecated, not removed, and the pane works normally meanwhile.
0.3.1
Install or update via BRAT: powoct/claudian-session-sync. See the README for setup.
Upgrading from 0.3.0 needs nothing from you. If you turned on "Share this device's conversations with your other devices" in 0.3.0, this is not optional — read the first section.
Sharing a conversation stopped working after the first sync, and said nothing
In 0.3.0 the setting moved each conversation's record into the layer your other devices read, and that was supposed to be the end of it. It was not.
Claudian decides where to save a given conversation once per session, when Obsidian starts. Our move happens after that decision, so from that moment its decision is stale: the next time you send a message, rename the conversation, or it simply records usage, Claudian writes a second copy back into this device's own folder — and it reads that one in preference to the shared one. Your other devices keep reading the copy from the moment of the move, frozen, while this machine goes on without it. On the machine that reported this, six conversations were in that state and the worst had left the other machines three days behind.
It gets worse if you then delete such a conversation: the deletion was recorded in this device's folder only, so the shared copy survived with nothing marking it deleted — and the conversation came back on the next restart.
Both are fixed. Sharing is now a reconciliation that runs on every sync rather than a one-time move: if the shared copy is still exactly what this machine last published, this machine's newer version is folded forward onto it. If a different machine has since written it, nothing is overwritten — both are kept and you decide, through the new command below. And a deletion now carries across, so a conversation you deleted stays deleted.
Records that are already stuck in this state are not repaired automatically. They cannot be: this machine cannot tell "the other machine is simply behind" from "the other machine edited it too". Use the command below.
New: Repair shared conversation records
Lists conversations whose two copies have diverged, showing both sizes and both dates so you can see which is which, and offers to publish this device's version — one conversation at a time, because each of these is a separate fork and a decision about one says nothing about the next. The version it replaces is copied into your backups first, and if that copy cannot be taken the write does not happen.
Opening this screen only looks; it changes nothing.
Notes
- A conversation you rewound is still safe. No change here — that was 0.3.0 — but the reconciliation above never overwrites a version it did not itself publish, which is the same rule from the same direction.
- An emptied "storage folder" box now really clears it. Before, clearing the field left the old path in place with no way back except editing files by hand.
- When publishing does not happen, the message now says which reason. "A sync is running, try in a moment" and "it changed again while this was working" are different situations and only one of them is worth retrying.
.claudian/sessionsis another program's directory, and this release is mostly about respecting that. Two acceptance rounds on real hardware each passed their gates and then turned up a place where the plugin wrote when it should only have read; both are fixed, and the second is now impossible to reintroduce by accident.
For the record: what was tested, and what shipped
The two acceptance rounds ran against builds 7c0bbad2 and 6afa3ccb. Each round found something after passing, so the build here (5d2da4a9) is not byte-identical to either. The differences are the fixes those rounds produced — every one of them removes a write, narrows a scope, or sharpens a message. Nothing in this release writes anywhere the accepted builds did not.
Full technical record, including what was measured, what was assumed, and every deviation the acceptance operators logged rather than smoothed over, is in docs/zh-CN/ (Chinese).
0.3.0
Install or update via BRAT: powoct/claudian-session-sync. See the README for setup.
Upgrading from 0.2.0 needs nothing from you. One setting changes on its own, and it is described at the bottom.
If you are on Claudian 2.2.5, 0.2.0 stopped syncing new conversations — silently
This is the reason to update. From 2.2.5 Claudian files each new conversation's record under the device that made it, in a folder that did not exist before. This plugin looked in one place, did not find the record, and concluded the conversation was not one of this vault's. So it synced nothing — no line in the report, no notice, and the status bar saying up to date the whole time, because from the plugin's point of view there was genuinely nothing to do.
Conversations from before 2.2.5 were unaffected, which is what made it hard to notice: everything old kept working.
Fixed, and verified on two machines rather than only in tests — a bug whose symptom is nothing happening is exactly the kind that passes a test suite.
The same failure will not be silent next time
The plugin now says which folders inside Claudian's conversation store it did not read. Normally that list is empty and you will never see the notice. If Claudian moves its records again, it appears in Show last sync report under Notices, naming the folder:
Claudian's conversation store has folders this version does not read (…). Conversations recorded in them are not synced. If Claudian has been updated, this plugin probably needs to catch up.
That is the whole point of this one. The cost of the bug above was not the bug, it was the weeks it could have run without a word.
A conversation you rewound is no longer quietly put back
Grok's rewind was measured, on a real machine, at byte level: it truncates the history file in place. The version left behind is a strict prefix of the one still sitting in the sync folder — which reads exactly like "this machine is behind", and 0.2.0 acted on that reading and pulled the longer version back. The rewind was undone, without a word, and the same pass pushed the post-rewind state of a neighbouring file out, leaving a mix neither machine had ever had.
Now a file that has shrunk below a point both sides once agreed on is a conflict: both versions are kept, nothing is overwritten, and you choose. The rest of the session's files stop travelling until you do, so no half-state gets published on your behalf.
The window was only ever open between a rewind and your next message. That sounds narrow, and it is — unless you rewound in order to drop something and then closed the terminal, which is the use that matters most.
/compact rewrites the file wholesale rather than truncating it, so it already landed on the safe branch. Both are measured and written down.
New: share this device's conversations with your other devices
Off by default, and set per machine — turning it on here does not turn it on there.
On 2.2.5, a conversation you start on one machine is missing from the other machine's sidebar even after its session file has arrived. Resuming from the CLI works; the entry in the list is what is absent, because Claudian reads only its own device's folder.
This setting moves each of this machine's conversation records into the layer every device reads. All of them then list it, and all of them write to the same one — rename it on the laptop and the desktop shows the new name.
Three things to know before you turn it on, all of them in the setting's own description:
- It moves the record rather than copying it. There is one of it, so there is no second version to drift. (An earlier design copied; it was withdrawn before shipping, because two writable copies of one conversation never converge and a deleted conversation would come back.)
- Turning it back off stops further moves but does not un-share what has already been shared. Moving records back would be a second destructive write, on records the other machine may be using.
- A shared conversation carries any folders it had been given access to, as absolute paths. On the other machine those paths may point at something else. This is not new exposure — it is exactly what every conversation looked like before 2.2.5 — but it is worth knowing.
The button labelled Assign to this device that appears on a shared conversation does the opposite of this setting: it takes the record for one machine and makes it vanish from the others. It sits next to the delete icon.
The quiet window is 15 seconds now, and this one may change under you
A file is only written when both sides have held still for a while. That wait was 3 seconds, which was a guess. It has been measured: sampling a single Grok turn at 100 ms, the session held entirely still for 3.3 seconds mid-turn — long enough for the old default to conclude a turn had finished when it had not. The new default is 15 seconds.
If you had never changed this setting, it moves to 15 seconds on upgrade. If you had set your own value, it is kept — with one honest exception: if your value was exactly 3000, we cannot tell you from someone who never touched it, so it moves too. Set it again if you meant it. Passes are five minutes apart; the extra twelve seconds are not something you will feel.
Notes
- A half-copied session can now be cleared. If a sync pass is interrupted partway through a multi-file session, the leftovers are listed and removable — and never removed without you asking.
- Which vault this machine is bound to is now decided by the vault that is actually open, not by whichever one sorted first. This only ever mattered if you opened this plugin in more than one vault.
- Not measured yet, and written down as such: Codex did not take part in this round's two-machine run; carrying one conversation record over both your vault sync and this plugin at the same time; and two machines creating, editing and deleting the same record at the same moment.
Full technical record — including what was measured, what was assumed, and the three deviations the acceptance operator logged rather than smoothed over — is in docs/zh-CN/ (Chinese).
0.2.0
Install or update via BRAT: powoct/claudian-session-sync. See the README for setup.
Upgrading from 0.1.0 needs nothing from you — your sync folder, workspace identity and provider settings carry over, and every provider stays exactly as you had it.
Grok
Grok is supported now, and off by default like every provider.
A Grok session is not a file, it is a folder, and its files do not agree about how they are written: the conversation history is appended to, while the record that makes the session visible to the CLI is rewritten whole every time Grok starts. So they travel under different rules — the history merges by prefix, the record only ever fast-forwards from a version this machine has seen both sides agree on, and anything ambiguous becomes a conflict you decide rather than a guess.
What travels is the conversation and its history. The files Grok rebuilds by itself — its prompt context, its system prompt, its event log — are deliberately left where they are, partly because copying them buys nothing and partly because one of them holds this machine's paths. Seeing more files on the other machine than were synced is expected, not a bug.
Measured on macOS and Windows before shipping, and verified end to end across two machines in both directions: start a conversation on one, resume it on the other with its full history, continue, and come back.
Claudian conversation records (optional, off by default)
Carries the entries in Claudian's own sidebar — titles, and which CLI session belongs to which conversation — for setups whose vault sync cannot carry .claudian/. Obsidian Sync drops hidden folders; git and Syncthing usually do not.
Leave this off if your vault sync already carries .claudian/. Two transports over one folder is how a sync tool is handed conflicts to manufacture copies from.
Getting a version back
Every overwrite has always kept the version it replaced. Until now that promise lived on disk and nowhere else — you could only reach it by digging through folders. There is now a screen that lists what was kept, and each row says what restoring it will actually lead to before you press anything: nothing, a revert the next sync will undo, or a conflict where both versions survive and you choose. Restoring is itself reversible.
Also: Show me the folder now opens the folder, and the two commands that write on your behalf — resolving a conflict, restoring a backup — take the same lock and re-check the sync folder at the moment you click, rather than trusting what the last sync pass concluded.
Turning a provider on now shows you the scope first
Enabling a provider decides which of this machine's existing conversations start travelling, and that set is usually larger than the one you have in mind — it is every conversation this vault has a Claudian record for, not just today's. The first time you switch one on, a dry run happens immediately, writes nothing at all, and tells you to open Show last sync report before anything is copied.
Notes
- Where backups live changed. They now sit under a per-session subfolder, because Grok is the first provider whose file names repeat across sessions and a flat folder could no longer say which session a backup came from. Backups written by 0.1.0 stay listed and restorable where they are.
- A conflict can appear with only one machine involved. If a sync pass copies a session while the CLI is still writing it, the finished version may not be a continuation of what was copied. Nothing is lost — both versions are kept and you pick one — but it is worth knowing that it does not always mean two machines edited the same conversation.
- Grok's rewind and
/compacthave not been measured yet. If either rewrites history in place, it shows up as a conflict with both versions kept, never as lost bytes.
Full technical record, including what was measured and what was not, is in docs/zh-CN/ (Chinese).
0.1.0
Install via BRAT: powoct/claudian-session-sync. See the README for setup.