Publish interactive data dashboards behind company SSO
One command. Your Plotly, D3, or Observable HTML dashboard becomes a permanent authenticated URL – interactive for every stakeholder with a company email.
The command
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.
Your dashboards are interactive. The sharing methods aren't.
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:
- Email – HTML attachments blocked by corporate mail security. Even when delivered, the file opens locally and relative paths break.
- Slack – downloads as a file. Recipients open in TextEdit.
- Google Drive – stores the file. Doesn't render it.
- Notion/Confluence – strips JavaScript. The interactive chart becomes a broken placeholder.
- Hosted BI tools (Looker, Tableau) – require their own licenses and seats. Your custom D3 dashboard isn't a Looker chart.
- Screenshot – static image of a dynamic artifact. All filtering, zoom, and interaction gone.
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.dev vs. alternatives for dashboard sharing
| display.dev | 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) |
<a name="workflow"></a>
Workflows by framework
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"What stakeholders see
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.
Pricing
Try it. No credit card.
- Included: 10 gated artifacts
- Included: Unlimited public artifacts*
- Included: 50MB storage
- Not included: Version history
- Not included: Google + Microsoft SSO
- Not included: Private artifacts
- Not included: Audit logs
display.dev branded
Individuals. Unlimited gated sharing.
- Included: Unlimited gated artifacts
- Included: Unlimited public artifacts
- Included: 1GB storage
- Included: 10 versions
- Not included: Google + Microsoft SSO
- Not included: Private artifacts
- Not included: Audit logs
For teams that need company auth.
- Included: Unlimited gated artifacts
- Included: Unlimited public artifacts
- Included: 25GB storage
- Included: 50 versions
- Included: Google + Microsoft SSO
- Included: Private artifacts
- Included: 90 days audit logs
For compliance-driven organizations.
From $499/mo
- Included: Unlimited gated artifacts
- Included: Unlimited public artifacts
- Included: Custom storage
- Included: Unlimited versions
- Included: Google + Microsoft SSO
- Included: Private artifacts
- Included: 365 days audit logs
Features
Viewers click a link and sign in with their Google or Microsoft account, or a one-time password. No app to install. No account to create. No IT ticket.
Inline comments on every artifact. Your agent reads them via MCP, fetches the current version, republishes with short_id and base_version, and resolves the thread. The artifact stays a living document, not a one-shot screenshot.
dsp publish ./file.html from your terminal, or one sentence in Claude Desktop. No git repo, no deploy pipeline, no project to configure.
Every artifact gets a URL that keeps working. Share in Slack, link in Notion, paste in email. It still works six months later.
No per-seat pricing at any tier. Share with your PM, exec, legal team, or designer for the same flat price.
Claude Code, Codex, and Cursor all work, along with anything else that creates HTML or Markdown output.
Common questions.
Does display.dev support Plotly Dash?
Plotly Dash is a Python server – it requires a live process to run. display.dev hosts static HTML. For sharing Dash dashboards, export them as static HTML (dash-snapshot or similar), then publish with display.dev. Alternatively, use display.dev for static Plotly charts and keep Dash for interactive server-based dashboards.
What about data privacy – does display.dev access my data?
display.dev 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.dev's Cloudflare R2 storage. For sensitive financial or customer data, review your company's data handling policies. display.dev data is never processed by AI models and is isolated per organization.
Can I update a dashboard with fresh data?
Yes. Fetch the current version, then re-publish to the existing artifact: dsp publish ./updated-dashboard.html --id <shortId> --base-version <currentVersion>. The URL stays the same. Every viewer who bookmarked or shared the link sees the updated data.
Does the 50MB free tier limit cover most dashboards?
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 organization storage) handles most individual dashboards; Pro tier (25GB) handles hundreds.
Can I publish dashboards from a CI/CD pipeline (automated updates)?
Yes. Run dsp get <shortId> to fetch the current version, then dsp publish --id <shortId> --base-version <currentVersion> as a step in your pipeline – for example, after a scheduled dbt run or a data refresh. Add DISPLAYDEV_API_KEY as a CI secret and update dashboards automatically.
Publish your first artifact in 15 seconds.
Free tier. No credit card. One-time password auth on free, Google + Microsoft SSO on Teams ($49/month flat).