Build a SQL Dashboard in 10 Minutes with Shaper: DuckDB's Open-Source Viz Tool

Shaper is an open-source, SQL-driven dashboard tool powered by DuckDB. Write SQL — get charts. No JavaScript, no drag-drop, no monthly fees. Here's how to build a professional dashboard in 10 minutes.

The Problem: Data Visualization is a Pain

You’ve got your data neatly organized in DuckDB. Your boss wants a dashboard — yesterday.

Your options:

  • Tableau → $75/user/month. For a 3-person team that’s $2,700/year.
  • Metabase → Free but heavy. Need a separate server, Java runtime, lots of config.
  • Python + Plotly → 200+ lines of code for what should be a 5-line query.
  • Excel charts → 1990 called, they want their workflow back.

What if you could just write SQL and get a chart?

Shaper is exactly that — an open-source, SQL-driven dashboard tool powered by DuckDB under the hood. Write SQL queries with type annotations, and Shaper renders them as bar charts, line charts, pie charts, tables, and more.

GitHub: https://github.com/taleshape-com/shaper (1.1k ⭐, actively maintained)


What is Shaper?

Shaper’s positioning is crystal clear: the DuckDB visualization layer for SQL users.

“As Official says: All in SQL, Powered by DuckDB.”

The core idea: You don’t need to learn any new API or DSL. Just append ::BARCHART, ::XAXIS, etc. to your SQL columns and Shaper figures out how to visualize them.

-- Shaper SQL example
SELECT
  date_trunc('week', created_at)::XAXIS,
  category::CATEGORY,
  count()::BARCHART_STACKED
FROM dataset
GROUP BY ALL ORDER BY ALL;

This SQL produces a stacked bar chart — no JavaScript, no JSON config, no drag-and-drop.

Key Features

CapabilityDescription
Fully Open SourceMPL-2.0 license, self-hosted
SQL-FirstDefine charts via SQL type annotations
Git WorkflowVersion-control your dashboards
Multi-SourceQuery across DuckDB, CSV, Parquet, MySQL, Postgres
White-Label EmbedEmbed in iframe or via JS/React SDK without branding
ExportPDF, PNG, CSV, Excel with one click
Scheduled ReportsAuto-generate and deliver reports
Row-Level SecurityJWT tokens for data access control

10-Minute Quickstart

Minute 1: Start Shaper

The fastest way to try Shaper is via Docker:

docker run --rm -it -p5454:5454 taleshape/shaper

Open http://localhost:5454 — you’ll see a clean dashboard editor.

No Docker? Shaper also ships as npm and pip packages:

  • npm install @taleshape/shaper
  • pip install shaper

Minutes 2-5: Import Data + First Query

Click “New Query” and write your first SQL:

-- See what we're working with
SELECT * FROM read_csv_auto('sales_2024.csv') LIMIT 10;

Shaper uses DuckDB’s engine natively, so all DuckDB features work — read_csv_auto, read_parquet, ATTACH for MySQL/PostgreSQL…

Now for a real chart:

SELECT
  strftime(order_date, '%Y-%m')::XAXIS,
  product_category::CATEGORY,
  SUM(amount)::BARCHART_STACKED
FROM read_csv_auto('sales_2024.csv')
GROUP BY ALL ORDER BY ALL;

Minutes 6-10: Assemble Your Dashboard

Add more queries to build a complete dashboard:

KPI Card:

SELECT
  'Total Revenue'::LABEL,
  '$' || FORMAT('%,.0f', SUM(amount))::VALUE,
  'vs last month ' || CASE WHEN SUM(amount) - LAG(SUM(amount)) OVER () > 0 THEN '↑' ELSE '↓' END || FORMAT('%.1f%%', ABS((SUM(amount) - LAG(SUM(amount)) OVER ()) / LAG(SUM(amount)) OVER () * 100))::SUBTITLE
FROM read_csv_auto('sales_2024.csv');

Trend Line:

SELECT
  order_date::XAXIS,
  SUM(amount)::LINE
FROM read_csv_auto('sales_2024.csv')
GROUP BY ALL ORDER BY ALL;

Top 10 Products:

SELECT
  product_name::LABEL,
  SUM(amount)::BARCHART
FROM read_csv_auto('sales_2024.csv')
GROUP BY ALL ORDER BY SUM(amount) DESC LIMIT 10;

Ten minutes. A 4-component professional dashboard. All SQL. No frontend code.


Advanced Features

4.1 KPI Monitoring & Alerts

Shaper supports scheduled scans that trigger alerts when metrics cross thresholds:

-- Alert if today's sales < $10,000
SELECT
  SUM(amount)::VALUE,
  CASE WHEN SUM(amount) < 10000 THEN '🚨 Below Target'
       ELSE '✅ On Track' END::STATUS
FROM read_csv_auto('sales_2024.csv')
WHERE order_date = CURRENT_DATE;

4.2 Embedded Dashboards

Want to embed dashboards in your product? Shaper supports:

  • iframe embedding: One line of HTML
  • JS/React SDK: Full control over styling, no iframe needed
  • White-label mode: Hide Shaper branding
<!-- iframe embed -->
<iframe src="https://your-shaper.com/d/sales-dashboard"
        width="100%" height="600px"
        frameborder="0"></iframe>
// React SDK approach
import { ShaperDashboard } from '@taleshape/shaper-react';

function App() {
  return <ShaperDashboard dashboardId="sales-dashboard"
                          token="your-jwt-token" />;
}

4.3 Scheduled PDF Reports

Configure a cron job to generate PDF reports on schedule:

# Export via CLI
curl -X POST https://your-shaper.com/api/dashboards/sales-weekly/export \
  -H "Authorization: Bearer your-token" \
  -d '{"format": "pdf"}'

When Should You Use Shaper?

Best for:

  • Teams already using DuckDB for data analysis
  • SQL analysts who need quick charts
  • Developers building client-facing dashboards
  • Backend engineers who want to avoid JavaScript

Not ideal for:

  • Complex interactive dashboards with drill-down animations
  • Non-technical users who need drag-and-drop (Shaper is SQL-driven)

Bottom line: If you already use DuckDB, Shaper is the shortest path from query to dashboard to share.


Monetization Ideas

Shaper is free and open-source, but it opens up several business opportunities:

  1. DuckDB + Shaper Dashboard Service: Build data dashboards for SMBs, $300-800/project
  2. Embedded Analytics Module: Integrate Shaper dashboards into your SaaS product
  3. Shaper Training + Templates: Video courses or downloadable dashboard templates
  4. Industry-Specific Dashboard Packs: Pre-built templates for e-commerce, logistics, finance

Summary

Shaper fills the missing visualization layer in the DuckDB ecosystem. It bridges the gap between “querying data with SQL” and “seeing charts that drive decisions” — no new tools, no frontend code, just the SQL you already know.

10 minutes. Zero to a professional dashboard. That’s Shaper’s promise.

Get started now:

docker run --rm -it -p5454:5454 taleshape/shaper

Open http://localhost:5454 and give it a try.