SplatDev.Umbraco.Plugins.ShortUrls
2.1.9
dotnet add package SplatDev.Umbraco.Plugins.ShortUrls --version 2.1.9
NuGet\Install-Package SplatDev.Umbraco.Plugins.ShortUrls -Version 2.1.9
<PackageReference Include="SplatDev.Umbraco.Plugins.ShortUrls" Version="2.1.9" />
<PackageVersion Include="SplatDev.Umbraco.Plugins.ShortUrls" Version="2.1.9" />
<PackageReference Include="SplatDev.Umbraco.Plugins.ShortUrls" />
paket add SplatDev.Umbraco.Plugins.ShortUrls --version 2.1.9
#r "nuget: SplatDev.Umbraco.Plugins.ShortUrls, 2.1.9"
#:package SplatDev.Umbraco.Plugins.ShortUrls@2.1.9
#addin nuget:?package=SplatDev.Umbraco.Plugins.ShortUrls&version=2.1.9
#tool nuget:?package=SplatDev.Umbraco.Plugins.ShortUrls&version=2.1.9
ShortUrls
Umbraco short URL plugin — generate, store, and resolve short URLs backed by any EF Core DbContext. Supports Umbraco 13 (net8.0) and Umbraco 17 (net10.0).

Compatibility
| Umbraco | .NET | Package Version |
|---|---|---|
| 13.x | 8.0 | 2.0.0 |
| 17.x | 10.0 | 2.0.0 |
Installation
dotnet add package SplatDev.Umbraco.Plugins.ShortUrls
Quick Start
Register in Program.cs:
builder.CreateUmbracoBuilder()
.AddBackOffice()
.AddWebsite()
.AddShortUrls() // <-- add this
.Build();
Configuration
Wire up your EF Core DbContext to implement IShortUrl:
// appsettings.json
{
"ConnectionStrings": {
"ShortUrlDb": "Server=.;Database=ShortUrls;..."
}
}
Usage
Implement IShortUrl
Your entity must implement the interface:
using SplatDev.Umbraco.Plugins.ShortUrls.Models;
public class MyShortUrl : IShortUrl
{
public int Id { get; set; }
public string? ShortUrl { get; set; }
public string Url { get; set; } = "";
}
Generate and Resolve
using SplatDev.Umbraco.Plugins.ShortUrls.Services;
var service = new ShortUrlService<MyShortUrl>(dbContext);
// Generate a unique short code (collision-safe)
string code = service.GenerateShortUrl(); // e.g. "xK7mP2"
// Save to DB
dbContext.Add(new MyShortUrl { ShortUrl = code, Url = "https://example.com/long/path" });
await dbContext.SaveChangesAsync();
// Resolve a short URL
string redirectUrl = service.Get(code);
// → "https://example.com/long/path"
Front-End Controller
The ShortUrlController<T> implements IVirtualPageController — it intercepts requests to /s/{random} and issues a 302 redirect to the mapped URL:
// Maps /s/xK7mP2 → redirect to stored full URL
[HttpGet]
public async Task<IActionResult> GetFromShortUrl(string shortUrl)
{
var redirectUrl = shortUrlService.Get(shortUrl);
return Redirect(redirectUrl);
}
Architecture
| Component | Role |
|---|---|
IShortUrl |
Interface your entity must implement (ShortUrl, Url) |
IShortUrlService |
Generate unique codes, check existence, resolve |
ShortUrlController<T> |
MVC controller handling /s/{random} → 302 redirect |
ShortUrlExtensions |
Random URL-safe code generation (collision-checked) |
Changelog
2.1.9 — 2026-08-24
Package metadata only: the listing now carries an icon and search tags, and the project and repository links point at the organisation that actually hosts this code. No code changes.
2.1.8 — 2026-08-21
- A failed request now says so in the dashboard. Previously the dashboard kept its previous (usually empty) state, so a refused or failed call looked identical to having no data.
2.1.7 — 2026-08-21
- Dashboard now sends the backoffice token with its API calls. On Umbraco 17 those calls were arriving unauthenticated and coming back 401, which the dashboard rendered as an empty state rather than an error.
- A failed request now raises a notification instead of leaving the dashboard looking like there is simply no data.
License
MIT © SplatDev
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. 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
- Microsoft.EntityFrameworkCore (>= 10.0.7)
- Microsoft.EntityFrameworkCore.SqlServer (>= 10.0.7)
- Microsoft.Extensions.FileProviders.Embedded (>= 10.0.6)
- Umbraco.Cms.Core (>= 17.3.4)
- Umbraco.Cms.Infrastructure (>= 17.3.4)
- Umbraco.Cms.Web.Common (>= 17.3.4)
- Umbraco.Cms.Web.Website (>= 17.3.4)
-
net8.0
- Microsoft.EntityFrameworkCore (>= 8.0.20)
- Microsoft.EntityFrameworkCore.SqlServer (>= 8.0.20)
- Microsoft.Extensions.FileProviders.Embedded (>= 8.0.11)
- Umbraco.Cms.Core (>= 13.12.0)
- Umbraco.Cms.Infrastructure (>= 13.12.0)
- Umbraco.Cms.Web.Common (>= 13.12.0)
- Umbraco.Cms.Web.Website (>= 13.12.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.