Publish a Plotly Dashboard Behind Company SSO

Plotly's `write_html()` method exports any figure or dashboard as a fully interactive self-contained HTML file. Pan, zoom, hover, filter — all the interactivity is preserved in the file.

TL;DR
`fig.write_html("dashboard.html")` then `dsp publish ./dashboard.html`. Your data team's Plotly dashboards live at permanent, company-gated URLs — no Dash server to run, no Heroku to maintain, no email attachments.

The problem

Plotly's write_html() method exports any figure or dashboard as a fully interactive self-contained HTML file. Pan, zoom, hover, filter — all the interactivity is preserved in the file.

Then it has nowhere to go. Email strips the JS. Google Drive downloads it. Slack downloads it. Emailing it as an attachment gets blocked.

The alternative — a Dash server — requires running and maintaining a Python web server, managing dependencies, handling auth separately. For a monthly KPI dashboard, that's significant overhead.

Display is the middle path: static file, permanent URL, company auth.


Two steps

import plotly.express as px
import pandas as pd
 
df = pd.read_csv("sales_data.csv")
fig = px.line(df, x="month", y="revenue", color="region",
              title="Revenue by Region — Q1 2026")
 
fig.write_html("q1-revenue.html", include_plotlyjs="cdn")
dsp publish ./q1-revenue.html --name "q1-revenue-dashboard"

Share the URL. Anyone with a company email clicks it, authenticates once, and sees the full interactive Plotly chart: zoom, pan, hover tooltips, legend filtering.


Multi-chart dashboards

from plotly.subplots import make_subplots
import plotly.graph_objects as go
 
fig = make_subplots(rows=2, cols=2, subplot_titles=["Revenue", "CAC", "Churn", "NPS"])
 
fig.update_layout(height=800, title_text="Q1 2026 Executive Dashboard")
fig.write_html("executive-dashboard.html", include_plotlyjs="cdn")
dsp publish ./executive-dashboard.html --name "executive-dashboard"

The dashboard URL stays the same each quarter — update the data, re-run the script, republish with the same name.


FAQ

What about Dash applications?+

Dash requires a running Python server — it's not a static file. Display publishes static HTML. For Dash apps that need to stay interactive with live data, you'd need server-side hosting. For Dash apps that can export their current state as a static snapshot, use fig.write_html() on the underlying figures.

Does `include_plotlyjs="cdn"` mean viewers need internet access?+

Yes, "cdn" loads Plotly.js from a CDN. For fully self-contained files (no CDN dependency): use include_plotlyjs=True. The file will be larger (~3MB) but works without internet access.

Can I update the dashboard without changing the URL?+

Yes. Republish with the same name: dsp publish ./executive-dashboard.html --name "executive-dashboard". The URL stays the same; the content updates.

Publish your first artifact in 15 seconds.

Free tier. No credit card. One-time password auth for viewers on free, Google + Microsoft SSO on Teams ($49/month flat).

Get started free →See pricing