Admin Panel

{data.users.length} registered user{data.users.length !== 1 ? 's' : ''} {#if data.actorIsRootAdmin} ROOT ADMIN {/if}

{#if actionError}

{actionError}

{/if} {#if actionSuccess}

{actionSuccess}

{/if}
Avatar User ELO W/L Role
{#each data.users as u} {@const badge = roleBadge[u.role] ?? roleBadge.player} {@const isProtected = u.isRootAdmin} {@const canChangeRole = !isProtected && (data.actorIsRootAdmin || u.role !== 'admin')}
{#if u.image} {:else}
{u.name.charAt(0).toUpperCase()}
{/if}

{u.name}

{#if u.isRootAdmin} ROOT {/if}

{u.email}

{u.elo} {u.wins}W / {u.losses}L {#if canChangeRole}
{ actionError = ''; return async ({ result }) => { if ( result.type === 'failure' || (result.type === 'success' && (result.data as any)?.error) ) { actionError = (result.data as any)?.error ?? 'Failed to update role'; } }; }} class="flex items-center gap-2" >
{:else} {badge.label} {/if}
{/each}

Tools

{data.stats.activeMatches} active match{data.stats.activeMatches !== 1 ? 'es' : ''} {data.stats.queueSize} in queue {data.stats.pendingInvites} pending invite{data.stats.pendingInvites !== 1 ? 's' : ''}
{#each [ { action: 'cancelAllMatches', label: 'Cancel All Matches', confirm: 'Cancel all active matches and clear the queue?', color: 'border-yellow-500/30 text-yellow-400 hover:bg-yellow-500/10' }, { action: 'clearQueue', label: 'Clear Queue', confirm: 'Remove everyone from the queue?', color: 'border-border text-text-secondary hover:bg-surface-700' }, { action: 'expireInvites', label: 'Expire All Invites', confirm: 'Expire all pending invites?', color: 'border-border text-text-secondary hover:bg-surface-700' }, { action: 'clearNotifications', label: 'Clear Notifications', confirm: 'Delete all notifications?', color: 'border-border text-text-secondary hover:bg-surface-700' }, { action: 'resetRatings', label: 'Re-seed Ratings from osu!', confirm: 'Fetch all osu! ranks and re-seed ELO ratings? W/L records will be reset. Unranked players get 10M rank. This cannot be undone.', color: 'border-red-500/30 text-red-400 hover:bg-red-500/10' }, { action: 'clearMatchHistory', label: 'Clear All Match Data', confirm: 'Delete ALL matches, scores, invites, and notifications? This cannot be undone.', color: 'border-red-500/30 text-red-400 hover:bg-red-500/10' }, ] as tool}
{ actionError = ''; actionSuccess = ''; return async ({ result, update }) => { if (result.type === 'success' && (result.data as any)?.message) { actionSuccess = (result.data as any).message; await update(); } else if (result.type === 'success' && (result.data as any)?.error) { actionError = (result.data as any).error; } }; }} >
{/each}

Permission Levels

Player Create account, join queue, create/manage own mappools and teams
Referee All player permissions + manage any match, force start games
Admin Full access + manage all mappools/teams + promote players to referee
{#if data.actorIsRootAdmin}
Root Admin Can promote/demote admins. Set via ROOT_ADMIN_EMAIL env var. Cannot be demoted.
{/if}