GDevelop Steam Demo Still Saves to Preview Folder After Fest Branch Promotion - How to Fix
Problem: Your GDevelop game passed Gate 5 on the standalone export, but after you promoted the fest_demo Steam branch, playtesters report progress resets every launch. File Explorer shows saves under an preview or editor cache folder—not the path documented in save_path_map.json.
Who is affected now: Teams finishing the 7-day GDevelop save-path freeze in May–October 2026 and promoting a fest branch copied from internal QA. The bug appears only after branch promotion: preview and standalone paths diverged, or event sheets still call browser storage actions on desktop export.
Fastest safe fix: Re-export with a single Storage root driven by a build macro (company + game name)—never a scene variable with a hardcoded path → diff save_path_map.json and gdevelop_freeze_receipt_v1.json between internal and fest_demo → run one-time migration on first launch if testers already saved under preview → set gate4_branch_save_path_match: pass before SteamPipe promotion → add save_path to Wednesday metadata diff.
Direct answer
Progress is not “lost”—it is written to the preview path your fest build still uses. Branch promotion copied events and extensions but not the normalized storage root your freeze week documented. GDevelop’s preview player and packaged exe use different base directories unless you pin the Storage extension to the same logical keys and export profile. Fix the map, the export, and the receipt together; re-testing inside the editor does not count.
Why this issue spikes in May 2026
- The GDevelop save-path freeze challenge made
save_path_map.jsonstandard—teams promote branches before re-running Gate 3 on the fest profile. - Steam fest_demo builds often inherit playtest event copies where a scene variable still stores
C:\Users\...\preview\. - HTML5-first projects keep localStorage actions in sheets; desktop export “works” in preview but writes the wrong store at runtime.
- Playtest vs fest_public isolation fails when both branches share one storage key—see playtest isolation playbook.
Pair with 12 Free Defold GDevelop Ren'Py save-path audit resources. After save gates pass, continue October Next Fest metadata checklist.
Symptoms and search phrases
- Saves work in GDevelop preview; Steam-installed demo always starts at floor one.
AppDatapath containspreview,GDevelop 5, or an old project display name.- QA validated Thursday export folder; fest_demo depot behaves differently.
Storageactions show correct variable key but wrong root on disk.gdevelop_freeze_receipt_v1.jsonon fest branch missing or stale vs internal branch.- Playtest branch saves persist; fest_public branch does not (shared key, different binary).
Root causes (check in order)
- Branch promotion copied events only —
save_path_map.jsonupdated oninternal, not merged to fest export job. - Scene variable holds Windows path —
SaveRootstring still points at preview cache. localStorageactions on desktop export — preview OK; packaged exe uses wrong persistence layer.- Different
build_label/ project name between branches — Storage resolves a new folder; players look like “reset.” - Cloud / sync extension disabled on demo define while QA tested with extension on.
- Wrong depot promoted — playtest binary on fest branch (see save-slot label case study).
- Gate 5 tested Thursday folder only — Gate 6 installed Steam smoke never run on
fest_demo.
Fastest safe fix path
Step 1 — Prove where the Steam build writes (packaged only)
- Install the build from the
fest_demobranch (or local standalone with identical export options). - Delete known save folders listed in your old
save_path_map.json(document paths first). - Play to first checkpoint; trigger save.
- Search
%APPDATA%and%LOCALAPPDATA%for new files modified in the last minute:
Get-ChildItem -Path $env:APPDATA,$env:LOCALAPPDATA -Recurse -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -gt (Get-Date).AddMinutes(-10) -and $_.Extension -match '\.(json|sav|dat)$' } |
Select-Object FullName, LastWriteTime
Pass: Path matches expected_root in map—not preview.
Fail: Path contains preview → continue to Step 2.
Step 2 — Normalize Storage extension root (no baked paths)
In event sheets, replace absolute paths with project constants:
| Anti-pattern | Fix |
|---|---|
Scene variable SaveRoot = "C:\..." |
Delete; use Storage extension only |
localStorage write/read on desktop |
Switch to Storage extension actions |
Different keys per branch (demo_save vs demo_save_preview) |
One key: demo_save_v1 on all retail branches |
Document in save_path_map.json:
{
"schema": "save_path_map_v1",
"company": "YourStudio",
"game": "FestDemo2026",
"slots": [
{
"slot_id": "demo_progress",
"action": "Storage write variable",
"key": "demo_save_v1",
"expected_root": "%APPDATA%/YourStudio/FestDemo2026/",
"forbidden_substrings": ["preview", "GDevelop 5 preview"]
}
],
"save_format_version": 1
}
Outbound reference: GDevelop Storage extension.
Step 3 — Diff freeze receipts and maps between branches
Before promoting fest_demo:
fc /n release-evidence\gdevelop\internal\save_path_map.json `
release-evidence\gdevelop\fest_demo\save_path_map.json
Extend gdevelop_freeze_receipt_v1.json:
{
"schema": "gdevelop_freeze_receipt_v1",
"project_version": "0.4.0-freeze-week",
"gates": {
"gate3_save_path_map": "pass",
"gate4_export_folder": "pass",
"gate4_branch_save_path_match": "pass"
},
"freeze_pass": true,
"build_label": "gd-nextfest-2026-05-24-rc1",
"branch": "fest_demo",
"documented_save_key": "demo_save_v1",
"verified_root_note": "%APPDATA%/YourStudio/FestDemo2026/"
}
Block promotion if gate4_branch_save_path_match is not pass or maps differ.
Step 4 — Re-export fest profile and promote depot
- Open the fest export preset (not “quick preview export”).
- Confirm debugger off, 64-bit, same game name as
save_path_map.json. - Run Gate 5 round-trip on the new exe before SteamPipe.
- Upload to
fest_demodepot only—do not reuse playtest manifest. - Log
build_labelin BUILD_RECEIPT.
Step 5 — One-time migration for early fest testers
If preview-folder saves already shipped:
// Pseudologic — run once at Title scene on first launch after patch
if (storage.exists("demo_save_v1") == false && fileExistsLegacyPreview()) {
storage.write("demo_save_v1", readLegacyPreviewSave());
storage.write("save_migrated_from_preview", true);
}
Ship player-facing note: first launch after patch may import progress—or reset if corrupt. Align store FAQ save claims.
Step 6 — Installed Steam smoke (Gate 6)
Run S4–S6 from Wednesday demo build smoke on the Steam-installed build with a clean Windows user or VM. Editor and Thursday-folder tests do not satisfy this step.
Verification checklist
- [ ]
save_path_map.jsonidentical on internal andfest_demoevidence folders. - [ ] No
previewsubstring in verified save path on installed Steam build. - [ ]
gate4_branch_save_path_match: passin fest receipt. - [ ] Gate 5 round-trip passes twice on fest
build_label. - [ ] Gate 6 installed smoke GREEN.
- [ ] Wednesday metadata diff includes
save_pathcolumn. - [ ] Playtest and fest use different keys if both live—isolation playbook.
Prevention
- Treat branch promotion as “re-run Gates 3–6,” not “copy depot ID.”
- Pin Storage extension version in Monday scene inventory.
- Ban scene variables for OS paths—code review grep
C:\\andpreview. - Add CI job: fail if
save_path_map.jsononfest_demo≠internal. - Pair with Defold save root help in multi-engine studios—same promotion discipline.
Troubleshooting
| Symptom | Fix |
|---|---|
| Preview OK, Steam reset | Re-run Step 1 on installed build; fix Storage root |
| Two folders updating | Duplicate save systems—remove localStorage actions |
| Key exists, load empty | Read key ≠ write key in event sheet |
| Only fest branch fails | Wrong depot promoted; verify build_label in-game |
| Playtest OK, fest bad | Separate playtest_save_v1 vs demo_save_v1 keys |
| Receipt says pass, players fail | Receipt from Thursday folder, not Steam install |
FAQ
Is this the same as Defold collection map drift?
Same branch promotion failure class—see Defold save root help. GDevelop uses Storage extension paths, not sys.save.
Does Gate 4 in the freeze challenge mean branch paths?
Official Gate 4 is export folder audit. Add gate4_branch_save_path_match for promotion—this help article’s gate blocks fest upload when branches diverge.
Can I use Steam Cloud?
Only if implemented and FAQ-accurate. Default Storage is local—document in save_path_map.json.
Construct NW.js demos?
Parallel fest cluster—Construct uses AppData + package.json name; help article planned for NW.js save mismatch (same Wednesday diff column).
Related links
- 7-Day GDevelop Steam Export Save Path Freeze Challenge (2026)
- 12 Free Defold GDevelop Ren'Py Save-Path Audit Resources
- Defold Steam Save Root Outside Collection Map
- Mismatched Save Slot Labels After Branch Promotion
- Wednesday Demo Build Smoke Ritual
- 22 Free Steamworks PC Distribution Resources (October refresh)
- GDevelop wiki — Storage extension
Prove saves on the Steam-installed GDevelop exe—preview is not your fest demo.