Steam Cloud Sync Overwrites Local Fest Demo Save After Enabling Cloud Mid-Cycle - How to Fix
Problem: Your fest demo FAQ says local saves only, but you enabled Steam Cloud in Steamworks after the first playtest wave. Players who grinded hours on build N launch build N+1 and find level one again—the client synced an older remote file over a newer local save.
Who is affected now: Teams that refreshed the save and cloud sync resource in May 2026 and flipped Cloud on for convenience without a conflict policy, schema version, or FAQ update. The failure spikes after a mid-cycle patch—not on first install—when remote blobs from playtest or an old filename still live in Steam Cloud.
Fastest safe fix: Document canonical local paths in save_path_map.json → list exact Cloud filenames in Steamworks (match on-disk names) → choose local-first or newest-wins policy → wipe remote on save_schema_version bump → run Cloud on/off matrix on two accounts → file steam_cloud_sync_receipt_v1.json → align store FAQ with Settings UI.
Direct answer
Steam Cloud is not a backup of your local folder—it is a separate file set keyed by App ID. When Cloud turns on mid-cycle, the client may download a stale remote that wins over local depending on timestamps, your conflict handler, and whether playtest and fest builds used different filenames. Fix Steamworks file list + schema version + conflict policy + FAQ together; apologizing in Discord does not restore player trust.
Why this issue spikes in June 2026
- Save/cloud resource refresh — Teams learned local paths first, then enabled Cloud without remote hygiene.
- Playtest → fest_public promotion — Same App ID, different depots; remote files from playtest still sync.
- FAQ still says offline — Cloud icon appears; players blame “broken demo.”
- October fest locks — Cloud saves parity checklist expects proof tables before creative freeze.
- Branch isolation gaps — Playtest isolation playbook covers depots, not Cloud file namespaces.
Pair with mismatched save slot labels case study when UI slot numbers disagree with disk paths.
Symptoms and search phrases
- Progress fine until patch Tuesday; reset after update.
- Steam Cloud sync icon on demo that FAQ calls local only.
- Playtest account save appears on fest_public (or reverse).
- Two machines: newer machine loses to older remote.
save_slot_2.savlocal exists; Cloud still servesdemo_save_v1.dat.- Developers enabled Cloud on playtest branch config only—fest inherits.
- Players cite “Steam ate my save” in fest reviews.
Root causes (check in order)
- Cloud enabled without Steamworks file list parity — wrong names → client creates empty remote that wins.
- Stale remote from playtest — older timestamp overwrites newer fest local.
- No
save_schema_version— patches cannot force remote wipe. - Conflict resolution favors remote — default SDK/sample behavior.
- Different save basename per build — looks like new game; Cloud serves old file.
- Cloud on App ID, demo claims local-only — trust failure even when technically “working.”
- Tested single machine — never ran two-account sync matrix.
Beginner path (first hour)
Prerequisites: Steamworks app access, fest demo installed from fest_demo branch, two test Steam accounts.
- Open Steamworks → Steam Cloud → note enabled toggle and file list.
- On PC, find local save from save path map pattern—document path in
save_path_map.json. - Account A: play 15 minutes, save, quit.
- Account B: install same build—confirm no cross-account bleed (expected).
- Same account, second PC (or VM): install—if Cloud on, observe whether remote matches local.
- If reset reproduces → continue Fastest safe fix path.
Common mistake: Testing Cloud only in editor with Steam API stub—validate installed Steam build.
Fastest safe fix path
Step 1 — Lock canonical local path in save_path_map.json
{
"schema": "save_path_map_v1",
"engine": "your_engine",
"company": "YourStudio",
"game": "FestDemo2026",
"slots": [
{
"slot_id": "demo_progress",
"local_relative_path": "save/demo_progress_v3.sav",
"steam_cloud_filename": "demo_progress_v3.sav",
"save_schema_version": 3
}
],
"cloud_policy": {
"enabled": true,
"conflict_resolution": "local_first_newest_timestamp",
"remote_wipe_on_schema_bump": true
}
}
Rule: steam_cloud_filename must match Steamworks Cloud entry byte-for-byte.
Outbound: Steamworks — Steam Cloud, ISteamRemoteStorage.
Step 2 — Steamworks Cloud file list audit
| Check | Pass |
|---|---|
| Each synced file listed in Steamworks | Yes |
Names match save_path_map.json |
Yes |
| Quota sufficient for max save size | Yes |
| Cloud disabled for fest if FAQ says local-only | Yes (either disable OR fix FAQ) |
If FAQ promises local only for fest scope → disable Cloud for demo period per cloud saves parity checklist.
Step 3 — Schema bump + remote wipe on patch
When save format changes:
// Unity / C# — pseudo pattern on first launch after patch
const int CurrentSchema = 3;
if (PlayerPrefs.GetInt("save_schema", 0) < CurrentSchema) {
// Optional: prompt "Save format updated; cloud reset required."
SteamRemoteStorage.FileDelete("demo_progress_v3.sav"); // each listed file
// or wipe all cloud files for app during controlled migration window
PlayerPrefs.SetInt("save_schema", CurrentSchema);
}
Ship player-facing patch note when wipe is destructive. For fest demos, prefer bump + wipe remote over silent overwrite.
Step 4 — Conflict policy (local-first example)
| Policy | When to use |
|---|---|
| Local-first, newest timestamp | Fest demos after mid-cycle Cloud enable |
| Newest-wins with UI prompt | Full game with account investment |
| Cloud disabled | FAQ says local-only; simplest fest path |
| Remote wipe on schema bump | Every breaking save patch |
Document chosen policy in steam_cloud_sync_receipt_v1.json—do not leave implicit.
Step 5 — Cloud on/off test matrix
| Config | Account | Machine | Expected |
|---|---|---|---|
| Cloud OFF | A | 1 | Local save only |
| Cloud ON | A | 1 then 2 | Newer local wins or prompt |
| Cloud ON | A playtest remote stale | 1 | Wipe remote before fest |
| Cloud ON | B | 1 | No A progress |
Log results in receipt matrix[] rows.
Step 6 — steam_cloud_sync_receipt_v1.json
{
"schema": "steam_cloud_sync_receipt_v1",
"build_id": "fest-demo-2026-05-24",
"branch": "fest_demo",
"cloud_enabled": true,
"conflict_resolution": "local_first_newest_timestamp",
"save_schema_version": 3,
"remote_wipe_on_schema_bump": true,
"faq_claim": "local_and_cloud_disclosed",
"gates": {
"cloud_file_list_parity": "pass",
"two_machine_matrix": "pass",
"playtest_remote_cleared": "pass"
},
"promotion_allowed": true
}
Add BUILD_RECEIPT column:
| Column | Value |
|---|---|
steam_cloud |
pass |
cloud_conflict_policy |
local_first_newest_timestamp |
save_schema_version |
3 |
Working dev path (proof table)
| Check | Artifact | Pass signal |
|---|---|---|
| Local path | save_path_map.json |
Matches packaged build probe |
| Cloud names | Steamworks file list | Byte match |
| FAQ | FAQ parity | No local-only lie |
| Playtest isolation | Isolation playbook | Separate remote namespace or wipe |
| Patch migration | Release notes + schema bump | Remote wiped or merged |
| Receipt | steam_cloud_sync_receipt_v1.json |
All gates pass |
Verification checklist
- [ ]
save_path_map.jsonlists every Cloud file withsave_schema_version. - [ ] Steamworks Cloud toggle matches FAQ promises.
- [ ] Two-machine matrix pass logged in receipt.
- [ ] Playtest-era remote blobs cleared before fest week.
- [ ] Patch with schema bump does not silently favor stale remote.
- [ ] Wednesday smoke includes
steam_cloudcolumn. - [ ] Store page does not claim cross-device sync unless proven.
Prevention
- Decide Cloud on/off for fest before first public upload—not mid-fest casually.
- Add remote wipe to every breaking save migration checklist.
- Keep playtest and fest save basenames separate if sharing one App ID.
- Bookmark 20 save and cloud services resource for backend options after local path is stable.
- Pair with GameMaker / GDevelop path helps when Cloud syncs the wrong file not just old timestamps.
Troubleshooting
| Symptom | Fix |
|---|---|
| Reset only after patch | Schema bump without remote wipe |
| Cloud icon but FAQ local-only | Disable Cloud or rewrite FAQ |
| Playtest progress on fest | Wipe remote; separate filenames |
| Newer PC loses | local-first policy + delete stale remote |
| Empty save after enable | Cloud filename mismatch in Steamworks |
| Works for dev, not players | Dev account remote differs—test fresh accounts |
FAQ
Should fest demos use Steam Cloud at all?
Only if FAQ and hour-one behavior prove it—otherwise disable for fest scope per cloud parity checklist.
Is this the same as wrong AppData path?
Different class—GameMaker save path help fixes where local writes; this help fixes remote winning over local.
Do I need custom conflict UI?
Fest demos can use schema bump + remote wipe; full games should prompt.
What about Epic / console cloud?
Same discipline—document policy in receipt; this help is Steam-first.
Can I recover player saves?
If remote was newer incorrectly, recovery is rare—communicate wipe and offer one-time compensation policy in patch notes.
Related links
- 20 Free Game Save and Cloud Sync Services (2026 resource)
- 12 Free Defold GDevelop Ren'Py Save-Path Audit Templates
- Steam Cloud Saves and Progression Claims Parity (checklist)
- Mismatched Save Slot Labels After Branch Promotion
- Steam Playtest vs Fest Demo Isolation Playbook
- Wednesday Demo Build Smoke Ritual
- BUILD_RECEIPT JSON One-Evening Tutorial
- Steamworks — Steam Cloud
Align Cloud toggles, filenames, and FAQ before the next fest patch—not after review bombs cite lost saves.