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.

beginner6 min1 step

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.

Prompt Recipe

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.

xml
<!-- 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.