---
name: deed-page
description: "Publish an HTML file or static folder to a permanent public https://.deed.page/ URL with one curl request. No account; the first publish returns a token for updates."
category: devops
risk: critical
source: "https://github.com/f-o-x11/deed-page-skill"
source_repo: "f-o-x11/deed-page-skill"
source_type: official
date_added: "2026-10-20"
license: "MIT"
license_source: "https://github.com/f-o-x11/deed-page-skill/blob/main/LICENSE"
author: Avatar 8 LLC
tags: [deploy, static-site, hosting, publish, html, curl]
tools: [claude, cursor, codex, gemini]
---
# deed.page publish
## Overview
deed.page hosts static files (HTML, CSS, JS, images) at `https://.deed.page/`. A publish
is one `curl` request: no account, API key, email code, or claim link. The agent picks the slug,
and the site stays up until someone deletes it. The first publish returns a token, which is the
only key that can update or delete that site. Adapted from the official skill:
https://github.com/f-o-x11/deed-page-skill
## When to Use This Skill
- Use when the user asks to publish, host, deploy, share online, "put this online" or "give me a
link" for something the agent generated: an HTML report, dashboard, slide deck, landing page,
prototype, game, or docs folder.
- Use when the user wants deed.page, or wants a link without creating an account and has not
picked another host.
- Use when the agent runs unattended and cannot ask a human for a code or a click.
- Do not use for secrets or private data: Free sites are public.
- Do not use for apps that need a server at runtime (SSR, API routes, databases). deed.page serves
static files only.
## How It Works
### Step 1: Pick a slug
Lowercase letters, digits and hyphens, 1 to 63 characters, no leading or trailing hyphen. Add a
random suffix so the name is unlikely to be taken. `hello`, `my-page`, `my-app` and `my-site` are
reserved.
```bash
set -e
UPLOAD_DIR="$(mktemp -d)" || exit 1
SLUG="report-$(head -c4 /dev/urandom | od -An -tx1 | tr -d ' \n')"
REF="${DEED_REF:-skill-agentic-awesome-skills}"
```
`REF` is stored for attribution only and does not change the publish. Set the `X-Client` header
to the agent's name, for example `Claude Code`, `Codex` or `Cursor`.
### Step 2: Confirm what goes public
Before the first publish, tell the user the file or folder will be public at a guessable URL, and
check that it holds no `.env` files, keys, tokens or personal data.
### Step 3: Publish
Do not expose the returned token in shared tool logs. Capture responses into an owner-only private file, parse only public status/URL fields and retain the token through an approved secret mechanism. Build the optional authorization header as a protected curl config file rather than shell word-splitting an expanded string:
```bash
umask 077
: > "$UPLOAD_DIR/headers.conf"
if [ -n "${DEEDPAGE_TOKEN:-}" ]; then
case "$DEEDPAGE_TOKEN" in *[!A-Za-z0-9._~-]*) echo "Unexpected token characters" >&2; exit 1;; esac
printf 'header = "Authorization: Bearer %s"\n' "$DEEDPAGE_TOKEN" > "$UPLOAD_DIR/headers.conf"
fi
```
The upload snippets below illustrate the request; add protected response capture before running them. Verify current provider limits, privacy and retention; “permanent” is a provider claim, not an availability guarantee.
A single HTML file is stored as `index.html`:
```bash
curl -sS -T report.html "https://deed.page/v1/sites?slug=$SLUG&ref=$REF" \
-H "X-Client: " \
--config "$UPLOAD_DIR/headers.conf"
```
A folder: its contents go to the site root, so it should contain `index.html`:
```bash
tar -C ./site -czf "$UPLOAD_DIR/site.tar.gz" . &&
curl -sS -T "$UPLOAD_DIR/site.tar.gz" "https://deed.page/v1/sites?slug=$SLUG&ref=$REF" \
-H "X-Client: " \
--config "$UPLOAD_DIR/headers.conf"
```
A successful response:
```json
{"ok":true,"url":"https://.deed.page/","slug":"","version":"v1","permanent":true,"token":""}
```
### Step 4: Answer the user
- Reply with the `url` field.
- The first publish returns `token` once. Keep it in the session environment as `DEEDPAGE_TOKEN`
and tell the user to store it safely. Never write it into a published page, a commit or a log.
- To update the same site, run the same publish command with `DEEDPAGE_TOKEN` set. Each publish
is a new version; the Free plan keeps the last 10.
### Step 5: Delete, only when asked
```bash
curl -sS -X DELETE "https://deed.page/v1/sites/$SLUG" -H "Authorization: Bearer $DEEDPAGE_TOKEN"
```
## Examples
### Example 1: Share a generated report
```text
User: Publish this report and give me the link.
Agent: Confirms report.html has no private data, picks q3-report-7f3a2c, runs the single-file
curl above, and replies with https://q3-report-7f3a2c.deed.page/ plus a note to save the
returned token if they want to update or delete the page later.
```
### Example 2: Update a built site
```text
User: I changed the copy, push it again.
Agent: Rebuilds, tars dist/ and re-runs the folder publish with DEEDPAGE_TOKEN set. The URL stays
the same and the response shows version v2.
```
## Best Practices
- ✅ Publish the build output (`dist/`, `build/`, `out/`), not the source folder.
- ✅ Use a random slug suffix and keep the same slug for updates.
- ✅ Keep the token out of files, commits and published pages.
- ❌ Do not publish anything the user has not agreed to make public.
- ❌ Do not delete a site unless the user asks for that exact slug.
- ❌ Do not loop new publishes on errors; read the error code first.
## Limitations
- Static files only. Server code does not run.
- Free plan: 25 sites, 25 MB per site, 60 publishes per hour, 4 MB per single request. Larger
sites use the manifest upload flow at https://deed.page/docs.
- A lost token cannot be recovered unless the owner attached an optional recovery email. The site
stays online either way.
- Cloud sandboxes that block outbound network access need `deed.page` allowed.
- Errors: 400 `slug_invalid` (fix the slug), 409 `slug_taken` (use the `suggestion` field or a
new suffix), 409 `version_conflict` (re-read and retry), 422 `content_rejected` (remove the
file, do not retry), 429 (wait `retry_after` seconds).
## Security & Safety Notes
- Publishing puts files on the public internet. Confirm the folder contents first; hidden files
are not a safe place for secrets.
- The token can update and delete the site. Keep it in an environment variable for the session
and never print it into output that gets shared or committed.
- `DELETE` is irreversible for the live site. Run it only on an explicit request.
- The service is operated by Avatar 8 LLC. Abuse reports: https://deed.page/abuse
## Common Pitfalls
- **Problem:** 409 `slug_taken` on the first publish.
**Solution:** Use the `suggestion` field from the response or generate a new suffix.
- **Problem:** The update created a new site instead of a new version.
**Solution:** Reuse the same `SLUG` and send `DEEDPAGE_TOKEN` as a Bearer token.
- **Problem:** The page loads but CSS is missing.
**Solution:** Tar the folder contents with `tar -C ./site ... .` so `index.html` is at the root.
## Related Skills
- `@dropthehassle-publish` - Static hosting with a claim link and custom domains.
- `@cloudflare-pages` - Deploy to the user's own Cloudflare account.
- `@vercel-deployment` - Deploy frameworks that need serverless functions.