From localhost to HTTPS
Host your extension where other people’s Tableau can reach it — and know exactly which three lines change when you do.
Why it matters
An extension on localhost is a party of one: the moment a colleague opens the workbook, Tableau on their machine tries to load your URL and finds nothing there. Shipping means two things and only two: the page moves to a host that serves HTTPS — Tableau refuses plain http for anything that is not localhost, hard stop — and the manifest's source-location points at it. Any static host works, because an extension is static files; GitHub Pages does it for free in five minutes. The subtlety worth internalizing: the .trex itself is never hosted. It is a file you hand to people, and whatever URL is inside it when they add it is where their Tableau will look — which is why the dev/prod split is two manifest files, not one edited back and forth.
My Tableau dashboard extension works on http://localhost:58072. Walk me through shipping it on GitHub Pages: create a public repo, push index.html and config.html, enable Pages on the main branch, and confirm the HTTPS URL serves the page. Then produce hello-dashboard.prod.trex — identical to my dev manifest except source-location pointing at the Pages URL and extension-version bumped to 1.0.0 — and explain why I keep both trex files, why the .trex itself is not hosted anywhere, and what error users see if I ever point source-location at a plain-http address.
Ship the folder to any static host — GitHub Pages, Netlify, an S3 bucket, the corporate web server — because that is all an extension is: static files. Then make the shipping copy of the manifest. Keep hello-dashboard.trex pointing at localhost for your own edit loop, and cut hello-dashboard.prod.trex with the two changes below; the prod file is what you send to colleagues, attach to documentation, or safelist on the server.
Version discipline starts mattering here: extension-version is how you and your users talk about what they have, and bumping it on every shipped change costs nothing now and saves an archaeology dig later.
<!-- hello-dashboard.prod.trex — the copy you distribute.
Identical to the dev manifest except these two lines: -->
<dashboard-extension id="com.tableauops.hello-dashboard"
extension-version="1.0.0"> <!-- was 0.1.0 -->
...
<source-location>
<!-- was http://localhost:58072/index.html -->
<url>https://vizyourdata.github.io/hello-dashboard/index.html</url>
</source-location>
...
</dashboard-extension>
<!-- Plain http survives only for localhost. Anywhere else,
Tableau refuses to load the page at all — HTTPS or nothing. -->Got what you came for? Mark the stop and the line fills in beneath you.