Repository navigation
EN Play Saves
Français · Type: how-to + explanation · Audience: player · Context: player's browser · Status: ready · Applies from: 4.1.15
The player (DOM painter) · contract: stable · verified by CI (support matrix of 4.4.0, 2026-10-23): Chromium on the desktop, mouse and keyboard; Chromium and WebKit at a phone's size, touch and keyboard (emulated); axe-core on every screen (not a WCAG claim) · automated checks: jobs
e2e; CI plane2e; 2 test files · people's passes:phone-both-renderersnot run (#83),code-wheel-humannot run (#78),blind-playtestersnot run (#76) · known limits:saves-device-only
How a quest'n'click game keeps your progress, how to save in a slot, how to move a save to another device, and what a save holds. The labels are the engine's defaults; a game may word them otherwise.
Your game resumes where you left it, on the same device, with Continue on the title screen. With save slots you also keep several points of the story, and you can carry a save to another device as a file.
The player of any quest'n'click game in a browser. True from 4.1.15 (the save envelope of schema 4, which records the
Remix world a game was played in); slots live in IndexedDB since 3.1. Save slots exist only in a game whose author
turned them on (saves.slots); the sample game has three.
- A browser that keeps the site's storage. In a private window, or a browser profile that blocks IndexedDB, the game still saves, in local storage instead, and says so once.
In the game, from the pause menu (the pause button in the tools, or Escape).
The game saves by itself each time an action ends (the engine back to idle), when you change rooms, and when a script moves on. Each write is read back and checked. The pause menu's Autosave row shows ✓, or ⚠ when the last write failed; a failed write also shows "Save failed" with the browser's reason. Continue on the title screen resumes the autosave. Restart erases it first, after a confirmation; if the browser refuses to erase it, you keep your game.
- Save in a slot: pause menu › Save › a slot. Each slot shows the room and the date of its save, or "empty". Saving over a used slot asks "Overwrite this save?" first.
- Load a slot: pause menu › Load › a slot. An empty slot cannot be chosen.
-
Export a save to a file: pause menu › Save › Export file. Your browser downloads
<game>-save.json, the current game.
- Import it on another device: there, open the same game, pause menu › Load › Import file, and pick the JSON file. The save is written into the first free slot (if there is one), then loaded.
Saves never leave the device by themselves: there is no account and no cloud save. Export and Import are the way to move one (a phone to a computer, an old browser to a new one). The file holds your game for that one game: importing it into another game is refused ("save belongs to game …").
The same Save menu has two more files, for bug reports rather than saving:
-
Share session (a playtest): the inputs since the game started, with ids only and the places you tapped near but
missed. It opens your device's share sheet when it can, else downloads
<game>-<date>.session.json. - Export session: the inputs since the game started or a save was loaded, with the game's journal; the author's tools replay it exactly.
A save is your game's state: the room, where each character stands, the bag, what you did and learned (flags, counters, conversations seen), where scripts stand, the camera, the music's position, and for a Remix game the world you play in. It does not hold your settings (text speed, volumes, language: they stay in the browser, apart) or your speedrun records.
A save written by any 3.x or 4.x release of the engine loads in every later 4.x: when the author changes the game in a way an old save cannot follow, the game carries the save over itself. When a newer version of a game no longer has something your save names (an item, a place), the save still loads, without it, and the game says "Save adjusted for this version" with what it left out. See Stability and support.
Guarantee ·
play-save-refused-untouched· referenced · scope self-checked by the author (AI), not reviewed A save of another game, a corrupt one, or one whose current room no longer exists is refused, and the game you are playing is left as it was.
Limit ·
saves-device-onlySaves live in this browser on this device. Clearing the site's data, or Safari clearing a site unopened for seven days, erases them: export the ones you care about.
- After Save, the slot shows the room and the time, and a short message "Slot 1 ✓".
- After Import file, the game loads the imported state and the first free slot holds it.
- The pause menu's Autosave row shows ✓.
| Message | Cause | Fix |
|---|---|---|
| "Save failed" | The browser refused the write (storage full, private window limits) | Free some space; keep the game open and try again; export the save |
| "save belongs to game "x", not "y"" | The file is another game's save | Import it into the game it came from |
| "save version 5 cannot be migrated to 4" | The save is newer than this copy of the game | Update the game (reload it online, accept the update), then import again |
| "this save was played in another world …" | A Remix save, made in another world than the one open | Open that world (the game offers to), or keep your current game |
| "Your saved game lives in another world" | A link opened a Remix world while your autosave is in another | Choose Continue the saved game, or start the link's world (it replaces the autosave) |
The full list of cases: Player troubleshooting.
In the browser: the IndexedDB database web-scumm-saves (its name keeps the project's former name, as a format
identifier), or, without IndexedDB, local storage keys <game>.save and <game>.slot.<n>. Export writes a file in
your downloads folder.
A slot overwritten cannot be brought back. Keep an exported file of a save you want to return to. A save from an older local-storage version of a game (before 3.1) is copied into IndexedDB once, and the old copy is removed only after the new one is verified.
Slots are a setting of the game (game.ts), with the menu's texts in ui:
saves: { slots: 3 }, // the pause menu gets Save / Load with three slots, plus export and import as a JSON file
ui: { …, save: 'Save', load: 'Load', slot: 'Slot {n}', emptySlot: 'empty', exportSave: 'Export to a file', importSave: 'Import a file', confirmOverwrite: 'Overwrite this slot?' },Manual slots are stored like the autosave: in IndexedDB, as envelopes, read back after each write; an imported file
also fills the first free slot. When the content changes incompatibly, bump saveVersion and carry the state over as
data, one step per version:
saveVersion: 3,
migrations: [
{ from: 1, renameFlag: { found: 'key_found' }, renameItem: { cle: 'key' } },
{ from: 2, renameRoom: { lobby: 'hall' }, renameProp: { 'hall.lamp': 'hall.lantern' }, dropFlag: ['tmp'] },
],The chain must reach saveVersion; a save with no path to it cannot be loaded (Continue then starts a new game).
Stale optional references are pruned with a visible warning; structural corruption, a foreign game, a missing current
room or an unknown active player is rejected without changing the current session. The whole subject, with the
Migration type: State and saves.
- Stability and support: which saves load in which versions.
- Privacy: what stays on the device.
- The code:
src/engine/core/save.ts,src/engine/dom/save-store.ts,src/engine/dom/menus.ts.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.4.0 r1, documentation revision · révision de la documentation 8dc717c69acb62c4742b69c54a7e7dfb620f75d8.
Earlier versions and permalinks · versions précédentes et liens permanents: https://wanoo.github.io/quest-n-click/docs/
An edit made in this wiki is overwritten at the next publication · une modification faite dans ce wiki est écrasée à la publication suivante.
Edit the source · Modifier la source · Report an error · Signaler une erreur
Index (6)
Start (6)
Play (9)
Install (17)
- Requirements
- Install from the release archive
- Install from npm, once published
- Install from the repository to work on the engine
- doctor: checking your machine
- Image toolchain
- Audio toolchain: ffmpeg, fluidsynth, Furnace, uv
- Upgrade
- Upgrade notes: 4.4
- Upgrade notes: 4.3
- Upgrade notes: 4.2
- Upgrade notes: 4.1
- Upgrade notes: v3
- Upgrade notes: v2 to v3
- Coming from web-scumm
- Package reference
- Install troubleshooting
Create a game (55)
- Your first game
- Layout of a created project and of the engine repository
- The working loop
- Content principles and the identity contract
- Rooms
- Geometry: placement, walk zones, masks, layers, camera
- Something is visible but unreachable
- Reactions
- Game commands
- Conditions
- Flags, variables and events: which to use
- Custom code
- Characters
- Items and inventory
- World map
- Dialogues
- Scripts and events
- Moving characters: patrols and walks
- Exits
- Chapters and objectives
- State and saves: persistent or temporary, renaming an id, migrations
- Staging: wide rooms and animations
- The stage: lights, particles, floors
- Skin and fonts
- Title and credits
- Heroes: several characters and hero choice
- Built-in minigames
- A custom minigame
- Translations
- Music in stems
- Sound effects
- Voices: per language and per hero
- Images: prompts, cutting sheets, transparency, scale
- Asset provenance
- The storyboard, source of truth
- Puzzle design
- Classic mechanics
- Review pages
- DSL reference
- Checking your game
- What the solver proves
- Solver options
- Playtests
- Remix
- Speedrun for authors
- The sealed ending
- Production template
- Example games
- Working with an AI
- Build and release a game
- Publish on GitHub Pages
- The static game on Clever Cloud
- Other static hosts
- Sub-path, cache and service worker, incomplete deploys, going back
- Testing on a phone over the LAN
Local Studio (24)
- The local Studio: overview and launch
- Edit a room
- Placement and stage
- Preview, apply, undo
- Storyboard
- Assets and cutting
- Check: validator, solver, critical path, heat, health, coverage
- Before and after captures
- Semantic diff
- Play and replay a session
- Rule explainer
- Language and objectives
- Voices and the heroes × languages matrix
- Map
- Notes
- Remix in the Studio
- Music
- The Assistant: bring your own key
- Demo mode and studio-apply
- Local and LAN security
- Studio API
- Local MCP: setting up each client
- MCP tools
- Studio troubleshooting
Team Studio (21)
- What runs where
- Concepts: revision, transaction, span, lease, preview, build
- Starting as an invited dev
- Working together day to day
- Roles and actions: the full matrix
- Invitations
- Managing members
- Write refused on the hosted Studio: stale base revision (409)
- Write refused on the hosted Studio: span locked (423)
- Recovering after a lost lease, a disconnection or a stale preview
- Comments
- Map and semantic diff
- Publishing builds
- Remote MCP
- The game in Git
- Upgrading the engine of a hosted game
- Hosted assets
- The server's command line
- Health and metrics routes
- Trying it locally with compose.yml
- Known limits
Clever Cloud (23)
- Clever Cloud: overview, cost and prerequisites
- Apps and add-ons
- Domains and TLS
- Keycloak
- Generic OIDC and GitLab
- Configuration
- First deployment
- Backups
- RPO and RTO
- Restore the Studio on a fresh installation
- Redeploys
- Upgrading the server and checking state after a migration
- Limits of going back
- Monitoring
- Security
- Rotating keys
- Recovering admin access
- Changing domain or OIDC provider
- Worker, PostgreSQL or Cellar down
- Exporting the game and leaving the installation
- Retention
- Clever Cloud troubleshooting
- Costs and teardown
Reality Bridge and connectors (16)
- The Reality Bridge: what it is
- Quick start
- Guarantees
- Install and run the Bridge
- Backup and restore
- Several tenants
- Signals and the manifest
- The Bridge's command line
- Connectors overview
- Email connector
- Telnet connector
- SSH connector
- Open Badges connector
- The connector SDK
- Security: Biscuit and signatures
- Bridge and connector troubleshooting
Contribute (25)
- Welcome
- Developer setup
- The dev loop
- Before a pull request
- Conventions
- Writing documentation
- Architecture
- Code tour
- Import boundaries
- Which tests run when
- Mutation testing
- The coverage ratchet
- The quality baseline
- CI explained
- Field passes
- Benchmarks
- Releasing
- npm packages
- Decisions and ADRs
- Governance
- Bot pull requests
- Contributing with AI agents
- Security policy
- Code of conduct
- Licences and credits