Create DashboardSAFE
DaC is a dashboard-as-code tool. Build interactive dashboards using YAML and JSX. Built-in semantic layer. Get your agents to build standardized, reviewable dashboards.
Overview
DaC is a dashboard-as-code tool. Build interactive dashboards using YAML and JSX. Built-in semantic layer. Get your agents to build standardized, reviewable dashboards.
cbf0a4230782OBSERVED · 2026-10-12What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
---
name: create-dashboard
description: Create dac dashboards by writing YAML or TSX definition files. Use when the user wants to create, modify, or understand dashboard files, widget configuration, filters, query templating, or CLI usage. TSX dashboards enable loops, variables, custom components, and data-driven layouts impossible in YAML.
argument-hint: "[description of the dashboard to create]"
---
# Create Dashboard
Create dac dashboards by writing YAML or TSX files. This skill covers both formats, widget types, filters, query templating, and project setup.
**When to use YAML vs TSX:**
- **YAML** — straightforward dashboards with static layouts. Simpler syntax, no programming needed.
- **TSX** — dashboards that need loops, variables, custom reusable components, conditional logic, or data-driven layouts that adapt to the database contents at load time.
Both formats produce identical Dashboard structs and coexist in the same directory.
When invoked, use `$ARGUMENTS` as the description of what dashboard to create.
---
## Validation Workflow — Read Before Editing
`dac check` runs **every widget's query** against the live database and scales with total widget count. Running it after every edit is the single biggest waste of time when iterating on a dashboard. Pick the cheapest tool that proves the change is correct:
| Change you just made | Run this | Why |
|---|---|---|
| UI-only — `chart` type, `col`, labels, `value` formatting, colors, text/markdown, divider/image, theme, row order | **nothing** | No query changed. `dac serve` live-reloads instantly in the browser. |
| One widget's SQL, `query:` ref, or column mapping | `dac query --dir ./dashboards --dashboard "X" --widget "Y"` | Executes only that one query, returns rows. ~1 query of latency. |
| Filters, named queries, metrics/dimensions wiring, `col` sums, new widget skeletons | `dac validate --dir ./dashboards` | Structural check, no SQL executed. Sub-second. |
| End-of-task sweep, or many widgets changed at once | `dac check --dir ./dashboards` | Full execution. Slow — only run once when you think you're done. |
**Rules:**
1. Default to **no command** for UI tweaks. The live reload in `dac serve` is the feedback loop, not the CLI.
2. Never run `dac check` and then re-run individual widgets — pick one. Per-edit = `dac query --widget`; end-of-task = `dac check`.
3. If you changed N widgets and N ≥ ~half the dashboard, `dac check` is fine. Otherwise `dac query --widget` per change is cheaper.
4. `dac validate` is cheap (<1s) but only catches structure, never SQL errors. Don't rely on it for SQL edits.
---
## Project Structure
```
my-project/
.bruin.yml # Database connections (required for queries)
dashboards/
my-dashboard.yml # Any *.yml file = a dashboard
another.yml
explorer.dashboard.tsx # Any *.dashboard.tsx file = a TSX dashboard
dynamic-report.dashboard.tsx
lib/
kpi.tsx # Shared TSX helpers (not auto-discovered)
queries/
my_query.sql # SQL files for TSX include() and dac query -f
themes/
corporate.yml # Optional custom themes (token overrides)
```
- Any `*.yml`/`*.yaml` file in the dashboard directory is auto-discovered as a YAML dashboard.
- Any `*.dashboard.tsx` file is auto-discovered as a TSX dashboard.
- Files in `lib/` or without the `.dashboard.tsx` suffix are NOT auto-discovered (use `require()` to import them).
- Files starting with `.` are ignored (e.g. `.bruin.yml`).
- SQL files in `queries/` are for TSX `include()` and `dac query -f` — YAML widgets always inline their SQL (or reference a named query).
---
## .bruin.yml — Connection Config
The `.bruin.yml` file defines database connections. It must exist somewhere above or in the dashboard directory. The CLI auto-discovers it by walking up the directory tree.
```yaml
default_environment: default
environments:
default:
connections:
duckdb:
- name: my_duckdb
path: /absolute/path/to/data.db
read_only: true # recommended for DuckDB to avoid lock issues
postgres:
- name: my_postgres
host: localhost
port: 5432
database: analytics
username: user
password: pass
# Other connection types supported by bruin CLI
```
Queries are executed via `bruin query` under the hood. Any connection type supported by bruin works.
---
## Dashboard YAML Schema
```yaml
# Required
name: My Dashboard # Display name, also used as URL slug
rows: [] # At least one row required
# Optional
description: A description # Shown on the dashboard list page
connection: my_duckdb # Default connection for all queries
# Optional: interactive filters
filters: []
# Optional: named queries (reusable across widgets)
queries: {}
# Optional: declarative data source (enables metrics & dimensions)
source:
table: my_schema.my_table
date_column: created_at # For automatic date range filtering
date_format: "%Y%m%d" # strftime format if date is stored as string
connection: my_postgres # Overrides dashboard-level connection
# Optional: reusable metric definitions
metrics: {}
# Optional: reusable dimension definitions
dimensions: {}
```
---
## Filters
Filters create interactive controls in the UI. Filter values are injected into SQL queries via Jinja templating.
```yaml
filters:
# Select dropdown
- name: region
type: select
default: "All" # Initial value
multiple: false # true for multi-select
options:
values: ["All", "North America", "Europe", "APAC"] # Static options
# OR dynamic options from a query:
# query: SELECT DISTINCT region FROM dim_regions ORDER BY region
# connection: my_postgres # Optional connection override
# Date range picker (Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | NA |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (2)
.agents/skills/create-dashboard
AGENTS.md
Gates applied: no_behavioural_pass.
cbf0a4230782full audit observations/trust-audit/skill/bruin-data__create-dashboard.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-12 | cbf0a4230782 | SAFE | B | 89 | first audit |
Questions
What does the Create Dashboard skill do?
DaC is a dashboard-as-code tool. Build interactive dashboards using YAML and JSX. Built-in semantic layer. Get your agents to build standardized, reviewable dashboards.
Is Create Dashboard safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can Create Dashboard access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
How current is this page?
The grade is for one exact copy of the source (cbf0a4230782), read on 2026-10-12. The repository is watched, and a new audit runs when it changes — this is the first audit.