# Temporary website hosting: a link that deletes itself after 24 hours

chorus.host gives you a temporary website with no account: one command, a live `https://<name>.chorus.host` link, and the site deletes itself 24 hours later. With a free API key you choose the expiry, or keep the site.

## Key facts

Facts checked 1 October 2026.

| | |
|---|---|
| Lifetime without an account | 24 hours, fixed (`GET /v1/limits` reports `siteLifetimeSeconds: 86400`) |
| Shorter expiry | Any time sooner than that, with or without an account |
| Longer or custom expiry | Any future time with a free API key (`expiresAt`), or no expiry at all |
| At expiry | The URL returns 404 and the site is deleted |
| While live | Sent with `X-Robots-Tag: noindex`, so search engines leave it out |
| Size | 250 MB per file and 10 GB per site; 4 MB per request for the one-request endpoint |
| Publishes without an account | 5 per hour per IP address |
| Password | Optional, free |

## Get a 24-hour link with one command

A folder (a build output, say):

```bash
curl -fsSL https://chorus.host/publish.py | python3 - ./dist
```

One file:

```bash
curl -sS https://chorus.host/v1/publish -F file=@report.html
```

Both print the link, when it expires, and a claim link (trimmed):

```json
{
  "url": "https://navy-twig-20.chorus.host",
  "expiresAt": "2026-10-02T05:30:23Z",
  "claimUrl": "https://chorus.host/claim/navy-twig-20#ctk_REDACTED"
}
```

Measured on 1 October 2026: 3.2 seconds from the command to a live URL for a 3-file build.

No Python and more than one file? Zip the folder and send `-F archive=@dist.zip` to `/v1/publish`, or use the [folder script](/guides/host-static-site-no-signup#a-whole-folder-with-curl).

## Preview a build folder

| Framework | Build command | Folder to publish |
|---|---|---|
| Vite (React, Vue, Svelte) | `npm run build` | `dist/` |
| Create React App | `npm run build` | `build/` |
| Next.js with `output: 'export'` | `npm run build` | `out/` |
| Astro (static) | `npm run build` | `dist/` |
| SvelteKit with `adapter-static` | `npm run build` | `build/` |

Absolute paths like `/assets/index-3f2a.js` work, because each site sits at the root of its own subdomain.

One caveat: there's no single-page-app fallback. Refreshing or opening a client-side route such as `/settings` returns 404, because no file is called `settings`. Use hash routing for previews, or send reviewers to the root URL and let them click through.

## Choose when it expires

Without an account the expiry can be set to any time up to 24 hours after the site was first published, never later. A one-hour link:

```bash
curl -sS https://chorus.host/v1/publish -F file=@report.html -F expires=1h
curl -fsSL https://chorus.host/publish.py | python3 - ./dist --expires 1h
```

With a free API key, any future time works, and so does no expiry at all. A link that lasts 7 days:

```bash
curl -sS https://chorus.host/v1/publish -H "Authorization: Bearer $CHORUS_API_KEY" \
  -F file=@report.html -F expires=7d
```

`expires` takes `90m`, `2h`, `7d` or an RFC 3339 time like `2026-10-08T00:00:00Z`. To change the expiry of a site that's already live:

```bash
EXPIRES=$(date -u -v+2H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '+2 hours' +%Y-%m-%dT%H:%M:%SZ)
curl -sS -X PATCH "https://chorus.host/v1/sites/$SLUG/metadata" \
  -H "X-Claim-Token: $TOKEN" -H 'Content-Type: application/json' \
  -d '{"expiresAt":"'"$EXPIRES"'"}'
```

For a site in your account, send `Authorization: Bearer $CHORUS_API_KEY` instead of `X-Claim-Token`; then the time can be later than 24 hours, or `null` to remove the expiry.

Updating a site doesn't reset its clock: a new version keeps the expiry the site already had.

## What happens when the link expires

We tested this on 1 October 2026 with a site set to expire 75 seconds after publishing: it answered `200` before the expiry and `404` at 85 seconds, with `X-Robots-Tag: noindex`. A cleanup job then deletes the site's records within minutes.

- Visitors see a "This site doesn't exist" page with a link to publish their own.
- The claim link stops working, and expired sites can't be restored.
- To keep a site, open its claim link before it expires and sign in with an emailed code.

Check whether a link is still up:

```bash
curl -s -o /dev/null -w '%{http_code}\n' https://navy-twig-20.chorus.host/
```

## Take it down early

```bash
curl -sS -X DELETE "https://chorus.host/v1/sites/$SLUG" -H "X-Claim-Token: $TOKEN"
```

The URL returns 404 straight away.

## Ask your agent

```text
Publish ./dist to chorus.host as a temporary preview. Give me the link and when it expires. Instructions: https://chorus.host/skill.md
```

With the MCP server (`claude mcp add --transport http chorus https://chorus.host/mcp`), the `publish_site` tool returns `expires_at` and `claim_url`, and takes an optional `expires_at` argument for a shorter or, with an API key, longer life.

## Temporary hosting options compared

As of 1 October 2026, from each service's own docs. "Not documented" means we couldn't find it stated, not that it's missing. We make chorus.host.

| | Without an account | When an unclaimed link expires | Choose your own expiry | No-account rate limit | Folder or build upload |
|---|---|---|---|---|---|
| chorus.host | Yes | 24 hours | Shorter without an account; any time with a free account | 5 per hour per IP | Yes |
| [here.now](https://here.now/docs) | Yes | 24 hours | With an account (`--ttl`) | 60 per hour per IP | Yes |
| [htmlshare.net](https://htmlshare.net/docs) | Yes | 24 hours, then `410 Gone`; recoverable for 7 days | Not documented | Not documented | One HTML file, up to 10 MB |
| [Netlify CLI](https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli/) `--allow-anonymous` | Yes | Removed after 1 hour unless claimed | No | Not documented | Yes |
| [Cloudflare Drop / `wrangler --temporary`](https://developers.cloudflare.com/workers/platform/claim-deployments/) | Yes | Deleted after 60 minutes unless claimed | No | Not documented | Yes |
| [PreviewShip](https://previewship.com) | Guest links on its site; the CLI needs an API key | Guest links: 24 hours. Free plan previews: 3 days | Not documented | Not documented | Yes |
| [surge.sh](https://surge.sh/docs/getting-started) | No (account created on first run) | No automatic expiry documented | No | n/a | Yes |
| S3 presigned URL | No (AWS account) | 1 minute to 12 hours from the console, up to 7 days from the CLI or SDK | Yes | n/a | One object per URL |

Where others are better: here.now allows 60 publishes an hour without an account against chorus.host's 5, and has a single-page-app mode. htmlshare.net answers `410 Gone` after expiry and keeps the page recoverable for 7 days. Netlify and Cloudflare turn into full hosting once you claim the site.

## Temporary site or tunnel?

A tunnel (Cloudflare Tunnel, ngrok, localhost.run) shares the dev server running on your laptop: it's live as long as your laptop is on and the server is running. A temporary site is an uploaded copy: it stays up for 24 hours whether your laptop is open or not, and it doesn't change when you edit your code.

## Questions

### How do I host a website temporarily for free?

Run `curl -fsSL https://chorus.host/publish.py | python3 - ./site`. The site is live at `https://<name>.chorus.host` for 24 hours with no account, then it deletes itself.

### Is there a host where the link expires automatically after 24 hours?

Yes. Anything published to chorus.host without an account is deleted 24 hours after it was first published, and the URL returns 404. You can make it shorter with `expires`, or claim it to keep it.

### How do I get a temporary preview link for a dist folder from the command line?

Build, then run `curl -fsSL https://chorus.host/publish.py | python3 - ./dist`. It prints the preview link and its expiry. Running it again from the same folder updates the same link.

### Can I make the link expire sooner or later than 24 hours?

Sooner, yes, with or without an account: add `-F expires=2h` or `--expires 2h`. Later needs a free API key, which accepts any future time or no expiry.

### What does someone see after it expires?

A 404 page saying "This site doesn't exist", with a link to publish their own. The site's files are deleted and can't be restored.

### Will search engines index my temporary site?

No. Sites published without an account are sent with `X-Robots-Tag: noindex`.

### Does updating the site reset the 24 hours?

No. A new version keeps the expiry the site already had.

### Can I keep it after all?

Yes, until it expires: open the claim link and sign in with your email and the 6-digit code we send. The expiry is removed.
