Minimal Chrome extension that exports a backup of your bookmarks to your computer. Changelog.
- Export as HTML – download a Netscape-format bookmark file (re-importable into any browser) to your Chrome Downloads folder
- Export as Markdown – download a hierarchical Markdown version of your bookmarks
- Follows your system light/dark theme
Option A – Download a release (no build)
- Go to Releases and download the latest
bookmarkr-*.zip. - Unzip the file. You should get a folder containing
manifest.json, abuildfolder, aniconsfolder, and_locales. - In Chrome, open a new tab and go to
chrome://extensions. - Turn on Developer mode (toggle in the top-right).
- Click Load unpacked and choose the unzipped folder (the one that contains
manifest.json). - The extension is installed. Pin it from the puzzle icon in the toolbar if you like.
Option B – From source
- Clone the repo, then from the project root:
npm installandnpm run build. - Open Chrome → Extensions → Manage extensions → Load unpacked
- Select the
bookmarkrfolder (the one containingmanifest.json).
Click the extension icon, then click Export as HTML or Export as Markdown. The file is saved to your Chrome Downloads folder with a timestamped name like bookmarks-YYYY-MM-DD-HH-MM-SS.html or .md.
The popup is built with Vite + React + Tailwind + shadcn (src/bookmarkr.html + src/bookmarkr.tsx). The background logic (message handling, bookmark serialization) lives in src/service-worker.ts. Both are built into build/ by Vite.
npm install
npm run buildThen load or reload the extension from the project root (the folder containing manifest.json).
To rebuild only the icons after editing icons/icon.svg:
npm run build:iconsTo create a release zip locally (e.g. for manual upload):
npm run releaseThis builds the extension and creates bookmarkr-<version>.zip (from manifest.json). Unzip it and use Load unpacked on the folder, or upload the zip to a GitHub Release; if you publish a release, the Release workflow runs and attaches the zip automatically.
To type-check and lint:
npm run typecheck
npm run lint
npm run lint:fix # auto-fix ESLint issuesDefault behavior is tuned for Mac (Downloads folder). The same extension works on Windows; Chrome uses the system's default download location.
The UI and manifest use Chrome's built-in i18n. Strings live in _locales/<locale>/messages.json. English (en) and French (fr) are included. Chrome picks the locale from the browser language. To add a language, add a folder _locales/<code>/messages.json with the same keys as _locales/en/messages.json.
GPL-3.0-only. See LICENSE.