/dashboard and has its own route at /dashboard/[viewName].
Create a view
Options
| Option | Type | Default | Description |
|---|---|---|---|
label | string | view name | Human-readable label shown on the view card |
cachedOnly | boolean | false | Only show sessions with complete cached results |
Chaining filters and aggregates
The view builder returns itself, so you can chain.filter() and .aggregate() calls:
Routing
| URL | Behavior |
|---|---|
/dashboard | If named views exist, shows a card grid of all views. If only default filters are registered, shows them directly. |
/dashboard/[viewName] | Specific view with its filters, sessions table, and aggregates. |
cachedOnly views
When cachedOnly: true, only sessions with complete cache entries appear in the view. Uncached sessions are skipped before any filter or log parsing runs - no eval execution, no log reads.
This makes cachedOnly views much faster for large session sets. Sessions appear as the background queue processes them.
Filter functions in cachedOnly views receive ctx.evalResults - a record of cached eval results. Use this to build per-eval score filters without re-running evals:
Default view (backward-compatible)
app.dashboard.filter() called directly (without a view) registers filters on the implicit "default" view. Default filters appear below the view cards on /dashboard.

