Skip to content

Releases: msachet5/obsidian-ultisync

1.0.6

Choose a tag to compare

@github-actions github-actions released this 27 Sep 20:34

Fixed

  • Edits made outside Obsidian could go unsynced or surface as conflicts. UltiSync only learned about local changes from Obsidian's own file events, so an edit made by another program, a second git checkout, or a sync client writing straight to disk could sit unnoticed until an unrelated change forced a push. The vault is now rescanned on the regular poll cycle too, so these edits get picked up on their own.
  • Deep-verify could exhaust the GitHub API rate limit on large vaults. Recovering files that were never fully pulled fetches one blob per file; a vault that adopted a large repository without a full initial download could retry the entire backlog on every verify pass and burn through the hourly quota. Recovery is now capped per pass and drains a large backlog gradually instead.
  • The settings page could scroll sideways. The "Saved tokens" dropdown sized itself to fit its longest saved label, which could drag the whole settings page into horizontal scroll. It's now clamped to the available width.
  • Cleared every eslint-plugin-obsidianmd review warning (sentence-case text, the deprecated setWarning() button style, a duplicate CSS declaration).

Changed

  • Raised minAppVersion to 1.13.0 (from 1.7.2) to use the non-deprecated setDestructive() button API and Obsidian's declarative settings API exclusively.

1.0.5

Choose a tag to compare

@github-actions github-actions released this 22 Sep 22:58

Everything from the 1.0.5 betas, released.

Choose what to keep when linking a vault

The starting-point comparison now asks two questions, each only when it applies:

  • Which version wins for files that exist in both places with different contents — this vault, or GitHub.
  • What to do with files only one side has — Keep both (merge), Use only this vault (delete GitHub's extras from the repository), or Use only GitHub (move the vault's extras to the trash).

Everything a choice loses is listed and confirmed before anything moves. A file deleted from GitHub stays in the repository's history; a trashed file follows Obsidian's own Deleted files setting. Files that already match on both sides are recorded as synced and never transferred.

Fixed: "Upload this vault" never actually uploaded a differing file. The push saw an untracked path GitHub already held and reported a collision, so you got conflict copies instead of your version winning.

Push and Reset & re-pull work with Sync off

Both buttons now work whatever the Sync switch says, and both show their progress in the button: it fills from the left as the file count advances, and slides while there is no count yet. Pressing Push on a vault that has never been linked runs the comparison above first, and the choice made there carries the push out; Sync stays off.

Polling reliability

  • A 404 from GitHub's compare endpoint — a synced commit rewritten away, or a replica that had not seen it yet — was treated like a bad token and switched Sync off. It is now read as diverged and reconciled with deletions withheld; only a 404 the repository itself answers stops sync.
  • The branch-ref poll bypasses the platform HTTP cache. requestUrl goes through Chromium's cache on desktop and the system cache on iOS, and GitHub marks API responses cacheable for a minute — long enough for a five-second poll to keep reporting a branch that had already moved.
  • The thorough check on returning to a device runs at most every five minutes instead of on every window focus, and focus and visibility no longer fire it twice.
  • Transient 502/503/504 answers are retried with a short backoff instead of failing the operation.

Saved tokens

Every token that passes the connection check is kept in Obsidian's secret storage for this vault, labelled with the repository and the date. Settings shows a Saved tokens dropdown above the token field whenever there are any: choose one and the field below is greyed out and ignored, or choose Enter a new token to type one.

This is what a reinstall now offers. Uninstalling removes the plugin folder but not the vault's secret store, and Obsidian gives a plugin no hook at uninstall time, so the previous token used to reappear in the field by itself. It is now preselected in that list instead, and taking it up is a deliberate Save.

The reset arrow at the top of settings forgets every saved token, along with the credentials and the plugin's whole record of synced files, conflicts and logs. Its confirmation says so.

Data safety

Reset & re-pull trashed the vault's files, and those delete events armed a push that could have removed up to twenty files from GitHub without asking, before the re-pull brought them back. Vault events are now muted while the plugin moves files in bulk, and every pull write is marked as the plugin's own immediately before it happens rather than once at the start — where the mark lapsed long before a large pull finished, which is also what made "Local changes pending" flicker during a pull.

Smaller

  • Saving credentials that point at a different repository or branch clears the synchronization record, which would otherwise read as mass deletions against the new repository. Saving a new token for the same repository no longer re-runs the comparison.
  • Debug lines no longer rewrite the whole data file per line, and the status panel no longer rebuilds on every keystroke.

1.0.5-beta.3

1.0.5-beta.3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 22 Sep 00:43

Third beta of 1.0.5, for testing via BRAT. Everything from beta.1 and beta.2, with beta.2's token clearing replaced. manifest.json in the repository stays at 1.0.4, so the community directory keeps serving 1.0.4 — only BRAT (with pre-releases) installs this.

New in beta.3: saved tokens (replaces beta.2's clearing)

beta.2 cleared a token left behind by an uninstalled copy. That took a decision away from someone who may have left it there on purpose, so it is now offered back instead. Every token that passes the connection check is saved in the vault's secret store with the repository and date, and settings shows a Saved tokens dropdown above the PAT field whenever there are any. Pick one and the PAT field is greyed out and ignored; pick Enter a new token to type one. Save runs the same check as before. After a reinstall the previous token is preselected in the list rather than filled into the field. The reset arrow now forgets every saved token as well as the credentials and the plugin's whole record of synced files, and its confirmation says so.

Test: uninstall, reinstall, open settings — the dropdown should show your previous token as "owner/repo · …last4 · saved date", preselected, with the PAT field greyed. Save should connect with it.

Choose what to keep when linking a vault

The setup comparison now asks two questions, each only when it applies:

  • Which version wins for files that exist in both places with different contents — this vault, or GitHub.
  • What to do with files only one side has — Keep both (merge), Use only this vault (delete GitHub's extras from the repository), or Use only GitHub (move the vault's extras to the trash).

Everything a choice loses is listed and confirmed before anything moves. A file deleted from GitHub stays in the repository's history; a trashed file follows Obsidian's own Deleted files setting.

Also fixed here: Upload this vault never actually uploaded a differing file — the push saw an untracked path GitHub already held and reported a collision, so you got conflict copies instead of your version winning.

Push and Reset & re-pull work with Sync off

Both buttons now work whatever the Sync switch says, and both show their progress in the button: it fills from the left as the file count advances and slides while there is no count yet. Pressing Push on a vault that has never been linked runs the comparison above first, and the choice made there carries the push out; Sync stays off.

Polling: the "it did not notice the remote change" fixes

  • A 404 from GitHub's compare endpoint (a synced commit rewritten away, or a replica that has not seen it yet) was treated like a bad token and switched Sync off. It is now treated as diverged and reconciled, and only a 404 the repository itself answers stops sync.
  • The branch-ref poll bypasses the platform HTTP cache. requestUrl goes through Chromium's cache on desktop and the system cache on iOS, and GitHub marks API responses cacheable for a minute — long enough for a five-second poll to keep reporting a branch that had moved.
  • The thorough check on returning to a device runs at most every five minutes instead of on every window focus.
  • Transient 502/503/504 answers are retried with a short backoff instead of failing the operation.

Data-safety fix in Reset & re-pull

Trashing the vault fired delete events that armed a push, which could have removed up to twenty files from GitHub without asking before the re-pull brought them back. Vault events are now muted while the plugin moves files in bulk, and every pull write is marked as the plugin's own right before it happens rather than once at the start (where the mark lapsed long before a big pull finished — the cause of "Local changes pending" flickering during a pull).

Smaller

  • Saving credentials that point at a different repository or branch clears the sync record; saving a new token for the same repository no longer re-runs the comparison.
  • Debug lines no longer rewrite the whole data file per line; the panel no longer rebuilds on every keystroke.

Worth testing

  1. A fresh vault against a repo where both sides have unique files: try each of the three "files only one side has" choices, and check the confirmation lists.
  2. Sync off → Push on a never-linked vault.
  3. Reset & re-pull on a vault with more than 20 files, watching that nothing is deleted from GitHub.
  4. Edit on another device and watch the 5s poll pick it up, on both desktop and iOS.

1.0.5-beta.2

1.0.5-beta.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 22 Sep 00:32

Second beta of 1.0.5, for testing via BRAT. Everything from beta.1 plus one fix. manifest.json in the repository stays at 1.0.4, so the community directory keeps serving 1.0.4 — only BRAT (with pre-releases) installs this.

New in beta.2: uninstalling no longer leaves the token behind

Deleting the plugin removed its folder but not the vault's secret store, so the PAT reappeared in a fresh install. Obsidian gives a plugin no hook at uninstall time, so the next install — no data file, but a token still in the store — now clears the token instead of adopting it. An ordinary update keeps the data file and therefore the token. Test: uninstall, reinstall from the directory, and check the token field is empty.

Choose what to keep when linking a vault

The setup comparison now asks two questions, each only when it applies:

  • Which version wins for files that exist in both places with different contents — this vault, or GitHub.
  • What to do with files only one side has — Keep both (merge), Use only this vault (delete GitHub's extras from the repository), or Use only GitHub (move the vault's extras to the trash).

Everything a choice loses is listed and confirmed before anything moves. A file deleted from GitHub stays in the repository's history; a trashed file follows Obsidian's own Deleted files setting.

Also fixed here: Upload this vault never actually uploaded a differing file — the push saw an untracked path GitHub already held and reported a collision, so you got conflict copies instead of your version winning.

Push and Reset & re-pull work with Sync off

Both buttons now work whatever the Sync switch says, and both show their progress in the button: it fills from the left as the file count advances and slides while there is no count yet. Pressing Push on a vault that has never been linked runs the comparison above first, and the choice made there carries the push out; Sync stays off.

Polling: the "it did not notice the remote change" fixes

  • A 404 from GitHub's compare endpoint (a synced commit rewritten away, or a replica that has not seen it yet) was treated like a bad token and switched Sync off. It is now treated as diverged and reconciled, and only a 404 the repository itself answers stops sync.
  • The branch-ref poll bypasses the platform HTTP cache. requestUrl goes through Chromium's cache on desktop and the system cache on iOS, and GitHub marks API responses cacheable for a minute — long enough for a five-second poll to keep reporting a branch that had moved.
  • The thorough check on returning to a device runs at most every five minutes instead of on every window focus.
  • Transient 502/503/504 answers are retried with a short backoff instead of failing the operation.

Data-safety fix in Reset & re-pull

Trashing the vault fired delete events that armed a push, which could have removed up to twenty files from GitHub without asking before the re-pull brought them back. Vault events are now muted while the plugin moves files in bulk, and every pull write is marked as the plugin's own right before it happens rather than once at the start (where the mark lapsed long before a big pull finished — the cause of "Local changes pending" flickering during a pull).

Smaller

  • Saving credentials that point at a different repository or branch clears the sync record; saving a new token for the same repository no longer re-runs the comparison.
  • Debug lines no longer rewrite the whole data file per line; the panel no longer rebuilds on every keystroke.

Worth testing

  1. A fresh vault against a repo where both sides have unique files: try each of the three "files only one side has" choices, and check the confirmation lists.
  2. Sync off → Push on a never-linked vault.
  3. Reset & re-pull on a vault with more than 20 files, watching that nothing is deleted from GitHub.
  4. Edit on another device and watch the 5s poll pick it up, on both desktop and iOS.

1.0.5-beta.1

1.0.5-beta.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 17 Sep 02:58

First beta of 1.0.5, for testing via BRAT. manifest.json in the repository stays at 1.0.4, so the community directory keeps serving 1.0.4 — only BRAT (with pre-releases) installs this.

Choose what to keep when linking a vault

The setup comparison now asks two questions, each only when it applies:

  • Which version wins for files that exist in both places with different contents — this vault, or GitHub.
  • What to do with files only one side has — Keep both (merge), Use only this vault (delete GitHub's extras from the repository), or Use only GitHub (move the vault's extras to the trash).

Everything a choice loses is listed and confirmed before anything moves. A file deleted from GitHub stays in the repository's history; a trashed file follows Obsidian's own Deleted files setting.

Also fixed here: Upload this vault never actually uploaded a differing file — the push saw an untracked path GitHub already held and reported a collision, so you got conflict copies instead of your version winning.

Push and Reset & re-pull work with Sync off

Both buttons now work whatever the Sync switch says, and both show their progress in the button: it fills from the left as the file count advances and slides while there is no count yet. Pressing Push on a vault that has never been linked runs the comparison above first, and the choice made there carries the push out; Sync stays off.

Polling: the "it did not notice the remote change" fixes

  • A 404 from GitHub's compare endpoint (a synced commit rewritten away, or a replica that has not seen it yet) was treated like a bad token and switched Sync off. It is now treated as diverged and reconciled, and only a 404 the repository itself answers stops sync.
  • The branch-ref poll bypasses the platform HTTP cache. requestUrl goes through Chromium's cache on desktop and the system cache on iOS, and GitHub marks API responses cacheable for a minute — long enough for a five-second poll to keep reporting a branch that had moved.
  • The thorough check on returning to a device runs at most every five minutes instead of on every window focus.
  • Transient 502/503/504 answers are retried with a short backoff instead of failing the operation.

Data-safety fix in Reset & re-pull

Trashing the vault fired delete events that armed a push, which could have removed up to twenty files from GitHub without asking before the re-pull brought them back. Vault events are now muted while the plugin moves files in bulk, and every pull write is marked as the plugin's own right before it happens rather than once at the start (where the mark lapsed long before a big pull finished — the cause of "Local changes pending" flickering during a pull).

Smaller

  • Saving credentials that point at a different repository or branch clears the sync record; saving a new token for the same repository no longer re-runs the comparison.
  • Debug lines no longer rewrite the whole data file per line; the panel no longer rebuilds on every keystroke.

Worth testing

  1. A fresh vault against a repo where both sides have unique files: try each of the three "files only one side has" choices, and check the confirmation lists.
  2. Sync off → Push on a never-linked vault.
  3. Reset & re-pull on a vault with more than 20 files, watching that nothing is deleted from GitHub.
  4. Edit on another device and watch the 5s poll pick it up, on both desktop and iOS.

1.0.4

Choose a tag to compare

@github-actions github-actions released this 10 Sep 15:51

Fixed: a vault could sit half-synced and report itself up to date.

A device set up with Upload this vault recorded the entire remote tree as synced without downloading any of it, expecting files that only GitHub had to arrive with the next ordinary pull. They never did: the push that setup makes becomes the commit the device compares against, so the remote never appears to move and every pull path short-circuits. Files were deferred to a pull that device could never trigger, and only another device pushing would rescue it.

  • UltiSync now checks whether your vault actually holds what GitHub holds, rather than trusting the commit pointer alone. The check runs about once a minute, costs no network request unless it finds a gap, and downloads whatever never arrived.
  • Both directions of setup stop deferring: Upload this vault fetches what only GitHub had as soon as its push lands, and Download from GitHub queues what only your vault has instead of waiting for you to make an edit.
  • Sync now verifies instead of trusting the commit pointer.
  • Returning to a device runs a fuller check, including files whose size on disk disagrees with GitHub while claiming to be the same content — a download that was cut short. These are reported, never overwritten.
  • A file you deleted stays deleted. The check deliberately ignores files it once had, so it cannot resurrect them.

Added

  • Progress while syncing — a bar and file counts for transfers of 10+ files or 25 MB, in the sync panel and the status bar. Smaller transfers stay quiet.
  • A countdown ring that drains through the delay before an automatic push, and restarts from full when you keep typing.
  • The status bar now shows a single icon, with the detail on hover.
  • UltiSync has its own icon on the ribbon and sync panel.
  • Settings → UltiSync → Report a bug opens a GitHub issue with your UltiSync version, Obsidian version and platform already filled in.

Fixed

  • Settings sections below the credentials no longer stay dimmed and unusable after saving credentials and resolving the initial comparison.

Your credentials and sync state carry over untouched.

1.0.4-beta.3

1.0.4-beta.3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 10 Sep 15:04

Third beta for testing via BRAT. manifest.json stays at 1.0.3, so the community directory keeps serving 1.0.3 — only BRAT installs this.

The important fix: a vault could sit half-synced and report itself up to date.

A device that starts with Upload this vault records the entire remote tree as synced without downloading any of it, on the promise that files only GitHub has arrive with the next ordinary pull. They never did. The push that adoption makes becomes the commit the device compares against, so the remote never appears to move, and every pull path — the 5s poll and the manual Sync now alike — short-circuits on remoteHead === lastSyncedCommit. The files were deferred to a pull that device could never trigger.

  • The poll now checks, once a minute when the commit pointer says there is nothing to do, whether the vault actually holds what the recorded tree says GitHub holds. It is arithmetic over state already in memory — no request unless it finds something — and it downloads whatever never arrived.
  • A file that is tracked but absent is left alone. That is a deletion on its way out, not a missing download.
  • Both halves of onboarding stop deferring. Adoption pulls what only GitHub had as soon as its push lands; downloading from GitHub queues what only your vault has instead of waiting for an edit that might never come.
  • Sync now verifies instead of trusting the pointer.
  • Returning to a device runs a thorough check: file counts, plus files whose size on disk disagrees with GitHub while claiming to be the same blob — a write that was cut short. Those are reported, never overwritten.

Carried over from beta.1 and beta.2

  • Progress counts and a bar for transfers of 10+ files or 25 MB+.
  • A countdown ring that drains before an automatic push and restarts when you type.
  • Status bar reduced to a single glyph, with the words on hover.
  • The plugin's own icon on the ribbon and panel; Report a bug section in settings.
  • Settings sections no longer stay dimmed after setup.

1.0.4-beta.2

1.0.4-beta.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 10 Sep 14:16

Second beta for testing via BRAT. manifest.json stays at 1.0.3, so the community directory keeps serving 1.0.3 — only BRAT installs this.

Changes since 1.0.4-beta.1

  • The status bar says its piece in a single glyph — ring, arrow, tick — with the words moved to the hover tooltip.
  • A file count joins the glyph only for a transfer worth watching: ten files or twenty-five megabytes. Smaller ones stay silent, in the panel as well as the status bar.
  • The ribbon and the sync panel carry the plugin's own icon instead of a borrowed one.
  • The settings section is headed Report a bug, no longer repeats its name in the row below, and opens the issue from a bug icon rather than a text button.

Carried over from beta.1

  • Progress counts and a bar while a large pull or push runs.
  • A ring that drains through the delay before an automatic push, restarting from full when you type.
  • Settings sections no longer stay dimmed after the setup comparison is resolved.
  • Report a bug from inside the plugin, with your versions and platform prefilled.

Credentials and sync state are untouched by installing this.

1.0.4-beta.1

1.0.4-beta.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 10 Sep 13:31

Beta for testing via BRAT. manifest.json stays at 1.0.3, so the community directory keeps serving 1.0.3 — only BRAT installs this.

Progress while syncing. A pull or push now reports file counts from the one place each funnels through, so a first pull of a large vault shows "Pulling 15 of 40 file(s) — 37%" with a bar in the panel, and a count beside the status bar label, instead of an unchanging spinner.

A countdown before a push. A ring in the status bar and in the sync panel drains across the delay before an automatic push. Editing re-arms the timer, so the ring restarts from full. It follows whichever push timer is armed, so a newly created file waiting out its settle window shows a longer countdown than five seconds.

Settings stop staying dimmed. Fixed in 1.0.3: the sections below the credentials stayed dimmed and inert after saving credentials and resolving the setup comparison.

Report a bug from inside the plugin. Settings → UltiSync → Help → Report a bug opens a GitHub issue with your UltiSync version, Obsidian version and platform already filled in.

Credentials and the sync link are untouched by installing this — data.json is left alone by an update, and there are now regression tests holding that in place.

1.0.3

Choose a tag to compare

@github-actions github-actions released this 07 Sep 16:11

Fixed: the settings sections below the credentials stayed dimmed and unusable after saving credentials and resolving the initial vault/repo comparison. On Obsidian 1.13 the section elements are reused between renders, so the "not set up yet" gate went on at the first paint and was never taken off — reopening settings did not clear it either. It now clears as soon as synchronization is on, and comes back when credentials are reset.