The admin dashboard is gated by the same session token the Flutter
client uses. You can also paste an
Your user id must be listed in
X-Dev-User-Id value
if the server has DEV_AUTH_ENABLED=true — prefix it
with dev: (e.g. dev:42).Your user id must be listed in
ADMIN_USER_IDS in the
server's env. Otherwise every request will return 403.
Server
Memory
Storage
Active rooms (0)
Users (0)
Licenses edits admin-granted seats; "+N bought" seats come from the user's Stripe subscription and are managed there. Admins marked "env" are listed in ADMIN_USER_IDS and can only be changed in the server env. Click a user id to copy it. Delete / ban — coming soon.
Top users by storage
Per-user sizes charge each user the full size of every song they reference, so shared songs count once per user — these rows can sum to more than the dedup'd total in the Storage panel (Overview).
License pools (0)
Each pool owner, how many of their licenses are in use, who they share with, and the rooms drawing on their pool right now. A room license = the right to keep one room open at a time. Use "+ share" to lend a pool to someone on the owner's behalf, or ✕ on a chip to take it back — removing a share leaves rooms they already opened running until closed. To change seat counts, edit Licenses on the Users tab.
Pending license grants (0)
Grant seats to an email before they sign in — applied to the new account on first sign-in, then cleared. If the address already has an account, the seats are applied to it right away instead (a queued grant only fires at first sign-in, so it would never reach them).
Maintenance
Finds cover art for uploaded tracks that have none — first by their artist/title tags, then by acoustic fingerprint — and stores it once per file so every client gets it. Runs in the background across all users; safe to leave the page. Re-running retries files that came up empty before.
Detects BPM for tracks that have none. Uploaded files are analyzed locally; streaming tracks (YouTube / Apple / Spotify) are resolved to their YouTube audio and analyzed — that one's slower and bandwidth-heavy, so it runs on a serial queue in the background. BPM fills in live; safe to leave the page. Re-running retries tracks that came up empty before.
This same backfill runs automatically on server startup for anything not yet attempted — these buttons are for an immediate, retry-everything pass.
Re-derives every Stripe-linked user's purchased seats from Stripe itself — the on-demand version of the periodic reconcile pass. Use it after a missed webhook, or when a purchase or cancellation didn't show up here. Safe to re-run: it only ever writes what Stripe reports, and an API error leaves that user untouched rather than revoking seats.
Voice intent requests (0)
Saved whenever voice AI needs a missing tool, lacks confidence, or cannot map a user request safely.
Client crashes (0)
Uncaught errors reported by client apps. One row per distinct bug — a crash that re-throws every frame until restart is counted, not repeated, so "×40000 · 1 user" is one studio's session and "×3 · 3 users" is a bug in the wild. Click a row to see the stack. Marking a bug fixed reopens it automatically if it recurs.