Blog · Claude Code · Tableau Extensions

How to Build a Tableau KPI Card Extension with Claude Code (and Why a Skill Changes Everything)

I gave Claude Code the same prompt twice — once with a Tableau extensions skill, once without. Same model, same data. One fought the manifest for 40 minutes. The other built a working KPI card on the first prompt. Here's why.

JUN 27, 2026

If you've ever tried to build a custom Tableau extension with AI, you've probably hit the wall: the AI writes confident-looking code, Tableau rejects it, and you spend the next half hour pasting cryptic error messages back and forth. It feels like AI just doesn't work for this niche.

It does. You're just missing one thing — and it isn't a better prompt.

A Tableau KPI card extension showing a large abbreviated number with a green prior-period comparison.
The finished KPI card — big abbreviated number, green/red prior-period comparison, ready to host.

I've spent the last few weeks building custom Tableau extensions live with Claude Code, in front of a few hundred people — KPI cards, custom viz, the messy real process, errors and all. Here's the lesson that kept surfacing: the difference between a 40-minute fight and a first-prompt build isn't the model or the prompt. It's everything the AI knows before you ask.

Let me prove it. Same prompt. Same data. Same model. Run twice.

The prompt I used both times

Build me a Tableau dashboard extension: a KPI card that reads the first worksheet's summary data, shows the first measure as a big abbreviated number, adds a prior-period comparison as a green/red percent, and is ready to host on GitHub Pages. Include the .trex manifest.

A fair, specific ask. Now watch how much the outcome depends on what Claude walks in knowing.

Building a Tableau extension without a skill

Claude Code is brilliant, eager, and starting from zero. So it guesses — reasonably, but wrong in the exact ways Tableau punishes.

First, it hands me a polished React component. Looks great. Won't load — because GitHub Pages can't compile JSX; it only serves static files. So I'm already debugging a build step I never wanted.

Next, the .trex manifest comes back missing required elements, so Tableau refuses it on load with an unhelpful error. I paste the error back. It patches one thing. Another's still missing. Another round trip.

Then the hosting trap: the manifest points at localhost, which works on exactly one machine — mine — and nobody else's. A shared extension pointing at localhost is a dead end for every other user.

Forty minutes in, I have a half-working Tableau dashboard extension and a folder full of false starts. Not because the AI is bad — because it didn't know the rules of this game, and every wrong guess cost a round trip.

Tableau showing an extension load error, with a folder of half-finished React files in the background.
Without the skill: a manifest Tableau won't load, JSX a static host can't compile, and a localhost trap.

These are the most common Tableau extension errors people hit with AI:

  • JSX/React that won't run on static hosting — Pages and similar hosts can't compile a build step.
  • An incomplete .trex manifest — a single missing required element is the number-one first-load failure.
  • A localhost source-location — works for you, breaks for everyone you share it with.
  • No empty-state handling — the card renders blank and confusing when there's no data yet.

Building the same Tableau KPI card with a skill

A Claude Code skill is a set of instructions and patterns you hand the AI up front — the accumulated knowledge of how something is done correctly. I built one specifically for Tableau extensions: the manifest structure, the Tableau Extensions API patterns, the GitHub Pages hosting setup, and the specific errors and fixes I'd collected across dozens of broken builds.

Same prompt. This time Claude already knows:

  • Write vanilla JavaScript, because GitHub Pages can't compile a build step.
  • Generate a complete .trex manifest with every required element, because a missing one is the top first-load failure.
  • Read the worksheet's summary data correctly through the Extensions API.
  • Handle the empty state, so the card explains itself when there's no data yet.
  • Point the manifest at a hosting URL, not localhost — ready to deploy and share.

First prompt. Working KPI card. Then I ask for the prior-period comparison and it adds the trend arrow, the green/red conditional color, and the tooltip — done.

A working Tableau KPI card extension on a dashboard, with a trend arrow and green percent comparison.
With the skill: the same prompt produces a working card on the first try — then refines on request.

Same model. Same prompt. The only variable was what it knew before I asked.

Why a skill matters more than a better prompt

People assume the leap in AI-assisted building comes from smarter models or cleverer prompts. Some of it does. But a huge share of the friction — the part that makes you feel like "AI doesn't really work for my niche" — is just the model not knowing your domain's specific, unwritten rules.

A skill closes that gap. It's the difference between an assistant who's smart and an assistant who's smart and has done this exact thing a hundred times. You stop spending prompts teaching it the basics and start spending them on the actual work.

For Tableau extensions specifically, that unwritten knowledge is unusually punishing: the manifest is unforgiving, the hosting has a sharp localhost trap, the Extensions API has its quirks, and the error messages rarely tell you what's actually wrong. It's exactly the kind of domain where a skill turns a 40-minute fight into a first-prompt build.

How to build your own Tableau extensions with Claude Code

If you want to go from idea to working extension without starting from scratch, here's the short version:

  1. Use Tableau Desktop (a free trial works — note that extensions don't run in Tableau Public).
  2. Build with vanilla HTML/CSS/JS so it can be hosted as static files.
  3. Write a complete .trex manifest and host the files on GitHub Pages over HTTPS.
  4. Read worksheet data through the Tableau Extensions API, and always handle the empty state.
  5. Iterate in a tight loop: prompt, load, paste any error back, fix, repeat.

That's the whole method — and it's exactly what I packaged into a drop-in skill so Claude Code does it for you.

Get the kit

I packaged everything from those live sessions into a drop-in Claude Code skill — the rules, a working starter, runnable examples, the reference guides, and the prompt recipes. Add it to Claude Code, describe the extension you need, and it builds with the patterns already baked in.

It's a head start and a method, not a magic one-click button. But the blank page — the hardest part of any build — is gone.

If you want to skip the forty minutes: the TableauOps Extension Kit is here.

And if you'd rather watch the whole thing happen — prompt to working card — here's a build, start to finish:

Same prompt, with the skill — built live. (Swap src for a YouTube/Loom URL if you'd rather embed that.)

Or join the next session and watch one built in real time.

— Eric Summers, Tableau Ambassador & founder of TableauOps


Frequently asked questions

Can you build a Tableau extension with AI?

Yes. Claude Code can build a working Tableau dashboard extension — but it needs the domain's rules (the manifest structure, the Extensions API, static hosting) to do it reliably. With a skill that encodes those rules, it builds correctly on the first prompt instead of guessing.

Do Tableau extensions work in Tableau Public?

No. Extensions run in Tableau Desktop (including the free trial) and Tableau Server/Cloud, but not in Tableau Public. Use Tableau Desktop to build and test.

Where do you host a Tableau extension?

GitHub Pages is a free, static HTTPS host that's ideal for extensions. The key rule: the .trex manifest you share must point at the hosted Pages URL, never localhost.

What is a Claude Code skill?

A skill is a packaged set of instructions, patterns, and reference material you give Claude Code up front, so it already knows how to do a specific kind of task — like building Tableau extensions — without you teaching it each time.