Overview
DeepLink is an editor plugin for Unreal Engine 4.27 and 5.8 on Windows. It registers a URL scheme for your project (by default the project name, for example myproject://) and turns links such as myproject://content/Game/Spells/Fireball?edit into editor actions. It is meant for teams who discuss assets in chat, reviews and bug reports and want one click to take them to the asset.
- Copy URL that reveals asset in the Content Browser asset context menu (
Alt+Shift+C). - Copy URL that opens asset in the Asset menu of every asset editor (
Alt+Shift+E). - Opening a link while the editor is running hands it to that editor and brings its window to the front; when no editor is running, the editor starts with the project and handles the link once it has loaded.
- Per-user registration under
HKEY_CURRENT_USER\Software\Classes: no administrator rights, no external tools, nothing downloaded. - Works when the editor runs elevated (“Run as administrator”) and the link is opened from a normal user process.
- Configurable URL scheme per project, plus an optional scheme derived from the engine branch name.
- C++ API to register your own endpoints (
myproject://my_endpoint/...) and to choose the URL scheme programmatically. - Selecting several assets copies one link per line.
Requirements
| Requirement | Details |
|---|---|
| Unreal Engine | 4.27 and 5.8 (verified clean on both) |
| Modules | DeepLinkLauncher (UncookedOnly), DeepLinkServer (EditorNoCommandlet), DeepLinkContentEndpoint (EditorNoCommandlet), DeepLinkBranchScheme (EditorNoCommandlet) |
| Dependencies | None (engine modules only). Extra link types are available in the separate DeepLinkPlus plugin. |
| Language | Editor menu commands and settings; extension API in C++. The plugin adds no Blueprint nodes. |
| Platforms | Win64 only (Windows editor). The URL registration uses the Windows registry and a Windows mailslot; no other platform is supported. |
Installation
- Copy the
DeepLinkfolder into your project’sPluginsfolder (or install it to the engine from Fab). - Open the project. If it is a C++ project, let the editor build the plugin modules (or build from your IDE).
- Enable DeepLink in Edit > Plugins and restart the editor.
- On every start the editor registers the project’s URL scheme for the current Windows user.
- C++ only: to add your own endpoints, add
"DeepLinkServer"to your editor module’sPrivateDependencyModuleNames.
Win+R) and press Enter — the Content Browser jumps to the asset. The Output Log category is LogDeepLinkServer.Quick start
In the editor
- Right-click an asset in the Content Browser and choose Copy URL that reveals asset (or press
Alt+Shift+C). - Open an asset, open the Asset menu of its editor and choose Copy URL that opens asset (or press
Alt+Shift+E). This link ends in?edit. - Paste the link anywhere and click it. The editor is already registered as the handler for the scheme; browsers and chat applications may ask for confirmation before they open an external application.
The plugin has no Blueprint nodes; it is used through these editor commands. To react to your own links, use the C++ API:
C++: add an endpoint
// MyEditorModule.Build.cs: PrivateDependencyModuleNames.Add("DeepLinkServer");
#include "DeepLinkServer.h"
#include "Modules/ModuleManager.h"
void FMyEditorModule::StartupModule()
{
IDeepLinkServerModule& Server = FModuleManager::LoadModuleChecked<IDeepLinkServerModule>("DeepLinkServer");
// Handles myproject://my_endpoint/<path>?<query>
Server.Register(TEXT("my_endpoint"), FDeepLinkOnRequest::CreateLambda(
[](const FString& Path, const FDeepLinkQueryParamsMap& QueryParams)
{
// Path is URL-decoded (for example "/Some/Path"); query keys are lower-case.
UE_LOG(LogTemp, Display, TEXT("my_endpoint opened with %s"), *Path);
}));
// Build a link for the endpoint, for example myproject://my_endpoint/Some/Path
const FString Url = Server.GetUri(TEXT("my_endpoint"), TEXT("Some/Path"));
}
void FMyEditorModule::ShutdownModule()
{
if (IDeepLinkServerModule* Server = FModuleManager::GetModulePtr<IDeepLinkServerModule>("DeepLinkServer"))
{
Server->Unregister(TEXT("my_endpoint"));
}
}
How links work
A link has the form <scheme>://<endpoint>/<path>?<query>. The built-in content endpoint takes a package path: myproject://content/Game/Spells/Fireball reveals the asset in the Content Browser, and adding ?edit opens it in its asset editor.
Registration (per user, no administrator rights)
Every time the editor starts, DeepLinkServer writes the current scheme to the current user’s registry hive:
| Key under HKEY_CURRENT_USER | Value |
|---|---|
Software\Classes\<scheme> | Default value URL:<scheme> Protocol and an empty URL Protocol value, which marks the key as a link handler. |
Software\Classes\<scheme>\DefaultIcon | The editor executable’s icon. |
Software\Classes\<scheme>\shell\open\command | "<UnrealEditor.exe>" "<your .uproject>" -DeepLinkPath="%1" (plus -DeepLinkDebug when debug logging is enabled). |
Nothing is written outside HKEY_CURRENT_USER\Software\Classes\<scheme>, so the registration applies only to the Windows user running the editor. When the scheme changes (new setting, new branch), the previous registration is removed — but only if it still points at a DeepLink editor command, so a handler another application registered for the same name is never touched.
Opening a link
- Windows starts the editor command above with the link. The
DeepLinkLaunchermodule runs at the very start of that process: if an editor for the same scheme is already running, it passes the link to it through a local Windows mailslot, allows it to come to the foreground and exits before the engine loads. This takes a moment because a second editor process starts briefly. - If no editor for the scheme is running, startup simply continues: the project opens and the link is handled as soon as the editor has finished loading. Requests that arrive while the asset registry is still scanning are queued until it finishes.
- The last registered editor wins: if two projects or engine versions use the same scheme, links open in the one that started last. Give each project (and each branch, see below) its own scheme.
Settings
Edit > Project Settings > Plugins > Deep Link URLs. Saved in Config/DefaultEditor.ini, so the whole team shares them. Changes take effect after an editor restart.
| Node | Type | Description |
|---|---|---|
| Default URI Scheme | Setting | Scheme used for links when no scheme provider supplies one. Default: the project name in lower case with every character other than letters, digits, ., - and + removed (leading non-letters are dropped too); unrealdeeplink if nothing is left. |
| Enable Debug Logging | Setting | Advanced, default off. Adds -DeepLinkDebug to the registered command so the launcher appends what it does with each opened link to Saved/Logs/DeepLinkLauncher.log. |
Branch based scheme
Studios that keep several branches of the same project open side by side need a different scheme per branch, otherwise links open in whichever branch started last. Project Settings > Plugins > Deep Link URLs - Branch Based Scheme derives the scheme from the branch name the engine build reports.
| Node | Type | Description |
|---|---|---|
| Use Branch Name In URI Scheme | Setting | Default off. When off, the branch settings are ignored and the Default URI Scheme is used. When on, the scheme is the engine branch name after the replacements below, sanitized like the default scheme. Restart required. |
| Branch String Replacements | Setting | List of Token → Replacement pairs applied to the branch name in order. If the list is empty and the branch name starts with ++ (for example ++UE5+Release-5.8), one entry is pre-filled that replaces everything up to the last + with <project scheme>-, giving for example myproject-release-5.8. |
| Branch Name | Read-only | Preview: the branch name reported by the running engine. |
| Scheme Preview | Read-only | Preview: the scheme the current replacements produce. |
| Example Uri | Read-only | Preview: an example content link with that scheme. |
IDeepLinkUriSchemeProvider) win over the scheme remembered from the previous session, which wins over Default URI Scheme. The remembered scheme is only used for the first moments of startup, until every provider has registered.C++ API
Module DeepLinkServer. Headers: DeepLinkServer.h, DeepLinkUriSchemeProvider.h, DeepLink.h.
| Node | Type | Description |
|---|---|---|
| IDeepLinkServerModule | Class | Module interface; get it with FModuleManager::LoadModuleChecked<IDeepLinkServerModule>("DeepLinkServer"). |
| Register | Callable | void Register(FName Endpoint, FDeepLinkOnRequest Delegate) — receive every link whose first path component is Endpoint. Endpoint ids must be unique. |
| Unregister | Callable | void Unregister(FName Endpoint) — remove a handler (call it when your module shuts down). |
| GetUri | Pure | FString GetUri(FName Endpoint, const FString& Path = TEXT("")) — build <scheme>://<Endpoint>/<Path> with the scheme currently registered (empty string if no scheme could be registered). |
| FDeepLinkOnRequest | Delegate | void(const FString& Path, const FDeepLinkQueryParamsMap& QueryParams). Path is URL-decoded and starts with / (empty when the link has no path); query keys are lower-case, values URL-decoded, a key without = maps to an empty string. |
| FDeepLinkQueryParamsMap | Type | TMap<FString, FString> of query parameters. |
| IDeepLinkUriSchemeProvider | Class | Modular feature that chooses the scheme: implement TOptional<FString> GetPreferredScheme() and register it with IModularFeatures::Get().RegisterModularFeature(IDeepLinkUriSchemeProvider::GetModularFeatureName(), Provider). Return an unset optional to let the next provider decide. |
| SanitizeScheme | Pure | DeepLink::SanitizeScheme(FString) — lower-cases the input and strips characters that are not valid in a URL scheme; returns an unset optional if nothing valid is left. |
Troubleshooting
| Symptom | Cause and fix |
|---|---|
| Clicking a link does nothing, or Windows asks which app to use and offers nothing suitable | The scheme is registered when the editor starts. Start the editor once with DeepLink enabled, then check the Output Log (LogDeepLinkServer) for registration errors and that HKEY_CURRENT_USER\Software\Classes\<scheme> exists. |
| A link opens a second editor instead of the one that is running | Another project or branch registered the same scheme after this editor started, or the running editor uses a different scheme than the link. Give every project / branch its own Default URI Scheme (or enable the branch based scheme) and restart the editors. |
| Opening a link while the editor runs takes a few seconds | Expected: Windows starts a short-lived editor process that hands the link to the running editor and exits. Enable Enable Debug Logging and read Saved/Logs/DeepLinkLauncher.log to see each step. |
Log: There is no handler registered for the endpoint ... | The link uses an endpoint that is not loaded in this editor, for example a DeepLinkPlus link in a project without DeepLinkPlus, or your own endpoint before its module started. |
Log: Couldn't find any assets for ... | The asset was moved, deleted or given a new name after the link was copied. Copy a new link. |
| Changed the scheme setting but links still use the old one | All settings are read at startup. Restart the editor; the old registration is removed and the new one written. |
Log: Unable to create Mailslot ... | Another editor on this machine already serves the same scheme. Close it or use a different scheme for this project. |
Credits
© 2026 Alpha XP — alphaxp.net · Support: support@alphaxp.net. Built and verified for Unreal Engine 4.27 and 5.8.