FlareCraft is a hands-on evaluation of the Cloudflare developer platform — built using the platform itself. This page is the architecture reference and the honest write-up of choices made.
A daily briefing of what developers are shipping on a platform is exactly the kind of work a developer adoption function does. So FlareCraft does that work — using the platform itself. The act of building this is the demonstration; the artifact persists as a useful tool. The system reporting on the platform is the platform.
Two Workers in one repo, sharing eight Cloudflare primitives plus three external services (Beehiiv for audience, Resend for delivery, AnswerOverflow's MCP server for Discord):
flarecraft-pipeline (cron + AI + writes) and flarecraft-site (this SSR site, reads). Same runtime, different roles. One Worker per concern is the cleaner production pattern.WorkflowEntrypoint. Each step (fetch → classify+persist → finalize → notify) is a checkpointed step.do with its own retry policy. A step.sleep between persist and digest forces a fresh Worker invocation so the digest doesn't share the heavy step's subrequest budget. Durable execution is a primitive of the platform — no Temporal sidecar.wrangler.jsonc ("crons": ["0 12 * * *"]) registers the daily 07:00 CT run. The cron handler instantiates a Workflow and returns; the Workflow runs durably in its own context.response_format: json_schema). The schema enforces the exact shape downstream storage expects — no parsing brittleness. Quality matters more than latency for a daily-cron workload, so 70B over 8B.title + one_liner for semantic dedup. Different model, same inference platform, same binding.topK: 1; if cosine similarity exceeds 0.92 against any existing vector, it's treated as a duplicate and skipped. Catches the case where the same launch gets posted multiple times across HN threads — hash-on-URL would let those through; semantic dedup catches them.briefings (one row per pipeline run) and items (classified posts). Pipeline writes; this site reads in the SSR request path. Same database, two Workers, different bindings — capability-based separation.date/source/id. Egress-free storage means the entire corpus can be re-classified later when the prompt or model improves, without re-fetching from HN.@astrojs/cloudflare, so dynamic data from D1 lands in the request path with no rebuild needed. Static assets (favicons, fonts, brand) are served by the same Worker via the ASSETS binding.flare-craft.beehiiv.com. Audience layer — owns growth, archive, list management. Beehiiv's programmatic publish API is enterprise-only, which surfaced at runtime; the resulting dual-platform architecture is actually more honest than a single-vendor stack.notes@flarecraft.dev via verified domain (SPF/DKIM/DMARC auto-written to the Cloudflare zone by Resend's add-domain integration — a great two-platform handshake).serverId: 595317990191398933), filter by recency (7-day window), and feed the resulting Q&A threads through the same classifier as HN and Reddit — with a new q-and-a angle and a structurally-derived resolved boolean from AO's solution field.step.do; outer steps mark phases.pipeline/src/lib/ returning SourcePost[]. Hacker News, Reddit, and the Cloudflare Discord (via AnswerOverflow's MCP server) are live.@astrojs/cloudflare adapter doesn't natively host a Workflow class export. Two-Worker split is the cleaner production pattern anyway.create-cloudflare) is past EOL; first-day DX surfaces a deprecated tool.Astro.locals.runtime.env in favor of import [object Object] from "cloudflare:workers" — only visible at runtime.response_format: json_schema returns one of three different shapes depending on model; caller has to coerce.returnMetadata takes "none" | "indexed" | "all", not booleans.step.sleep + Workers Paid upgrade.Andrew Moore is a Founder, Product Executive, and Builder. Learn more about his current and prior work here.