app.prod-orm.io) has a page for everything the CLI's klock| Where | What |
|---|---|
web/src/consoles/basic/security/* | Account security (#/security) |
web/src/consoles/basic/auth/{CliLogin,Pair,Recovery}.tsx | CLI sign-in, pairing, lock-out recovery |
web/src/consoles/team/* | The team page's security tabs |
web/src/consoles/basic/database/access-rules/* | The database page's Access rules tab |
web/src/consoles/team/TeamBillingPanel.tsx | The team's billing account |
web/src/consoles/admin/{AdminUserDetail,AdminKlock,MfaRequired}.tsx | Staff views, and the E3 MFA prompt |
#/security?tab=<tab> has these tabs:| Tab | Shows and does | CLI equivalent |
|---|---|---|
| Sessions | Every kind of session (browser, CLI, CLI token, trusted device, service, MCP client, staff), filtered by kind or live only. Each row shows its device, subject, check-in deadline, step-up time, frozen reason, limits and capabilities. Sign out; freeze (klock kinds, optional reason); unfreeze (asks for a TOTP code, or the password on an account without MFA). Sign out everywhere else ends your other person sessions and keeps service sessions (database hosts, CI, agents); sign those out one by one, or see below. Its CLI tokens card mints explicit personal tokens for --token / PRORM_TOKEN (CI, scripts); it sends purpose: "token", which E3 still allows, for 30 days at most. Key rotation is CLI-only. | prorm sessions |
| Devices | Your devices with their key store (file-held keys are flagged as weaker), last sync and country, and state. Rename, suspend or reinstate, wipe (best effort, at the next sync), revoke. Pair a device opens #/pair. A row opens #/security/devices/:id: details, credentials, the sessions on the device and its audit trail. | prorm devices |
| Two-factor | TOTP enrolment, and removal, which asks for the password and a code from the authenticator app or a recovery code (see below). Admin accounts need a confirmed factor from E3. | prorm security mfa enable, prorm security mfa disable |
| Access rules | Account-scope rules, with report-only and enforced badges and expiry. A 409 would_lock_you_out offers "save anyway" behind a step-up. Test this request evaluates your rules in the browser, with the same engine as the API, against the request context the API reports or an IP and country you type. It is a preview; the API decides. | prorm access |
| Behaviour | Findings (acknowledge, or show acknowledged ones), profiles (edit, remove), and adding a profile from a preset with a JSON editor. New profiles start in report mode, and saving may ask for a step-up. The API validates profiles; the console does not. | prorm behaviour |
| MCP clients | Delegated tokens: capabilities, database lock, last use, expiry. Create one with a capability picker (only delegable capabilities you hold; quick picks "Docs only", "Read my data", "Read and write data"), for 1, 7 or 30 days, optionally locked to one database. The token is shown once, with MCP settings JSON ready to paste. At most 5 are live; a sixth replaces the least recently used. | prorm mcp clients |
| Capabilities | GET /me/capabilities: tier, session kind and binding, plan, team role, staff scopes, capabilities by group, dormant capabilities, each team's role capabilities, and limits by session kind. A Step up now card. | prorm whoami --caps, prorm step-up |
| Audit log | The account's audit trail. | prorm security audit |
| Danger zone | Emergency lockdown: type LOCKDOWN, optionally include service sessions, step up. It signs this browser out too. Release is here as well. | prorm lockdown |
DELETE /security/sessions) spares serviceincludeServices:DELETE /security/mfa) needs the currentprorm security mfa disable ask for both:$ prorm security mfa disable
Current password:
Code from the app, or a recovery code (empty if never confirmed): 492 017
✓ Two-factor is off.401 with { "mfaRequired": true }.429.POST /me/emails/:id/verify, and /resend for a new code). A code expires429 withRetry-After. Only a verified address reserves the address, can become thePUT /me. It answers202 with emailVerification (pending: true), leaves the login address asPOST /me/emails are only confirmed, never promoted; make one thePUT /me/emails/:id/primary once it is verified.[!NOTE]
These are control-plane changes onfeat/klock-capabilities(API3930e9d,
and7386d41for thePUT /meflow;
PRORM-SA-2026-024). No
address that existed before was marked verified, so confirm yours with
resend, then verify. Password sign-in is not affected. Earlier
builds of the fix neededPUT /me/emails/:id/primaryafter the code, and
the202carriedpromoteAt; neither is needed now.
domains admit nobody until each is proved with a DNS TXTPOST /sso/link from a session that passed password and MFA, or, automatically,https at a public host; the400#/cli: CLI sign-in. prorm login opens it with the port, state,KXQ 7M2), and you must tick "My terminalkind=device asks "Trust this device?" and a step-up. The127.0.0.1. When the API offers no v2, the consoleprorm login --legacy. Under E3 the API410 login_v2_required, and the page showsprorm and run prorm login again, or to mint a token under#/pair: approve a pairing. Signed in, enter the code thatprorm login --pair shows on the new device (KXQ7-M2PD), or open the#/pair?p=…&c=… link from its QR code, and approve it as a trusted device#/recover: lock-out recovery. Public. Enter your email; the link it$ prorm login
Confirm code: KXQ7M2 (the console shows the same code — approve only if they match)
Sign in in the browser to connect this CLI:
https://app.prod-orm.io/#/cli?port=53127&state=…&host=ada-mbp&v=2&dpk=…&spk=…&sb=…&cc=KXQ7M2
✓ Signed in as ada (ada@example.com) on this device (dev_Q4M8…).
klock v2 interactive session · key in the macOS Keychain · ~/.prorm/klock/default.klock
Check in by 28/09/2026, 11:00:00; the session ends 28/10/2026, 10:00:00.KXQ 7M2. What happens between[!CAUTION]
Approve only a code that your own terminal shows. Never approve a
sign-in or pairing code that someone read out, emailed or messaged to you:
that is how a device key on their machine gets a session on your account.
$ prorm login --pair
Pairing code: KXQ7-M2PD
On a signed-in device: prorm devices approve KXQ7-M2PD (or the console, Security → Devices)The pairing was not approved
in time.#/pair), type KXQ7-M2PD or✓ Signed in as …. The device then appears in#/recover ("Locked out by an access rule?") and enter your email. Therecovery: pending review.recovery: pending review keep reporting until you#/teams/:id?tab=<tab>) adds these tabs:| Tab | Shows and does | Needs |
|---|---|---|
| Resources | Everything reached through the team, and Create in this team. A resource created here is owned and billed by the team, counts against the team's plan, and survives its creator leaving. | resource:provision on the team to create |
| Devices | Members' devices and their sessions in the team context. Revoking needs a reason, and the member is emailed. A step_up_required answer asks for a TOTP code (or password) and retries. | device:manage-members, session:manage-members |
| Access | Team access rules, mandatory by default, so members cannot widen them. Every member can read them. | access-rule:team to write |
| Behaviour | Team behaviour profiles, from a preset or JSON; report mode by default. | behaviour:team to write |
| Billing | The team's own billing account (TeamBillingPanel): see below. | billing:read to see, billing:manage to change |
| Card | Shows and does |
|---|---|
| Plan | The plan and subscription, the monthly estimate and pool use. Before the team pays: Start paying (Stripe Checkout, with an optional membership). After: Change plan (free, usage, membership; it says "pending" until Stripe confirms) and Stripe portal. |
| Who pays | The billing contact, picked from members whose role can read billing; empty means the owner. |
| Transfer billing | Team transfers are charged to the team's card, not the member's. |
| Payment methods | The team's cards: add one (a Stripe-hosted page), make one the default, remove one. |
| This month | The lines the team's next invoice will have for its own resources. |
| Invoices | Every invoice Stripe has raised on the team's account. |
billing:read (owner, admin, billing) see the tab; onlyowner and billing can change anything. On a deployment with no Stripe503. Against an API without the team billing routes, the tabwould_lock_you_out offers "save anyway" behind a step-up. Addresses in theblockedIps list with no matching block rule appear as read-onlyallowedIps) is shown beside the rulessupport scope, a staff member can revoke a session, or revoke or wipealert.403 mfa_required. The staff console shows/security/mfa/* routes are the account's own). Try again reloads theprorm security mfa enable.#/admin/klock, scopes support or users), read-only:/.well-known/klock-configuration), the keyset501, 405, not_implemented or its catch-all 404, and "X is not503 (for example klock_unconfigured when the API has no401 step_up_required does not sign you out: the