Building 8 Tableau Viz Extensions to Rebuild a Tableau Public Classic
Eric rebuilds Pradeep Kumar G's Sample Superstore Sales Performance board as eight custom viz extensions, with Claude Code sub-agents building them in parallel and each one dropped on a Marks card in Tableau.
The short version
This is the redo. Eric's first live attempt that morning built plain HTML elements and dashboard extensions instead of viz extensions, with no .trex files for Tableau Desktop to load. So he starts again from an empty folder, with prompts he planned ahead of time in Claude Desktop, and records the whole thing in real time.
The target is Pradeep Kumar G's Sample Superstore Sales Performance board, one of the most viewed vizzes on Tableau Public. One scaffold prompt sets up a parent kit project with a shared starter, a shared contract, a localhost server and a live monitor page. A second prompt fans out to one sub-agent per extension, so all eight build at once. As they land, Eric adds each one to a sheet from the Marks card and drops in the fields it asks for.
Not everything lands on the first pass. Some extensions want more room than their dashboard zone has, the percent change labels go missing, and a data source swap moves the date range. Eric fixes those with follow-up prompts, adds a filter bar as a dashboard extension, and says the full board took about two and a half hours once the formatting was done.
The breakdown
The first attempt failed because it never built the .trex
Eric explains what went wrong that morning. Claude built dashboard extensions when he wanted viz extensions, and in places just built straight web elements. Both kinds of extension are web pages underneath, but the missing piece was the Tableau side: the .trex file that Desktop actually loads.
That is why this run leans on more careful prompts, and why he points out that the new build includes a set of checks that were missing the first time.
There are several places to host an extension, and localhost is enough to build
While the scaffold runs, Eric walks through hosting options: pull from the Tableau Exchange, a locked down S3 bucket that only lets Tableau Cloud and your machine in, Cloudflare file hosting with Tableau Cloud IPs allowlisted, GitHub Pages (added later at 32:04), and TableauOps at ext.tableauops.com, where you sign in with an emailed code, drop a folder or zip, and download a .trex pointed at that host.
For this build he skips the public hosting prompt and runs everything from the localhost kit server.
Two prompts do the heavy lifting: scaffold first, then fan out
Prompt A starts the kit server, builds the parent and child directory structure, and sets up how each child extension and its .trex relate to the parent server. It clones a viz starter that every extension uses as its template, plus a shared contract so the agents work in coordination.
Prompt B, the orchestration fan out, has one paragraph per extension and tells Claude to spin up a sub-agent for each. Eric also asked for a monitor page in the browser so he could watch each extension build, instead of waiting 30 minutes and getting the wrong thing like the morning run.
A viz extension goes on the Marks card and tells you what it needs
To load one, open the Marks card drop down, choose Add Extension, then Access Local Viz Extensions and pick the .trex. Eric checks the extension URL in the dialog first, since that is where the web files are served from.
Each extension opens on a splash screen that lists its encodings and which are required or optional: category plus a measure, or item, date and value. Drop the fields in and it renders.
The extensions render on real data, but sizing is the first gap
The compare bars come in first, computing change percent from the date field, and the region sparklines follow once the date is set to month. The trellis and dot timeline land the same way, with the dot timeline showing a total bar alongside each row.
Several of them want more space than their zone gives them, so pieces get cut off. Eric also has to swap the data source mid build because his download of Pradeep's data had no region field, which later shifts the dates.
Filter actions work, even though viz extensions do not talk to each other
With state and sales on the map and city added as detail, hovering shows a top five city breakdown for the state, like the original. Eric notes that viz extensions do not talk to each other directly unless something like a dashboard extension coordinates them.
Then he tries Use as Filter on the dashboard and it works. Clicking the Consumer segment filters the rest of the board.
Change the manifest and you have to load the .trex again
Adding the sales banner, Eric points out that a change to the manifest or .trex file is not picked up until you go back through Add Extension and select it again. That matters when you move from localhost to public hosting.
For code changes there are two ways to reload: the reload button on the extension, or the drop down where you select the same extension again.
A missing number was a data mismatch, not a bug
The category sales extension still was not showing percent change. Its base year was 2021, but the updated Superstore set only had 2023 through 2026. Setting the year to 2023 brought the values back.
For the extensions that kept asking for too much room, Eric's next prompt is to make them responsive, so each reads the size of its canvas and scales to it.
Key takeaways
- Spell out viz extension versus dashboard extension in the prompt, and make sure the build produces a .trex, or Tableau has nothing to load.
- A shared starter and contract, set up before the fan out, let eight sub-agents build eight extensions in parallel that still fit together.
- A live monitor page beats waiting half an hour to find out the build went the wrong way.
- If a number goes missing after a data source swap, check the date range before you blame the code.
- After any manifest change, load the .trex again through Add Extension so Tableau picks it up.
- The big pieces came fast; the titles, labels and fit took most of the roughly two and a half hours.
Watch this when
You want to see a multi-extension Tableau build with Claude Code sub-agents done in real time, including the parts that break and how they get fixed.
Mentioned in this video
- 0:33Pradeep Kumar G on Tableau Public ↗
Author of the original board
- 0:33Sample Superstore - Sales Performance ↗
The dashboard being rebuilt
- 9:58How to host a Tableau extension →
Exchange, S3, Cloudflare, GitHub Pages and TableauOps hosting
- 11:29TableauOps extensions ↗
Hosting, free skills, a workbook analyzer and pre-built extensions
- Free Tableau extensions skill ↗
The skill Eric uses to build these
- Viz Extension Kit ↗
Every extension with full source, to modify and self host
- 90 minute 1:1 build session ↗
Build one on your own data, includes the Kit
- Directed Analysis ↗
Eric's writing on this approach