Clean up your Unreal project without the fear of deleting something you need.

SafeSweep shows what takes up space, tells you why every asset is kept, and moves what nothing uses into a quarantine you can restore at any time.

Unreal Engine 5.5 Unreal Engine 5.8 Windows Editor only English · 한국어
Get SafeSweep on Fab

Quick start

  1. Enable the plugin under Edit > Plugins > SafeSweep and restart the editor.
  2. Open Tools > SafeSweep.
  3. Click Scan project. A typical project of a few thousand assets scans in well under a second.
  4. Review the result. Folders that are entirely unreferenced are highlighted; double-click any row to find it in the Content Browser.
  5. Tick what you want gone and click Quarantine checked. Nothing is deleted.
  6. Play your game in the editor. If it needs something you quarantined, SafeSweep tells you and offers to bring it back.
  7. When you are confident, delete the quarantine folder from the Content Browser. That is the only step that deletes anything, and it is yours.
SafeSweep folder view with the restore menu and a play-session warning
Scan, quarantine, verify while you play, restore.

The SafeSweep window

ControlWhat it does
Scan projectScans everything under /Game and refreshes the view.
Quarantine checkedMoves the checked assets into a new quarantine batch, after a confirmation.
RestoreLists quarantine batches by time and contents. Restore one batch, in any order, or all of them.
Show quarantine folderOpens the quarantine folder in the Content Browser.
By folder / ListTree with totals per folder, or a flat list of every package. Click a column header to sort.
Show only unreferencedHides everything that is in use.
English / 한국어Switches the language of the window. The choice is saved per user.

The summary at the top shows the total size, how many packages are unreferenced, the largest asset types, and a Kept because line that counts how many packages are kept for each reason.

In the folder view, a folder's checkbox selects every unreferenced asset inside it. The Why column reads Entire folder unreferenced, n of m unreferenced or All n in use.

Folder view with an entirely unreferenced folder highlighted
Imported packs you barely use stand out in the folder view.

How assets are judged

SafeSweep starts from everything that is known to be in use, then follows the Asset Registry's dependencies (hard, soft and Asset Manager references). Whatever is never reached is unreferenced. Every asset shows the reason it was kept, and hovering it shows the full path of the asset that keeps it.

Reason in the Why columnMeaning
Loaded by the game during playListed in Assets Needed At Runtime, usually because the play-session guard saw the game load it.
MapEvery map is an entry point (can be turned off).
Primary assetKnown to the Asset Manager, including Primary Asset Labels.
Named in Config or C++ sourceA /Game/... path appears in Config/*.ini, Source/ or a project plugin. A folder path keeps the whole folder.
Path string in assetAn asset that is in use contains this path as text: a string on a Load Asset node, a DataTable column, an actor property.
In an excluded folderYou excluded the folder in the settings.
RedirectorAn ObjectRedirector. Never quarantined; use Update Redirector References instead.
Used by asset (outside /Game)Referenced by plugin or engine content.
Used by assetReferenced by another asset that is in use.
UnreferencedNothing above applies.
List view sorted by the Why column
Sort by the Why column to group assets by the reason they are kept.

Path strings inside assets

Assets that are already in use (Blueprints, DataTables, maps and other non-binary assets) are searched for /Game/... strings. What they name is kept too, and the search repeats until nothing new turns up. Textures, meshes, sounds and similar heavy types are skipped. Assets that are themselves unreferenced are not searched, so a path in an unused Blueprint does not keep anything alive.

An asset kept because of a path string in a Blueprint
A mesh with no hard reference, kept because a Blueprint names it.

World Partition and One File Per Actor

Actors saved in their own files (__ExternalActors__, __ExternalObjects__) count as part of their map: whatever they reference or name is kept, and the Why column names the map. Those actor files and map build data (*_BuiltData) are never listed.

What no scan can see

A path assembled at runtime from smaller pieces, or read from a save file or a server, leaves no trace in the project. Full paths and folder paths are found; pieces are not. That is what the play-session guard is for. Using soft references (TSoftObjectPtr, soft object path properties) instead of strings makes such loads visible to the editor, and to SafeSweep.

Quarantine and restore

Quarantining moves the checked assets to /Game/_SafeSweepQuarantine/<date_time>/, keeping their folder structure. SafeSweep uses Unreal's own rename, so references are fixed up exactly as with a move in the Content Browser. A record of every batch is kept in Saved/SafeSweep/.

Restore menu listing three quarantine batches
Restore any batch, in any order, or everything at once.

What a restore does

  • Moves the batch's assets back to their original folders.
  • Also brings back any quarantined asset they depend on, even from another batch, so nothing restored is left pointing into the quarantine folder.
  • Skips an asset when something already exists at its original path (for example after a source control update), and tells you. The copy stays in quarantine for you to check.
  • Removes batch folders that end up empty.
Deleting the quarantine folder is permanent. Do it from the Content Browser once you have played and packaged your game. SafeSweep then forgets those assets on the next scan.

Play-session guard

While you play in the editor with something in quarantine, SafeSweep watches for the game trying to load a quarantined asset. Unreal reports every failed load, so it does not matter how the path was built.

  • During play, a warning appears for each quarantined asset the game asked for.
  • After play, a notification lists them with Restore these assets, which brings back exactly those assets and what they depend on.
  • They are added to Assets Needed At Runtime, so later scans keep them.
Play-session warnings in the editor
The warning during play, and the restore offer afterwards.
LimitsLoads that ask Unreal not to report failures (LOAD_NoWarn or LOAD_Quiet) are not seen, and standalone or packaged games are not watched. Play through the parts of your game that load content by path.

Settings

Project Settings > Plugins > SafeSweep

Saved in Config/DefaultEditor.ini and shared with your team.

SettingDefaultDescription
Excluded Folders/Game/Developers, /Game/CollectionsNever reported as unreferenced.
Treat All Maps As RootsOnEvery map counts as in use.
Scan Config And SourceOnLook for /Game/... paths in config and C++.
Scan Asset StringsOnLook for path strings inside assets that are in use.
Assets Needed At RuntimeEmptyPackage paths that are always kept. Filled by the play-session guard; remove an entry when the game no longer needs it.
Watch Play SessionsOnEnable the play-session guard.
Quarantine Folder/Game/_SafeSweepQuarantineWhere batches are created.
SafeSweep project settings
Project settings.

Editor Preferences > Plugins > SafeSweep

Per user, not shared.

SettingDefaultDescription
LanguageAutoAuto follows the editor language. English or Korean otherwise. The switch in the window sets this too.

Teams and source control

  • Moves are regular Unreal renames, so with source control enabled you get the usual check-out prompts. Commit a quarantine batch like any other change.
  • Commit Config/DefaultEditor.ini so the whole team shares exclusions and the runtime list.
  • Quarantine records live in Saved/SafeSweep/, which is usually not under source control: restore from the machine that quarantined, or restore everything before committing.
  • If a teammate's update brings an asset back while its copy is still in quarantine, restoring skips it and reports it; delete the quarantined copy once you have checked.

FAQ

Does SafeSweep delete anything?

No. It moves assets to a quarantine folder. Deleting that folder is your decision, made in the Content Browser.

How is this different from the Reference Viewer?

The Reference Viewer shows hard and soft references. SafeSweep also checks config, C++, path strings inside assets and World Partition actors, explains why each asset is kept, and adds quarantine, restore and the play-session guard.

Does anything ship with my game?

No. SafeSweep is an editor-only plugin.

Can I trust "Unreferenced" blindly?

No tool can see a path built at runtime from pieces. That is why nothing is deleted: quarantine, play the game, then decide.

Why is a whole folder kept although I never use it?

Look at the Why column of its assets. Common reasons: a map inside the folder (all maps count as in use), a folder path in a config file, or a path string in a Blueprint.

Troubleshooting

Nothing shows as unreferenced

Check the Kept because line at the top: it shows which reason keeps the packages. A broad folder path in config or C++ (for example a DirectoriesToAlwaysCook entry) keeps everything under it.

A checkbox is greyed out

Only unreferenced assets can be quarantined. Maps, redirectors and assets kept for any other reason cannot be checked.

A restore reports skipped assets

An asset already exists at the original path, usually after a source control update. The original is fine; delete the copy from the quarantine folder.

Unreal shows a "Redirector Update Report"

Unreal shows this when a move leaves a redirector that something still points at. It is safe to delete unreferenced redirectors there.

The game needed an asset I quarantined

Use Restore these assets on the notification after play, or the Restore menu. SafeSweep adds the asset to Assets Needed At Runtime so it is kept from then on.

Support

Usually answered within 2 business days. Please include your engine version and, for problems, the Output Log lines that start with LogSafeSweep.

No Discord account or login is needed to get help.

Changelog

1.0.0 (October 12, 2026)

Planned

  • Unreal Engine 5.6 and 5.7.