Composable widgets

Dashboards

Mark a Postgres view as `type: "dashboard_widget"` in its comment and it appears as a widget on the schema dashboard, with permissions inherited from the underlying view.

0.supasheet.app / crm / dashboard
MRR
$148.2k+12.4%
Open deals
294+8.1%
Win rate
34.7%-1.2%
Revenue trendarea
Pipeline by stagebar
MRR last 12 weekstrend
Active userstrend
Avg deal sizetrend
What it does

The capabilities you get out of the box.

Capability01

SQL-defined widgets

A view is a widget. No widget builder, no JSON config.

Capability02

Permission-scoped

Users only see widgets whose underlying view they can SELECT.

Capability03

Per-schema

Each schema gets its own dashboard - perfect for multi-tenant or multi-domain apps.

How it works

Three steps from SQL to UI.

  1. 01
    Create a viewAggregate, join, window - any SQL is fair game.
  2. 02
    Tag itAdd `{"type": "dashboard_widget"}` to the view comment.
  3. 03
    DoneIt shows up on the next dashboard load with the right chart type.
example/dashboards.sql
sql
-- KPI card: count of open deals.
create or replace view crm.deal_pipeline_summary
with (security_invoker = true) as
select count(*) as open_deals
from crm.deals
where stage not in ('won', 'lost');

comment on view crm.deal_pipeline_summary is '{
  "type": "dashboard_widget",
  "name": "Open deals",
  "widget_type": "card_1"
}';

-- Table widget: latest 10 deals.
create or replace view crm.recent_deals
with (security_invoker = true) as
select id, name, value, stage, owner_id, created_at
from crm.deals
order by created_at desc
limit 10;

comment on view crm.recent_deals is '{
  "type": "dashboard_widget",
  "name": "Recent deals",
  "widget_type": "table_1"
}';
Get started

Try it on your own Supabase project.

Connect a project, install the Supasheet schema, and your tables are live in minutes.

No credit cardSelf-host or managedMIT licensed