Teitunnel

Guides

Offline page

Show your own page instead of Cloudflare's error 1033 when the computer serving a route is off or asleep, with a small Worker on your own Cloudflare account.

When the computer that serves a route is off, asleep or offline, Cloudflare can't reach its tunnel and shows visitors error 1033, a Cloudflare error page that looks like the site is broken. An offline page replaces it with a page of your own ("Back soon"), served by a small Worker on your Cloudflare account, so it works while your computer is off.

Use it for routes people visit when you're not watching: a portfolio or side project on a laptop, a home server that restarts, a demo you send before a meeting. For a static site that must stay fully online, publish a Snapshot instead.

Turn it on in the app

A route in Routes: While This Computer Is Off, with its offline page and webhook inbox

Open the route in Routes. Under While This Computer Is Off ("Workers on your Cloudflare account keep answering when this computer is off or asleep."), choose Turn On… next to Offline page.

In Offline Page for app.yourhost.com, give it a Title (up to 120 characters) and a Message (up to 1,000 characters; each line becomes a paragraph).

Optionally turn on Also when the app doesn't answer: it shows the page too when the tunnel is up but the local service returns 502 or 504, for example because the app on this computer crashed or wasn't started.

Choose Review, read the plan, and choose Apply. The plan warns about the cost (see Limits and costs). The route then shows Edit… and Remove for the page.

From the terminal

teitunnel offline app.yourhost.com --title "Back soon" --message "We're updating the demo. Try again in an hour."
teitunnel offline app.yourhost.com --when-app-down      # also for 502/504 from the app
teitunnel offline app.yourhost.com                      # what it has now
teitunnel offline app.yourhost.com --off                # remove it

--title turns the page on; --title, --message and --when-app-down change only what you pass and keep the rest. Without options, it prints the current title, message and setting. -a, --account chooses the account and -y, --yes applies without asking.

What happens on Cloudflare

The plan ("Show an offline page on app.yourhost.com") has two steps:

  1. Upload the offline page Worker for app.yourhost.com. It's named tt-offline- and a short hash of the hostname.
  2. Run it for app.yourhost.com/* "(fails open past the free daily requests)": a Worker route on the hostname.

Removing it stops running the Worker for the pattern, then deletes the Worker. Undo in Activity reverses either change; a deleted Worker is restored from its recorded settings. Removing a hostname's last route removes its offline page too.

Teitunnel only changes Workers and Worker routes it created. If another Worker already runs on the same pattern, the plan stops with "Another Worker (…) already runs for app.yourhost.com/*. Teitunnel doesn't change Workers it didn't add." and changes nothing.

How it works

The Worker passes every request on to your tunnel unchanged, without buffering bodies; uploads, streaming and WebSockets work as before, and a working response is never changed. Only when Cloudflare answers 530 (error 1033: no connector for the tunnel), or 502/504 with Also when the app doesn't answer, does it answer instead:

  • Pages (a browser navigation): your page, with status 503, Retry-After: 60, Cache-Control: no-store and noindex, so browsers and search engines treat it as temporary and never cache or index it. It follows the visitor's light or dark setting, loads nothing from elsewhere, and your text is always shown as text.
  • Everything else (API calls, images, scripts): a short 503 JSON answer {"error": "offline", "message": "<title>"}.

Limits and costs

Cloudflare free plan
Requests that run the WorkerEvery request to the hostname, even while this computer is on
Free Worker requests100,000 a day for the whole account, reset at 00:00 UTC
Past the limitThe route fails open: the site keeps working without the Worker

The Worker route is created to fail open (verified on a live Free-plan account on 2026-09-25: the dashboard shows "Request limit failure mode: Fail open (proceed)"). Once the day's free requests are used up, requests go straight to your tunnel as if there were no Worker; only the offline page is missing until 00:00 UTC. Your site never goes down because of the limit. That's why the page is off by default and chosen per route, and why the plan warns: "Every request to app.yourhost.com/* runs a Worker and counts against your account's 100,000 free Worker requests a day. Past that, the site keeps working without it."

Permissions

Account · Workers Scripts · Edit and Zone · Workers Routes · Edit on the route's domain. Tokens created from Teitunnel's link and OAuth sign-in include both. If one is missing, Teitunnel shows what to add and continues when you're back.

Troubleshooting

Edit on GitHub

Last updated on

On this page