Raxx · internal docs

internal · gated ↑ index

ADR 0012 — Console WebAuthn: Separate RP ID (console.raxx.app)

Status: Accepted (2026-04-22) Date: 2026-04-22 Deciders: user + software-architect Scope: WebAuthn RP ID for the operator admin console (console.raxx.app), separate from the user-facing web + iOS apps (which share raxx.app per ADR 0005).

Context

Raxx's user-facing surfaces (web at raxx.app, iOS companion app) share the WebAuthn RP ID raxx.app per ADR 0005 — passkeys registered by a user on the web auto-work on iOS via iCloud Keychain, no re-registration.

The operator admin console (console.raxx.app) is a separate application serving a distinct population: staff / operators with elevated permissions (RBAC roles superadmin, ops, support, readonly). Admin identities are NOT the same as end-user identities, even when a single person (e.g., the founder) holds both.

The decision: should the console share raxx.app as its RP ID (inheriting user-app passkeys with server-side admin-lookup rejecting non-admin credentials at login), or use a separate RP ID?

An earlier framing on 2026-04-22 leaned toward shared RP with RBAC as the gate. This ADR records the final, reversed decision: separate.

Decision

Use console.raxx.app as the RP ID for the admin console. Passkeys registered at the console live under a different origin-scoped credential pool than passkeys registered at raxx.app. Cross-contamination between user and admin credentials is prevented at the browser layer, not just at the server-side admin-lookup layer.

Configuration:

Consequences

Positive

Negative / costs

Neutral

Alternatives considered

Share raxx.app RP ID across web + iOS + console, rely on server-side admin-lookup

Briefly leaned toward on 2026-04-22, then reversed. Reasons rejected:

Use a non-subdomain RP ID (e.g., raxx-console.com)

Rejected. Keeping console under the same apex (raxx.app subdomain) preserves the brand + DNS + TLS ops story. A separate-domain RP ID adds operational cost without security benefit over a subdomain RP ID.

Same RP ID but different "user verification" requirements for admins

Rejected. WebAuthn user-verification modifiers don't partition credentials by role; they're per-assertion flags. Not a substitute for origin isolation.

Compliance checklist

Revisit when

Implementation notes