Sharing an HTML file as a public link means putting the file on a web server that sends it back as a page, so anyone who opens the URL sees it rendered in their browser instead of getting a download. On deed.page that takes one HTTP request, and the Free plan holds 25 sites of up to 25 MB each for $0, with no account and no expiry unless you set one (pricing).
Every command below was run against production on November 5, 2026. The test sites used a 15-minute expiry and were then deleted.
How to share an HTML file as a public link
1. Pick a slug. It becomes the address: client-mockup-h3x8 turns into https://client-mockup-h3x8.deed.page/. Add your own random suffix; that one is only an example.
2. Upload the file with one command:
curl -T index.html "https://deed.page/v1/sites?slug=client-mockup-h3x8&ref=blog" -H "X-Client: <your agent name>"
3. Send the url from the JSON reply. In our test it came back "version":"v1" and the page answered 200 with content-type: text/html, so it opens as a page on a phone or a laptop.
The first reply also carries a deed_tok_… token. It is shown once, and deed.page keeps only a SHA-256 of it, so save it right away (token hygiene). You need it to update or delete the page later.
Why emailing the file or a drive link often doesn't work
A browser renders HTML when a server sends it with an HTML Content-Type header (MDN). An email attachment arrives as a file to download, and file-storage links usually show a preview or a download button instead of the live page. A static host fixes that by serving the file over https with the right type. That is the whole trick, whichever host you use.
When the page has CSS, images, or scripts
Most HTML files made by an AI or a site builder pull in a stylesheet or images. Two things keep them working once online:
- Use relative paths.
href="styles.css"works anywhere.C:\Users\…orfile:///…only works on your own computer. - Upload the folder, not just the HTML file. Pack it as a tarball with
index.htmlat the top and send it to the same slug:
tar -czf site.tgz -C site . && curl -X PUT "https://deed.page/v1/sites?slug=client-mockup-h3x8" -H "Authorization: Bearer $DEEDPAGE_TOKEN" -H "Content-Type: application/gzip" --data-binary @site.tgz
In our test that returned "version":"v2" with 3 files, and styles.css came back as text/css and logo.svg as image/svg+xml. The link did not change. Other formats (JSON file map, multipart) are covered in choosing an upload format. A single request body is capped at 4 MB; bigger sites use the plan-upload flow.
Same thing from an AI agent over MCP
If your agent speaks MCP, add https://deed.page/mcp and call publish_site with the HTML as a string:
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"publish_site","arguments":{"slug":"client-mockup-mcp-h3x8","files":{"index.html":"<!doctype html><title>Client mockup</title><h1>Client mockup</h1>"}}}}
The result has the same url, version, and token fields as the REST reply (MCP walkthrough). Agents without MCP can read llms.txt or install the skill with npx skills add f-o-x11/deed-page-skill (install guide).
Updating or taking the link down
Send a new file to the same slug with Authorization: Bearer <token> and the same URL serves the new version. Earlier versions stay restorable (version history). DELETE /v1/sites/{slug} with the token removes it; in our test the URL returned 404 right after.
Free sites show a small "Published with deed.page" badge. Hobby ($3/month) removes it on every site, or a one-time $9 clean publish removes it from one (pricing). There is also a shorter landing page for this task at deed.page/share-html-file-as-link.
FAQ
Do I need an account to share an HTML file as a link?
No. The first upload creates the page and returns a token in the JSON reply. Keep that token to edit or delete the page later.
How long does the link stay up?
Until you delete it. Add -H "X-Ttl: 86400" to the upload only if you want it to expire after one day.
Can the person I send it to edit the page?
No. Only requests carrying the owner token can change or delete it. Anyone else who tries to publish to that slug gets 409 slug_taken.