Introduction
Grafatui is a terminal user interface for Prometheus dashboards. It is designed for fast inspection, SSH sessions, local debugging, and environments where opening a browser-based Grafana instance is inconvenient.
Grafatui reads Prometheus directly and can import Grafana dashboard JSON files. It renders supported panels as terminal charts, tables, gauges, stats, and heatmaps while keeping the workflow keyboard-first.
When Grafatui Fits
Use Grafatui when you want:
- A lightweight Prometheus dashboard in your terminal.
- A familiar way to inspect exported Grafana dashboards.
- Fast startup and low resource usage.
- A dashboard that works well over SSH.
- SVG or PNG snapshots of the current TUI view.
Grafatui is not a Grafana server replacement. It does not manage users, alerts, annotations, dashboard editing, plugins, or browser-only visualizations.
Project Links
Installation
From Crates.io
Install the latest published release with Cargo:
cargo install grafatui
Grafatui currently requires Rust 1.88 or newer.
From Source
Clone the repository and install the local checkout:
git clone https://github.com/fedexist/grafatui.git
cd grafatui
cargo install --path .
For development, use cargo run instead:
cargo run -- --prometheus-url http://localhost:9090
Prebuilt Binaries
Prebuilt release assets are published on GitHub Releases for common Linux, macOS, and Windows targets.
Shell Completions
Grafatui can generate shell completions for Bash, Zsh, Fish, PowerShell, and Elvish.
# Bash
source <(grafatui completions bash)
# Zsh
source <(grafatui completions zsh)
# Fish
grafatui completions fish | source
Man Page
Generate a man page from the CLI definition:
grafatui man > grafatui.1
Quick Start
Connect to Prometheus
If Prometheus is already running locally:
grafatui --prometheus-url http://localhost:9090
Point Grafatui at another Prometheus server with the same option:
grafatui --prometheus-url http://prometheus.example.com:9090
Import a Grafana Dashboard
Export a Grafana dashboard as JSON, then pass it to Grafatui:
grafatui --prometheus-url http://localhost:9090 --grafana-json ./dashboard.json
Override dashboard variables with repeated --var options:
grafatui --grafana-json ./dash.json --var job=node --var instance=server-01
Run the Demo
The repository includes a Prometheus demo stack and sample dashboards:
git clone https://github.com/fedexist/grafatui.git
cd grafatui
cd examples/demo && docker-compose up -d && sleep 5 && cd ../..
cargo run -- --grafana-json examples/dashboards/prometheus_demo.json --prometheus-url http://localhost:19090
When finished:
cd examples/demo
docker-compose down -v
Useful First Keys
| Key | Action |
|---|---|
q | Quit |
r | Force refresh |
+ / - | Zoom out / in |
[ / ] | Pan left / right |
f / Enter | Fullscreen selected panel |
v | Inspect values |
/ | Search panels |
Configuration
Grafatui can be configured with CLI options, a TOML configuration file, or both. CLI options override values from the configuration file.
Common CLI Options
| Option | Description | Default |
|---|---|---|
--prometheus-url <URL> | Prometheus server URL | http://localhost:9090 |
--grafana-json <FILE> | Grafana dashboard JSON file | none |
--validate | Check the Grafana dashboard import and exit without starting the TUI | false |
--strict | Make --validate fail when diagnostics contain warnings | false |
--format <FORMAT> | Output format for --validate: text or json | text |
--range <DURATION> | Time range window, such as 5m, 1h, or 24h | 5m |
--step <DURATION> | Query step resolution, such as 5s or 30s | 5s |
--var <KEY=VALUE> | Override a dashboard variable | none |
--theme <NAME> | UI theme | default |
--threshold-marker <MARKER> | Marker for threshold lines | dashed |
--autogrid-color <COLOR> | Color for automatic graph grid lines and labels | dark-gray |
--export-dir <DIR> | Directory for exports and recordings | ./grafatui-exports |
--export-format <FORMAT> | svg, png, or both | svg |
--record-max-frames <COUNT> | Maximum changed frames per recording | 300 |
--refresh-rate <MS> | Data fetch interval in milliseconds | 1000 |
--config <FILE> | Configuration file path | none |
Run the full help output with:
grafatui --help
Configuration File
Create grafatui.toml in ~/.config/grafatui/, or pass a custom path with --config.
prometheus_url = "http://localhost:9090"
refresh_rate = 1000
time_range = "1h"
step = "5s"
theme = "dracula"
threshold_marker = "dashed"
export_dir = "./grafatui-exports"
export_format = "svg"
record_max_frames = 300
autogrid = true
autogrid_color = "dark-gray"
grafana_json = "~/.config/grafatui/my-dashboard.json"
[vars]
job = "node"
instance = "server-01"
Themes
Built-in themes include:
defaultdraculamonokaisolarized-darksolarized-lightgruvboxtokyo-nightcatppuccin
Use a theme from the CLI:
grafatui --theme tokyo-night
Grafana Dashboard Import
Grafatui can import Grafana dashboard JSON files and render supported panels in the terminal.
Export From Grafana
- Open the dashboard in Grafana.
- Open dashboard settings.
- Choose the JSON model view.
- Copy the JSON into a local file.
- Run Grafatui with
--grafana-json.
grafatui --prometheus-url http://localhost:9090 --grafana-json ./node-exporter.json
Supported Panel Types
Grafatui currently supports:
graphtimeseriesstatgaugebargaugetableheatmap
Row panels are traversed so nested panels can be imported, but row headers and collapsed row behavior are not rendered.
Variables
Grafatui reads dashboard variables from templating.list and expands $var and ${var} in PromQL expressions.
Defaults come from the dashboard JSON. Override them from the CLI:
grafatui --grafana-json ./dash.json --var job=node --var instance=server-01
Prometheus query variables such as label_values(up, instance) and query_result(...) are resolved before panel queries run.
Import Diagnostics
Grafatui prints import warnings before starting the TUI when a dashboard uses
important Grafana features that are skipped or ignored. Diagnostics include
unsupported panel types, value mappings, reduce options, unresolved variables,
and unsupported variable modifiers such as ${var:regex}.
Run a non-interactive check with:
grafatui --validate --grafana-json ./dash.json
Warnings do not make validation fail. A dashboard that can be parsed and imported exits successfully even if diagnostics are printed.
Use --strict to make warnings fail validation, or --format json to emit a
machine-readable summary:
grafatui --validate --strict --grafana-json ./dash.json
grafatui --validate --format json --grafana-json ./dash.json
Hidden Targets
Grafatui honors targets[].hide by skipping hidden targets during import.
Panels with a mix of hidden and visible targets render only the visible target
queries.
Query Modes
Grafatui honors targets[].instant from Grafana dashboard JSON. Targets marked
as instant use the Prometheus instant query endpoint, while range targets use
query_range.
If a target does not specify instant, Gauge, Bar Gauge, and Table panels
default to instant queries. Graph, Timeseries, Stat, and Heatmap panels default
to range queries.
Field Configuration
Grafatui applies selected fieldConfig.defaults values where they map cleanly
to terminal rendering:
minandmaxset explicit Graph y-axis bounds and Gauge limits.thresholdsrender graph threshold lines and drive dynamic coloring for Stat, Gauge, and Bar Gauge panels.unit,decimals, andnoValueaffect supported panel values, axes, legends, and exports.custom.axisGridShowcontrols per-panel graph guide lines.
Built-In PromQL Variables
Grafatui expands the following Grafana-style variables:
$__interval$__interval_ms$__range$__range_s$__range_ms$__rate_interval$__rate_interval_ms
Compatibility Details
See the Grafana compatibility matrix for field-by-field support details.
Exporting and Recording
Grafatui can export the current dashboard view as SVG, PNG, or both. It can also record changed dashboard states into a timestamped frame bundle.
Export a Snapshot
Press e to export the current visible dashboard.
Output files are written under --export-dir:
grafatui --export-dir ./grafatui-exports --export-format both
Supported formats:
svgpngboth
Record Changed Frames
Press Ctrl+E to start recording. Press Ctrl+E again, or quit with q, to finalize the bundle.
Grafatui records only changed rendered states:
grafatui-recording-<timestamp>/
frame-000001.svg
frame-000002.svg
manifest.json
If --export-format png or both is selected, matching PNG files are written too.
Recording Limits
Limit the number of changed frames in one recording:
grafatui --record-max-frames 300
When the frame cap is reached, Grafatui stops writing new frames and records completed_reason = "capped" when finalized.
Manifest
Each recording writes a manifest.json file with metadata for downstream tooling:
{
"version": 1,
"format": "svg",
"changed_only": true,
"frame_count": 2,
"max_frames": 300,
"completed_reason": "stopped",
"viewport": { "width": 100, "height": 40 },
"frames": [
{
"index": 1,
"elapsed_ms": 0,
"files": ["frame-000001.svg"]
}
]
}
Keyboard and Mouse
Grafatui is designed for keyboard-first dashboard inspection.
Keyboard Controls
| Key | Action |
|---|---|
q | Quit |
r | Force refresh |
+ / - | Zoom out / in |
[ / ] | Pan left / right in time |
0 | Reset to live mode |
Up / Down or k / j | Select previous or next panel |
PgUp / PgDn | Scroll vertically, or select panels in fullscreen |
Home / End | Jump to top or bottom |
y | Toggle Y-axis mode |
g | Toggle autogrid guide lines |
1 through 9 | Toggle series visibility |
f / Enter | Toggle fullscreen mode |
v | Toggle value inspection mode |
e | Export current view |
Ctrl+E | Start or stop changed-frame recording |
/ | Search panels |
Left / Right | Move cursor in inspect mode |
? | Toggle debug info |
Mouse Support
| Action | Behavior |
|---|---|
| Click | Select a panel, or move the cursor in fullscreen inspect mode |
| Drag | Move the cursor in fullscreen inspect mode |
| Scroll | Scroll the dashboard vertically |
In normal mode, clicking selects panels. Press v or f to use cursor-focused interactions.
Examples
The repository includes example Grafana dashboards and a local demo environment.
Demo Stack
Start Prometheus, node-exporter, and mock vLLM metrics:
cd examples/demo
docker-compose up -d
Run Grafatui from the repository root:
cargo run -- --grafana-json examples/dashboards/prometheus_demo.json --prometheus-url http://localhost:19090
Stop the demo:
cd examples/demo
docker-compose down -v
Included Dashboards
examples/dashboards/prometheus_demo.json: recommended first demo for the bundled Prometheus stack.examples/dashboards/all_visualizations.json: compact dashboard showing the supported visualization types, including timeseries bars, area fill, point mode, and hidden-axis examples.examples/dashboards/instant_queries.json: demonstrates explicit instant targets and the default instant behavior for summary panels.examples/dashboards/thresholds_demo.json: demonstrates thresholds, field bounds, and threshold marker rendering.examples/demo/vllm/grafana.json: vLLM-oriented dashboard for the mock demo services.
More Detail
See the repository example docs:
Grafana Dashboard JSON Compatibility
This document provides a comprehensive feature-parity table between the Grafana Dashboard JSON Model and what Grafatui currently supports.
Snapshot: Grafatui v0.1.9. The roadmap prioritizes Grafana parity first, then user-visible product value. See the roadmap for milestone slices built from this compatibility ladder.
Legend:
- β Supported β Fully implemented and working
- πΆ Partial β Partially implemented or with limitations
- β Not Implemented β Recognized but not yet functional
- β Not Applicable β Cannot be implemented in a TUI context (e.g., browser-only features)
Dashboard-Level Properties
| JSON Field | Status | Notes |
|---|---|---|
title | β Supported | Displayed in the title bar |
uid | β Not Implemented | Not used (not needed for local JSON import) |
id | β Not Implemented | Not used |
version | β Not Implemented | Not used |
tags | β Not Implemented | Ignored |
timezone | β Not Implemented | All timestamps displayed in UTC |
editable | β Not Applicable | Grafatui is read-only |
style | β Not Applicable | TUI has its own theme system |
schemaVersion | β Not Implemented | Not validated |
refresh | β Supported | Used as the default data refresh interval; overridden by config or --refresh-rate |
time | β Not Implemented | Uses --range CLI option instead |
time.from / time.to | β Not Implemented | Uses --range CLI option instead |
fiscalYearStartMonth | β Not Applicable | |
liveNow | β Not Implemented | Uses 0 key to reset to live instead |
weekStart | β Not Applicable |
Panels
Panel Types
| Panel Type | Status | Notes |
|---|---|---|
graph (legacy) | β Supported | Rendered as a line chart (Braille markers) |
timeseries | β Supported | Mapped to graph renderer |
stat | β Supported | Big value + sparkline |
gauge | β Supported | Horizontal gauge bar |
bargauge | β Supported | Vertical bar chart |
table | β Supported | Two-column table (Series, Value) |
heatmap | β Supported | Character-based block heatmap |
row | πΆ Partial | Row panels are traversed for nested panels, but row headers/collapse are not rendered |
text | β Not Implemented | Skipped during import |
dashlist | β Not Implemented | Skipped during import |
alertlist | β Not Implemented | Skipped during import |
news | β Not Applicable | |
annolist | β Not Implemented | |
barchart | β Not Implemented | Skipped (distinct from bargauge) |
candlestick | β Not Implemented | |
canvas | β Not Applicable | Interactive canvas not feasible in TUI |
datagrid | β Not Implemented | |
debug | β Not Applicable | |
geomap | β Not Applicable | Map visualization not feasible in TUI |
histogram | β Not Implemented | |
logs | β Not Implemented | |
nodeGraph | β Not Applicable | |
piechart | β Not Implemented | |
state-timeline | β Not Implemented | |
status-history | β Not Implemented | |
trend | β Not Implemented | |
xychart | β Not Implemented |
Graph & Timeseries Parity
| Feature | JSON Field | Behavior | Grafana | Grafatui |
|---|---|---|---|---|
| Draw styles | fieldConfig.defaults.custom.drawStyle | Line, points, and bars map to terminal graph styles | π‘ | β |
| Point display | fieldConfig.defaults.custom.showPoints | always overlays visible point markers; never suppresses area/line point markers | π‘ | πΆ |
| Area fill | fieldConfig.defaults.custom.fillOpacity | Nonzero fill opacity renders terminal/SVG area fill behind the line | π‘ | πΆ |
| Stacking | fieldConfig.defaults.custom.stacking | Parsed and retained; non-off modes render non-stacked in this slice | π‘ | πΆ |
| Axis placement | fieldConfig.defaults.custom.axisPlacement | hidden suppresses y-axis labels; left/right map to the terminal y-axis | π‘ | πΆ |
| Axis grid | fieldConfig.defaults.custom.axisGridShow | Controls per-panel autogrid guide lines | π‘ | β |
| Threshold style | fieldConfig.defaults.custom.thresholdsStyle | Dashed/line style is parsed for graph threshold rendering | π‘ | πΆ |
Panel Common Fields
| JSON Field | Status | Notes |
|---|---|---|
title | β Supported | Displayed as the panel border title |
type | β Supported | Used to select the renderer |
gridPos | β Supported | 24-column grid layout fully supported |
gridPos.x | β Supported | |
gridPos.y | β Supported | |
gridPos.w | β Supported | |
gridPos.h | β Supported | |
id | β Not Implemented | Not used |
description | β Not Implemented | Not displayed |
transparent | β Not Applicable | TUI panels always have borders |
links | β Not Applicable | No browser navigation |
repeat | β Not Implemented | Template repeat not supported |
repeatDirection | β Not Implemented | |
maxPerRow | β Not Implemented | |
collapsed (row) | β Not Implemented | Rows are always expanded |
panels (nested in row) | β Supported | Nested panels are extracted recursively |
Targets (Queries)
| JSON Field | Status | Notes |
|---|---|---|
targets (array) | β Supported | Multiple targets per panel supported |
targets[].expr | β Supported | PromQL expression |
targets[].legendFormat | β Supported | {{label}} syntax for legend formatting |
targets[].refId | β Not Implemented | Not used |
targets[].datasource | β Not Implemented | Only Prometheus datasource is supported |
targets[].interval | β Not Implemented | Uses global --step instead |
targets[].intervalFactor | β Not Implemented | |
targets[].instant | β Supported | Uses Prometheus instant query when true; Gauge, BarGauge, and Table default to instant |
targets[].format | β Not Implemented | Always treated as time_series |
targets[].hide | β Supported | Hidden targets are skipped during import |
targets[].exemplar | β Not Implemented | |
targets[].editorMode | β Not Applicable | UI-only setting |
PromQL Special Variables
| Variable | Status | Notes |
|---|---|---|
$__rate_interval | β Supported | Computed as max(step Γ 4, 60s) |
$__rate_interval_ms | β Supported | Millisecond form of $__rate_interval |
$__interval | β Supported | Computed from the current range and panel resolution, bounded by --step |
$__interval_ms | β Supported | Millisecond form of $__interval |
$__range | β Supported | Current dashboard time range |
$__range_s | β Supported | Current dashboard time range in seconds |
$__range_ms | β Supported | Current dashboard time range in milliseconds |
Templating (Variables)
| JSON Field | Status | Notes |
|---|---|---|
templating.list | β Supported | Variables extracted from dashboard |
templating.list[].name | β Supported | Used as $var or ${var} in queries |
templating.list[].current.value | β Supported | Used as default value |
templating.list[].current.text | πΆ Partial | Used as fallback if value is missing |
templating.list[].allValue | β Supported | Used when value is $__all, falls back to .* |
templating.list[].type | πΆ Partial | query variables are resolved for Prometheus |
templating.list[].query | πΆ Partial | Supports Prometheus label_values(...) and query_result(...) |
templating.list[].definition | πΆ Partial | Used as a fallback query expression for dynamic query variables |
templating.list[].datasource | β Not Implemented | |
templating.list[].regex | πΆ Partial | Applied to dynamic query variable results |
templating.list[].sort | β Not Implemented | |
templating.list[].multi | β Not Implemented | Multi-value selection not supported |
templating.list[].includeAll | β Not Implemented | |
templating.list[].refresh | πΆ Partial | Dynamic variables refresh before panel queries |
templating.list[].options | β Not Implemented | No dropdown/picker UI |
templating.list[].hide | β Not Implemented | |
CLI --var KEY=VALUE override | β Supported | Overrides dashboard defaults from command line |
Config file vars override | β Supported | Overrides via TOML config |
Variable Substitution
| Pattern | Status | Notes |
|---|---|---|
$varname | β Supported | Simple substitution |
${varname} | β Supported | Braced substitution |
${varname:regex} | β Not Implemented | Format modifiers not supported |
${varname:pipe} | β Not Implemented | |
${varname:csv} | β Not Implemented | |
${varname:json} | β Not Implemented | |
${varname:queryparam} | β Not Implemented | |
$__all | β Supported | Replaced with allValue or .* |
Field Configuration (fieldConfig)
fieldConfig is partially implemented. Thresholds, explicit min/max bounds,
selected display formatting fields, threshold style, and per-panel autogrid
settings are parsed; value mappings, display names, and field overrides remain
major gaps.
| JSON Field | Status | Notes |
|---|---|---|
fieldConfig | πΆ Partial | Parsed for supported defaults/custom fields below |
fieldConfig.defaults | πΆ Partial | Parsed for min/max, thresholds, and selected custom fields |
fieldConfig.defaults.unit | πΆ Partial | Common units such as bytes, bits, seconds, milliseconds, percent, percentunit, ops, request rate, and byte rate are formatted; unknown units fall back to Grafatuiβs compact SI formatter |
fieldConfig.defaults.min | β Supported | Used for Graph y-axis lower bounds, percentage thresholds, and Gauge limits |
fieldConfig.defaults.max | β Supported | Used for Graph y-axis upper bounds, gauge scaling, and threshold boundaries |
fieldConfig.defaults.decimals | β Supported | Controls numeric precision in panel values, graph axes, legends, and exports |
fieldConfig.defaults.color | β Not Implemented | Uses theme palette instead |
fieldConfig.defaults.mappings | β Not Implemented | Value mappings not supported; import diagnostics warn when mappings are ignored |
fieldConfig.defaults.noValue | πΆ Partial | Used for null Stat/Table values and exports; empty panels still show Grafatuiβs No data state |
fieldConfig.defaults.displayName | β Not Implemented | |
fieldConfig.defaults.custom | πΆ Partial | Used for graph draw style, fill/points, axis placement, stacking metadata, threshold style, and axis grid visibility |
fieldConfig.defaults.custom.lineWidth | β Not Implemented | TUI limitation |
fieldConfig.defaults.custom.fillOpacity | πΆ Partial | Nonzero values enable terminal/SVG area fill; exact browser opacity is approximated |
fieldConfig.defaults.custom.pointSize | β Not Applicable | TUI points use fixed terminal-cell markers |
fieldConfig.defaults.custom.axisLabel | β Not Implemented | |
fieldConfig.defaults.custom.axisGridShow | β Supported | Controls per-panel autogrid guide lines for graph/time-series panels |
fieldConfig.defaults.custom.thresholdsStyle | πΆ Partial | mode is parsed for threshold rendering; glyph style is also controlled by Grafatuiβs marker setting |
fieldConfig.defaults.custom.scaleDistribution | β Not Implemented | Always linear |
fieldConfig.overrides | β Not Implemented |
Thresholds
| JSON Field | Status | Notes |
|---|---|---|
fieldConfig.defaults.thresholds | β Supported | Applied to Graph limit lines and dynamic coloring for Stat, Gauge & BarGauge |
fieldConfig.defaults.thresholds.mode | β Supported | (absolute / percentage) |
fieldConfig.defaults.thresholds.steps | β Supported | |
fieldConfig.defaults.thresholds.steps[].value | β Supported | Evaluated mathematically against metric values |
fieldConfig.defaults.thresholds.steps[].color | β Supported | Maps keywords (e.g., green) and hex codes (e.g., #FF0000) |
Panel Options (options)
Panel-specific options are not parsed yet. Grafatui currently applies its own
compact TUI defaults for legends, stat sparklines, gauges, and inspect-mode
tooltips.
| JSON Field | Status | Notes |
|---|---|---|
options | β Not Implemented | Panel-specific options object is ignored |
options.legend | β Not Implemented | Grafatui uses its own compact legend |
options.legend.displayMode | β Not Implemented | Always shows inline legend |
options.legend.placement | β Not Implemented | Always bottom |
options.legend.calcs | β Not Implemented | No calculated legend values (min/max/avg) |
options.tooltip | β Not Implemented | Inspect mode serves as tooltip substitute |
options.tooltip.mode | β Not Implemented | |
options.orientation | β Not Implemented | |
options.reduceOptions | β Not Implemented | Stat/Gauge always use last value; import diagnostics warn when reduce options are ignored |
options.reduceOptions.calcs | β Not Implemented | |
options.reduceOptions.fields | β Not Implemented | |
options.textMode | β Not Implemented | |
options.colorMode | β Not Implemented | |
options.graphMode | β Not Implemented | Stat always shows sparkline |
Annotations
| JSON Field | Status | Notes |
|---|---|---|
annotations | β Not Implemented | |
annotations.list | β Not Implemented |
Data Links & Transformations
| JSON Field | Status | Notes |
|---|---|---|
options.dataLinks | β Not Applicable | No browser navigation in TUI |
transformations | β Not Implemented | |
transformations[].id | β Not Implemented | (e.g., organize, merge, reduce) |
Alert Rules
| JSON Field | Status | Notes |
|---|---|---|
alert | β Not Implemented | Panel-level alerts |
alert.conditions | β Not Implemented | |
alert.notifications | β Not Implemented |
Datasource Configuration
| Feature | Status | Notes |
|---|---|---|
Prometheus (query_range) | β Supported | Primary and only supported datasource |
Prometheus (query instant) | β Supported | Used for dynamic template variables and instant panel targets |
| Prometheus labels API | β Supported | Used for dynamic variable label_values(...) |
| Mixed datasource | β Not Implemented | |
| InfluxDB | β Not Implemented | |
| Loki | β Not Implemented | |
| Elasticsearch | β Not Implemented | |
| Other datasources | β Not Implemented |
Summary Statistics
| Category | Supported | Partial | Not Implemented | Not Applicable |
|---|---|---|---|---|
| Dashboard Properties | 1 | 0 | 10 | 4 |
| Panel Types | 7 | 1 | 14 | 5 |
| Panel Common Fields | 8 | 0 | 6 | 2 |
| Targets / Queries | 3 | 0 | 8 | 1 |
| PromQL Variables | 7 | 0 | 0 | 0 |
| Templating | 6 | 6 | 6 | 0 |
| Variable Substitution | 3 | 0 | 5 | 0 |
| Field Config | 4 | 6 | 10 | 2 |
| Thresholds | 5 | 0 | 0 | 0 |
| Panel Options | 0 | 0 | 14 | 0 |
| Annotations | 0 | 0 | 2 | 0 |
| Data Links / Transforms | 0 | 0 | 2 | 1 |
| Alert Rules | 0 | 0 | 3 | 0 |
| Datasources | 3 | 0 | 5 | 0 |
| Total | 47 | 13 | 85 | 15 |
Most Requested Missing Features
Based on user feedback, the following missing features are most commonly expected:
- Value mappings (
fieldConfig.defaults.mappings) β Map numeric values to text labels - Broader unit formatting (
fieldConfig.defaults.unit) β Extend the current common-unit subset to more Grafana unit families - Reduce options (
options.reduceOptions) β Use min/max/mean/total instead of always using the latest value - Import diagnostics β Warn clearly about skipped panel types and ignored high-impact fields
- Additional panel types β
text,piechart,histogram,logs
What Grafatui Does Instead
Grafatui provides several TUI-native capabilities that donβt map directly to Grafana JSON features:
| Grafatui Feature | Description |
|---|---|
| 8 color themes | default, dracula, monokai, solarized-dark, solarized-light, gruvbox, tokyo-night, catppuccin |
| Keyboard navigation | Vim-style (j/k), arrow keys, page up/down |
| Panel search | / opens a fuzzy-search popup |
| Fullscreen mode | f to focus on a single panel |
| Inspect mode | v enables cursor-based point-in-time inspection |
| Y-axis toggle | y switches between auto-scale and zero-based |
| Series toggling | 1β9 to show/hide individual series |
| Autogrid toggle | g toggles automatic guide lines |
| Mouse support | Click to select, scroll to navigate, drag cursor in fullscreen |
| Smart caching | Request deduplication and caching for identical queries |
| Client-side downsampling | Max-pooling to ~200 points to preserve peaks |
| SVG/PNG export and recordings | Save dashboard snapshots or changed-frame recording bundles |
| TOML configuration | Persistent config file for all CLI options |
This document was reviewed against the Grafatui source code at v0.1.9. If you notice any inaccuracies, please open an issue or PR.
Troubleshooting
Prometheus Connection Refused
Check that Prometheus is running and reachable:
curl http://localhost:9090/-/healthy
If you are using the demo stack, the Prometheus port is 19090:
curl http://localhost:19090/-/healthy
No Data Appears
Prometheus may need a few scrape intervals before data is available. Wait 10 to 15 seconds and force a refresh with r.
Also confirm that the dashboard queries match labels in your Prometheus server:
grafatui --prometheus-url http://localhost:9090 --grafana-json ./dashboard.json --var job=prometheus
Dashboard Variables Do Not Match
Override variables explicitly with --var:
grafatui --grafana-json ./dashboard.json --var instance=localhost:9090
If a Grafana dashboard uses multi-select formatting modifiers such as ${var:csv} or ${var:regex}, check the compatibility matrix. Not every Grafana interpolation mode is implemented.
Demo Port Conflict
The demo Prometheus service uses host port 19090. If that port is already in use, edit examples/demo/docker-compose.yml and run Grafatui with the updated URL.
Export Directory Problems
Set an explicit export directory:
grafatui --export-dir ./grafatui-exports
Make sure the directory is writable by your current user.