Grafana Dashboard JSON Compatibility
This document provides a comprehensive feature-parity table between the Grafana dashboard JSON models and what Grafatui currently supports.
Snapshot: Grafatui v0.1.13. 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 Schema Models
Grafatui imports the non-resource Classic JSON model and recursive GridLayout,
RowsLayout, TabsLayout, and AutoGridLayout containers from the V2 Resource JSON model. In Grafana 13, use
Export as code β Advanced options β Model: Classic as the fallback for
unsupported advanced V2 dashboards. See the
dashboard import guide for detailed steps.
| Model | Status | Notes |
|---|---|---|
| Classic JSON | β Supported | Accepted by --grafana-json; the remaining tables describe support for its fields |
| V1 Resource JSON | β Not Implemented | The Kubernetes-style dashboard.grafana.app/v1 resource envelope is not accepted |
| V2 Resource JSON | πΆ Partial | Exact dashboard.grafana.app/v2 resources with recursive grid, row, tab, and AutoGrid layouts are supported |
| V2 Resource YAML | πΆ Partial | The same V2 subset, read from .yaml/.yml files |
V2 Resource Subset
| V2 field or behavior | Status | Notes |
|---|---|---|
Exact apiVersion: dashboard.grafana.app/v2 | β Supported | Other resource versions are rejected |
| Grafana 13 Export as code and API output | β Supported | Absent or null lists and objects (links, transformations, options, overrides, variables, β¦) are treated as empty, as Grafanaβs API serializes them |
| Share dashboard with another instance exports | β Supported | Queries without a datasource use the configured Prometheus; cleared query variable selections resolve dynamically |
spec.layout.kind: GridLayout | β Supported | GridLayoutItem coordinates map to Grafatuiβs fixed 24-column grid |
spec.layout.kind: RowsLayout | β Supported | Nested grid, row, tab, and AutoGrid children preserve row titles, nesting, collapsed state, and hidden-header transparency |
spec.layout.kind: TabsLayout | β Supported | Nested grid, row, tab, and AutoGrid children preserve titles and show one active tab per group |
data.spec.queryOptions interval, maxDataPoints | β Supported | As for Classic panel interval and maxDataPoints; a queryβs interval sets its min step |
Inline Panel elements | β Supported | Supported panel visualization groups map through the Classic-equivalent importer |
Prometheus PanelQuery queries | β Supported | prometheus, grafana-amazonprometheus-datasource, and grafana-azureprometheus-datasource query groups are imported; other datasources emit import diagnostics and are skipped |
RowsLayoutRow.spec.fillScreen | β Not Applicable | Accepted and ignored; terminal rows size to their content |
Top-level spec.variables | πΆ Partial | Supported variable kinds map to Grafatui variables; unsupported kinds emit diagnostics |
spec.variables[].spec.refresh | β Supported | never, onDashboardLoad, and onTimeRangeChanged control initial and manual/time-range resolution |
spec.timeSettings.autoRefresh | β Supported | Used as the dashboard refresh interval |
vizConfig.spec.fieldConfig | πΆ Partial | The supported Classic-equivalent field configuration subset applies |
AutoGridLayout | β Supported | Ordered panels at root or inside rows/tabs; responsive columns, fillScreen, table content fitting, minimum/maximum heights and row matching share TUI, hit-test, scroll, and export geometry; repeats and conditional visibility use scoped variables |
| Repeated grid items and row repeat | β Not Implemented | Rejected as fatal import errors |
| Row/tab local variables | πΆ Partial | Supported variable kinds retain scopes for descendant panel queries, AutoGrid repeats and predicates; a newly visible scope resolves its variables once |
| AutoGrid item conditional rendering | β Supported | Variable, query-data and time-range conditions; AND/OR and show/hide composition |
| Row/tab conditional rendering | β Not Implemented | Deferred V2 feature |
LibraryPanel elements | β Not Implemented | Exports reference library panels by uid only; they are skipped with a diagnostic. Export with Share dashboard with another instance enabled to inline them |
Static AutoGrid sizing
Stages 1β3 support AutoGridLayoutItem panel references in source order, including
empty groups, collapsed rows, and inactive tabs. Column counts respond to the
available terminal width. Resizing preserves panel selection and adjusts scroll
to keep it reachable. SVG/PNG snapshots and recordings use the same layout.
| AutoGrid setting | Supported behavior |
|---|---|
maxColumnCount | Default 3; finite values at least 1; fractions round down and emit autogrid_column_limit_rounded (rejected by --strict) |
columnWidthMode | narrow, standard, wide, or custom; default standard |
columnWidth | Positive finite pixels required for custom; rounds upward to cells |
rowHeightMode | short, standard, tall, or custom; default standard |
rowHeight | Positive finite pixels required for custom; rounds upward to cells |
matchRowHeights | Boolean; default true stretches siblings to their row track; false retains each panel contribution, leaving unused gaps |
fillScreen | Boolean; default false. True grows rows to fill their containing content viewport, preserving baseline minimum heights |
Layout/item fitContent | Boolean; layout default false, item omission inherits layout, explicit true/false overrides it. Tables fit visible rows or wrapped errors; other renderers retain baseline height |
minHeightMode, minHeight | Omission inherits row height; none removes the floor; short/standard/tall use 10/18/29 cells; custom requires positive finite pixels rounded upward |
maxHeightMode, maxHeight | Omitted/unlimited has no cap; short/standard/tall use 10/18/29 cells; custom requires positive finite pixels rounded upward. Only custom consumes maxHeight |
Item repeat, conditionalRendering | Selected-value repeats and scoped variable, data, and time-range conditions; detailed below |
| Unknown settings | Emit unsupported_autogrid_setting; --strict rejects the warning |
The logical scale is 10 pixels per column and 18 pixels per row, shared with
exports. Width presets become 20/45/77 columns; height presets become 10/18/29
rows. Panels use the widest fitting column count, capped by maxColumnCount
and item count, with at least one column. Remainder cells go to earlier columns.
These are terminal adaptations; panel dimensions do not scale with font size.
Run the static example with:
grafatui --grafana-json examples/dashboards/grafana_v2_autogrid.json \
--prometheus-url http://localhost:9090
With fillScreen: true, extra height is shared across row tracks, with remainder
cells assigned to earlier rows. Each visible row header or tab bar deducts one
cell from its child viewport; hidden row headers deduct nothing. Minimum row
heights can overflow and scroll. Scrolling and preceding siblings do not change
the allocation; following siblings begin after the filled gridβs full extent.
Empty grids consume no height. This setting does not enter single-panel fullscreen.
Run the fill-screen example with the same command, substituting its filename.
Table fitting counts only visible series, preserving existing ordering, value
formatting, threshold colors and single-row cell clipping. A nonempty table needs
N + 4 cells for N rows, its column header, margin and borders; an empty table
needs 3. Widths with no body space need only borders. Unsupported renderers
(graph, unknown, stat, gauge, bar gauge, heatmap), including their errors, retain the baseline. Table errors fit their wrapped body lines plus two border cells.
A missing minimum inherits rowHeight; supplied dimensions are validated even
when their mode does not consume them. Fixed panels still contribute their full
baseline to prevent overlap beside shorter fitted tables.
With fitting, row tracks follow the tallest contribution. fillScreen distributes
only extra height above those tracks and keeps a baseline track floor.
matchRowHeights: false keeps individual heights even in filled grids; unused
gaps have no click target. This setting now also prevents fixed panels from
stretching during fill growth. Dashboard scrolling reveals lower fitted table
rows while keeping the clipped panel title and table header visible. Refreshes
reconcile focus and scroll after table data grows or shrinks. SVG/PNG and
recordings use the same row window and logical 18-pixel spacing.
Run the content-fit example with the same command, substituting its filename.
Maximum heights bound fitting panels, including after row matching and fill
stretch a track. The minimum wins when it exceeds the maximum. Ordinary panels
keep their baseline sizing. To use a short cap below the standard row height,
set minHeightMode: none, as in the bounded example.
Capped fitting tables have independent body offsets. Ctrl+Up/Ctrl+Down
scroll one row, Ctrl+PgUp/Ctrl+PgDn page, and Ctrl+Home/Ctrl+End reach
the first/last window. Borders and table headers stay fixed; error bodies use
the same controls and wrapped lines in TUI, SVG/PNG and recordings. Only the
selected overflowing body owns unmodified wheel input; headers, borders, gaps,
other panels and Shift+wheel keep dashboard scrolling. Search and annotation
modals retain their controls.
Fullscreen bypasses the cap and uses its visible body capacity, including when a tiny cap cannot fit data. The same offset is clamped on entry/exit, resize, data or visibility changes. Changing errors and error recovery reset it; row collapse and inactive tabs retain offsets until reactivation. Ordinary and unlimited-fit fullscreen keep their existing presentation.
AutoGrid layout semantics are supported for Grafatuiβs panel renderers and data sources. Selected variable lists retain source order and labels; All repeats concrete options instead of a query regex. Containing row/tab declarations shadow dashboard values, and each repeated panel has its own binding. Surviving instances retain data, focus and body scroll when selections change.
Item conditions support all four variable operators, query-data presence and range duration with AND/OR and show/hide composition. Pending results are omitted; a group without known results remains visible. Invalid regexes return true as in Grafana; invalid intervals remain pending. Month/year intervals use fixed 30/365 day durations; the upstream condition rejects milliseconds and truncates a decimal interval count before applying its unit. Hidden data-dependent instances continue refreshing while their containing row/tab is active. Variable/time-hidden items without a data predicate skip queries. Hidden items reserve no grid cells.
Run the dynamic example
against Prometheus to repeat up tables for the selected instances. Zooming beyond
one hour hides those tables through the range condition. Repeated rows/tabs and
their conditional settings, library panels and transformations remain separate
compatibility work.
Unsupported settings fail during import, including inside inactive tabs and collapsed rows.
V2 resources are accepted as JSON or YAML. Use a Classic export for any advanced V2 dashboard outside this grid, rows, tabs, and AutoGrid subset.
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 | β Supported | Headers, nested rows, and collapsed state are rendered and interactive |
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 |
timeFrom / timeShift / hideTimeOverride | β Not Implemented | Ignored without a diagnostic; panels use the dashboard range |
interval | β Supported | Panel min interval, including > prefixes and variables; invalid values emit a diagnostic. See query resolution |
maxDataPoints | β Supported | Sets how many steps a range query divides the time range into; defaults to 1000 |
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) | β Supported | Initial collapsed state is preserved and interactive |
panels (nested in row) | β Supported | Nested panels and rows retain their hierarchy |
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 | β Supported | Per-query min step; overrides the panel interval |
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 | max($__interval + scrape interval, 4 Γ scrape interval), as in Grafana; the scrape interval is the queryβs min interval or --scrape-interval (default 15s) |
$__rate_interval_ms | β Supported | Millisecond form of $__rate_interval |
$__interval | β Supported | The exact configured step/--step, or, when absent, the range divided by maxDataPoints (default 1000), rounded as Grafana does, no finer than the imported/default min interval, and within Prometheusβs 11,000-point limit |
$__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 | β Supported | 0 keeps a saved value, 1 resolves on load, and 2 also resolves on manual/time-range changes; periodic panel refreshes do not re-run variables |
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; exact numeric-to-text value mappings are supported, while
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 | πΆ Partial | Exact numeric value mappings render mapped text in Stat, Gauge, BarGauge, Table, graph legends, and exports; range, regex, special-value, and mapping-color behavior is not implemented, and unsupported mapping kinds produce import diagnostics |
fieldConfig.defaults.noValue | πΆ Partial | Used for null Stat/Gauge/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 | πΆ Partial | Graph presentation and Stat/Gauge/BarGauge reduction subsets are imported |
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 | πΆ Partial | Classic and V2 Stat/Gauge/BarGauge support one calculation per series over raw range samples; an explicit target instant setting still wins. Unsupported settings warn and retain default selection. |
options.reduceOptions.calcs | πΆ Partial | last, lastNotNull, min, max, mean, and sum (Total); empty list defaults to last. Multiple or unknown calculations are unsupported. |
options.reduceOptions.fields | πΆ Partial | Only omitted or empty selection; nonempty field filters and values: true are unsupported. limit has no effect when values is false. |
options.textMode | β Not Implemented | |
options.colorMode | β Not Implemented | |
options.graphMode | β Not Implemented | Stat always shows sparkline |
Annotations
| JSON Field | Status | Notes |
|---|---|---|
annotations | β Not Implemented | External file/command providers do not implement this Grafana field. |
annotations.list | β Not Implemented | External file/command providers do not implement this Grafana field. |
Grafatui external file/command JSONL events are a separate, opt-in read-only source.
panel_titles is Grafatuiβs external-source routing field: it matches eligible
graph/timeseries panel titles exactly, not Grafana panel IDs. It does not imply
compatibility with Grafana annotation queries, APIs, annotations, or
annotations.list.
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 | Dynamic label_values(...) requests include the active start/end window and an optional match[] selector |
| 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 | 8 | 0 | 14 | 5 |
| Panel Common Fields | 11 | 0 | 5 | 2 |
| Targets / Queries | 4 | 0 | 7 | 1 |
| PromQL Variables | 7 | 0 | 0 | 0 |
| Templating | 6 | 6 | 6 | 0 |
| Variable Substitution | 3 | 0 | 5 | 0 |
| Field Config | 4 | 7 | 9 | 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 | 52 | 13 | 82 | 15 |
Most Requested Missing Features
Based on user feedback, the following missing features are most commonly expected:
- Broader unit formatting (
fieldConfig.defaults.unit) β Extend the current common-unit subset to more Grafana unit families - Broader reduce options (
options.reduceOptions) β Add field filters, all-values mode, and multiple calculations beyond the supported single-calculation subset - Broader value mappings (
fieldConfig.defaults.mappings) β Add range and useful special-value mappings beyond exact numeric labels - 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 on 2026-10-13. If you notice any inaccuracies, please open an issue or PR.