dashb0rd
Public beta · Self-host or dashb0rd Cloud

Dashboards as code. Ship a status board in a pull request.

dashb0rd is the dashboards-as-code platform your team actually versions. Define status pages, KPI boards and ops consoles in TypeScript, commit to git, and every PR gets a preview URL. Rollbacks are a git revert.

Widget primitives
24
Data source adapters
12
PR → preview
< 60s
Price per public board
$0
The widgets

Six primitives. Endless boards.

Every widget is a typed React component you import from @db0/widgets. Compose them into boards with a single defineDashboard() call.

Metric· KPI tile

@db0/widgets

A big number with a delta, sparkline and threshold-aware colouring.

Checkout p95
312ms
-8% vs 7d

Status· Uptime

@db0/widgets

Service status grid with history bars and colour-coded incident windows.

api
web
worker
cdn

Timeline· Events

@db0/widgets

Ordered events with tags, owners and links — deploys, incidents, releases.

  1. 12:04deploy · v4.28.1
  2. 09:41incident · edge 5xx
  3. 07:12rollback · v4.28.0

Grid· Table

@db0/widgets

Sortable, filterable data grid that renders from any JSON source.

ForkRegionp95
signalarn1184ms
atlassfo1202ms
foyeriad1141ms

Log stream· Tail

@db0/widgets

Live log tail with regex highlighting and severity filters. ANSI-aware.

INFO  deploy built commit=8a2f1  
INFO edge cache warmed arn1=ok
WARN queue depth 148 > threshold 100
ERR checkout-api 503 upstream

Regions· Map

@db0/widgets

Deployment regions map with per-region latency and active traffic.

One file, one board

A dashboard is a file. A deploy is a commit.

Drop a TypeScript file in dashboards/, export a defineDashboard() result, and dashb0rd renders it — with typed data sources, auth rules and threshold-driven alerts.

  • Preview URL per PR — review dashboards the same way you review code.
  • Access is data — access: "team", "public" or a callable.
  • Data sources are typed adapters — Vercel, Postgres, Stripe, Linear, your own.
// dashboards/ops.tsx
import { defineDashboard, Metric, Status, Timeline } from "@db0/widgets";
import { vercel, statuspage, postgres } from "@db0/sources";

export default defineDashboard({
  slug: "ops",
  title: "Ops — fleet health",
  owner: "@platform",
  access: "team",
  widgets: [
    Metric({
      title: "Checkout p95",
      source: vercel.metric("fn.duration.p95", { tag: "checkout" }),
      unit: "ms",
      threshold: { warn: 400, error: 800 },
    }),
    Status({
      title: "Services",
      source: statuspage.components(),
    }),
    Timeline({
      title: "Deploys · incidents",
      source: postgres.query(`SELECT ts, kind, label FROM events ORDER BY ts DESC LIMIT 25`),
    }),
  ],
});
From repo to prod

Three steps. One git workflow. Zero yak-shaving.

  1. 01
    Install the CLI

    pnpm add -D @db0/cli and run dashb0rd init. Your repo gets a dashboards/ folder and a GitHub App hook.

  2. 02
    Write a dashboard

    A dashboard is one TypeScript file. Compose widgets, wire typed sources, commit the file.

  3. 03
    Open a PR

    Every PR gets a live preview URL. Merge to main and the board goes live on dashb0rd Cloud or self-hosted.

# bootstrap dashb0rd in any Next.js repo
pnpm add -D @db0/cli
pnpm dashb0rd init

# add your first board
pnpm dashb0rd new ops

# review it in a PR
git checkout -b feat/ops-board && git commit -am "feat: ops board" && gh pr create
What teams ship

Four dashboards most teams rebuild every year.

Ops

Internal ops board

Deploys, incidents, queue depth, error rate. One TS file, owned by platform, access-scoped to the team.

Public

Public status page

Ship status.yourco.com as a PR. Markdown incident posts in the same repo, RSS + subscriber webhook included.

Exec

Weekly KPI board

MRR, churn, activation and magic numbers — pulled from Stripe + Postgres, versioned in the analytics repo.

Product

Release war room

Launch-day dashboard per feature flag: rollout %, error delta, support tickets. Archived with the launch PR.

The stack

Opinionated where it matters. Boring where it should be.

TypeScript-first

Dashboards are typed. Widgets are typed. Data sources are typed. Autocomplete every field, catch regressions at build time.

Git-native

Version, review, revert. Every PR opens a preview URL. Rollbacks are `git revert`, not a form in a SaaS UI.

Next.js 16 runtime

Server Components by default, Cache Components per board, streamed widgets. Installs in any Next.js repo.

Vercel Fluid Compute

Dashboard renders reuse instances with graceful shutdown. 300s timeouts for the slowest report.

Data adapters

Typed adapters for Vercel, Postgres, Stripe, Linear, PostHog, Prometheus, GitHub and a generic HTTP source.

Self-host or Cloud

Ship to your own Next.js app with @db0/runtime, or point the CLI at dashb0rd Cloud. Same code either way.

Pricing

Free to self-host. Paid when you want hosting off your plate.

Open core

$0self-host

The dashb0rd runtime and widgets, MIT-licensed. Drop into any Next.js repo.

  • @db0/runtime · @db0/widgets · @db0/sources
  • MIT licence, MIT-forever
  • Public boards on your own domain
  • GitHub App for PR previews

Cloud

Most popular
$24/ editor / month

Hosted dashb0rd with managed previews, team auth, scheduled refresh and alerts.

  • Everything in Open core
  • Hosted previews (no Vercel project per board)
  • Team auth (SSO, scoped API tokens)
  • Scheduled refresh + alert webhooks
  • Private board sharing links

Enterprise

Let's talkinvoice-billed

Single-tenant deploy, audit log, SAML and SLA for teams that need a data vault.

  • Everything in Cloud
  • Single-tenant region (EU or US)
  • SAML, SCIM, audit log export
  • Private source adapters
  • 99.95% uptime SLA

Your next dashboard belongs in a pull request.

Install the CLI, commit one file, merge the PR. That's the whole loop. No more screenshots taped into Notion.