Auth modes
rvmc (the research workbench) runs in one of two authentication modes, set by
RVMC_AUTH_MODE. The mode decides who the workbench trusts and how much infrastructure you need
around it.
local — single-user self-host
RVMC_AUTH_MODE=local rvmc serve- One owner, no identity provider. No Authentik, no OIDC, no auth database.
- The keystone that makes rvmc fork-and-run: clone research-vm-controller, point it at libvirt + your golden storage, start it. Nothing else to stand up.
- Intended for a researcher on their own machine or a small institution running a single instance.
- Use this for the self-host quickstart.
forward — multi-tenant (default)
The hardened, production posture used at ZKM:
- The app trusts the edge: a reverse proxy (Traefik) enforces forward-auth against Authentik (OIDC), plus IP allowlisting where appropriate.
- The app itself carries no in-app login — every request is authenticated before it arrives.
- Projects are scoped to groups, so each user sees only their own project’s VMs and tools; the MCP
tool endpoints are scoped per project the same way. Access is granted via the project’s registry
groupsor the convention groupsproj-<pid>/proj-<pid>-admin— the convention groups count even when the registry’s stored list is empty, so membership in the Authentik group a provision creates is always enough. - Needs the surrounding infrastructure: Traefik + Authentik (and Authentik’s own Postgres/Redis).
This is the right mode for a shared, internet-reachable deployment with several users.
Choosing
local | forward | |
|---|---|---|
| Users | one owner | many, group-scoped |
| Identity provider | none | Authentik (OIDC) |
| Extra infra | none | Traefik + Authentik (+ its PG/Redis) |
| Reachability | your machine / LAN | internet, behind the edge |
| Setup effort | minimal | full stack |
Default is forward (safe for a public deployment). Switch to local deliberately for solo use.
The scoped-per-project MCP tool surface and the read-only token scope apply in forward; local
is a single trusted owner.
Note on the autopsy service
Autopsy runs as its own service and is typically reached by rvmc (or the CLI), not exposed directly to end users. When you expose its API, put it behind the same edge you use for rvmc.