Dashboards
Build and share interactive dashboards with widgets, charts, and real-time data.
Dashboards let you combine multiple visualizations into a single view. You arrange widgets on a flexible grid, connect them to live data, and share the results with your team or publicly via link.
Creating a dashboard
Click New Dashboard from the Dashboards section. Provide a name, an optional description, and choose a scope:
| Scope | Visibility | Who can edit |
|---|---|---|
| Personal | Only you | You |
| Company | All users in your organization | Admins only |
The dashboard opens in edit mode with an empty first page, ready for widgets.
Pages
Dashboards support multiple pages to organize different views or report sections. Page tabs appear at the bottom of the dashboard.
- Add a page with the + button
- Rename a page by double-clicking its tab
- Reorder pages by dragging tabs
- Delete a page from its context menu (at least one page must remain)
Widgets
Widgets are the building blocks of a dashboard. Each widget displays data from a SQL query as a chart, table, or metric card.
Widget types
The following widget types are available:
| Type | Best for |
|---|---|
| Metric Card | Single KPI values with trend indicators |
| Bar Chart | Comparisons across categories |
| Line Chart | Trends over time |
| Area Chart | Cumulative trends |
| Pie Chart | Proportional breakdowns |
| Waterfall | Sequential value changes |
| Boxplot | Statistical distributions |
| Data Table | Sortable, filterable tabular data |
| Title / Subtitle | Section headings and text |
Adding widgets
Use the quick bar at the bottom of the editor to select a widget type, then drag on the grid to place it. You can also use the AI option to describe what you want in plain English — the agent generates the SQL query, selects the right chart type, and configures the visualization.
Configuring widgets
Click a widget in edit mode to open the settings panel:
- AI tab — describe what you want and let the agent generate the configuration
- Manual tab — write a SQL query and map columns to chart axes, values, and labels
- History tab — browse previous versions and roll back if needed
Widgets support formatting options for numbers, currencies, percentages, and dates. Data tables offer per-column formatting, sorting, search, and CSV download.
Arranging widgets
Drag widgets to reposition them on the grid. Resize from any edge or corner. By default, widgets auto-stack vertically. Switch to free placement mode from the tools menu for absolute positioning.
Keyboard shortcuts:
- Arrow keys — nudge selected widget
- Delete — remove widget
- Ctrl+D — duplicate widget
Dashboard inputs
Inputs are dashboard-level filters that let viewers parameterize widget queries without editing SQL. Each input defines a variable that widgets can reference, so changing an input value refreshes every widget that uses it. Two input types are available: Date Range and Tree Select.
Input selections are saved per user — each person sees their own filter values when they open the dashboard.
Adding an input
In edit mode, click the Add dashboard input button in the toolbar above the widget grid. Choose Date Range or Tree Select, then configure the input in the settings panel. Inputs appear as interactive buttons in the dashboard toolbar.
Date Range
A date range input lets viewers pick a time period. The popover provides quick-select options (Last 7 days, Last 30 days, This month, Last month) and custom date pickers for precise control. You can type dates directly or use the calendar.
Enable the comparison range to add a secondary period for year-over-year or month-over-month analysis. When enabled, a comparison badge (for example, "vs 1m") appears on the input button.
| Field | Description |
|---|---|
| Title | Label displayed on the input button |
| Variable | Name used in widget SQL (for example, dateRange1) |
| Comparison range | Optional secondary period: None, Previous month, or Previous year |
Tree Select
A tree select input lets viewers pick one or more values from a hierarchical list. The popover includes a searchable tree with checkboxes and an optional hierarchical selection mode where selecting a parent automatically selects all its children.
The tree data comes from a SQL query (or Python code) that you configure in the input settings. The query must return rows with columns for a unique key, a parent key (to build the hierarchy), and a display name.
| Field | Description |
|---|---|
| Title | Label displayed on the input button |
| Variable | Name used in widget SQL (for example, filter1) |
| Key field | Column that uniquely identifies each row |
| Parent key field | Column referencing the parent row's key (use null for root items) |
| Name field | Column shown as the display label |
| Data source | Database connection used to run the query |
| SQL | Query that returns the tree data |
| Search placeholder | Placeholder text shown in the search box |
| Hierarchical selection | When enabled, selecting a parent selects all children |
Referencing inputs in widget SQL
Widgets reference dashboard inputs using {{variableName}}
syntax in their SQL queries. Use the variable name you
assigned when configuring the input.
SELECT product, SUM(revenue)
FROM sales
WHERE region IN {{region}}
AND sale_date >= {{dateRange.start}}
AND sale_date <= {{dateRange.end}}
GROUP BY productWhen a tree select input has multiple selected values, the
{{variable}} expands into a list automatically, so
WHERE region IN {{region}} becomes
WHERE region IN ('US', 'EU', 'APAC').
When a viewer changes an input value, all widgets whose SQL contains that variable refresh automatically.
Variable names default to filter1, filter2 for tree
selects and dateRange1, dateRange2 for date ranges. You
can rename them to something more descriptive like region
or reportPeriod in the input settings.
User variables
Dashboard SQL can also reference the viewer's
security properties
using {{user.X}} syntax. These variables are populated
automatically from the properties configured in
Admin > Users > Security Properties and are available
in both widget SQL and tree-select data SQL.
| Variable | Source |
|---|---|
{{user.email}} | Custom property from the user's profile |
{{user.department}} | Custom property from the user's profile |
{{user.tenant_id}} | Built-in: the user's organization |
{{user.role}} | Built-in: the user's assigned role |
Any key defined in a user's security properties is available
as {{user.key_name}}. Nested properties use dot notation —
for example, {{user.location.region}}.
Using in widget SQL
SELECT product, SUM(revenue)
FROM sales
WHERE sales_rep_email = {{user.email}}
GROUP BY productEach viewer sees only their own sales data. The placeholder is converted to a prepared statement parameter at runtime — values are never inlined into the SQL string.
Using in tree-select data SQL
Tree-select inputs can use {{user.X}} variables in their
data query to personalize which filter options appear for
each viewer:
SELECT DISTINCT department AS key,
department AS name,
NULL AS parent_key
FROM employees
WHERE manager_email = {{user.email}}This shows only departments managed by the current viewer. When a tree-select query uses user variables, submitted selections are validated server-side against the authorized result set — any unauthorized values are silently removed.
Combining with dashboard inputs
User variables and dashboard input variables coexist in the
same query. The user.* namespace is reserved for security
properties; all other variable names come from dashboard
inputs.
SELECT product, SUM(revenue)
FROM sales
WHERE region IN {{region}}
AND sale_date >= {{dateRange.start}}
AND sale_date <= {{dateRange.end}}
AND sales_rep_email = {{user.email}}
GROUP BY productWrite {{user.X}} placeholders without surrounding quotes.
The system handles quoting and type conversion automatically
via prepared statements.
User variables are only available to authenticated viewers.
Dashboards shared via public links do not have access to
{{user.X}} variables.
Presets
You can save the current input selection as a named preset for quick access. Presets appear in a panel inside each input's popover, so you can switch between common filter combinations (for example, "Q1 2025" or "US Region") with one click. Presets are stored per dashboard and available to all viewers.
Sharing with preset inputs
When you share a dashboard via a public link, you can pre-select input values so viewers see the data you intend. Viewers can still change inputs on their end — their selections are reflected in the URL and don't affect other viewers.
Edit and preview modes
Toggle between modes with Ctrl+E or the toolbar buttons.
Edit mode shows the grid background, lets you add and configure widgets, and requires saving changes. Preview mode is the clean, read-only view where the dashboard copilot (AI assistant) is available for asking questions about the data.
Save changes manually with Ctrl+S or the Save button. Undo (Ctrl+Z) and Redo (Ctrl+Shift+Z) are available while editing.
Sharing
Click Share in the toolbar to create a public link. Options include:
- Link expiration — never, 7 days, 30 days, or 1 year
- Custom alias — human-readable label to track who the link was shared with
- Preset input values — share with specific filters pre-selected
- Embed mode — generate a URL for embedding in external sites, with options to show or hide the logo and page tabs
Access protection
You can optionally restrict access to shared dashboards:
- Email domain restriction — require viewers to verify
their email address via a one-time code (OTP). Only
addresses matching the specified domain (e.g.,
@company.com) are accepted. - Password protection — require viewers to enter a password before accessing the dashboard.
These two options are mutually exclusive — a share link uses either email verification or password protection, not both.
When a viewer opens a protected link, they see an authentication form. For email-protected links, they enter their email, receive a 6-digit verification code, and submit it. For password-protected links, they enter the password directly.
After successful verification, the viewer receives a session token stored in their browser. This token lasts 30 days, so they do not need to re-authenticate on every visit.
Changing protection settings
If you change the protection settings on a share link (for example, updating the required email domain or changing the password), all existing viewer sessions are automatically invalidated. Viewers must re-authenticate with the new credentials.
You can revoke share links at any time.
Cloning and promoting
You can perform two actions on existing dashboards:
- Clone a dashboard to create a personal copy with all its pages and widgets
- Promote a personal dashboard to company scope (admin only) — this makes it visible to all users but restricts editing to admins
Auto-refresh
Configure a refresh schedule in dashboard settings:
| Schedule | Behavior |
|---|---|
| Disabled | Manual refresh only |
| Hourly | Refreshes every hour |
| Daily | Refreshes once per day |
| Weekly | Refreshes once per week |
Use the Refresh button in the toolbar for an on-demand refresh at any time.
Docs