Appearance
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
| Key | Tab | Shows |
|---|---|---|
1 | Dashboard | Per-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 |
2 | Services | The same live service data as a table |
3 | Logs | CloudWatch log viewer with search, per-service filtering and follow/pause |
4 | Deploys | Deployment history, the current deploy lock, and rollback. A history whose environment has been destroyed is labelled as such rather than hidden |
5 | Infra | Pending 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 |
6 | Resources | Managed infra with live status, or the topology diagram (t) |
7 | Config | Configuration variables from SSM (keys/type/version only — values hidden) |
8 | Team | The 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
| Key | Action |
|---|---|
1–8 | Switch tabs |
↑/↓ or k/j | Navigate the active list |
enter | Open the actions menu (Dashboard/Services, or a member on Team) |
ctrl+k | Command palette — run any keel command |
/ | Search logs (Logs tab) |
f | Follow / pause the log tail (Logs tab) |
n | Filter logs to the next service (Logs tab) |
p / A | Plan / apply infrastructure changes (Infra tab, admin) |
t | Toggle the topology diagram (Resources tab) |
o | Open the selected row's URL in a browser (when it has one) |
a / d | Set / unset a config variable (Config tab, developer) |
r | Refresh now |
e | Environments — a picker showing each environment's region and account, which can also add a new environment to keel.yml |
s | Settings overlay (toggle verbose / cautious) |
? | Help overlay |
esc | Back / close a panel |
q or ctrl+c | Quit |
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.