Repository navigation
EN Team What Runs Where
Français · Type: explanation · Audience: author, admin · Context: hosted Studio · Status: ready · Applies from: 4.2.1
The Studio Server (hosted team Studio) · contract: experimental · verified by CI (support matrix of 4.4.0, 2026-10-23): Postgres, S3 and Keycloak in CI; Chromium and Firefox (job studio-hosted); WebKit on macOS, by hand only · automated checks: jobs
studio-hosted,studio-install-smoke; CI planstudioHosted; 3 test files · people's passes:studio-hostednot run (#149),studio-collabnot run (#150),studio-previewnot run (#166),studio-assets-hostednot run (#167),studio-mcp-remotenot run (#196),studio-oidc-genericnot run (#197) · known limits:hosted-only
The team Studio, or Studio Server, puts one game's Studio online for a small team. This page shows its parts, where each runs, what each holds, and why it is cut that way.
The Studio Server puts a game's Studio online for a small team. Everyone logs in through an OpenID Connect provider
(Keycloak or another), works on the same game at the same time, and sees every change as it lands. It is the work of
the 4.2.x line (plan docs/dev/PLAN-4.2.1-4.2.3-STUDIO-SERVER.md).
Alone on your machine you do not need any of this: npm run studio stays as it was (see
The local Studio).
What the hosted Studio brings, by version:
- 4.2.1: the journal (no confirmed change is lost), logins and roles, the processing worker, spans and leases, the live stream.
- 4.2.2: the game on its own origin with one preview per revision, the health by revision, personal undo, published builds, assets prepared on the worker, backup and restore, and the Studio's screens for all of this.
- 4.2.3: the Assets tab's uploads and the cutting of sheets, Prepare and the cuts as jobs you can follow and cancel, the revision each editor read, the scenario map, comments, the diff, the remote MCP, Git, the engine's upgrade, metrics and the daily backup.
Deploying it is documented for Clever Cloud, from the repository or from the release archive
quest-n-click-studio-server (the same server): see Clever Cloud: overview and
First deployment.
browsers ─HTTPS─▶ studio (Node app, one instance) ──signed jobs──▶ studio-worker (Node app, no secrets)
CLI, MCP ─Bearer─┘ │ public_url: the Studio and /api ▲ presigned snapshot and result
│ play_url: the game (another origin) │
├──▶ PostgreSQL: journal, members, sessions, leases
├──▶ Cellar (S3): the files' contents, the worker's snapshots ─┘
└──▶ OpenID provider: who people are (never what they may do)
In words:
-
Browsers reach the
studioapp over HTTPS with a session cookie. The CLI and MCP clients reach it with a Bearer access token. -
studiois one Node.js instance. On its public URL (publicUrl) it serves the Studio's page and/api. On a second origin (playUrl) it serves the game: the previews and the published builds. - PostgreSQL holds the journal, the members, the sessions and the leases.
- Cellar (an S3 store) holds the files' contents and the snapshots the worker reads.
-
studio-workeris a second Node.js app. It receives jobs signed bystudio, reads the snapshot and writes its result through presigned URLs, and holds no secret. - The OpenID provider says who people are. What they may do is decided in the Studio (see Roles and actions).
- The game's files live in PostgreSQL and Cellar. Postgres says which version of each file is current, Cellar holds the contents. The app's disk is only a cache: Clever Cloud's disk does not survive a restart, and nothing is lost when it goes. The instance that serves writes checks its folder against the head every 30 seconds and repairs it without a restart.
-
The game's code never runs in the Studio. A game is TypeScript: reading or validating it means running it. So
validation, reads of the game module, previews, builds, lint, the solver and playtests go to
studio-worker, which holds no password, key or database access (ADR 0028). -
The game is played on another origin (
playUrl). Its code cannot act with a member's Studio session: the Studio's cookie never goes there, and no Studio API answers there. - The provider gives identity only. Roles, invitations and the audit live in the Studio's database (ADR 0027).
- One writer per project. Every change is a transaction in a journal, every file belongs to one span, and one instance at a time serves writes, under a service lease in PostgreSQL (ADR 0025). The words are explained in Concepts.
-
Running the game's code in the Studio's process, or in a child of it: a child runs as the same system user and
can read the parent's environment, so a
devcould have read every secret (ADR 0028). - Rights managed in the provider (groups): the maintainer chose the Studio on 17 October 2026 (ADR 0027).
- A private workspace per person, merged later: rejected by the maintainer on 17 October 2026 (ADR 0025). The team works on one live copy, with explicit locks.
- A WebSocket channel: Server-Sent Events plus an HTTP read by cursor are enough until a measurement says otherwise (ADR 0025, P7).
- One game per instance, and one instance serving writes at a time: a second instance waits for the lease.
- Every job costs a round trip to the worker; previews and checks are not instant (see Known limits).
- Members are trusted: a
devstill runs code on the worker machine, under the asset tools' user (ADR 0028).
Limit ·
hosted-onlyEverything on this page is the hosted Studio (the Studio Server). The local Studio,npm run studio, has one person, no worker, no second origin and no login.
- ADR 0025: one shared game, edited live
- ADR 0026: saves across revisions
- ADR 0027: OIDC for who, the Studio for what
- ADR 0028: a worker without secrets
- ADR 0029: the remote MCP
- Decisions D39 to D47 in
docs/dev/DECISIONS.md.
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