Skip to content
Dashboard
Menu Integrations · CI with plain curl

Integrations

CI with plain curl

No SDK, no action, no lock-in — the deploy is one HTTP request, so any CI that has curl can publish. These recipes are GitHub Actions syntax but translate to anything.

Publish a report

Deploy a single HTML file and drop the link into the job summary:

yaml
- name: Publish report
  run: |
    URL=$(curl -fsS -X POST https://ship.page/deploy \
      -H "Content-Type: text/html" \
      --data-binary @build/report.html | jq -r .url)
    echo "### Report: $URL" >> "$GITHUB_STEP_SUMMARY"

Stable preview channels

With an API key in your repo secrets, named drops give every PR a stable URL — same link every push, fresh content:

yaml
- name: Deploy PR preview
  run: |
    cd dist && zip -qr - . | curl -fsS -X POST \
      "https://ship.page/deploy?name=pr-${{ github.event.number }}" \
      -H "Authorization: Bearer ${{ secrets.SHIP_API_KEY }}" \
      -H "Content-Type: application/zip" \
      --data-binary @- | jq -r .url

The response’s replaced field tells you whether this push updated an existing preview or created the channel. For the full walkthrough, see CI preview links in two lines of yaml.

Zipping on the fly

zip -qr - . writes the archive to stdout and --data-binary @- streams it straight into the request — no temp files, works in any POSIX shell.

Use -fsS on curl so a failed deploy fails the CI step loudly instead of burying an error JSON in the logs.