Solutions

Publish CI/CD artifacts behind company auth

One step in your pipeline. Every build artifact — test reports, coverage HTML, Storybook builds, API docs — gets a permanent authenticated URL accessible to the whole team.

Free tier available$49/month flat for TeamsGoogle + Microsoft SSOUnlimited viewers
terminal
$ display publish ./report.html
 
Uploading    47kb
Auth       Google Workspace ✓
 
✓ Published
 
→ https://view.display.dev/p/f474hfd/8f3kx9
 
Viewers    anyone at acme.com
Expires    never
Version    1
 
$ 

The CI step

- name: Publish artifact
  run: dsp publish ./output/ --name "build-${{ github.run_id }}"
  env:
    DISPLAY_TOKEN: ${{ secrets.DISPLAY_TOKEN }}

That's it. Every build run produces a permanent URL. Post it as a PR comment. Link it from your Slack build notification. Bookmark it for the QA lead.


CI generates artifacts. They go nowhere.

Every CI run produces HTML output. Playwright test reports. Jest coverage reports. Storybook builds. Swagger UI from your OpenAPI spec. Bundle analysis visualizations. Lighthouse reports.

The current fate of most CI artifacts:

  • GitHub Actions ZIP artifacts — expire after 90 days by default. Non-engineers have to download and unzip to view.
  • Push to GitHub Pages — requires Enterprise Cloud for private repos ($2,100/month for 100 viewers). Every viewer needs a GitHub account.
  • Slack notification with no attachment — "Tests passed" with no link to the actual report.
  • Gaffer (for Playwright) — purpose-built for test reports only. Everything else still has no home.

Display adds one step to your CI pipeline and gives every artifact a permanent authenticated URL.


Setup

Step 1: Add your token as a secret

In GitHub: Settings → Secrets and variables → Actions → New repository secret
Name: DISPLAY_TOKEN
Value: your Display API token (generate in Display dashboard)

Step 2: Add the publish step

- name: Install Display CLI
  run: npm install -g @display-dev/cli
 
- name: Publish artifact
  run: |
    dsp publish ./output-dir/ \
      --name "artifact-${{ github.run_id }}" \
      --title "${{ github.workflow }} #${{ github.run_number }}"
  env:
    DISPLAY_TOKEN: ${{ secrets.DISPLAY_TOKEN }}

Step 3: Optionally post the URL as a PR comment

- name: Comment URL on PR
  if: github.event_name == 'pull_request'
  uses: actions/github-script@v7
  with:
    script: |
      const url = `https://yourco.display.dev/artifact-${{ github.run_id }}`;
      github.rest.issues.createComment({
        issue_number: context.issue.number,
        owner: context.repo.owner,
        repo: context.repo.repo,
        body: `📊 Build artifact: ${url}`
      })

Artifact types and commands

Playwright reports:

- run: dsp publish ./playwright-report/ --name "playwright-${{ github.run_id }}"

Jest coverage:

- run: dsp publish ./coverage/lcov-report/ --name "coverage-${{ github.ref_name }}"

Storybook build:

- run: dsp publish ./storybook-static/ --name "storybook-${{ github.ref_name }}"

Lighthouse CI report:

- run: dsp publish ./.lighthouseci/ --name "lighthouse-${{ github.run_id }}"

Bundle analysis (webpack-bundle-analyzer):

- run: dsp publish ./bundle-analysis.html --name "bundle-${{ github.run_id }}"

Swagger UI (built from OpenAPI spec):

- run: |
    redocly build-docs openapi.yaml --output ./api-docs/index.html
    dsp publish ./api-docs/ --name "api-docs"

Display vs. alternatives for CI artifacts

DisplayGitHub Actions ZIPGitHub Pages (private)Gaffer
Any HTML artifact❌ (no rendering)❌ (Playwright only)
Company SSO❌ / $2,100/mo
Permanent URLs❌ (expires)
PR comment integration
CI setup time5 min020+ min10 min
Monthly price$49 flat$0$2,100/moPaid

Pricing

Free — one-time password auth, 50MB, unlimited viewers
Teams ($49/month) — Google + Microsoft SSO, 25GB, custom domain, unlimited viewers

See all pricing →


Set up CI publishing free →


Common questions.

Does Display work with GitLab CI?+

Yes. The CLI works anywhere Node.js is available. Replace GitHub Actions variables with GitLab CI equivalents:

What about CircleCI, Jenkins, or other CI systems?+

Yes. Install the CLI with npm install -g @display-dev/cli and run dsp publish as a shell step. Works with any CI that can run Node.js commands.

Can I keep artifact history across builds?+

Yes. Use unique names per build: --name "playwright-${{ github.run_id }}". Each build run gets its own permanent URL. The history accumulates in your Display workspace.

How do I avoid filling up storage with hundreds of artifact runs?+

Manage artifacts via the Display dashboard or REST API — delete old runs programmatically. Or use the --ttl flag (coming soon) to set automatic expiration for transient artifacts.

Does the free tier handle CI use?+

The free tier (50MB total storage) is limited for high-frequency CI publishing. Teams tier (25GB) is sized for active CI pipelines — hundreds of builds per month.

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).