"Obsidian Fast Find 10K Plugin (FF10K)"

· Simon Späti ·

13 min read Original article ↗

Last updatedUpdated: by · CreatedCreated: · 12 min read · growing Note status Growing. Worked on quite a bit, still rough. Expect bullets, gaps and views that update. Estimated from edit history · 3 sessions over 6 days · 2,459 words · How my notes grow Recent changes 6 days ago +82 / −8 words last week +113 / −756 words last week published · 2979 words

Fast Find 10k is a new Obsidian plugin I’ve built for my dream search based on fzf and Telescope form Neovim for preview style and fuzzy search, Omnisearch for smarter search, and Smart Connections for similar notes, all based on Rust WASM to be super fast.

New cleaner view and additional feature:

Initial view as a comparison:

Shows FF10K search with results in: direct title match, match in header h3, match in content, bottom left semantic simlar notes and bottom right with smilar notes based on Smart Connections. Install at: Fast Find 10K - Obsidian Plugin.

# The Origin Story

This plugin was created out of my own need for a growing vault beyond 10k Markdown notes. OmniSearch, which I used for years, couldn’t manage to bring me the notes I wanted on the first try, so I had to use Quick Switcher and search by file name only. Sometimes I searched the keywords in the wrong order, or it just couldn’t manage to find them with the long notes, as the idea was buried inside the body somewhere or in the headers.

That’s why I tried to build my dream search, which looks like Telescope.nvim, which I use for Neovim, with a pretty preview for images and notes before I open the actual note.

Then the search has different levels of search: Title/file name, H1-Hx, and then body. But I also integrated it with embeddings from Smart Connection plugin, meaning it shows similar notes directly inline to each note, so I don’t start creating a similar note, or I see similar notes appear which helps me to not duplicate notes.

It’s built with Rust-WASM, so it’s meant for speed, each key press sets off a search and it has some cool features that you can map e.g. oss: open-source, open-source software or k8s: kubernetes or I also integrated a simple language features as my most notes are in English, but some in German, so if I search for house and I enable language feature ctrl+l, it will also find haus notes which is the German word for it.

It has a good fuzzy search, it tolerates typos and still tries to put the most matching word at the top, even though there might be a typo. You can find more details in how ranking works with a few examples and also a comparison to OmniSearch.

This plugin is very early, but I’d like to share it if anybody has a large vault (10k+ notes, hence the name) and would like a new way to find notes.

Feedback welcome

If you use it and see some improvements possible, or things don’t work, I’m very happy to integrate some of them. I am using it daily, and will improve as I go, but it’s very usable already, IMO (I’m biased obviously 🙂 ).

Credits: Some ideas and behavior borrowed from other great plugins: fff, fzf, Telescope, Omnisearch and Smart Connections. Fuzzy matching by neo_frizbee.

The 10k Limit: How it started

I used Omnisearch for 5+ years, and I ran into the 10k limitation of Obsidian. Luckily, Kepano, the CEO of Obsidian, quickly solved (Original limit). The problem was that wikilinks starting with [[ didn’t show notes that existed in the vault. I knew it, sometimes they showed, sometimes they didn’t. In this new plugin I created with Claude Code, I integrated Quick Search, Omnisearch, and Smart Connections into one plugin. And in the bottom right, there are similar notes to show and avoid creating an existing note twice, which is most important to my Obsidian workflow, as I don’t rely on folders, but on search.

# Screenshots and Showcases

Short Video Showcase:

Also see longer Form YouTube Video (13 min):

Check out at YouTube:

File only results toggled with ctrl+f including image preview:

Show why a note ranks toggled with ctrl+r:

On Mobile

Show note with preview - one click for preview, two for open - toggle preview by clicking on preview pill, or set in settings if you want them on or off by default:

Check more use-cases - here with the language feature House also find the German words Haus with +language enabled: img_Obsidian Fast Find 10K Plugin_1793113567241.webp

# Features

Some of the feature FF10K includes:

  • Fast on big vaults. The index is a Rust engine compiled to WebAssembly, running in a Web Worker. On the 9,385-note / 27 MB test vault the finder is searchable about 0.3 s after Obsidian loads (fully indexed after 1.2–1.4 s), and a query takes 4–18 ms inside Obsidian (1–8 ms native). There is no input debounce: every keystroke is a query, and the screen is repainted in under 30 ms. Notes are cached in IndexedDB, so a reload re-indexes only what changed; an edit is picked up within half a second.
  • Accurate ranking in tiers. A note that matches every word in its title or an alias always ranks above one that matches only in a heading, which ranks above body-only matches. Within a tier, field weights, prefix and typo quality, how many title words the query left unmatched, word proximity, backlinks and your own opening history (frecency) decide the order. See How ranking works.
  • Fuzzy, but guarded. troubelshoot still finds “Obsidian Troubleshooting” (one typo for 6–9 letter words, two for 10+, and one typo in titles already at 5 letters: Gitub finds “GitHub”), while scattered subsequences are rejected, so writing does not match “Airbyte Checkpointing”. Word order never matters: ai writing and writing ai return the same list.
  • Why ranked here (Ctrl+R). Every row can show its tier, which field each word hit (exact, prefix or fuzzy, with the quality), and every score component. Reason: “Obsidian Troubleshoot” wins over “Obsidian Trouble Tags Plugin” although the latter matches trouble exactly: two of its title words were not in the query (titleFactor ×0.70), and the first note was opened before (frecency +155).
  • Similar notes, to avoid creating a note twice. The panel bottom right lists near-duplicates of the selected result, and every row carries an N similar pill. Similarity comes from title overlap, plus Smart Connections embeddings when that plugin is installed. Before creating a note with Shift+Enter, the create guard shows the closest existing notes first (“Already have?”). This is the feature that stops a vault with no folders from collecting “AI”, “AI and Data Engineering” and “AI for Data Engineers” three times over.
  • Create when nothing exists. Shift+Enter creates a note named after the query (Mod+Shift+Enter in a new tab). Unresolved [[links]] show as ghost rows ([ghost x2] = linked from two notes) and can be created the same way.
  • Files only (Ctrl+F) switches to titles, aliases and paths, as a Quick Switcher replacement.
  • Telescope layout with preview. Results left, the note preview right with the matches highlighted, vim keys to move (Ctrl+J/K) and to scroll the preview (Shift+J/K). Enter opens, Mod+Enter in a new tab, Mod+Alt+Enter in a split, Alt+Shift+Enter opens all shown results (10 or fewer).
  • Query syntax for narrowing: "exact phrase", #tag, path:folder, -exclude. Optional words (a an the of to in on i by default) never exclude a note, and abbreviations expand (oss → “open source”), both editable in the settings.
  • Respects your vault setup. Obsidian’s “Excluded files” are never indexed, you can add ignored globs, and folders such as an archive can be downranked instead of hidden.
  • Semantic results on demand (Ctrl+S) through Smart Connections embeddings, as a separate tier below the text matches.
  • Resume and recall. “Search (resume last)” reopens the finder with the previous query; notes you keep opening from the same query get a sticky bonus.
  • Local only. No language model, no network. See LLMs or AI.

# At What Size of Obsidian Vault Should I Use FF10K?

FF10K search can be useful from day one if you enjoy the preview, searching by title, integration with Smart Connections, or the speed. But I’d say below 1k notes, you are fine with default search or Quick Switcher (Obsidian default opener), or OmniSearch, too, I used it for many years just fine.

But it is also a matter of how you use Obsidian. I use Zettelkasten method, meaning I barely have any folders, so everything is based on search, so the moment it does not work anymore, Obsidian gets unusable for me.

If you use a lot of folders or tags, you might not need as powerful a search as FF10K.

# Settings

Dedicated settings for FF10K that might be helpful on mobile or good to set; there are more settings, though.

# Resume Last Serarch by Default

A trick I use: maybe I will add it as a default, use the shortcut resume last as a hotkey, this way, it opens the last search, and you can open the other note if you opened the wrong one, and when you type, it will immediately replace the previous text. Not sure if people like that workflow as the default, but it definitely works well for me.

For easy access and search, use as swipe down on mobile:

First, open Settings and go to Interface:

Configure Mobile Quick Action:

And then choose Fast Find 10K (I’d recommend resume last):

After that, swiping down will bring up search anywere 😊.

# How the search/ranking Works

Each query word (and each quoted phrase) must match, except optional words (a an the of to in on i by default), which only add to the score. A note’s tier comes from the weakest field its words matched, and a lower tier never ranks above a higher one:

  1. title · alias: every word in the title or an alias (unresolved link targets, “ghosts”, also appear here and can be created with Shift+Enter). A ghost is hidden when a note of that name exists, compared with diacritics and emoji folded: [[Café]] does not show as a ghost when Cafe.md exists
  2. headings: every word in a title, alias or H1–H3
  3. content: every word somewhere, including body, tags, links and path
  4. partial: some words missing but one in the title or an alias (shown when the other tiers have few hits)
  5. semantic: Smart Connections neighbours of the query, when enabled

Within a tier the score adds the field weights × match quality (exact 1.0, prefix by length ratio, fuzzy below that), shrinks it for title words the query left unmatched, and adds proximity (words close together or in one section), backlinks, a bonus when the title is exactly the query’s words, frecency (opens over the last 30 days, decaying) and a sticky bonus for a note opened three times from the same query. Downranked folders and very short notes are multiplied down. Ctrl+R shows every part for each row.

Find more details to performance and details how the serach is implemented in README.md.

# Examples

All results below come from the CLI on the 9,385-note test vault (ff10k query <vault> "<q>"), which is a copy of my own vault; Obsidian shows the same list.

Word order does not matter. ai writing and writing ai give the same list:

1
2
3
4
1  AI Writing
1  How to detect AI Writing
1  Use Cases of AI Writing (ChatGPT, Lex, etc.)
1  Writing with AI- SSP Data

Typos. obsidian troubelshoot (letters swapped) still puts “Obsidian Troubleshoot” first; the rest are notes with a troubleshooting heading:

1
2
3
4
1  Obsidian Troubleshoot
2  Obsidian                          ### Troubleshooting
2  Vimrc for Obsidian                ## Troubleshoot
2  Obsidian Lag                      ## Debug / Troubleshoot

Fully covered titles win. obsidian trouble ranks “Obsidian Troubleshoot” above “Obsidian Trouble Tags Plugin”, because the second title has two words the query did not mention. Ctrl+R shows it: trouble→title prefix 0.58 · titleFactor ×1.00 versus trouble→title exact 1.00 · titleFactor ×0.70. Type trouble tags and the plugin note comes first.

Phrase, tag, path and exclude. "data engineering" duckdb needs the two words next to each other and duckdb anywhere:

1
2
3
1  Reducing complex Data Engineering Architecture with SQLite and DuckDB
1  What has WebAssembly (WASM) to do with DuckDB and data engineering   [ghost x1]
2  Data Engineering Whitepapers       ## DuckDB

# Comparisons to other Searches

Comparing to OmniSearch and QMD, a CLI outside of Obsidian.

The image is from README.md, but there’s a dedicated comparison.md with printscreens and in-depth comparison.

# Why This Plugin?

Again, this is optimized for large vaults, 10k+ notes (not images). It excludes all images or PDFs, and focuses on markdown notes so they don infer speed

# The name “Fast Find 10K”

The name comes from finding fast notes, which is the key of this plugin and the 10k is a hint to my personal limitation I got from 10k above. It’s not meant to stay like this, or not usable below 10k, it will work peferctly fine too for low files, but that’s the reason why I created it, and hence the name.

# No AI/LLMs

Also, everything deliberately does not use AI/LLMs, only embeddings through Smart Connections that are created locally.

Smart Connection creates local embeddings in .smart-env (a small local embedding model), and we use these to show similar notes. Everything else is just a local index based on your notes.

# Roadmap

  • compqrison to obsidian native search in docs
  • neovim plugin?
  • fix: Preview open by default + on mobile only works in “normal search” (not on last open)
  • Search by properties: reddit, extending exact phrase", #tag, path:folder, -exclude
    • also add bases and canva notes
  • preview of Excalidraw, Mermaid and Canva diagrams
    • exalidraw and canvas does not work too big, but youcan search. and mermaid works
  • need for OR search? not sure if that is the goal, or what’s the benefit? but would be easy to add: Reddit
    • OR is not for this plugin, as i want to find ONE note fast
  • show how many hits/highlight a note has at the top of preview as we might not see hidden highlights Reddit
  • work well on mobile
  • image preview
  • preview

# Further Reads


Origin:
Category: Second Brain & Digital Garden