Repository navigation
EN Team Members
Français · How-to + reference · Published, reviewed by a person · Applies from: 4.2.1
An owner of a team Studio lists the members, changes a role, removes someone, ends someone's sessions, and reads the audit log. This page gives each action in the Studio and through the API, the routes as the code has them, and what cannot be done.
Audience, context, and the statuses of what this page rests on
Audience: admin · Context: hosted Studio
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:audit-no-paging
The team you want, with the rights you want: who is a member, with which role, and a record of who did what.
A hosted Studio (the Studio Server) with an OpenID Connect provider, from 4.2.1. Every action here is an owner's. The
routes are in studio-server/src/server/auth/routes.ts and
auth/store.ts; the panel is
src/studio/members.ts.
- The
ownerrole (see Roles and actions). - For the API: an owner's access token (
npm run studio-server -- token --server <url>, see The server's command line).
- In the Studio: your name in the header, then Members…. The panel shows the members (person, role, active sessions, whether they are here now), the Invite form, the invitations not used yet, and the 30 latest lines of the audit log.
- Through the API: from any machine, with an owner's token, against the Studio's public URL.
- There is no command-line subcommand for these actions: the server's CLI only has
invite(see Invitations).
-
List the members. Open Members…, or call
GET /api/members(see below).
-
Change a role. In the member's row, choose the new role in the list and confirm ("Make Léa reviewer?"). Or
PUT /api/members/<id>with{"role": "reviewer"}(see below).
-
Log someone out everywhere. Click End sessions and confirm. They stay a member and can log in again. Or
DELETE /api/members/<id>/sessions(see below).
-
Remove a member. Click Remove and confirm ("Their access ends at their next request."). Or
DELETE /api/members/<id>(see below). To come back they need a new invitation.
-
Read the audit log, at the bottom of the panel, or
GET /api/audit(see below).
# anywhere, with an owner's token
curl -H "Authorization: Bearer $TOKEN" https://studio.example.fr/api/members{
"members": [{ "id": "…", "email": "lea@example.org", "name": "Léa", "role": "dev", "sessions": 1 }],
"invitations": [{ "email": "sam@example.org", "role": "reviewer", "expiresAt": 1761300000000 }]
}-
members: every member, sorted by email;idis the Studio's user id (the one the other routes take);sessionscounts the browser sessions not yet expired (a Bearer token is not a session). -
invitations: those not used and not expired;expiresAtin milliseconds since 1970.
PUT /api/members/<id> with the JSON body {"role": "owner" | "dev" | "reviewer"}. Answers {"ok": true}.
- The new role applies at the person's next request.
- It counts as a revocation: their live streams close (within 5 s) and reopen with the new role, their page starts again, and every lease they held is released at once.
- The audit log records
member-rolewith the target and the new role.
-
The last owner stays an owner: demoting the only owner is refused with 409
the last owner stays an owner. To hand the project over, make the other person an owner first, then demote yourself. - An owner may demote themselves when another owner remains (the Studio asks "This is you.").
- Another role name: 400
`role` is owner, dev or reviewer. An unknown id: 404no such member.
Ends every browser session of the member and refuses every access token issued before now. Their live streams close
within 5 s and their leases are released. They stay a member: they can log in again at once, and the CLI can get a new
token from its refresh token. Use it after a lost laptop, together with a password change at the provider. The audit
log records sessions-revoked.
- The membership is deleted, every session of the person ends, and every access token issued before now is refused.
- Their access ends at their next request, through the browser, the CLI or the MCP; their live streams close within 5 s; their leases and their presence go at once, so nobody waits on a span they can no longer release.
- Their past operations stay in the journal under their name, and their comments stay.
- The audit log records
member-removed.
-
The last owner cannot be removed (409
the last owner stays an owner). - To come back, the person needs a new invitation.
Guarantee ·
owner-last-owner-and-removal· referenced · executed on47dccf1b4b15· scope reviewed The last owner cannot be demoted (409), and a member removed loses access at their next request, session and earlier access tokens alike.
The last owner cannot be removed either: the same check answers 409.
The Studio checks each browser session with the provider every 5 minutes. When the provider disables an account, its sessions end at the next check, within 15 minutes (R). A back-channel logout from the provider ends the named sessions at once. While the provider cannot be reached for more than 15 minutes, sessions are suspended (503) until it answers again. Removing someone in the Studio is immediate; disabling them at the provider is the way to stop them on every service at once. See ADR 0027.
# anywhere, with an owner's token
curl -H "Authorization: Bearer $TOKEN" https://studio.example.fr/api/audit{"entries": [{"at", "actor", "event", "detail"}]}, the 200 most recent entries, newest first. at is in
milliseconds since 1970; actor is the Studio's user id of who acted, null when nobody did (the provider, a refused
callback), or studio-server invite for an invitation made from the command line.
event |
When | detail |
|---|---|---|
login |
someone logged in through the browser, member or not | {} |
logout |
someone logged out | {} |
login-failed |
the provider's answer was refused at the callback | {reason} |
backchannel-logout |
the provider ended sessions | {sid, sub, users} |
invited |
an invitation was made | {email, role} |
invitation-accepted |
someone joined | {role} |
invitation-refused |
an invitation could not be used | {reason} |
member-role |
a role changed | {userId, role} |
member-removed |
a member was removed | {userId, role: null} |
sessions-revoked |
an owner ended someone's sessions | {userId} |
lease-takeover |
an owner took a span over | {span, previous} |
The Members panel shows the 30 latest, in words ("Léa removed Tom").
Limit ·
audit-no-pagingThe API gives the 200 latest entries only, with no filter, no paging and no export. The server never deletes audit lines: they stay in thestudio_audittable and in every backup. To read more, query the database read-only, for instanceSELECT at, actor, event, detail FROM studio_audit ORDER BY at DESCwithpsqlon the database's URI. Writes to the game are not in the audit: they are in the journal, by author (GET /api/ops).
- No command-line subcommand lists, demotes or removes members, or reads the audit: the API or the Studio only.
- No pending invitation can be withdrawn (Invitations).
- No transfer in one step: promote, then demote.
- No member can be added without them logging in: membership always comes from an invitation accepted with a verified email.
- No suspension that keeps the membership: "End sessions" logs out, but the person can log in again; to stop them, remove them, or disable them at the provider.
The Members panel shows the change, and its line appears in the audit log. A removed person who tries again gets 401 (their session is gone), then "Access not granted" after logging in.
| Symptom | Cause | Fix |
|---|---|---|
409 the last owner stays an owner
|
You demote or remove the only owner | Make someone else owner first |
404 no such member
|
The id is not a member (already removed?) |
GET /api/members for the ids |
403 this needs the role owner
|
Your role is not owner | Ask an owner |
401 on /api/members with a token |
The token is expired or was revoked | Get a new one: npm run studio-server -- token --server <url>
|
Rows of studio_members, studio_sessions and studio_users (revoked_before) in the database, and one audit line
per action. No game file.
A role changed by mistake is changed back. A removal cannot be undone: invite the person again. Losing every owner is not possible through these routes; if the owner's account is lost at the provider, see Recovering admin access.
- Roles and actions, Invitations.
- ADR 0027: identity, revocation within R = 15 min.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.5.4 r2, documentation revision · révision de la documentation 63112c877c587cc4fad16b25a3400408db2c36bd.
Latest documentation · dernière documentation: https://quest-n-click.cleverapps.io/docs · https://quest-n-click.cleverapps.io/fr/docs; earlier versions · versions précédentes: each release's quest-n-click-docs-<version>.tar.gz · l'archive quest-n-click-docs-<version>.tar.gz de chaque release, https://github.com/Quest-n-Click/quest-n-click/releases
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 (18)
- Requirements
- Install from the release archive
- Install from npm
- 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.5
- 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