Skip to content

Releases: Llewellyn500/obsidian-tether

Tether 1.0.16

Choose a tag to compare

@github-actions github-actions released this 17 Aug 01:02

Tether 1.0.16 makes Push mirror the real local vault structure to Google Drive, including cleanup of older cloud items that were missing from local sync state.

What changed

  • Push now inventories the complete Drive vault instead of checking only paths recorded in .obsidian/gdrive-sync.json.
  • Cloud files and folders that no longer exist locally are removed even when they were never tracked, fixing stale folders after a vault restructure.
  • Unchanged local files are verified against the expected Drive path so missing or moved remote copies are recreated correctly.
  • Stale cloud branches are removed only after local uploads finish successfully.
  • Deleting a stale folder uses one Drive operation for the folder branch instead of issuing redundant requests for every descendant.

Safety

  • An empty local vault scan never triggers remote deletion.
  • A manual push asks for confirmation when 80% or more of existing Drive items would be deleted, allowing an intentional full restructure to proceed.
  • Background push pauses large deletion batches instead of confirming them automatically.
  • Remote cleanup is skipped when any local upload fails.
  • Existing exclusions such as .git, .codex-worktrees, node_modules, build folders, partial downloads, and Tether's sync-state file remain protected.

Validation

  • Added regression coverage for untracked stale Drive folders and complete local restructures.
  • All nine sync regression tests pass.
  • The production Obsidian bundle builds successfully.
  • GitHub Actions rebuilds and attests main.js, manifest.json, and styles.css before publishing them.

Full changelog: 1.0.15...1.0.16

Full Changelog: 1.0.15...1.0.16

Tether 1.0.15

Choose a tag to compare

@github-actions github-actions released this 13 Aug 21:14

Tether 1.0.15 prevents mobile crashes while pulling large vault updates and media files.

What changed

  • Large files on mobile are downloaded in 2 MB byte ranges instead of loading the entire file into Obsidian's WebView memory.
  • Chunked downloads are assembled in an excluded .tether-part file and moved into place only after the complete file arrives.
  • Completed chunked files are saved to sync state immediately so an interrupted pull does not repeat expensive work.
  • Older Obsidian versions without binary append support defer large files safely instead of risking an app crash.
  • Mobile pulls yield to the app more frequently, render status less often, and reduce full sync-state rewrites.
  • Completed Drive folder listings and download buffers are released earlier, and pull deletion tracking no longer keeps a second copy of every remote path.
  • .codex-worktrees and incomplete .tether-part files are excluded from synchronization.

Safety

  • Downloads remain sequential on mobile, keeping only one 2 MB response chunk in active plugin memory at a time.
  • Existing destination files stay intact until a replacement has downloaded completely.
  • Google Drive must return the exact requested byte range; unexpected or incomplete responses fail safely.
  • The existing duplicate-folder prevention and repair behavior from 1.0.14 remains included.

Validation

  • Confirmed the fix on the affected mobile pull containing a large .mov attachment.
  • Added regression coverage for Google Drive byte-range requests.
  • All seven sync regression tests pass.
  • The production Obsidian bundle builds successfully.
  • GitHub Actions rebuilds and attests main.js, manifest.json, and styles.css before publishing them.

Full changelog: 1.0.14...1.0.15

Full Changelog: 1.0.14...1.0.15

Tether 1.0.14

Choose a tag to compare

@github-actions github-actions released this 27 Jul 15:13

Tether 1.0.14 prevents duplicate Google Drive folders and safely consolidates duplicates that already exist.

What changed

  • Prevented concurrent sync workers from creating multiple Drive folders for the same vault path, including case-only name differences.
  • Made folder creation retry-safe by reserving a Drive file ID and reusing it after timeouts, API retries, access-token refreshes, and internal Drive-client replacements.
  • Added automatic recursive repair for duplicate vault folders and duplicate nested folders. Tether chooses one deterministic folder, moves every reachable item into it, and updates local sync-state references.
  • Preserved differing same-name files with a unique Tether conflict filename instead of overwriting either copy.
  • Moved byte-identical duplicate files to Google Drive Trash.
  • Moved duplicate folders to Trash only after a fresh Drive check confirms they are empty. File/folder type collisions stop the repair instead of risking data loss.
  • Serialized sync-state saves so overlapping workers cannot let an older snapshot overwrite newer folder mappings.
  • Added Drive-side conflict diagnostics and refreshed the documented sync behavior.

Safety

  • Folder repair moves existing Drive items without changing their file IDs.
  • Duplicate cleanup uses recoverable Drive Trash rather than permanent deletion.
  • Repair saves corrected state before renaming or trashing items, is safe to resume after interruption, and honors Stop Sync checks between mutations.
  • Differing content is never silently folded into another file or discarded.

Validation

  • Added six regression tests covering concurrent folder creation, recursive folder merging, conflict preservation and rediscovery, retry reconciliation, timeout reservations across replacement clients, and serialized state writes.
  • All six regression tests pass.
  • The production Obsidian bundle builds successfully.
  • GitHub Actions rebuilds and attests main.js, manifest.json, and styles.css before publishing them.

Upgrade note

After updating, run a Pull or Push. Tether will consolidate duplicate Drive folders it encounters while preserving any differing same-name files.

Full changelog: 1.0.13...1.0.14

Full Changelog: 1.0.13...1.0.14

1.0.13

Choose a tag to compare

@github-actions github-actions released this 21 Jul 13:21
Update manifest.json

Tether 1.0.12

Choose a tag to compare

@github-actions github-actions released this 15 Jul 23:36

Summary

Reliability and performance fixes for large vault pushes, plus local diagnostics you can copy into GitHub issues.

Fixes

  • Large pushes no longer stall mid-way from Drive rate limits or hung uploads
  • Retry/backoff, request timeouts, and paced concurrent uploads
  • Chunked uploads for large files with lower RAM usage
  • Exclude .venv, node_modules, and other dependency/build folders
  • Idle open tabs now sync once they stop being edited
  • Local Copy diagnostics / Save diagnostics in the sync sidebar

Install

Download main.js, manifest.json, and styles.css from this release into .obsidian/plugins/tether/, then reload Obsidian.

1.0.11

Choose a tag to compare

@Llewellyn500 Llewellyn500 released this 29 Jun 10:00

Startup Sync Direction

  • Fresh folder setup still starts with an initial Push from the local vault.
  • Configured vault startup now waits for the startup delay, pulls Google Drive changes first, then lets interval syncs push local changes afterward.
  • Plugin update startup pulls continue to run before interval pushes resume.

Stop/Resume Auto Sync

  • Added Stop/Resume Auto Sync controls in the ribbon, command palette, settings, and sync status sidebar.
  • Stop Auto Sync pauses startup and interval syncing while keeping manual Pull and Push available.
  • In-progress syncs now stop between work items after the user requests a stop.

Release Files

  • Includes main.js, manifest.json, and styles.css for manual Obsidian plugin installation.

Verification

  • Built locally with npm run build.

1.0.10

Choose a tag to compare

@github-actions github-actions released this 26 May 01:23

Recovery Fix

  • Pull can now recover if a previous bad sync saved an empty duplicate Drive vault root. It scans the selected Drive folder for a non-empty matching vault folder and switches back to it before downloading.
  • Pull now reports an error instead of "complete successfully" when the selected Drive vault root is empty.
  • Keeps the previous protections that block full local/remote wipe-outs when one side looks empty or completely mismatched.

Intended Sync Direction

  • Initial folder setup pushes local files to Drive.
  • App open and plugin update pull Drive changes first.
  • Timer sync pushes local changes after the idle delay.

Recovery Steps For An Emptied Device

  • Do not run Push from the emptied vault.
  • Confirm the real vault folder still exists in Google Drive.
  • Install 1.0.10, restart Obsidian, then run Pull.
  • If Pull says it switched from an empty Drive folder, that is the recovery path working.

Verification

  • Built locally with npm run build.
  • GitHub Actions release workflow passed and published main.js, manifest.json, and styles.css.

Tether 1.0.6

Choose a tag to compare

@github-actions github-actions released this 21 May 16:27

Tether 1.0.6

This release improves the folder picker experience when Google Drive rejects folder listing with 403 Forbidden.

Folder picker diagnostics

  • Drive API requests now opt out of Obsidian's default 400+ throwing behavior so Tether can read Google's JSON error response body.
  • Added a structured GoogleDriveApiError with HTTP status, Google reason, and setup hints.
  • The folder picker now shows a clear troubleshooting checklist instead of only Request failed, status 403 in DevTools.
  • Added a Retry button after folder fetch failures.

Setup guidance

  • Added 403 troubleshooting steps to the README, hosted setup page, and in-app setup guide.
  • The checklist covers the common causes: Google Drive API not enabled, missing Drive scopes, app still in Testing without the user added as a test user, stale tokens after changing scopes/testers, and Google Workspace admin restrictions.

OAuth error parsing

  • Token exchange now also disables Obsidian's default 400+ throwing behavior so OAuth errors like redirect URI mismatch keep their useful Google response body.

Version and assets

  • Bumped the plugin version to 1.0.6.
  • Rebuilt main.js; release assets include main.js, manifest.json, and styles.css.

For users who hit the 403

  1. In Google Cloud, enable Google Drive API in the same project as the OAuth client.
  2. Confirm Data Access includes Drive, Drive metadata, openid, and email scopes.
  3. If the app is in Testing, add the user's Google account under Audience > Test users.
  4. If anything changed after login, log out of Tether and log in again before selecting a folder.

v1.0.5 - Fix Initial Sync & Vault Deletion Protection

Choose a tag to compare

@Llewellyn500 Llewellyn500 released this 21 May 01:53

What's Fixed

🐛 Critical: Vault content now actually uploads to Google Drive on first setup

This was the #1 reported issue. After selecting a Google Drive folder for the first time, Tether would run a pull against the empty remote folder, mark the initial pull as complete, and then stop — never actually pushing your vault content to Drive. The folder was created correctly, but your files never made it there.

On the next sync cycle, because the remote folder was still empty, a pull would see zero remote files and delete your entire local vault to match the empty remote. This is now fixed:

  • After the initial pull completes, Tether immediately chains a push to upload all your vault content to the selected Drive folder.
  • This applies to both manual sync (triggered from settings or commands) and background sync.

🛡️ Catastrophic deletion safeguards

Even with the sync flow fixed, we've added an extra safety net to prevent mass data loss:

  • Pull protection: If a pull would delete more than 80% of your tracked local files (when you have 10+ tracked files), Tether aborts all deletions and shows a warning notice instead of wiping your vault.
  • Push protection: Same safeguard for remote deletions — if a push would delete more than 80% of tracked remote files, it aborts and warns you.

This ensures that even in edge cases (network issues, API errors, corrupted state), Tether won't silently destroy your data.

💬 Better OAuth error messages

When Google returns a redirect_uri_mismatch error during login, Tether now shows the exact redirect URI you need to add in your Google Cloud Console, instead of a generic "Login failed" message:

Redirect URI mismatch. In Google Cloud Console → Credentials → your OAuth client, add this exact Authorized redirect URI: https://llewellyn500.github.io/obsidian-tether/oauth/callback.html


After Updating

  1. Update the plugin to v1.0.5
  2. If you previously selected a folder but nothing synced, go to Tether settings → Step 3 and re-select your folder (or click Push in Step 4)
  3. Your vault content should now upload to Google Drive immediately

Files Changed

  • main.ts — Fixed manualSync() and backgroundSync() to chain pull→push on initial setup
  • sync/engine.ts — Added deletion threshold safeguards to both pull and push deletion handlers
  • auth/oauth.ts — Added redirect_uri_mismatch error detection with actionable message
  • manifest.json / package.json — Version bump to 1.0.5

Fixes #1

1.0.3

Choose a tag to compare

@github-actions github-actions released this 13 May 17:32
Tether 1.0.3