cloudflare-cron-telegram-alertlisted
Install: claude install-skill jackson2w/claude-code-skills
# Cloudflare Cron + Telegram Alert Worker
A minimal, reusable shape for "check something on a schedule, alert only when it's broken" —
built out fully for a tailnet uptime monitor; the same shape fits any periodic external check.
## Project shape
```
wrangler.jsonc # cron trigger, no public route (see below)
src/index.ts # scheduled() handler + fetch() stub
package.json
tsconfig.json
.gitignore # node_modules/, .wrangler/, .dev.vars, worker-configuration.d.ts
```
`wrangler.jsonc` essentials:
```jsonc
{
"name": "<worker-name>",
"main": "src/index.ts",
"compatibility_date": "<recent date>",
"observability": { "enabled": true },
"workers_dev": false, // no public HTTP route needed — cron-only
"preview_urls": false,
"triggers": { "crons": ["*/5 * * * *"] }
}
```
**Disable `workers_dev`/`preview_urls` explicitly.** A cron-only Worker gets a public
`*.workers.dev` route by default on first deploy unless these are set — unnecessary attack
surface for something that never needs inbound HTTP.
## Handler pattern
```typescript
export interface Env {
TELEGRAM_BOT_TOKEN: string;
TELEGRAM_CHAT_ID: string;
TARGET_URL: string;
}
export default {
async scheduled(_event, env, ctx): Promise<void> {
ctx.waitUntil(checkTarget(env));
},
async fetch(): Promise<Response> {
return new Response("cron-only Worker; use wrangler dev --test-scheduled to test");
},
} satisfies ExportedHandler<Env>;
async function checkTarget(env: Env):