Bookmrk

Bookmrk

Bookmrk is a lightweight, open-source bookmark manager built with React, TypeScript, Vite and Tailwind CSS. It is designed as a modern local-first bookmark manager with quick-save keyboard shortcuts, multi-board organization, a canvas-style 4-column board layout, Chrome import fallback, flexible backgrounds and a bunch of themes.

This README is intended to be a comprehensive reference for users and contributors: installation, usage, architecture, data model, storage & migration, development and contribution guidelines, troubleshooting, and FAQs.

Table of Contents

Overview

Bookmrk helps you capture and organize web pages into Boards and Pages. It focuses on fast keyboard-driven capture (Quick Save), portable storage, and a clean UI with modal-based input and toasts instead of intrusive browser prompts.

Key design goals:

Features

Quick Start (User)

Install via GitHub Releases

Prerequisites:

Installation Steps

  1. Download the latest extension ZIP from the GitHub Releases page.
Repo → Releases → Download latest boomrk-extension-v1.0.0.zip
  1. Extract the ZIP file.

After extraction, the folder should contain:

manifest.json
index.html
assets/
icons/
background.js
content_toast.js
favicon.svg
icons.svg
  1. Open your browser extensions page:
chrome://extensions
  1. Enable Developer Mode (top-right corner).

  2. Click Load unpacked.

  3. Select the extracted boomrk-extension folder.

  4. Bookmrk is now installed 🎉


First-Time Usage

  1. Open the Bookmrk extension/app.
  2. Create Pages and Boards using the + controls.
  3. Open any website in a browser tab.
  4. Press:
Ctrl/Cmd + Shift + Y
  1. Bookmrk will instantly save the page into the Quick Saves board.
  2. Use the Board settings menu (⋯) to rename, delete, organize, or summon bookmarks.

Quick Save Flow

Discord Theme

Keyboard Shortcuts

Discord Theme

Keyboard Shortcuts Guide


Notes:

Note: Browser-level keyboard handling may vary across platforms and OS; when running as an extension, Chrome-specific platform behavior applies.

Usage & Workflows

Settings

Access settings via the settings icon in the toolbar. Settings are auto-saved as you adjust them.

Behavior Settings:

Appearance Settings:

Support:

Storage, Import & Export

Persistence is provided by src/storage/local.ts. Bookmrk uses the browser extension APIs (when available) and falls back to localStorage otherwise.

Migration notes

Data Model

Core TypeScript types are defined in src/shared/types.ts. The important shapes:

Background types:

Theming & Backgrounds

Themes

Bookmrk provides three built-in visual themes (selectable from the Palette menu in the toolbar or via the Appearance settings):

Discord Theme
**Discord** (default): a dense, compact shell inspired by the Discord UI.
Simple Theme
**Simple**: a cleaner top-tab layout with reduced chrome and clearer spacing.
NeoBrutalist Theme
**NeoBrutalist**: high-contrast white-and-black styling with stronger borders and blocky shadows.


These theme choices are persisted in the stored settings as themeMode with allowed values discord, simple, or neobrutalist (see src/shared/types.ts).

Architecture & Code Structure

Top-level structure (important files/directories):

DnD is implemented with @dnd-kit/core and @dnd-kit/sortable. Portals use createPortal from react-dom to ensure modals render at the document root and center properly.

Development Setup

Prerequisites: Node.js 18+ and npm.

  1. Install dependencies:
npm install
  1. Start development server (hot reload):
npm run dev
  1. Build for production:
npm run build
  1. Preview production build locally:
npm run preview

Scripts

Testing, Linting & Formatting

Contribution Guide

We welcome contributions. High-level workflow:

  1. Fork the repo and create a topic branch for your change.
  2. Run the app locally and ensure functionality passes.
  3. Open a pull request describing the change, tests, and any migration steps.

Example Screenshots & Annotated Flows

Home — 4 column grid
Home page showing 4-column grid
Quick Save Modal
Quick Save modal open
Board Settings Modal
Board Settings modal open
Background Modal
Background modal showing URL/upload options

Migration Script Example

When the persisted data shape changes between releases, a small migration script can help convert older exports to the current BookmrkData shape. Add and run this script locally to transform an exported JSON file.

Example script: scripts/migrate_v1_to_v2.ts — usage:

# install ts-node if you don't have it
npm install -D ts-node typescript

# run migration
npx ts-node scripts/migrate_v1_to_v2.ts old-export.json migrated.json

This example script performs conservative transforms:

See scripts/migrate_v1_to_v2.ts for the implementation.

Contributor Checklist & PR Template

I’ve added a Pull Request template at .github/PULL_REQUEST_TEMPLATE.md with a contributor checklist to make reviews faster. The checklist includes items for tests, docs, migrations, and changelog notes.

When opening a PR, please include:

Troubleshooting & FAQ

Q: Quick Save isn’t working in my browser.
A: Ensure the page has focus and the app/extension is active. Browser-level keybindings can conflict; try the toolbar Quick Save button as a fallback.

Q: I imported Chrome bookmarks and the button is disabled.
A: That’s by design, Bookmrk sets chromeBookmarksImported to avoid duplicate imports. If you need to re-import, you have two safe options:

Q: My exported JSON is missing my background image.
A: Bookmrk intentionally omits background data from exported JSON to keep exports small. If you need the background included, open the storage code in src/storage/local.ts and adjust the export function.

Q: Summon opened too many tabs.
A: Summon opens all bookmarks in a board. Use with caution with large boards.

Q: Where did the open-link icon go on bookmark cards?
A: The bookmark card itself now opens the URL when clicked, so the separate open-link button was removed.

Privacy & Data Considerations

License & Contact

This project is open source under MIT License.

For questions, issues, or contributions, open an issue or pull request in the repository.