bi-dashboard-authoring
SkillDev toolsCreate or edit BSL BI dashboard JSON specs for the BI Dashboard plugin.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the bi-dashboard-authoring skill
What this skill tells your AI
The instructions your AI receives, as published by hachej/boring-ui in plugins/bi-dashboard/skills/bi-dashboard-authoring/SKILL.md and read by ahel’s review.
Use this skill when the user asks to create, edit, or open a BI dashboard for
@hachej/boring-bi-dashboard.
Files
- write dashboard specs as JSON files under
dashboards/ - use the suffix
.dashboard.json - after writing or editing a dashboard, read the JSON you wrote and call WorkspaceBridge op
bi-dashboard.v1.validatewith{ "spec": <dashboard-json> }; fix error diagnostics before presenting it - when the user asks to open or view the dashboard and
exec_uiis available, open the file with:
{
"kind": "openSurface",
"params": {
"kind": "workspace.open.path",
"target": "dashboards/example.dashboard.json"
}
}
Contract
Write provider-neutral BSL dashboard specs. Do not write React. Do not write raw ECharts or raw Perspective configs.
Use this top-level shape:
{
"kind": "boring.generated-pane",
"profile": "bi-dashboard",
"version": 1,
"title": "Dashboard title",
"queries": {
"revenue_by_region": {
"id": "revenue_by_region",
"source": "default",
"sql": "SELECT region, sum(revenue) AS revenue FROM orders GROUP BY region ORDER BY revenue DESC",
"limit": 1000
}
},
"root": "dashboard",
"elements": {
"dashboard": {
"type": "DashboardGrid",
"props": { "columns": 2 },
"children": []
}
}
}
Components
Use only these component types and prop names:
DashboardGrid— layout container with stringchildren; optionalprops.columnsmust be one of1,2,3,4,5,6, or12BSLMetric— KPI card; requiresprops.queryId,props.label, andprops.valueField; optionalprops.formatisnumber,currency, orpercent; optionalprops.descriptionbecomes an info tooltip; optionalprops.showMeta: trueexposes query/source metadataBSLChart— native OpenUI/shadcn-style chart by default; requiresprops.queryIdandprops.chartType;props.chartTypemust be exactly one ofbar,line,area,scatter,radar,radial,pie,donut,heatmap,treemap,sunburst, ortable; never usegauge,histogram, or other chart types; useprops.renderer: "perspective"only for advanced manipulation; useprops.xonly for the category/grouping axis andprops.yonly for numeric measure series; do not include the x/category field as a measure/series; optionalprops.coloris allowed (notxField,yField, oryFields); optionalprops.descriptionbecomes an info tooltip; optionalprops.xAxisLabel,props.yAxisLabel,props.fieldLabels, andprops.fieldFormatsimprove reader-facing labelsBSLPerspectiveViewer— exploratory table/pivot; useprops.plugin: "Datagrid"for detail tables; optionalprops.columns,props.groupBy, andprops.splitByare string arrays; optionalprops.sortis an array of[field, "asc" | "desc"]tuplesBSLTable— native dashboard detail table; requiresprops.queryId; optionalprops.title,props.description,props.columns,props.fieldLabels,props.fieldFormats, andprops.sort; prefer this overBSLPerspectiveViewerfor small dashboard tablesBSLFilter— filter control targeting one or more query IDs; requiresprops.id,props.field,props.controlType, andprops.targetQueries;controlTypeisselect,multiSelect,dateRange,numberRange, orsearchBSLText— markdown notes or section text; requiresprops.markdown
Authoring rules
- put filters/controllers first, then KPI metrics, then charts, then detail/Perspective tables
- layout rule: compact KPI/indicator-only sections may use
props.columnsfrom 1–5, but any grid containing charts, line charts, bar charts, tables, or exploratory/Perspective views must useprops.columns: 1orprops.columns: 2so charts are never denser than two per row - a dashboard can mix row widths by using nested
DashboardGridsections, for example a KPI row withcolumns: 4, then chart rows withcolumns: 2, then a detail row withcolumns: 1 - keep 2–4 top metrics and avoid clutter; prefer clear titles and business labels
- use
props.descriptionfor short chart/table context; do not create a text card beside a single chart just to explain it - use Perspective mainly for drill-down pivots or advanced views, not for every chart or ordinary detail table
- every component ID referenced in
childrenmust exist inelements - every
queryIdand filtertargetQueriesentry must exist inqueries - use the exact validated prop names above; avoid invented aliases such as
xField,yField, oryFields - before writing the final dashboard JSON, self-check every
BSLChart.props.chartTypeagainst the exact allowed enum; usepie/donutonly for small share-of-total charts - keep the spec concise and readable
- choose sensible query IDs and component IDs from the dashboard domain
- SQL dashboard queries use
{ "id", "source", "sql", "params", "limit" }; BSL dashboard queries use{ "id", "model", "query", "limit" }; do not inventlanguage,groupBy, ormeasuresfields in dashboard JSON - prefer semantic fields such as
revenue,order_count,month,region,customer_id, andcohort_monthover UI-specific names - render dates as date strings (
YYYY-MM-DD,YYYY-MM, or reader-facing labels), not raw timestamps, unless time-of-day is essential
Signals
- GitHub stars
- 46
- Forks
- 2
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
bi-dashboard-authoring- Source
- github.com/hachej/boring-ui