InfrastructureInfrastructure Plugins

Dash

Map Better Auth Dash concepts to Kernia admin, analytics, and audit APIs.

Dash in Better Auth is an infrastructure plugin that connects an auth instance to hosted dashboard APIs, analytics, audit events, and activity tracking. Kernia does not ship that hosted Better Auth Infrastructure service. The Kernia equivalent is a self-hosted dashboard built from the admin, admin-config, API key, organization, SSO, SCIM, Stripe, hook, and audit-log surfaces.

Use this page when you want the same operational shape as Dash without claiming a managed Kernia Dash service exists.

Installation

Install the packages that expose the data your dashboard needs:

uv add kernia kernia-fastapi kernia-api-key kernia-stripe kernia-sso kernia-scim

Then enable the admin-facing plugins in your auth instance:

auth.py
from kernia import KerniaOptions
from kernia.auth import init
from kernia.plugins.admin import admin
from kernia.plugins.admin_config import admin_config
from kernia.plugins.api_key import api_key
from kernia.plugins.organization import organization
from kernia_stripe import stripe

auth = init(KerniaOptions(
    database=adapter,
    secret=env.KERNIA_SECRET,
    base_url=env.KERNIA_BASE_URL,
    plugins=[
        admin(),
        admin_config(),
        organization(),
        api_key(),
        stripe(),
    ],
))

What Dash maps to

Better Auth Dash areaKernia equivalent
User managementAdmin plugin user routes.
Session monitoringSession management routes and admin session list.
Organization managementOrganization, SSO, and SCIM plugin routes.
Activity trackingHooks that write last_active_at or audit events.
Event historyApplication audit log table or event sink.
Hosted dashboard APIYour FastAPI admin backend.
Analytics graphsQueries over users, sessions, organizations, and audit events.

Activity tracking

Dash updates activity fields at a configured interval. Kernia should do this explicitly in your app, because the write rate depends on traffic and database size.

activity.py
from datetime import datetime, timezone

async def mark_session_active(ctx):
    session = ctx.session
    if session is None:
        return

    await ctx.adapter.update("session", session.id, {
        "last_active_at": datetime.now(timezone.utc),
    })

Wire that hook only for routes where activity matters. For high traffic apps, write at most once every few minutes per session.

Dashboard endpoints

A Kernia dashboard should read the same classes of data as Dash:

AreaRoute family
Users/admin/users, /admin/user, /admin/user/ban, /admin/user/unban
Sessions/admin/sessions, /admin/session/revoke, /admin/sessions/revoke-all
Auth methods/admin/config/auth-methods
Email clients/admin/config/email-clients
Organizations/organization/*, /admin/organizations
SSO and SCIM/sso/*, /scim/*
API keys/api-key/*
Billing/stripe/*, /billing/*

Schema changes

The Dash concept usually needs these application-owned fields or tables:

ModelFields
sessionlast_active_at, ip_address, user_agent
audit_eventid, actor_id, event, subject_type, subject_id, metadata, created_at
admin_configpersisted login, email, provider, and billing settings

Examples

The FastAPI SaaS demo should use this pattern:

admin_routes.py
from fastapi import APIRouter, Depends
from kernia_fastapi import require_session

router = APIRouter(prefix="/api/admin")

@router.get("/overview")
async def overview(session=Depends(require_session)):
    await require_admin(session)
    return {
        "users": await count_users(),
        "active_sessions": await count_active_sessions(),
        "pending_webhooks": await count_pending_webhooks(),
    }

Troubleshooting

  • If dashboard numbers differ from production, check whether background workers and webhooks write to the same database.
  • If admin routes are visible to normal users, fix backend authorization first. Hiding navigation is not access control.
  • If activity writes create too much load, throttle updates by session and move aggregation to a worker.