GregOrigin - LocalVault: Take control of your Fab library with an offline manager & organizer

Watch it in action: v0.1

Update video: v0.2

Read the manual

Get the Core version on GitHub. (Please file Issues there for the FOSS version. Fab hosts the updated Pro version.)

Discord support

🛡️ 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

  1. 📦 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.

  1. 🏷️ 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.

  1. đź”’ 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

  1. Sync: Hit "Sync with Epic" to instantly index every asset currently in your local cache.

  2. Tag: Use the Metadata Sidebar to categorize your latest downloads.

  3. 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.

1 Like

Changelog 0.2.0

2026 - 05 - 07

Backup Reliability

  • Added versioned backup folders for each successful backup.
  • Added backup manifest generation per version.
  • Added checksum verification before a backup is marked as successful.
  • Added destination free-space preflight checks.
  • Added copy retry behavior for file transfers.
  • Added path-length risk warnings.
  • Failed backup attempts now avoid marking assets as safely stored.

Verification

  • Added manifest-aware backup verification.
  • Added Verify Selected support.
  • Added Verify All support.
  • Added Verify Changed support.
  • Added last verification timestamp tracking.
  • Added "needs verification" state when a backup changes after last verification.
  • Added clearer mismatch reporting and per-asset last operation errors.

Restore

  • Added restore preview.
  • Preview reports restorable assets, conflicts, and missing local sources.
  • Added conflict-safe restore behavior.
  • Existing project content is no longer overwritten during conflict restores.
  • Conflicting restores are copied beside existing content with a timestamped suffix.
  • Added restore conflict tracking per asset.

Job History

  • Added recent job tracking for backup, verify, and restore operations.
  • Added job status, total count, completed count, failed count, start time, finish time, and summary.
  • Added job history display in the LocalVault browser.
  • Job history is persisted in the LocalVault database.

Library Intelligence

  • Added Not Backed Up filter.
  • Added Needs Verification filter.
  • Added Updates Available filter.
  • Added Large Assets filter.
  • Added Installed in Project filter.
  • Added Missing Local Source filter.
  • Added Recently Restored filter.
  • Added Restore Conflicts filter.
  • Added Multiple Versions filter.

Team Workflows

  • Added team metadata export to Saved/LocalVault/TeamMetadata.json.
  • Added team metadata import.
  • Export/import includes tags, collections, wishlist state, backup manifest references, and backup version references.

Diagnostics

  • Added diagnostics export to Saved/LocalVault/Diagnostics.json.
  • Diagnostics include sync status, Fab cache path, database path, storage settings, asset counts, update counts, missing-source counts, and recent jobs.
  • Added clearer Fab/EOS sync diagnostic state for failed or degraded sync attempts.

UI

  • Added a new Vault Tools toolbar.
  • Added Preview Restore action.
  • Added Verify Changed action.
  • Added Verify All action.
  • Added Export Team action.
  • Added Import Team action.
  • Added Diagnostics action.
  • Added job queue summary strip.
  • Asset details now show backup version, manifest path, stored version count, last verify time, restore conflict state, and last operation error.

Metadata and Docs

  • Updated Quick Start and product-page copy for versioned backups, manifests, conflict-safe restore, team metadata, and diagnostics.
1 Like

0.3.0 update, 2026-08-03 :placard: :coral:

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.Fab.DownloadWatchBaseline covering baseline seeding, quiet repeat scans, and new-download detection.
  • 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 GUID-based conflict-safe destination generation.
  • Added durable conflict history with the most recent conflict-restore timestamp.
  • Added cleanup of unique partial restore and extraction directories after failure.

Changed

  • Restore prefers the active LocalVault backup and falls back to a completed local Fab cache payload only when no backup exists.
  • Restore preview and action availability now reflect manifest validity and verification trust.
  • Existing project content is never overwritten by a conflict restore.

Fixed

  • Fixed Restore Selected merely copying archives or opaque source directories without producing usable Unreal project content.
  • Fixed unverified or manifest-less payloads being treated as trustworthy restore sources.
  • Fixed restore conflict history disappearing after a later preview found no current destination collision.
  • Fixed timestamp-only conflict suffixes being vulnerable to same-tick collisions.
  • Fixed failed restores leaving partially copied content at the chosen destination.

Fab authentication and owned-library synchronization

Added

  • Added up to 60 seconds of non-blocking Fab session polling before authentication is considered unavailable.
  • Added matching of the active Fab access token to the corresponding EOS logged-in account token.
  • Added the official owned-library endpoint shape: /e/accounts/{accountId}/ue/library.
  • Added per-request timeouts and explicit handling when ProcessRequest fails to start.
  • Added exponential retry/backoff for HTTP 429 and transient 5xx responses.
  • Added explicit HTTP 204 completion handling.
  • Added strict acceptance of successful 2xx responses only.
  • Added a 32 MiB maximum remote response size.
  • Added JSON content-type validation, required results array validation, and parsed-record validation.
  • Added cursor-loop detection to prevent repeated pagination cursors from running forever.
  • Added endpoint and cursor reset at the beginning of every new sync.
  • Added preservation of the previous owned-library state when a nominally valid response unexpectedly contains no owned records.

Changed

  • LocalVault reuses the official Fab and EOS editor session and does not provide a separate Epic login flow.
  • Mock records are removed only after a confirmed non-empty remote result or a completed real Fab cache is discovered.
  • Sync summaries distinguish confirmed results, degraded results, unknown update state, and authentication failure.

Fixed

  • Fixed authentication selecting an arbitrary logged-in EOS account instead of the account associated with the active Fab token.
  • Fixed premature fallback while the official Fab plugin was still establishing its editor session.
  • Fixed unsuccessful HTTP responses being parsed as successful library pages.
  • Fixed malformed or oversized JSON being allowed to replace usable library state.
  • Fixed cursor reuse and endpoint state leaking between sync attempts.
  • Fixed a suspicious empty response erasing previously known ownership records.
  • Removed response-body snippets, access-token material, and Epic account identifiers from logs.

Fab cache and mock catalog discovery

Added

  • Added discovery of completed asset-id directories in the local Fab cache, in addition to root-level archive files.
  • Added payload-completeness checks before a Fab cache directory is considered restorable.
  • Added exclusion of temporary, partial, and extracted-work directories from completed-cache discovery.
  • Added automatic enumeration of child directories beneath Content/MockData.
  • Added stable mock asset ids derived from directory names.

Changed

  • The bundled mock catalog is no longer hard-coded in C++.
  • Any packaged mock-data directory can become a sample record without changing source code.
  • Mock records are seeded only when no real database, manifest, remote-library, or completed-cache records exist.
  • Existing mocks are removed when real Fab ownership or completed cache content becomes available.

Fixed

  • Fixed completed Fab cache directories being ignored when no matching root ZIP existed.
  • Fixed temporary cache folders being treated as complete assets.
  • Fixed mock entries persisting alongside a confirmed real library.
  • Fixed catalog documentation drifting from the actual packaged sample directories.

Thumbnail pipeline and browser responsiveness

Added

  • Added visible-row and selected-details thumbnail queuing.
  • Added a maximum of four active thumbnail HTTP requests.
  • Added HTTP status, image content-type, empty-body, and 8 MiB size checks.
  • Added worker-thread image decoding through ImageWrapper and ImageCore.
  • Added proportional downsampling to a maximum dimension of 256 pixels.
  • Added a 128-entry least-recently-used dynamic brush cache.
  • Added cache invalidation and one network retry when a cached thumbnail cannot be decoded.
  • Added failed-request tracking to prevent endless retry loops.

Changed

  • Filtering or refreshing the library no longer starts a thumbnail request for every matching asset.
  • Slate texture creation remains on the game thread after bounded worker decoding.

Fixed

  • Fixed large libraries eagerly issuing hundreds or thousands of thumbnail requests.
  • Fixed unbounded decoded thumbnail brushes accumulating for the lifetime of the browser.
  • Fixed corrupt cached images being retried indefinitely.
  • Fixed non-image and oversized HTTP responses being written into the thumbnail cache.
  • Fixed image decode and resize work unnecessarily blocking the editor UI.

Browser behavior and status reporting

Added

  • Added backup-version selection and deletion controls to asset details.
  • Added persistent restore-conflict history to details, smart filters, and sidebar counts.
  • Added explicit unknown-update wording and counts.
  • Added operation-state and retention fields to diagnostics.

Changed

  • Collection and tag sidebar filters now use exact case-insensitive membership instead of substring matching.
  • Recently Restored now has a defined 30-day window.
  • Restore buttons disable when the selected backup lacks a valid verified manifest.
  • Backup, restore, verification, and sync actions disable while another serialized vault operation is active.
  • Completion text reports staged payloads, restore conflicts, failures, and unknown update state separately.

Fixed

  • Fixed similarly named tags or collections matching one another accidentally.
  • Fixed Recently Restored effectively meaning any asset ever restored.
  • Fixed current restore preview state overwriting durable conflict history.
  • Fixed UI actions implying that unsafe overlapping operations could be started.

Diagnostics and privacy

Added

  • Added diagnostics schema LocalVaultDiagnostics.v2.
  • 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.