Saiki77190 downloadsHide the folder path in internal links so only the file name shows, in both reading view and live preview, while keeping the link target intact. Optional smart [[ suggester floats notes from your most-used folders to the top.
Internal links that include a folder, like [[Personal/SurfacerAI]], normally
display the whole path. Easy Links shows just the file name —
SurfacerAI — while keeping the link target untouched, so clicking still
navigates exactly where it did. Aliased links like [[Personal/SurfacerAI|Alias]]
are left alone.
A/B/Note → Note), in both reading view and live preview. Heading and
block refs are preserved: only slashes in the folder path are collapsed, so
A/B#Heading → B#Heading and a slash inside an anchor (Note#A/B) is left
untouched.![[A/B]] is not shortened in either mode,
so embed labels stay consistent between live preview and reading view.[[ popup
for the plain case, floating notes from your most-used (or hand-picked)
top-level folders to the top of the autocomplete. Off by default. Heading
(#), block (^), and alias (|) completions still use the built-in popup.When Smart link suggester is on, typing [[ opens a popup that ranks notes
from your priority folders first, then by fuzzy match. It matches against both a
note's file name and its frontmatter aliases, just like the built-in popup, and
inserts links using your configured link format (fileManager.generateMarkdownLink),
so wikilink-vs-markdown and shortest-path settings are respected. An empty query
(just [[) lists priority-folder notes most-recently-modified first.
Priority folders are auto-detected as the top-level folders containing the most markdown notes, recomputed as the vault changes. Set Priority folders to pin specific folders instead.
This feature only intercepts the plain [[query case (no ], #, ^, |).
Anything else falls through to Obsidian's native suggester untouched. To win
precedence over the core link popup it reorders Obsidian's internal editor-suggest
list; this is an undocumented internal API, accessed defensively and reverted
when the feature is turned off or the plugin unloads, so disabling it fully
restores the stock behavior.
[[ autocomplete (off by default).A TypeScript project bundled with esbuild (entry src/main.ts → root main.js).
The live-preview feature uses Obsidian's bundled CodeMirror 6, so
@codemirror/view and @codemirror/state are dev-only dependencies (esbuild
externalizes @codemirror/*; they are never bundled).
Obsidian declares an exact peer on @codemirror/state, while @codemirror/view
pulls a newer patch of it, so .npmrc sets legacy-peer-deps=true to let npm
resolve the tree. A package-lock.json is committed so npm ci is reproducible
in CI.
npm install # install dev dependencies (honours .npmrc legacy-peer-deps)
npm run dev # esbuild watch build (inline sourcemap, no minify)
npm run build # tsc --noEmit typecheck, then a minified production bundle
npm run lint # eslint with the Obsidian plugin-guideline rules
styles.css is hand-written at the repo root and auto-loaded by Obsidian.
main.js and styles.css are committed — they are the release assets.
npm version <x.y.z> # bumps package.json, syncs manifest.json + versions.json, makes a bare tag
git push --follow-tags
Pushing the tag triggers .github/workflows/release.yml, which runs npm ci,
lints, builds, verifies manifest.json matches the tag, attests build
provenance, and publishes a GitHub release with main.js, manifest.json, and
styles.css.