Linkosaurus

approved

by polygonhunter

Automatically converts keywords into Obsidian wikilinks as you type. - This plugin has not been manually reviewed by Obsidian staff.

2 stars2,599 downloadsUpdated 1mo agoMIT

Linkosaurus

Linkosaurus

Your vault links itself.

Latest release Downloads License

Stop typing [[. Write a word, press Space — the wikilink is already there.

You type:            Tokyo and back.
Your note says:      [[Tokyo]] and back.

Works on desktop and mobile. Runs entirely offline. Zero setup: install, write, watch your vault connect itself.

Why Linkosaurus?

⚡ Type. Space. Linked.

Linkosaurus watches the words you finish and links them the instant you hit Space, Enter, or punctuation — ) . , ! ? : ;. You never stop writing.

You typeLinkosaurus writes
Tokyo [[Tokyo]]
ML [[Machine Learning|ML]]
Berlin.[[Berlin]].
(Paris)([[Paris]])
T-Rex - Facebook [[T-Rex]] - [[Facebook]]

✨ Aliases that finish themselves

The word on the page isn't the note's name? Slip in an alias without breaking flow — // for one word, /// for phrases:

trip//Tokyo                   →  [[Tokyo|trip]]
///cherry blossoms///Tokyo    →  [[Tokyo|cherry blossoms]]

And you don't even have to remember the note's name. Start typing the target and a popup floats in beside your cursor, fuzzy-matched from your note names, keywords, and frontmatter aliases:

trip//T▌
┌──────────────────┐
│ 🔗 Tokyo         │
│ 🔗 T-Rex         │
└──────────────────┘

Enter or Tab drops the finished link — [[Tokyo|trip]], fully formed. (Choose wisely; a trip to the T-Rex is a very different itinerary.)

🔎 Search your vault mid-sentence

Some notes can't be reached by typing alone — T-Rex - Feeding Schedule never gets a chance, because T-Rex links first. So summon the search: type ;; and the popup lists everything linkable in your vault, filtering as you type. Spaces are fine:

;;T-Rex - F▌
┌──────────────────────────────┐
│ 🔗 T-Rex - Feeding Schedule  │
└──────────────────────────────┘

One keypress replaces the whole search — trigger and all — with [[T-Rex - Feeding Schedule]]. Too lazy to type the full name? ;;feed gets you there too. It's fuzzy.

🌐 URLs and emails tidy themselves

Plain web addresses become clean Markdown links on their own — and so do email addresses:

You typeLinkosaurus writes
https://www.github.com[github.com](https://www.github.com)
github.com[github.com](https://github.com)
https://shop.example.com/p?id=1[shop.example.com/p](https://shop.example.com/p?id=1)
team@example.com[team@example.com](mailto:team@example.com)

🧠 And it thinks ahead

  • Smart undo — with Open and Open Source in your list, typing Open S… quietly unlinks [[Open]] and waits for the longer match. You always get the most specific link.
  • Separators stay intactT-Rex - Facebook[[T-Rex]] - [[Facebook]]. The dinosaur keeps its link, the platform gets its own (your T-Rex has social media, no judgement).
  • It learns your vault — every note name becomes linkable the moment the note exists; frontmatter aliases: too.
  • Accents optional — type Lukasz Nowak and get [[Łukasz Nowak]], correctly spelled. Works for every Latin-script language, in both directions.
  • Properties link too — type ;; in a property field for the search popup, or just write the name and leave the field.
  • Paste & dictation — pasted or dictated text arrives pre-linked in a single pass.
  • Periodic auto-relink — optionally re-scan your vault on a schedule so old notes catch up with new keywords.
  • Bulk commands — link a whole note or the whole vault in one go.
  • Private by design — everything runs on your device. No network requests, ever.

The details

Multi-word keywords with smart undo

When one keyword is the beginning of a longer one, Linkosaurus waits a beat to see where you're going.

With both Open and Open Source in your list:

  1. Open [[Open]]
  2. You type S → Linkosaurus realises Open S… might become Open Source, quietly undoes the link → Open S
  3. You type ource [[Open Source]]

If your next character can't continue the longer term (Open H…), the original [[Open]] link simply stays. You never have to think about it.

Alias autocomplete, in full

The suggestion popup only appears inside the alias syntax (// and ///, including custom delimiters) — normal typing stays popup-free. Keep typing to narrow the list (Tky still finds Tokyo), press Esc to dismiss without a trace, or finish the alias by hand; the popup never picks for you. Both accept keys have their own toggle: turn Enter off to keep it for line breaks and link with Tab alone, or the other way around.

The ;; search, in full

The search only starts when you mean it: the trigger does nothing mid-word, doubled up, or followed by a space — so if you change it to * (it's configurable), your bullet lists and bold text stay popup-free. While a search is active the auto-linker stays out of its way, and Esc always dismisses cleanly. Mappings behave exactly like the auto-linker: picking ML inserts [[Machine Learning|ML]].

URL linking, in full

The display text strips the protocol, www., query string, fragment, and trailing slash; the link target keeps the full URL. Bare domains are only linked when their top-level domain is in your allowlist (defaults: de com org net io shop app dev — editable). Toggleable.

Properties

Properties are plain text too, so they get linked as well. Type Museum into an author field, leave the field, and it becomes [[Museum of Natural History]] — no [[, no picker, no remembering the full name.

You type in a propertyLinkosaurus writes
author: Tokyoauthor: "[[Tokyo]]"
author: Museumauthor: "[[Museum of Natural History]]"
publisher: MLpublisher: "[[Machine Learning|ML]]"

A partly typed value completes itself only when exactly one note starts that way — with two Museum… notes in the vault, nothing happens rather than the wrong thing. Whole values are matched, never fragments, so a description full of prose is never rewritten. Values that already contain a link are left alone, and tags, aliases and cssclasses are never touched at all.

Nothing to set up: it's on out of the box and every property counts unless you narrow the list yourself. Scope is deliberately tight — only the note you have open is ever touched, so a sync or another plugin can never set off a chain of edits. There's also a command, Link property values in current note, for catching up older notes.

And the search works there too. Type ;; in any property field and the same popup appears, filtering as you go:

company: ;;Mus▌
┌────────────────────────────────┐
│ 🔗 Museum of Natural History   │
└────────────────────────────────┘

Pick one and the finished link lands in the field. Same trigger, same fuzzy matching, same keys as in the note body.

Email linking, in full

Addresses keep their full spelling as the link text: team@example.com becomes [team@example.com](mailto:team@example.com), ready to click. Unlike bare domains there is no allowlist to maintain — the @ is signal enough, so name@company.fr links just like .com does. A sentence-ending . , ! ? stays outside the link, and addresses that already live inside a link, a mailto: target, or a URL like https://user@host.com are left alone. Toggleable — and with the toggle off, addresses stay plain text, untouched.

Frontmatter aliases

Linkosaurus reads the aliases: field from your YAML frontmatter. If Tokyo.md lists Edo as an alias, typing Edo links straight to [[Tokyo|Edo]]. Toggleable.

Case-insensitive matching

tokyo, Tokyo, and TOKYO all resolve to the same note. Toggleable.

Accents optional

Your colleague's note is Łukasz Nowak.md, but your keyboard isn't Polish. Type Lukasz Nowak and you still get [[Łukasz Nowak]] — spelled the way the note is, not the way you typed it.

It works for every Latin-script language, in both directions, with no letter lists to keep:

You typeIt finds
LukaszŁukasz (Polish)
Gokhan SahinGökhan Şahin (Turkish)
DvorakDvořák (Czech)
NguyenNguyễn (Vietnamese)
Soren or SoerenSøren (Danish)
MuellerMüller (German)
StrasseStraße

The reverse works too — typing Łukasz finds a note named Lukasz.

Languages. The default, All languages, needs no setup and costs nothing: ł only ever means l, ğ only ever means g, so there is nothing for the languages to disagree about. Switch to Only selected languages if you'd rather keep some spellings matched exactly — then pick from Polish, Czech & Slovak, Turkish, German, Scandinavian, Icelandic, French, Spanish & Portuguese, Hungarian, Romanian, Baltic, Croatian & Serbian, and Vietnamese.

Two notes that differ only by accentZürich.md next to Zurich.md — keep their own identities. Linkosaurus notices the clash and falls back to exact spelling for that name alone, so neither ever links to the other. Every other name stays accent-tolerant.

One thing it won't do: if the note itself is named with the plain spelling (Soeren.md) and you type the special letter (Søren), there's no match. Going that direction would mean treating every oe in your writing as a possible ø, which turns poem into pom. Use ;; search or a frontmatter alias for those.

On by default. Turn it off and matching goes back to exact spelling.

Periodic auto-relink

New keywords don't reach back in time on their own — a note created today won't have its name linked in a note you wrote last week. Turn on periodic auto-relink and Linkosaurus re-scans the vault on a schedule (1–60 minutes), converting matches it finds in plain text. It also fires automatically (debounced) when you create or rename a note. Notes you have open are skipped so your cursor never jumps, and every existing rule is respected — blocklist, code blocks, frontmatter, URLs, and self-links.

Off by default; turn it on if you like your whole vault kept in sync.

Bulk commands

CommandWhat it does
Auto-link keywords in current noteLinks every matching keyword in the note you're in, in one pass
Auto-link keywords in all notesA one-shot sweep across the whole vault (open notes are skipped)
Link selection and add to keyword listLinks the selected word and remembers it as a keyword — assign a hotkey for the fastest possible workflow

Where Linkosaurus stays out of the way

It deliberately does nothing:

  • Inside existing [[wikilinks]]
  • Inside [markdown](links)
  • Inside fenced or inline code blocks
  • Inside URLs (unless URL auto-linking is on)
  • Inside YAML frontmatter

Keyword list syntax

You keep your own keywords in the plugin settings, one entry per line:

# Comments start with #
London
Tokyo

# Alias mapping: keyword = target note
ML = Machine Learning
  • London — keyword and target are the same → [[London]]
  • ML = Machine LearningML is what you type, Machine Learning is the note it links to → [[Machine Learning|ML]]
  • Lines starting with # are comments; empty lines are ignored
  • Manual entries always take priority over auto-detected vault keywords

Settings

Linkosaurus ships with more knobs than most people will ever need — every option has a plain-language explanation, so browse the settings tab and the thing you're looking for is probably already there.

SettingDescription
Keyword listYour manually defined keywords
Case-insensitive matchingIgnore case when matching
Ignore accents and special lettersMatch across accents — Lukasz finds Łukasz (on by default)
LanguagesAll languages, or only the ones you pick
Selected languagesWhich languages' characters are folded
Single-word alias delimiterInline alias delimiter for single-word display text (default //)
Multi-word alias delimiterInline alias delimiter for multi-word display text (default ///)
Alias target suggestionsAutocomplete popup for the target part of an alias (on by default)
Note search popupThe ;; quick search across everything linkable (on by default)
Search triggerCharacters that open the note search (default ;;)
Accept suggestion with EnterEnter links the highlighted suggestion (on by default)
Accept suggestion with TabTab links the highlighted suggestion (on by default)
Auto-detect vault linksUse every note name in the vault as a keyword
Include frontmatter aliasesUse aliases: fields from frontmatter as keywords
Minimum keyword lengthFloor for auto-detected keyword length (0 = no limit)
BlocklistKeywords excluded from auto-linking (e.g. Home, Inbox, Daily)
Folder filter modeInclude or exclude folders
Folder filterFolders to filter from vault scanning
Enable periodic auto-relinkPeriodic vault scan that retroactively links keywords (off by default)
Relink interval (minutes)How often to scan (1–60 minutes, default 5)
Auto-link website URLsConvert http(s)://… and bare domains to Markdown links (on by default)
URL top-level domainsTLDs recognised for bare domains (one per line)
Auto-link email addressesTurn typed or pasted addresses into mailto: links (on by default)
Link property valuesLink the text you type into properties (on by default)
Properties to linkWhich property names to link (empty = all but tags, aliases, cssclasses)
Link properties after editingLink a value as soon as you leave the field (on by default)
Complete property namesLet Museum find Museum of Natural History when it is unambiguous (on by default)

Privacy

Privacy is the default, not a feature. Linkosaurus runs entirely on your device — no notes, keywords, or URLs ever leave your vault, and the plugin makes no network requests of any kind. The only thing hosted anywhere is the open-source code, right here on GitHub.

Installation

From Community Plugins

  1. Open Settings → Community plugins → Browse
  2. Search for Linkosaurus
  3. Click Install, then Enable

Manual

  1. Download main.js and manifest.json from the latest release
  2. Drop them into <vault>/.obsidian/plugins/autolink-keywords/
  3. Enable Linkosaurus under Settings → Community plugins

Feedback, questions, ideas

I built Linkosaurus because I wanted linking to disappear as a task — in a good vault the connections are the whole point, and stopping to type brackets pulls you out of writing every single time. It's a small, one-person project, meant to stay quiet and fast: a plugin you forget is running until you notice your notes are all connected.

If you hit a bug, want a feature, or just want to tell me how you use it, head over to GitHub — I read everything, and it's what keeps the plugin moving.

Happy linking. 🦕

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.