Initials.AutoLink 1.1.0

dotnet add package Initials.AutoLink --version 1.1.0
                    
NuGet\Install-Package Initials.AutoLink -Version 1.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Initials.AutoLink" Version="1.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Initials.AutoLink" Version="1.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Initials.AutoLink" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Initials.AutoLink --version 1.1.0
                    
#r "nuget: Initials.AutoLink, 1.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Initials.AutoLink@1.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Initials.AutoLink&version=1.1.0
                    
Install as a Cake Addin
#tool nuget:?package=Initials.AutoLink&version=1.1.0
                    
Install as a Cake Tool

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:

  1. 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.
  2. 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.
  3. 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.

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 Sonnet beats Claude.

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.