No signup · One curl · Live in seconds
Throw HTML at an API.
Get a live URL back.
Deploy a single HTML file or a whole static build with one curl — no account, no config. Every drop lands on its own unguessable subdomain, live worldwide in seconds.
Try it live
you@laptop — deploy anything
$ curl -X POST https://ship.page/deploy \
-H "Content-Type: text/html" \
--data-binary @report.htmlExample response: # 201 Created — your drop is live:
https://vast-juice-c2dse08p.shipped.page/
Ship zone
Drag in a single .html file, a .zip of your build, or a whole folder.Tap to pick an .html file or a .zip of your build.
Free drops: zip up to 25 MB · live for 7 days · no account needed
How it works
Three steps, zero signups
Ship it
POST your HTML or zip to https://ship.page/deploy — or just drop it above.
Catch the URL
You get https://<two-words-tail>.shipped.page/ — root-mounted and unguessable (~62 bits of entropy).
Share it
Send the link anywhere; free drops self-destruct in 7 days.
Features
Everything is a flag on one endpoint
No dashboards required. Read the ten things below, then never think about hosting again.
API-first
One endpoint, three body formats: raw HTML, JSON multi-file (binaries as base64), or a zip — with the root directory auto-stripped so dist/ archives just work.
Own subdomain per drop
Every drop mounts at the root of its own subdomain. Absolute paths like /app.js and /styles.css just work — no base-path rewrites, ever.
GET /app.js → 200Unguessable URLs
Sharing IS the access control: ~62 bits of entropy per URL. Anyone with the link can view — no login — and nobody without it will find it.
Custom TTL
Choose a lifetime with ?ttl= — minimum 60 seconds. Free drops cap at 7 days; subscribers go unlimited.
POST /deploy?ttl=3600Named drops / preview channels
Deploy with ?name=pr-42 and every redeploy replaces the content while the URL stays put — instant preview channels.
POST /deploy?name=pr-42Vanity subdomain
Your team's name on every preview your CI throws.
acme--pr-42.shipped.pageGitHub Action
Two lines of YAML and every CI run ships a live preview.
- uses: bitgate/ship-page-action@v1
with: { path: dist/ }Append API
Deploy now, add files later — grow a single drop to 10,000 files without re-uploading what's already there.
Edge-cached worldwide
Drops are served from edge caches around the planet — first paint is fast from anywhere.
No tracking of viewers
Your viewers are nobody's product: no cookies, no fingerprinting, no analytics injected into your pages.
The killer use case
Your CI reports deserve a URL, not an artifact zip.
Coverage reports, Playwright traces, Storybook builds, bundle-analyzer output — publish them as live pages your team can actually click from the PR.
- Included: Runs right after your build step — no config beyond a path
- Included: The live URL lands in your job summary and PR
- Included: Previews self-destruct on whatever schedule you set
.github/workflows/ci.yml
- uses: bitgate/ship-page-action@v1
with: { path: playwright-report/ }No Action? One line of curl drops the link straight into your job summary:
$ curl -sX POST https://ship.page/deploy -H 'Content-Type: text/html' --data-binary @report.html >> "$GITHUB_STEP_SUMMARY"Pricing
Free to ship. Cheap to keep.
Deploys are anonymous on every plan — pay only when you want drops that stick around.
Free
For drive-by deploys
- Drops live 7 days
- 25 MB zip (100 MB decompressed)
- 100 files per request
- Anonymous deploys — no account, ever
Pro
For drops that stick around
- Everything in Free
- Drops never expire
- Any TTL — 60 s to forever
- Named drops / preview channels
- 100 MB zip (400 MB decompressed)
- 900 files per request · append up to 10,000
- 120 deploys per minute
- API keys
Team
Your name on every preview
- Everything in Pro
- Vanity subdomain: acme--*.shipped.page
Prices charged via Stripe · cancel anytime in the billing portal.
FAQ
Asked often enough
Anyone with the link — and nobody without it: every URL carries ~62 bits of entropy, so guessing one is a one-in-4.6-quintillion shot.
Free drops live 7 days, or shorter if you pass ?ttl=; paid drops live forever — or exactly as long as any TTL you choose.
Subscribers can redeploy a named drop (?name=…) and the URL keeps serving the new content; anonymous drops are immutable — ship a new one instead.
Nothing illegal or harmful — no malware, phishing or scams; report anything bad to abuse@bitgate.com.
Yes — curl IS the product: everything on this page is a flag on POST /deploy, and there's a GitHub Action for CI. See the API docs and the GitHub Action.
Existing drops keep serving exactly as they are; paid features simply stop applying to new deploys.