shiply.now

Sites

Publishing, updating, SPA mode, serving, and management

Updating a site

Re-publish to the same site to create a new version. Authenticated owners just publish again; anonymous publishers pass their claimToken:

curl -X POST https://shiply.now/api/v1/publish \
  -H "content-type: application/json" \
  -d '{
    "claimToken": "<claimToken>",
    "files": [
      { "path": "index.html", "size": 150, "contentType": "text/html", "hash": "<sha256>" },
      { "path": "style.css",  "size": 40,  "contentType": "text/css",  "hash": "<sha256>" }
    ]
  }'

Versions flip atomically at finalize — visitors never see a half-deployed site.

Hash-skip (incremental deploys)

Include a lowercase SHA-256 hash per file. Files whose (path, hash) match the live version are skipped — no upload needed; they're copied server-side at finalize and appear in upload.skipped.

Refreshing expired upload URLs

Presigned upload URLs last 1 hour. If they lapse before finalize:

curl -X POST https://shiply.now/api/v1/publish/<slug>/uploads/refresh \
  -H "content-type: application/json" \
  -d '{"versionId": "<versionId>"}'

How requests are served

RequestServed
exact file paththe file
/ or /dir/index.html in that directory, else a directory listing
/dir (no slash)dir/index.html if present
unknown path, SPA mode onindex.html (HTTP 200)
unknown path, SPA mode off404

SPA mode

For client-side-routed apps (React, Vue, SvelteKit, Remix client builds…), enable spaMode so deep links work:

# at publish time
-d '{"spaMode": true, "files": [...]}'

# or later (owners)
curl -X PATCH https://shiply.now/api/v1/publish/<slug>/metadata \
  -H "Authorization: Bearer shp_…" \
  -H "content-type: application/json" \
  -d '{"spaMode": true}'

Managing sites (owners)

# list your sites
curl https://shiply.now/api/v1/publishes -H "Authorization: Bearer shp_…"

# site detail + version history
curl https://shiply.now/api/v1/publish/<slug> -H "Authorization: Bearer shp_…"

# rename / toggle SPA / show on profile
curl -X PATCH https://shiply.now/api/v1/publish/<slug>/metadata \
  -H "Authorization: Bearer shp_…" -H "content-type: application/json" \
  -d '{"title": "My Site", "addedToProfile": true}'

# delete (removes all stored files, permanent)
curl -X DELETE https://shiply.now/api/v1/publish/<slug> -H "Authorization: Bearer shp_…"

Limits per publish: up to 1,000 files, 100 MiB per file, 1 GiB total.