Every /admin screen¶
This is the long-form walkthrough of every screen a platform admin will touch. The shorter pages under Operations → Platform Admin are quick reference cards; this is the tutorial. Read it once in order; afterwards use the anchor links to jump to the screen you need.
The screens are grouped two ways:
- The main
/admintabbed dashboard (eleven tabs) - The side surfaces (seven dedicated URLs that live at
/admin/...)
Each section follows the same shape: URL, purpose, controls visible, common tasks, what to watch for, and a link to the matching reference page.
The main /admin dashboard¶
/admin is a single page with eleven tabs across the top. The tab is encoded in the ?tab=... query parameter so URLs are linkable and bookmarkable.
Feature Flags¶
URL: /admin?tab=features (this is the default landing tab)
Reference: operations/platform-admin/features.md
This tab is the master kill-switch panel for product features. Above the flag list, the Frameworks section lets you choose the default new-project framework (covered next, also reached via this tab).
Controls visible
For every registered feature flag, you get a row with:
- Master toggle at the left: flips
enabledtrue/false (PATCH to the API). Off means the feature is invisible everywhere immediately. - Label and small mono
feature_keycode-pill so you can grep logs. - Description: one-liner explaining what the flag controls.
- Right-side pills:
Pro+/Business+shows the minimum plan;Admin+/Owner+shows the minimum workspace role. - Expand chevron: reveals two selects: Min Plan (None / Free / Pro / Business / Enterprise) and Min Role (None / Member / Admin / Owner).
Resolution at runtime: server-side featureFlagQueries(sql) looks up the row; the client useFeatureFlag(key) returns its current state. Most flags resolve in a single Postgres lookup.
Common tasks
- Toggle "Marketplace publishing" off platform-wide during an outage
- Restrict "Provider Bridge BYOK" to Pro+ workspaces
- Limit "Custom domains" to workspace owners only
- Walk the full list on a fresh install to make sure nothing is silently enabled
Watch for: the UI does not yet support adding or deleting flags. A new flag means a backend migration. Disabling a flag does not delete the data the feature wrote; turn it back on and the data is still there.
Frameworks¶
URL: /admin?tab=features (rendered above the flag list)
Reference: operations/platform-admin/frameworks.md
The Frameworks section manages the project-scaffold catalogue that powers the "Create Project" dialog.
Controls visible
- Per-framework row with icon (Atom for
vite-react, Globe fallback), name, category, "Default" pill when applicable - Set as default link on enabled non-default rows
- Enable / disable toggle
- Save →
PUT /admin/frameworkswith{ enabledFrameworks: string[], defaultFramework: string }
Common tasks
- Enable Next.js App Router projects platform-wide
- Switch the default from
vite-reacttonextjs-app - Disable a deprecated framework
Watch for: the UI will refuse to let you disable every framework. At least one must remain enabled. The default can only be set on an enabled framework. Disabling a framework hides it from the picker but does not break existing projects of that type.
DNS¶
URL: /admin?tab=dns
Reference: the first-time-setup DNS section; no separate ops stub yet
This tab is the Cloudflare wildcard automation panel. It uses KEK-encrypted CF API tokens stored in platform_settings.
Controls visible
- Mode toggle:
per_publishvswildcard. Thedefaultedflag indicates whether the active mode is inferred or admin-set. - Diagnostics card: zone name, plan, ACM status (
hasAcmboolean plusenabled / absent / undetectable), publish domain, recommended wildcard hostname, configured wildcard, existing wildcard record, fullallWildcardslist,canAutoSetupboolean plus areasonenum (ok,no-cf-creds,no-tunnel-id,no-publish-domain,free-plan-multilevel,zone-lookup-failed), and a humanmessage. - Custom wildcard input: must start with
*., lowercase a-z 0-9 dot hyphen, must be inside the zone. Optional Apply ACM override checkbox for paid ACM zones with multi-level wildcards. - Auto Setup button →
POST /admin/dns-mode/auto-wildcard, returns{ wildcardHostname, target, created, updated, acmOverrideApplied, diagnostics }. - Existing wildcards list: per-row hostname, target, proxied, modifiedOn. Trash button uses a two-step confirm (
confirmingDelete→deleting). - Cloudflare API token override: collapsible section showing
source(platform_settings/env/none), token suffix,hasSslScope,decryptFailed. Auto-expands when stored ciphertext can't be decrypted (KEK rotation). Paste a new token to write; trash button to delete.
Common tasks
- Confirm wildcard is healthy on a fresh server
- Rotate the Cloudflare API token (KEK-encrypted)
- Delete a stale wildcard CNAME left over from an earlier environment
- Force ACM override when running a paid zone with multi-level wildcards
Watch for: free Universal SSL only covers <zone> and *.<zone>. Multi-level wildcards like *.staging.doable.me need paid ACM. The dash-not-dot rule (staging-api.doable.me, not api.staging.doable.me) is enforced server-side in deployment/server-setup.sh. Do not flip it manually.
Signups¶
URL: /admin?tab=signups
Reference: operations/platform-admin/signups.md
This tab gates new registrations. If you do not approve signups manually, the only useful piece here is the blocked-email list.
Controls visible
Three cards, top to bottom.
Settings card
- Checkbox: "Require approval for new signups" (writes enabled)
- Textarea: "Message shown to pending signups" (max 2000 chars; writes pending_message)
- "Discard changes" link appears when dirty
- Save settings → PUT /admin/signups/config
Pending approvals card
- Count badge next to "Pending approvals"
- Refresh link
- Per-row: display name, email, provider badge (Email / GitHub / Google), signup time
- Per-row buttons: Approve (green) · Deny · Block (red)
- Approve → POST /admin/signups/:userId/approve (server-side ensureWorkspace creates the user's personal workspace)
- Deny → POST /admin/signups/:userId/deny
- Block → POST /admin/signups/:userId/block (denies and adds the email to blocked_signups so they cannot return via GitHub or Google either)
Recently denied card (shown only when non-empty) - Last 20 denied users with Approve to reverse
Blocked email addresses card
- Lists rows from signupApproval.listBlocked()
- Unblock trash button → DELETE /admin/signups/blocked/:email
Common tasks
- Turn signup approval on/off and customise the pending-screen message
- Approve a queued waitlist user
- Block a spam email permanently
- Unblock a previously-blocked email if you over-rotated
Watch for: Block is stronger than Deny. A denied user can sign up again; a blocked email cannot, even via a different OAuth provider. Use Deny by default and reach for Block only when you have evidence of abuse.
Users & AI¶
URL: /admin?tab=users
Reference: operations/platform-admin/users.md
The user management surface: the single most-used tab on the panel.
Controls visible (toolbar)
- Search field: filters by email or display name (
searchquery param onGET /admin/users) - Role filter dropdown
- Plan filter dropdown
- Bulk select checkbox column plus a bulk-apply popover (model, addQuota, role, plan)
- Add user button: opens the invite flow
Controls visible (per row)
- Avatar bubble (initial of display name / email)
- Display name + email; the
Crownicon marksis_platform_admin - Role select:
WORKSPACE_ROLES(owner, admin, member, …); writesPATCH /admin/users/:userId/role - Plan select:
WORKSPACE_PLANS(free, pro, team, enterprise); writesPATCH /admin/users/:userId/plan - Source badge: Copilot, Custom provider, or "WS default · …"
- Effective model badge: colour-coded by resolution source: enforced (red) → user (emerald) → workspace (blue) → none (grey)
- Credit mini bar: daily remaining / daily total; green ≥50%, amber ≥20%, red below
- Row click opens UserDetailModal
UserDetailModal
Two tabs.
- AI Model & Source: source toggle (Copilot / Custom), Copilot account select, Copilot model select (dynamic via
useCopilotModels), Provider select, Provider model select (dynamic viauseProviderModels, falls back toFALLBACK_MODELS). Save writesPUT /admin/users/:userId/ai-allocation. Reset to defaults doesDELETEon the same endpoint. - Credits: three numeric fields (daily, monthly, rollover) with server caps
CREDIT_CAPS = { daily: 100_000, monthly: 1_000_000, rollover: 1_000_000 }. Save and Save & Reset Usage buttons. WritesPATCH /admin/users/:userId/credits.
Common tasks
- Find a user and switch their plan to Pro
- Allocate a Copilot account plus model to a power user (the source account is cloned into their owned workspace with re-encrypted token via
cloneCopilotAccountToWorkspace()) - Give a user 5 000 extra rollover credits for the month
- Bulk-set 30 users to model
gpt-4o-miniand rolemember - Promote a user to platform
adminso you have a backup
Watch for:
- Self-protection: the API refuses to demote your own
is_platform_adminorplatform_role. The UI mirrors this, so you cannot accidentally lock yourself out. - Personal-scope provider rows are invisible to admins. You will only see workspace-scope rows in the source/model dropdowns.
- The list returns a flat snake_case array (
GET /admin/users). Do not wrap it. BUG-ADMIN-012 is the recorded reason at line 58 ofadmin-users.ts.
Integrations¶
URL: /admin?tab=integrations
Reference: operations/integrations-admin.md
This is where the platform pre-provisions OAuth apps so end users do not need to register their own. Phase 1 + 2A/2B is deployed; phases 2C/2D are deferred.
Controls visible
Integration list with search. Per integration:
- Source badge:
Platform app,Workspace app,Env-configured, orPersonal - Client ID display (truncated suffix or full)
- Add OAuth credentials form (
clientId,clientSecret, optionalextraConfigJSON,isGlobaltoggle) - Edit / Rotate / Delete actions
- Connect Test button: runs the OAuth handshake via the
enhanced-authroute
Backend behaviour:
GET /integrations/admin/oauth-apps?workspaceId=…returns the rowsPOST /integrations/admin/oauth-appscreates new entries; theisGlobal: trueflag requires platform admin and makes the app available to all workspacesclientSecretis encrypted at rest and never echoed back- Google integrations share
GOOGLE_INTEGRATIONS_CLIENT_ID/GOOGLE_INTEGRATIONS_CLIENT_SECRET(withGOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRETas fallback) - GitHub integrations share
GITHUB_CLIENT_ID/GITHUB_CLIENT_SECRET - Env-configured apps cannot be deleted from the UI; change them in
.envand restart
Common tasks
- Register a global Slack OAuth app so every workspace can connect
- Rotate Google client secret across all workspaces (delete + re-add)
- Restrict GitHub OAuth to per-workspace apps only (delete the global entry)
- Audit which integrations are env-backed vs DB-backed
- Verify a freshly-added OAuth app with Connect Test
Watch for: TBD in the research: the exact UI control for forcing personal-only on a per-integration basis is not yet documented. Treat platform vs personal as advisory until that surface ships.
Plans¶
URL: /admin?tab=plans
Reference: operations/platform-admin/plan-limits.md
Two sub-tabs in one card: Limits and Defaults.
Sub-tab: Plan Limits
Plans listed in PLAN_ORDER: Free, Pro, Business, Enterprise. (Note: not "Team".)
Per plan, an expandable card shows:
- Plan emoji, name, "CUSTOMIZED" amber pill if
isOverridden - Edit / Reset buttons (Reset only when overridden)
- Eight fields:
- Max Projects (number)
- Max Members (number)
- Daily Credits (number)
- Monthly Credits (number)
- Max File Size (MB; stored bytes, displayed KB/MB/GB)
- Custom Domains (toggle)
- Analytics (toggle)
- Priority Support (toggle)
- "Last updated" timestamp
Save writes PUT /admin/plan-limits/:plan with the full payload; Reset writes PUT /admin/plan-limits/:plan/reset to restore the PLAN_LIMITS defaults from @doable/shared.
Sub-tab: Plan Defaults (AI)
Sets the default model + provider per plan tier; new workspaces inherit it, and Apply to Existing backfills.
Per plan card:
- Plan emoji, name, sub-line summary ("Copilot · gpt-4o" or "No default configured")
- Configure button opens inline
PlanEditForm - Apply to Existing button (only when configured) →
POST /admin/platform-ai-defaults/apply-to-existingwith{ plan, overwrite } - Source toggle: None · GitHub Copilot · Custom Provider
- If Copilot: account select, model select (dynamic via
useCopilotModels) with "Type custom model ID" sentinel - If Custom: provider select, model select (dynamic via
useProviderModels) with the same custom sentinel - Save →
PUT /admin/platform-ai-defaults/:plan
Footer toggle: "Overwrite existing workspace AI settings when applying to existing" controls the overwrite flag on backfill.
Common tasks
- Set Pro to 1 000 daily credits, 30 000 monthly, 50 max projects
- Mark Custom Domains and Priority Support on for Business
- Reset Free back to hardcoded defaults
- Configure Pro plan default AI = Copilot account "acme-bot" + model "claude-sonnet-4"
- Backfill all existing Pro workspaces with the new default (overwrite off so nobody loses their override)
Watch for: the Apply to Existing + Overwrite combination is the only place where one button can change settings across every existing workspace at once. Read the footer toggle twice before clicking Apply.
AI Tools¶
URL: /admin?tab=tools
Reference: operations/platform-admin/tools.md
This tab controls which tools an AI mode is allowed to call. It is the platform-wide whitelist that gates Copilot and Provider runs.
Default mode catalogue (from modeToolQueries)
- Strategize (
plan): typically read-only / planning tools - Build (
build): full file create/edit + deploy tools - Custom modes can be added (lowercase alphanumeric /
_-)
Per-mode card
- Mode icon (purple Wrench for
plan, brand Wrench otherwise) - Mode label, code-pill, and "N tools" count
- Description (if set)
- Configure button enters edit mode
- Trash icon deletes the mode (allowed only if not
planorbuild; confirm dialog) - In view: pills showing currently allowed tools
- In edit:
- Doable tools grid (
KNOWN_TOOLS.category === "doable"):create_file,edit_file,read_file,list_files,install_package,deploy_preview,ask_clarification,create_plan,mark_step_complete,provision_supabase,request_integration,search_files - SDK tools grid (
category === "sdk"):view,grep,glob,ask_user,report_intent,bash,edit - Each tool toggles in/out of
editAllowedTools - Description textarea (max 500 chars)
- Save →
PUT /admin/tools/modes/:mode; Cancel exits edit mode
- Doable tools grid (
Adding a mode
- Add Mode reveals an inline form
- Input is normalised to
[a-z0-9_-]; the server validates with^[a-z][a-z0-9_-]{0,49}$ - POST/PUT creates an empty mode and auto-opens it for editing
Common tasks
- Disable
bashfor Strategize mode - Add a "review" mode that only allows
view,grep,glob - Strip
deploy_previewout of Build during a vendor outage - Delete a deprecated mode (falls back to hardcoded defaults)
Watch for: changes take effect on new sessions within 60 seconds. Mid-session sessions keep their existing tool list. The MCP server registry is TBD: there is no platform-wide MCP-server-add UI in this tab today. The CLAUDE.md note about MCP-apps compatibility refers to the surface that lives elsewhere in workspace AI settings.
MFA¶
URL: /admin?tab=mfa
Reference: User Guide → Two-Factor Auth; no dedicated ops stub yet
MFA v1 shipped 2026-05-12: TOTP plus recovery codes, opt-in only, admin reset only. The schema is extensible for WebAuthn and required-policy later.
Controls visible
- Info card explaining MFA is opt-in and user-controlled
- Header row: User · Enrolled · Last used · Recovery
- Per-row: display name + email, enrolled date, last-used date, "N left" recovery code count, Reset button
- Reset opens a confirm dialog that spells out exactly what will happen:
This will remove all MFA factors and recovery codes for this user, and sign them out of every active session. They will be able to sign in with just their password until they enroll again.
- The reset action calls
apiAdminResetUserMfa(userId)and audit-logsaction="mfa.reset"inadmin_audit_log
Common tasks
- See who has MFA enabled and when they last used it
- Reset MFA for a user who lost both their authenticator and recovery codes
- Audit MFA reset events via
/admin/audit/actions
Watch for: Reset is the only destructive action; you cannot enroll MFA on someone's behalf. You cannot enforce MFA platform-wide from this UI yet; that is TBD.
Thumbnails¶
URL: /admin?tab=thumbnails
Reference: operations/platform-admin/ops.md
Thumbnails are generated by Puppeteer; this tab is the operator's view into that pipeline. The panel comes from ThumbnailsPanel in admin-panels.tsx.
Controls visible
- Refresh thumbnail logs button
- Per-row table: project name, status (
ok/failed), preview URL, duration in ms, triggered_by, created_at, last error - Generate Missing Thumbnails button →
POST /admin/thumbnails/generate-missingruns in the background and returns the count
Common tasks
- Backfill missing thumbnails after a deploy
- Investigate a single project whose card is stuck on the placeholder
Watch for: Puppeteer needs Chrome dependencies. server-setup.sh installs them, but if you migrated the install manually, missing libs show up as failed rows here. Re-run the script's apt-get install block to fix.
Sessions¶
URL: /admin?tab=sessions
Reference: operations/platform-admin/ops.md
Live snapshot of the in-process Copilot engine pool. Panel comes from CopilotSessionsPanel in admin-panels.tsx.
Controls visible
- Live process snapshot: pool size out of max engines (20), heap used / total, RSS, uptime
- Engine list per project (project name + chat sessions)
- Per-engine Terminate button; Terminate all red button
Every terminate is audit-logged via recordAdminAction().
Common tasks
- Kill a stuck Copilot engine on a single project
- Inspect live RAM and engine count on the API process
- Terminate all engines after a vendor outage so they reconnect cleanly
Watch for: terminate-all is heavy-handed; every running chat goes away. Use it sparingly. If a single project misbehaves, terminate that engine only.
Email¶
URL: /admin?tab=email
Reference: operations/platform-admin/email.md
Manages outbound email: provider config, queue health, dead-letter handling.
Provider configuration card
- Provider type select: SMTP, Resend, Google (
ProviderType = "smtp" | "resend" | "google") - Common fields:
label,from_address - SMTP fields:
- Service dropdown:
SMTP_SERVICESincludes Gmail, SendGrid, Mailgun, SES, Zoho, Outlook365, Fastmail, Postmark, Mandrill, SparkPost, Yahoo, iCloud, AOL, Godaddy, 1und1, DynectEmail, Hotmail, QQ, QQex, 126, 163, plus Custom (manual SMTP) which exposes host + port inputs - User, Pass
- Service dropdown:
- Resend: single
apiKeyfield - Google: OAuth flow;
?gmail=connectedtriggers the success toast after callback - Buttons: Save (POST
/admin/email/config), Test email (POST/admin/email/test), Verify credentials, Delete provider
Queue stats card
- Counters: pending · processing · sent · failed · dead
- Refresh button → GET /admin/email/queue-stats
Queue browser - Paginated table of queue items (page, limit, total) - Columns: To, Subject, Status, Attempts (n/max), From, Template, Created, Sent, Next retry, Last error - Per-row: Preview (HTML + text body), Retry (RotateCcw icon), Delete (Trash2 icon)
Common tasks
- Hook up Gmail OAuth as the platform sender so signup-approval emails deliver
- Switch SMTP service from SendGrid to Resend
- Resend a failed welcome email
- Inspect the dead-letter queue and purge stale rows
Watch for: verify your sending domain has SPF/DKIM before broadcasting to large lists, or the whole batch ends up in failed. The queue browser is the only place to recover individual messages.
The side surfaces¶
Seven dedicated URLs that live outside the main tabbed page. Each has its own purpose, audience, and footprint.
/admin/audit¶
URL: /admin/audit
Sub-routes: /admin/audit/[sessionId] (single transcript), /admin/audit/actions (admin action log)
Reference: operations/audit-logs.md
The prompt-and-conversation audit. Header text reads: "Every search and view you perform is recorded for compliance." Read this guide carefully: every action you take here is itself audited.
Stats row (top of page)
AuditStats fields: total_sessions, total_messages, total_users, messages_24h, messages_7d, sessions_24h.
Search form
URL-param-driven; the form fields populate query params and the page reloads via the queryString-keyed effect. Searches include free-text queries against the conversation body.
Conversation table
Columns: session_id, project name + workspace name, user email / display name, mode (plan / build / custom), created_at, updated_at, last_message_at, message_count, last_user_excerpt (truncated), last_assistant_excerpt (truncated). Row click → /admin/audit/[sessionId] shows the full transcript.
/admin/audit/actions (admin action log)
Columns: timestamp, actor (id, email, role, name), action (enum), resource_type / id, target user / workspace / project, details JSON, client_ip, user_agent.
Filters:
- Actor ID (UUID input)
- Action dropdown with known events:
audit.conversations.searchaudit.conversation.viewaudit.messages.searchaudit.actions.searchaudit.stats.view
- From / To datetime-local pickers
Other writes that flow through recordAdminAction() are also visible: mfa.reset, sandbox edits, OAuth app changes, AI allocations, plan-limit edits.
Error states
- 404 → "Audit log is not yet enabled on this platform" (server feature gate not flipped)
- Other 5xx → "Audit endpoint is unavailable (HTTP n)" with Retry button
Common tasks
- Search every conversation containing "OpenAI API key" to find users pasting secrets
- Pull all sessions by a specific user in the last 24 hours
- Audit which platform admin viewed which session and when (compliance review)
- Verify nobody is abusing audit reads; every viewer is also recorded
Watch for: this is the most sensitive screen in the panel. Treat every search as a logged event. If your company has a compliance officer, plan a quarterly review of /admin/audit/actions.
/admin/chat¶
URL: /admin/chat
Reference: mirrors /admin/audit; see operations/audit-logs.md
A redacted, audit-logged view of all AI chat sessions. Functionally close to /admin/audit but with redaction tuned for daily ops viewing rather than compliance review.
Common tasks
- Spot-check what users are actually using AI for
- Find chat sessions that errored repeatedly so you can route a bug fix
Watch for: redaction is conservative. If you need the raw transcript, switch to /admin/audit, and accept that the access is logged.
/admin/dev-servers¶
URL: /admin/dev-servers
Reference: architecture/sandboxing.md
Live snapshot of all sandbox dev servers. Each preview running inside a project (vite, next dev) shows up here.
Controls visible (typical)
- Per-project row: project name, workspace, owner, sandbox PID, CPU, memory, uptime, last-active timestamp
- Per-row terminate / restart actions
On hardened servers, preview vite runs under bwrap --uid 9052. The dev-servers list is your window into that pool.
Common tasks
- Identify a runaway preview process eating memory
- Terminate a dev server before doing a server-wide restart
- Confirm a recently-published project has shed its dev server
Watch for: dev servers come and go on every save. A row that has been alive for hours when nobody is editing is unusual; investigate.
/admin/moderation¶
URL: /admin/moderation
Reference: User Guide → Marketplace
Moderation queue for marketplace submissions. Projects published as marketplace listings land here until a platform admin reviews them.
Controls visible (typical)
- Per-submission row: project name, author, submission timestamp, status
- Approve / Reject actions with a reason field
- Preview link to the submitted project
Common tasks
- Approve a marketplace listing
- Reject a submission with a reason (the author sees it)
- Investigate a flagged listing reported by users
Watch for: rejection reasons are user-visible. Be specific and respectful; these are creators with skin in the game.
/admin/projects¶
URL: /admin/projects
Reference: user-guide/overview.md
A flat list of every project across every workspace. Useful when you need to find a project by name without knowing whose workspace it lives in.
Controls visible (typical)
- Search by project name
- Filter by workspace, owner, plan, status
- Per-row: name, workspace, owner, last updated, framework, published-or-not
- Row click → opens the project in the editor (you appear as a platform-admin viewer)
Common tasks
- Locate a project a user is asking about on Discord without knowing their workspace
- Spot orphaned projects after a workspace owner leaves
- Audit which workspaces have the most projects on the Free plan (capacity planning)
Watch for: opening a project here grants you read access via platform admin, and your viewing is visible to the owner. Behave accordingly.
/admin/runtime¶
URL: /admin/runtime
Reference: operations/platform-admin/ops.md
Cross-workspace listing of published apps and dev servers with live cgroup metrics. Backed by GET /admin/runtime/instances which joins project_runtime with project, workspace, owner, and live metrics.
Controls visible
- Table of runtime instances with CPU, memory, uptime, owner workspace, owner user
- Filter by kind (published / dev), status, workspace
- Per-row terminate / restart
Common tasks
- Identify the published app that just spiked memory
- Confirm uptime across the fleet before a deploy
- Locate the workspace that owns a noisy preview
Watch for: terminating a published app takes the site offline until the next request restarts it. Restart is usually safer than terminate.
/admin/trace¶
URL: /admin/trace
Sub-routes: /admin/trace/[traceId]
Reference: the trace tooling overview; the project memory note for the OMC trace tool applies in spirit
X-Ray / OpenTelemetry trace search. Per CLAUDE.md: "USE TRACING/XRAY INFRASTRUCTURE AVAILABLE FOR IDENTIFYING ISSUES OR BUGS WHEN YOU HAVE TO. DO NOT GUESS BY SEEING CODE." This is where that infrastructure lives in the UI.
Controls visible
- Search by trace ID, user ID, project ID, timestamp range, status code, error class
- Per-row trace summary with duration, top span, error count
- Click into a trace → flame graph + per-span detail
Common tasks
- Reproduce a user's bug from their trace ID
- Find the slowest endpoint in the last hour
- Investigate an error class spike during an incident
Watch for: traces contain user-supplied text: prompts, errors, file paths. They are sensitive. Always zap root causes through traces rather than working around bugs. Treat the trace UI like the audit UI: use it, and assume you are observed.
Where to read next¶
- New to the panel? Loop back to First-time setup.
- Need a one-line refresher on a single screen? See Operations → Platform Admin.
- Working on AI configuration? AI → Provider Bridge explains the BYOK vs Bridge trade-off in depth.
- Working on integrations? operations/integrations-admin.md covers the OAuth app vault.
- Worried about logs and compliance? operations/audit-logs.md is the canonical audit doc.