Admin console

One binary. The console is already inside it.

There is no second service to deploy and no dashboard hosted somewhere else holding your credentials. The console is a static export embedded in the binary at build time and served at /admin by the same process that talks to Slack.

Overview

This month$6.41 / $20.00

1,284

turns

3,910

tool calls

216

documents

48

memories

ChannelCost
#eng-oncall$0.0021
#support$0.0014
#eng-oncall$0.1840
DM · Mei$0.0009
#people-ops$0.0011
Built from the same design tokens the console ships with. Figures are illustrative.

Ten pages

Everything it may do, and everything it did.

Overview
Spend this month against budget, turns, tool calls, documents, memories, routines.
Slack
Scopes — the workspace and every channel — with instructions, default model, auto-respond, budget, whether members may edit their own Configure page, and what is attached.
Access bundles
Bundles, connections, credential-less domains, skills, setup links and MCP sign-in. The Connect dialog carries presets, a live test, a curl preview, secret rotation and copy-to-another-bundle.
Documents
Upload, edit plain-text documents in place, scope a document to one channel, reindex.
Memory
List, add and delete what it remembers, per channel.
Routines
List, edit, run now, enable, disable, delete.
Jobs
Fix jobs handed to the worker: status, pull request, cost, brief, events, diff and log — and cancel a running one.
Artifacts
Files it made in threads: open in Slack, download, delete. Downloads always serve an attachment and never render.
Activity
Recent turns, tool calls and proxied requests, with CSV export.
Settings
Models, budget, limits, behaviour, allow rules, the fix worker, and users.

Signing in

Three ways in, in order of setup effort.

A username and password from the environment, for the first five minutes. A bearer token, for curl and CI — every route the console uses lives under /api/ and is usable directly. Sign in with Slack, which is what you actually want.

There is no user list to maintain for the common case: whoever Slack says is an admin or owner of the workspace the bot is installed in gets in. An email-domain requirement can be layered on top. Everybody else needs an invite — single-use, seven days, and only its hash is stored.

Sessions are opaque tokens in an HttpOnly cookie. A refused sign-in — a member rather than an admin, the wrong workspace, the wrong email domain — lands back on the login card with the reason rather than a generic failure.

Choosing models

Every model field is a live list of what your endpoint serves.

Model fields are searchable dropdowns fetched from your configured endpoint’s own model list, cached for ten minutes. On OpenRouter each entry shows the display name, the context window and the price per million tokens, so choosing a model is a decision made with the number in front of you. A plain OpenAI-style endpoint shows ids. An id the list does not carry can still be typed in.

Timezone fields work the same way, over the browser’s own IANA zone list, showing each zone’s current UTC offset.

The Configure page

A page for the channel, not for the admin.

Every channel reply ends with a small context line, and Configure in it opens a member-facing page for that channel: what the bot may reach there, what is pre-approved, whether it answers without being mentioned, and which model it uses.

Members can edit it, unless an admin locks that scope. It is the answer to the question every channel eventually asks — “what can this thing actually see?” — without anybody needing a console account to find out.

Have a look at the real one.

A demo is a screen share of the console with your own workspace in it, not a slide deck about it.