← All work

LLM workflow tooling

AI Content & Automation Platform

District Ops turns rows in a spreadsheet into published WordPress pages, at the scale of hundreds of location-specific pages across two sites. It generates copy, enriches it with real health data, and runs it through six checks before anything is allowed near publication. The subject matter is addiction treatment, which is why most of the engineering went into the parts that say no.

Role
Full stack engineering
Delivered
Delivered at Hybrid MediaWorks
Period
May 2025 - Present

Stack: Python, Claude API, Google Sheets API, WordPress API

Visit the live product

6 checks

content must clear before it can be imported

The spreadsheet is the interface

The content operations team already worked in Google Sheets, so the tool went to them instead of asking them to move. A row describes a page - location, content type, geographic mode - and the pipeline runs over the sheet in four passes: generate, enrich, verify, maintain.

State lives in the sheet and is legible at a glance, using cell formatting as the status language. White cells are generated, grey cells are locked and will not be overwritten, flagged phrases are bolded, and problem content gets a red border. Nobody has to learn a dashboard to see what the pipeline did.

Compliance violations are errors, not warnings

This is content about addiction treatment. Success-rate claims and medical claims are regulated, and a language model asked to write persuasive copy will produce both without being asked. Treating that as a warning means it ships.

So the content checker raises them as errors that block import, scores each page for regulatory adherence, and writes suggested fixes back as cell comments where the reviewer is already looking. The generation step is the easy half of this system; the half that decides what is not allowed to publish is the half that matters.

Real numbers, not plausible ones

The pages carry statistics - population, overdose mortality, treatment facility counts, prevalence. A model will invent all of these fluently and they will look right, which in this domain is worse than looking wrong.

None of those figures are generated. A separate enrichment pass fetches real epidemiological data and scales it to the row's geography, so a city row gets city-level figures and a county row gets county-level ones rather than a number borrowed from the wrong scope. The model writes the prose; it is not trusted with the facts.

Nothing writes without a dry run

Every tool that can write runs in preview first and shows exactly what it would change. A final pre-import gate decides whether a row is actually ready, and a sync check compares the sheet against live pages so the two do not drift apart silently once things are published.

The same caution applies to bulk operations. Cross-sheet find and replace preserves formatting, and template changes are detected downstream rather than quietly propagating. At this scale a single careless write is not one bad page, it is a few hundred.

Want something like this built for your team?

Start a project