TUI Dashboard
The real-time terminal dashboard, its panels and keybindings, the structured audit-log viewer, and the admin-gated actions.
beekeeper dashboard opens a real-time terminal UI (Bubble Tea, full-screen)
that surfaces everything Beekeeper is doing: live alerts, the decision audit
log, catalog freshness, quarantine, scans, and the policy and first-responder
editors. It reads real backends, never mock data; an empty log shows an honest
"monitoring" line rather than invented counts.
beekeeper dashboardbeekeeper dashboard --adminThe dashboard is read-only by default. Pass --admin to unlock the editing
and destructive actions (policy edits, first-responder settings edits, and
quarantine restore/purge). Everything else, including the audit-log viewer,
alerts, catalogs, and scans, is available without --admin.
Layout
The base screen is deliberately calm. The chrome shows:
- Health pips for the five subsystems: Hooks, Gateway, Sentry, Catalogs, and LlamaFirewall, plus the time of the last block. Health is probed from real backends and fails safe: anything Beekeeper cannot reach reads as degraded, not healthy.
- A status line summarizing today's real audit activity (distinct agents
seen, blocks, and critical alerts), or
monitoring · press : to actwhen the log is empty. - The incident card region, which stays empty until Sentry escalates (see Incident escalation).
- A keybinding footer.
Global keys
From the base screen:
| Key | Action |
|---|---|
: | Open the command palette (run any panel or action) |
g | Go-to menu (the palette, pre-filtered) |
! | Jump straight to the Alerts panel |
p | Open the Policy editor (--admin to edit) |
s | Open First-responder settings (--admin to edit) |
? | Help and keybindings (shows the running version) |
esc | Close the open overlay |
q or ctrl+c | Quit |
The in-app help (?) lists a curated subset. The Audit log, Catalogs,
Quarantine, and Scan panels do not have a dedicated single key: open them from
the command palette (:).
Command palette
Press : to open the palette, type to filter, enter to run, esc to cancel.
The palette is the "do anything" entry point and reaches every panel:
| Command | Opens |
|---|---|
alerts | Alerts panel |
audit tail | Audit-log viewer |
catalogs | Catalogs panel |
policy edit | Policy editor |
settings | First-responder settings |
quarantine | Quarantine panel |
scan now | Scan (deep) |
scan --quick | Scan (quick) |
scan history | Past scan results |
help | Help panel |
protect install | Prints a reminder to run beekeeper protect install in a terminal (the dashboard cannot elevate itself) |
quit | Exit |
Panels
Every panel opens as a centered overlay over the dimmed base screen. esc
always closes the current overlay.
Audit log (the structured decision viewer)
Open it from the palette (: then audit tail). Rather than dumping raw NDJSON,
this viewer renders one color-coded row per record, newest first, seeded from the
recent log tail and then appended live (deduplicated by record id, the most
recent 200 kept). Each row shows the time, a decision badge, the subject
(package, command, process, or tool), and the reason.
Badges: ALLOW (green), WARN (amber), BLOCK (red), ALERT (Sentry, red),
POSTURE (teal, a posture override), LLMF, CONFIG, and a generic EVENT.
| Key | Action |
|---|---|
↑ / ↓ (or k / j) | Select a record |
enter / → / l | Open the decision-logic detail |
← / h / backspace | Back from detail to the list |
f | Toggle the enforced-only filter |
esc | Close |
The enforced-only filter (f) hides routine allows and shows only enforcement
events: blocks, warns, Sentry alerts, quarantines, and non-clean LlamaFirewall
scans. Install-posture warns surface here too, since posture warns are advisory
rather than blocking.
The detail view is the point of the viewer: it shows the full decision logic for one record, rendering only the fields that are present:
- decision, reason, surface (
check, gateway, or Sentry), agent, and tool - the rule IDs that fired
- corroboration: how many sources agreed, and exactly which sources agreed and dissented
- each catalog match: source, ecosystem, package, version, severity, and whether the source was signed or unsigned
- posture override: the action (
allow_once,allow_always,enforce_block,enforce_warn), the package, ecosystem, and rule it scopes to, and the reason - Sentry evidence: rule name and severity, the process and pid, the parent process chain, files accessed, network destinations, and any correlated extension
- LlamaFirewall result (scan kind, verdict, confidence)
- multi-agent lineage (agent id and chain), cluster id, and ruleset version
Safe by construction. Audit fields can carry attacker-influenced content (package names, commands, paths). Every record-derived string is sanitized before it reaches the terminal, and the viewer renders only the already-redacted on-disk fields. It never re-reads or un-redacts the source data.
The same log is queryable and exportable from the CLI; see Audit Log.
Alerts
Open with !, or : then alerts, or d from a live incident card. This is the
live security feed built from audit records (Sentry rule hits and policy
block/warn decisions), rendered as badge-coded rows.
| Key | Action |
|---|---|
↑ / ↓ | Select an alert |
enter | Inspect (expand the parent chain, files accessed, and network destinations) |
| type | Filter the feed |
q / Q | Send the selected item to quarantine |
esc | Clear the filter, or close |
Catalogs
Open with : then catalogs. Shows per-source freshness pips and age for the
threat-intel sources (Bumblebee, OSV, Socket, and beekeeper-self).
| Key | Action |
|---|---|
s | Sync all sources now (runs a real sync; a toast reports synced, unchanged, or failed) |
i | Cycle the background sync schedule and persist it to config |
esc | Close |
Policy editor
Open with p, or : then policy edit. Loads or seeds the managed policy file
and shows the corroboration thresholds and the allowlist/blocklist rules
(package_allowlist, sensitive_path). Editing requires --admin.
| Key | Action |
|---|---|
↑ / ↓ | Select a row |
+ / - | Adjust a corroboration threshold |
a | Add a rule |
d / x | Delete the selected rule |
enter / type | Enter a value |
esc | Cancel an entry, or close |
Edits are validated before they persist to disk. A rejected edit surfaces why and leaves the on-disk policy file unchanged.
First-responder settings
Open with s, or : then settings. Edits the auto_quarantine and corpus
config knobs without hand-editing JSON (see Configuration).
Editing requires --admin.
| Key | Action |
|---|---|
↑ / ↓ | Select a row |
space | Toggle a boolean (enabled, dry_run) |
+ / - (or l / h) | Adjust an integer (threshold, downstream_clean_days) |
esc | Close |
An out-of-range value (for example an auto_quarantine threshold outside 1..3) is
rejected before it is written. The panel validates and writes config.json for
you.
Quarantine
Open with : then quarantine. Lists quarantined items backed by the same store
as the CLI beekeeper quarantine command. Restore and purge require --admin.
| Key | Action |
|---|---|
↑ / ↓ | Select an item |
enter | Show details |
r | Restore the selected item (admin) |
p | Purge the selected item (admin; requires a y / Y confirmation) |
esc | Close |
Scan
Open with : then scan now, scan --quick, or scan history. Runs the
dependency and extension scanner asynchronously with a progress animation, then
shows the discovered packages, findings, and past scan results. esc closes.
Help
Open with ?, or : then help. A static keybinding and concept reference that
also shows the running Beekeeper version.
Incident escalation
Calm mode stays quiet by design. When Sentry emits a critical alert, the base screen escalates on its own and renders an incident card built from the real record: a description, the actual process tree, and an action set.
| Key | Action |
|---|---|
← / → / ↑ / ↓ | Move the action selection |
enter | Run the selected action |
a | Acknowledge the incident |
d | Open the full Alerts panel (without resolving the incident) |
Acknowledging is not containment. The dashboard has no in-process quarantine or kill primitive, so acknowledging clears the banner and tells you to review the alert log and remediate through the CLI (and rotate any exposed credentials). Containment of extensions lives in the unprivileged watch/scan layer, not in the dashboard.