Skip to content

Vermaarp/Syncmark

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Syncmark

Repo: https://github.com/Vermaarp/Syncmark

Open-source, self-hostable bookmark sync across Chromium browsers (Brave, Chrome, Helium, Edge, Opera, Vivaldi). One account, one bookmark tree, any browser.

What it is

If you use more than one browser, your bookmarks don't follow you. Chrome Sync is Google-only. Firefox Sync is Firefox-only. Syncmark is a neutral sync server + browser extension that keeps bookmarks consistent across every Chromium-based browser on every device you use.

  • Self-hosted: runs on your own machine via Docker, or on Fly.io / Render free tier.
  • One extension for every Chromium browser — Manifest V3, same codebase works on Brave, Chrome, Helium, Edge, etc.
  • Real-time sync via PocketBase WebSocket subscriptions.
  • No tracking, no ads, no telemetry. Your bookmarks live on your server.

Architecture

Component Stack Role
backend/ PocketBase (Go, SQLite) Auth, storage, realtime broadcast
extension/ Manifest V3, vanilla JS Reads/writes chrome.bookmarks, syncs to backend
dashboard/ Svelte + DnD (planned) Web UI for managing bookmarks

Data model: a single bookmarks collection where each row is a folder or a bookmark, with parent, title, url, idx, isFolder, syncVersion.

Status

Phase Scope Status
1 Backend schema + auth + realtime Done
2 Extension two-way sync (initial + live) Working but buggy (see below)
3 Web dashboard with drag-and-drop Not started
4 Offline queue, E2E encryption, deploy guides, import/export Not started

Quickstart (self-host)

Requires Docker.

git clone https://github.com/Vermaarp/Syncmark.git
cd Syncmark
docker compose up -d
docker exec -it syncmark-pocketbase-1 /pb/pocketbase admin create admin@test.com adminpass123

Then:

  1. Open http://127.0.0.1:8090/_/, log in as admin@test.com / adminpass123.
  2. Go to the users collection → + New record → create an email/password, toggle verified ON → Save.

Install the extension

  1. In Chrome/Brave/Helium/etc., open chrome://extensions (or brave://extensions).
  2. Enable Developer Mode.
  3. Click Load unpacked → select the extension/ folder in this repo.
  4. Click the Syncmark icon in the toolbar.
  5. Enter:
    • Backend URL: http://127.0.0.1:8090
    • Email + Password: the user you created in step 2 above.
  6. Click Login, then Full Sync.
  7. Repeat on any other Chromium browser with the same credentials.

Bookmarks changed in one browser will propagate to the others within a few seconds.

Known issues (v0.1)

This is an early prototype. There are real bugs:

  • Duplicate folders/bookmarks on re-sync. If you run Full Sync multiple times in sequence or after restoring a wiped database, stale ID mappings in chrome.storage.local can cause duplicate folders to be created. Workaround: open the extension's service worker console and run await chrome.storage.local.clear() before Full Sync.
  • Race-driven duplication. In rare cases, a bookmark created locally appears 2–3 times after sync. Caused by Server-Sent Event echoes arriving before the client-side ID mapping is persisted.
  • Deletes don't always propagate if the mapping hasn't been established yet (e.g., cleaning duplicates before first Full Sync).
  • Only the Bookmarks Bar and Other Bookmarks roots sync. The Mobile root is currently ignored.
  • No Firefox support (the browser.bookmarks API differences haven't been wired up).
  • No offline queue. If the server is unreachable, local changes are silently dropped.
  • No conflict UI. Last-write-wins by syncVersion + timestamp.
  • No end-to-end encryption. Bookmark content is stored plaintext on the server.
  • Index-out-of-bounds errors can appear when restoring a tree if sibling counts are inconsistent.
  • Service worker restarts in Manifest V3 can cause the realtime SSE connection to drop silently. An alarm-based reconnect watchdog retries every minute, but live events can be lost in that window.

See the fuller design discussion in DESIGN.md (TODO) for the planned v2 approach: content-addressable IDs, event log instead of state sync, and vector clocks instead of timestamps to eliminate most of the above.

Contributing

Contributions welcome. Areas where help is most valuable:

  1. Rewrite the sync loop around content-addressable IDs. Hash parent + title + url → deterministic id. Kills the race-condition duplication bug class.
  2. Web dashboard (Svelte + svelte-dnd-action). Tree view of bookmarks, drag-and-drop reordering, CRUD via PocketBase SDK.
  3. Firefox support. Port the extension to browser.bookmarks (promise-based API).
  4. Offline queue. Persist pending ops in chrome.storage.local, drain when online.
  5. E2E encryption. Encrypt title + url fields client-side with a passphrase-derived key.
  6. Import/export HTML (Netscape bookmark format, same as browsers).

Dev setup

git clone https://github.com/Vermaarp/Syncmark.git
cd Syncmark
docker compose up -d

The extension is plain JS + manifest.json — no build step. Edit files in extension/ and click the reload icon on chrome://extensions. Backend changes: add a migration in backend/pb_migrations/ and restart the container.

How to submit a change

  1. Fork the repo.
  2. Create a branch from main.
  3. If you're fixing a bug listed above, reference it in your PR description.
  4. Open a PR. Keep it focused — one bug or feature per PR.

Reporting bugs

Open an issue at https://github.com/Vermaarp/Syncmark/issues with:

  • Which browsers you had the extension installed on
  • Steps to reproduce
  • Anything visible in the extension's service worker console (chrome://extensions → Syncmark → service worker link → Console tab)
  • PB record count (admin UI → bookmarks collection)

Deployment (Fly.io free tier)

cd backend
fly launch --no-deploy
fly volumes create pb_data --size 1 --region iad
fly deploy

After deploy, set the extension's Backend URL to https://<your-app>.fly.dev.

License

MIT. Do whatever you want with it.

About

Open-source, self-hosted bookmark sync across Chromium browsers (Brave, Chrome, Helium, Edge). Real-time, no vendor lock-in.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors