Repository navigation
EN Studio Security
Français · Type: explanation + reference · Audience: author · Context: local Studio · Status: ready · Applies from: 4.2.1
The local Studio · contract: stable · verified by CI (support matrix of 4.4.0, 2026-10-23): Chromium end to end (the Studio's checks); Windows: the unit suite only · automated checks: jobs
e2e,windows; CI plane2e,windows; 2 test files · people's passes:studio-hero-matrixnot run (#238) · known limits:lan-is-not-public
The local Studio writes files on your machine and can call a model provider with your key. This page says what protects those routes, on your own machine and on your local network, and where the protection stops.
A dev server that writes files is a door into your machine. Three things could knock on it: another machine on the
network, a web page in your browser that tries to reach localhost (directly, or by rebinding its own name to your
machine, "DNS rebinding"), and a model provider address that would lead the Studio to a service of your private
network ("SSRF"). The Studio closes each one by default and opens only what you ask for.
-
Loopback by default.
npm run studioandnpm run devlisten on127.0.0.1(port 5173): another machine cannot reach their file-writing routes. -
Its own names only. Every Studio, asset, layout and assistant route answers only to the names of this machine
(
localhost,127.0.0.1,[::1]), and in LAN mode to the addressesstudio:lanserves. A page on another site that rebinds its name to your machine sends that name asHost: refused (403), even with a matchingOrigin. -
Same origin. A request that carries an
Originmust come from the Studio's own origin (403 otherwise). A write (anything but GET, HEAD and OPTIONS) without anOriginheader is refused (403): a script must send one. -
LAN mode, behind a token. To work from a phone,
npm run studio:lan(ornpm run dev:lan) listens on the network and prints a fresh capability token, drawn at each start (24 random bytes), unless you setWEB_SCUMM_STUDIO_TOKENyourself. Every Studio, asset, layout and assistant route then requires that token, as thex-web-scumm-tokenheader, the?token=parameter of the printed URL, or the cookie the URL sets (web_scumm_studio,HttpOnly,SameSite=Strict). The host names allowed are the machine's IPv4 network addresses (WEB_SCUMM_STUDIO_HOSTS, set by the command). - Never on the Internet. Do not expose the development port to the Internet: the token protects a session on your network, not a public server. To put a Studio online, use the hosted Studio (What runs where).
Guarantee ·
lan-token-same-origin· referenced · scope self-checked by the author (AI), not reviewed In LAN mode the Studio answers 401 to a request without the session's token, and 403 to a write whoseOriginis another site, even with the token.
Guarantee ·
own-names-only· referenced · scope self-checked by the author (AI), not reviewed AHostthat is not this machine (or an addressstudio:lanserves) is refused, even with a matchingOrigin.
- Keys stay in the browser tab (sessionStorage) and go with each request; the relay keeps a key in memory for that request only, never on disk, never in a log (The Assistant).
-
Addresses. Arbitrary provider URLs are disabled unless
WEB_SCUMM_ALLOW_CUSTOM_PROVIDER=1. Even then, private and link-local destinations stay blocked, except the explicit local Ollama preset, in both IP families: loopback (127.0.0.0/8,[::1]), unspecified (0.0.0.0,::), private (10/8,172.16/12,192.168/16,100.64/10,fc00::/7), link-local (169.254/16,fe80::/10), IPv4-mapped IPv6, and the nameslocalhost,*.localhost,*.local,*.internal. A custom provider must use HTTPS. - Calls. A provider call never follows a redirect, gives up after 60 s, and reads at most 8 MB of answer.
A game's TypeScript and its custom commands are trusted code, not sandboxed data: the Studio, the validator and the
solver run them on your machine. Open only games you trust, as you would any project you npm install. See
SECURITY.md.
Limit ·
lan-is-not-publicThe LAN token is a convenience for a phone on your own network: it is shown in the terminal and in the URL, and lives as long as the server. It is not an authentication for a public deployment.
- Listening on every interface by default: convenient for phones, but it would put the file-writing routes on every network the laptop joins. LAN mode is an explicit command.
- A password: a token drawn per session needs nothing to remember and dies with the server.
-
Allowing any provider URL: one setting away (
WEB_SCUMM_ALLOW_CUSTOM_PROVIDER=1), but a URL typed in a page must never reach your private network.
- A script that writes through the Studio's API must send an
Originheader matching the Studio, and in LAN mode the token. - A phone needs the URL with the token once; the cookie keeps it for the session.
- Sources:
tools/studio/security.ts,tools/serve-args.ts,tools/studio/assistant.ts,vite.config.ts. - The variables:
WEB_SCUMM_STUDIO_TOKEN,WEB_SCUMM_STUDIO_HOSTS,WEB_SCUMM_LAN,WEB_SCUMM_ALLOW_CUSTOM_PROVIDER. - When a route refuses: Studio troubleshooting.
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