GitLab Runner TUI
A fast, beautiful Terminal User Interface (TUI) for querying and inspecting GitLab Runners.
Overview
GitLab Runner TUI provides DevOps engineers and GitLab administrators with an intuitive command-line interface to monitor and manage GitLab Runner infrastructure. Query runners by tags—all from your terminal.
Preview

Seven dashboard tabs — navigate with 1–7 or Tab

Runner detail pane — arrow through runners to inspect status, version, managers, and tags
Features
- 🚀 Interactive TUI - Beautiful, keyboard-driven interface built with ratatui
- 📊 Seven Dashboard Tabs - Specialized views for different runner and infrastructure metrics
- 🔍 Command Mode - Run one-shot JSON queries for CI/CD or automation
- 🏷️ Tag Filtering - Filter runners by comma-separated tags
- ⚡ Real-time API Queries - Direct integration with GitLab REST API v4
- 📊 Detailed Results - Tabular display of runners and managers with color highlighting
- 🔐 Secure - Token-based authentication
Quick Start
Prerequisites
- GitLab personal access token accepted by the GitLab user API
- GitLab instance URL (defaults to gitlab.com)
Installation
From source:
Configuration
Set required environment variables:
# Optional, defaults to gitlab.com
Or create a .env file:
GITLAB_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx
GITLAB_HOST=https://gitlab.com
Or create a config file at ~/.config/gitlab-runner-tui/config.toml:
= "https://gitlab.com"
= "glpat-xxxxxxxxxxxxxxxxxxxx"
= 30
= 1800
= "configured_targets"
[[]]
= "group"
= "my-org/platform"
= "Platform"
[[]]
= "project"
= "my-org/app"
If you launch the interactive TUI without a configured token, with a stale/invalid token, or without runner targets, the app now runs a setup flow and writes the canonical config file for you before entering the dashboard.
Runner discovery now comes from configured group/project targets instead of instance-wide runner listing. This is what makes normal GitLab.com usage possible.
Optional config.toml file locations (checked in this order):
./config.toml(current working directory)~/.config/gitlab-runner-tui/config.toml(canonical)
Example:
= 30
= 1800
= "https://gitlab.com"
= "glpat-xxxxxxxxxxxxxxxxxxxx"
= "configured_targets"
[[]]
= "group"
= "my-org/platform"
= "Platform"
[[]]
= "project"
= "12345"
= "App Project"
runner_targets are required when discovery_mode = "configured_targets". Set discovery_mode = "visible_runners" to use the current user's visible /runners endpoint instead. Supported target kinds:
groupproject
Each target id may be either a numeric GitLab ID or a group/project path.
During onboarding, targets are entered as a single comma-separated prompt using explicit prefixes. In the interactive TUI you can also edit the discovery mode, token, targets, and poll settings from the settings modal.
group:my-org/platform,project:my-org/app
Running
# Using environment variables
# Or specify via CLI flags
Dashboard Tabs
| Tab | Description |
|---|---|
Runners |
Fetch all GitLab Runner details with optional filters |
Health |
Health check - verify all tagged runners are online |
Offline |
List runners with no online managers |
Uncontacted |
Find runners not contacted recently (default: 1 hour) |
Empty |
List runners with no managers |
Rotating |
Detect runners currently in rotation (multiple managers) |
Workers |
Show detailed list of all individual Runner Managers |
Keyboard Navigation
Tab/Shift+Tab- Switch dashboard tabs1-7- Jump directly to a tab↑/↓ork/j- Move table selection/orf- Focus tag filter inputaon Stale - Edit the last-contact cutoff (HH:MM,HH:MM:SS, or RFC3339)v- Open version multi-selecto- Cycle sort modec- Open settings + diagnosticsEnterorr- Refresh the active tabp- Toggle polling / auto-refreshEsc- Exit filter editing or dismiss errors?- Toggle helpqorCtrl-C- Quit
Configuration Options
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
GITLAB_TOKEN |
Yes | - | Personal access token accepted by GET /user |
GITLAB_HOST |
No | https://gitlab.com |
GitLab instance URL |
runner_targets, discovery_mode, and polling settings can be edited in the TUI settings modal and are persisted back to the canonical config file.
CLI & Automation
In addition to the interactive TUI, gitlab-runner-tui can function as a powerful CLI tool for automation and LLM-based workflows.
Command JSON Output
Pass a command to fetch data once and exit with a JSON response:
# Fetch all runners as JSON
# List only rotating runners as JSON
Integration with jq
The JSON output includes both the runners data and metrics about the query. You can easily process this with jq:
List all runner IDs:
|
Find runners with offline managers:
| \
Get query performance metrics:
|
CLI Flags
# Override host and token
# Command mode (non-interactive, JSON output)
# Use demo data for any mode (no credentials required)
- Commands:
fetch,switch,flames,empty,rotating. --tags <TAGS>: Comma-separated list of tags for filtering.--stale-cutoff <TIME>: Forflames, use a last-contact cutoff (HH:MM,HH:MM:SS, or RFC3339) instead of the default 1 hour.rotatingrequires--tagsto avoid estate-wide rotation scans.
Examples
Find all production runners
- Configure at least one
grouporprojectrunner target - Select Runners tab (
1) - Press
/to enter tags:production - View filtered results
Check runner health
- Configure at least one runner target
- Select Health tab (
2) - Press
/to enter tags:production,linux - View health summary and runner statuses
List offline runners
- Configure at least one runner target
- Select Offline tab (
3) - Press
/to enter tags:alm - View runners with offline managers
Check for runner rotation
Run a non-interactive check for runners that have multiple managers (e.g. during a migration):
Check maintenance recovery after a cutoff
List runners whose managers have not contacted GitLab after 11:00 local time:
Development
Building
# Development build
# Release build (optimized)
# Run tests
# Run with debug logging
RUST_LOG=debug
Git Hooks
This repo uses lefthook for local git hooks.
Configured hooks:
pre-commit:cargo fmt --checkandcargo clippy --all-targets -- -D warningspre-push:cargo test
Testing
# Run all tests
# Run with output
# Run specific test
Troubleshooting
Connection Issues
Error: "Connection timeout"
- Check
GITLAB_HOSTis correct and accessible - Verify network connectivity:
ping gitlab.com - Check proxy settings if behind corporate firewall
Authentication Issues
Error: "Authentication failed"
- Verify
GITLAB_TOKENis correct - Verify the token can authenticate against the GitLab user API
- Check token hasn't expired
Runner Target Issues
Error: "At least one runner target must be configured"
- Add one or more
[[runner_targets]]entries toconfig.toml - Or rerun onboarding and enter targets like
group:my-org/platform,project:my-org/app - Or leave runner targets blank and use the current user's visible runners
- Confirm the configured group/project IDs or paths are valid for the current GitLab host
SSL Certificate Issues
Error: "SSL certificate verify failed"
- Self-signed certificate support is not currently implemented
Contributing
Contributions welcome! Please see CONTRIBUTING.md for guidelines.
Architecture
GitLab Runner TUI follows a three-layer architecture:
TUI (View) → Conductor (Business Logic) → GitLabClient (API)
- TUI Layer: User interface, event handling, rendering
- Conductor Layer: Orchestrates operations, applies filters, formats results
- GitLabClient Layer: HTTP communication with GitLab API
See app_spec.txt for detailed specification.
License
[Add your license here]
Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Acknowledgments
Built with ratatui - A Rust library for building terminal user interfaces.