Repository navigation
EN Team Invitations
Français · Type: how-to · Audience: 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:invitation-no-revoke
Nobody is a member of a team Studio by default: an invitation makes one. This page says how an owner invites someone, how the first owner gets in, and what an invitation can and cannot do.
A one-time link for one email address and one role. When that person opens it and logs in with that email, verified by the identity provider, they become a member with that role.
A hosted Studio (the Studio Server) with an OpenID Connect provider, from 4.2.1. The local Studio has no members and no invitations.
- An owner, to invite from the Studio or the API; or a shell on the server's machine, for the first owner.
- The person has an account at the provider, with a verified email address: the invitation checks the email the provider says is verified, never one typed by hand.
- In the Studio: your name in the header, then Members… (owners only).
- Through the API: from any machine, with an owner's Bearer token.
- The first owner: on the machine of the
studioapp, where the server's configuration is (on Clever Cloud, inclever ssh), in the engine repository's folder.
-
The first owner comes from the command line, since nobody can invite yet:
# on the studio app's machine, in the engine repository (on Clever Cloud: clever ssh, then cd "$APP_HOME") npm run studio-server -- invite --email you@example.fr --role ownerIt prints the link. The configuration comes from
--config <file>or fromSTUDIO_CONFIG_JSON, which the shell ofclever sshalready has. From the release archive the command isnpx quest-n-click-studio-server invite --email you@example.fr --role owner --config studio.config.json.
-
Any other member, in the Studio: Members…, then the Invite form. Type the email (verified at the provider), choose the role (
owner,devorreviewer;devis preselected), and click Create the invitation link. The link appears with a Copy button.Through the API, as an owner:
# anywhere, with an owner's token curl -X POST -H "Authorization: Bearer $TOKEN" -H "content-type: application/json" \ -d '{"email": "lea@example.org", "role": "dev"}' https://studio.example.fr/api/invitations
It answers
{"link": "https://studio.example.fr/auth/login?invite=…", "expiresInDays": 7}.
- Send the link yourself (the Studio sends no email): by chat, by mail. It is shown once; only its hash is stored.
- The person opens the link and logs in at the provider with that email. On the way back they are a member with the invited role. See Starting as an invited dev.
- In Members…, the person is listed with their role; the invitation leaves "Invitations not used yet".
- The audit log shows
invited(who invited whom, with which role), thenjoined as <role>(invitation-accepted). - As them,
GET /auth/meanswers their role.
- 7 days, then it no longer works.
- Used once. A second use, by anyone, does nothing.
- For one verified email. The email the provider gives must be the invited one (compared without case), and the provider must say it is verified.
- It gives the role it names. Accepting an invitation replaces the role the person had, except that the last owner cannot lose the owner role this way.
- A refused invitation does not stop the login: the person is logged in but not a member, and sees the page "Access
not granted", "Ask an owner of the project for an invitation." The audit log records
invitation-refusedwith the reason (the invitation is not valid,the invitation is for another verified email, orthe last owner stays an owner).
Guarantee ·
invitation-once-verified-email· referenced · scope self-checked by the author (AI), not reviewed An invitation is used once, and only by a person whose verified email is the one it names.
Limit ·
invitation-no-revokeA pending invitation cannot be withdrawn: there is no route, in the Studio or the API, to cancel it. It expires after 7 days. If a link leaked, wait it out, or remove the person once they joined (see Managing members). There is no command to list invitations either, other thanGET /api/members(itsinvitations: email, role, expiry) and the Members panel.
| Symptom | Cause | Fix |
|---|---|---|
| The person logs in and sees "Access not granted" | The invitation expired, was used, or their verified email differs | The audit log says which (invitation-refused, reason). Invite again with the email the provider has |
`email` is required (400) |
The address is empty or malformed | Give a full address |
`role` is owner, dev or reviewer (400) |
Another role name | Use one of the three |
usage: studio-server invite --email <email> --role <owner|dev|reviewer> --config <file> (exit 2) |
A flag missing, or a flag where a value belongs | Give both flags with values |
this login has expired or was already used: start again (400) |
The login page was left open more than 10 minutes, or reloaded | Open the invitation link again |
A row in the database (studio_invitations: the email, the role, the hash of the token, its expiry), then a member
row when it is accepted; two audit lines. No game file.
A wrong role is changed in Members… (see Managing members). A person who should not have joined is removed there.
- Roles and actions, Managing members.
-
studio-server/src/server/auth/store.ts(invite,accept). - ADR 0027.
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