lazygocd: a terminal dashboard for GoCD that feels local
A walkthrough of lazygocd, the Rust terminal UI I built for GoCD: fast dashboard loading, personalized views, live logs, reruns, GitHub checks, and the release work behind it.
lazygocd started as a selfish tool: I wanted the GoCD dashboard in the terminal, with keyboard movement, instant search, live logs, and the kind of feedback loop that does not make you wait on browser tabs. It is now a real release with Homebrew install support, signed release assets, Snyk scanning, and docs.
The shape of the app
The UI is built around three panes: groups and pipelines on the left, run history in the middle, and stage/job details on the right. The app starts from a disk cache so the dashboard paints immediately, then refreshes GoCD in the background. When the server is slow or huge, the terminal still feels alive.
- Press / to fuzzy-filter pipelines across every group.
- Press enter to drill from pipeline to run to job output.
- Press t, p, X, R, or T for trigger, pause, cancel, rerun, and trigger-with-variables flows.
- Press f to pin important pipelines into a Favorites section.
GoCD personalized views, in the terminal
The feature that made it feel native was using GoCD's own personalized dashboard views. Press v and lazygocd reads the same pipeline_selection views people create in the web dashboard, then asks /api/dashboard for that viewName server-side. Press V after filtering and it saves the matching pipelines back as a GoCD view, so the web UI and terminal stay in sync.
The goal was not to replace GoCD's dashboard. It was to make the daily path through it fast enough that it feels like a local tool.
Live logs without waste
Console logs open full screen, auto-tail while a job runs, and stop polling once the stage finishes. Tailing uses startLineNumber, and dashboard polling uses ETag/304, so the steady-state network cost is small even when the screen is constantly updating.
GitHub checks and operational shortcuts
When a pipeline has a direct Git material, lazygocd compares the deployed commit with the latest branch commit and shows whether the run is current. The GitHub CLI token is picked up automatically when available, GitHub Enterprise works through github_api_base, and o opens the commit or pending diff.
The smaller workflow pieces matter too: OSC 52 copy, shell completions, a man page, desktop notifications for favorited pipelines, and release bottles for Homebrew so install is quick.
Release work that made it real
The v0.4 release line was verified against a live GoCD 23.5.0 server, including creating a temporary personalized view, loading it through viewName filtering, and deleting it again. After that I added a Snyk SBOM scan workflow, published release assets, updated the Homebrew tap, and put the docs site on Vercel with a rendered changelog.
- Project docs: https://lazygocd.vercel.app
- GitHub releases: https://github.com/Sahilll15/lazygocd/releases
- Homebrew install: brew install sahilll15/tap/lazygocd
What I would reuse
The main lesson is that terminal apps feel fast when they never make the network part of the input loop. Cache the last good state, render immediately, refresh in the background, and keep every mutating action behind an explicit confirmation. That pattern carried more of the product than any single Ratatui trick.