Cross-browser bookmark sync — native bookmark experience, invisible sync layer
  • TypeScript 90.9%
  • HTML 4.7%
  • JavaScript 3.7%
  • Dockerfile 0.7%
Find a file
Gjessing1 d161cab580
All checks were successful
docker / build-and-deploy (push) Successful in 1m8s
chore(deploy): move host deploy dir to ~/docker/<Category>/<svc>
2026-10-28 21:32:46 +00:00
.forgejo/workflows chore(deploy): move host deploy dir to ~/docker/<Category>/<svc> 2026-10-28 21:32:46 +00:00
backend Add bookmark browser and drag moves; clarify link health 2026-10-25 08:37:29 +00:00
extension feat: add bookmark breadcrumbs and release extension 0.4.3 2026-10-26 09:25:27 +00:00
shared Add bookmark browser and drag moves; clarify link health 2026-10-25 08:37:29 +00:00
.dockerignore feat: phase 0 monorepo scaffold, health endpoint, CI/CD pipeline 2026-07-03 08:55:29 +00:00
.gitignore feat: add extension icon set for toolbar and web store listing 2026-07-03 16:32:32 +00:00
.nvmrc feat: phase 0 monorepo scaffold, health endpoint, CI/CD pipeline 2026-07-03 08:55:29 +00:00
.prettierignore feat: phase 0 monorepo scaffold, health endpoint, CI/CD pipeline 2026-07-03 08:55:29 +00:00
.prettierrc.json feat: phase 0 monorepo scaffold, health endpoint, CI/CD pipeline 2026-07-03 08:55:29 +00:00
eslint.config.js feat: submit extension releases via Chrome Web Store API 2026-10-24 18:55:39 +00:00
package-lock.json feat: add bookmark breadcrumbs and release extension 0.4.3 2026-10-26 09:25:27 +00:00
package.json feat: phase 0 monorepo scaffold, health endpoint, CI/CD pipeline 2026-07-03 08:55:29 +00:00
PRIVACY.md docs: add privacy policy for Chrome Web Store listing 2026-07-09 13:53:15 +00:00
README.md feat: add bookmark breadcrumbs and release extension 0.4.3 2026-10-26 09:25:27 +00:00
tsconfig.base.json feat: phase 0 monorepo scaffold, health endpoint, CI/CD pipeline 2026-07-03 08:55:29 +00:00

nodefav

Cross-browser bookmark synchronization built around the browser's native bookmark experience. You keep using the Bookmark Bar, Ctrl+D and the built-in bookmark manager. The extension popup also lets you browse and search bookmarks, while the self-hosted backend stores sync history, soft deletes and metadata.

Targets all Chromium browsers: Chrome, Edge, Brave, Vivaldi, Opera.

In Options, choose the folder opened when browsing bookmarks. The popup automatically opens the only synced root when no folder is chosen; search still covers all synced bookmarks. Breadcrumbs in the popup and full-tab browser show the current folder path and let you jump to any parent folder or all bookmarks. The Admin page can move empty folder trees and obsolete, unsynced cloud roots to its restorable Trash.

The latest extension zip is always available from the Homepage download tile.

Stack

  • TypeScript everywhere (ESM, strict), npm-workspaces monorepo: extension/, backend/, shared/
  • Extension: Manifest V3, Chromium Bookmarks API, service worker, operation-based sync with a durable offline queue
  • Backend: Node.js 24, Fastify, SQLite + Drizzle ORM, REST
  • Shipped as a Docker image, built and deployed by Forgejo Actions

Status

Early — foundation phase. Detailed planning docs are maintained locally and are not part of this repository.

Chrome Web Store releases

Every push to main builds a versioned extension zip in Forgejo Packages and, once the store secrets exist, submits it to the Chrome Web Store through the Chrome Web Store API v2:

  • If the manifest version is newer than the store's published and in-review versions, the zip is uploaded and submitted for review. It goes live after approval, using the item's existing visibility settings.
  • If an older version is still in review, that submission is cancelled and the newer one is submitted instead.
  • Otherwise (same version, nothing to release) the step does nothing.

So a release is: increase version in extension/src/manifest.json and extension/package.json, then push to main.

One-time setup:

  1. Follow Google's service account setup: enable the Chrome Web Store API in a Google Cloud project, create a service account with a JSON key, and add its email under Account in the Chrome Web Store Developer Dashboard. The publisher's Google account needs 2-step verification.
  2. Add these Forgejo repository secrets: CWS_SERVICE_ACCOUNT_JSON (the complete JSON key), CWS_PUBLISHER_ID (Dashboard → Account → Publisher ID), and CWS_EXTENSION_ID (the item's ID).

Until those secrets exist the publish step skips without failing the build.