[Plug] Unlinked Mentions — Obsidian-style potential links with one-click wikilink conversion

Unlinked Mentions

A Space Lua plug that shows unlinked mentions (pages that reference the current page name in plain text but don't have a [[wikilink]] to it) at the bottom of every page, with one-click conversion to proper wikilinks.

Features

  • Full-text search via Silversearch
  • Exact substring verification — no false positives from fuzzy matching (Silversearch's fuzzy search would match "Journal/2026-08-07" when searching for "Journal/2026-08-11", so every result is double-checked against actual page text)
  • One-click + button to convert the first safe mention to [[wikilink]]
  • Link all button for batch conversion
  • Safe replacement — skips frontmatter, code blocks, inline code, existing links, and URLs
  • Alias support via frontmatter, converts to [[page|alias]]
  • Collapsible section, configurable default open/close
  • Works with Chinese tokenizer
  • Pure Space Lua, zero build — just drop one .md file into your space

Requirements

  • SilverBullet v2.x
  • Silversearch (install via Configuration Manager first)

Installation

  1. Download Unlinked Mentions.md
  2. Place it anywhere in your space as a .md file
  3. Reload SilverBullet

If you place it somewhere other than Library/kiefeng/Unlinked Mentions.md, update the name field in the file's frontmatter to match its actual path.

Configuration

config.set("std.widgets.unlinkedMentions", {
  enabled = true,
  maxResults = 30,
  minTermLength = 2,
  defaultOpen = true,
  excludeFolders = {"Library/", "System/", "template/", "Template/"}
})

Repository

Feedback, issues, and PRs welcome!

As a ex-logseq user, I love the idea behind this!

I did notice a couple things quickly after installing it though:

  • the tooltips are in Chinese and there's no setting to make them English
  • the widget looks out of place alongside other widgets since you've intentionally changed the header and stuff
  • the settings use the prefix "std.widgets", despite this not being part of any standard library
  • the setting to exclude directories prevents the widget from appearing on those pages, but I'd much rather a setting to exclude directories from appearing in the list on other pages!

For the latter point, here's a screenshot showing how linked mentions and unlinked mentions look completely different:

Thanks for the detailed feedback! All points are addressed in the latest update:

1. English UI — tooltips, notifications and buttons are now all in English.

2. Visual consistency — I aimed to keep the widget as close to Linked Mentions as possible (same H1 heading style, inheriting your theme). It took some iterations to get here, with a couple of deliberate trade-offs:

  • No fold arrow — a native <details> arrow conflicts with the H1 block layout. I removed the arrow and kept the collapse behaviour: the heading itself is clickable.
  • Pure-text snippets — context excerpts go through SilverBullet's own markdown parser and render as plain text, so # headings, **bold** or [[links]] in source pages never leak into the widget as live markdown.

3. Config namespacestd.widgets.unlinkedMentionsunlinkedMentions (you're right, std. belongs to the standard library). Breaking change if you set config explicitly — just rename the key.

4. Excluded folders work both ways and are fully configurable — pages inside excluded folders won't appear in mention lists on other pages, and the widget won't render on those pages. Add your own folders freely:

config.set("unlinkedMentions", {
  excludeFolders = {"Library/", "System/", "template/", "Template/", "Private/"}
})

New commands: the per-result Link button and the bottom Link All button already existed; this update adds two palette commands — Link All (This Page) (all mentions of the current page, with confirmation) and Link All (Full Space) (every mention in the whole space, with confirmation + progress feedback every 50 pages).

Also new: configurable snippet length (contextLen), and refined link-failure messages (distinguishing “mention exists but in an unsafe spot” from “no mention at all”).

Known limitations (feedback welcome):

The space-wide command is deliberately conservative: each mention is converted only at its first safe occurrence per page (to avoid over-linking), and it can be slow on large spaces (progress shown, but still a batch write — back up first if unsure).

Snippet context is line-based, so short lines show short snippets and long lines show long ones.

Silversearch fuzzy matching can surface false candidates; every result is verified against actual page text, but edge cases (e.g. very short page names) may slip through. minTermLength is configurable to reduce noise.

There may be issues I haven’t encountered yet — feedback is always welcome. Thanks for trying it out!