{ // Kolwen landing — Cloudflare Worker: static assets, plus one script (worker/index.mjs) that answers no request a // static asset does not answer, probes the sitemap pages every 15 minutes, and mails an alert on failure (see that file). // Deployed automatically by Workers Builds on push to main. "name": "kolwen", "main": "worker/index.mjs", // LWK-220 (Cloudflare audit WP F1): the production alias `kolwen.hetcreep.workers.dev` does not pass the // zone and accepted TLS 1.0 and 1.1 when measured on 2026-09-26. kolwen.com is the one production origin. // Set here rather than only in the dashboard: Cloudflare says a dashboard-only switch is re-enabled by the next deploy. "workers_dev": false, // Version URLs and workers.dev Preview URLs stay ON, stated explicitly because their default FOLLOWS workers_dev. // Cloudflare's Version URLs page ("Enable or disable Version URLs"): "When no Version URL setting exists, Version // URLs follow the same default as your `workers.dev` route ... If `workers_dev` is disabled, Version URLs are // disabled by default." Its configuration page, `preview_urls`: "If omitted, Wrangler does not change an existing // setting. If no setting exists, its initial value depends on `workers_dev`." So disabling workers_dev while // leaving this out could switch previews off on a fresh state. Whether previews stay public is an open OWNER // decision (the 2026-09-23 ruling on Previews stands), and this setting changes nothing about it. "preview_urls": true, // compatibility_date and assets stay TOP-LEVEL, never duplicated inside `previews` below -- // Cloudflare's own guidance: "Keep at the top level, even with an ASSETS binding." Both // apply to previews automatically because they are not per-environment settings. "compatibility_date": "2026-08-01", "assets": { "directory": "./web", // The script reaches the pages through this binding (env.ASSETS in worker/index.mjs). "binding": "ASSETS", // 404-page (LWK-134a, owner-approved AM-6): an unmatched path returns 404 with web/404.html. // It used to be single-page-application, which answered 200 with the home page for every // wrong URL -- measured 2026-09-03 -- so crawlers indexed nonexistent pages as real ones. "not_found_handling": "404-page" }, // Every 15 minutes the script probes the six sitemap pages. Cron Triggers allowed per account: 5 on Workers Free // (https://developers.cloudflare.com/workers/platform/limits/). This file uses one. "triggers": { "crons": ["*/15 * * * *"] }, // Workers Logs (https://developers.cloudflare.com/workers/observability/logs/workers-logs/): invocation_logs off, so a visitor's request is never logged; only the probe results the script writes with console.log are kept. // Free: 200,000 log events a day, 3 days retention. "observability": { "enabled": true, "logs": { "invocation_logs": false } }, // Alert mail. The binding names no destination: the recipient is the ALERT_TO secret (never in this file, the repository is public), // and a send to an address that is not verified is refused by the platform (its refusal is caught in worker/index.mjs; not read on the pages). "send_email": [ { "name": "EMAIL", "remote": true } ], // The status record: one object under the key `state`, written once per scheduled run (the last run's time, each page's path, status, timing and result, and which result // the owner was last told of; no personal data). GET /status.json serves it publicly. The maintainer created the namespace through the Cloudflare API; the id is not a secret // (it grants no access by itself; reading or writing the namespace needs an API token for the account). Preview audit: the record is public data already, so a preview that reads it exposes nothing new. A preview never writes it: // Cloudflare's Previews resources page says the scheduler does not call a Preview's scheduled() handler, and previews bind a namespace of their own (see `previews` below). "kv_namespaces": [ { "binding": "STATUS", "id": "5590bbcdccde496ba7e9c8ef1dd51f7b" } ], "vars": { // The sender: an address on kolwen.com, allowed once kolwen.com is onboarded for Email Service (the owner's step). "ALERT_FROM": "info@kolwen.com" }, // Workers Previews (LWK-198): public by owner ruling, 2026-09-23, with no Cloudflare Access. // Previews do not inherit the top-level (production) settings, and "Cron Triggers target production": the scheduler does not call a Preview's // scheduled() handler (Cloudflare's Previews configuration and resources pages, read 2026-10-30). So a preview has no cron, no EMAIL binding, // no ALERT_FROM var and no ALERT_TO secret. Its one binding is STATUS, on a separate namespace (kolwen-status-preview, created by the maintainer // through the Cloudflare API), so a preview's /status.json reads a record of its own and never production's. Every binding added here is audited first: a preview's service bindings call the bound // Worker's PRODUCTION deployment, and nothing payment- or customer-facing may be reachable from a preview. "previews": { "kv_namespaces": [ { "binding": "STATUS", "id": "cdf17189811f4cd6a4311839c24cc019" } ] } }