DEV Community

SIKOUTRIS
SIKOUTRIS

Posted on

Running Hyperlocal French News Sites Without a Newsroom

Most small French towns lost their dedicated local newspaper years ago. What's left — town council schedules, local fuel prices, weather, who got married, who passed away — is scattered across town hall PDFs, regional newspaper archives behind paywalls, and Facebook groups. We built a small PHP platform to pull that information back into one place, town by town, and digne-infos.fr (covering Digne-les-Bains and the Alpes-de-Haute-Provence) is one of the sites running on it.

I want to describe the architecture honestly, including the part that's uncomfortable to say out loud: the articles are compiled automatically from public sources, and the site says so on every page. There's no newsroom behind this. What there is, is a pipeline worth describing.

No CMS, on purpose

Each town site is a thin PHP application — no WordPress, no page builder. A handful of templates (article, category index, local agenda, obituary/"carnet" notices) get populated from a content pipeline that ingests public sources: town hall bulletins, prefecture announcements, open government feeds. Every generated article cites its source at the bottom. We made the "no human pre-review" fact visible on the site itself rather than let it be inferred, because disclosing it up front is cheaper than being caught hiding it later.

Pulling in live public data

Two widgets forced us to integrate with real government APIs instead of shipping static placeholder data: a weather panel (Open-Meteo) and a fuel-price panel built on top of data.economie.gouv.fr, France's official open dataset for fuel prices. Both refresh on a schedule rather than at request time — a local news site doesn't need sub-minute freshness, and caching the upstream response keeps pages fast without hammering a public API meant for everyone.

The sitemap is a hybrid, and that's deliberate

Google's news sitemap protocol wants a dedicated <news:news> feed, separate from a normal sitemap, listing only articles published in roughly the last two days. In practice, mixing it into the general sitemap — plain <url> entries for category and service pages, <news:news> tags attached only to recent article entries — turned out to be the pragmatic middle ground for a small site that doesn't publish often enough to justify maintaining a second feed pipeline. Full disclosure: our adoption of the news tag is still partial, we're rolling it out article type by article type rather than all at once, and that's a conscious trade-off against building infrastructure for traffic we don't have yet.

Five towns, one codebase

Digne-les-Bains isn't the only town running this stack — the same codebase also powers sites for Aubenas, Manosque, Gap and Aurillac. Each instance is a config object, not a fork: town name, department, the lat/long pair for the weather API, the department filter for the fuel-price feed, and which category templates actually make sense for a town that size (a town of a few thousand people doesn't need a dedicated sports section). Keeping it as config instead of five diverging codebases is what makes it possible for one person to keep all of them running.

What we'd do differently

If I were starting a sixth town site today, I'd build the source-citation block as a first-class template field from day one instead of retrofitting it. Disclosure isn't a legal checkbox here — a reader checking "is this real" is the whole trust model for an automated local news site, and the citation is the only thing standing between "aggregator" and "content farm" in that reader's mind.

None of this replaces an actual reporter sitting through an actual town council meeting. It does mean a resident of a town that lost its newspaper can still find the diesel price three streets over and whether there's a market this Saturday, sourced and dated, without digging through five different town hall PDFs.

Top comments (0)