Skip to content
LucidMetric
All work
Workflow Automation · AI Integrations · API & Integrations

A newsroom that opens to a queue of drafted stories instead of thirty browser tabs

Starnes Media

Community news publisher · Birmingham, Alabama

www.starnesmedia.com

Starnes Media publishes community papers across the Birmingham suburbs — Homewood, Hoover, Vestavia Hills, Mountain Brook, the 280 corridor and Trussville. Finding the news had started to cost more than writing it. Every morning meant opening thirty-odd city, school, chamber, library, parks and local-venue pages to see what had changed since yesterday, then reading each post, then retyping it into the CMS. We replaced the tab-opening with a scheduled pipeline: scrapers that watch every source, a model that turns each post into a structured draft, and one review screen where an editor approves it straight into WordPress.

30+

Community pages and sites monitored

25+

Make scenarios running on their own schedule

826

Items harvested into the review queue

12 months

Collecting without a manual check

10

Content types classified automatically

~200 hrs

Monitoring and first-draft time removed

Estimate

Source count, scenario count, queue depth, runtime and content-type coverage are counted from the live Make workspace and Airtable base, across records created June 2025 to June 2026. The hours figure is our own estimate — roughly fifteen minutes of checking, reading and first-draft writing removed per harvested item — and is not a client-audited number.

Before

  • Someone opened thirty-plus community pages and sites by hand to find what was new
  • A post that linked out to a longer article had to be opened and read separately
  • Every story was summarised and retyped into the CMS from scratch
  • The same announcement picked up twice became two half-written drafts
  • Out-of-area posts were only caught after an editor had already read them
  • Nothing recorded which community, section or priority a story belonged to until a human decided

After

  • Scheduled Make scenarios watch every source and pull only what has appeared since the last run
  • A post that links to an article is fetched, stripped to plain text and summarised from the full piece
  • Claude returns a structured draft — headline, summary, body, section, community and priority
  • Airtable is checked for an existing record before anything is written, so a repeat never becomes a second draft
  • Anything outside the coverage area is marked skip with the reason written out, not silently dropped
  • One button turns an approved draft into a WordPress post waiting for a final read
End to end

Follow one post from a community feed to a publishable draft

Eight stops. A person touches exactly one of them — the review screen. Everything either side of it runs on a schedule.

  1. 1

    Stop 1 · Watch

    Every source gets its own watcher

    Rather than one clever scraper, each community page and site runs as its own scheduled Make scenario.

    City government, the school district, the chamber of commerce, the public library, parks and recreation, theatres, sports clubs, local businesses and event calendars each have a scenario of their own. Facebook pages use the Watch Posts module; websites are fetched over HTTP and parsed out of the raw HTML. Each one runs on its own schedule and returns only what has appeared since it last looked.

    One scenario per source is deliberately the unglamorous choice. A single generic scraper breaks the first time one site changes its markup, and takes every other source down with it.

  2. 2

    Stop 2 · Branch

    A router asks whether there is more to read

    Some posts are the whole story. Others are three lines and a link to the real article.

    Straight after the watcher, a router splits the run. If the post carries a link, the pipeline treats the post as a pointer and goes after the article behind it. If there is no link, the post text is all there is, and it goes to the model as-is. The two paths converge again at the same Airtable table, so nothing downstream needs to know which way it came.

  3. 3

    Stop 3 · Check

    Look it up before spending anything on it

    The duplicate check sits before the fetch, not after it.

    The same announcement often appears on a city page, a chamber page and a venue page within the same hour. An Airtable search runs before the article is fetched and before the model is called, so a story already in the base costs nothing the second time it is seen. Ordering it this way — check, then spend — is the difference between a pipeline that scales to thirty sources and one that gets expensive at ten.

  4. 4

    Stop 4 · Read

    The linked article is fetched and flattened

    An HTTP request pulls the page; a parser strips it back to readable text.

    For the link path, Make requests the article and runs the response through an HTML-to-text parser, so the model receives prose rather than navigation, cookie banners and markup. Website sources go through a longer version of the same idea: fetch the index page, pull the anchor elements, aggregate them, work out which are actual articles, then iterate and fetch each one.

    The link-extraction step still runs on an older assistant module that Make has since deprecated. It works, but it is the next thing in this pipeline that should move across to Claude with the rest.

    MakeREST APIsOpenAI
  5. 5

    Stop 5 · Structure

    Claude returns a shape, not a paragraph

    The model is asked for strict JSON, because its output has to land in named Airtable fields.

    Claude receives the post or the article text and returns a fixed object: a clean headline, a short summary, a publishable body, and the metadata the newsroom sorts by. Because the contract is a shape rather than prose, every field maps straight into its column with no parsing on the far side. Anything the model could not determine comes back empty rather than invented, so a gap stays visible instead of becoming a confident mistake.

    This started on an earlier model and moved to Claude partway through. Because the prompt only ever asked for one JSON shape, the switch was a module swap inside each scenario rather than a rewrite of anything downstream.

  6. 6

    Stop 6 · Triage

    It also decides what the story is — and whether it is one

    Each item comes back tagged by type, community, priority and suggested channel.

    The same call classifies the item across ten content types — event preview, business happening, meeting recap, school news, sports recap, newsletter brief, evergreen and the rest — assigns it to one of the six communities, sets a priority, and suggests whether it belongs in the newsletter, on the website, on social, or all three. It also writes editorial notes flagging what is missing: no ticket price listed, year not confirmed, address not given.

    Anything outside the coverage area comes back as skip with a written reason — an Atlanta concert, a UK webinar, a Milwaukee job fair. An editor can overrule a stated reason. They cannot overrule something that was quietly discarded.

  7. 7

    Stop 7 · Review

    One screen: what was scraped, and what will publish

    An Airtable interface puts the raw capture beside an editable draft, with the queue counts across the top.

    The Newsroom Flow interface opens on counters — how many are unprocessed, how many drafts await review, how many have gone out. Selecting an item shows the untouched scrape on the left and the working draft on the right: title, full body, AI summary, region, tags, section, start date and featured image, all editable. The editor rewrites what needs rewriting, swaps or removes the image, and presses Submit.

  8. 8

    Stop 8 · Publish

    Approval writes the WordPress draft

    Submitting fires a webhook that builds the post — body, image, section and tags — as a draft.

    A second Make scenario listens for approved records, reads the finished fields out of Airtable and creates the matching WordPress post with its featured image already attached. It lands as a draft on purpose: the last decision in the chain is a person reading the post on their own site and pressing publish. Nothing reaches readers that an editor has not seen twice.

    WebhooksMakeWordPress

What a year of live scraping taught us

One scenario per source, however tempting the shortcut

Thirty near-identical scenarios look like duplication right up until a site changes its markup. Then it is one broken source and twenty-nine that never noticed. A single clever scraper covering all of them would have been one point of failure with a newsroom attached to it.

Order the pipeline by what each step costs

The duplicate check runs before the page fetch and before the model call, because it is the cheapest of the three. Sequencing on cost rather than on narrative order is most of the difference between a pipeline that survives adding sources and one that does not.

A skip has to explain itself

It would have been easier to let the model quietly drop anything out of area. Instead it records the decision and the reason. That turns a black box into something an editor can audit, disagree with and correct — and it surfaced coverage-area edge cases we would otherwise never have seen.

Ask a model for a shape, not for writing

Because the prompt only ever requested one strict JSON object, changing models partway through touched one module per scenario and nothing else. Had we been parsing prose out of a free-form reply, the same swap would have broken every downstream step at once.

Still reading the feeds yourself?

If somebody on your team opens thirty tabs every morning just to find out what happened, the same pipeline can hand them a drafted queue instead.

Services behind this build