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.

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.

Example 1

A simple bar chart

The smallest meaningful spec: one panel, one query, a handful of visual properties.

dashboard.json
{
  "schemaVersion": 1,
  "meta": { "title": "Monthly Revenue" },
  "theme": {
    "tokens": {
      "semantic": {
        "chart.series.1": "#5BBFBA",
        "chart.axis.label.color": "#6b7280",
        "chart.grid.line.color": "#f3f4f6"
      }
    }
  },
  "layout": {
    "columns": 24,
    "items": {
      "lg": [{ "i": "rev", "x": 0, "y": 0, "w": 24, "h": 10 }]
    }
  },
  "panels": [{
    "id": "rev",
    "type": "chart:bar",
    "title": "Monthly Revenue",
    "data": {
      "sourceId": "warehouse-prod",
      "query": "SELECT month, SUM(revenue) AS revenue FROM sales GROUP BY month"
    },
    "spec": {
      "xAxis": { "type": "category", "name": "Month" },
      "yAxis": { "type": "value", "name": "Revenue ($k)" },
      "series": [{ "type": "bar", "dataKey": "revenue", "barMaxWidth": 48 }]
    }
  }]
}
Renders as
Monthly Revenue
$400k $300k $200k $100k Jan Feb Mar Apr May Jun Revenue ($k)
Example 2

A multi-panel growth dashboard

KPI metrics across the top, a trend line and stacked bar in the main grid — all from one spec.

growth-dashboard.json
{
  "schemaVersion": 1,
  "meta": { "title": "Growth Dashboard" },
  "layout": {
    "columns": 24,
    "items": {
      "lg": [
        { "i": "kpi-arr",   "x": 0,  "y": 0, "w": 8, "h": 4 },
        { "i": "kpi-users", "x": 8,  "y": 0, "w": 8, "h": 4 },
        { "i": "kpi-nrr",   "x": 16, "y": 0, "w": 8, "h": 4 },
        { "i": "wau-trend", "x": 0,  "y": 4, "w": 14, "h": 9 },
        { "i": "rev-mix",   "x": 14, "y": 4, "w": 10, "h": 9 }
      ]
    }
  },
  "panels": [
    {
      "id": "kpi-arr",
      "type": "metric",
      "title": "ARR",
      "data": { "metricRef": "metric.arr.current" },
      "spec": { "format": "currency", "comparison": "mom" }
    },
    {
      "id": "wau-trend",
      "type": "chart:line",
      "title": "Weekly Active Users",
      "data": { "metricRef": "metric.wau.weekly_series" },
      "spec": {
        "series": [{ "type": "line", "smooth": true, "areaStyle": {} }]
      }
    },
    {
      "id": "rev-mix",
      "type": "chart:bar",
      "title": "Revenue by Plan",
      "spec": { "series": [{ "type": "bar", "stack": "plan" }] }
    }
  ]
}
Renders as
ARR
$1.2M
↑ 18% MoM
Weekly Active Users
4,821
↑ 7% MoM
Net Revenue Retention
118%
↑ 3pp
Weekly Active Users
W1 W4 W8 W12
Revenue by Plan
Q1 Q2 Q3 Q4
Example 3

AI-authored via MCP

Claude receives a natural-language prompt through the DVT MCP server, generates a valid spec, and applies it directly — no copy-paste, no GUI.

Claude + DVT MCP
// Claude receives this prompt via the DVT MCP server:
// "Create a funnel dashboard showing signup → activation → paid
//  conversion for the last 30 days. Use our brand colors."

// Claude calls dvt_dashboard_apply_spec with:
{
  "schemaVersion": 1,
  "meta": {
    "title": "Signup Funnel — Last 30 days",
    "createdBy": { "actorType": "agent", "actorId": "claude-opus-4" }
  },
  "layout": {
    "columns": 24,
    "items": {
      "lg": [
        { "i": "funnel",    "x": 0,  "y": 0, "w": 12, "h": 12 },
        { "i": "cvr-trend", "x": 12, "y": 0, "w": 12, "h": 12 }
      ]
    }
  },
  "panels": [
    {
      "id": "funnel",
      "type": "chart:funnel",
      "title": "Conversion Funnel",
      "data": { "metricRef": "metric.funnel.signup_to_paid_30d" },
      "spec": {
        "steps": ["Signup", "Activated", "Trial", "Paid"],
        "series": [{ "type": "funnel", "label": { "show": true } }]
      }
    },
    {
      "id": "cvr-trend",
      "type": "chart:line",
      "title": "Paid Conversion Rate (trailing 90d)",
      "data": { "metricRef": "metric.cvr.paid_90d_series" },
      "spec": {
        "yAxis": { "type": "value", "axisLabel": { "formatter": "{value}%" } },
        "series": [{ "type": "line", "smooth": true }]
      }
    }
  ]
}
Renders as
Conversion Funnel
Signup — 10,000 Activated — 6,200 Trial — 2,400 Paid — 840
Paid CVR (trailing 90d)
12% 9% 6%
Generated by Claude via dvt_dashboard_apply_spec

Open spec, published schema

The DVT spec format is Apache-2.0 licensed and will ship with a published JSON Schema — 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.

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.