One command in your CI workflow. Your Storybook build becomes a permanent authenticated URL — accessible to designers, PMs, and engineers with a company email. No GitHub account needed for viewers.
dsp publish ./storybook-static/ --name "storybook-main"Anyone with a @yourco.com email clicks the link, authenticates once with Google or Microsoft, and sees the full interactive Storybook — all stories, canvas, docs.
npx storybook build produces a storybook-static/ directory. It's a complete static web app. The question is where it lives after that.
Display publishes the storybook-static/ directory at an authenticated URL in 15 seconds. $49/month flat for the entire team.
| Display | Chromatic | Vercel + SSO | GitHub Pages (private) | |
|---|---|---|---|---|
| Storybook hosting | ✅ | ✅ | ✅ | ✅ |
| Google SSO | ✅ ($49/mo) | ✅ (paid) | ❌ ($300/mo add-on) | ❌ |
| Microsoft SSO | ✅ ($49/mo) | ⚠️ Limited | ❌ ($300/mo add-on) | ❌ |
| Visual regression testing | ❌ | ✅ | ❌ | ❌ |
| Any other HTML artifacts | ✅ | ❌ | ✅ | ✅ |
| Non-GitHub viewer access | ✅ | ✅ | ✅ | ❌ |
| Flat pricing (unlimited viewers) | ✅ | ❌ | ❌ | ❌ |
| Setup time | 15 sec | ~30 min | 20+ min | git push |
GitHub Actions — publish on every merge to main:
name: Publish Storybook
on:
push:
branches: [main]
jobs:
storybook:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: npm ci
- name: Build Storybook
run: npx storybook build --output-dir storybook-static
- name: Install Display CLI
run: npm install -g @display-dev/cli
- name: Publish Storybook
run: |
dsp publish ./storybook-static/ \
--name "storybook-main" \
--title "Storybook (main)"
env:
DISPLAY_TOKEN: ${{ secrets.DISPLAY_TOKEN }}Per-branch publishing:
- name: Publish Storybook (branch)
run: |
dsp publish ./storybook-static/ \
--name "storybook-${{ github.ref_name }}" \
--title "Storybook (${{ github.ref_name }})"
env:
DISPLAY_TOKEN: ${{ secrets.DISPLAY_TOKEN }}This gives every branch its own URL — yourco.display.dev/storybook-main stays current, yourco.display.dev/storybook-feature-auth shows the feature branch state.
A designer or PM receives the Storybook URL in a Slack message or Linear comment. They click it.
They're prompted to sign in with their company Google or Microsoft account — once, five seconds. They see the full interactive Storybook:
Everything Storybook built. No GitHub account. No CLI. No npm.
Free — one-time password auth, 50MB, unlimited viewers
Teams ($49/month) — Google + Microsoft SSO, 25GB, custom domain, unlimited viewers
Publish your Storybook build free →
Yes. Storybook's build output (storybook-static/) is a self-contained static site with all assets. dsp publish ./storybook-static/ serves the directory at a URL with all relative paths resolved. The full Storybook UI renders as intended.
Yes. Use unique names per branch. --name storybook-main for main, --name storybook-feature-x for feature branches. Each gets its own permanent URL.
Static Storybook builds don't require a running server. Addons that make external API calls (MSW, API mocking) work if they mock responses in the static build. Addons that require a dev server won't work in a static export.
10–100MB depending on the number of stories, assets, and whether --no-minify is used. Display's Teams tier includes 25GB — enough for hundreds of builds in parallel.
Yes. Same CLI, same authentication layer. dsp publish ./storybook-static/ --name storybook-main and dsp publish ./playwright-report/ --name playwright-run-42. Both appear in your Display dashboard under the same workspace.
Free tier. No credit card. One-time password auth on free, Google + Microsoft SSO on Teams ($49/month flat).