Initials.AutoLink
1.1.0
dotnet add package Initials.AutoLink --version 1.1.0
NuGet\Install-Package Initials.AutoLink -Version 1.1.0
<PackageReference Include="Initials.AutoLink" Version="1.1.0" />
<PackageVersion Include="Initials.AutoLink" Version="1.1.0" />
<PackageReference Include="Initials.AutoLink" />
paket add Initials.AutoLink --version 1.1.0
#r "nuget: Initials.AutoLink, 1.1.0"
#:package Initials.AutoLink@1.1.0
#addin nuget:?package=Initials.AutoLink&version=1.1.0
#tool nuget:?package=Initials.AutoLink&version=1.1.0
Initials.AutoLink
Turns keyword mentions in Umbraco rich text and markdown into links to the corresponding page, as the page is served. No editor action, no property on your document types, and stored markup is never modified.
An editor writes "we tested this with Claude AI last week". If the keyword Claude AI points at a page, the
phrase renders as a link to it. The editor did nothing.
Write it before that page exists and the link appears the day somebody adds the keyword. No republishing, no backfill, no dead anchors when a target goes away — because nothing was ever baked into the content.
Watch it being set up — a video walkthrough of installing the package and getting the first keyword linking.
Requires Umbraco 17 on .NET 10.
Installing it
dotnet add package Initials.AutoLink
The Umbraco dependency is expressed as [17.6.1, 18), so restore will tell you plainly if you are on a major this
has not been built against, rather than the site failing at runtime.
Then three things, in order:
- Grant the section. Users → User Groups → your group → Sections → Autolink. A new section is granted to nobody by default, administrators included, so until you do this the screen is not reachable and the package looks like it did not install.
- Add a keyword. Autolink → Keywords → add the phrase, and pick where it goes with Umbraco's link picker — a page, or an address outside the site.
- Reload a page that mentions it. That is the whole setup. Nothing is added to your document types, there is nothing for an editor to fill in per page, and no page needs republishing.
The Autolink section
One screen, Keywords, showing both halves of every keyword: where it points, and which published pages currently carry a link because of it. It is where you add keywords, change where one goes, and switch individual links off — either one keyword on one page, or a keyword everywhere.
A keyword whose destination has broken sorts to the top and opens itself. It stops linking rather than falling back to a guess.
What it does to your markup
<a href="/blog/claude-ai/" data-autolink="true">Claude AI</a>
External destinations get data-autolink-external="true" and rel="nofollow" by default. Each external keyword
can switch nofollow off, or open in a new window (target="_blank", with noopener added to the rel). Links into
the site always open in the same window. Everything is marked, so auto-links can be audited, styled, or stripped
wholesale later.
The rules it follows, none of which are configurable per keyword:
- The editor's own casing is preserved, and matching respects word boundaries.
- One link per keyword per page by default. The first mention is the useful one.
- Never inside an existing
<a>,<code>,<pre>or a heading, and never a page linking to itself. - Skipped if the editor already hand-linked to that destination on the page.
- Longest keyword wins, so
Claude AI SonnetbeatsClaude.
Rich text nested inside Block List, Block Grid and nested blocks is covered with no view changes.
Multilingual
Keywords are per culture, each with its own destination and its own resolved URL. A keyword added with no culture applies to every language and is resolved separately for each; a culture-specific one wins over it.
Configuration
Nothing here needs setting to make linking work. Keywords are added on the screen, so there is no tag group to match and no property alias to get right.
{
"Initials": {
"AutoLink": {
"Enabled": true,
"ExternalLinkRel": "nofollow",
"MaxLinksPerKeyword": 1,
"MaxLinksPerPage": 25
}
}
}
Bound through IOptionsMonitor, so edits apply without a restart. The full set of options, including the optional
excludeFromAutoLinking property for pages that should not be scanned at all, is documented on AutoLinkOptions.cs —
the package ships its XML docs, so your IDE has them.
Telemetry
This package sends nothing anywhere of its own. It adds five anonymous counts to the telemetry report Umbraco
already sends to telemetry.umbraco.com, under the level you chose in Settings → Telemetry Data, and only if that
level is Detailed. At Basic, Umbraco reports the package name and version; at Minimal, nothing about it at all.
The five counts, and all there is: keywords, keywords pointing at an external URL, cultures with a culture-specific keyword, per-page suppressions, and global suppressions. No keyword text, no URLs, no page keys, no user names. A keyword is your editorial content and a destination URL can identify a client, so neither goes in a report about the package.
The author does not receive this data. Umbraco aggregates it for the Marketplace.
Removing it
Umbraco has no uninstall hook for a NuGet package: removing the reference removes the assembly and leaves the two tables. Teardown is an explicit call, and it needs an administrator.
DELETE /umbraco/management/api/v1/autolink/data?confirm=remove-autolink-data
It takes every keyword with it. Those tables are the only place keywords live; there is no other copy. It also resets the migration state, which is what makes a reinstall work rather than coming back up with empty tables.
Document types are left alone, so excludeFromAutoLinking and any values in it survive.
Digging deeper
| Document | What it covers |
|---|---|
| Setup video | How to set up the package, start to finish, on video. |
| Technical specification | A developer's map: component by component, the render path, the data model, the migrations. |
| Build log | How it was built and verified, with evidence, measurements and the Umbraco 17 traps that cost the most time. |
| Design decisions | Why it renders instead of publishing, why not Examine, and what the rejected alternatives were. |
Issues and pull requests: github.com/Initials-Labs/Autolink.
Licensed MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AngleSharp (>= 1.7.1)
- Umbraco.Cms.Api.Management (>= 17.6.1 && < 18.0.0)
- Umbraco.Cms.Web.Website (>= 17.6.1 && < 18.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.1.0 | 28 | 9/24/2026 |
| 1.0.0 | 119 | 9/3/2026 |
| 1.0.0-beta001 | 96 | 9/3/2026 |
| 0.1.0-alpha003 | 103 | 9/1/2026 |
| 0.1.0-alpha002 | 91 | 9/1/2026 |
| 0.1.0-alpha001 | 100 | 8/31/2026 |
First stable release. Render-time auto-linking for rich text and Markdown properties, keywords managed in their own backoffice section with page or external destinations, per-culture keyword sets, a dry-run audit with per-page and site-wide suppression, and dependency relations so Umbraco warns before a link target is deleted. Built and verified against Umbraco 17.6.1 on .NET 10.