Releases: xooooooooox/obsidian-config-sync
Release list
2.23.0
Update every device before you sync
Your settings move to a new format again. A device still on 2.21.0 or 2.22.0 will meet the new format, decline politely and tell you to update — nothing is damaged. A device on 2.20.0 or earlier will reset its setup to defaults, and that cannot be undone. So update everywhere before letting any device capture or push. The store itself is untouched — only the plugin's own settings migrate, the first time this version opens them.
One behaviour change deserves its own paragraph. A plugin you never wrote a rule for now follows the shared on/off list, once that list itself is synced. The first sync after upgrading therefore converges whatever switch differences had silently accumulated between your devices — some plugins may turn on or off. If you kept a plugin deliberately off on one device only, say so before you sync — its card's Enabled on row is where that choice lives. The long form lives in Updating from 2.21.0 and earlier.
Why
Whether a plugin is on, and which devices a rule covers, used to be one tangled choice. This release finishes the split that 2.22.0 started: the shared rules travel with your store, and this device's own exceptions stay on this device. Every device reads the same rules and then applies its own exceptions — no more guessing which device's list wins.
Changed
- On/off has two clean layers. Shared rules (everywhere, per device class, or per item) live in the store; a "just here" exception never leaves the device that made it. The precedence is fixed and small: your exception on this device, then a rule for the item, then the device class, then the shared list.
- One word each: an item is synced, a plugin is enabled. Cards, filters and search all follow.
- The settings drawer speaks the Sync Center's language. The same rows, the same pickers, the same lock — no second dialect to learn. Card headers show compact badges with counts instead of word-tags.
- Per-key rules are edited like everything else. Each pattern is a row with the sharing picker and the lock; the File preview underneath lets you click any key to add a rule for it. The old four-option dropdown — which could not even express every combination — is gone. Editing a rule no longer makes the panel flash.
- A rule that encrypts a whole file keeps its encryption when you later change its sharing from the Sync Center. Before, that edit silently downgraded the file to plain text on the next capture.
- Destructive switches ask first. Leaving Per-key rules (that deletes the key rules), changing a rule from file to folder, and deleting leftover store files all confirm, with the consequence spelled out.
- Validation errors are readable. A problem pins a boxed message under the thing that caused it and says what to fix — no more bare warning line at the bottom of the page.
- Discovered files hold still. The list keeps one stable order; turning a file on changes that row only. The drawer now names the file it belongs to, and its type can no longer be flipped to something the file isn't.
- Leftover store files got a real face. Grouped by section, named by what they belonged to, collapsed by default, with an amber filter pill while any exist and a confirm before deleting.
- The remote form is shorter. No Username field — a linked token is enough, self-hosted included. Browse sits inside the path box; the token's explanation lives in a tooltip instead of a paragraph.
- The sidebar is quieter. The remotes group lost its header and its own refresh button — the panel's one refresh re-checks the remotes too.
- Search reaches further.
section:now also finds folders and custom rules; a remote whose store carries no lock is refused with a message that says so, instead of failing later.
Screenshots and the guide were redone for the new look. Node suite at 1636 tests.
2.22.0
Update every device before you sync
This one is different from 2.21.0, so please read this part first. Your settings and your store move to a new format. A device still on 2.21.0 will meet the new format, decline politely and tell you to update — nothing is damaged. A device on 2.20.0 or earlier will reset its setup to defaults. So update everywhere before letting any device capture or push.
Nothing else is asked of you. Your settings migrate the first time this version opens them, and your store is read as it is until a capture or a pull rewrites it.
Why
The same idea had three different names depending on where you were standing. scope: meant the settings area in one search box, the item category in the other, and — in the file that stores your choices — which devices share a value. Classification was buried inside identifiers, so the plugin was forever reading a category back out of a name. And two settings each rolled two unrelated choices into a single list.
Changed
scope:is nowsection:in both search boxes. The old word had to go, because it named three different things. There is no alias:scope:communityfinds nothing now, andsection:communityis what you want. The settings box keeps its own extra values —general,advanced,remotes.- Where an item runs and where it is forced on or off are two separate choices, instead of one list mixing them. One consequence to know about: choosing Runs on → Computers only (or Phones only) now also decides whether that item takes part in Capture and Apply. Before, that choice was read by the menu and nothing else.
- Sharing a value says what it means: shared everywhere, kept per device class, or never leaving this device. A whole-file rule can no longer be set to This device — it never worked, and now it cannot be asked for.
- Search still matches exactly what it matched before. Only the word changed.
Two smaller differences worth knowing
- After the migration, a community plugin whose card you had switched off, and which is not installed on this device, loses its card until you install it here. Its settings and its rules are untouched; only the card is gone.
- On a store still in the old format, an item's display name can look stale until the next capture or pull. The startup name-repair no longer rewrites a store it did not write, because doing so produced a file that older devices could neither refuse nor read.
Node suite at 1515 tests.
2.21.0
Nothing is deleted just because this device can't read it
Your settings travel between your devices, and your devices don't all update on the same day. This release is about what happens in that gap: a device that meets something it doesn't understand now keeps it, instead of quietly deleting it and telling everyone else to do the same.
You don't have to do anything after updating. Two things are worth knowing, and they're at the bottom.
Fixed
- An item you sat out on one device could come back. Stop syncing → On this device was stored in the shared settings, keyed by an identity that never leaves the machine it belongs to — so the first time another device's settings arrived, your choice was erased and the item reappeared in To apply. It now lives on the device that made the choice, where nothing can overwrite it. This was a real data loss introduced in 2.20.0; if an item you sat out has come back, set it again and it will stay.
- An older device no longer strips a newer one's bookkeeping. The store's record of what was captured, and when, was rebuilt from a fixed list of fields every time it was read — so a device on an older version silently dropped anything a newer version had written, then published the loss to the store. It is now carried through untouched.
- A rule this version doesn't recognise is left alone. A Runs-on choice written by a newer version used to be deleted on sight and the deletion shared with every device. It is now ignored where it's used and left exactly as found.
- A device without BRAT no longer empties the shared beta list for the devices that do have it.
Added
- Settings from a newer version are refused, not reset. A device that opens settings written by a version it doesn't understand says so plainly, changes nothing, and declines every action that would write — instead of starting fresh and overwriting your setup at the next save. The same is true of a store written by a newer version: Capture, Apply, Pull and Push all decline rather than overwrite what they can't read. The check happens before anything is written, not after.
- "The store has newer settings" now answers by content. Each item records its own capture time and a fingerprint of what was stored, so the prompt reflects what actually differs rather than which clock ran last — and a fleet where some devices have updated and some haven't stops producing hints for changes that were never made.
Changed
- Settings added inside a nested option now fall back to their default when an older document is loaded, instead of arriving empty.
Two things worth knowing
- If you used Stop syncing → On this device before this release, check it. The bug above may already have erased it. Setting it again is all it takes.
- This choice now lives on the device, not in your synced settings — so it isn't part of a backup, and a device you reinstall or replace will need it set again. Everything else is unchanged.
Node suite at 1394 tests.
2.20.0
One device can sit an item out
Some things belong on one machine and not another — a sync plugin you only run at home, a plugin your laptop has no use for. Until now the only choice was syncing an item everywhere or dropping it for every device. Now a single device can quietly sit an item out while the rest of your devices carry on.
Added
- Stop syncing, on this device or everywhere. An item's card offers both: On this device takes effect immediately and is undone from the same menu; Everywhere still asks first and can clean up the stored copy, exactly as before. An item you've sat out reads Not synced on this device, drops out of every count and the select-all, and is skipped by Apply and Capture alike — your other devices keep syncing it, and nothing in the store changes.
- A place to find what you've sat out. Items excluded by your own rules now fold into their own line,
1 item not synced on this device, with a matching Not synced here filter — so "in sync" counts only what's genuinely in sync.
Changed
- The list reads as a list again. Section bodies sit on their own filled surface with the header above them, an expanded item's detail panel steps down to an outline, and the summary lines at the bottom of a section — in sync, not synced here, no settings yet — now use the same leading chevron and evenly-weighted icons as everything else. A section with nothing but summary lines no longer shows an empty block.
- Typing in the filter is instant. The sidebar filter used to rebuild the entire panel on every keystroke and visibly lag behind fast typing; it now settles once you pause, and the work behind it is a fraction of what it was.
Node suite at 1274 tests.
2.19.0
A phone layout that breathes
The Sync Center on mobile was rebuilt around one constant: every item's first line is just its name, what a run would do, and the checkbox — nothing else competes for that line. Everything secondary moves out of the way, deliberately.
Changed
- Badges get their own line. Any item with badges — even a single
encrypted— shows them on an indented line under the item, so the action sentence is never squeezed into fragments. Items without badges stay compact on one line. When a badge line is too tight for full text, the whole group shrinks to bare icons; tap one to read it. - Section headers are one clean line again. Full section title, a compact
5/73count, the select-all checkbox — and the on/off-list sync control is now a small toggle icon (green when the list syncs, grey when it doesn't). Tapping it offers the same choices as before; press and hold to read its state. - The expanded card stacks for the small screen. Each detail now renders its label above a full-width value instead of cramming both side by side — long values stop folding into narrow columns.
- Choosing a conflict side works on a phone.
Use theirs ↓/Keep mine ↑split the card's full width half-and-half with comfortable touch targets — no more clipped button.
Desktop rendering is unchanged in this release.
Node suite at 1217 tests.
2.18.0
Badges you can read at a glance — on any screen
Every fact badge in the Sync Center now carries its own icon, and the whole panel learned to shrink honestly: names are never cut short, badges never wrap into a mess, and on a phone the list restructures itself instead of squeezing.
Changed
- Every badge has an icon.
not installed here,desktop only,stays off,encrypted, the your-rule family, andyour choiceeach render a small themed icon beside their text — one consistent visual language across the list (and no emoji anywhere). - Narrow panes degrade gracefully. Three rules now govern tight spaces: an item's name is never truncated; badges never wrap or clip — when they don't fit, the row's badges shrink together to icon-only form, with the full text a hover (or tap) away; only the action sentence gives way, shortening down to its direction arrow, since the expanded card repeats it in full.
- The phone layout is deliberate, not squeezed. Section headers keep their full title on one line, with the on/off-sync badge on its own line beneath; counts compact to
2/73; the per-section "N selected" note is gone (the checkbox state and the footer already say it). Items with two or more badges move them to their own line under the item's name and sentence — nothing overlaps, nothing wraps mid-word. - A newer installed version says what capture records. A plugin whose settings are in sync but whose installed version is ahead of the store now reads
Records version X, and its card explains: capture records the newer version so your other devices can update. No more "shares your settings" claim when settings are identical.
Fixed
- The checkbox at the end of a row no longer gets pushed out of its column in a narrow desktop pane.
- Section headers no longer wrap onto two broken lines on a phone.
- The encrypted badge is a themed lock icon everywhere (the last emoji left the panel).
Node suite at 1217 tests.
2.17.0
The Sync Center speaks one language
The main list, the remote panes, and the run reports were redesigned around a single grammar: one item, one row, one sentence that says exactly what Apply or Capture would do — Installs from the community catalog · turns on · applies settings, Records version 2.2.3, or simply — No settings yet. What you read is what a run will execute; counts, filters, and the footer all derive from the same sentence, so they can never disagree.
Changed
- One item, one row. A plugin's companion files and folders fold into the plugin's own row — its sentence and file list cover the whole family. The main list groups into four sections (Obsidian, Core plugins, Community plugins — beta installs included — and your custom folders), each with its own select-all and count.
- Rows state their consequence, not their state. Direction glyphs (
↓apply,↑capture) pair with a verb sentence; chips carry the facts (not installed here,desktop only,stays off,encrypted,your rule). Items with nothing anywhere readNo settings yetand fold away; items your own Settings-sync rule excludes sayNot synced on this deviceinstead of masquerading as "In sync". - Conflicts resolve in place. An item changed on both sides offers
Use theirs ↓/Keep mine ↑on its card — no more choosing a global direction and hoping. - Your other devices' panes speak the same grammar. A remote pane renders the same rows, the same folded companions, and summarizes on/off differences per plugin by display name. Expanded folds survive refreshes.
- A newer installed version says what capture records. A plugin whose files are in sync but whose installed version is ahead of the store reads
Records version X, and its card explains: capture records the newer version so your other devices can update. - Run reports separate failure from notes. Only real failures show the issue-toned
✗ Applied with N issuesstrip; a successful run with remarks readsApplied · N notes, with notes in amber — a version that fell forward during install is a note, never a fake failure. On/off changes that need an app reload restore the Reload prompt reliably. - A brand-new device gets honest guidance. With no store on the device yet, the pane says so and points at Pull (with an Open-remote shortcut) instead of offering to adopt a configuration that isn't there. Adopt imports the store's full self-configuration — including which plugins are beta installs.
- Items keep their names everywhere. Display names are recorded in the store and heal older stores automatically, so your other devices' panes and on/off summaries show real names instead of plugin ids.
- Partial on/off staging writes exactly what you selected. Checking some of a section's rows applies or captures only those plugins' on/off state; force-on/off choices scope to the staged set.
- Menus only offer what works. Per-key-rule items no longer show a whole-file scope menu whose choice was silently discarded; empty sections drop their dead select-all checkbox; every control either takes effect or doesn't appear.
Fixed
- Unchanged encrypted fields now keep their stored envelopes byte-for-byte: capture no longer rewrites every secret on every run, and diff previews stop flagging unchanged encrypted values as changes — the preview shows exactly what capture would write.
- Full-list rendering is about 3× faster, and expanding or collapsing sections and folds no longer repaints the whole panel.
- The encrypted badge is a themed lock icon; the panel is emoji-free again.
Node suite at 1212 tests.
2.16.0
A new device no longer offers to delete your other devices' core-plugin settings
Set up a fresh device and the store's copies of core plugins you hadn't turned on here used to pile up under Leftover in the store — labeled "Safe to delete", with a Delete-all button pointed at settings your other devices were actively using. Those files were never leftovers. They now show up where they belong: as ordinary To apply rows under Core plugins that clear on their first Apply, leaving Leftover to mean only files for items you stopped syncing. The two-way on/off state got the same cleanup: one grouped list instead of a red warning box and a pop-up.
Changed
- A disabled core plugin is a real item, not a leftover. Its store settings attach to its card even while the plugin is off here — Apply writes them (and can enable the plugin), Capture with no local file safely reports "nothing to capture yet" and leaves the store alone. Device scope works exactly like a community plugin's.
- A two-way split reads like one list. When some plugins are on only here and others only in the store, the item now shows two summary lines (Apply first), a one-line caution, and a single per-plugin rule list grouped by direction — "Off this computer · N" and "On this computer only · N" — replacing the red diverge box and the "Keep extras on this device" pop-up. Pinning a plugin to this device does what Keep did, one plugin at a time.
- One-sided lists stay plain. When every pending plugin points the same way, the rows carry no direction labels — the summary line above already says it once.
- CSS snippets keep their two-way warning, in snippet wording; where each snippet runs stays on the Appearance card in Settings.
- The decision leads the layout. The summary and rule list render above the "scoped to specific devices" section, and the item header's duplicate "· N device-scoped" note is gone.
Node suite at 890 tests.
2.15.0
Turning on another device's plugins is one line and one click, not a wall of repeats
Open Config Sync on a freshly set-up device and the community- and core-plugin on/off list used to print a separate row for every plugin that's on elsewhere but off here — each repeating the same sentence, each with its own pop-up menu. On a new machine that was dozens of identical rows for what is really a single decision: apply, and turn them all on.
Now the list leads with one line that says what Apply will do, and keeps the detail out of the way until you ask for it. Open Set a per-plugin rule only when you want to pin a specific plugin to desktop, mobile, or this device — and that control is now the same click-to-cycle icon you already use on the settings cards, so both places work the same way. Plugins you've already scoped sit in their own short list.
Changed
- The plugins on/off view leads with a summary, not a per-plugin flood. One line states what Apply will turn on; the full per-plugin list is a collapsible "Set a per-plugin rule" you open only when you need it, with a search box for long lists.
- Where a plugin runs is set with the same control as Settings. A plugin's scope is now the click-to-cycle icon — all devices → desktop → mobile → this device — used on the settings cards, replacing the old pop-up menu. One gesture in both places; desktop-only plugins skip the mobile stop automatically.
- Already-scoped plugins get their own short list. A "scoped to specific devices" section shows the plugins you've pinned, each editable in place.
Nothing about how settings are stored or synced changed — only how the list is shown and how you set where a plugin runs.
Node suite at 884 tests.
2.14.2
Device-only settings that already leaked now clean themselves up
2.14.1 taught a capture to drop a "this device" value that had been left in the shared store — but only when that setting was being captured for some other reason. A value already sitting in the store, with nothing else to capture, stayed put: the setting read as in sync, so it was never offered for capture and never cleaned. This release closes that gap: such a setting now surfaces as "to capture" on its own, and capturing it once removes the leftover value from the store.
Fixed
- A "this device" value already in the store is surfaced for cleanup. When the shared store still held a device-only value from an older release, the owning device showed the setting as in sync and gave you no way to clean it. It now appears as "to capture"; one capture removes the value from the store, and the setting returns to in sync on its own.
After updating, the affected setting (for example App settings) shows as "to capture" on the device that owns it — capture it once to clear the value left in the store by an older release.
Node suite at 878 tests.