Devinity | A VPN-first, self-hosted Git and CI/CD platform with a Tamboui dashboard #217
gbourant
started this conversation in
Show and tell
Replies: 3 comments
-
|
Awesome! Thanks for sharing! |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
That looks great - love how clean and prof it looks. Something a bit like k9s. |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
Thank you guys @maxandersen and @davsclaus for your kind words :) |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Hey!
I've been building devinity.dev a VPN-first, self-hosted Git and CI/CD platform, and I just finished building a terminal dashboard for it using Tamboui. Thought I'd share it here since this is a real-world use case.
Main Screen
The dashboard is the entry point, a 30/70 split layout with an app sidebar on the left (cyan-bordered panel listing all apps with their deployment counts) and two stacked tables on the right: recent builds (green border, showing build number, app:branch, commit hash, status, and timestamp) and active deployments (yellow border, showing port, status, and exposure info). The footer shows all available keyboard shortcuts. Everything auto-refreshes every ~1 second via async SSH calls.
What it does
The TUI lets you manage your entire CI/CD pipeline from the terminal, monitor builds in real-time, deploy with a single keypress, start/stop/restart services, follow logs live, manage env vars, and control public exposure. It connects to the Devinity server over SSH (through a WireGuard VPN) and refreshes data automatically.
What I built with it
Stack
Really happy with how it turned out. The Toolkit DSL feels natural for Java and the constraint-based layout system is powerful
without being complicated.
All the screenshots
Apps
A navigable table of all registered apps showing their name, deployment count, and creation date. The selected row is highlighted with a cyan background and >> marker using Tamboui's TableState and highlightStyle. Press Enter to drill into builds for that app, or d to jump straight to deployments.
Builds
The builds screen for a specific app, a green-bordered table listing each build's number, app:branch, commit hash (8 chars), status (PENDING/BUILDING/SUCCESS/FAILED), and start time. From here you can press Enter to view the full build log or d to deploy a specific build directly.
Build log (FOLLOW mode)
The log viewer showing a build's output with FOLLOW mode active (green badge in the header). In this mode the log auto-scrolls to the bottom as new lines arrive, refreshing every ~2 seconds. You can press f to toggle between FOLLOW (auto-scroll) and PAUSED (manual scroll with arrow keys), and use Home/End to jump to top/bottom.
Deployments
The deployments management screen for a specific app, a yellow-bordered table showing build number, app:branch, status (running/stopped), port, exposed (yes/no), and domains. This is the operational hub: press s to start, x to stop, r to restart, l to follow live logs, e to manage env vars, or p to control public exposure. All actions execute over SSH and the table auto-refreshes.
Runtime Logs
The same log viewer, but now streaming the runtime output of a deployed app (as opposed to build logs). The header shows which app:branch you're tailing. Same FOLLOW/PAUSED toggle, useful for watching your app in production without leaving the TUI.
Environment Variables (view)
The env screen listing all environment variables for an app in a magenta-bordered table with APP:BRANCH, KEY, and VALUE columns. You can navigate the list and press d to delete a variable, R to reset all to build defaults, or K to reset but keep user-added keys.
Environment Variables (input mode)
After pressing a to add a new variable, a green-bordered text input panel appears at the bottom with a KEY=VALUE placeholder. This uses Tamboui's TextInputState widget, full cursor movement, backspace, delete, home/end. The footer switches to show just Enter (submit) and Esc (cancel).
Expose (public access)
The expose screen controls which deployments are publicly accessible. A green-bordered table shows each app:branch, whether it's exposed, the mode (domain/ip/both), and assigned domains. Press Enter to toggle exposure on/off, or use d/i/b to choose the exposure mode. Under the hood this configures a Caddy reverse proxy.
Maintenance Mode
Back on the dashboard, pressing m toggles global maintenance mode. When active, a red MAINTENANCE badge appears in the header bar next to the devinity label, and the status bar shows a confirmation message. This takes the whole platform offline for all public-facing services.
Beta Was this translation helpful? Give feedback.
All reactions