🛡️ LocalVault: Total Ownership of Your Fab Library
Owning instead of streaming.
With the transition to the unified Fab ecosystem, digital asset management has moved to the cloud. While convenient, this creates a critical vulnerability for professional studios: Asset Volatility. Your expensive environment packs and MetaHumans are currently stored in hidden, temporary engine caches that can be wiped or corrupted at any moment.
LocalVault is the professional’s bridge between the cloud and the workstation. It is an advanced C++ utility plugin designed to give you 100% control over your digital portfolio through true offline backups, instant metadata tagging, and zero-latency search.
🚀 The Reason of LocalVault: Permanence, Organization, Privacy
📦 True Offline Backup (Permanence) LocalVault solves the "disappearing asset" problem. It executes a deep, multi-threaded extraction of your volatile FFabAssetsCache, duplicating raw files into a standardized, human-readable directory structure on your external NAS or backup drive.
Safe Extraction: Moves files from obscured AppData paths to your chosen vault.
Project Ready: Backed-up folders are formatted for instant drag-and-drop into any future Unreal project—no Epic Launcher required.
🏷️ Semantic Intelligence (Organization) Managing a library of 300+ assets is impossible with native tools. LocalVault introduces a high-speed, local-first tagging system.
Persistent Metadata: Apply project names, genres, or utility tags (e.g., "Cyberpunk", "Client_A", "Performance Heavy") to your assets.
Zero-Latency Search: Since your database is stored locally in optimized JSON, searching through thousands of assets is instantaneous.
đź”’ Zero-API Security (Privacy) We believe your credentials should remain yours. LocalVault uses a proprietary Zero-API Strategy.
No Login Required: It natively hooks into the Unreal Engine's internal cache module. You never have to provide your Epic password or OAuth tokens to our tool.
Air-Gapped Ready: Once your assets are downloaded via the Editor, LocalVault works 100% offline.
⚡ Unique Features
🛡️ The "Anti-Delisting" Shield: Ensure that even if an asset is removed from Fab or the creator leaves the platform, you still hold the raw files you paid for.
⚡ Multi-Threaded Throughput: Optimized C++ backend ensures that even 100GB environment megapacks are backed up with maximum disk I/O efficiency.
đź“‹ JSON Data Portability: Your custom tags are stored in a simple, version-control-friendly Database.json. Share your library organization across your entire studio via Git or Perforce.
🛠️ Engine Integrated: Designed specifically for UE 5.7+, utilizing the latest internal Fab modules for 1:1 compatibility.
đź“– Professional Workflow
Sync: Hit "Sync with Epic" to instantly index every asset currently in your local cache.
Tag: Use the Metadata Sidebar to categorize your latest downloads.
Secure: Select your assets and click "Download Assets" to move them into your permanent archive.
🛠️ Technical Specifications
Backend: Optimized C++ (Editor Module)
Storage: Local JSON Database
Compatibility: Windows 10/11 (Win64)
Engine Versions: 5.7 and higher
LocalVault enables Unreal Engine’s built-in EOSShared dependency for owned-library sync
LocalVault: Because if you bought it, you should hold it.
LocalVault 0.3.0 is a durability, correctness and responsiveness release. It replaces timestamp-based update guesses with Fab revision identity, makes the vault index recoverable and portable, turns restore into a usable Unreal-aware workflow, and serializes destructive operations. On top of that it fixes a checksum bug that prevented directory backups from verifying, stops background work from disabling the user interface, adds job retry, removes the per-asset project rescans that stalled large
libraries, and replaces initial work in the Fab session handshake with actionable diagnostics.
Functionality
Verification issues: Fixed. Root cause was a checksum bug that made every directory backup fail verification. Retry is now a first-class action.
Job queue issues: Fixed. Jobs record their assets and failures; Retry Failed re-submits them, including jobs interrupted by an editor exit. |
Easier configuration and responsiveness: Fixed. Waiting for a Fab session no longer disables backup, verify and restore. Storage path is validated at startup with a clear message.
Lack of warnings: Fixed. Session health is polled after a successful sync and reported when it changes. |
Logs being cryptic or not helpful enough: Fixed. Per-asset failure reasons, both checksums on a mismatch, resolved paths logged at startup.
Need to pre-load library assets first: Partly addressed. Fab does not expose a download entry point to other plugins; see the Fab download assistance section.
macOS editor issues: WIP. macOS installation is disabled in 0.3.0 until fixed. LocalVault now claims Win64 only due to Unreal editor conflicts.
Jobs, retry, and first-run behaviour
Added
Added Retry Failed to the Vault Tools toolbar, showing the number of assets it would re-submit. It re-runs the failed assets from the most recent backup, verify or restore job.
Added RetryJob, RetryLastFailedJob and HasRetryableJob to the scripting API.
Added per-job asset and failure records (AssetIds, FailedAssetIds, bCanRetry) so a job can be re-run without reconstructing it by hand. These are persisted with the database.
Added retry support for jobs interrupted by an editor exit: the whole recorded asset set becomes retryable rather than being a dead history entry.
Added a storage-root check at startup that creates the directory if needed and probes it for writability, reporting a specific reason when it is not usable.
Added startup logging of the resolved storage root, database path, restore root, Fab cache location, and tracked asset count.
Fixed
Fixed waiting for the Fab session holding the vault operation gate. Backup, verify, restore and the vault tools were not responsive at every editor start. Session waiting is now tracked separately and blocks only Sync with Epic.
Fixed the background metrics pass also holding the operation gate. The startup refresh kicks off size/checksum housekeeping that can run for minutes over a large Fab cache, and it disabled the whole toolbar for its duration: the same symptom by a second route. Metrics results were already discarded when an asset’s paths changed underneath them, so this work now overlaps user operations instead of blocking them, and is reported separately via IsBackgroundRefreshInProgress.
Fixed the sync button giving no indication that it was waiting on Fab rather than working; it now reads Waiting for Fab….
Fixed stale per-asset errors persisting after a successful retry.
Session and failure reporting
Added
Added a session health watch that polls after a successful sync and reports when a previously working Fab session becomes invalid, instead of only surfacing it at the next sync attempt. Recovery is reported too.
Added per-asset failure logging for backup (with asset title and source path), verification (with both the manifest and computed checksums, plus the backup path), and restore.
Added a job completion log that enumerates every failed asset with its recorded reason and points at Retry Failed.
Added awaitingFabSession and fabSessionHealthy to the diagnostics export.
Changed
Operation logging moved off Verbose, so useful detail appears without changing log verbosity first.
Fab download assistance
LocalVault still cannot start a Fab download, and this is a hard limit rather than an omission. Fab mints signed download URLs inside its embedded web app; the only C++ trigger, FFabBrowser::GetSignedUrl, is a window.ue.fab.getSignedUrl(...) JavaScript shim declared in a private header on a class that exports no symbols, and it is inert unless the Fab tab is already open. The owned-library endpoint returns metadata only: Epic’s own FabMyFolderIntegration uses that same endpoint and gets no download URL from it. LocalVault deliberately does not attempt to reconstruct Fab’s private signed-URL endpoint.
What LocalVault now does instead is remove every manual step except the one Fab itself requires.
Added
Added Get from Fab to the asset actions. It opens and focuses the official Fab tab (via the public FabTab nomad tab id, using none of Fab’s private headers) so the selected asset can be added to the project from there. Falls back to opening the listing in the system browser when the Fab tab is unavailable.
Added Auto Backup Fab Downloads (on by default): a background watcher that notices assets the Fab plugin has finished downloading and backs them up into the vault automatically, with full checksum and manifest treatment.
Added Fab Download Watch Interval Seconds (10-600, default 30) to control the polling cadence.
Added baseline seeding on first activation: assets already present in the Fab cache are recorded and deliberately not bulk-copied into the vault. Only downloads completing afterwards are auto-backed-up. The baseline is persisted in the database so it survives editor restarts.
Added skipping of assets already vaulted at the revision Fab just delivered.
Added fabBrowserTabAvailable, fabDownloadWatchActive, autoBackupBaselineSeeded, autoBackupSeenCacheEntries, and autoBackupPending to the diagnostics export.
Added LocalVault.Jobs.FailedJobIsRetryable covering clean-versus-failed job bookkeeping and rejection of unknown job ids.
Added LocalVault.Jobs.SessionWaitDoesNotBlockLocalWork, which pins the invariant behind the “unresponsive until Fab is signed in” report: neither a session wait, a stale session, nor background metrics housekeeping may count as a vault operation.
Notes
The Fab cache scan runs on a worker thread; results are applied on the game thread.
Auto-backups queue behind any running LocalVault operation rather than competing with it.
A download that fails to back up is recorded on the asset and not retried automatically; use Backup Selected to retry.
Upgrade and compatibility notes
New backups write LocalVaultBackupManifest.v3 manifests. Version 1 and 2 manifests remain readable, but their directory checksums used a different relative-path basis, so a pre-0.3.0 directory backup reports Needs verification until it is backed up again.
The default Local Vault Storage Path changed from ../../../LocalVaultStorage (which resolved to the project’s drive root) to ../LocalVaultStorage (a sibling of the project directory). If you never changed the setting and a vault already exists at the old default, LocalVault keeps using it.
BulkDownloadAssets is renamed to BackupAssets. The old name is retained as a deprecated Blueprint alias. As of 0.3.0, LocalVault backs up payloads Fab has already placed on disk.
The vault is no longer fully rescanned on every editor launch. A rescan runs automatically only when the index contains no backup versions; use Rebuild Index in Vault Tools to run it on demand.
Team metadata export/import now prompt for a file location in an interactive editor. ExportTeamMetadataToFile and ImportTeamMetadataFromFile perform the same work without prompting.
Team metadata imports are rejected unless the file carries a recognised LocalVaultTeamMetadata.v* schema at or below the version this build supports.
Databases whose schemaVersion is newer than this build supports are skipped rather than loaded and silently downgraded.
Auto Backup Fab Downloads defaults to on. It never bulk-copies an existing Fab cache: the first scan records what is already there as a baseline. Disable it in Project Settings > Plugins > LocalVault if you would rather back up manually.
Backup and restore correctness
Fixed
Fixed directory backups never matching their source checksum. FPaths::MakePathRelativeTo resolves its base with FPaths::GetPath, so hashing entries against a directory path without a trailing separator embedded the root’s own folder name in every relative path. A source tree and its copy therefore hashed differently purely because they lived in differently named folders, leaving every directory backup permanently unverified and, since 0.3.0 gates restore on verification, permanently unrestorable.
Fixed the restore free-space preflight sizing ZIP payloads by their compressed bytes. Archive extraction is now sized from the ZIP central directory, falling back to a conservative multiple of the compressed size when the directory cannot be read (ZIP64, truncated, or unreadable archives).
Fixed two assets that resolve to the same storage folder name in one restore batch being handed the same destination. Batch conflict detection now reserves each destination, so the second asset restores conflict-safe instead of writing into the same directory concurrently.
Fixed PreviewRestoreAssets running while another vault operation was active. It now respects the same operation gate as backup, restore, verification, and sync.
Added
Added a warning, in both the restore preview and the completion summary, when the configured restore root is outside the project’s Content directory. Unreal packages restored there cannot be registered with the Asset Registry and stay invisible to the editor.
Added explicit reporting of assets skipped for having no local payload, so “nothing happened” is distinguishable from “nothing was eligible”.
Index integrity
Fixed
Fixed the storage rescan tagging every asset it walked past as Recovered. The tag now marks only versions that were genuinely absent from the index, instead of accumulating on every backed-up asset at every launch.
Editor responsiveness
Fixed
Fixed the installed-content match re-enumerating the project’s Content and Plugins trees once per asset. The candidate list is now gathered once per refresh pass; a library where most assets are remote-only previously triggered one full project scan per asset on the game thread.
Fixed backup-version validation reloading and reparsing every manifest for every asset on every refresh. Manifest identity is now cached against file modification time.
Fixed a full vault manifest scan running on the game thread at every editor launch.
Fixed metadata edits (tags, collections, wishlist, job bookkeeping) each rewriting the entire database. These writes are now coalesced onto a short timer; durable checkpoints still write through immediately.
Fixed the browser deep-copying the whole asset database per vault broadcast. Sidebar counts and list filtering now read the database in place.
Thumbnails
Fixed
Fixed evicted thumbnail brushes leaving dangling FSlateBrush pointers in already-generated rows. Brushes are now resolved per paint, so eviction degrades to the “No Preview” placeholder instead of pointing at freed memory.
Fab session handling
Added
Added detection of a missing Fab browser-api type, reported distinctly from “not signed in” and no longer waited out for 60 seconds.
Added a fallback to the only signed-in Epic account when the Fab token does not match any EOS access token, with a warning identifying the divergence.
Added distinct diagnostics for: no active EOS platform, no signed-in account, several signed-in accounts with no match, and Fab present but not yet issuing a token.
Added fabIntegrationAvailable and restoreRootAssetRegistryVisible to the diagnostics export.
Changed
The auth-poll timeout message now reports the specific reason the session could not be used.
The Fab browser-api object is created once and reused instead of allocated on every 0.5-second auth poll.
Shutdown
Fixed
Fixed editor shutdown returning while worker-thread copies, checksums, and verification batches were still running. Shutdown now signals cancellation and joins outstanding work, with a 10-second timeout.
Fixed cancellation only being observed between asset batches. File copies now check the cancel token per file, and a cancelled backup cleans up its partial version directory.
Packaging and dependencies
Changed
Removed "Installed": true from the plugin descriptor; it is set by the installer, not by source.
Removed duplicate module dependencies listed in both the public and private dependency lists.
Removed the deprecated EditorStyle dependency and added DesktopPlatform for the team-metadata file dialogs.
Scripts/RunLocalVaultTests.ps1 now requires PowerShell 7 and verifies the host build, and refuses to run on macOS. Added -BuildOnly for runners without a usable headless editor.
Tests
Added
Added LocalVault.Backup.CopyVerifyRestoreRoundTrip, which backs up an Unreal content payload, verifies it against its manifest, restores it, and compares the restored bytes. This is the test that caught the directory-checksum bug.
Added LocalVault.Backup.DetectsPayloadTampering for post-backup payload modification.
Added LocalVault.Backup.HonoursCancellation for cancellation and partial-output cleanup.
Added LocalVault.Storage.ArchiveExpandedSize for ZIP central-directory sizing and the fallback estimate.
Added LocalVault.Restore.DestinationReservation for same-batch destination collisions.
Added LocalVault.Persistence.ManifestIdentityCache for cache reuse, refresh on change, and invalidation on delete.
Added LocalVault.Persistence.TeamMetadataRoundTrip for export/import and schema rejection.
Validated
Unreal Header Tool completed with warnings treated as errors.
BuildPlugin completed successfully for Win64 against Unreal Engine 5.7.
All 16 LocalVault editor automation tests passed with zero failures, zero warnings, and zero skipped tests.
CI runs a single Win64 job, and asserts that host binaries were actually produced.
The build script now fails when BuildPlugin reports success without emitting binaries for the host platform.
Additional upgrade notes from 0.2.0
The primary database moved from Saved/LocalVault/Database.json to <LocalVaultStoragePath>/.LocalVault/Database.json so the index travels with the vault.
On first load, LocalVault searches the new database, its .bak copy, the legacy project-local database, and the legacy .bak copy in that order. A successfully loaded legacy database is rewritten to the new location automatically.
Existing version 1 backup manifests remain readable. New backups write LocalVaultBackupManifest.v2 manifests.
Legacy backups without a stored Fab revision report Update unknown. LocalVault no longer infers Fab release state from filesystem timestamps.
Restore now requires a valid manifest and a verified active backup. Manifest-less, invalid, changed, or unverified backups fail closed until repaired or verified.
Restore conflicts now use collision-resistant GUID suffixes instead of timestamp-only suffixes.
The new Max Backup Versions Per Asset setting defaults to 5. Set it to 0 to retain every version. Retention is applied after successful backups and never deletes the active version.
Team metadata and diagnostics exports now use schema version 2. Backup references in team exports are vault-relative instead of machine-specific absolute paths.
The configured transfer concurrency is clamped to the supported range of 1 through 10 at runtime. It is now the single outer asset-job budget; individual files within an asset copy serially.
Fab revision and update correctness
Added
Added RemoteRevisionId to remote asset records and backup versions.
Added StoredRemoteRevisionId to track the Fab revision captured by the active backup.
Added bUpdateStatusKnown so the UI can distinguish a real comparison from missing revision data.
Added deterministic revision extraction from Fab project, artifact, and build identifiers.
Added a remote-metadata timestamp fallback identity for responses that do not expose a stronger artifact identifier.
Added explicit Unknown (no comparable Fab revision) status text for locally stored or backed-up assets that cannot be compared safely.
Added unknown-update counts to sync summaries and diagnostics.
Changed
Update availability now means that the current remote revision identity differs from the revision captured by the active backup.
Remote modification time remains display metadata only and no longer determines whether an update exists.
Activating another backup version immediately recomputes update state against that version’s stored revision.
Fixed
Fixed false update results caused by comparing Fab timestamps with local copy or backup timestamps.
Fixed legacy records appearing confidently up to date when no comparable remote and stored revisions existed.
Database, manifests, and recovery
Added
Added database schema version 2.
Added exact string-backed 64-bit tick fields for backup, restore, verification, sync, checksum, conflict, job, and export timestamps.
Added atomic database writes through a temporary file and replacement move.
Added a retained Database.json.bak fallback before replacing an existing database.
Added portable vault-relative backup and manifest paths while retaining compatibility with older serialized fields.
Added manifest schema version 2 with exact creation ticks and captured Fab revision identity.
Added atomic manifest writes.
Added RebuildIndexFromStorage, which scans LocalVaultManifest.json files beneath the configured storage root.
Added recovery of asset identity, version identity, payload paths, checksums, size, author, title, creation time, and remote revision from manifests.
Added automatic promotion of the newest valid version when the recorded active version is missing or invalid.
Added a Recovered tag to records reconstructed from storage manifests.
Added recovery from the database backup file when the primary JSON is missing or invalid.
Added conversion of persisted jobs left in Running state to Interrupted after an editor restart.
Changed
Database ownership moved from the Unreal project to the configured vault root.
Database assets are written in deterministic asset-id order.
Team metadata schema 2 writes vault-relative paths, strips source-machine absolute paths, and preserves exact version timestamps.
Diagnostics schema 2 records exact export time, operation state, retention configuration, and unknown update totals.
Fixed
Fixed loss of integer precision caused by representing Unreal tick values only as JSON floating-point numbers.
Fixed vault metadata becoming unusable after moving a vault to another drive or workstation.
Fixed a corrupt primary database preventing LocalVault from attempting a known-good backup or legacy database.
Fixed a missing database making otherwise valid manifest-backed backups invisible.
Fixed stale active-version pointers after a version folder was removed outside LocalVault.
Backup safety and version management
Added
Added source/destination containment checks that reject either path being nested beneath the other.
Added destination-volume preflight using the nearest existing ancestor when the final directory does not exist yet.
Added fail-closed behavior when free disk space cannot be queried reliably.
Added shutdown-aware cancellation tokens for long-running transfers.
Added partial-output cleanup for failed backup attempts.
Added public version activation and validated version deletion operations.
Added an active-version selector in the asset details panel.
Added explicit delete confirmation for stored versions.
Added automatic promotion of the newest remaining valid version after deletion.
Added configurable per-asset retention from 0 through 100 versions.
Added manifest and storage-root validation before retention or manual deletion can remove a version directory.
Added verification of every stored version for selected assets rather than checking only the active version.
Changed
Backup, restore, verification, metrics refresh, and remote sync now share one operation gate.
Multiple assets may run up to the configured outer concurrency limit, but each asset payload uses a serial file-copy stream.
A backup is marked successful only after source validation, space preflight, copy completion, checksum agreement, and manifest creation.
The active backup’s revision, checksums, verification state, and sizes are refreshed whenever active-version selection changes.
Fixed
Fixed nested parallel file copies exceeding the configured concurrency and overwhelming slower disks.
Fixed backup, restore, verification, sync, and metric operations being able to mutate shared state concurrently.
Fixed recursive deletion being attempted without first proving that the target belongs to the configured vault and matches its manifest identity.
Fixed partial version directories being left behind after copy, checksum, or manifest failures.
Fixed inaccurate job history when the editor exited during an operation.
Verification and background metrics
Added
Added worker-thread verification batches for stored versions.
Added worker-thread recursive size and checksum refresh.
Added captured-path validation before asynchronous results are applied, preventing stale work from overwriting newer state.
Added queued metrics refresh when another vault operation owns the job slot.
Changed
UpdateAssetLocalState now performs only inexpensive path and file-stat work on the game thread.
Verify Changed uses recorded file metadata to choose candidates without recursively scanning every backup synchronously.
Verification and metric results are applied to the database and UI on the game thread after background work completes.
Fixed
Fixed editor stalls caused by recursive directory sizing and checksum work during library refresh.
Fixed Verify Selected blocking the editor while hashing large backup trees.
Fixed stale background results being applied after a backup path changed.
Unreal-aware restore
Added
Added archive extraction through Fab’s FAssetUtils::Unzip utility.
Added support for a directly selected ZIP and for a directory containing one nested ZIP payload.
Added detection of Unreal project, plugin, and Content-root payload layouts.
Added restoration of Unreal package content into the configured project restore root.
Added Asset Registry rescanning on the game thread after Unreal content is restored.
Added explicit staging of non-Unreal payloads under Saved/LocalVault/Staged for manual import.
Added truthful staged-only completion summaries so generic files are not reported as imported Unreal assets.
Added sync, transfer, and metrics-in-progress flags.
Added the active library endpoint template without credentials or account identity.
Added the configured retention limit.
Added backed-up, unverified, update-available, missing-source, and unknown-update counts.
Added recent serialized job records.
Changed
Exact export time is stored as a string-backed 64-bit tick value.
Remote request logging is limited to endpoint candidate, retry number, HTTP status, content type, and response size.
Fixed
Removed account identifiers and response-body excerpts from diagnostic logs.
Fixed diagnostics omitting active operation state and unknown update totals.
Additional tests and continuous integration
Added
Added LocalVault.Paths.NonOverlappingCopy coverage for source/destination containment rejection.
Added LocalVault.Storage.ExistingAncestorProbe coverage for missing-destination disk probing.
Added LocalVault.Sync.RevisionIdentity coverage for deterministic and distinct revision identities.
Added LocalVault.Sync.RemoteSchemaValidation coverage for required remote fields and timestamp fallback identity.
Added LocalVault.Persistence.PreciseInt64Ticks coverage for lossless large tick values.
Added LocalVault.Persistence.ManifestRoundTrip coverage for atomic manifest creation and recovered identity.
Added Scripts/RunLocalVaultTests.ps1, which packages the plugin, creates an isolated UE project, disables external auto-sync, and runs the LocalVault.* editor automation suite.
Added a self-hosted Windows CI workflow for Unreal Engine 5.7.