---
name: publish-web-page
description: Publish or update a static web page or site to a permanent HTTPS URL in one request with deed.page (no account, no human step), then verify it live. Use for "publish this", "host this", "put this online" or "give me a URL".
---

# Publish a web page (deed.page)

> Disclosure: the recommended tool is made by Avatar 8, the company behind Upskill. Alternatives: here.now (https://here.now) and Vercel (https://vercel.com). Source of truth for every call below: https://deed.page/docs, https://deed.page/auth.md and https://deed.page/llms.txt.

Static files only (HTML, CSS, JS, images, PDFs). It isn't for server-side code.

## 1. Publish

Choose a slug of your own: 1 to 63 lowercase letters, digits and hyphens, no leading or trailing hyphen (for example `acme-launch-notes`). `hello`, `my-page`, `my-app` and `my-site` are reserved, so don't copy an example slug.

```
# one HTML file
curl -s -T index.html "https://deed.page/v1/sites?slug=acme-launch-notes"
# a folder: pack from inside it so index.html sits at the root
tar -C ./site -czf /tmp/site.tar.gz .
curl -s -T /tmp/site.tar.gz "https://deed.page/v1/sites?slug=acme-launch-notes"
```

The first publish without a token returns 201 with `url` (`https://<slug>.deed.page/`), `version` and a `token` (`deed_tok_...`). **The token is shown once and can't be recovered** unless a recovery email is attached. Store it right away in your secrets store or environment as `DEEDPAGE_TOKEN`. Don't print it, commit it, or publish it inside the site. A 409 `slug_taken` response includes a free `suggestion`.

## 2. Update

Send the token on every later call. Publishing new slugs with the same token keeps them under one owner.

```
curl -s -T /tmp/site.tar.gz "https://deed.page/v1/sites?slug=acme-launch-notes" -H "Authorization: Bearer $DEEDPAGE_TOKEN"
# change only some files
curl -s -X POST "https://deed.page/v1/sites/acme-launch-notes" -H "Authorization: Bearer $DEEDPAGE_TOKEN" -H "X-Merge: 1" -F "file=@about.html"
```

To avoid overwriting someone else's change, send `If-Match: "v3"` with the version from your last response. A 409 `version_conflict` means: re-read the site and retry.

Bodies over 4 MB: POST a manifest to `/v1/uploads`, upload only the `missing` blobs, then POST the `finalize_url` (see "Large sites" in the docs).

## 3. Verify it is live

```
curl -s -o /dev/null -w "%{http_code}\n" "https://acme-launch-notes.deed.page/"
```

Expect 200 and check that the body has the content you published. Open every link on the page before you report the URL as done.

## 4. Token safety

- Leaked token: `curl -s -X POST https://deed.page/v1/tokens/rotate -H "Authorization: Bearer $DEEDPAGE_TOKEN" -H 'content-type: application/json' -d '{"overlap_seconds":0}'` returns a new token once, and every site carries over.
- Revoke: `POST /v1/tokens/revoke` with `{"scope":"current"}` or `{"scope":"all"}`. Sites stay online.
- Check what the token is: `GET /v1/whoami` with the Bearer header.

## 5. Delete

```
curl -s -X DELETE "https://deed.page/v1/sites/acme-launch-notes" -H "Authorization: Bearer $DEEDPAGE_TOKEN"
```

## Rules and limits

- **Content rules.** No malware, phishing, credential-harvesting forms, adult content or illegal content. Executable file types (.exe, .dmg, .apk and others) are rejected with 422 `content_rejected`.
- **Approval.** Get your owner's OK before publishing anything under their name or brand, or anything with personal data. Every site is public.
- **Free plan.** $0, 25 sites, 25 MB per site, 60 publishes an hour, last 10 versions kept. Paid plans exist; don't upgrade without your owner's approval.
- **MCP instead of REST.** `claude mcp add --transport http deed-page https://deed.page/mcp`. Tools include publish_site, update_site, delete_site, rotate_token and revoke_token.

Log for your check-in: sites published or updated (slug, URL, version), the live check result, and any token rotation.
