Eight steps from a raw orders table to a signed-off one-pager. Each step shows
the command to run and exactly what lands on disk.
orders
table — revenue, margin and cash against target, exception-first, with RAG indicators.
Using the C-Suite archetype (S-heavy SCAN, ~5 visuals, status card top-left).
Status band of four RAG KPI cards (one exception, flagged red), a revenue-vs-target trend, a margin donut, and an exceptions list — the SCAN pattern for a C-suite audience.
The walkthrough above is the full lifecycle. Most real work starts mid-stream — you already have a model, or you only need a theme. These are the common entry points, each a complete route from what you have to what you need.
The fastest useful thing AtelierBID does. No model, no project, no AI step required.
node scripts/build-theme.js --brand "#2A6FDB,#E8743B" --out ./out/theme --colors 10node scripts/check-palette.js "#2A6FDB,#E8743B"Want it derived from a brand description rather than hex codes? Run
/AtelierBID:build-theme in a session and describe the brand — you also get a
palette rationale, font-colour choice, and a design critique scored 0–100.
The classic starting point: one wide orders-style table that needs to become
a star schema.
node scripts/ground-schema.js load --use-sample/AtelierBID:model-star-schema in a session and paste your DDL — or drive
the CLI directly:
node scripts/model-star-schema.js \
--describe "Sales by Date, Product, Region with Revenue, OrderCount" \
--out ./tables --validate --previewnode scripts/model-relationships.js --tables ./tables --out relationships.tmdl
node scripts/optimise-model.js --model ./tablesYou get SQL DDL, a Mermaid ERD, DAX measure stubs, and a validation report scored against nine Kimball rules. The validator feeds fixes back to the designer on retry.
This is the step that normally forces re-authoring by hand. The bridge is a shared mockup IR — one JSON contract that both the preview and the PBIR converter read, so what a stakeholder approves is exactly what gets generated.
node scripts/design-report.js --compose --emit-mockup mockup.html --apply-tokensnode scripts/prototype-report.js --ir composed-ir.json --out ./prototype \
--emit-ir approved-ir.jsonnode scripts/design-report.js --from-ir approved-ir.json --pbip ./projects/Q3Sales
node scripts/validate-pbip.js --project ./projects/Q3SalesThe converter will not overwrite a file it did not write — existing pages are guarded behind an ownership sentinel. Unmapped visual types warn and skip rather than failing the whole run.
Copilot and Q&A answer badly when a model has no descriptions, no synonyms, and exposed key columns. This is the fix, and it works on a model you did not build.
node scripts/ai-readiness.js audit --model ./tables --out audit.jsondisplayName without renaming physical columns):
node scripts/ai-readiness.js enrich --model ./tables --out ./enriched
node scripts/ai-readiness.js hygiene --model ./enriched --out ./hygienenode scripts/ai-readiness.js linguistic --model ./enriched --out linguistic.json
node scripts/ai-readiness.js verified-answers --model ./enriched --out va.json
node scripts/validate-pbip.js --model ./enrichedEvery sub-command exits 0 and records gaps in the artefact content rather than the exit
code, so audit && grep chains keep running.
Point the read-only tools at someone else's TMDL. Nothing here mutates your model.
node scripts/document-model.js --model ./tables --out data-dictionary.mdnode scripts/optimise-model.js --model ./tables
node scripts/optimise-dax.js --model ./tablesnode scripts/best-practice.js scaffold
node scripts/best-practice.js audit --model ./tablesDAX rewrites are dry-run by default and gated behind an explicit --apply.
Offline, the equivalence verdict reports engine: none rather than claiming
a proof it cannot make.
A static mockup gets nodded at; a clickable prototype gets argued with — which is what you actually want before building.
/AtelierBID:prototype-report in a session with your report spec, or:
node scripts/prototype-report.js --out ./prototype --sampleprototype.html in a browser. You get real Chart.js charts, KPI cards
with variance, dark mode and a responsive grid.--emit-ir and follow the
Mockup → PBIR recipe above.Viewing a prototype needs internet — the page loads Chart.js from a CDN. Generating every artefact, including IR → PBIR conversion, does not.
Node is not on your shell's PATH. On Git Bash and default
PowerShell, C:\Program Files\nodejs is often missing. Fix for the session —
Bash: export PATH="/c/Program Files/nodejs:$PATH" · PowerShell:
$env:PATH = 'C:\Program Files\nodejs;' + $env:PATH
No internet. The prototype HTML loads Chart.js from a CDN, so viewing it needs a connection. The file itself is a complete, standalone artefact — and nothing in the generation path, including IR → PBIR, needs the network.
Working as intended. A data colour within ΔE 15 of the
red/amber/green status roles would make a failing number read as healthy. Pick a brand
colour further from the status palette, or check candidates first with
node scripts/check-palette.js.
Resume it. Every skill run scaffolds output/<run-id>/
and writes a checkpoint at each pipeline step. Re-invoke the same skill and it picks up
from the last completed checkpoint rather than starting over.
Unmapped visual type. The converter maps IR visual types through
a fixed table; anything unmapped warns and skips rather than failing the whole page.
Check the warnings the converter printed, and the VISUAL_TYPE_MAP coverage.
Ownership guard. The converter only overwrites files it wrote itself, identified by a sentinel in the PBIP settings. If you hand-edited the page, move or delete it first — the guard is what stops your manual work being silently destroyed.
The file formats and terms the documentation assumes.
.pbix.kind: atelierbid/mockup-ir). A self-describing JSON contract carrying the
grid, KPI strip and per-visual type. Both the human preview and the PBIR converter read
it, so approval and generation cannot drift apart. Additive-only.author-sql.js
never connects to a database; author-m.js never evaluates M.