Inline Link Suggestions
approvedby Alexey Alekhin
Underlines plain-text mentions of existing notes (incl. aliases) right in the editor. Click a mention to turn it into a wiki link. - This plugin has not been manually reviewed by Obsidian staff.
Inline Link Suggestions
An Obsidian plugin that spots plain-text mentions of your existing notes while you write and underlines them with a subtle dotted line. Click a mention to turn it into a [[wiki link]] — no sidebar, no dialogs, no leaving the flow of writing.
Why
Obsidian's built-in unlinked mentions live in the backlinks sidebar: per-note, exact-title-only, and you have to go looking for them. This plugin brings unlinked mentions into the editor itself:
- Titles and aliases of all your notes are matched as you type.
- Customizable underline styling: quiet dotted underline by default, no visual noise, theme-friendly. Choose the style, thickness and color you prefer.
- Hover an underline to see the suggested note above the text; click it to link:
[[Note Title]]when the text matches the title,[[Note Title|original text]]when it matched an alias. Link style follows your "Use [[Wikilinks]]" preference. On mobile, tap the underline instead. - Works in reading view too (opt-in setting), linking edits the underlying note.
- Hotkeys: bind a hotkey to Link mention at cursor and never leave the keys while writing.
- Ignore any term from the ✕ button in the same popup if a suggestion is noise.
- Clicking the underlined text itself just places the cursor, editing is never hijacked.
Features
- Fast: an Aho-Corasick automaton scans only the visible part of the editor, so it stays instant even in vaults with 10,000+ notes. Measured (
node scripts/profile.ts): index build ~27 ms for 10k notes (~140 ms for 50k), and ~0.25 ms per viewport scan. - Smart about context: text inside existing links, tags, code, frontmatter, math, and HTML is never underlined.
- No self-links: a note never suggests linking to itself.
- Configurable: underline appearance, case sensitivity, minimum term length, alias matching, excluded folders, and a persisted ignore list.
- Local and private: no network requests, no telemetry, no runtime dependencies.
- Works on mobile.
Commands
You can invoke these commands via the Command Palette (Cmd/Ctrl+P) or assign hotkeys in Settings → Hotkeys (search for "Inline Link Suggestions").
| Command | What it does |
|---|---|
| Link mention at cursor | Links the underlined mention the cursor is in. If the text matches several notes, a menu opens at the mention, pick one with the arrow keys and Enter |
| Ignore mention at cursor | Adds the mention under the cursor to the ignore list, so it's never underlined again |
| Toggle suggestions | Switches the whole feature on and off |
The first two are only offered while the cursor sits in an underlined mention.
Settings
| Setting | Default | Description |
|---|---|---|
| Enable suggestions | on | Master toggle (also a command, see above). |
| Underline in reading view | off | Suggest and link in reading view too. |
| Underline style | Dotted | Dotted, dashed, solid or wavy line under a mention. |
| Underline thickness | Thin | Thin, medium or thick (1–3 px). |
| Underline color | Faint (theme) | Faint, muted or accent — all follow your theme — or a custom color you pick. |
| Case-sensitive matching | off | Require exact case to match. |
| Include aliases | on | Match frontmatter aliases too. |
| Include frontmatter titles | on | Match a note's frontmatter title property too. |
| Minimum term length | 3 | Skip very short titles/aliases. |
| Excluded folders | — | Notes here are never suggested (e.g. Templates/). |
| Disabled folders | — | No underlines while editing notes here (e.g. Journal/). |
| Ignored terms | — | Never underline these; add from the mention popup. |
Folder and term lists are edited as removable chips — type in the field and press Enter to add.
Installation
Find the plugin in the Obsidian community plugin directory and install it from there.
Manual install:
- Download
main.js,manifest.json, andstyles.cssfrom the latest release. - Copy them into
<vault>/.obsidian/plugins/inline-link-suggestions/. - Reload Obsidian and enable the plugin in Settings → Community plugins.
Development
npm install
npm run dev # watch build
npm test # unit tests for the matcher core
npm run test:e2e # end-to-end tests in a real Obsidian instance
npm run test:e2e:mobile # same suite, under Obsidian's mobile emulation
npm run build # type-check + production build
The matching core (src/core/) is pure TypeScript with no Obsidian imports and is fully unit-tested. Editor integration lives in src/editor/ (CodeMirror 6 view plugin).
Mobile testing
End-to-end tests (e2e/specs) run via wdio-obsidian-service against a real, freshly-downloaded Obsidian instance — no mocking. The same specs run twice: once as normal desktop Obsidian (e2e/wdio.conf.mts), once with app.emulateMobile() on (e2e/wdio.mobile-emulation.conf.mts), so the mobile-only tap-to-link path (the Platform.isMobile branch in src/editor/highlighter.ts) is covered without needing a phone or emulator. Both run in CI on every push.
This doesn't cover the real mobile app's Capacitor runtime — only public CM6/Obsidian APIs are used here, so the risk is low, but if that ever matters, wdio-obsidian-service also supports testing the real Obsidian Android app via Appium; see its README.
Roadmap
- Phase 2 — semantic suggestions (opt-in): underline phrases that are semantically close to an existing note even without a literal title match, using local embeddings (Ollama or any OpenAI-compatible endpoint). Local-first, cached on disk, off by default. The
SuggestionProviderinterface insrc/core/types.tsis the seam where this plugs in.
License
MIT
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.