AI Solutions: AI workflow platform
Meridian48
Nightly AI workflows that turn 47 sources into validated, indexed news briefs
The problem
A tech news desk has to read dozens of publishers a day, keep only what is really technology, and write a short, sourced brief for each story. By hand, that takes an editorial team. With a model alone, it produces fluent text that nothing has checked, faster than anyone can review it.
The workflow, stage by stage
- Schedule
Cron Triggers on Cloudflare Workers fire seven runs in a nightly window. Readers are served stored briefs, so no model call ever sits on a page load.
- Ingest
47 RSS and Atom feeds across eight desks are fetched in parallel, each with an 8-second timeout. Up to 12 items per source, sorted newest first.
- Screen
Each story URL is hashed and checked against a 30-day seen set in Workers KV. A pattern filter drops obvious sport, shopping and entertainment before any model call.
- Judge and draft
Gemini 2.5 Flash first decides whether the story is technology at all. If it is, the model returns a headline, summary, one-line take, desk, tags and an importance score as strict JSON.
- Validate
Code checks every field: length limits, one of eight desks, at most three tags, importance clamped to 1 to 10. A reply that fails is never stored, and the story stays unseen so a later run tries it again.
- Balance
A run stores at most 40 new briefs and no desk may take more than 7, so prolific device feeds cannot crowd out AI, policy or security. Held stories are picked up by a later run.
- Store
Briefs are written to Workers KV with newest-first indexes: the latest 500 across the site and 300 per desk. Stories from a publisher dropped from the source list are purged.
- Publish and expire
A new brief is indexable for 48 hours, marked with an unavailable_after header and announced through IndexNow. After that it is served noindex, follow, and the page stays live.
Runs on
- Cloudflare Workers
- Cron Triggers
- Workers KV
- Gemini 2.5 Flash
- OpenAI-compatible API
- Next.js 16
- IndexNow
- Schema.org NewsArticle
What we built
- The model's reply is treated as untrusted input. Calls go out with a JSON response format, a 400-token ceiling, temperature 0.3 and reasoning switched off, because a thinking budget spends the same tokens and can cut the JSON short. The reply is parsed and checked field by field before anything is written, and a house style rule the prompt asks for is enforced again in code.
- The provider is configuration, not code. The model sits behind an OpenAI-compatible endpoint and is chosen by which secret the Worker holds: Gemini first, DeepSeek if that is the only key present. Changing provider is a secret change, with no deploy.
- An indexing lifecycle designed for news. The news sitemaps list only briefs inside their 48-hour window. Brief pages, sitemaps and feeds answer conditional requests with a 304, and send Last-Modified as well as an ETag, because Cloudflare's HTML transforms strip ETags from HTML responses. Every brief carries NewsArticle structured data that names the original story in isBasedOn and marks the headline and summary as speakable.
- One crawler policy, stated and enforced by the same code. A single module writes robots.txt and drives an edge rule that returns a 403 to AI training crawlers such as GPTBot, CCBot and Bytespider before any storage is read. Search engines and live retrieval agents such as OAI-SearchBot, Claude-SearchBot and PerplexityBot are served in full. The policy is written once, so what robots.txt says and what the edge enforces cannot drift apart.
- Every run leaves a record. Each run writes the feeds fetched and failed, candidates found, briefs stored, stories rejected as non-tech, errors, tokens used and the mix by desk. The public news API returns the latest record, so the pipeline's health can be read from outside.
- A tools layer on the same edge. 18 interactive tools, 9 of them for AI, including a cost calculator, a token counter, a pricing tracker and an outage tracker fed by a Worker endpoint that reads 11 providers' status feeds live.
- A video workflow, in build. The same briefs feed a vertical video edition rendered in code, with a synthetic voiceover. It renders today; a daily schedule and automatic publishing are not live yet.
Where the automation sits, and where it does not
The model does one job: it reads a story and returns a verdict and a draft in a fixed shape. Everything around it is deterministic code. Code decides which stories the model sees, rejects any reply that breaks the schema, caps what a run may publish, and sets how long each brief stays indexable. The model has no say over what is indexed, which crawlers are served, or when a run happens.
What we would not claim
We are not publishing traffic, audience or revenue figures for Meridian48, and nothing on this page should be read as one. Briefs go live without a person reading each one first. That is a deliberate choice for a desk that summarises public stories and links every brief to its original; the safeguards are the relevance gate and the schema check, not an editor. Where an automation moves money or speaks to a customer, we put a person on the approval step. The video edition renders but is not yet scheduled or published automatically.
Read from the production system and the platform's source code on 29 September 2026: the ingestion worker, its crawler policy, and the live news and status APIs.
Your turn
We set the baseline before the work starts.
That is the part that makes a number mean something a year later.