Build Mymind
KINDAreplaces $12.99/mosaves $155.88/yrback to the verdict
A local library that swallows links, images, screenshots and notes in one action, extracts what it can from each, derives tags and a one-line description, and serves a visual grid with search that covers extracted text, derived tags and the text inside images.
Before step 1
Everything below is assumed from the first step. Tick each one when you actually have it, not when you plan to.
- installfree
Why Runs the capture endpoints, extraction and search.
Get it nodejs.org, or nvm install 22. open ↗
Verify
node --version prints v22 or higher - installfree
Why Screenshots are the majority of what a library like this holds and are invisible to search without it.
Get it Install Tesseract with the language data you need, or use a platform recognition interface if one is available to you.
Verify
A screenshot of text returns its content - have readyfree
Why Search quality and grid performance are both meaningless against generated data, and the vague queries that matter only exist against your own material.
Get it Import from wherever you currently save things: browser bookmarks, a screenshots folder, a notes application.
Verify
At least three hundred real items are imported - API keypay per token; tagging an item is a fraction of a cent
Why Phase 3 only. Capture, extraction and search all work with no model, which is a legitimate configuration.
Get it A provider key with a spend limit, or a local model if you would rather nothing left the machine.
Verify
A captured item receives tags and a description - have readyfree
Why Phase 4's real benchmark. Exact-match testing tells you nothing about the retrieval this tool exists for.
Get it Write down ten items you know are in your library described the way you would actually search for them.
Verify
The ten queries are recorded with their expected items
Data model
Create these before the first phase that stores anything. Changing a table later is the expensive kind of change.
- items(id, kind, url, title, description, captured_at, source, colour_hex) · kind is link, image, note or highlight - content(item_id, extracted_text, ocr_text, extracted_at, extractor_version) - assets(item_id, path, kind, width, height, bytes, thumb_path) - tags(id, name), item_tags(item_id, tag_id, source, confirmed) · source is derived or manual - items_fts · full text over title, description, extracted text and recognised text - A derived tag is a suggestion until confirmed or corrected, and a correction is never overwritten by a later derivation.
Environment variables
These go in a .env file the app reads at startup. The pack's .env.example is this table as a file · copy it, never commit the filled-in version.
| Variable | Needed | Example | Where the value comes from |
|---|---|---|---|
DB_PATH | required | ./data/library.db | Items, extracted text and tags. A revealing dataset, so treat backups accordingly. |
ASSETS_DIR | required | ./data/assets | Original images and stored page copies, plus thumbnails. |
WATCH_DIR | required | ~/Desktop/Screenshots | Folder watched for screenshots. Files here are copied rather than moved. |
CAPTURE_TOKENsecret | required | replace-with-a-random-token | Used by the bookmarklet and the share endpoint. Scoped to capture only. |
ENRICH_PROVIDER | required | local | Which model derives tags. Local means nothing leaves the machine. |
THUMB_LONG_EDGE | required | 600 | Thumbnail size. Large enough to recognise, small enough to scroll thousands. |
The build, in order
Capture in one action
Saving anything takes one action and asks for nothing.
Posts the URL, title and any selection. No form, no confirmation dialogue.
Files
public/bookmarklet.jsWith a settle check, so a file still being written is not captured half formed.
Files
src/watch.jsAn endpoint taking a URL or an image. The phone is where most captures happen.
Files
src/capture.js
done when · tick each as it passeswatch out- Adding one optional field at capture is enough to break the premise, because an optional field still asks for a decision and most people will stop to fill it. Capture nothing but the content and the source; everything else is derived or edited later.
Getting text out of everything
A screenshot is as findable as a note, because its text was read.
Readability, sanitised so the stored copy makes no outbound requests when viewed.
Files
src/extract.jsterminalnpm install @mozilla/readability jsdom
Every image, not only ones that look like screenshots. The distinction is not reliable.
Files
src/ocr.jsRather than letting them vanish from search. They are the ones you will look for and not find.
Files
src/extract.js
done when · tick each as it passeswatch out- A screenshot with no recognised text is invisible to search, and screenshots are usually the majority of what people save in a tool like this. Run recognition on every image, and where it produces nothing, mark the item as needing attention rather than letting it disappear into the grid.
Tags derived, never demanded
Items acquire tags without you filing anything, and your corrections stick.
On capture, from extracted text. Not on a schedule over the whole library.
Files
src/enrich.jsCorrected and removed tags are permanent decisions and are excluded from derivation.
Files
src/tags.jsAn item with no extraction gets no tags. Invented tags are worse than none.
Files
src/enrich.js
done when · tick each as it passeswatch out- Re-deriving tags on a schedule and overwriting user corrections teaches people their edits do not matter, and they stop correcting, and the tags degrade. Mark corrected tags and leave them alone, deriving only for items that have none.
Retrieval, which is where the effort belongs
Something you saved a year ago and cannot describe still comes back.
Title, description, page text, recognised text and tags in one index.
Files
src/search.jsKind, date and dominant colour. Colour is surprisingly effective for images.
Files
src/filters.jsTen things you half remember. This is the real benchmark rather than exact matches.
Files
eval/queries.json
done when · tick each as it passeswatch out- Searching only titles and tags fails for exactly the items this tool exists to hold: the screenshot with no title and the image whose content you remember but cannot name. Index everything extracted, and test with queries describing content rather than metadata.
A grid you actually browse
Scrolling the library is fast and you recognise things by sight.
Not on scroll. Doing it lazily is why these grids stutter.
Files
src/thumbs.jsStored at capture so the layout is stable before images load.
Files
src/grid.jsNo network request. The archive is the point and it must work offline.
Files
src/item.js
done when · tick each as it passeswatch out- Loading full images into a grid makes scrolling stutter and consumes memory, and it gets worse as the library grows so it feels fine for the first month. Generate thumbnails at capture, give every tile explicit dimensions so the layout does not shift, and load full images only when an item is opened.
Privacy, export and keeping it yoursproduct builder
The library is portable and nobody but you can reach it.
One index file per item. Readable without this application, which is the ownership claim.
Files
src/export.jsBefore it leaves your machine. This dataset deserves it.
Files
src/auth.jsSo nothing needs to be sent. State which is active in the interface.
Files
src/enrich.js
done when · tick each as it passeswatch out- A library of everything you found interesting is an unusually revealing dataset, more so than a browser history because you chose to keep each item. Authenticate before exposing it anywhere, and be explicit about whether the enrichment step sends your content to a provider.
That is the whole plan for Mymind. What it deliberately does not cover is below · check the gaps before you call it a replacement.
- Tagging quality tuned across many libraries.
- Native mobile applications with a share sheet.
- Visual similarity search.
- Anything social or shared.
- Real browser extensions and a mobile share sheet, so capture friction goes way up
- Image understanding that recognizes objects, art, color palettes and text in photos at Mymind's quality
- Sync across devices, plus offline capable native apps
- Serendipity features: the everything-search, the surfacing of old cards, spaced resurfacing
- Someone else's ongoing judgment about what a good tag actually is
- Visual similarity search using image embeddings, which is the natural next retrieval mode
- A weekly resurfacing of older items, since a library nobody revisits is a landfill
- Deduplication of the same page saved twice from different sources
Need the files? The project pack on the verdict page hands your agent the whole brief · more bookmarks.