Bookmark Hoarders Anonymous 用本機 Gemma 整理書籤
I built Tinder for my bookmarks
Javier Cristóbal 開發 Chrome 擴充功能 Bookmark Hoarders Anonymous,以 Tinder 式卡片協助整理書籤,並用 Gemma 摘要網頁、生成評語及命名資料夾。
This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
Bookmark Hoarders Anonymous is a Chrome extension for people who save links "to read later" and then never, ever do.
You open it and it reads out your file, like the first night at a support group: how many bookmarks you have, how many you have never opened, how many are duplicates, and the year of the oldest one. Then your sponsor walks in. Her name is Doris. She is a sloth in reading glasses and a cardigan, she runs on Gemma, inside your browser, and she has seen every kind of hoarder there is.
Then you swipe.
-
One bookmark per card, Tinder style. ← let go, → keep, ↑ move it to a better folder, ↓ open it. Each card tells you what the page actually is (Doris reads the page and summarizes it, and when the page is a login wall she reads the site's homepage instead, so
app.something.com/dashboardfinally makes sense again). Then she gives her verdict. It is rude. It is also usually right. -
Duplicates, even when the URLs only differ by
?utm_source=twitter,www.or a trailing slash. You tick which copies go. -
Dead links, checked straight from your browser. Your
localhost:5173bookmarks start unticked, because they are not dead, just asleep. Like you. - Reorganize everything. A small embedding model groups your bookmarks by meaning, Gemma names the folders, and you get an editable plan: rename, drag bookmarks between folders, delete groups. Nothing gets forced into a folder where it doesn't belong.
The lazy part: nothing is permanent until you say so. "Let go" moves bookmarks to a Bin folder. Before your first change, a full snapshot is taken automatically, and there is a big I messed up! button that puts every bookmark back in its original folder and position. Emptying the Bin also downloads a backup file. You can be as reckless as you want. Doris will judge you, but she won't let you lose anything.
Demo
Code
crjstobal
/
bookmark-hoarders-anonymous
A support group for bookmark hoarders. Swipe through years of saved links while an on-device Gemma sloth roasts every one. Nothing leaves your browser.
A support group for people with 2,000 bookmarks and no intention of reading any of them.
Swipe through years of saved links while an on-device Gemma roasts every single one.
Nothing leaves your browser. That's the Anonymous part.
What it does
- Welcome. Your numbers, read out loud: how many bookmarks, how many you never opened, how many duplicates, the year of your oldest one. Your sponsor, Doris (a sloth in reading glasses, it is Sloth Week after all), has thoughts.
- Swipe. One bookmark per card, Tinder style, in random order (or worst offenders first). ← let go, → keep, ↑ move it to a folder (Doris suggests the best fit), ↓ open it, Z to undo. Each card shows the page's preview image and what the page is actually about (Gemma reads the page text and summarizes it), and then Doris gives her verdict: rude, but useful. Keep something and…
Load it unpacked (npm install && npm run build, then load dist/ in chrome://extensions). Works in Chrome, Edge, Brave, Opera and Arc.
How I Built It
Everything runs inside the extension. There is no backend.
-
Gemma 3 1B (
onnx-community/gemma-3-1b-it-ONNX-GQA, q4f16, about 770 MB) running with Transformers.js on WebGPU, in a Web Worker so the swiping never stutters. You can switch to Gemma 4 E2B if your GPU can take it. I also tried Gemma 3 270M: lovely and fast, but its roasts read like a fortune cookie having a stroke. - all-MiniLM-L6-v2 for embeddings, used for folder suggestions and for grouping.
- Grouping is average-linkage agglomerative clustering with a similarity threshold. My first version used k-means and confidently filed "CSS Grid complete guide" under Travel Japan. K-means has to put every point somewhere. Average linkage only merges groups while their members are genuinely similar, and everything else stays where it is. For big libraries I first squeeze the bookmarks into a few hundred micro-clusters, then merge, so 3,000 bookmarks group in about a second.
-
What is this link? The extension fetches the page, strips everything that could execute, keeps the metadata and the first paragraphs, and Gemma summarizes it. If the page is a login wall or a JavaScript-only app, it falls back to the site's homepage (and to
example.comforapp.example.com). If nothing works, Doris says it's a guess, in italics, so you never mistake her imagination for a fact. -
Manifest V3 gotchas, for anyone trying this: Transformers.js inside a dedicated worker tries to load the ONNX Runtime from a CDN, which extensions are not allowed to do, so the runtime files are bundled and
wasmPathspoints at them. It then turns the loader into ablob:URL that the extension CSP refuses to import, soenv.useWasmCache = false. Two lines that took me an afternoon. - Safety first: soft delete into a Bin folder, snapshots in extension storage, restore that recreates deleted bookmarks and moves the rest back to their exact positions, and standard Netscape HTML backups that any browser can import.
Why Does Open Innovation Matter?
Your bookmarks are a diary you never meant to write: job searches, flats you didn't get, three different "learn Rust in 30 days" courses, health questions you'd rather not explain. Sorting that list is exactly the kind of chore an AI is good at, and exactly the kind of data nobody should have to upload to someone else's API.
With an open-weight model the whole thing changes shape:
- It runs where the data already is. Gemma downloads once and then works offline. Your bookmarks never leave the browser. That's the Anonymous in the name, and it's literal.
- It costs nothing to run. No API key, no account, no per-token bill. A tool you'll use for an hour twice a year should not need a subscription.
- I could swap models freely. Trying 270M, 1B and Gemma 4 was a one-line change, and users get the same choice in a radio button.
- I could see and fix how it fails. When the small model started inventing durations ("languishing for eighteen months" on a bookmark saved that morning) I could change the prompt, constrain the output, and fall back to honest, non-AI descriptions. With a closed API I'd be guessing at a black box.
A closed model would have given me nicer roasts. An open one gave me a product I can actually trust with my mess.
The Lazy Payoff
I started with [N] bookmarks. [M] of them had never been opened. Twenty minutes of swiping from the sofa later, I let go of [X], deleted [D] duplicates and [K] dead links, and the rest now live in [F] folders with names a human can read. I did not sort a single folder by hand.
Doris said she was "almost proud". I'll take it.
Prize Categories
- Best Use of Gemma: Gemma 3 1B (or Gemma 4 E2B) runs fully on-device in the browser via Transformers.js and WebGPU, and does three jobs: summarizing what each page is, writing the verdicts, and naming folders.
來源:DEV Community · dev.to
