- TypeScript 90.9%
- HTML 4.7%
- JavaScript 3.7%
- Dockerfile 0.7%
|
|
||
|---|---|---|
| .forgejo/workflows | ||
| backend | ||
| extension | ||
| shared | ||
| .dockerignore | ||
| .gitignore | ||
| .nvmrc | ||
| .prettierignore | ||
| .prettierrc.json | ||
| eslint.config.js | ||
| package-lock.json | ||
| package.json | ||
| PRIVACY.md | ||
| README.md | ||
| tsconfig.base.json | ||
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:
- 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.
- Add these Forgejo repository secrets:
CWS_SERVICE_ACCOUNT_JSON(the complete JSON key),CWS_PUBLISHER_ID(Dashboard → Account → Publisher ID), andCWS_EXTENSION_ID(the item's ID).
Until those secrets exist the publish step skips without failing the build.