QuickMark is a keyboard-first Chrome Extension for searching local bookmarks and browser history. Press
Cmd/Ctrl + Shift + Kon any page and jump to a bookmark or past visit in seconds — no typing full URLs, no hunting through folders.
- One keystroke away —
Cmd/Ctrl + Shift + Kopens a search palette over the current page - Fuzzy search across title, URL and domain with Fuse.js
- Pinyin search for Chinese titles (e.g.
zhihufinds 知乎) - Flat results — bookmarks and browser history in one ranked list, without domain grouping or inserted homepage links
- Pinned websites — pin up to eight exact URLs; an icon-only strip inside the filter bar keeps frequently used sites one click away, and
Cmd/Ctrl + 1–8opens them - Filters — source chips (all / bookmark / history), plus one dropdown that carries both the time range (all time / today / week / month) and the sort mode, labelled with the active non-default choices
- Remembered sort modes — smart, recent, frequent, title, created, relevance; smart balances recent visits and time-decayed frequency, not bookmark creation time
- Address-bar semantics —
Enteron a complete URL or bare domain (e.g.github.com) navigates directly - Keyboard-first —
Enteropens in the current tab,Cmd/Ctrl + Enterin a new tab,Cmd/Ctrl + 1-9jumps to the N-th result,Cmd/Ctrl + Ccopies the URL - Search history — last 5 queries; press
Spacein the empty box to open a dropdown, pick with ↑↓ +Enter, and clear the whole list from its footer - Web-search fallback — no local results? Press
Enterto search Google - Light / dark / system theme
QuickMark is not yet published to the Chrome Web Store. To install it from source:
-
Build the extension:
git clone https://github.com/Amdeo/QuickMark.git cd QuickMark npm install npm run build -
Load it into Chrome:
- Open
chrome://extensions - Enable Developer mode (top right)
- Click Load unpacked
- Select this project's
distdirectory
- Open
-
Verify the shortcut — open
chrome://extensions/shortcutsand confirm QuickMark hasCommand/Ctrl + Shift + Kassigned. Existing tabs receive the modal on demand, so no page reload is needed.
| Keys | Action |
|---|---|
Cmd/Ctrl + Shift + K |
Open / close the search palette |
↑ / ↓ |
Navigate results |
Enter |
Open the selected result in the current tab |
Cmd/Ctrl + Enter |
Open the selected result in a new tab |
Cmd/Ctrl + 1–9 |
Open the N-th pinned icon, then the N-th result — pins take the first slots while the strip is visible; with a query typed, digits go straight to results |
Cmd/Ctrl + C |
Copy the selected result's URL |
Alt + ← / → |
Cycle source filter (all / bookmark / history); plain arrows edit the query |
Space |
Open the recent-searches dropdown while the query is empty (↑↓ to move, Enter to refill); with text present, space types normally |
Esc |
Clear the query first, then close the palette |
Alt + P |
Pin / unpin the selected result |
Type a complete URL or bare domain (e.g. kimi.com, localhost:3000) and press Enter to navigate directly, address-bar style — even when no local results match.
Pins keep their exact URL and manual order, remain available if the original bookmark/history entry disappears, and never change with ranking. Click a result's pin button to add it; the icon row shows favicons with their Cmd/Ctrl+N badge, hover for the name and full URL, drag an icon onto another to reorder the row, and use the small remove button to unpin. Result badges always show each row's real key: with N pins the first result is Cmd/Ctrl + N+1. The strip sits in the filter bar, right after the source chips and before the filter dropdown, when the query is empty; with nothing pinned the bar keeps no placeholder. Pins and the selected sort mode are saved locally and restored when reopening the palette. With a query, match relevance takes priority and the selected mode breaks close ties; without a query, recent uses actual visit time and frequent uses visit count.
A full Chinese usage guide is available in USAGE.md.
npm install # install dependencies
npm test # run the Vitest test suite
npm run build # type-check, bundle and output to dist/
npm run dev # start the Vite dev serversrc/background— MV3 service worker: command routing, bookmark/history cachesrc/content— on-page modal overlay host (Shadow DOM); the heavy search bundle loads on demand, and a placeholder panel covers waits longer than 120mssrc/domain— pure bookmark, search and ranking logicsrc/adapters— Chrome bookmarks / history / favicon API adapterssrc/search— React search UI and hookspublic/manifest.json— extension manifest, copied intodist
Bookmark and history data is cached in chrome.storage.local under quickmark.bookmark-cache-v1 and refreshed in the background whenever bookmarks or history change. Cached data never leaves your browser.
- The palette only appears on normal
http:///https://pages. Chrome internal pages (chrome://extensions, Web Store, settings) do not allow extension overlays.
Contributions are welcome! Please follow the existing conventions:
- Keep the codebase keyboard-first and dependency-light
- Comments and commit messages may be written in Chinese or English (see the repo history for style)
- Add or update tests in
src/**/*.test.tsand runnpm testbefore submitting - Run
npm run buildto make sure the extension bundles cleanly
Report issues or feature ideas via GitHub Issues.