Skip to content

The Dashboard

keel dashboard launches a full-screen terminal UI that reflects live AWS state — real ECS, RDS, ElastiCache, ALB, CloudWatch, and SSM data, refreshed automatically. It never fabricates health: unauthenticated, not-deployed, and error conditions are surfaced as honest banners rather than shown as green, and a metric CloudWatch has no data for reads as "no data" rather than as zero.

Only the reads the visible tab needs are refreshed, and a read that has not come back yet is not re-issued, so a slow account does not turn into a pile of concurrent requests.

Tabs

KeyTabShows
1DashboardPer-service cards (responsive 1–3 column grid): task counts, live CPU/memory gauges and sparklines against the autoscaling target, last-deploy age. The routed web service's card shows its public URL. An activity panel above the cards reports everything in flight — an infra apply with resource counts, a deploy with its phase, each ECS rollout by the new task set's progress, and resources mid-change — and renders nothing when the environment is idle
2ServicesThe same live service data as a table
3LogsCloudWatch log viewer with search, per-service filtering and follow/pause
4DeploysDeployment history, the current deploy lock, and rollback. A history whose environment has been destroyed is labelled as such rather than hidden
5InfraPending infrastructure changes as a navigable plan diff, and apply — the apply streams into the tab with per-resource progress, bound to the exact plan that was displayed
6ResourcesManaged infra with live status, or the topology diagram (t)
7ConfigConfiguration variables from SSM (keys/type/version only — values hidden)
8TeamThe roster joined with each member's MFA enrollment state, and whether MFA is enforced per role

The tab bar abbreviates itself on a narrow terminal rather than dropping tabs off the right edge. The whole UI is mouse-aware — tabs, cards, tables, the environment pill, and modals can all be clicked, and the routed web service's URL row opens in your browser.

An environment has at most one public URL: the routed web service, shown as https://<domain> when a domain is configured (the ALB DNS name presents the wrong certificate) or http://<alb-dns> otherwise. Workers deliberately get no URL row — a URL beside a worker would be a lie about what is reachable.

Keybindings

KeyAction
18Switch tabs
/ or k/jNavigate the active list
enterOpen the actions menu (Dashboard/Services, or a member on Team)
ctrl+kCommand palette — run any keel command
/Search logs (Logs tab)
fFollow / pause the log tail (Logs tab)
nFilter logs to the next service (Logs tab)
p / APlan / apply infrastructure changes (Infra tab, admin)
tToggle the topology diagram (Resources tab)
oOpen the selected row's URL in a browser (when it has one)
a / dSet / unset a config variable (Config tab, developer)
rRefresh now
eEnvironments — a picker showing each environment's region and account, which can also add a new environment to keel.yml
sSettings overlay (toggle verbose / cautious)
?Help overlay
escBack / close a panel
q or ctrl+cQuit

The help overlay is rendered from the bindings themselves, so it cannot describe a key the dashboard does not have.

The command palette

ctrl+k opens a searchable list of every command in the CLI. It is built from the real command tree, so a command added to keel appears here without anything else changing.

Choosing one opens its command line, prefilled with the arguments it takes and with its flags listed alongside, so you can see exactly what will run — and learn the CLI equivalent of what the dashboard just did. Commands your access level cannot run are shown with the reason rather than hidden.

Commands that need a terminal (exec, run -i, auth setup, anything that prompts) hand the screen over and give it back when they finish. Everything else runs as a child process whose output streams into the dashboard, so you keep your place.

The Team tab

keel auth team list and keel auth mfa status each answer half of the question "who has access, and has it actually been secured". The tab is the join: one row per member with their role, whether they still have access, and their MFA state — enrolled, awaiting enrolment, or holding access with no device at all.

The line above the roster is the one that matters most: whether MFA is required to assume each Keel role. With enforcement off, every member's access key is sufficient on its own and no amount of enrolment changes that.

A member holding more than one MFA device is called out in red. An IAM user may hold up to eight, and a second device is what it looks like when someone with a copy of the access key enrolled their own.

The roster itself is readable by anyone (it lives in DynamoDB); enrolment state needs IAM reads only an admin holds, so a non-admin sees the roster and is told which half is missing rather than shown a blank column. Members Keel did not provision are marked unmanaged and have no enrolment state to report — Keel never modifies an IAM user it did not create.

Press enter on a member for the actions that apply to them: activate someone who has enrolled, change their role, reset a lost device, or revoke access. An action that does not apply is shown with the reason rather than hidden. All of them hand over to the CLI, because team add and team reenroll print a secret access key exactly once and most of them confirm before acting.

Service actions

Press enter on a service to open the actions menu:

  • Details — a drill-down with running tasks, utilization, and — when a service is short of tasks — why: the container reason from its stopped tasks, its failed task count, and recent ECS service events. This is what turns "0/3 running" into "CannotPullContainerError: manifest not found".
  • Scale — change the desired task count (ECS UpdateService).
  • Restart — force a new ECS deployment.
  • Deploy — run keel deploy <service> with chosen flags.
  • Rollback — preview the revision it would return to, the image that revision runs, and whether that image still exists in ECR, then apply it.
  • Exec — open an interactive shell in a running task.

Mutating actions require Developer access; read-only users see them disabled. Infrastructure plan and apply require Admin, and apply asks you to type apply after showing what would be destroyed.

Keel — the AWS CLI you've always wanted.