Security & permissions

What protects you today, and what we're building next.

Today#

  • Magic-link auth — every dashboard session is gated by an email-link OTP (Resend mailer). Sessions are HttpOnly + Secure cookies.
  • AllowlistAUTH_ALLOWED_EMAILS on the API restricts who can request a magic link; non-allowlisted users see a waitlist message.
  • Machine auth — daemons enrol with a JWT and identify via WS bearer. Every session read is gated by m.user_id == u.user_id.
  • TLS — Traefik (Coolify) terminates Let's Encrypt certs for both app.controlum.pw and controlum.pw.
  • Harness permission flag--cu-mode dangerous per-harness; default is ask.

SSO via openbitum (preview)#

openbitum (the sister project) runs a Logto tenant at auth.openbitum.pw. We're wiring controlum as an OIDC client there so a single openbitum login also signs you into the controlum dashboard. Magic-link stays as the fallback for accounts not in the openbitum tenant.

Discovery confirmed: Logto exposes the standard config at /oidc/.well-known/openid-configuration; PKCE S256 supported; issuer https://auth.openbitum.pw/oidc. Implementation tracked in the M12 milestone.

Roadmap: policy engine#

The current dangerous flag is too coarse — sessions that drop it surrender ALL safety, including the safety we actually wanted. Coming:

  • Per-tool classification (filesystem, network, exec, credential) with risk levels.
  • Pattern-based command intercept: rm -rf /, curl … | sh, env-var exfil, sudo, ssh outbound.
  • User-defined policies: allow / require approval / deny per pattern, scoped by cwd or kind.
  • Audit log per session — every classified command + decision archived alongside the transcript.

Roadmap: ephemeral environments#

Long-term, every cu-launched session can optionally start inside a per-session Docker container that mounts only the chosen cwd. The harness blast-radius is bounded by the container; the policy engine remains as a second layer for what it's allowed to do inside.