Local semantic search over your browser bookmarks โ on-device embeddings, no cloud.
Project description
๐ mindmark
Your bookmarks, finally searchable.
Ask in natural language โ mindmark remembers what you saved.
100% local ยท No cloud ยท No API keys ยท Nothing leaves your machine
Table of Contents
- Features
- Prerequisites
- Install
- Quick Start
- Usage
- How It Works
- Storage Layout
- Uninstall
- Development
- License
โจ Features
| Command | What it does |
|---|---|
mindmark sync |
Auto-detect installed browsers and sync bookmarks directly โ no export needed |
mindmark find "query" |
Semantic search over titles, folders, domains, and URL slugs โ returns top-K with similarity scores |
mindmark open "query" |
Search and open the best match in your default browser |
mindmark stats |
Show index size, model info, top domains, and top folders |
mindmark index <file> |
Import bookmarks from an exported HTML file (legacy workflow) |
๐ Works offline after the first run. Embeddings run on-device via fastembed (ONNX Runtime, ~130 MB one-time model download).
Supported Browsers
| Browser | macOS | Linux | Windows |
|---|---|---|---|
| Chrome | โ | โ | โ |
| Edge | โ | โ | โ |
| Brave | โ | โ | โ |
| Firefox | โ | โ | โ |
mindmark reads bookmark files directly from browser data directories โ no export step, no browser extension.
๐ Prerequisites
| Requirement | Details |
|---|---|
| Python 3.9+ | python.org/downloads โ on Windows, check "Add Python to PATH" during setup |
| pip | Bundled with Python โ verify with pip --version or pip3 --version |
| Internet | Needed only once to download the embedding model (~130 MB). Everything after that is offline |
๐ก Windows tip โ Python PATH
If you installed Python from the Microsoft Store, python and pip are already on your PATH.
If you installed from python.org, make sure you checked "Add Python to PATH" during setup.
๐ฆ Install
Recommended โ pipx (isolated + globally on PATH)
pipx install mindmark
Don't have pipx?
pip install --user pipx && pipx ensurepath # then restart your terminal
Or on macOS with Homebrew: brew install pipx
Alternative โ pip with a virtual environment
macOS / Linux:
python3 -m venv .venv && source .venv/bin/activate
pip install mindmark
Windows (PowerShell):
python -m venv .venv; .venv\Scripts\Activate.ps1
pip install mindmark
Windows (Command Prompt):
python -m venv .venv && .venv\Scripts\activate.bat
pip install mindmark
Editable install for development
git clone https://github.com/sukanth/mindmark.git
cd mindmark
pip install -e .[dev]
โก Quick Start
1๏ธโฃ Sync your bookmarks (no export needed!)
mindmark sync
That's it โ mindmark auto-detects your installed browsers, reads their bookmark files directly, and builds a searchable index. No manual export required.
First run downloads the embedding model (~130 MB) and caches it locally. Every run after that is instant and fully offline.
๐ก See which browsers were detected
mindmark sync --list-browsers
Example output:
Browser Profile Path
------- ------- ----
Chrome Default ~/Library/.../Google/Chrome/Default/Bookmarks
Chrome Profile 3 ~/Library/.../Google/Chrome/Profile 3/Bookmarks
Edge Default ~/Library/.../Microsoft Edge/Default/Bookmarks
๐ก Sync a specific browser only
mindmark sync --browser chrome
mindmark sync --browser firefox
mindmark sync --browser edge
mindmark sync --browser brave
๐ก Alternative โ import from an exported HTML file
If you prefer the manual export workflow, or need to import bookmarks from an unsupported browser:
| Browser | How to export |
|---|---|
| Edge | edge://favorites โ โฏ โ Export favorites โ save as HTML |
| Chrome | chrome://bookmarks โ โฎ โ Export bookmarks โ save as HTML |
| Firefox | Ctrl+Shift+O (Cmd+Shift+O on macOS) โ Import and Backup โ Export Bookmarks to HTML |
# macOS / Linux
mindmark index ~/Downloads/bookmarks.html
# Windows (PowerShell)
mindmark index "$env:USERPROFILE\Downloads\bookmarks.html"
2๏ธโฃ Search in natural language
mindmark find "python async tutorial"
mindmark find "react hooks best practices" -k 5
mindmark find "helm chart examples" --domain github.com
mindmark find "docker compose setup" --folder devops
3๏ธโฃ Open a result directly
mindmark open "k8s cheat sheet" # opens the best match
mindmark find "docker setup" --open 2 # opens result #2 from the list
๐ก Tip โ create a short alias
macOS / Linux โ add to ~/.bashrc or ~/.zshrc:
alias mm='mindmark open'
mm "docker setup"
Windows โ add to your PowerShell $PROFILE:
Set-Alias mm mindmark
mm open "docker setup"
4๏ธโฃ JSON output for scripting
Pipe results into fzf, jq, Alfred, Raycast, PowerToys Run, or any tool that accepts JSON:
# macOS / Linux
mindmark find "istio service mesh" --json | jq '.[].url'
# Windows (PowerShell)
mindmark find "istio service mesh" --json | ConvertFrom-Json | ForEach-Object { $_.url }
๐ Usage
Syncing
mindmark sync reads bookmarks directly from your browser data directories. It's incremental โ only new or changed bookmarks are re-embedded, making re-syncs near-instant.
mindmark sync # sync all detected browsers
mindmark sync --browser chrome # sync only Chrome
mindmark sync --browser firefox # sync only Firefox
mindmark sync --list-browsers # list detected browsers and profiles
When you add new bookmarks in your browser, just run mindmark sync again โ it will pick up only the changes.
๐ก Note: If you change the embedding model with
--model, all bookmarks will be re-embedded on the next sync. Browser names are case-insensitive (e.g.,--browser Chromeand--browser chromeboth work).
Filters
Narrow down results without changing your query:
mindmark find "useful tools" --domain github.com # only github.com results
mindmark find "useful tools" --folder work/kusto # only bookmarks in matching folders
mindmark find "useful tools" -k 20 # return top 20 instead of 10
Re-indexing
For the sync workflow, just rerun mindmark sync. It's incremental โ only changed bookmarks are re-embedded.
For the index workflow, rerun mindmark index <file>. It clears and rebuilds the index. The model is cached, so re-indexing 800+ bookmarks takes only seconds.
Swap the embedding model
mindmark sync --model BAAI/bge-small-en-v1.5 # default, 384-dim
mindmark sync --model sentence-transformers/all-MiniLM-L6-v2
mindmark sync --model BAAI/bge-base-en-v1.5 # 768-dim, higher quality
The --model flag also works with mindmark index. Switching models triggers a full re-embed automatically. See the fastembed supported models list.
๐ง How It Works
Browser data files "python async tutorial"
(Chrome JSON / Firefox SQLite) โ
โ โ
โผ โผ
โโโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ
โ Detect & โโโถโ Embed โโโถโ Store โ โ Embed โ
โ Parse โ โ (ONNX) โ โ (SQLite) โโโโโโโ query โ
โโโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ
โฒ โ โ
โ โผ โผ
only new/ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
changed โ Dot-product similarity โ
bookmarks โ โ top-K results โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- Detect โ Auto-discover installed browsers (Chrome, Edge, Brave, Firefox) and their profiles across macOS, Linux, and Windows.
- Parse โ Read bookmark files natively: Chromium JSON format or Firefox
places.sqlite. No export step needed. - Diff โ Hash each bookmark's content and compare against the existing index. Only new or changed bookmarks proceed to embedding.
- Embed โ Each bookmark becomes a rich text string (
title | folder | domain | path) and is passed through a BGE/MiniLM ONNX model. Vectors are L2-normalized. - Store โ Vectors live as
float32blobs in a single SQLite file. Abookmark_sourcestable tracks which browser contributed each bookmark, so multi-browser syncs don't conflict. - Search โ Encode the query, compute dot products against all vectors, return the top-K.
๐๏ธ Storage Layout
| What | macOS / Linux | Windows | Override |
|---|---|---|---|
| Index database | ~/.mindmark/index.db |
%LOCALAPPDATA%\mindmark\index.db |
--db flag or MINDMARK_DB env var |
| Home directory | ~/.mindmark/ |
%LOCALAPPDATA%\mindmark\ |
MINDMARK_HOME env var |
| Embedding model | ~/.cache/fastembed/ |
%LOCALAPPDATA%\fastembed\ |
Managed by fastembed |
๐๏ธ Uninstall
pipx uninstall mindmark # if installed with pipx
pip uninstall mindmark # if installed with pip
Remove stored data (optional)
The index and cached model are stored outside the package:
macOS / Linux:
rm -rf ~/.mindmark # index database
rm -rf ~/.cache/fastembed # cached embedding model (~130 MB)
Windows (PowerShell):
Remove-Item -Recurse "$env:LOCALAPPDATA\mindmark" # index database
Remove-Item -Recurse "$env:LOCALAPPDATA\fastembed" # cached embedding model
If you set a custom
MINDMARK_HOME, remove that directory instead.
๐ ๏ธ Development
Contributions are welcome! See CONTRIBUTING.md for full details.
git clone https://github.com/sukanth/mindmark.git
cd mindmark
pip install -e .[dev]
pytest -q
Publishing to PyPI
First-time setup
- Create an account at pypi.org
- Generate an API token at pypi.org/manage/account/token/
- Install build tools:
pip install build twine
Test on TestPyPI first (recommended)
python -m build
python -m twine upload --repository testpypi dist/*
pipx install --index-url https://test.pypi.org/simple/ mindmark
Publish to PyPI
python -m build
python -m twine upload dist/*
Use __token__ as the username when prompted.
Alternative distribution methods
GitHub release
python -m build
gh release create v0.1.0 dist/*
# Users install:
pipx install https://github.com/sukanth/mindmark/releases/download/v0.1.0/mindmark-0.1.0-py3-none-any.whl
Standalone executable (no Python required)
pip install pyinstaller
pyinstaller --onefile -n mindmark -p src src/mindmark/__main__.py
# Creates: dist/mindmark (macOS/Linux) or dist/mindmark.exe (Windows)
Docker
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir .
ENTRYPOINT ["mindmark"]
docker build -t mindmark .
# Sync from browser bookmarks (mount browser data directories)
# Note: browser data paths vary โ this example is for macOS Chrome
docker run --rm \
-v $HOME/.mindmark:/root/.mindmark \
-v "$HOME/Library/Application Support/Google/Chrome":/chrome:ro \
mindmark sync
# Or import from an exported HTML file
docker run --rm -v $HOME/.mindmark:/root/.mindmark \
-v $HOME/Downloads:/downloads mindmark \
index /downloads/bookmarks.html
๐ License
MIT โ see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mindmark-0.1.4.tar.gz.
File metadata
- Download URL: mindmark-0.1.4.tar.gz
- Upload date:
- Size: 30.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4226f7a6ae227890a512ad59c69292e9d2970dd9e44d820bc219e54634158641
|
|
| MD5 |
575b33c030a9f3539b20102e94a4a424
|
|
| BLAKE2b-256 |
2c06a0d8b7ed9e79e98fcec265986d9a9912108088cb0610b617d5de1c9254be
|
Provenance
The following attestation bundles were made for mindmark-0.1.4.tar.gz:
Publisher:
publish.yml on sukanth/mindmark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mindmark-0.1.4.tar.gz -
Subject digest:
4226f7a6ae227890a512ad59c69292e9d2970dd9e44d820bc219e54634158641 - Sigstore transparency entry: 1339435793
- Sigstore integration time:
-
Permalink:
sukanth/mindmark@eb936b5519264bc27deb36acece2d6cbb4e90a64 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/sukanth
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eb936b5519264bc27deb36acece2d6cbb4e90a64 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mindmark-0.1.4-py3-none-any.whl.
File metadata
- Download URL: mindmark-0.1.4-py3-none-any.whl
- Upload date:
- Size: 21.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29c658f425b52d5d81ece0167111aed169e3365d35132d5fd8d813a263309088
|
|
| MD5 |
d5bbf165bb4d8792e9303a76edee9204
|
|
| BLAKE2b-256 |
6ccbb1593992a8c92d9d7565ab3eac0209e7f0392e7fd68ee7f75c7d0077df40
|
Provenance
The following attestation bundles were made for mindmark-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on sukanth/mindmark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mindmark-0.1.4-py3-none-any.whl -
Subject digest:
29c658f425b52d5d81ece0167111aed169e3365d35132d5fd8d813a263309088 - Sigstore transparency entry: 1339435897
- Sigstore integration time:
-
Permalink:
sukanth/mindmark@eb936b5519264bc27deb36acece2d6cbb4e90a64 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/sukanth
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eb936b5519264bc27deb36acece2d6cbb4e90a64 -
Trigger Event:
push
-
Statement type: