Files
terdut-tui/README.md
T
Niklas Ye 4740687b96
Release / test (push) Failing after 6s
Release / build (amd64, darwin) (push) Has been skipped
Release / build (amd64, linux) (push) Has been skipped
Release / build (arm64, darwin) (push) Has been skipped
Release / build (arm64, linux) (push) Has been skipped
Release / release (push) Has been skipped
feat!: stats as a section instead of an overlay
Stats was the one full-screen view reached by a key of its own rather
than by tab, and the interface was less coherent for it. It is now a
section sitting third, after Alerts, and behaves like every other one:
tab in, tab out, r to refresh.

Three things fall out of the move. It auto-refreshes for the first time
— the tick handler skips every non-dashboard mode, which is why the
overlay never updated while it was open. Its error path no longer forces
the queue back into view on a failed fetch, an assumption that only made
sense while stats floated above the dashboard. And first-visit loading
keys off a statsLoaded flag rather than slice emptiness, because the
three empty slices a quiet server returns are a real answer, not a
missing one; the loading placeholder is likewise suppressed once
something has been drawn, so a background refresh cannot blank the page
out from under whoever is reading it.

The S key is gone, and with it the ability to peek at statistics from an
open incident and land back on it. That round-trip was the only thing
statsReturnMode bought, and it was the whole reason stats needed a mode.
2026-08-06 12:46:38 +02:00

3.9 KiB

terdut-tui

A terminal user interface for terdut-server. Communicates with the server over its REST API.

Written in Go using Bubbletea.

Features

  • Incident queue — open incidents with severity, status, assignee and age, auto-refreshing
  • Incident actions — acknowledge, assign, snooze, note, resolve and archive
  • Timeline — the full history of an incident, system events and notes together
  • Alert feed — the raw read-only alerts underneath, each linked to its incident
  • On-call schedule — visual calendar of who is on duty, assign and remove entries
  • Statistics — MTTA and MTTR, plus alert frequency by name, hour and day
  • User management — add and remove users, manage API keys

Requires terdut-server v0.4.0 or later. Earlier servers have no incidents API; use terdut-tui v0.3.x with those.

Alerts and incidents

The server keeps two objects and this client follows that split:

  • An alert is Alertmanager's record — firing or resolved, and read-only here.
  • An incident is the work item. It is what you acknowledge, assign, snooze, discuss and resolve, and it is where all the actions live.

Incidents are correlated by the groupKey Alertmanager already computed from your group_by configuration, so several alerts commonly share one incident.

Two behaviours worth knowing before you press a key:

  • Resolving is final. The server treats a manual resolve as terminal: a later occurrence opens a new incident rather than reopening this one, and if the alert underneath never stops firing the incident stays closed. The TUI asks for confirmation before doing it.
  • Snooze is the "not now" button. It hides an incident from the default queue without closing it, and expires on its own.

Installation

Download the latest release binary for your platform from the releases page, or build from source:

go install github.com/yeniklas/terdut-tui@latest

Configuration

Create ~/.config/terdut-tui/config.yaml:

server_url: https://terdut.example.com
api_key: <your-api-key>
refresh_interval: 30  # seconds, optional

The API key is generated in terdut-server. See the server documentation for how to bootstrap a user and issue an API key.

Usage

terdut-tui                 start the TUI
terdut-tui --version       print version
terdut-tui --self-update   update to the latest release

Keybindings

Global:

Key Action
j / ↓ Move down
k / ↑ Move up
tab / shift+tab Next / previous section
enter Open detail
esc Go back
r Refresh
f Cycle filter
q Quit

The sections, in tab order: Incidents · Alerts · Stats · Archived · Schedule · Users.

Incidents section:

Key Action
f Cycle: open → triggered → acknowledged → resolved → snoozed
x Archive (resolved incidents only)

Incident detail:

Key Action
a / A Acknowledge / clear acknowledgement
R Resolve — asks to confirm, and is final
s Assign to a user
z / Z Snooze for a duration / un-snooze
c Add a note
[ / ] Select a note
d Delete the selected note (your own only)
x Archive / un-archive

Alerts section (read-only):

Key Action
f Cycle: firing → resolved → all → archived
i In detail: jump to the alert's incident

Stats section:

Key Action
j / k, pgup / pgdn Scroll

Schedule section:

Key Action
+ / W Assign a day / a whole week
d Remove the assignment
← / → Shift the week window

Users section:

Key Action
n Create a user
d Delete a user
k API keys for the selected user