One command. Your Plotly, D3, or Observable HTML dashboard becomes a permanent authenticated URL — interactive for every stakeholder with a company email.
dsp publish ./dashboard.html --name "sales-dashboard-q1"Your VP Sales clicks, authenticates with their company email, and interacts with the live dashboard — filters, tooltips, drill-downs and all.
Data teams build dashboards in Plotly, D3, Observable, Bokeh, or Altair that export to self-contained HTML. The output is visually excellent and fully interactive.
Then sharing happens:
The analysis that took weeks to build gets shared as a screenshot of one chart. The VP asks a follow-up question that the dashboard would have answered in two clicks.
| Display | BI Tool (Looker/Tableau) | Google Drive | Confluence/Notion | |
|---|---|---|---|---|
| Self-contained HTML dashboards | ✅ | ❌ (their format) | ❌ (downloads) | ❌ (strips JS) |
| Interactive charts | ✅ | ✅ | ❌ | ❌ |
| Company SSO | ✅ ($49/mo) | ✅ (expensive) | ✅ (Google) | ✅ (per seat) |
| Persistent URL | ✅ | ✅ | ✅ | ✅ |
| No per-seat fees | ✅ | ❌ | ✅ | ❌ |
| Format-agnostic (any HTML) | ✅ | ❌ | ❌ | ❌ |
| Setup time | 15 sec | Days/weeks | Instant | Instant (broken) |
Plotly:
import plotly.express as px
import plotly.io as pio
fig = px.scatter(df, x='revenue', y='churn', color='segment',
title='Customer Segments Q1')
pio.write_html(fig, 'dashboard.html', include_plotlyjs='cdn')dsp publish ./dashboard.html --name "segments-q1"Observable (notebook export):
npx @observablehq/runtime dist/
dsp publish ./dist/ --name "revenue-analysis"D3 single-file dashboard:
dsp publish ./d3-dashboard.html --name "pipeline-view"Altair:
import altair as alt
chart = alt.Chart(df).mark_bar().encode(x='category', y='count')
chart.save('chart.html')dsp publish ./chart.html --name "category-breakdown"Multi-file dashboards:
dsp publish ./dashboard-build/ --name "revenue-dashboard"The VP of Sales receives the dashboard URL in a Slack message. They click it.
They sign in with their company Google or Microsoft account — once, five seconds. They see the full interactive dashboard: hover tooltips, click filters, date range selectors, drill-down functionality.
Everything the dashboard was built to show. No Looker license. No SQL access. No data analyst in the loop for every follow-up question.
Free — one-time password auth, 50MB, unlimited viewers
Teams ($49/month) — Google + Microsoft SSO, 25GB, custom domain, unlimited viewers
Publish your first dashboard free →
Plotly Dash is a Python server — it requires a live process to run. Display hosts static HTML. For sharing Dash dashboards, export them as static HTML (dash-snapshot or similar), then publish with Display. Alternatively, use Display for static Plotly charts and keep Dash for interactive server-based dashboards.
Display stores and serves the HTML file you publish. If your HTML dashboard contains embedded data (e.g., Plotly with df.to_json() inline), that data is stored in Display's Cloudflare R2 storage. For sensitive financial or customer data, review your company's data handling policies. Display data is never processed by AI models and is isolated per workspace.
Yes. Re-publish with the same name: dsp publish ./updated-dashboard.html --name sales-dashboard-q1. The URL stays the same. Every viewer who bookmarked or shared the link sees the updated data.
Typical Plotly/Altair/D3 dashboards are 1–10MB. Dashboards with embedded datasets or many chart traces can reach 20–50MB. The free tier (50MB total workspace storage) handles most individual dashboards; Teams tier (25GB) handles hundreds.
Yes. Run dsp publish as a step in your pipeline — for example, after a scheduled dbt run or a data refresh. Add DISPLAY_TOKEN as a CI secret and update dashboards automatically.
Free tier. No credit card. One-time password auth on free, Google + Microsoft SSO on Teams ($49/month flat).