Inline Link Suggestions

approved

by 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.

2 stars415 downloadsUpdated 1mo agoMIT

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.

The editor with dotted underlines on note mentions and a hover popup suggesting a link

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").

CommandWhat it does
Link mention at cursorLinks 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 cursorAdds the mention under the cursor to the ignore list, so it's never underlined again
Toggle suggestionsSwitches the whole feature on and off

The first two are only offered while the cursor sits in an underlined mention.

Settings

SettingDefaultDescription
Enable suggestionsonMaster toggle (also a command, see above).
Underline in reading viewoffSuggest and link in reading view too.
Underline styleDottedDotted, dashed, solid or wavy line under a mention.
Underline thicknessThinThin, medium or thick (1–3 px).
Underline colorFaint (theme)Faint, muted or accent — all follow your theme — or a custom color you pick.
Case-sensitive matchingoffRequire exact case to match.
Include aliasesonMatch frontmatter aliases too.
Include frontmatter titlesonMatch a note's frontmatter title property too.
Minimum term length3Skip very short titles/aliases.
Excluded foldersNotes here are never suggested (e.g. Templates/).
Disabled foldersNo underlines while editing notes here (e.g. Journal/).
Ignored termsNever 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:

  1. Download main.js, manifest.json, and styles.css from the latest release.
  2. Copy them into <vault>/.obsidian/plugins/inline-link-suggestions/.
  3. 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 SuggestionProvider interface in src/core/types.ts is 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.