Skip to main content

Notion Search

Search Notion by what you mean, not just what you typed.
A private, offline replacement for the Cmd+K search in Notion Desktop, powered by Google's EmbeddingGemma 2.

PyPI version macOS, Apple Silicon MIT license

uvx notion-search

Notion's own search leans on exact words and titles. It misses text deep inside long pages, links you saved, and anything you only remember by its meaning. Notion Search keeps the same Cmd+K box and answers it from your own Mac instead. It indexes every page in your workspace and ranks each query by exact words and by meaning together. Each result opens at the block that matched, with Notion's blue highlight.

Install

You need a Mac with Apple Silicon, Notion Desktop in /Applications, and uv (brew install uv works). Then run:

uvx notion-search

The first run takes 5 to 10 minutes and sets up everything: the command, the model (about 900 MB, once), the index and a background service that starts at every login. Open Notion and press Cmd+K. Run notion-search any time for the menu.

The menu

Option What it does
Update Gets the newest release, then refreshes the service and index
Status Shows whether the service is running and linked to Notion
Restart Restarts the background service
Reindex Rebuilds the index from scratch (2 to 3 minutes)
Uninstall Removes the service, index, model and the command

The same actions work as commands: notion-search update, status, restart, reindex, uninstall, and logs.

What gets searched

Page titles and folder paths, and the full text of every page: toggles, columns, lists, callouts and table cells. Long pages are split into chunks of about 1,500 characters, so a match deep inside a page still finds it.

Not searched: database properties (status, tags, dates) and the contents of PDFs, images and other files. Notion Desktop must have opened a page at least once before it can be indexed. New and edited pages are picked up within about 15 seconds.

Private

Everything runs on your Mac. No page text, query or telemetry leaves it, and it works offline. The only download is the model, once. Notion's database is opened read-only and Notion's app files are never changed.

The service talks to Notion over Chromium's DevTools port (127.0.0.1:9222), which any process running as you can reach. Do not use this on a Mac that other people control.

How it works

Notion Desktop ── Cmd+K ──> /api/v3/search request
        │  (intercepted over the DevTools port)
        ▼
service.py ──> engine.py ──> answer in Notion's own response format
        │                    ├─ SQLite FTS5 index   (exact words)
        │                    └─ vectors             (EmbeddingGemma 2, MLX, 8-bit)
        ▼
indexer.py: reads Notion's local database (read-only),
re-embeds only the pages whose text changed

Each query runs both ways and the results are merged. A meaning match only counts when it stands well above the usual score for that query, so nonsense queries return nothing. Pages that hold all your words, and the page you have open, get a small boost. Under each result you see the one block that matched best.

Search takes about 20 to 50 ms. Memory is about 800 MB, mostly the model. The first index takes 2 to 3 minutes for about 800 pages. After that only changed pages are processed.

FAQ

Why does Notion restart when I open it? Notion has to run with a debug port so the service can answer its searches. If you open it normally, the service restarts it once with the port enabled. Your pages are safe, because Notion saves continuously.

Windows or Linux? Not yet. The model runs on MLX, which needs Apple Silicon. A port would be a welcome contribution; see CONTRIBUTING.md.

Does it work in the browser? No. It needs Notion Desktop for Mac.

Something is wrong. Run notion-search status, then notion-search logs. If results look stale, choose Reindex in the menu.

How do I remove it? Run notion-search, choose Uninstall and confirm. uv stays, because other tools may use it.

Contributing

Issues and pull requests are welcome. Please read CONTRIBUTING.md first.

Credits

Built with ideas from DigUp by ARahim3 (MIT), which searches local files with the same model: the model card's query and document prompts, scoring a hit against the whole score distribution for a query instead of a fixed cutoff, and a model fingerprint in the index so a model change triggers a rebuild.

License

MIT. See LICENSE. Notion Search is not affiliated with Notion Labs, Google or Apple. Notion is a trademark of Notion Labs, Inc.

Metadata

Release files for notion-search 0.1.10

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for notion-search 0.1.10
File Size Uploaded
notion_search-0.1.10.tar.gz 25.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for notion-search 0.1.10
File Interpreter ABI Platform
notion_search-0.1.10-py3-none-any.whl Python 3 none any Details

Total release size: 53.3 kB

Release files / notion_search-0.1.10.tar.gz

Download URL notion_search-0.1.10.tar.gz
Size 25.7 kB
Tags Source
SHA-256 checksum
How to use checksums
1187ff2f98eb97274dd01dae1ce8f295d0cd63af3209e1e53e003ab9b239b115
BLAKE2b-256 checksum
How to use checksums
8fa28939c59cf7f8f1735adda346306527ae21e9e0594514a5e329e7edc32818
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / notion_search-0.1.10-py3-none-any.whl

Download URL notion_search-0.1.10-py3-none-any.whl
Size 27.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
34019fb30024d61916f5a72f3170e41976ba6e9d3808934c9132bd7a0fefef68
BLAKE2b-256 checksum
How to use checksums
cbfb73f44f5b79b5216a315e313818d25f16983de1141ed692620b8e1c3caf55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.11

2 release files

This release

0.1.10 This release

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page