keikiban

August 21, 2026 ยท View on GitHub

A PostgreSQL dashboard that stays up when the database does not.

keikiban showing database load by wait event under a pgbench workload

When something is wrong at 3am, browsing a schema is not what I need. I need to know which query is eating the server, who is blocking whom, and whether that index nobody scanned in six months is worth its gigabyte.

What it shows

Database load over time, the way RDS Performance Insights draws it: average active sessions stacked by wait event, sliced by SQL, user, host, application, or database. Sampled once a second from pg_stat_activity while the app is open. No agent on the server, no extension required.

Top SQL, ranked by its share of that load, each statement broken down by what it waited on. With pg_stat_statements installed it also carries calls/s, rows/call and ms/call. Without it the ranking still works, and a yellow badge says what installing it would add.

Blocking, live: who holds the lock, who waits on it, the SQL on both sides, the lock mode, and how long the wait has been going. Chains are detected, so the middle link is labelled instead of being mistaken for the culprit.

Sessions, with cancel and terminate. Index health: unused, duplicate and invalid indexes, sequential-scan offenders, cache hit ratios. Maintenance: transaction ID wraparound, dead rows, long-running transactions, sequences approaching overflow.

Every destructive action shows the exact statement first, and lets you copy it and run it somewhere else instead.

Install

Requires PostgreSQL 12 or newer and a 64-bit machine. Nothing to install on the server.

brew install crgimenes/tap/keikiban

Or take a binary from the releases:

SystemFile
macOS (Intel and Apple Silicon)keikiban-darwin-universal.zip
Windows x64 / arm64keikiban-windows-amd64.exe, keikiban-windows-arm64.exe
Linux x64 / arm64keikiban-linux-amd64.gz, keikiban-linux-arm64.gz

The macOS build is signed and notarized, so it opens normally. If you build it yourself and Gatekeeper complains, xattr -dr com.apple.quarantine keikiban clears it. Windows SmartScreen may want "More info" then "Run anyway".

On Linux the interface needs WebKitGTK at runtime: libwebkit2gtk-4.1-0 on Debian/Ubuntu, webkit2gtk4.1 on Fedora.

Configure

Connections live in a Filo file at ~/.config/keikiban/init.filo, or ./keikiban_init.filo if you keep one per project. On first run the app asks for a connection and writes the file.

; keikiban configuration
(database "postgres://user:pass@db.internal:5432/app" "Production")
(database "postgres://user:pass@localhost:5432/app" "Local")

The first entry is the default and loads when the app opens. URL form and host=... dbname=... form both work. keikiban only appends to this file, so whatever else you keep in there survives.

One connection at a time. Connecting to one closes the other. That is deliberate: the name of the attached database sits in the sidebar and in the window title, so a command cannot land on a server you were not looking at.

Command line

The GUI is the product. The flags exist so an AI agent can drive it:

keikiban -json connections     configured connections
keikiban -json dashboard 30    sample the load for 30s, then report it
keikiban -json sessions        current sessions
keikiban -json locks           blocking tree
keikiban -json indexes         index health report
keikiban -json maintenance     vacuum, wraparound, sequences

Each prints one JSON document to stdout and exits. Passwords are masked everywhere, including in -debug, which writes key=value diagnostic lines to stderr.

Build

go build

Go 1.26, no cgo. Runtime dependencies are glaze for the window, filo for the config file and pgx for the wire protocol. The interface is HTML drawn by the system webview, so it uses the platform's own controls and follows the system light and dark theme.

License

MIT