Cloudflare Temporary Deploy Skill
Deploy a Cloudflare Worker to a live workers.dev URL with zero account setup, using wrangler deploy --temporary. Cloudflare provisions a throwaway account, deploys, and prints a claim URL valid for 60 minutes; unclaimed accounts auto-delete. This gives an agent a tight write → deploy → verify loop without any OAuth, signup, or token copy-paste.
This skill does NOT cover production deploys (use wrangler login + a permanent account for those), nor non-Worker Cloudflare products beyond the temporary-account limits below.
When to Use
Load this skill when the user wants to:
- Ship agent-written code to a live URL without first creating a Cloudflare account — "deploy this and give me a link"
- Iterate in a background/autonomous session where a browser OAuth step would be a hard stop
- Prototype or evaluate Workers quickly with a throwaway, claimable target
- Build a self-verifying deploy loop — deploy,
curl the live URL, confirm output matches the code, redeploy
When NOT to Use
- Production or CI/CD → use a permanent account (
wrangler login or CLOUDFLARE_API_TOKEN). --temporary errors out if any credential is present.
- Wrangler is already authenticated →
--temporary returns an error by design. Run wrangler logout first only if the user explicitly wants a throwaway deploy.
- Long-lived hosting → temporary deployments are deleted after 60 minutes unless claimed.
Prerequisites
- Wrangler 4.102.0 or later. This is the version that introduced
--temporary. Earlier versions do not have it. Verify with npx wrangler@latest --version.
- Node 18+ / npm (or
npx, yarn, pnpm). No global install needed — npx wrangler@latest works.
- No Cloudflare credentials present.
--temporary only works when Wrangler is unauthenticated: no OAuth login, no CLOUDFLARE_API_TOKEN / CLOUDFLARE_API_KEY env var, no ~/.wrangler / ~/.config/.wrangler cached OAuth. Use the terminal tool's environment as-is; do not set those vars.
- Network egress to
cloudflare.com and workers.dev.
- Using
--temporary accepts Cloudflare's Terms of Service and Privacy Policy.
How to Run
Use the terminal tool for every step. Always pin the version (wrangler@latest or wrangler@4.102.0 or newer) so you don't accidentally run an old global wrangler that lacks the flag.
Scaffold a minimal Worker (skip if the project already exists). A Worker needs a wrangler.toml (or wrangler.jsonc) and an entry script. Minimal TypeScript example — write these with write_file:
wrangler.jsonc:
{
"name": "hello-agent",
"main": "src/index.ts",
"compatibility_date": "2025-01-01"
}
src/index.ts:
export default {
async fetch(): Promise<Response> {
return new Response("hello cloudflare");
},
};
Deploy with --temporary from the project directory:
npx wrangler@latest deploy --temporary
The proof-of-work check adds a short automatic delay. On success Wrangler prints an Account: <name> (created) (or (reused)) line, a Claim URL, and the live https://<worker>.<account>.workers.dev URL.
Parse the URLs from that output. Run the helper to extract them reliably instead of eyeballing:
npx wrangler@latest deploy --temporary 2>&1 | python3 scripts/parse_deploy_output.py
(Resolve scripts/parse_deploy_output.py to this skill's absolute path.) It prints JSON: {"live_url", "claim_url", "account", "account_state", "expires_minutes", "deployed"}.
Verify the deploy is actually live — do not trust the deploy log alone. curl the live URL and confirm the body matches what the code returns:
curl -sS <live_url>
Iterate. Edit the code, redeploy with the same npx wrangler@latest deploy --temporary. Within the 60-minute window Wrangler reuses the cached temporary account (Account: <name> (reused)), so the URL stays stable. curl again to confirm the change.
Hand the claim URL to the user. Tell them: open it within 60 minutes to keep the deployment and any resources; if they don't claim it, everything auto-deletes. Treat the claim URL as a secret — it grants ownership of the account.
Quick Reference
| Step |
Command |
| Check version (need 4.102.0+) |
npx wrangler@latest --version |
| Deploy (no account) |
npx wrangler@latest deploy --temporary |
| Deploy + parse URLs |
npx wrangler@latest deploy --temporary 2>&1 | python3 scripts/parse_deploy_output.py |
| Verify live |
curl -sS <live_url> |
| Clear cached temp account |
npx wrangler@latest logout |
Temporary account product limits
| Product |
Limit on a temporary account |
| Workers |
Deploys to workers.dev |
| Static Assets |
Up to 1,000 files, 5 MiB each |
| KV |
Allowed |
| D1 |
1 database, 100 MB per DB / 100 MB total |
| Durable Objects |
Allowed |
| Hyperdrive |
2 configs, 10 connections |
| Queues |
Up to 10 |
| SSL/TLS certs |
Allowed |
Pitfalls
--temporary is not in wrangler deploy --help and is not a global flag. It is intentionally hidden and surfaced dynamically: when an unauthenticated wrangler deploy fails, Wrangler prints "rerun with --temporary". Don't conclude the flag is missing just because --help omits it — check the version instead.
- Old global wrangler. A stale globally-installed
wrangler (< 4.102.0) silently lacks the flag. Always invoke npx wrangler@latest (or a pinned >=4.102.0) so you control the version.
- Auth present → hard error. If
wrangler login was ever run, or CLOUDFLARE_API_TOKEN/CLOUDFLARE_API_KEY is set, --temporary errors. Either unset the var for this shell or wrangler logout. Never strip a user's real credentials without telling them.
- Rate limiting. Creating temporary accounts too fast fails. Reuse the cached account (just redeploy) within the 60-minute window instead of forcing a new one; if rate-limited, wait or use a permanent account.
- 60-minute hard expiry, not extendable. If the deploy must outlive an hour, the user must claim it. Surface this clearly.
curl may briefly serve the old body after a redeploy. workers.dev has a short edge cache; the (reused) line plus a new Current Version ID confirm the deploy succeeded even if curl shows stale content for a few seconds. Re-curl, or add a cache-busting query string, before concluding a redeploy failed.
- Don't log the claim URL into shared transcripts as "just a link." It is credential-equivalent.
Verification
npx wrangler@latest --version returns >= 4.102.0.
npx wrangler@latest deploy --temporary prints a workers.dev live URL and a claim-preview?claimToken= claim URL.
curl -sS <live_url> returns the exact body the Worker code produces.
- A second deploy reports
Account: <name> (reused) and the live URL is unchanged.
- The parser script's self-test passes:
python3 scripts/parse_deploy_output.py --selftest.
Source: NousResearch/hermes-agent → optional-skills/web-development/cloudflare-temporary-deploy/SKILL.md
1---2name: cloudflare-temporary-deploy3description: Deploy a Worker live, no account, via wrangler --temporary.4---567# Cloudflare Temporary Deploy Skill89Deploy a Cloudflare Worker to a live `workers.dev` URL with zero account setup, using `wrangler deploy --temporary`. Cloudflare provisions a throwaway account, deploys, and prints a claim URL valid for 60 minutes; unclaimed accounts auto-delete. This gives an agent a tight write → deploy → verify loop without any OAuth, signup, or token copy-paste.1011This skill does NOT cover production deploys (use `wrangler login` + a permanent account for those), nor non-Worker Cloudflare products beyond the temporary-account limits below.1213## When to Use1415Load this skill when the user wants to:1617- **Ship agent-written code to a live URL** without first creating a Cloudflare account — "deploy this and give me a link"18- **Iterate in a background/autonomous session** where a browser OAuth step would be a hard stop19- **Prototype or evaluate Workers** quickly with a throwaway, claimable target20- **Build a self-verifying deploy loop** — deploy, `curl` the live URL, confirm output matches the code, redeploy2122## When NOT to Use2324- **Production or CI/CD** → use a permanent account (`wrangler login` or `CLOUDFLARE_API_TOKEN`). `--temporary` errors out if any credential is present.25- **Wrangler is already authenticated** → `--temporary` returns an error by design. Run `wrangler logout` first only if the user explicitly wants a throwaway deploy.26- **Long-lived hosting** → temporary deployments are deleted after 60 minutes unless claimed.2728## Prerequisites2930- **Wrangler 4.102.0 or later.** This is the version that introduced `--temporary`. Earlier versions do not have it. Verify with `npx wrangler@latest --version`.31- **Node 18+ / npm** (or `npx`, `yarn`, `pnpm`). No global install needed — `npx wrangler@latest` works.32- **No Cloudflare credentials present.** `--temporary` only works when Wrangler is unauthenticated: no OAuth login, no `CLOUDFLARE_API_TOKEN` / `CLOUDFLARE_API_KEY` env var, no `~/.wrangler` / `~/.config/.wrangler` cached OAuth. Use the `terminal` tool's environment as-is; do not set those vars.33- Network egress to `cloudflare.com` and `workers.dev`.34- Using `--temporary` accepts Cloudflare's Terms of Service and Privacy Policy.3536## How to Run3738Use the `terminal` tool for every step. Always pin the version (`wrangler@latest` or `wrangler@4.102.0` or newer) so you don't accidentally run an old global wrangler that lacks the flag.39401. **Scaffold a minimal Worker** (skip if the project already exists). A Worker needs a `wrangler.toml` (or `wrangler.jsonc`) and an entry script. Minimal TypeScript example — write these with `write_file`:4142 `wrangler.jsonc`:43 ```jsonc44 {45 "name": "hello-agent",46 "main": "src/index.ts",47 "compatibility_date": "2025-01-01"48 }49 ```5051 `src/index.ts`:52 ```typescript53 export default {54 async fetch(): Promise<Response> {55 return new Response("hello cloudflare");56 },57 };58 ```59602. **Deploy with `--temporary`** from the project directory:61 ```62 npx wrangler@latest deploy --temporary63 ```64 The proof-of-work check adds a short automatic delay. On success Wrangler prints an `Account: <name> (created)` (or `(reused)`) line, a `Claim URL`, and the live `https://<worker>.<account>.workers.dev` URL.65663. **Parse the URLs** from that output. Run the helper to extract them reliably instead of eyeballing:67 ```68 npx wrangler@latest deploy --temporary 2>&1 | python3 scripts/parse_deploy_output.py69 ```70 (Resolve `scripts/parse_deploy_output.py` to this skill's absolute path.) It prints JSON: `{"live_url", "claim_url", "account", "account_state", "expires_minutes", "deployed"}`.71724. **Verify the deploy is actually live** — do not trust the deploy log alone. `curl` the live URL and confirm the body matches what the code returns:73 ```74 curl -sS <live_url>75 ```76775. **Iterate.** Edit the code, redeploy with the same `npx wrangler@latest deploy --temporary`. Within the 60-minute window Wrangler reuses the cached temporary account (`Account: <name> (reused)`), so the URL stays stable. `curl` again to confirm the change.78796. **Hand the claim URL to the user.** Tell them: open it within 60 minutes to keep the deployment and any resources; if they don't claim it, everything auto-deletes. Treat the claim URL as a secret — it grants ownership of the account.8081## Quick Reference8283| Step | Command |84|---|---|85| Check version (need 4.102.0+) | `npx wrangler@latest --version` |86| Deploy (no account) | `npx wrangler@latest deploy --temporary` |87| Deploy + parse URLs | `npx wrangler@latest deploy --temporary 2>&1 \| python3 scripts/parse_deploy_output.py` |88| Verify live | `curl -sS <live_url>` |89| Clear cached temp account | `npx wrangler@latest logout` |9091### Temporary account product limits9293| Product | Limit on a temporary account |94|---|---|95| Workers | Deploys to `workers.dev` |96| Static Assets | Up to 1,000 files, 5 MiB each |97| KV | Allowed |98| D1 | 1 database, 100 MB per DB / 100 MB total |99| Durable Objects | Allowed |100| Hyperdrive | 2 configs, 10 connections |101| Queues | Up to 10 |102| SSL/TLS certs | Allowed |103104## Pitfalls105106- **`--temporary` is not in `wrangler deploy --help` and is not a global flag.** It is intentionally hidden and surfaced dynamically: when an unauthenticated `wrangler deploy` fails, Wrangler prints "rerun with `--temporary`". Don't conclude the flag is missing just because `--help` omits it — check the version instead.107- **Old global wrangler.** A stale globally-installed `wrangler` (`< 4.102.0`) silently lacks the flag. Always invoke `npx wrangler@latest` (or a pinned `>=4.102.0`) so you control the version.108- **Auth present → hard error.** If `wrangler login` was ever run, or `CLOUDFLARE_API_TOKEN`/`CLOUDFLARE_API_KEY` is set, `--temporary` errors. Either unset the var for this shell or `wrangler logout`. Never strip a user's real credentials without telling them.109- **Rate limiting.** Creating temporary accounts too fast fails. Reuse the cached account (just redeploy) within the 60-minute window instead of forcing a new one; if rate-limited, wait or use a permanent account.110- **60-minute hard expiry, not extendable.** If the deploy must outlive an hour, the user must claim it. Surface this clearly.111- **`curl` may briefly serve the old body after a redeploy.** `workers.dev` has a short edge cache; the `(reused)` line plus a new `Current Version ID` confirm the deploy succeeded even if `curl` shows stale content for a few seconds. Re-curl, or add a cache-busting query string, before concluding a redeploy failed.112- **Don't log the claim URL into shared transcripts as "just a link."** It is credential-equivalent.113114## Verification115116- `npx wrangler@latest --version` returns `>= 4.102.0`.117- `npx wrangler@latest deploy --temporary` prints a `workers.dev` live URL and a `claim-preview?claimToken=` claim URL.118- `curl -sS <live_url>` returns the exact body the Worker code produces.119- A second deploy reports `Account: <name> (reused)` and the live URL is unchanged.120- The parser script's self-test passes: `python3 scripts/parse_deploy_output.py --selftest`.121122---123124**Source:** [`NousResearch/hermes-agent`](https://github.com/NousResearch/hermes-agent) → `optional-skills/web-development/cloudflare-temporary-deploy/SKILL.md`