Keyboard shortcuts

Press ← or β†’ to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.

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

KeyAction
qQuit
rForce refresh
+ / -Zoom out / in
[ / ]Pan left / right
f / EnterFullscreen selected panel
vInspect 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

OptionDescriptionDefault
--prometheus-url <URL>Prometheus server URLhttp://localhost:9090
--grafana-json <FILE>Grafana dashboard JSON filenone
--validateCheck the Grafana dashboard import and exit without starting the TUIfalse
--strictMake --validate fail when diagnostics contain warningsfalse
--format <FORMAT>Output format for --validate: text or jsontext
--range <DURATION>Time range window, such as 5m, 1h, or 24h5m
--step <DURATION>Query step resolution, such as 5s or 30s5s
--var <KEY=VALUE>Override a dashboard variablenone
--theme <NAME>UI themedefault
--threshold-marker <MARKER>Marker for threshold linesdashed
--autogrid-color <COLOR>Color for automatic graph grid lines and labelsdark-gray
--export-dir <DIR>Directory for exports and recordings./grafatui-exports
--export-format <FORMAT>svg, png, or bothsvg
--record-max-frames <COUNT>Maximum changed frames per recording300
--refresh-rate <MS>Data fetch interval in milliseconds1000
--config <FILE>Configuration file pathnone

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:

  • default
  • dracula
  • monokai
  • solarized-dark
  • solarized-light
  • gruvbox
  • tokyo-night
  • catppuccin

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

  1. Open the dashboard in Grafana.
  2. Open dashboard settings.
  3. Choose the JSON model view.
  4. Copy the JSON into a local file.
  5. Run Grafatui with --grafana-json.
grafatui --prometheus-url http://localhost:9090 --grafana-json ./node-exporter.json

Supported Panel Types

Grafatui currently supports:

  • graph
  • timeseries
  • stat
  • gauge
  • bargauge
  • table
  • heatmap

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:

  • min and max set explicit Graph y-axis bounds and Gauge limits.
  • thresholds render graph threshold lines and drive dynamic coloring for Stat, Gauge, and Bar Gauge panels.
  • unit, decimals, and noValue affect supported panel values, axes, legends, and exports.
  • custom.axisGridShow controls 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:

  • svg
  • png
  • both

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

KeyAction
qQuit
rForce refresh
+ / -Zoom out / in
[ / ]Pan left / right in time
0Reset to live mode
Up / Down or k / jSelect previous or next panel
PgUp / PgDnScroll vertically, or select panels in fullscreen
Home / EndJump to top or bottom
yToggle Y-axis mode
gToggle autogrid guide lines
1 through 9Toggle series visibility
f / EnterToggle fullscreen mode
vToggle value inspection mode
eExport current view
Ctrl+EStart or stop changed-frame recording
/Search panels
Left / RightMove cursor in inspect mode
?Toggle debug info

Mouse Support

ActionBehavior
ClickSelect a panel, or move the cursor in fullscreen inspect mode
DragMove the cursor in fullscreen inspect mode
ScrollScroll 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 FieldStatusNotes
titleβœ… SupportedDisplayed in the title bar
uid❌ Not ImplementedNot used (not needed for local JSON import)
id❌ Not ImplementedNot used
version❌ Not ImplementedNot used
tags❌ Not ImplementedIgnored
timezone❌ Not ImplementedAll timestamps displayed in UTC
editableβ›” Not ApplicableGrafatui is read-only
styleβ›” Not ApplicableTUI has its own theme system
schemaVersion❌ Not ImplementedNot validated
refreshβœ… SupportedUsed as the default data refresh interval; overridden by config or --refresh-rate
time❌ Not ImplementedUses --range CLI option instead
time.from / time.to❌ Not ImplementedUses --range CLI option instead
fiscalYearStartMonthβ›” Not Applicable
liveNow❌ Not ImplementedUses 0 key to reset to live instead
weekStartβ›” Not Applicable

Panels

Panel Types

Panel TypeStatusNotes
graph (legacy)βœ… SupportedRendered as a line chart (Braille markers)
timeseriesβœ… SupportedMapped to graph renderer
statβœ… SupportedBig value + sparkline
gaugeβœ… SupportedHorizontal gauge bar
bargaugeβœ… SupportedVertical bar chart
tableβœ… SupportedTwo-column table (Series, Value)
heatmapβœ… SupportedCharacter-based block heatmap
rowπŸ”Ά PartialRow panels are traversed for nested panels, but row headers/collapse are not rendered
text❌ Not ImplementedSkipped during import
dashlist❌ Not ImplementedSkipped during import
alertlist❌ Not ImplementedSkipped during import
newsβ›” Not Applicable
annolist❌ Not Implemented
barchart❌ Not ImplementedSkipped (distinct from bargauge)
candlestick❌ Not Implemented
canvasβ›” Not ApplicableInteractive canvas not feasible in TUI
datagrid❌ Not Implemented
debugβ›” Not Applicable
geomapβ›” Not ApplicableMap 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

FeatureJSON FieldBehaviorGrafanaGrafatui
Draw stylesfieldConfig.defaults.custom.drawStyleLine, points, and bars map to terminal graph stylesπŸŸ‘βœ…
Point displayfieldConfig.defaults.custom.showPointsalways overlays visible point markers; never suppresses area/line point markersπŸŸ‘πŸ”Ά
Area fillfieldConfig.defaults.custom.fillOpacityNonzero fill opacity renders terminal/SVG area fill behind the lineπŸŸ‘πŸ”Ά
StackingfieldConfig.defaults.custom.stackingParsed and retained; non-off modes render non-stacked in this sliceπŸŸ‘πŸ”Ά
Axis placementfieldConfig.defaults.custom.axisPlacementhidden suppresses y-axis labels; left/right map to the terminal y-axisπŸŸ‘πŸ”Ά
Axis gridfieldConfig.defaults.custom.axisGridShowControls per-panel autogrid guide linesπŸŸ‘βœ…
Threshold stylefieldConfig.defaults.custom.thresholdsStyleDashed/line style is parsed for graph threshold renderingπŸŸ‘πŸ”Ά

Panel Common Fields

JSON FieldStatusNotes
titleβœ… SupportedDisplayed as the panel border title
typeβœ… SupportedUsed to select the renderer
gridPosβœ… Supported24-column grid layout fully supported
gridPos.xβœ… Supported
gridPos.yβœ… Supported
gridPos.wβœ… Supported
gridPos.hβœ… Supported
id❌ Not ImplementedNot used
description❌ Not ImplementedNot displayed
transparentβ›” Not ApplicableTUI panels always have borders
linksβ›” Not ApplicableNo browser navigation
repeat❌ Not ImplementedTemplate repeat not supported
repeatDirection❌ Not Implemented
maxPerRow❌ Not Implemented
collapsed (row)❌ Not ImplementedRows are always expanded
panels (nested in row)βœ… SupportedNested panels are extracted recursively

Targets (Queries)

JSON FieldStatusNotes
targets (array)βœ… SupportedMultiple targets per panel supported
targets[].exprβœ… SupportedPromQL expression
targets[].legendFormatβœ… Supported{{label}} syntax for legend formatting
targets[].refId❌ Not ImplementedNot used
targets[].datasource❌ Not ImplementedOnly Prometheus datasource is supported
targets[].interval❌ Not ImplementedUses global --step instead
targets[].intervalFactor❌ Not Implemented
targets[].instantβœ… SupportedUses Prometheus instant query when true; Gauge, BarGauge, and Table default to instant
targets[].format❌ Not ImplementedAlways treated as time_series
targets[].hideβœ… SupportedHidden targets are skipped during import
targets[].exemplar❌ Not Implemented
targets[].editorModeβ›” Not ApplicableUI-only setting

PromQL Special Variables

VariableStatusNotes
$__rate_intervalβœ… SupportedComputed as max(step Γ— 4, 60s)
$__rate_interval_msβœ… SupportedMillisecond form of $__rate_interval
$__intervalβœ… SupportedComputed from the current range and panel resolution, bounded by --step
$__interval_msβœ… SupportedMillisecond form of $__interval
$__rangeβœ… SupportedCurrent dashboard time range
$__range_sβœ… SupportedCurrent dashboard time range in seconds
$__range_msβœ… SupportedCurrent dashboard time range in milliseconds

Templating (Variables)

JSON FieldStatusNotes
templating.listβœ… SupportedVariables extracted from dashboard
templating.list[].nameβœ… SupportedUsed as $var or ${var} in queries
templating.list[].current.valueβœ… SupportedUsed as default value
templating.list[].current.textπŸ”Ά PartialUsed as fallback if value is missing
templating.list[].allValueβœ… SupportedUsed when value is $__all, falls back to .*
templating.list[].typeπŸ”Ά Partialquery variables are resolved for Prometheus
templating.list[].queryπŸ”Ά PartialSupports Prometheus label_values(...) and query_result(...)
templating.list[].definitionπŸ”Ά PartialUsed as a fallback query expression for dynamic query variables
templating.list[].datasource❌ Not Implemented
templating.list[].regexπŸ”Ά PartialApplied to dynamic query variable results
templating.list[].sort❌ Not Implemented
templating.list[].multi❌ Not ImplementedMulti-value selection not supported
templating.list[].includeAll❌ Not Implemented
templating.list[].refreshπŸ”Ά PartialDynamic variables refresh before panel queries
templating.list[].options❌ Not ImplementedNo dropdown/picker UI
templating.list[].hide❌ Not Implemented
CLI --var KEY=VALUE overrideβœ… SupportedOverrides dashboard defaults from command line
Config file vars overrideβœ… SupportedOverrides via TOML config

Variable Substitution

PatternStatusNotes
$varnameβœ… SupportedSimple substitution
${varname}βœ… SupportedBraced substitution
${varname:regex}❌ Not ImplementedFormat modifiers not supported
${varname:pipe}❌ Not Implemented
${varname:csv}❌ Not Implemented
${varname:json}❌ Not Implemented
${varname:queryparam}❌ Not Implemented
$__allβœ… SupportedReplaced 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 FieldStatusNotes
fieldConfigπŸ”Ά PartialParsed for supported defaults/custom fields below
fieldConfig.defaultsπŸ”Ά PartialParsed for min/max, thresholds, and selected custom fields
fieldConfig.defaults.unitπŸ”Ά PartialCommon 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βœ… SupportedUsed for Graph y-axis lower bounds, percentage thresholds, and Gauge limits
fieldConfig.defaults.maxβœ… SupportedUsed for Graph y-axis upper bounds, gauge scaling, and threshold boundaries
fieldConfig.defaults.decimalsβœ… SupportedControls numeric precision in panel values, graph axes, legends, and exports
fieldConfig.defaults.color❌ Not ImplementedUses theme palette instead
fieldConfig.defaults.mappings❌ Not ImplementedValue mappings not supported; import diagnostics warn when mappings are ignored
fieldConfig.defaults.noValueπŸ”Ά PartialUsed for null Stat/Table values and exports; empty panels still show Grafatui’s No data state
fieldConfig.defaults.displayName❌ Not Implemented
fieldConfig.defaults.customπŸ”Ά PartialUsed for graph draw style, fill/points, axis placement, stacking metadata, threshold style, and axis grid visibility
fieldConfig.defaults.custom.lineWidth❌ Not ImplementedTUI limitation
fieldConfig.defaults.custom.fillOpacityπŸ”Ά PartialNonzero values enable terminal/SVG area fill; exact browser opacity is approximated
fieldConfig.defaults.custom.pointSizeβ›” Not ApplicableTUI points use fixed terminal-cell markers
fieldConfig.defaults.custom.axisLabel❌ Not Implemented
fieldConfig.defaults.custom.axisGridShowβœ… SupportedControls per-panel autogrid guide lines for graph/time-series panels
fieldConfig.defaults.custom.thresholdsStyleπŸ”Ά Partialmode is parsed for threshold rendering; glyph style is also controlled by Grafatui’s marker setting
fieldConfig.defaults.custom.scaleDistribution❌ Not ImplementedAlways linear
fieldConfig.overrides❌ Not Implemented

Thresholds

JSON FieldStatusNotes
fieldConfig.defaults.thresholdsβœ… SupportedApplied 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βœ… SupportedEvaluated mathematically against metric values
fieldConfig.defaults.thresholds.steps[].colorβœ… SupportedMaps 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 FieldStatusNotes
options❌ Not ImplementedPanel-specific options object is ignored
options.legend❌ Not ImplementedGrafatui uses its own compact legend
options.legend.displayMode❌ Not ImplementedAlways shows inline legend
options.legend.placement❌ Not ImplementedAlways bottom
options.legend.calcs❌ Not ImplementedNo calculated legend values (min/max/avg)
options.tooltip❌ Not ImplementedInspect mode serves as tooltip substitute
options.tooltip.mode❌ Not Implemented
options.orientation❌ Not Implemented
options.reduceOptions❌ Not ImplementedStat/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 ImplementedStat always shows sparkline

Annotations

JSON FieldStatusNotes
annotations❌ Not Implemented
annotations.list❌ Not Implemented

JSON FieldStatusNotes
options.dataLinksβ›” Not ApplicableNo browser navigation in TUI
transformations❌ Not Implemented
transformations[].id❌ Not Implemented(e.g., organize, merge, reduce)

Alert Rules

JSON FieldStatusNotes
alert❌ Not ImplementedPanel-level alerts
alert.conditions❌ Not Implemented
alert.notifications❌ Not Implemented

Datasource Configuration

FeatureStatusNotes
Prometheus (query_range)βœ… SupportedPrimary and only supported datasource
Prometheus (query instant)βœ… SupportedUsed for dynamic template variables and instant panel targets
Prometheus labels APIβœ… SupportedUsed for dynamic variable label_values(...)
Mixed datasource❌ Not Implemented
InfluxDB❌ Not Implemented
Loki❌ Not Implemented
Elasticsearch❌ Not Implemented
Other datasources❌ Not Implemented

Summary Statistics

CategorySupportedPartialNot ImplementedNot Applicable
Dashboard Properties10104
Panel Types71145
Panel Common Fields8062
Targets / Queries3081
PromQL Variables7000
Templating6660
Variable Substitution3050
Field Config46102
Thresholds5000
Panel Options00140
Annotations0020
Data Links / Transforms0021
Alert Rules0030
Datasources3050
Total47138515

Most Requested Missing Features

Based on user feedback, the following missing features are most commonly expected:

  1. Value mappings (fieldConfig.defaults.mappings) β€” Map numeric values to text labels
  2. Broader unit formatting (fieldConfig.defaults.unit) β€” Extend the current common-unit subset to more Grafana unit families
  3. Reduce options (options.reduceOptions) β€” Use min/max/mean/total instead of always using the latest value
  4. Import diagnostics β€” Warn clearly about skipped panel types and ignored high-impact fields
  5. 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 FeatureDescription
8 color themesdefault, dracula, monokai, solarized-dark, solarized-light, gruvbox, tokyo-night, catppuccin
Keyboard navigationVim-style (j/k), arrow keys, page up/down
Panel search/ opens a fuzzy-search popup
Fullscreen modef to focus on a single panel
Inspect modev enables cursor-based point-in-time inspection
Y-axis toggley switches between auto-scale and zero-based
Series toggling1–9 to show/hide individual series
Autogrid toggleg toggles automatic guide lines
Mouse supportClick to select, scroll to navigate, drag cursor in fullscreen
Smart cachingRequest deduplication and caching for identical queries
Client-side downsamplingMax-pooling to ~200 points to preserve peaks
SVG/PNG export and recordingsSave dashboard snapshots or changed-frame recording bundles
TOML configurationPersistent 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.