Salesforce · Tableau Next · Under the Hood

How this whole thing works, under the hood.

You'll type sentences. Dashboards will appear on your Salesforce org. This page explains the four systems, the skills, the LWCs, the Python, the APIs — and every acronym you'll hear in the workshop.

Agent Astro thinking

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.

The driver

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.

→ hands off to Tableau Next via REST + sf CLI
The dashboards

Tableau 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.

→ queries data from Data Cloud
The data lake

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.

→ surfaces data to Tableau Next + Agentforce
The AI agent

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.

→ writes back into the same org (New Task, Case, Flow)

Sentence → dashboard

2The workflow, step by step

You type "build me a wholesale sales command dashboard." Six things happen in the next 45 seconds.

1 · Type "build me..." 2 · Route skill tableau-next-author 3 · Load refs gotchas · palette · SDM 4 · Build payload JSON via Python 5 · POST Tableau Next API 6 · Renders in Lightning live on your org
1

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."

2

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.

3

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.

4

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).

5

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.

6

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

cold-open — kicks off the workshop, handles sf login
extend-the-sdm — authors calculated fields on the semantic model
make-me-a-dashboard-for — builds the Beat 1 CloudKicks dashboard
build-my-industry-dashboard — Beat 2 "make this yours" dashboard
tableau-next-author — the core dashboard authoring skill
tableau-semantic-authoring_clc, _mtc, dimensions
tableau-next-custom-lwc — scaffolds new LWC widgets
tableau-next-package-deploy — migrates dashboards between orgs
tableau-next-record-access-shares — sharing + permissions
tableau-hyper-api.hyper extract files (Python)
drop-in-a-smart-card — adds the AI insight card + record page
make-me-a-second-widget — Track B: add a second LWC
change-the-story — Track A: rebrand to your industry
wire-the-ai — Track C: Concierge questions + data alerts
test-governance — Track D: RLS + audit trail walkthrough
ask-agentforce — Concierge/Agentforce moment
concierge-coach — canonical Concierge prompts per industry
verify-scopes — checks OAuth scopes on the sf session
walk-out — closes out with take-home kit
panic-reset — nuclear reset if a session gets wedged
se-demo-builder — one-command SE demo generator
bolt-chart-builder / bolt-portal-embed — TC26 keynote demo streams

What'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:

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.

Layer 1 · storage

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.

Layer 2 · meaning

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:

Known area — do not improvise here. The 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:

  1. 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.
  2. The aiDashboardInsight LWC — 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 the AiDashboardBriefingController Apex 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.

Open the repo on GitHub →


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 aiDashboardInsight card, and executes actions (New Task, Case, Flow) back into the org.
Skill
A markdown file in .claude/skills/<name>/SKILL.md that 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 by tableau-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.
sf CLI
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.
See the workflow → Browse 25 industries