Introduction
SyncShield is a layered save-safety system for UE 5.6+: source control awareness, local pre-save history, shadow auto-save, validation hooks, team presence, and save profiles all sit behind the same lightweight entry point.
The operating principle is simple: make risky save conditions visible, create recoverable copies before destructive writes, and give teams better editor-time awareness without forcing a separate workflow outside Unreal.
This manual reflects the upgraded SyncShield build as of March 16, 2026. It covers both the long-standing source control toolbar and the five new save-centric subsystems.
System Map
The upgraded plugin is one toolbar surface backed by six coordinated safety services.
New save subsystems
History, smart auto-save, validation, presence, and save profiles now sit alongside the source control layer.
Recovery paths
Local history snapshots, shadow auto-save copies, and source control remain distinct paths back from a bad save.
Core promise
A bad Blueprint save should no longer mean "hope you committed".
Feature Atlas
SyncShield is easiest to understand as six cooperating modules: one status surface and five save-centric services.
Source Control Status
Branch/workspace, ahead/behind, conflicts, login state, unsaved work, and teammate lock warnings stay visible in the Level Editor toolbar.
Local Save History
Before SyncShield-driven writes land, the on-disk package is copied into a per-asset history store under Saved/SyncShield/History.
Smart Auto-Save
Dirty packages are shadow-saved one at a time into a non-destructive backup tree instead of forcing a large editor hitching wave.
Pre-Save Validation
Blueprint health, UObject data validation, naming rules, and texture size guidance are checked before SyncShield save actions proceed.
Team Presence
Editor sessions publish a lightweight JSON heartbeat with open assets and recent saves so the tooltip can summarize teammate activity.
Save Profiles
Save All is no longer the only useful operation. Save Blueprints, Save Current Level, and Save Recent Assets are first-class commands.
Conflict Sentinel
Preemptively detects if remote changes will cause a merge conflict with your currently unsaved assets and alerts you instantly.
Safe Branch Shifter
Crash-free Git branch switching directly inside Unreal. Automatically handles dirty assets and securely closes editors before checking out.
What each subsystem actually does
| Subsystem | Primary trigger | Writes data to | Main user-facing action | Current surface |
|---|---|---|---|---|
| Source Control Status | Polling + asset-open events | None | Fetch / Pull / Push / Update / Submit | Toolbar label, icon, tooltip, menu |
| Local Save History | Pre-save package hook | Saved/SyncShield/History |
Restore Latest Snapshot | Menu + tooltip summary |
| Smart Auto-Save | Background ticker | Saved/SyncShield/ShadowAutoSaves |
Automatic shadow snapshots | Tooltip summary |
| Pre-Save Validation | SyncShield save actions + pre-save warnings | None | Validate Dirty Assets | Menu, toasts, tooltip summary |
| Team Presence | Heartbeat ticker + asset open/close + saves | .syncshield/presence |
Shared editor awareness | Tooltip summary |
| Save Profiles | User menu commands | None directly | Save Blueprints / Current Level / Recent Assets | Menu + validation-aware save pipeline |
| Conflict Sentinel | Background remote diffs | None | Instant collision warnings | High-visibility Editor Toast |
| Safe Branch Shifter | User menu command | None directly | Safe Switch Branch | Toolbar Git Menu |
Quick Start
Install and first launch
- Place the plugin inside your project at
Plugins/SyncShield. - Launch the project in Unreal Engine 5.7.
- Connect Source Control if you use Git or Plastic SCM.
- Open Editor Preferences -> Plugins -> SyncShield.
- Leave the new subsystems enabled for the default experience, then tune intervals and retention counts to fit your project size.
YourProject/
|- Plugins/
| \- SyncShield/
| |- SyncShield.uplugin
| \- Source/
\- Saved/
Recommended shared ignore rule
Team Presence writes JSON heartbeats into a repo-root sidecar folder. That folder should usually be ignored in source control.
# SyncShield shared presence heartbeat files
.syncshield/presence/
First 10 Minutes
Minute 1
Verify the toolbar appears in the Level Editor top bar.
Minute 3
Open the SyncShield menu and confirm the new actions are present: Save Blueprints, Save Current Level, Save Recent Assets, Validate Dirty Assets, Restore Latest Snapshot.
Minute 6
Open Editor Preferences and set retention counts appropriate for your disk budget.
Minute 10
Make a small asset edit, use SyncShield to save it, and confirm history files appear under Saved/SyncShield/History.
SyncShield's strongest validation blocking currently applies to SyncShield-driven save actions. Native Unreal save paths such as editor-specific Ctrl+S still receive warnings, but not a universal hard cancel, because Unreal does not expose a clean global save-veto hook for every editor save entry point here.
Toolbar and Menu
The toolbar still behaves like a compact status surface, but the menu now fronts a broader save pipeline.
Menu action reference
| Action | What it does | New or existing | Notes |
|---|---|---|---|
| Save All | Runs the SyncShield save pipeline against all dirty packages. | Existing, upgraded | Now routes through validation and shared save-profile logic. |
| Save Blueprints | Saves only dirty Blueprint asset packages. | New | Useful for rapid Blueprint iteration without touching the whole project. |
| Save Current Level | Saves the current world package and dirty external world packages tied to it. | New | Best when iterating on one map or world partition area. |
| Save Recent Assets | Saves only packages touched inside the configured recent window. | New | Window is configurable in settings. |
| Validate Dirty Assets | Runs SyncShield validation across all dirty packages and reports the result. | New | Use this before a large save or before submitting. |
| Restore Latest Snapshot | Replaces the active asset's on-disk package with the most recent SyncShield history snapshot and reloads it. | New | Currently restores the latest snapshot, not an arbitrary timeline pick. |
| Safe Switch Branch | Closes all asset editors and securely checks out a different local Git branch. | New | Prevents editor crashes during file swaps. |
| Submit Content | Opens Unreal's source control submit window. Releases LFS locks after a successful check-in if any were held. | Existing, upgraded | Auto-unlock after submit prevents orphaned LFS locks. |
| Quick Commit | Stages all changes (including untracked files) and commits with a user-provided message. | New | The dialog clearly warns that all changes will be staged. Use for rapid local checkpoints. |
| Unlock LFS Files | Lists all locally-held Git LFS file locks and releases them after confirmation. | New | Only enabled when Git LFS is detected and locks are held. See Git LFS Locks. |
| Git Stash / Stash Pop | Stash uncommitted changes or restore them from the stash stack. | New | Useful before branch switching or pulling when you have local work in progress. |
| Merge Abort / Rebase Abort | Aborts a failed merge or rebase operation to return to a clean state. | New | Only visible in the Conflict Resolution submenu when Git conflicts are detected. |
| Fetch / Pull / Push / Update Workspace | Provider-specific source control actions gated by workspace safety. Push now auto-releases LFS locks on success. | Existing, upgraded | See Source Control for the exact gating rules. |
Tooltip expansion
The tooltip is now more than an SCM diagnostic. When the new services are enabled, it also appends subsystem summaries such as:
History: 4 snapshots this session, last /Game/Blueprints/BP_DoorAuto-Save: 9 shadow saves, last /Game/Maps/MainHubValidation: 1 errors, 2 warningsPresence: 2 teammates online, 5 remote assets openProfiles: SyncShield processed 3 package(s) for dirty Blueprints.LFS Locked Files: 2followed by the locked file paths when Git LFS locks are held.Locked by Others: 1andCheckout Required: 3when the provider reports lock or checkout state.
Status Model
The toolbar label remains intentionally narrow. It reports source control and unsaved-work state directly, while the new save subsystems contribute detail in the tooltip and menu.
Healthy
main | Cleanmain | Ahead 1main | Behind 2
Work in progress
main | Unsaved 3main | Changesmain | Checkout Req (2)
Risk / degraded
main | Locked (1)main | Divergedmain | Status ErrorLogin Required | Unsaved 2No SCM Repo | Unsaved 3
Risk ladder
SyncShield intentionally keeps the label short, but the color and wording escalate from neutral to intervention-worthy states.
Local Save History
Local Save History is the biggest unlock in the upgrade. Before a SyncShield-observed manual package save overwrites the package file, SyncShield copies the current on-disk package into a per-asset history folder.
What it captures
- The package file as it existed on disk immediately before the new save.
- A JSON sidecar with timestamp, package name, source path, snapshot path, and file hash.
- Per-asset history folders inside
Saved/SyncShield/History.
What the current UI exposes
- Restore Latest Snapshot in the toolbar menu.
- Tooltip session summary showing how many snapshots were captured.
- Automatic reload attempt after restore.
The history store already contains a real per-asset timeline on disk. The current menu exposes a one-click latest snapshot restore. A dedicated timeline browser can be built later on top of the same stored snapshots.
Recovery timeline
Folder example
Saved/
\- SyncShield/
\- History/
\- Game/
\- Blueprints/
\- BP_Door/
|- 20260311-194222-113.uasset
|- 20260311-194222-113.json
|- 20260311-201745-087.uasset
\- 20260311-201745-087.json
Behavior notes
- History capture skips procedural saves and auto-save writes.
- Retention is bounded by
Max Snapshots Per Asset. - Restore operates on the active asset known from the last opened asset editor.
- If the package reload fails after restore, the on-disk file is still restored and SyncShield reports that fact explicitly.
Smart Auto-Save
Unreal's stock auto-save tends to batch work. Smart Auto-Save spreads that work out by shadow-saving one dirty package at a time into a dedicated backup directory while keeping the original package dirty.
How it differs from stock UE auto-save
| Behavior | Stock UE auto-save | SyncShield Smart Auto-Save |
|---|---|---|
| Write target | UE autosave structure | Saved/SyncShield/ShadowAutoSaves |
| Work scheduling | Broad timed autosave pass | One dirty package per interval tick |
| Dirty state | Engine-controlled | Uses SAVE_KeepDirty so the original package still reads as dirty |
| Scope control | Project/editor settings | Separate SyncShield toggles for maps and content assets |
| Retention | Engine-managed | Per-asset capped by Max Shadow Snapshots Per Asset |
Scheduling model
- Runs from a lightweight ticker.
- Does not run during PIE or Simulate in Editor.
- Sorts dirty packages by least-recently shadow-saved first.
- Saves a single eligible package per interval.
Incremental queue
Pre-Save Validation
Pre-Save Validation turns SyncShield into a gatekeeper, not just a monitor. Before a SyncShield save action writes packages, the validation service scans each candidate package for broken states and policy violations.
The current build checks native UObject validation, common Blueprint failure modes, naming policy, and oversized textures. The result is summarized in the toolbar flow and, when configured, blocking issues prevent SyncShield save profiles from writing those packages at all.
Blocking applies to SyncShield-driven save actions such as Save All, Save Blueprints, Save Current Level, and Save Recent Assets. Passive warnings can still appear during observed native save activity.
Validation stack
Rule sources
| Rule source | What SyncShield checks | Severity | Typical use |
|---|---|---|---|
UObject::IsDataValid |
Project-defined validation implemented directly on the asset type. | Error or warning, depending on the returned issues. | Missing references, invalid configuration, project-specific quality rules. |
| Blueprint parent-class check | Blueprints with a missing ParentClass. |
Error | Broken inheritance chains after refactors or deleted native classes. |
| Blueprint compile status | BS_Error Blueprints. |
Error | Compile failures and common broken-reference cases. |
| Asset name regex | Name match against Asset Name Pattern. |
Warning | Enforcing project naming conventions before assets spread. |
| Texture size guideline | Largest dimension above Max Recommended Texture Dimension. |
Warning | Spotting oversized textures before content bloat gets normalized. |
Example output
Validation: 2 errors, 1 warning
- /Game/Blueprints/BP_Door :: Blueprint has compile errors or broken references.
- /Game/Blueprints/BP_Door :: Blueprint is missing its parent class.
- /Game/Textures/T_MasterWall :: Texture exceeds the SyncShield size guideline (8192 > 4096).
Unreal exposes observation hooks for package pre-save events, but SyncShield does not currently own a universal hard-cancel path for every native editor save route. In practice: SyncShield actions can block on validation errors; native Unreal save paths still surface warnings, not guaranteed vetoes.
Team Presence
Team Presence adds lightweight collaboration awareness without a server. Each active editor writes a JSON heartbeat that lists currently open assets and a short recent-save trail. Other editors read those heartbeat files and summarize the team state in the SyncShield tooltip.
The design goal is deliberately minimal: enough context to avoid stepping on each other, without turning the plugin into a separate collaboration platform.
- Heartbeat files are written to a shared sidecar folder.
- Expired sessions are ignored based on the presence timeout.
- The current UI surface is summary-oriented: teammate count, remote open asset count, and latest remote save note.
Presence topology
Folder example
RepoRoot/
|- .git/
|- .syncshield/
| \- presence/
| |- alice_ws01_76F4B1....json
| \- bob_ws07_C30A5E....json
\- SyncShieldDev/
Heartbeat example
{
"sessionId": "76f4b10f2f6841f981ca3b2f14b7b1d0",
"userName": "alice",
"machineName": "WS-01",
"projectName": "SyncShieldDev",
"heartbeatUtc": "2026-03-11T20:22:18Z",
"openAssets": [
"/Game/Blueprints/BP_Door",
"/Game/UI/WBP_PauseMenu"
],
"recentSaves": [
{
"packageName": "/Game/Blueprints/BP_Lever",
"savedAtUtc": "2026-03-11T20:21:46Z"
}
]
}
Presence is currently exposed as tooltip and status-summary text, not as in-editor avatars, per-asset badges, or a dockable teammate browser. The sidecar format is already in place for those later UI layers.
Save Profiles
Unreal normally pushes developers toward an awkward binary choice: save everything or work through a raw package list. SyncShield introduces named save profiles so common save intent becomes a single menu action.
Each profile still flows through the same safety pipeline: collect eligible packages, validate them, snapshot their current on-disk state, then save what remains allowed.
Profile matrix
| Profile | What it targets | Best use case | Notes |
|---|---|---|---|
Save All |
All dirty packages collected by the editor. | Full checkpoint before submit or engine restart. | Most comprehensive, highest chance of hitting validation or checkout friction. |
Save Blueprints |
Dirty content packages whose root asset is a UBlueprint. |
Gameplay scripting passes, Blueprint compile cleanup. | Skips maps and non-Blueprint content assets. |
Save Current Level |
The active world package plus dirty external packages attached to that world. | Level-editing sessions, lighting or layout passes. | Keeps unrelated content churn out of the save. |
Save Recent Assets |
Dirty packages touched inside the configurable recent window. | Fast “checkpoint what I just changed†habit. | Driven by package dirty/save timestamps tracked by SyncShield. |
Blueprint sprint
You are iterating on gameplay classes and widget logic.
Use: Save Blueprints. This avoids unrelated map or texture churn while still running validation and history capture on the exact packages you care about.
Map polish pass
You are adjusting actors, level scripts, and world-partition sidecars.
Use: Save Current Level. This keeps the save scoped to the world you are actively editing.
Short checkpoint
You made a burst of edits and want a quick recoverable save without paying for a broad save pass.
Use: Save Recent Assets. The recent window defaults to 15 minutes and is adjustable.
Selective save breaks the binary workflow
Conflict Sentinel
Merge conflicts on Blueprints are notoriously painful. Conflict Sentinel runs a continuous background check to catch these collisions before you even save.
When you have an asset open and dirtied, SyncShield silently polls the remote Git tracking branch. If a teammate pushes a modification to that exact asset, you receive an immediate, high-priority warning toast.
When the Sentinel fires, it means your local changes will conflict if you commit them. You should immediately coordinate with your teammate or stash your changes to review theirs.
Detection Flow
Safe Branch Shifter
Switching Git branches while the Unreal Editor is open frequently causes memory corruption, ghost references, or outright crashes because the files change on disk beneath the engine.
The Safe Switch Branch menu handles the transition flawlessly. It protects your unsaved data, forcefully closes all vulnerable asset editors, performs a clean checkout, and lets the Asset Registry hot-reload safely.
- Dirty Protection: Intercepts you if you have unsaved assets before switching.
- Editor Lockdown: Triggers
CloseAllAssetEditors()to purge active memory locks. - Dynamic Menu: Automatically populates with your current local Git branches.
Crash-Free Checkout
1. Intent
Select a target branch from the SyncShield Git toolbar menu.
2. Intercept
If dirty assets exist, you are prompted to Save or Discard via the Strict File Locking pipeline.
3. Lockdown
All floating Blueprint and Asset Editor windows are forcefully closed, removing memory locks on the .uasset files.
4. Checkout
SyncShield executes a clean headless Git checkout. The Unreal Asset Registry hot-reloads the changes safely.
Source Control
The original SyncShield source-control layer is still intact. The plugin still probes Git and Plastic SCM directly, still surfaces degraded states in the toolbar, and still gates risky sync commands when the project is dirty or the repository state is unsafe.
The major upgrade adds save-safety systems around that core rather than replacing it. In practice, SyncShield now answers two different questions at once: “is my repository state healthy?†and “is this specific save safe to perform?â€
Provider support
| Setup | Detected by | Toolbar behavior | What remains available |
|---|---|---|---|
| Git | git rev-parse and git status --porcelain=v2 -b |
Shows branch, ahead/behind, conflicts, unsaved assets, and Git actions. | Fetch, Auto Fetch, Pull (Rebase), Push, Submit Content, save profiles, history, validation. |
| Plastic SCM | cm getworkspacefrompath, workspaceinfo, and status |
Shows workspace branch context, login-required state, pending changes, and update action. | Update Workspace, Submit Content, save profiles, history, validation, presence. |
| No provider or no repo | No CLI found, or no repo/workspace root discovered. | Toolbar degrades to SCM Missing or No SCM Repo while still keeping unsaved-asset visibility. |
Save profiles, history, Smart Auto-Save, validation, and presence still work locally. |
Checkout and locking behavior
| Setup | Checkout model | What SyncShield does before saving | Result |
|---|---|---|---|
| Git without locking | No meaningful checkout operation. | If files are read-only but the provider cannot checkout them, SyncShield clears the read-only flag and bypasses the checkout prompt. | Avoids the Unreal “Check Out Selected†dead-end on plain Git workflows. |
| Git with lock-aware provider | Checkout / lock support available. | SyncShield requests checkout for eligible packages and blocks packages reported as checked out by someone else. | Preserves lock-aware team workflows. |
| Plastic SCM | Native checkout model supported. | SyncShield lets the provider handle checkout and blocks packages locked by other users. | Consistent with centralized lock workflows. |
| No source control | None | SyncShield saves locally without a provider preflight. | Recovery features still protect against bad saves even in solo local projects. |
Command gating
Git actions
Fetchrequires Git active, client available, repo found, and no status-command failure.Pull (Rebase)additionally requires upstream configured,Behind > 0, a clean working tree, and no unsaved assets.Pushadditionally requires upstream configured,Ahead > 0,Behind == 0, a clean working tree, and no unsaved assets. On success, locally-held LFS locks are released automatically.
Plastic action
Update Workspacerequires Plastic active, client available, workspace found, valid authentication, clean workspace, and no unsaved assets.- If the provider is in
Login RequiredorStatus Error, update remains blocked. Submit Contentopens Unreal's native source-control check-in window. On Git with LFS, locally-held locks are released automatically after a successful check-in.Unlock LFS Filesis enabled when Git LFS is detected and local locks are held. It releases all locks after a confirmation dialog.
Git LFS Locks
Git LFS file locking prevents two developers from editing the same binary asset simultaneously. SyncShield 0.6 adds first-class lock management so you never have to leave the editor to release orphaned locks.
How LFS locking works
When lockable is set in .gitattributes, LFS-tracked files are made read-only on disk. A developer must explicitly git lfs lock a file before editing it, and git lfs unlock when done. Locks are server-side and enforced globally, not per-branch.
LFS locking requires a Git LFS server that supports the locking API (GitHub, GitLab, Gitea, Bitbucket, etc.) and the lockable attribute in your .gitattributes. SyncShield ships with lockable already set for *.uasset and *.umap.
What SyncShield does with LFS locks
| Feature | Trigger | What happens |
|---|---|---|
| Lock detection | Every SCM status poll | SyncShield runs git lfs locks --local to discover locally-held locks and displays the count and file list in the toolbar tooltip. |
| Auto-unlock after Push | Successful git push |
After a push completes, SyncShield queries local locks and runs git lfs unlock for each one. Success and failure counts are reported via toast. |
| Auto-unlock after Submit | Submit Content (check-in) completes | If LFS locks were held before the check-in, SyncShield releases them automatically afterward. |
| Manual Unlock LFS Files | User clicks the menu action | Shows a confirmation dialog listing all locked files, then releases each lock individually. Enabled only when Git is active, LFS is detected, and locks exist. |
The orphaned lock problem
A common misconception is that git push automatically releases LFS locks. It does not. Without SyncShield, locks acquired during editing persist on the server indefinitely until someone manually runs git lfs unlock from the command line. This blocks teammates from editing those files even after you have pushed your changes.
SyncShield solves this by automatically releasing locks after push and check-in, and by providing a manual unlock action as a safety net.
SyncShield only unlocks locks held by the local user. It does not force-unlock locks held by other developers. If you need to override a teammate's lock, use git lfs unlock --force <path> from the command line.
Cross-Branch Locking
A common question is whether SyncShield only protects developers on the same branch, or whether it can prevent two developers on different branches from modifying the same asset simultaneously. The answer depends on the source control provider.
How SyncShield detects locks
SyncShield does not implement its own locking mechanism. It delegates entirely to Unreal Engine's ISourceControlProvider API, specifically the IsCheckedOutOther() and CanCheckout() methods on each package's cached state. What SyncShield sees depends on what the underlying provider reports.
Provider comparison
| Provider | Lock scope | Cross-branch protection | What SyncShield does |
|---|---|---|---|
| Git + LFS Locking | Server-side, branch-agnostic | Yes | When Developer A locks Hero.uasset on feature-A, Developer B on feature-B sees it as locked. SyncShield shows Locked (N) in the toolbar, fires the "LOCKED by Teammate" toast on asset open, and blocks the file from SyncShield-driven saves. |
| Plastic SCM | Workspace-global, not branch-scoped | Yes | Plastic's cm lock is visible across workspaces regardless of branch. UE's Plastic plugin reports IsCheckedOutOther() correctly. Same protections apply as Git + LFS. |
| Plain Git (no LFS locking) | No file-level locks exist | No | Without LFS locking, Git has no concept of file-level locks. IsCheckedOutOther() always returns false. SyncShield cannot detect concurrent edits. Conflicts are only discovered at merge time. |
| No source control | N/A | N/A | No provider to query. SyncShield's local features (history, validation, save profiles) still work, but there is no lock awareness. |
What this means for teams
With LFS locking or Plastic SCM
SyncShield provides full cross-branch asset protection. Developers working on different branches will see lock warnings, get toast alerts when opening locked assets, and have locked files blocked from saves. The lock is enforced server-side, so it works regardless of which branch each developer is on.
Without file-level locking
SyncShield still provides all of its local safety features (history snapshots, validation, save profiles, conflict sentinel, branch shifting) but cannot warn about concurrent edits from other developers. If cross-branch asset protection is important to your team, enable Git LFS locking.
Enabling Git LFS locking
If your repository uses Git LFS but does not yet have locking enabled, add the lockable attribute to your .gitattributes:
*.uasset filter=lfs diff=lfs merge=lfs -text lockable
*.umap filter=lfs diff=lfs merge=lfs -text lockable
SyncShield 0.6 ships with this configuration by default. After adding lockable, tracked files become read-only on disk until explicitly locked with git lfs lock <file>. UE's built-in Git plugin and SyncShield will then surface lock state through the standard checkout and lock UI paths.
Git LFS locks and Plastic SCM locks are branch-agnostic by design. A lock on feature-A blocks edits on feature-B, main, or any other branch. This is the correct behavior for binary assets like .uasset files, which cannot be merged.
Storage Layout
The upgrade introduces three important storage areas. Two live under the project's Saved directory and stay local by default. The presence sidecar lives near the repository root so multiple editors can see it.
Directory map
RepoRoot/
|- .git/ or .plastic/
|- .syncshield/
| \- presence/
| \- user_machine_session.json
\- Project/
\- Saved/
\- SyncShield/
|- History/
| \- Game/...
\- ShadowAutoSaves/
\- Game/...
| Location | Purpose | Retention model | Source-control guidance |
|---|---|---|---|
.syncshield/presence |
Per-session JSON heartbeat files for live editor presence. | Transient by session expiration and editor shutdown. | Add it to ignore rules if the repository is shared. It is collaboration metadata, not content. |
Saved/SyncShield/History |
Pre-save snapshots and metadata for local restore history. | Per-asset pruning based on Max Snapshots Per Asset. |
Already covered by the common Unreal practice of ignoring Saved/. |
Saved/SyncShield/ShadowAutoSaves |
Incremental shadow auto-save copies. | Per-asset pruning based on Max Shadow Snapshots Per Asset. |
Keep local only. These are operational backups, not authoritative content. |
If your repository does not already ignore it, add .syncshield/presence/ to source control. The project already ignores Saved/, which is usually sufficient for the history and shadow-save folders.
Settings
SyncShield settings live under Editor Preferences -> Plugins -> SyncShield. The plugin uses editor-per-project user settings, which means the values are intended to be tuned per project and per workstation rather than shipped as gameplay data.
| Setting | Default | Category | What it controls |
|---|---|---|---|
| Dirty Check Interval Seconds | 5.0 | Status | How often SyncShield re-checks dirty asset count. |
| Status Poll Interval | 15.0 | Source Control | How often Git/Plastic status is refreshed. |
| Auto Fetch | false | Source Control | Enables periodic Git fetch in the background. |
| Auto Fetch Interval | 120.0 | Source Control | Seconds between automatic Git fetch operations. |
| Toast On Status Change | true | Notifications | Shows status transition toasts in the editor. |
| Status Toast Min Interval | 4.0 | Notifications | Minimum spacing between state-change toasts. |
| Enable Local Save History | true | Local Save History | Turns pre-save snapshot capture on or off. |
| Max Snapshots Per Asset | 20 | Local Save History | Maximum retained snapshots for each asset or map. |
| Enable Smart Auto-Save | true | Smart Auto-Save | Turns incremental shadow auto-save on or off. |
| Shadow Save Interval | 30.0 | Smart Auto-Save | Seconds between background shadow-save attempts. |
| Include Maps | true | Smart Auto-Save | Allows dirty map packages into the shadow-save queue. |
| Include Content Assets | true | Smart Auto-Save | Allows dirty non-map content packages into the queue. |
| Max Shadow Snapshots Per Asset | 5 | Smart Auto-Save | Per-asset retention cap for shadow saves. |
| Enable Pre-Save Validation | true | Pre-Save Validation | Enables validation scanning and passive warnings. |
| Run UObject Data Validation | true | Pre-Save Validation | Calls project-defined IsDataValid rules. |
| Block SyncShield Save Actions On Errors | true | Pre-Save Validation | Removes erroring packages from SyncShield save actions. |
| Asset Name Pattern | ^[A-Z]{1,4}_[A-Za-z0-9_]+$ | Pre-Save Validation | Regex used for naming-convention warnings. |
| Max Recommended Texture Dimension | 4096 | Pre-Save Validation | Largest recommended texture dimension before warnings appear. |
| Enable Team Presence | true | Team Presence | Turns heartbeat file sharing on or off. |
| Heartbeat Interval | 5.0 | Team Presence | Seconds between local heartbeat writes. |
| Presence Expiration | 20.0 | Team Presence | How long remote heartbeats remain considered live. |
| Recently Touched Window | 15 | Save Profiles | Minute window used by Save Recent Assets. |
If your project has very large maps or many frequently dirtied assets, start by increasing the Smart Auto-Save interval before disabling the system entirely. The feature is designed to trade a large hitch for small periodic writes.
Workflow Playbooks
The upgraded SyncShield stack is most valuable when used deliberately. These playbooks show how the subsystems combine in real editing sessions.
Solo recovery loop
Edit normally. Smart Auto-Save quietly writes shadow copies over time.
Run a SyncShield profile. Validation catches obvious breakage before write.
Bad save slips through. Use Restore Latest Snapshot on the active asset editor.
Resume work. History gives you a local escape hatch even if Git was never committed.
Team sync loop
Read the tooltip summary. Presence shows teammate activity and latest remote save notes.
Save with intent. Use a profile that matches the current task instead of broad save spam.
Respect locks. Locked assets are blocked from SyncShield-driven saves when the provider reports them.
Sync only when clean. Pull, Push, or Update Workspace stay disabled until unsaved work is resolved.
Large map session
Focus on the active world. Use Save Current Level for periodic checkpoints.
Let Smart Auto-Save distribute writes. One dirty package is shadow-saved per interval.
Check validation before submit. Run Validate Dirty Assets if you want a dry run without saving.
Take a final broad save. Use Save All when the session is stable and ready to checkpoint.
Current Limits
The upgraded build is materially more capable, but it still has deliberate scope limits. Those are worth understanding up front so you do not over-assume what the plugin guarantees.
| Area | Current implementation | Not in this build |
|---|---|---|
| Local Save History | Automatic pre-save snapshots with Restore Latest Snapshot for the active asset. |
No full timeline browser, diff UI, or snapshot picker yet. |
| Validation | Can block SyncShield save actions on errors and can show passive warnings on observed pre-saves. | No universal hard block for every native Unreal save path. |
| Presence | JSON heartbeats plus tooltip/status summaries of remote activity. | No avatars, per-asset badges, or dedicated presence panel. |
| History restore | Restores the latest snapshot for the active asset editor. | No bulk restore, compare view, or multi-snapshot chooser. |
| LFS lock management | Auto-unlock after push/check-in, manual unlock menu action, local lock detection and tooltip display. | No force-unlock of other users' locks from the UI. No automatic git lfs lock on asset open. |
| Cross-branch protection | Full lock visibility when the provider supports it (Git + LFS locking, Plastic SCM). | No protection on plain Git without LFS locking. SyncShield cannot invent a lock mechanism where the SCM has none. |
Troubleshooting
| Symptom | Likely cause | What to do |
|---|---|---|
| SCM Missing is shown | SyncShield could not find Git or Plastic SCM CLI. | Install the relevant CLI and restart the editor. Local history, validation, and save profiles still work meanwhile. |
| No SCM Repo is shown | The project is not inside a Git repository or Plastic workspace root. | Initialize the repo/workspace or continue using SyncShield in local-only mode. |
| Restore Latest Snapshot is disabled | No active asset editor is known, or no history snapshot exists yet for that package. | Open the asset in an editor tab, make sure it has been saved at least once with Local Save History enabled, then try again. |
| I do not see any history files | The asset may never have been saved before, Local Save History may be disabled, or only autosave/procedural saves occurred. | Verify Enable Local Save History is on, then perform a normal save through SyncShield or the editor and inspect Saved/SyncShield/History. |
| Smart Auto-Save is not creating files | Feature disabled, no dirty packages, PIE/Simulate active, or package type excluded. | Check the Smart Auto-Save toggles, wait longer than the configured interval, and confirm you are not in PIE or Simulate. |
| Validation warnings appear, but a native save still completes | You saved through a native Unreal path that SyncShield can observe but not universally veto. | Use SyncShield save actions for blocking enforcement. Treat native-path warnings as advisory in the current build. |
| Team Presence is not showing teammates | Heartbeat sidecar not shared, teammates expired, or presence disabled on one side. | Confirm both editors can read the same repo-root .syncshield/presence folder and check heartbeat/expiration settings. |
| Presence files ended up in source control | The repo does not ignore .syncshield/presence/. |
Add that path to ignore rules and remove any accidentally tracked presence files. |
| LFS lock icon persists after push | Git push does not automatically release LFS locks. The lock remains on the server. | SyncShield 0.6 auto-unlocks after push. If you are on an older build, use git lfs unlock <file> manually or update to 0.6. |
| Unlock LFS Files is disabled | Either Git LFS is not detected in the repo, or no locally-held locks exist. | Verify LFS is initialized (git lfs install), that .gitattributes contains lockable, and that you actually hold locks (git lfs locks --local). |
| Teammate's lock not visible | Plain Git without LFS locking has no file-level lock mechanism. IsCheckedOutOther() returns false. |
Enable Git LFS locking by adding lockable to .gitattributes. See Cross-Branch Locking. |
| Check Out Selected is greyed out on Git | Git without locking support does not offer a real checkout path. | Current SyncShield builds bypass that dead-end by clearing read-only flags when checkout is unsupported. If you still see it, confirm you are on the updated build and not using a stale binary. |
| Pull, Push, or Update Workspace is disabled | The tree is dirty, unsaved assets exist, upstream/auth is missing, or the repo is in a blocked state. | Save assets first, clean the working tree, resolve conflicts, confirm upstream/login, then retry. |
FAQ
Does SyncShield replace Git or Plastic desktop clients?
No. SyncShield gives you in-editor awareness and a few guarded repo actions, but it is not a full repository browser, branch manager, or history client.
Fastest way to recover from a broken Blueprint save?
Open the asset, then use Restore Latest Snapshot. That restores the most recent local pre-save copy SyncShield captured for the active asset editor.
Does SyncShield capture every keystroke?
No. History snapshots are taken on real package save events, and Smart Auto-Save writes periodic shadow saves on an interval. It is not a keystroke recorder.
Can I disable some of the new systems?
Yes. Local Save History, Smart Auto-Save, Pre-Save Validation, and Team Presence each have their own enable toggle in SyncShield settings.
Does Team Presence require a server?
No. The current implementation uses shared JSON heartbeat files in .syncshield/presence. If teammates can all see that folder, presence works.
Will Smart Auto-Save clear the dirty flag?
No. Shadow saves use SAVE_KeepDirty, so the original package remains dirty until you intentionally save it.
Why is the toolbar label still SCM-focused?
The toolbar is still the plugin's anchor surface for repository state, and the new subsystems currently flow into its menu and tooltip summaries rather than replacing the label entirely. A broader save-centric shell is a likely next UI step.
Can SyncShield validate naming conventions?
Yes. The Asset Name Pattern regex setting produces warnings when asset names fall outside your configured convention.
Does SyncShield require Git LFS locking?
No. SyncShield works with plain Git, Git plus locking, Plastic SCM, or no source control. Lock-aware setups simply give it more information for checkout blocking and cross-branch protection.
Why did I see a Check Out Assets dialog with a greyed-out button?
That is the classic Unreal checkout path colliding with Git setups that do not support checkout. Current SyncShield builds detect that case and bypass the prompt where possible by clearing read-only flags before save.
If two developers work on different branches, will SyncShield prevent both from editing the same asset?
Yes, if your repository uses Git LFS locking or Plastic SCM. Both systems enforce locks server-side and branch-agnostically. Without file-level locking (plain Git), SyncShield cannot detect concurrent edits across branches. See Cross-Branch Locking.
Does git push automatically release LFS locks?
No. This is a common misconception. git push does not call git lfs unlock. SyncShield 0.6 solves this by automatically releasing all locally-held locks after a successful push or check-in. You can also manually release locks via the Unlock LFS Files menu action.
Which UE versions does SyncShield support?
SyncShield 0.6 ships Fab-ready builds for both UE 5.6 and UE 5.7. The 5.6 build uses a compatible API fallback for save-context detection.
About
SyncShield is a UE 5.6 / 5.7 editor plugin focused on sync protection, recovery, and visibility. The current build combines repository awareness with local versioning, incremental backup saves, project validation hooks, Git LFS lock management, lightweight teammate presence, and intent-aware save profiles.
This manual reflects SyncShield 0.6, compiled against both UE 5.6 and UE 5.7 on March 16, 2026.
Compiled Successfully
The plugin build completed successfully against the local editor target after the subsystem upgrade.
Target Engines
SyncShield 0.6 ships Fab-ready builds for both UE 5.6 and UE 5.7, with automatic API compatibility for both engine versions.
Likely Follow-Ons
Timeline browsing, richer presence visuals, and a more save-centric toolbar shell are the obvious next interface expansions.
GregOrigin
Created by Andras Gregori @ Gregorigin, a single dad currently based outside Budapest, HU.
"Building tools that empower creators to shape worlds."