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:
- 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:
- 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 .urlThe 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.
Last updated Jun 12, 2026