Analyzing Data
astronomer/agents
Queries the data warehouse with SQL and answers business questions about data.
Create DAC dashboards by writing YAML or TSX dashboard definition files.
$ npx skills add bruin-data/bruin --skill create-dashboard -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install bruin-data/bruin create-dashboard --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/bruin-data/bruin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/create-dashboard .claude/skills/create-dashboard && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "create-dashboard" agent skill from https://github.com/bruin-data/bruin/tree/main/.agents/skills/create-dashboard into .claude/skills/create-dashboard/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-dashboard", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/bruin-data/bruin/tree/main/.agents/skills/create-dashboardType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add bruin-data/bruin --skill create-dashboard -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install bruin-data/bruin create-dashboard --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bruin-data/bruin.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/create-dashboard .agents/skills/create-dashboard && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "create-dashboard" agent skill from https://github.com/bruin-data/bruin/tree/main/.agents/skills/create-dashboard into .agents/skills/create-dashboard/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-dashboard", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bruin-data/bruin --skill create-dashboard -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install bruin-data/bruin create-dashboard --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bruin-data/bruin.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/create-dashboard .cursor/skills/create-dashboard && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "create-dashboard" agent skill from https://github.com/bruin-data/bruin/tree/main/.agents/skills/create-dashboard into .cursor/skills/create-dashboard/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-dashboard", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/bruin-data/bruin.git --path .agents/skills/create-dashboard--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add bruin-data/bruin --skill create-dashboard -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install bruin-data/bruin create-dashboard --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bruin-data/bruin.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/create-dashboard .gemini/skills/create-dashboard && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "create-dashboard" agent skill from https://github.com/bruin-data/bruin/tree/main/.agents/skills/create-dashboard into .gemini/skills/create-dashboard/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-dashboard", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install bruin-data/bruin create-dashboardInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add bruin-data/bruin --skill create-dashboard -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/bruin-data/bruin.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/create-dashboard .github/skills/create-dashboard && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "create-dashboard" agent skill from https://github.com/bruin-data/bruin/tree/main/.agents/skills/create-dashboard into .github/skills/create-dashboard/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-dashboard", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bruin-data/bruin --skill create-dashboard -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install bruin-data/bruin create-dashboard --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bruin-data/bruin.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/create-dashboard .opencode/skills/create-dashboard && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "create-dashboard" agent skill from https://github.com/bruin-data/bruin/tree/main/.agents/skills/create-dashboard into .opencode/skills/create-dashboard/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-dashboard", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
create-dashboardCreate DAC dashboards by writing YAML or TSX dashboard definition files.
Create Dashboard is an agent skill from bruin-data/bruin. Create DAC dashboards by writing YAML or TSX dashboard definition files. Use when the user wants to create, modify, review, or understand DAC dashboards, widgets, filters, SQL queries, semantic models, or CLI validation workflows.
Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Databases, covering SQL and React components. It works with SQL. The repository describes itself as: Build data pipelines with SQL and Python, ingest data from different sources, add quality checks, and build end-to-end flows. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit 7301158. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are yaml, sql, bash and typescript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Create Dashboard loads about 4.3k tokens when it runs. Until then it costs about 62 tokens; SKILL.md has 1,365 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from bruin-data/bruin at commit 7301158, republished under its Apache-2.0 licence (© bruin-data). 1,365 words, ~4,331 tokens.
.claude/skills/create-dashboard/SKILL.md (or your agent's skills folder).Use this skill to create or modify DAC dashboard projects.
DAC projects define dashboards as code and run queries through Bruin connections. Dashboards can use direct SQL or the semantic layer. Semantic widgets reference models, dimensions, metrics, and segments; DAC compiles them to SQL in the backend.
my-dac-project/
.bruin.yml
dashboards/
sales.yml
sales.dashboard.tsx
queries/
revenue.sql
semantic/
sales.yml
themes/
brand.ymlUse dashboards/ for dashboard files and semantic/ for semantic model YAML files. Regular SQL dashboards do not need semantic models.
Dashboard files:
*.yml and *.yaml are YAML dashboards.*.dashboard.tsx files are TSX dashboards.dac init my-dashboards
dac validate --dir my-dashboards
dac check --dir my-dashboards
dac serve --dir my-dashboards --open
dac query --dir my-dashboards --dashboard "Sales" --widget "Revenue"Use dac validate after editing structure and dac check when query execution should be verified.
DAC reads Bruin connections from .bruin.yml.
default_environment: default
environments:
default:
connections:
duckdb:
- name: local_duckdb
path: data/analytics.duckdb
read_only: truePrefer read_only: true for DuckDB dashboards unless the project explicitly needs writes.
name: Sales
description: Revenue and customer activity
connection: local_duckdb
filters:
- name: region
type: select
default: All
options:
values: [All, North America, Europe, APAC]
- name: date_range
type: date-range
default: last_30_days
rows:
- widgets:
- name: Revenue
type: metric
sql: |
SELECT SUM(amount) AS value
FROM sales
WHERE created_at >= '{{ filters.date_range.start }}'
AND created_at <= '{{ filters.date_range.end }}'
{% if filters.region != 'All' %}
AND region = '{{ filters.region }}'
{% endif %}
value:
field: value
type: number
format: "$,.2f"
col: 3Widget types are metric, chart, table, text, divider, and image.
A table column takes name, label, number (value format: number, currency, or a d3-format string), like, hidden, and format. format is an ordered list of layers; for each cell the first layer that matches wins. A scalar format string (e.g. format: currency) is also accepted as a legacy alias for number — prefer number in new dashboards.
if (+ value), the layer styles only the cells that match. value is a scalar, [low, high] for is_between/is_not_between, { column: <name> } to compare against another column in the same row, or omitted for empty checks. Operators: is_empty, is_not_empty, text_contains/text_does_not_contain/text_starts_with/text_ends_with/text_is_exactly, date_is/date_before/date_after (by day, or exact instant with a time), greater_than/greater_than_or_equal/less_than/less_than_or_equal, is_equal_to/is_not_equal_to, is_between/is_not_between.if, the layer styles every cell — a gradient (backgroundColor is a list of 2+ colors; optional range list + unit = absolute/percent/percentile, omit range for auto min/max) or a flat fill (backgroundColor is a string). Put it last as the fallback.backgroundColor, textColor, bold, italic, underline, strikethrough.like: mirror another column's coloring, driven by that column's per-row value, while keeping this column's own number.hidden: true: keep the column in the result but don't render it. Optional. Coloring reads a column whether or not it's shown, so hide only to drop it from the display, e.g. a like source you must declare but don't want visible.Each layer is a YAML object, so - { backgroundColor: [red, white, green], range: [-25, 0, 25], unit: absolute } and the same keys written as an indented block are identical — use whichever reads better.
Colors are named (red green blue indigo cyan purple pink amber, plus white/black, aliases positive/negative/warning) or hex. Named colors adapt to light and dark.
Worked example:
name: Regions
rows:
- widgets:
- name: Regions
type: table
col: 12
sql: SELECT revenue, growth, score, status, actual, target, bonus, health FROM regions
columns:
- name: revenue
number: currency
format:
- { backgroundColor: [red, white, green] } # gradient, auto min→max
- name: growth
number: number
format:
- { backgroundColor: [blue, white, amber], range: [-25, 0, 25], unit: absolute } # fixed anchors; unit also percent/percentile
- name: score
number: number
format: # conditions, first match wins
- { if: greater_than_or_equal, value: 80, backgroundColor: green }
- { if: is_between, value: [50, 79], backgroundColor: amber }
- { if: less_than, value: 50, textColor: red, strikethrough: true }
- name: status
format:
- { if: text_contains, value: urgent, backgroundColor: amber, bold: true }
- { if: is_empty, backgroundColor: "#F3F4F6", italic: true } # flat fill (string)
- name: actual
number: number
format: # cross-column, same row
- { if: greater_than, value: { column: target }, backgroundColor: green }
- name: target
hidden: true # in the result for the rule above, not rendered
- name: bonus
number: currency
like: score # mirror score's colors, keep own number
- name: health
number: number
format: # a condition wins over the gradient base below
- { if: is_equal_to, value: 0, backgroundColor: red, bold: true }
- { backgroundColor: [red, white, green] } # base, last (always matches)Dashboard filters are UI controls. SQL dashboards use filter values through Jinja templates.
Supported filter types:
selectdate-rangedatenumbertextDate range presets include today, yesterday, last_7_days, last_30_days, last_90_days, this_month, last_month, this_quarter, this_year, year_to_date, and all_time.
Both single and multiple select filters show a searchable dropdown, so you can type to find an option quickly when the list is long.
Select filters support multiple: true for multi-select. The value is a list — render with join in Jinja and guard the empty case:
{% if filters.status and filters.status | length > 0 %}
AND status IN ('{{ filters.status | join("','") }}')
{% endif %}Filter values are kept in the URL query string, so you can share a filtered dashboard as a link. Each filter becomes one query parameter named after it, for example ?region=Europe&date_range=last_30_days. When a select has multiple: true the values are comma separated, and a date-range is either a preset key or start..end. Anything read from the URL is checked against the filter's type and options, and ignored if it doesn't match.
bruin.user_email){{ bruin.user_email }} is the email of the signed-in user viewing the dashboard — a Bruin Cloud runtime feature that resolves per viewer, so one dashboard can show each person only their own rows:
SELECT * FROM orders WHERE owner_email = '{{ bruin.user_email }}'Locally there is no signed-in user, so the value comes from the BRUIN_USER_EMAIL environment variable (empty if unset). To preview a user-scoped dashboard as a specific person, pass it inline: BRUIN_USER_EMAIL=someone@example.com dac dev. In Bruin Cloud this becomes dynamic per signed-in viewer.
Use named queries when multiple widgets share the same SQL or semantic query.
queries:
revenue_by_region:
sql: |
SELECT region, SUM(amount) AS revenue
FROM sales
GROUP BY 1
rows:
- widgets:
- name: Revenue by Region
type: chart
chart: bar
query: revenue_by_region
x: { field: region }
y: { field: [revenue] }
col: 6A chart's x and y are axis encoding objects with a required field (bare column names like x: region are invalid). field may be a single column or a list.
The funnel chart shows conversion through ordered stages: one bar per stage with its share of the top of the funnel and the step-to-step conversion. Use label (stage) and value (count), and order rows top-of-funnel first in SQL. horizontal: true lays the stages left-to-right, and bar labels honor value.format (e.g. "$,.0f" for a revenue funnel).
Every query is an inline sql: block or a named query: reference — YAML widgets do not take file paths. In TSX, include("queries/revenue.sql") reads a .sql file into an inline query at load time.
A metric, chart, or table widget can carry its values inline with data instead of a query. A widget with data renders without a connection or SQL — columns are the column names and rows is one positional list per row. The encoding fields (x, y, value, label, columns) reference the column names.
rows:
- widgets:
- name: Revenue by Quarter
type: chart
chart: bar
col: 6
data:
columns: [quarter, revenue]
rows:
- [Q1, 12000]
- [Q2, 15500]
- [Q3, 14200]
- [Q4, 18900]
x: { field: quarter, type: category }
y: { field: [revenue], type: number, format: "$,.0f" }Use this only when there is genuinely no data connection — e.g. a brand-new project where .bruin.yml has no connections, a hardcoded illustrative example, or a layout mockup. When a connection exists, always use sql:, query:, or a semantic widget instead. Inline data is frozen: it never refreshes, ignores filters, and goes stale. Do not paste real query results into data to "cache" them, and do not present made-up numbers as real — tell the user inline values are illustrative until a warehouse is connected.
Rules:
data is mutually exclusive with sql, query, and semantic fields (model, dimension, metrics, …). Setting both fails validation.text, image, or divider widgets.data widgets needs no top-level connection.Semantic models live in semantic/*.yml.
name: sales
label: Sales
source:
table: marts.sales
dimensions:
- name: created_at
type: time
granularities:
month: date_trunc('month', created_at)
- name: region
type: string
- name: channel
type: string
metrics:
- name: revenue
expression: sum(amount)
format:
type: currency
currency: USD
decimals: 0
- name: orders
expression: count(*)
- name: average_order_value
expression: "{revenue} / nullif({orders}, 0)"
segments:
- name: online
filter: "channel = 'online'"Metrics are aggregate SQL expressions or expressions over other metrics using {metric_name} references. Dimensions are the only fields valid for semantic filters.
A model can join to other models so a query can group, filter, or sort by dimensions on a related model. Declare a joins block on the model and a primary_key on the join target, then reference joined dimensions as relation.dimension.
# semantic/orders.yml
name: orders
source:
table: marts.orders
primary_key: order_id
joins:
- name: customers # relation name; also the target model name unless `model:` is set
relationship: many_to_one
foreign_key: customer_id # column on this model pointing at customers.primary_key
dimensions:
- name: category
type: string
metrics:
- name: revenue
expression: sum(amount)# semantic/customers.yml
name: customers
source:
table: marts.customers
primary_key: customer_id
dimensions:
- name: country
type: stringA widget or named query on orders then references the joined dimension by relation.dimension:
- name: Revenue by Country
type: chart
chart: bar
dimension: customers.country # dimension from the joined customers model
metrics: [revenue]Relationships: one_to_one, many_to_one, one_to_many, many_to_many. Use target_key to override the joined column, or sql for a custom join condition.
name: Semantic Sales
connection: local_duckdb
model: sales
filters:
- name: region
type: select
default: North America
options:
values: [North America, Europe, APAC]
rows:
- widgets:
- name: Revenue
type: metric
metric: revenue
filters:
- dimension: region
operator: equals
value: "{{ filters.region }}"
value:
field: revenue
type: number
format: "$,.0f"
col: 3
- name: Revenue by Month
type: chart
chart: area
dimension: created_at
granularity: month
metrics: [revenue]
sort:
- name: created_at
direction: asc
col: 9A widget can set model directly, or inherit the dashboard-level model. For multiple models, use a dashboard-level models map and reference the model alias on widgets or named queries.
Semantic filter operators include equals, not_equals, gt, gte, lt, lte, in, not_in, between, is_null, and is_not_null.
Use TSX when the dashboard needs variables, loops, reusable components, conditionals, or generated layouts.
export default (
<Dashboard name="Semantic Sales" connection="local_duckdb" model="sales">
<Filter
name="region"
type="select"
default="North America"
options={{ values: ["North America", "Europe", "APAC"] }}
/>
<Row>
<Metric
name="Revenue"
metric="revenue"
filters={[
{ dimension: "region", operator: "equals", value: "{{ filters.region }}" },
]}
value={{ field: "revenue", type: "number", format: "$,.0f" }}
col={3}
/>
<Chart
name="Revenue by Month"
chart="area"
dimension="created_at"
granularity="month"
metrics={["revenue"]}
sort={[{ name: "created_at", direction: "asc" }]}
col={9}
/>
</Row>
</Dashboard>
)TSX supports the same dashboard model as YAML. Keep semantic logic declarative; do not manually compile semantic metrics to SQL in TSX.
These fields were removed from the DAC schema. Never emit them in new dashboards. If you encounter any of them while reading or editing an existing dashboard, refactor them to the current form — preserving the original column, formatting, and labels — and re-run dac validate to confirm the dashboard still loads.
| Deprecated | Replacement |
|---|---|
Chart x: col / y: [col] (bare column names) | x: { field: col } / y: { field: [col] } — axis encoding objects with a required field |
Widget or named-query file: path.sql | Inline sql: or a named query: reference. In TSX, include("path.sql") reads a .sql file into inline SQL at load time |
Metric widget column, prefix, suffix, format (flat fields) | value: { field: <column>, type: number, format: "<d3-format>" } |
Dashboard inline semantic: block (source / metrics / dimensions) | Define the model in semantic/*.yml and reference it with model: |
data only when there is no connection; prefer sql/query/semantic whenever one exists, since inline data never refreshes.© bruin-data, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/create-dashboard of bruin-data/bruin.
Open the folder on GitHubat commit 7301158
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders. This page covers the copy in bruin-data/bruin, which our catalogue first saw on October 7, 2026.
Create Dashboard next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Create Dashboard this skillbruin-data/bruin | 1.8k | — | ~4.3k | Automated safety check: Pass | Apache-2.0 | |
| Analyzing Dataastronomer/agents | 450 | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Basincloudflare/skills | 3k | 1 repos | ~684 | Automated safety check: Pass | Apache-2.0 | |
| VisualizationFrankChen021/datastoria | 327 | — | ~1.2k | Automated safety check: Pass | Custom licence | |
| Databricks Dbsqldatabricks/databricks-agent-skills | 345 | 1 repos | ~2.8k | Automated safety check: Pass | Custom licence | |
| dbt Snowflake to BigQuery Translatorgoogle/skills | 21k | — | ~2.7k | Automated safety check: Pass | Apache-2.0 |
astronomer/agents
Queries the data warehouse with SQL and answers business questions about data.
cloudflare/skills
Build and troubleshoot Cloudflare Basin analytics workflows with Basin Pipelines, Basin Catalog, and Basin SQL.
FrankChen021/datastoria
Rules for charts and visualization. An agent skill from FrankChen021/datastoria.
databricks/databricks-agent-skills
Databricks SQL (DBSQL) advanced features and SQL warehouse capabilities.
google/skills
Translates Snowflake dbt SQL models into standardized BigQuery SQL, keeping Jinja constructs and tracking progress in a migration tasks file.
TryGhost/Ghost
Rules for writing Tinybird datasources, pipes, endpoints and materialized views, with SQL constraints, optimization habits and deduplication patterns.
bruin-data/bruin
Create, update, render, and visually verify polished Bruin CLI terminal demos with VHS.
bruin-data/bruin
Add Bruin CLI support for a new ingestr source. An agent skill from bruin-data/bruin.
bruin-data/bruin
A skill your agent uses when creating, editing, reviewing, or troubleshooting Bruin semantic layer models, semantic query CLI usage, metric and dimension definitions, joins, segments, filters…
bruin-data/bruin
A skill your agent uses when duplicate rows, unstable primary keys, repeated ingestion, or failed uniqueness checks appear in a Bruin asset.
bruin-data/bruin
A skill your agent uses when a Bruin pipeline, asset, or command fails and the cause is not yet clear.
bruin-data/bruin
A skill your agent uses when a pipeline fails because source, destination, or declared asset columns may have changed.
Works with
Categories
Create DAC dashboards by writing YAML or TSX dashboard definition files. Create Dashboard is an agent skill from bruin-data/bruin. Create DAC dashboards by writing YAML or TSX dashboard definition files.
Create Dashboard fits situations like: the user wants to create; understand DAC dashboards; semantic models; CLI validation workflows.
Run `npx skills add bruin-data/bruin --skill create-dashboard -a claude-code`. Or copy the skill folder (.agents/skills/create-dashboard in bruin-data/bruin) into .claude/skills/create-dashboard in your project. Claude Code loads it when a task matches its description.
Run `npx skills add bruin-data/bruin --skill create-dashboard -a codex`. Or copy the skill folder (.agents/skills/create-dashboard in bruin-data/bruin) into .agents/skills/create-dashboard in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add bruin-data/bruin --skill create-dashboard -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/create-dashboard, .gemini/skills/create-dashboard, .github/skills/create-dashboard and .opencode/skills/create-dashboard in your project.
SKILL.md names no scripts, command-line tools or credentials: Create Dashboard is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Create Dashboard is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Create Dashboard: Analyzing Data (astronomer/agents, 450 stars), Basin (cloudflare/skills, 3k stars), Visualization (FrankChen021/datastoria, 327 stars) and Databricks Dbsql (databricks/databricks-agent-skills, 345 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
bruin-data (a GitHub organization) maintains it in bruin-data/bruin, which has 1,769 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 7, 2026.
Source: bruin-data/bruin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.