The four systems
1What's actually running
Four systems talk to each other during the workshop. You only ever talk to the first one — Claude Code. It talks to the other three on your behalf.
Claude Code
The CLI you're typing into. It's Anthropic's Claude model wrapped in a terminal shell that can read files, run commands, and load "skills" (see below). At the workshop it's pre-authenticated to Amazon Bedrock — no login step.
sf CLITableau Next
Salesforce's native analytics layer inside the org. Two halves: the Semantic Data Model (SDM) — governed metrics, calc measurements, calc dimensions — and the visualization layer — dashboards, workspaces, LWC widgets. Everything is metadata; everything is versioned.
Data Cloud
The underlying storage. CSVs and CRM records land here as Data Lake Objects (DLOs). The SDM sits on top and references those DLOs as Data Model Objects (DMOs). Row-level security, audiences, and identity resolution all live at this layer.
Agentforce
Salesforce's agent runtime. It reads the same governed SDM the dashboard reads, plus a prompt library and action registry. On the dashboard, it appears as the Concierge question box + the aiDashboardInsight LWC that narrates whatever is on-screen.
Sentence → dashboard
2The workflow, step by step
You type "build me a wholesale sales command dashboard." Six things happen in the next 45 seconds.
You type a sentence into Claude Code.
Plain English. No syntax, no template. "Build me a wholesale sales command dashboard for a footwear brand — pipeline decline as the hero."
Claude routes to the right skill.
Claude Code scans .claude/skills/ for skills whose trigger phrases match your intent. "Build me a dashboard" triggers tableau-next-author (or build-my-industry-dashboard in Beat 2). The skill is a markdown file with the domain knowledge Claude needs.
The skill loads its references.
Before writing anything, the skill reads: the chart catalog (which viz type fits which question), the platform-gotchas file (~15 known Tableau Next quirks), the design bible (crma-dashboard-design-rules-2026-07-16.md), the palette rules, and — critically — the SDM field inventory for your org so it binds to real fields, not made-up ones.
Claude constructs a payload via Python.
Tableau Next dashboards are JSON. Claude drives Python helpers in bootstrap/lib/dashboard_builder.py to assemble the widget tree, filter blocks, layout grid, and LWC bindings — applying the design rules automatically (4 KPIs, one hero chart, filters below the brand strip, mono-blue except where color has meaning).
POST to the Tableau Next REST API.
Auth is your sf CLI session — no Connected App, no refresh-token juggling. The payload lands at /services/data/v67.0/ssot/data-visualizations and /dashboards. Salesforce validates it against the SDM. If anything is off, Claude reads the error, fixes the payload, and re-POSTs.
Dashboard renders in Lightning.
You refresh the tab. The dashboard is live — governed, filterable, and Agentforce-aware. Total time from sentence to pixels: 30–90 seconds depending on complexity.
What's a "skill"?
3Skills — Claude's domain knowledge modules
A skill is a markdown file that lives in .claude/skills/<name>/SKILL.md. Each has a header of "trigger phrases" — natural language patterns like "build me a dashboard for retail regional ops". When Claude Code sees a match in your prompt, it auto-loads that skill's full body: domain knowledge, references, checklists, code patterns, and known-gotcha workarounds. The skill is what turns a general-purpose LLM into a subject-matter expert on Tableau Next authoring, semantic modeling, or Agentforce wiring.
You never invoke a skill by name. You just describe what you want. The router does the rest.
The 22 skills in this repo
sf login_clc, _mtc, dimensions.hyper extract files (Python)sf sessionWhat's an LWC?
4Lightning Web Components — the widget primitives
A Lightning Web Component (LWC) is Salesforce's native web-component framework — think custom HTML elements that render inside any Salesforce surface, including a Tableau Next dashboard. On this dashboard stack, LWCs are the widgets: a KPI card, a treemap, a radial gauge, a map, a sparkline. Each is a bundle of four files:
force-app/main/default/lwc/heroKpiCard/ ├── heroKpiCard.js ← the logic (SDK queries, filter subscription) ├── heroKpiCard.html ← the template ├── heroKpiCard.css ← the styles └── heroKpiCard.js-meta.xml ← where it can be placed (dashboard, record page, app)
The repo ships 142 canonical LWC bundles — bar charts, heatmaps, treemaps, waterfall, funnel, KPI cards, sparklines, choropleth maps (Leaflet raster-only, since Mapbox is blocked by Lightning Web Security), sentiment cards, and Agentforce-aware insight cards. When Claude picks an LWC for your dashboard, it references it by bundle name in the payload's customComponent block. You can browse them at /lwcs/.
Why is there Python?
5Python — what Claude runs on your behalf
You never write Python. But when Claude Code says "deploying the dashboard now," what's actually running is a Python script in bootstrap/. Python is the glue because Tableau Next's REST API needs a structured payload, and Python's dictionaries map cleanly to JSON. Four scripts do most of the work:
bootstrap/beat1_dashboard_builder.py— assembles the CloudKicks dashboard JSONbootstrap/beat2_dashboard_builder.py— assembles Beat 2 industry dashboardsbootstrap/lib/dashboard_builder.py— the shared widget/layout/filter librarybootstrap/teardown.py— nukes an attendee namespace via SOAP destructive-deploy
Each one POSTs to the Tableau Next REST API using auth pulled from sf org display --json. If you want to understand what happened, open the files — they're deliberately readable.
The load-bearing concept
6Semantic Data Model + Data Cloud DLOs
If you learn one thing on this page, learn this one. Tableau Next is a two-layer system.
Data Cloud DLOs
The physical tables. Every CSV upload, every CRM record, every ingested stream lands as a Data Lake Object (DLO). Row-level, columnar, cheap to query. On its own, a DLO has no business meaning — it's just rows and column types.
Semantic Data Model (SDM)
The governed layer that sits on top of DLOs. It's where metrics (_mtc), calc measurements (_clc), calc dimensions, joins, and business-friendly column names live. A metric like Deal_Health_mtc is defined once in the SDM, then every dashboard, LWC, and Agentforce prompt reads the same governed number.
When Claude "extends the SDM" during Beat 2 by ingesting the CloudKicks_Locations and CloudKicks_CSAT CSVs, it does three things in sequence: (1) creates two new DLOs from the CSVs via the Data Cloud Ingestion API, (2) registers them as Data Model Objects (DMOs) — the SDM's view of a DLO — and (3) adds them to the semantic model so metrics can reference them and joins can be authored. Every step is metadata; nothing is copied.
How filters reach widgets
7Filter propagation — native vs LWC
A dashboard filter chip (Region, Product Line, Time) has to reach every widget on the page. Two mechanisms, one bug-heavy history:
- Native widgets (KPI metric cards, bar charts, tables) subscribe by declaring a
receiveFilterSourceblock in the payload — an array ofpublishersnaming which filter widgets to listen to. - LWC widgets subscribe through the SDK event bus — the LWC's JavaScript calls
sdk.on('filterChange', handler)inconnectedCallback, then re-runs its semantic query when the payload arrives.
receiveFilterSource shape has a specific quirk: the wrong publishers-block format kills the native KPI card's client-side render with a Spec not found in bundle error, which cascades into empty LWC results and makes LWC filter propagation LOOK broken. The tableau-next-author skill knows the correct shape. Full write-up in docs/tableau-next-lwc-filter-propagation-2026-07-16.md.
The AI moment
8Agentforce integration
Every dashboard you build has two Agentforce surfaces:
- The Concierge box — a natural-language question bar at the top of the dashboard. You type "which reps are trending down this quarter?"; Concierge resolves against the same governed SDM the dashboard reads, so the answer stays inside the metric definitions you authored.
-
The
aiDashboardInsightLWC — a narrative insight card that subscribes to filter changes on the dashboard, packages the current filter state + a hero metric into a prompt, calls Agentforce through theAiDashboardBriefingControllerApex controller, and renders the returned narrative back into the card. It refreshes automatically when you flip a filter.
Because Agentforce reads the SDM, not the raw DLOs, everything it says respects your row-level security, audience scoping, and metric governance. The audit trail that fires on a click-through action is the same audit trail the dashboard would fire.
What you walk out with
9The take-home repo
When you leave Dallas, you fork github.com/tcufrogger/tableau-vibe-coding-workshop-starter-kit. Everything on your laptop after that is yours to rebrand and re-run for your customers. It contains:
22 skills
Every skill listed above — the whole authoring runtime — as markdown files in .claude/skills/. Drop them into any Claude Code project.
142 LWC bundles
Under force-app/main/default/lwc/. Every chart type you'll ever need, LWS-compliant, palette-aware, filter-aware.
The design bible
docs/references/crma-dashboard-design-rules-2026-07-16.md — the 8 highest-leverage layout rules extracted from Salesforce's Analytics Design Best Practices deck plus 14 hand-graded dashboard screenshots.
25 industry data kits
Auto lending, healthcare payer, retail regional ops, telecom, wealth management, and 20 more — each with a fictional company, persona, engineered data signal, and Concierge prompt library.
Dashboard-builder Python library
bootstrap/lib/dashboard_builder.py — the widget/layout/filter helpers Claude drives. Fork it, extend it, wire it into your own agents.
Concierge prompt library
docs/concierge-prompts-per-industry.md — canonical Agentforce prompts scoped per industry kit, so your SEs know exactly which sentences trigger the wow moment.
Every acronym, defined
10Glossary
Anchor-linkable. Ctrl-F your way in.
- SDM — Semantic Data Model
- The governed metadata layer inside Tableau Next / Data Cloud where metrics, calc measurements, calc dimensions, joins, and business-friendly names live. One SDM per workspace. Everything Claude authors during the workshop lands here.
- DLO — Data Lake Object
- The physical Data Cloud table. Where CSV uploads and CRM ingests land. Row/column storage; no business meaning by itself.
- DMO — Data Model Object
- The SDM's registered view of a DLO. A DMO gives a DLO business-friendly column names, joins, and semantic role (dimension vs measure). You author dashboards against DMOs, not DLOs directly.
- CLC — Calc Measurement (suffix
_clc) - A calculated field defined in the SDM. Example:
Deal_Health_clc = Amount * Probability / Days_To_Close. Governed, versioned, and referenced everywhere by its api name. - MTC — Metric (suffix
_mtc) - A registered metric on the SDM — the promoted form of a calc measurement. Metrics are what Agentforce and Concierge can query semantically ("show me pipeline health by rep"). Every metric declares an aggregation (SUM / AVG / SNAPSHOT).
- LWC — Lightning Web Component
- Salesforce's native web-component framework. On this stack, the visualization primitives (bar chart, KPI card, map, AI insight card) are LWCs. Repo ships 142 canonical bundles.
- CDP — Customer Data Platform / Data Cloud
- Same thing, two names. CDP is the generic term; Data Cloud is Salesforce's product name for its CDP. The DLOs live here.
- Concierge
- The Agentforce natural-language query interface embedded at the top of a Tableau Next dashboard. You type a question; it resolves against the SDM.
- Agentforce
- Salesforce's agent runtime. Runs the Concierge, powers the
aiDashboardInsightcard, and executes actions (New Task, Case, Flow) back into the org. - Skill
- A markdown file in
.claude/skills/<name>/SKILL.mdthat Claude Code auto-loads when your prompt matches its trigger phrases. Contains domain knowledge, references, checklists, and code patterns. - MCP — Model Context Protocol
- Anthropic's open protocol for exposing tools + data sources to an LLM. Claude Code speaks MCP; some skills invoke MCP servers (Tableau Desktop, codesearch, GitHub) to reach out to external systems.
- Payload
- The JSON POST body sent to the Tableau Next REST API to create a dashboard, metric, or LWC binding. Assembled by the Python dashboard-builder library.
- Hot Pass
- Salesforce's internal provisioning tool used to hand each workshop attendee their pre-configured OrgFarm scratch org + AWS Workspace at check-in. Attendees see a code (e.g.,
TCRFPEDN); they never touch Hot Pass directly. - OrgFarm
- Salesforce's internal template-org system. Provisions a scratch org with a pre-baked image (Tableau Next enabled, SDM shipped, LWCs deployed, sample data loaded). Your workshop org is an OrgFarm pull.
- Beat 1 / Beat 2
- The workshop's two teaching phases. Beat 1 (40 min) is the shared CloudKicks story — everyone in the room builds the same dashboard together. Beat 2 (50 min) is "make this yours" — you pick one of the 25 industry data kits and Claude builds a dashboard for your industry.
- Vibe coding
- Talking to Claude Code in plain English to build software. No syntax. No template. Describe intent; the AI produces working code. The workshop's core practice.
- Filter propagation
- How a filter chip's value (Region = West, Time = Last Quarter) reaches every widget on a dashboard. Native widgets use
receiveFilterSource; LWCs use the SDK event bus. Both are wired automatically bytableau-next-author. - Cross-viz filter
- When clicking one chart (say, a stage in a bar chart) filters every other chart on the page. Different subscription mechanism from the top-of-dashboard filter chips, though the payload shape overlaps.
- Data-viz-first / semantic-first
- The two authoring modes in Tableau Next. Semantic-first (what this workshop uses) starts from a governed metric on the SDM and generates the viz. Data-viz-first starts from a chart and reaches down to raw data — less governed, faster to prototype.
- LWS — Lightning Web Security
- The runtime sandbox that Salesforce puts around every LWC. Blocks a lot of common web APIs (Blob-URL Web Workers, some fetch shapes) — which is why Mapbox GL / MapLibre GL don't work inside a Tableau Next LWC and Leaflet-with-raster-tiles is the only interactive-map path.
sfCLI- Salesforce's official command-line tool. Handles the OAuth login (
sf org login web), returns access tokens, and is how every script in this repo talks to the org. No Connected App required. - Wave
- The internal shorthand for a build/release cycle on this repo (e.g., "Wave F2b shipped the AI briefing controller"). You'll see it in commit messages and doc filenames.