In this tutorial you’ll upload a CSV, write a few SQL transforms, and arrange the results into an interactive dashboard with cross-filtering — all in the app, in about 15 minutes. Every visual is a block bound to a node in your project’s computation graph, so when the data updates, the dashboard updates with it.
Prefer to drive it from an AI client instead of the UI? The MCP pipeline tutorial builds the same kind of graph through Claude Code or Cursor. This page is the point-and-click path.

What you’ll build

A sales dashboard with four blocks over one uploaded dataset:
  • Revenue by region — bar chart
  • Monthly trend — line chart
  • Top products — table
  • A region filter — click any bar to cross-filter the rest

Prerequisites

  • A Panels account (sign up free).
  • A CSV of sales data with roughly these columns: order_date, region, product, amount. Don’t have one? Any CSV works — adjust the column names in the SQL below to match yours.

Build it

1

Create a project

From your workspace, create a new project. A project owns one computation graph and every view built on top of it.
2

Upload your CSV

Upload the CSV into the project. The upload becomes a source node — the immutable, content-addressed starting point of your graph. Panels infers column types on ingest; you’ll see a preview with the detected schema and row count.
An uploaded file is stored as-is (the bronze layer). Everything downstream is derived from it with SQL, so you can re-shape freely without ever mutating the original data.
3

Shape the data with SQL

Add a SQL node for each metric. Reference the upstream node by its name, unqualified — the project schema is already the default. The engine is DuckDB, so use DuckDB spellings like date_trunc.Revenue by region:
Monthly trend:
Top products:
Run each node (the run button, or Cmd+Enter). Each materialises its result and reports a row count — the outputs your dashboard blocks will bind to.
4

Create a dashboard view

Click New view in the project sidebar and choose Dashboard. A dashboard is a grid-layout view over the same graph — distinct from a notebook, which is a sequential document. Give it a name like Sales overview.
5

Add chart and table blocks

Add a block for each node you created and bind it to that node’s output:
  • A chart block on revenue by regionbar, region on the category axis, revenue on the value axis.
  • A chart block on monthly trendline, month on the x-axis.
  • A table block on top products.
Blocks reference graph nodes, so they always reflect the latest run — there’s no separate copy of the data to keep in sync.
6

Turn on cross-filtering

Cross-filtering is automatic in a dashboard: click a bar in the revenue-by-region chart, and every other block re-filters to that region. No wiring — Panels composes the filter into the downstream queries server-side and re-runs the affected blocks. Click the selection again to clear it.For a persistent control rather than click-to-filter, add a selection bound to region (the same mechanism, surfaced as a dropdown). See cross-filter selections for how the wiring works underneath.
7

Share it

Publish the dashboard and create a share link to give teammates or clients a read-only, always-current view — no account required for viewers. The link reflects live data every time it’s opened, not a static snapshot.

Next steps

Build a pipeline with the MCP

Author and run the same kind of graph programmatically from an AI client.

Visualization nodes

Chart types, tables, maps, and KPI metrics in depth.