A downloadable tool

Buy Now$49.00 USD or more

It does not just tell you. It writes the fix.

Unreal already has a supported, declarative way to say "this old name now means that new name"Core Redirects. Epic ships 817 of them in BaseEngine.ini. This is not a clever trick; it is the vendor's own migration mechanism, used the way it is meant to be used.

Migration Ledger reads the deprecations out of the engine on your machine and generates the redirects your project needs, into a separate, reviewable CoreRedirects.ini. On a stock UE 5.8 install that is 1,446 redirects.

[CoreRedirects]
+ClassRedirects=(OldName="IForceFeedbackSystem",NewName="IInputInterface")   ; deprecated 5.1
+StructRedirects=(OldName="FRHITextureSRVCreateInfo",NewName="FRHITextureSRVCreateDesc")   ; deprecated 5.3
+FunctionRedirects=(OldName="ConvertToRawMesh",NewName="FStaticMeshOperations::ConvertToRawMesh")   ; deprecated 5.5

It does not write into your DefaultEngine.ini for you. You read it, then you paste it. Undoing it is deleting the lines — that is the entire rollback.

-Fix also corrects a .uplugin whose EngineVersion would make the engine skip loading it, and reads the file back to confirm the change actually landed.

Your C++ is never rewritten. Call sites are reported with file, line and the engine's own suggested replacement, and a human applies them. Editing your source automatically is not a risk this tool takes.

Why it exists: your upgrade compiled, and that is not the same as your upgrade working

Unreal will happily open your project on a newer engine, build it with zero errors, and run it — while parts of it have quietly stopped doing anything at all.

Two real examples, both of which shipped before anyone noticed:

  • A plugin's .uplugin declared EngineVersion 5.4.0. On UE 5.8 it compiled perfectly — zero errors, zero warnings, 21 compile actions — then the engine logged Skipping load and never ran a line of it. Nothing in the editor said so.
  • UMaterialInterface::GetUsedTextures (5-arg) was deprecated in 5.7 as final with an empty body. Every call compiled with one warning and measured zero, forever.

Neither was findable by code review. Your compiler cannot help with the first and barely whispers about the second.

Epic's own model has no third state: "If the conversion succeeds, your project will open. If the conversion fails, Unreal Engine will display an error log." A project that converts, opens, compiles and is silently degraded does not exist in that model. It is the one this tool is for.

Every report separates the silent from the noisy

  • Silent degradation — compiles, maybe warns, does not work. Nothing tells you.
  • Deprecated, still working — your compiler mentions these too. Plan the work.
  • Blocker — will not load, build, or cook.

It reads your engine, not a table somebody typed

There is no shipped list of "what broke in 5.6". Migration Ledger parses the deprecation markers out of the engine installed on your machine — so every row is provable against a header on your own disk, for your exact build, and it cannot go stale when you patch.

Measured by the tool itself on a stock UE 5.8 install:

  • Engine headers read: 17,438 of 28,567 discovered
  • UE_DEPRECATED markers indexed: 5,903
  • Resolved to a usable symbol: 5,268 (89.2%)
  • Core Redirects generated for 5.5+: 1,446
  • Index build: ~180s cold, 3s warm

Deprecations are cumulative, so one 5.8 install still carries every 5.0–5.7 entry — which is what lets one installed engine answer questions about several upgrade hops at once.

It runs in CI

UnrealEditor-Cmd.exe YourProject.uproject -run=MigrationLedger ^
    -Output="Saved/MigrationLedger" -FailOn=Silent -Since=5.5 -Redirects

Exit codes are the contract — and there are three, not two:

  • 0 — scan ran; nothing at or above the threshold.
  • 1 — findings at or above the threshold.
  • 2the scan did no real work. Not a pass; nothing was examined.

That third code is deliberate. A tool that scans nothing and reports success is worse than no tool, so this one refuses to call that a pass.

Four report formats: a self-contained HTML report (no external CSS, fonts or scripts, so it survives email, CI artifact stores and network shares), JSON, valid JUnit XML your build server renders natively as test results, and CSV. Every report prints what was scanned — headers, index rows, source files, lines, plugins — and that cannot be suppressed.

The honest limits — read these before you buy

  • Removals are not detected. A symbol deprecated in 5.4 and removed by 5.7 is absent from a 5.8 header and cannot be found this way. Deliberate: removals are hard compile errors your compiler already reports loudly. This tool is for the class it does not.
  • 89.2% of markers resolve to a symbol, not 100%. The rest are reported as unattributed and never guessed at — one wrong entry would produce a false blocker and destroy trust in every other row.
  • A redirect is only emitted when the evidence is strong enough. The engine's message must name an unambiguous replacement, that replacement must be of the right kind (a class redirect points at a class, a function redirect at something callable), and the deprecated symbol must be distinctive enough to be safe — an unqualified Core Redirect applies wherever that name appears. Everything filtered out still appears in the report; only the automatic rewrite is withheld.
  • C++ matching is lexical, with comments and string literals excluded and whole-word boundaries enforced. It can still name a symbol that coincidentally matches one of your own identifiers. Every finding carries a file and line so you can judge it in a second.
  • Silent-vs-warning is a heuristic based on the engine's own wording. It is a ranking that puts the dangerous ones on top, not a guarantee.
  • Verified on UE 5.8 only. That is the only engine this was built and tested against, and the only version claimed.

Why now

UE 5.8 is the final major UE5 release, with UE6 Early Access targeted for end of 2027. Measured across Engine/Source and Engine/Plugins: 10,401 versioned deprecation markers, of which 5.5–5.8 alone account for 7,168 — 69% of every deprecation in the engine. 5.8 carries the largest single-version deprecation count in Unreal's history. Everyone consolidating onto 5.8 is crossing the biggest deprecation batch Epic has ever shipped.

What you get

Full C++ source, raw and readable, because you may need to debug and extend it. One editor module, no Slate dependency — the whole analysis path runs headless. 31 automation tests ship with it and run in your own editor via Automation RunTests CSAF.MigrationLedger.

Requires Unreal Engine 5.8.

More from CSAF

Asset Sentinel — the other half of the same idea for Unreal: asset standards, texture and mesh budgets and folder policy as data assets, enforced headless in CI. Migration Ledger catches what an engine upgrade broke; Asset Sentinel catches what your team is about to commit.

The same problem exists on the other side of the fence, and we build there too: CoreCLR Migration Scanner finds every Mono-dependent construct before Unity's runtime change removes it, and Play Compliance finds the Android plugin that will block your Play update on 1 February 2027.

Everything we ship is raw readable source with unlimited commercial use and no royalties. The whole catalogue — Unreal, Unity, GameMaker and RPG Maker MZ — is at csaf.itch.io.

Purchase

Buy Now$49.00 USD or more

In order to download this tool you must purchase it at or above the minimum price of $49 USD. You will get access to the following files:

migration-ledger-ue5-plugin.zip 61 kB
Version 1.0.0

Development log

Leave a comment

Log in with itch.io to leave a comment.