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 in Beat 1 (or beat-2-adventure-menu once you're picking a CloudKicks adventure 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
beat-2-adventure-menu — Beat 2 CloudKicks adventures menu
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: shift the framing while staying on CloudKicks
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" — the first thing you do in Beat 1 — it authors a governed calculated field (Deal_Health_clc, built from Amount, Probability, and Days to Close) directly on the Opportunity semantic model and registers it as an Agentforce-ready metric. No CSVs, no new tables — the field is metadata layered on data that's already there, and every dashboard, LWC, and Agentforce prompt reads the same governed number from that point on.


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.


Vibe coding with Tableau · per Gabe Jakobson, Tableau Field CTO

9What does "vibe coding with Tableau" actually mean?

Three shapes exist. Two of them make you compound leverage. The third is a speed trap. Know which one you're doing before you type the first prompt.

Shape 1 · governed

Vibecode INTO Tableau

Proven Platform Maturity — harnessing 20+ years of robust platform R&D used by millions.

Governed Data — enterprise-grade, certified data with a single source of truth.

Native Security — out-of-the-box RLS, robust permissions, MFA, and SOC II compliance.

Hosted SaaS — Tableau Cloud SaaS, no manual server maintenance.

Self-Service Exploration — business users slice and explore without writing code.

Seamless Blending — automated clean pipeline connections across diverse sources.

Salesforce Ecosystem — deep integration with Salesforce CRM, Data Cloud, and Agentforce.

✓ this is the workshop path
Shape 2 · embed

Vibecode to Embed

Best for customer-facing portals and external custom application integrations.

Seamless Embed — you already have an established website, portal, or software product, and want to inject rich, interactive Tableau analytical assets directly into it.

✓ still leverages 20 years of Tableau IP
Shape 3 · anti-pattern

"Use Claude Code to create and deploy standalone dashboards"

Speed Trap — quick 'shake & bake' turns to unmaintainable technical debt.

Overhead — custom products requiring release cycles, hosting, and QA.

No Wheels — layouts, security boundaries, and permissions must be coded from scratch.

✗ don't do this
The money quote, from Gabe live on stage: "Custom React apps suck. You have 20 years of IP at Tableau and you're literally trying to recreate it. You're going to go from euphoria to disappointment very quickly." The vibe-coding-a-React-dashboard demo LOOKS amazing in the first five minutes. Then you hit the second dashboard, the second customer, the second row-level-security ask — and every wheel you skipped is now a wheel you have to build.
For the workshop → workshop factory playbook, see /lifecycle/. The full golden-repo build sequence, how to build future customer projects from your fork, upstreaming discoveries back to the framework, and the branch → edit → test → audit → merge git discipline that keeps a multi-agent team from stepping on each other. Per Gabe Jakobson, Tableau Field CTO.

What you walk out with

10The take-home repo

When you leave the workshop, 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.

CloudKicks sample data kit

The CloudKicks sneaker brand storyline — pre-populated Sales Cloud semantic model, sample pipeline data, and Concierge prompt library for the workshop walk-through.

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

11Glossary

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 short event code; 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
Beat 1 is the shared CloudKicks build chain — cold-open, extend the semantic model, build the dashboard, embed it in the Sales app, ask Agentforce — that everyone in the room runs on their own org. Beat 2 is the CloudKicks adventures menu: 10 enhancements (a deal-health metric, status-colored rankings, a sales-velocity sparkline, a two-page rebuild, dark mode, a rep scorecard, a territory map, an Agentforce sales-analyst agent, a Data Cloud alert, and a change-the-story retitle) you pick from to extend the dashboard you just built — still CloudKicks, no new industries.
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 → View Agenda