Spec

A dashboard is a JSON document.

Every dvt dashboard (its theme, layout, panels, and visual properties) lives as a versioned JSON spec in dvt's database. Update it via API or MCP call. No deploy pipeline for a chart color change.

Edit the raw JSON and watch it render, like Slack's Block Kit Builder, for dashboards. Bring your own AI: the skill teaches any harness to write dvt specs.

Edit the spec, watch it render

Left is the source of truth. Right is what ships.

The whole dashboard is the JSON on the left: flip between examples and see the same engine dvt ships render it live.

dashboard.json
{
  "schemaVersion": 1,
  "meta": { "title": "Monthly Revenue" },
  "theme": { "tokens": { "semantic": {
    "chart.series.1": "#4F46E5"
  } } },
  "panels": [{
    "id": "rev",
    "type": "chart:bar",
    "title": "Monthly Revenue",
    "data": {
      "sourceId": "warehouse-prod",
      "query": "SELECT month, SUM(revenue) AS revenue\n               FROM analytics.sales GROUP BY month"
    },
    "spec": {
      "xAxis": { "type": "category", "name": "Month" },
      "yAxis": { "type": "value", "name": "Revenue ($k)" },
      "series": [{ "type": "bar", "barMaxWidth": 48 }]
    }
  }]
}
Renders as: live ECharts

Dashboards as Data (DAD)

Live, not deployed

Dashboard specs are database records: update one via REST API or MCP and it's live instantly. dvt tracks every revision server-side. Export to git if you want GitOps; it's never required.

AI-authored

Claude can POST a valid spec to the dvt MCP server and the dashboard appears: no GUI clicks, no screenshots, no copy-pasting JSON by hand.

Fully customizable

Every visual property, down to the gap between an axis and its title, is a named, storable parameter in the spec. Nothing is locked by the tool.

Deterministic

Same spec → same pixels, every time. Validate a spec before saving it. Preview changes before applying them. AI agents get a preview loop before persisting.

Tables are a first-class visual

A table in dvt is not just rows and columns.

The table element carries a full presentation vocabulary: all of it declared in the spec, all of it dvt Core, all computed client-side over rows you already fetched.

Conditional formatting

A real predicate grammar (eq / gt / between / in / topN / bottomN, cross-column references, and any/all combinators) styling a cell or a whole row.

Colour-scale heatmaps

Continuous per-column encoding: numeric, quantile, or binned, over named ramps (blues, viridis, rdbu…) with an auto or fixed domain.

In-cell visualizations

Sparklines, data bars, bullet bars, win/loss strips, dots, icons, and images, rendered inside the cell, driven by sibling columns.

Grouping & subtotals

Nested row groups with per-group subtotals and a grand total, collapsible from the header. No pivot required.

Pivot / cross-tab

Rows × columns cross-tabs with sum / weighted-average aggregation, generated value columns, and row/column/grand totals.

Spanning headers

Multi-row grouped column headers so a wide cross-tab reads as "FY26 revenue → Q1 · Q2 · Q3", not a flat wall of columns.

Resizable, wrapping columns

Drag a column border to resize (40–1200px); wrap long text over multiple lines with a show-more toggle. Sort and filter per column.

Warehouse-comment headers

Pull column headers and tooltips straight from your warehouse COMMENT metadata: the table documents itself from the source.

Interactive, not just rendered

Filters, cross-filtering, drill-downs, and context menus. Declared in the spec, no imperative event code.

Filters

12 control kinds (select, multiselect, date-range, number-range, search, toggle, number, segmented, radio, button-group, checkbox-list, top-N), bound to named SQL parameters, never string-interpolated.

Cross-filter (brush)

Drag-select a region of a chart to filter (or just highlight) every other panel on the page.

Drill down

Right-click a datapoint to navigate to a detail page with the clicked value bound as a parameter.

Context menus

Declarative right-click actions (filter, drill, open link, copy, export, or open an overlay), templated from the clicked row. No code.

Overlays

Present a target page as a modal or drawer without leaving the dashboard: a superset of drill-down.

Relative dates

Timezone-aware presets (last 7d, 30d, MTD, QTD, YTD, all-time), resolved at view time.

More than charts

The spec carries everything a dashboard needs. Not just the picture.

Themes & tokens

Every visual property, down to the gap between an axis and its title, is a named, storable token. Org and dashboard themes cascade.

Metric KPIs

Stat panels with currency/percent formatting, period comparisons, deltas, and inline sparklines. Declared, not configured by hand.

AI authoring via MCP

Claude POSTs a valid spec through the dvt MCP server and the dashboard appears: no GUI clicks, no screenshots, no pasted JSON.

Validate → preview → apply

Validate any spec before saving, preview changes before applying. Same spec → same pixels, deterministically, every time.

Geo & maps

Choropleths and geographic flows over bundled USA / world boundaries, or drive geography straight from a GeoJSON column.

Built-in doc layer

Panels carry their own intent, assumptions, and the exact query that built them: the documentation travels inside the spec.

Open spec, published schema

The dvt spec format is Apache-2.0 licensed, and a published JSON Schema is on the way, enabling validation, editor autocompletion, and AI self-correction without needing to query a running server. The spec travels with your data, not with dvt's infrastructure.

The schema is in active design. The examples above reflect the current working draft: field names and structure may shift before v1.

You've already tried the format in the builder above. Early access is how it runs on your own warehouse, arranged directly with us.

Follow the build →

Follow the build

dvt is in founding research. Leave your email and we'll reach out when there's something to see — no newsletters, no noise.

No spam. We use this to reach out directly, nothing else.