Repository navigation
EN Install Upgrade Notes 4 2
Français · Type: reference · Audience: author · Context: created project · Status: ready · Applies from: 4.2.0
What each release of the 4.2 line changed, from 4.1.20 to 4.2.5, kept unchanged. From 4.2.0 the project follows strict SemVer: a 4.2.x only fixes, a minor only adds. None of these releases asks a game to change: the public API, the content format and the save envelope are 4.2.0's (D40). Most notes are for the operator of a hosted Studio (4.2.1 to 4.2.3) and for the rename to quest'n'click (4.2.5, §38).
The upgrade itself is Upgrade. The section numbers are those of the former
docs/en/UPGRADING.md, so "§38" still finds its section. Where a note names STUDIO-SERVER or CONTENT_GUIDE, the
same content is now in the Team, Clever and Create pages of this wiki.
Nothing to change: 4.2.0 is 4.1.20's code with the version changed and one Field Kit fix. From 4.2.0 on, strict
SemVer: a 4.2.x only fixes, a 4.x minor only adds. The engine still installs from the release's archive
(releases/download/v4.2.0/…); npm publishing comes in a later 4.2.x. What 4.2.0 calls stable, limited or
experimental is in Stability and support (D38).
Applies from 4.2.1
Nothing to change in a game: the public API, the content format and the save envelope are 4.2.0's (D40). What an author may notice:
-
Node 22.13 or newer for the Studio and the tools that write a game (
ids,i18n,voices,import-layout,provenance, the Studio's own edits): their writes now go through the same journal as the hosted Studio's, kept locally under.cache/studio-journal/in SQLite (node:sqlite, Node 22.13+). Playing and building a game still run on 22.12. - An edit that would add a validation error is refused (422, with the errors), in the Studio and its tools: the game on disk stays valid.
-
The placement editor saves through the Studio's API (
PUT /__studio/api/room/<id>/layout); the/__layoutroute is gone andlayoutWriter()(intools/vite/plugins.ts) does nothing any more, kept so a configuration that names it still loads.
The engine installs from releases/download/v4.2.1/…. To put a Studio online for a team, see
What runs where (experimental in 4.2.1).
Applies from 4.2.2
Nothing to change in a game: the public API, the content format and the save envelope are 4.2.0's (D40). The engine
installs from releases/download/v4.2.2/…. For a hosted Studio:
- Vite has left the server: the game's origin serves the previews the processing worker builds, one per revision. The worker needs the engine's Vite to build (its install has it).
- The database migrates at start (migrations 0006 to 0010: previews, health, undo, builds, prepared sets).
-
The asset tools on the worker: set the worker's
CC_POST_BUILD_HOOKas What runs where says (their Python packages, locked with hashes); without it, "Prepare assets" (the Play tab's button) fails and shows the worker's error. Deploy this worker from the repository: installed from the archives, it cannot runpreparein 4.2.2 (4.2.3 ships the lock). -
Builds:
/play/<n>/needs a session unlesspublicBuildsis set (off by default). -
Backup: the journal ships to the bucket by itself; take a daily
studio-server backupand keep it off the instance (STUDIO-SERVER, "Backup and restore").
Applies from 4.2.3
Nothing to change in a game: the public API, the content format and the save envelope are 4.2.0's (D40). The engine
installs from releases/download/v4.2.3/…. For a hosted Studio:
- The database migrates at start (migrations 0011 and 0012: the client a write came from, for the revision read; the comments, kept by the backup).
-
This one redeploy refuses writes for about 2.5 min: a 4.2.2 instance keeps the service lease until Clever Cloud
stops it. From 4.2.3 on, an instance hands the lease over to the new one within about 10 s (STUDIO-SERVER, "Running
it: the reference deployment"). The Studio's page retries its writes meanwhile; deploy at a quiet time, and expect
the
/readyzalert to fire once. - Clocks: the worker now allows 30 s of skew between its clock and the Studio's; past that, a job is refused with "lives longer than a job may" (keep both apps' clocks synchronised).
-
A write carries the revision its editor read (
x-studio-base): the Studio's page sends it by itself. A script that writes may send it to be refused (409) rather than write over a change it never saw; without it, it is not checked this way. -
POST /api/assets/prepareanswers 202 with a job, no longer the prepared run: a script pollsGET /api/jobs/<id>untildone,failedorcancelled, and reads the run inresult. Cutting sheets and uploads now work on a hosted Studio, under the same exclusive lease. -
A worker installed from the release archives can prepare assets: its
CC_POST_BUILD_HOOKinstallsnode_modules/web-scumm/ops/studio/worker-requirements.lockinto.python(STUDIO-SERVER, "From the release archives");WORKER_PYTHON_PATHputs the packages elsewhere. A worker deployed from the repository keeps its hook. -
Git (optional): set
gitin the configuration (remote,branch,path,committer, andknownHostsfor a strict host check) and the deploy key as the secretSTUDIO_GIT_KEY(STUDIO_GIT_KEY_FILElocally); STUDIO-SERVER, "The game in Git". Withoutgit, the Play tab has no Git panel. -
The remote MCP: with OIDC, the Studio serves
/mcpand/.well-known/oauth-protected-resourceby itself. An agent's token must be a JWT access token carrying the Studio'soidc.audience(MCP, "A hosted Studio");npm run mcp -- --server <url>uses the CLI's token fromstudio-server login. -
Metrics (optional): set
STUDIO_METRICS_TOKEN(32 characters or more, or the server refuses to start) forGET /metrics; without it,/metricsis a 404. -
The daily backup (optional):
clevercloud/cron.jsonrunsops/studio/backup-cron.shon every app deployed from the repository; it backs up only whereSTUDIO_BACKUP_CRON=1is set (the studio app, never the worker), keepingSTUDIO_BACKUP_KEEPbackups (14 by default). From the archives, copy the script as STUDIO-SERVER says ("Running it: the reference deployment"). -
A game imported from 4.1.x can be upgraded on the server:
POST /api/engine/migrate, an owner's (STUDIO-SERVER, "Upgrading the engine of a hosted game"). -
If you passed
inviteits role first (invite owner --email …): it is now refused; writeinvite --email … --role owner.
Applies from 4.2.4
Nothing to change: a game that uses none of the new fields builds, plays and saves as on 4.2.3 (the same
fingerprints, golden saves and reference runs). The engine installs from releases/download/v4.2.4/…. The new fields
are optional and presentation only (D46: no schema, save envelope or IR change):
-
input: { exitOnTap: true }ingame.ts: a single tap on an exit, with no verb picked, walks there and goes through on arrival; an exit'sonTap: 'go' | 'walk'overrides the game's setting either way (CONTENT_GUIDE, "A double tap: the verb a player means"). -
actorGapon the game (for example0.8): without anapproachpoint in the layout, the hero stops at that share of the two characters' mean height, times the depth scale, instead of 44 units (CONTENT_GUIDE, the layout). -
"sheetBackground"insite.json:"transparent"or a#RRGGBBcolour for the generated sprite sheets (default#2B2E45, the same prompts as before); PROMPTS, "Choosing the sheet background".
A fix to know: a game that wrote { face: 'hero', who: X } saw X turn right wherever the hero stood; X now turns
toward the hero. If a scene relied on the old facing, write { face: 'right', who: X }.
Applies from 4.2.5
web-scumm becomes quest'n'click (D47). Nothing to change: a game made for 4.2.4 installs, builds, plays and saves
as before, under its old names. The engine installs from releases/download/v4.2.5/…, where the repository is now
github.com/wanoo/quest-n-click (the old github.com/wanoo/web-scumm links redirect, release downloads included).
The sample game and the Studio's demo moved to https://wanoo.github.io/quest-n-click/: the old address redirects
there, but update a bookmark or a link to wanoo.github.io/quest-n-click.
The new names, from 4.2.5:
| Before | From 4.2.5 |
|---|---|
package web-scumm, command web-scumm
|
quest-n-click, command quest-n-click
|
imports web-scumm/content, /player, /minigames, /testing, /reality
|
quest-n-click/content, … |
create-web-scumm |
create-quest-n-click |
web-scumm-bridge (package and command) |
quest-n-click-bridge |
web-scumm-connectors, command web-scumm-connector
|
quest-n-click-connectors, command quest-n-click-connector
|
web-scumm-studio-server, web-scumm-studio-worker
|
quest-n-click-studio-server, quest-n-click-studio-worker
|
release files web-scumm-<version>.tgz, web-scumm-<tag>-…
|
quest-n-click-<version>.tgz, quest-n-click-<tag>-…
|
The old names keep working through 4.2.x. Each release of the line also publishes web-scumm-<version>.tgz,
create-web-scumm-<version>.tgz, web-scumm-bridge-<version>.tgz, web-scumm-connectors-<version>.tgz and
web-scumm-studio-server-<version>.tgz: the same files at the same version, only the package's name is the old one.
The old commands still run, after a one-line notice ("web-scumm is now quest-n-click; the old name works until 4.3"),
and web-scumm/content and the other old imports still resolve. The aliases are removed in 4.3.
Switching, when you like (one commit, then npm install, npm run verify):
-
package.json: the dependency"web-scumm": "<spec>"becomes"quest-n-click": "<spec>", its archivequest-n-click-4.2.5.tgz; the scriptsweb-scumm dev,web-scumm build… becomequest-n-click dev,quest-n-click build…. -
tsconfig.json: the pathweb-scumm/*becomesquest-n-click/*, pointing at./node_modules/quest-n-click/src/engine/api/*;@engine/*points at./node_modules/quest-n-click/src/engine/*;includenamesnode_modules/quest-n-click/src/env.d.ts. - The game's sources:
from 'web-scumm/content'becomesfrom 'quest-n-click/content', and so on, for examplegrep -rlE "['\"]web-scumm/" game | xargs sed -i.bak -E "s#(['\"])web-scumm/#\\1quest-n-click/#g". - A host of the Bridge, the connectors or the Studio Server installs the
quest-n-click-…archives and calls the new commands in its unit files and scripts.
The formats keep their names. They are identifiers inside files and stores, not the project's name: renaming them
would break existing saves, files and deployments. A save is still a web-scumm-save envelope, a session
web-scumm-session, a run a .wsrun file in the web-scumm-speedrun format, a Remix world web-scumm-remix-1; a
signal is still web-scumm-world-signal, a reality manifest web-scumm-reality-manifest; the browser keeps its
IndexedDB databases (web-scumm-saves, web-scumm-runs) and its web-scumm.… storage keys, so a player's saves and
runs are found where they were; the Bridge's X-Web-Scumm-* headers, the signatures' contexts, the environment
variables WEB_SCUMM_* and the Studio Server's tables are unchanged. Releases up to v4.2.4 keep their files' names and
their attestations, which name the repository wanoo/web-scumm; from v4.2.5 the attestations name
wanoo/quest-n-click (ship verify asks for the one each release was signed under). The sample game's and the
reference chapter's credits now say quest'n'click: their presentation fingerprint moved, so their reference run is
recorded again; a game's own fingerprint moves only if its own text changes.
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