# FavBox: local-first bookmarks that sync tags through titles

> FavBox is an experimental Chrome extension that layers tagging, search, notes and previews on top of the browser bookmark store without any server, and it keeps tags in sync across devices by appending them to the bookmark title. It is a clever piece of engineering for a side project, with Chrome-only reach and a permission list that deserves a second look.

**dd3v/favbox** — 🔖 FavBox is a local-first experimental browser extension that enhances and simplifies bookmark management without cloud storage or third-party services.

- Repository: https://github.com/dd3v/favbox
- Website: https://chrome.google.com/webstore/detail/favbox/eangbddipcghohfjefjmfihcjgjnnemj
- Stars: 769 · Forks: 37
- Language: Vue
- License: MIT
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/dd3v-favbox

## An extension that augments bookmarks rather than replacing them

FavBox is described as a local-first experimental browser extension that enhances and simplifies bookmark management without cloud storage or third-party services. The framing matters: it extends your browser's native bookmarking features.

That is stated plainly in the implementation notes. The extension only extends the standard functionality and does not attempt to replace it, and you can work with bookmarks both through the extension and the native browser's built-in bookmark features. The repository topics reinforce the position, listing pet-project and sideproject alongside browser-extension and bookmarks-manager, which is a fair description of the scope.

The feature list covers the things a native bookmark manager does badly. It syncs with your browser profile, adds no third-party data sharing, no ads and no tracking, and provides tag support for organisation. It offers advanced search, sorting and filtering by tags, domains, folders and keywords, several display modes, light and dark themes, detection of broken and duplicate bookmarks, hotkeys for quick search access, and local notes support.

Broken and duplicate detection is the feature that has the clearest standalone value, since a native bookmark list accumulates both and offers no way to find them. The stack is Vue with Vue 3, built on Vite, and the whole thing is MIT licensed with light and dark theme screenshots in the repository.

## How tags travel between devices without a server

The mechanism for syncing tags without any cloud service is the most interesting engineering idea in the project, and the README calls it a trick.

Since bookmarks are already synchronised between devices by the browser, the extension keeps tags in sync by adding them to the page title. A bookmark whose title reads Google Chrome, Wikipedia is rewritten so that the hashtags for its tags are appended to that title, giving a title like Google Chrome, Wikipedia followed by #wiki and #browser.

The tags then travel to other devices through the standard browser profile sync, and no cloud service is involved beyond what the browser already does.

The trade-off is obvious once you see it. Tags become part of the bookmark title, so they are visible in the native bookmark manager, in other browsers' bookmark lists, and anywhere the title is displayed. The native views of the bookmark therefore show the tags, which is arguably a feature, since you can still see the organisation even where the extension is not installed. The cost is that titles are no longer clean, that any tool that reads bookmark titles sees the hashtags, and that the extension has to parse them back out.

For a personal bookmark collection this is a reasonable bargain. For a shared or exported collection it is intrusive, because the tag data is smeared across the titles rather than kept beside them.

## Metadata scraping, IndexedDB and the event tracking loop

The implementation notes describe the data flow. FavBox scans all bookmarks in the browser, then makes requests to the saved pages and extracts data from them such as title, description, image and meta tags to improve the search. All the data is stored in local storage IndexedDB.

That scraping step is what makes the search and preview features work. A native bookmark entry is a URL and a title, and a URL alone tells you nothing about the page. Fetching the page and pulling the title, description, image and meta tags gives the extension something to search and display, which is the difference between a bookmark manager and a browser history viewer with better sorting.

The extension also tracks all browser events related to bookmarks and synchronises the data, so the index stays current as bookmarks are added, edited or removed.

The source layout follows this pipeline. There is a parser directory for the HTML metadata parser, a storage directory with an idb subdirectory for IndexedDB storage, a services directory described as utility services covering the HTTP client, bookmarks API, tags and hash, an ext directory for the browser extension with separate content scripts, popup and service worker, and composables and components for the Vue side. There is also a tests directory split into integration and unit.

The dependency list shows the choices: jsstore for the storage layer, webextension-polyfill for cross-browser API compatibility, Vue 3 with vue-router, Tailwind through the Vite plugin, TipTap for rich text in the notes feature, linkedom for HTML parsing in tests, a colour extraction library, and a masonry layout component.

## The permission list is the security story

FavBox documents the permissions it requests and why, in a table. This is worth reading carefully because the list is broad.

The bookmarks permission is for reading and managing bookmarks, which is unsurprising. activeTab is for capturing a page screenshot for visual previews. tabs gives the current tab information when saving a bookmark. storage is used to store sync status and extension settings. alarms keeps the service worker alive for background sync. contextMenus adds a Save to FavBox entry to the right-click menu.

Then there is <all_urls>, requested to fetch page metadata such as the title, description and favicon.

That last one is the one to think about. It grants the extension the ability to make requests to any page you visit, which is exactly what the metadata scraping feature needs and also exactly what a malicious update could abuse. The combination of broad host access with the ability to run background work through the alarms permission and a service worker is why the README's claim of no ads and no tracking is a statement about the project's intentions rather than a technical guarantee. A user with a light theme preference and no concerns will not read this, but a security-conscious reviewer should.

The screenshots in the repository are of the light and dark themes, and the extension is published in the Chrome Web Store, so the installed package is the published artefact rather than a local build.

## Building the extension from source

The build steps are short because the toolchain is conventional. The README lists two of them: pnpm run build to build into dist, and then enabling dev mode in chrome://extensions/ and using the Load unpacked extension option.

The package manifest confirms the details. The scripts are a Vite dev server for development, a separate Firefox development build that runs vite build with the development mode and the Firefox config, a production build, unit and integration test runs through Vitest with a jsdom environment and separate roots for tests/unit and tests/integration, and a lint script that runs ESLint over the project.

```json
  "scripts": {
    "dev": "vite",
    "dev:firefox": "vite build --mode development -c vite.config.firefox.js",
    "build": "vite build",
```

There is more than one build config at the top level, with vite.config.js and vite.config.firefox.js, and two manifests, manifest.chrome.json and manifest.firefox.json. The extension build is done with the crxjs Vite plugin, which is the piece that knows how to produce a browser extension bundle rather than a web page bundle.

Two small details worth knowing before you start. The project uses package-lock.json, so npm is the package manager in this checkout even though the README refers to pnpm for the build command, and the lint script runs with the --fix flag, so linting will rewrite your files rather than only reporting problems.

## Chrome first, Firefox as work in progress

The manifest files and the two Vite configs exist, but the README is explicit that the Firefox path is unfinished. The dev:firefox command is labelled work in progress in the commands list, and the TODO section says the extension already uses a polyfill to maintain compatibility with other browsers and that it would be good to test this in Firefox, also marked work in progress.

The practical reading is that FavBox is a Chrome extension today, with the browser API calls wrapped in webextension-polyfill so that a Firefox build is possible rather than impossible. The store listing linked from the README is a Chrome Web Store entry, and the repository has a manifest.firefox.json, which is a start rather than a shipped artefact.

The other two TODO items are about the storage layer, and they are more revealing. The first is to use SQLite Wasm for storage, described as ideal for future experiments. The second is to improve the transaction implementation, with the stated goals of reliability and better performance. Both point at the same thing: the IndexedDB layer is the part of the project that is still being designed, and SQLite Wasm would replace it with something that gives real transactions over structured data.

For a user this means the storage behaviour may change between versions. For a developer it means the storage directory is the place to look first.

## Conclusion

Use FavBox if you want richer bookmark organisation without handing your bookmark list to a third party, and you are willing to live with tags written into bookmark titles. Do not adopt it as a team or organisation bookmark system, because the sync mechanism relies on the browser's own profile sync and there is no account, no server and no shared store, and do not install it if the <all_urls> permission is unacceptable in your environment. Before your first install, read the permissions table, check that your browser is one of the two the extension supports, and note that the Firefox build is still work in progress, with the last push on 2026-10-22 and the latest release v2.2.0 from 2026-07-25.

## FAQ

### What is FavBox and does it send my bookmarks anywhere?

FavBox is an experimental local-first browser extension that adds tags, search, notes and previews to the browser's bookmarks. The README states that it is a fully local application with no cloud storage, no third-party data sharing, no ads and no tracking, and that tags are kept in sync through the browser's own profile sync.

### How does FavBox sync tags between devices without a server?

It appends the tags to the bookmark title, for example a title like Google Chrome, Wikipedia with hashtag tags appended to it, so they travel with the bookmark through the standard browser profile sync. The README notes that the extension already uses a polyfill to maintain compatibility with other browsers, and that it would be good to test this in Firefox.

### How do I build FavBox from source?

Run pnpm run build to build into dist, then enable dev mode in chrome://extensions/ and use the Load unpacked extension option. The project has separate Vite configs and manifests for Chrome and Firefox, and the dev:firefox script exists but is marked work in progress.

### What permissions does FavBox request?

The documented list is bookmarks to read and manage them, activeTab to capture a page screenshot for previews, tabs for the current tab when saving, storage for sync status and settings, alarms to keep the service worker alive for background sync, contextMenus for the right-click entry, and <all_urls> to fetch page metadata such as title, description and favicon.

## Sources

- [dd3v/favbox on GitHub](https://github.com/dd3v/favbox)
- [License: MIT](https://github.com/dd3v/favbox/blob/master/LICENSE)
- [Project website](https://chrome.google.com/webstore/detail/favbox/eangbddipcghohfjefjmfihcjgjnnemj)
- [README](https://github.com/dd3v/favbox/blob/master/README.md)
- [Releases](https://github.com/dd3v/favbox/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/dd3v-favbox
