SafeSave: Source Control Traffic Light (Git / Perforce) (Released)

Hi there, just released this tool here. It addresses a longtime pain point for so many of us. It’s my 1st release on Fab, don’t go hard on it please. :shushing_face: Thanks.

Stop screaming, 'Who locked the map?!' SafeSave adds a real-time Traffic Light to your toolbar that warns you of conflicts before you save.

Feature List:

  • Blue Light: "Auto-detects when teammates push updates."

  • Red Light: "Prevents merge conflicts with a Safe-Update protocol."

  • No Jargon: "Replaces command lines with simple 'Push/Pull' buttons."

Documentation & Guide: SafeSave @ GitBook

1 Like

Hey! This tool looks like something that we were looking for! Could you tell me whether you tried to launch it on 5.5? I can see that in compatibility section you stated that it works only with 5.7 but I wonder whether this is out of the scope or you simply haven’t tested it there :slight_smile:

1 Like

Hey there, thanks for your interest. In fact I first submitted it as 5.5 plugin, but Fab told me that it needs to be a 5.7 plugin to show up. So I went back, an now it’s basically fully compatible with 5.5, 5.6 and 5.7.

1 Like

FWIW, this is free.

The launcher unfortunately won’t allow users to download the plugin unless we have 5.7 installed currently. I haven’t published anything to fab yet, but it should be possible to mark it as compatible with multiple engine versions. I have 5.3, 5.5, and 5.6 installed and I see this when I try to download the plugin:

Personally I haven’t really had many issues with merge conflicts so far when working with a small team through perforce, but I would like to have this plugin for is to have a ‘sync all’ button in the editor. I’m not sure why there isn’t already one natively. The editor seems to track which files need to be updated, but forces you to navigate to the individual assets in the content browser and right click each one to sync, only offering you a multi-file sync option if the first asset you sync has dependencies that are also out of date.

The alternative is to close the entire editor, sync all, and re-open, which slows my workflow unnecessarily since the editor has built-in features for syncing files at runtime.

Also, the github issues link you provided seems to be set to private as it just displays as a 404 page for me.

1 Like

Hi there, thanks for the message. I first submitted as a 5.5 plugin specifically, but Fab said that it needs to be a 5.7 plugin.
Edit: I submitted a 5.6 version today, hopefully it’ll go live soon.

GitHub link was on private for some reason indeed, fixed now.

Thank you, Andras

Done.

2 Likes

You’ll also want a 5.5 version of this, 5.6 is still considered pretty new.

2 Likes

Hey all, v0.6 was just released as a radically new version. I’ll just copy the current description and the changelog here. Have fun with SafeSave! :hugs: :repeat_button:

SafeSave — Source Control Safety for Unreal Engine

SafeSave is a compact UE editor toolbar that keeps your source control status and unsaved assets impossible to ignore. It reduces risky syncs, prevents lost work, and keeps teams aligned with clear, always‑on signals.

USP & Benefits

  • :shield: Always‑On Safety Signals — The toolbar label shows branch/workspace | state at a glance.
  • :eye: Clear Risk Visibility — Conflicts, Diverged, Behind, Changes, Unsaved, and Login Required are color‑coded.
  • :compass: Provider‑Aware Actions — Git: Fetch / Pull (Rebase) / Push. Plastic: Update Workspace.
  • :locked: Safety Gates — Pull/Push/Update are disabled unless the workspace is clean and assets are saved.
  • :repeat_button: Auto‑Fetch (Git‑Only) — Optional background fetch keeps refs fresh without touching local files.
  • :bell: Toast Feedback — Optional status‑change toasts keep you informed in full‑screen viewports.

What You Get

  • :white_check_mark: Git + Plastic SCM Support — Uses the active UE Source Control provider.
  • :white_check_mark: Non‑Intrusive Workflow — No forced staging or commits. SafeSave surfaces risk only.
  • :white_check_mark: Fast Polling Controls — Tune refresh intervals in Editor Preferences.

Requirements

  • :toolbox: Git: git.exe on PATH.
  • :key: Plastic SCM: cm CLI installed and logged in via UE Source Control.

SafeSave keeps your pipeline safe, visible, and low‑risk — without changing how you already work.

February 4, 2026

  • Replaced the old status widget with a new Git-focused toolbar widget that shows branch | state, with color and icon cues.

  • Added a unified toolbar menu with Save/Refresh/Status actions plus provider-specific source control actions.

  • Added a Source Control-aware flow that supports Git and Plastic SCM (Unity Version Control) with automatic provider detection.

  • Added a Plastic SCM “Login Required” state and messaging when credentials are missing.

  • Added a Plastic SCM Update action when Plastic is active and logged in.

  • Added an auto-fetch toggle and surfaced the auto-fetch interval in the menu (Git-only).

  • Ensured duplicate toolbar entries do not accumulate by removing the existing entry before re-adding.

  • Added a settings panel in Editor Preferences → Plugins → SafeSave.

  • New settings:

  • DirtyCheckIntervalSeconds

  • GitCheckIntervalSeconds (renamed in UI as Status Poll Interval)

  • bAutoFetch

  • AutoFetchIntervalSeconds

  • bToastOnStatusChange

  • StatusToastMinIntervalSeconds

  • Reworded settings descriptions to be source-control agnostic and Git-only where appropriate.

  • Added toast notifications on status label changes (throttled by a minimum interval).

  • Added clear “Login Required” state (orange) for Plastic SCM authentication failures.

  • Updated tooltips and status details to show provider, workspace name, and pending changes for Plastic.

  • Updated label and tooltip wording to remove Git-only assumptions.

  • Git

  • status --porcelain=v2 -b parsing (staged/unstaged/untracked/conflicts/ahead/behind).

  • Fetch, Pull (rebase), Push actions (clean tree + upstream + no unsaved assets).

  • Auto-fetch (Git-only).

  • Replaced plugin-specific icons with known AppStyle icons (Save, Refresh, Info, Warning).

Update submitted:

[0.7] - 2026-03-06

Release Summary

SafeSave is now a UE 5.6+ editor plugin that surfaces source control risk directly in the Unreal Editor toolbar for both Git and Plastic SCM, blocks unsafe sync actions, exposes diagnostics for broken SCM states, includes automated editor validation, and ships as a Fab-ready source package.

Added

  • Added a toolbar widget that shows source control state in branch | state form.
  • Added a toolbar dropdown with save, refresh, status details, and provider-specific source control actions.
  • Added Git status parsing based on git status --porcelain=v2 -b.
  • Added Git state handling for Clean, Changes, Ahead N, Behind N, Conflicts, and Diverged.
  • Added Plastic SCM workspace detection using cm getworkspacefrompath.
  • Added Plastic SCM branch and workspace parsing using cm workspaceinfo and cm status.
  • Added Plastic SCM pending-change and conflict parsing from machinereadable status output.
  • Added a Plastic SCM Login Required state for missing or expired credentials.
  • Added a Plastic SCM Update Workspace action when the workspace is valid and safe to update.
  • Added a settings panel in Editor Preferences -> Plugins -> SafeSave.
  • Added status polling settings for dirty-asset checks and SCM polling cadence.
  • Added Git auto-fetch settings and interval controls.
  • Added throttled status-change toast notifications.
  • Added a status details dialog that exposes repo, workspace, branch, counts, and CLI error output.
  • Added the SafeSave.StressTest console command for developer and demo sanity checks.
  • Added editor automation coverage for module registration, toolbar registration, status rendering, command gating, and live SCM probing.
  • Added a disposable Git end-to-end automation flow to validate real repository transitions.
  • Added a disposable divergent Git test that creates a real ahead 1 / behind 1 state.
  • Added a live Plastic probe test that validates machine-specific Plastic availability and auth conditions.
  • Added an optional configured Plastic workspace test gated by SAFESAVEPLASTICWORKSPACE.
  • Added a dedicated HTML validation report documenting successful UE editor validation coverage.
  • Added a Markdown showcase storyboard for screenshots, Fab imagery, and a short promo video.

Changed

  • Reworked the toolbar from a simpler Git-oriented status widget into a source-control-aware Git and Plastic SCM toolbar.
  • Standardized plugin wording across UI and settings so the plugin is not described as Git-only where that is no longer accurate.
  • Switched toolbar iconography to stable Unreal AppStyle icons rather than plugin-specific icon assets for action affordances.
  • Updated the status label, tooltip, and details text so Git and Plastic SCM use the same user-facing model.
  • Updated settings text to describe generic SCM polling while keeping Git-only notes where required for auto-fetch behavior.
  • Expanded the HTML manual to document the current states, command gating, diagnostics, validation, and packaging workflow.
  • Produced a Fab-ready host-project package layout instead of relying on stale local build output.

Fixed

  • Fixed a visibility bug where unsaved assets disappeared from the toolbar when source control was missing.
  • Fixed a visibility bug where unsaved assets disappeared when no repository or workspace was found.
  • Fixed a visibility bug where unsaved assets disappeared during Plastic Login Required states.
  • Fixed Git and Plastic status-command failure handling so post-detection CLI failures surface as explicit Status Error states instead of being misread as healthy or ambiguous repos.
  • Fixed toolbar labels to preserve unsaved work visibility in degraded states, including:
    • SCM Missing | Unsaved N
    • No SCM Repo | Unsaved N
    • Login Required | Unsaved N
  • Fixed Git pull gating so Pull (Rebase) is only enabled when Behind > 0 and Ahead == 0.
  • Fixed Git push gating so Push is only enabled when Ahead > 0 and Behind == 0.
  • Fixed diverged-branch behavior so both pull and push are disabled when the branch is ahead and behind at the same time.
  • Fixed Plastic Update Workspace gating so it disables correctly for Login Required and Status Error conditions.
  • Fixed the stress-test developer command wiring by registering it during module startup and unregistering it during shutdown.
  • Fixed status-change toast styling so degraded states use warning or failure presentation instead of always using success styling.
  • Fixed packaging consistency by generating a clean Fab-ready package from a staged host project rather than reusing stale binaries.

Toolbar States and Behavior

  • SafeSave now explicitly documents and renders these important states:
    • Clean
    • Changes
    • Unsaved N
    • Ahead N
    • Behind N
    • Conflicts
    • Diverged
    • SCM Missing
    • No SCM Repo
    • Login Required
    • Status Error
  • Composite degraded labels keep unsaved work visible instead of hiding it.
  • Status Error is now the canonical state when the provider exists and the repo or workspace is found, but the status command itself fails.
  • Show Status Details is the primary inspection path for CLI diagnostics when a provider command fails.

Command Gating Rules

  • Git Pull (Rebase) requires:
    • Git active
    • client available
    • repo detected
    • upstream configured
    • no unsaved assets
    • clean working tree
    • no Status Error
    • Behind > 0
    • Ahead == 0
  • Git Push requires:
    • Git active
    • client available
    • repo detected
    • upstream configured
    • no unsaved assets
    • clean working tree
    • no Status Error
    • Ahead > 0
    • Behind == 0
  • Plastic Update Workspace requires:
    • Plastic active
    • client available
    • workspace detected
    • valid authentication
    • no unsaved assets
    • clean workspace
    • no Status Error
  • Diverged and unresolved provider states intentionally block update actions.

Validation

  • Passed UE 5.7 editor automation with 7 / 7 tests successful.
  • Validated module load, settings registration, toolbar registration, and stress-test command registration.
  • Validated toolbar labels, tooltips, summaries, and colors for:
    • SCM Missing
    • No SCM Repo
    • Login Required
    • Status Error
  • Validated command gating for Git and Plastic SCM under healthy and degraded conditions.
  • Validated live Git transitions with disposable repositories for:
    • clean
    • changes
    • ahead
    • behind
    • diverged
  • Validated the live divergent Git branch path and used it to catch and fix an incorrect pull-enable condition.
  • Validated real Plastic CLI probing on the current machine.
  • Validated manual visual editor presence of the toolbar in a live UE 5.7 session.

Documentation and Presentation

  • Expanded SafeSave_Manual.html to include:
    • Status Error
    • composite unsaved labels in degraded states
    • corrected Git pull and push rules
    • corrected Plastic update rules
    • stress-test command documentation
    • validation summary
    • updated troubleshooting and FAQ
  • Created SafeSaveValidationReport.html to present the editor validation results in an illustrated format.
  • Created SafeSaveShowcaseStoryboard.md covering screenshot planning, Fab imagery, and a short promo storyboard.

Files and Artifacts

  • Core plugin code:
    • Plugins/SafeSave/Source/SafeSave/Private/SSafeSaveToolbar.cpp
    • Plugins/SafeSave/Source/SafeSave/Private/SSafeSaveToolbar.h
    • Plugins/SafeSave/Source/SafeSave/Private/SafeSaveModule.cpp
    • Plugins/SafeSave/Source/SafeSave/Private/SafeSaveDemo.cpp
    • Plugins/SafeSave/Source/SafeSave/Private/SafeSaveAutomationTests.cpp
    • Plugins/SafeSave/Source/SafeSave/Public/SafeSaveSettings.h
    • Plugins/SafeSave/Source/SafeSave/SafeSave.Build.cs
  • Documentation:
    • SafeSave_Manual.html
    • SafeSaveValidationReport.html
    • SafeSaveShowcaseStoryboard.md
  • Packaging:
    • Plugins/SafeSave/SafeSave.uplugin
    • Plugins/SafeSave/Config/FilterPlugin.ini
    • C:\PACK57\SafeSave1.0UE5.7.zip

Today’s update:

[0.7.1] - 2026-03-10

Added

  • Added an explicit “Submit Content” menu action mapped directly to Unreal’s native source control check-in window.
  • Added Preemptive Open Alerts: SafeSave now queries the provider when you double-click an asset and fires a large toast warning (“LOCKED by Teammate”) if another user already has it checked out.
  • Added Active Save Blocking: “Save All” now intercepts the dirty file list, queries the SCM provider, explicitly blocks locked files from being saved locally, and automatically issues checkout commands for the remaining assets.
  • Added visual Locked (N) and Checkout Req (N) state overrides to the toolbar label.

Changed

  • Reworked git pull --rebase gating. You can now execute a pull even if you are in a diverged state (Ahead > 0 and Behind > 0), allowing developers to stack local commits without leaving the editor.
  • Changed default polling intervals to reduce baseline overhead. Dirty file checks are now every 5 seconds (up from 1s) and SCM polling is every 15 seconds (up from 5s).
  • Suspended all background updates while Play In Editor (PIE) is active to prevent micro-stutters during gameplay testing.
  • Switched underlying process execution from blocking FPlatformProcess::ExecProcess to a monitored background thread wrapper.
  • All background CLI commands now have a hard 60-second timeout to prevent deadlocking the editor if a network request hangs.

Fixed

  • Fixed an indefinite editor deadlock caused by Git attempting to prompt for credentials in a headless background thread. Injected -c core.terminalPrompt=false and -c core.sshCommand="ssh -o BatchMode=yes" into all background Git calls.
  • Fixed file lock contention errors (“Another git process seems to be running”) by passing --no-optional-locks to background Git queries.
  • Fixed a localization bug where Plastic SCM auth detection failed on non-English operating systems. SafeSave now runs a fallback cm whoami check when cm commands fail to robustly verify login status.