Media Image

 ![](/sites/default/files/styles/hero_banner_1900_x_450/public/2026-08/hero_custom.png?h=fcc4fa91&itok=yf0g32Uz)

 

  

 





 ## Filed Under

[AI](/index%2Ephp/topic/ai)

  In May of 2026, we were a few weeks out from launching Governors State University's new Drupal site on Acquia. The content was in. And then someone asked the question nobody wants to hear that close to a launch date: what about meta descriptions?

Close to 2,900 published pages. Not one of them had a description written for it. Every page used Site Studio and there were no fields on the content type for the Metatag module to use.

**That is the kind of problem AI is actually good at.** Not "AI will transform your digital strategy." A specific, boring, enormous pile of work that a person could absolutely do and absolutely should not have to.

This year we shipped three of these. A bulk SEO script for a university, a reusable Drupal theme, and a dashboard for a church with no budget at all. Different scales, same shape. Here is what each one actually does, what it cost, and what we learned building it.

## 2,113 meta descriptions, written in just over 2 hours

We added a field on every content type and installed and configured the Metatag module. The script is one Python file. It logs into the GSU site (with a permissions limited profile), walks every published node across fifteen content types via JSON:API, pulls the rendered page text, sends it to Claude, and writes a 130–160 character description back to `field_seo_summary`.

The results, straight out of the progress file:

- **2,113 nodes completed**
- 526 skipped — either the content type had no summary field, or the node already had a good description
- 210 failed

Here is a real one, for the sculpture park page:

> "Explore 30 master works of large-scale sculpture across 100 acres of prairie at the Nathan Manilow Sculpture Park, open year-round for free."

139 characters. Specific. Nothing a human would need to rewrite.

Now the money question. If a copywriter reads a page and writes a description in three minutes — which is fast — 2,113 pages is **about 105 hours**. That is an estimate, not an invoice. But it is a defensible one, and at any agency rate you care to plug in, it is not a small number. The actual API spend was a rounding error. We used `claude-haiku-4-5` capped at 120 output tokens, with the system prompt cached between calls.

### The parts that made it survivable

The model is the least interesting thing in that script. Four other decisions are what kept it from becoming a two-week debugging project:

1. **It resumes.** Progress writes to a JSON file every ten nodes. Kill the run, restart it, and it picks up where it stopped. On a job this size, something will go wrong at node 1,400. Plan for it.
2. **It re-authenticates every 200 nodes.** Drupal sessions expire mid-run. Cheaper to refresh on a schedule than to handle the failure.
3. **It skips work it doesn't need to do.** Content types without the field are dropped entirely. Nodes with an existing description are left alone. Pages that render under 50 characters of text get passed over — there is nothing there to summarize.
4. **It handles the field two ways.** Writing a plain string sometimes returns a 422, so it retries as a formatted text field. Two lines of code, and it stopped a whole class of failure.

It now runs four times daily, so new content gets a description without anyone thinking about it.

Of course, you may not need to write this yourself. The Bulk Metatag AI Generator module now does something similar inside Drupal, using the Batch API with an editorial approval step.\[1\]\[2\] If your team wants humans reviewing every description before it saves, that is a better fit than a script. We needed to hit a hard launch date on a site behind an Acquia gateway, so a script we fully controlled won. Both answers are fine. Pick for your constraints, not for the tooling.

## Jarvis: the one that pays off every time

The SEO script saved a lot of hours once. Jarvis saves hours on every build, forever, and that makes it the highest-return thing we made this year.

[Jarvis is a Drupal theme](https://jarvis.drupalhelps.com) built on single-directory components and Bootstrap 5, targeting Drupal Canvas. Twenty-one components, each documented with its props, slots, and a worked example. It requires PHP 8.3 or later and runs on Drupal 11 and is ready for Drupal 12.

Image

 ![Computer screen displaying Drupal theme advertisement with slider control.](/sites/default/files/2026-08/CleanShot%202026-08-19%20at%2010.16.13%402x.png)

 

 The accessibility work is built into the theme rather than bolted on afterward. Overlay contrast is calculated automatically, colors fall back to safe values, and the theme settings show live contrast badges while you are choosing them — so a WCAG 2.2 AA problem surfaces at the moment someone picks the color, not six months later in an audit.

Dries has been direct about why this shape of thing matters: Recipes help people "go from idea to a website in hours instead of days."\[3\] That is exactly the math. Jarvis ships as a set of recipes, so a full site — Canvas, demo content, forms, workflow, SEO, AI — comes up with one `drush recipe` apply.

### Proving the blast radius

Applying a theme recipe to a site that already exists is where most people get nervous, and they are right to be. A recipe that flips your default theme, repoints your front page, and imports demo content is not an addition. It is a takeover.

So we built a second recipe that only adds, and then we measured it instead of promising it.

On a Drupal 11.4.4 standard site — Layout Builder on, Article and Basic page, an Image media type, twenty placed blocks — we ran a full `config:export` before and after. Of **171 pre-existing config objects, exactly two changed and none were deleted.** The two: `core.extension`, which gains the modules and theme being installed, and `user.role.authenticated`, which gains permission to use one new text format. The default theme, admin theme, front page, block layout, content types, media types, field storages and view displays all came through byte-identical. 96 new objects were added in that test run, nearly all of them named `jarvis*`.

The README says it plainly: verified, not asserted.

That is the part worth stealing even if you never install Jarvis. If you are shipping something that touches other people's sites, a before-and-after config diff takes an afternoon and replaces every reassuring sentence you were going to write with a number.

## A church dashboard that costs nothing to run

First Baptist Church in Aurora, Indiana tracks the things churches track: Sunday attendance, first-time visitors, small groups, baptisms, children's ministry, giving. It all lived in a Google Sheet, which is fine for recording and terrible for seeing.

The dashboard is one Python file. No framework, no build step, no template file. A service account reads the sheet into pandas, and the script writes out a single self-contained `index.html`: six KPI cards, a quarterly section, seven charts you can filter by year, and a year-over-year table. All the data is inlined as JavaScript constants, so the page makes zero API calls when someone opens it. GitHub Actions regenerates and commits it every 30 minutes.

Image

 ![Church report graphic with attendance, decisions, and giving data. Line graph shows trends over time.](/sites/default/files/2026-08/CleanShot%202026-08-19%20at%2010.18.38%402x.png)

 

 Hosting cost: nothing. Subscription cost: nothing. Volunteer hours spent rebuilding numbers before a board meeting: also nothing.

One detail from that build has stuck with me more than the code. Only the Sunday Average card carries a percentage badge. The other five deliberately have none — those are year-to-date totals, so a partial year compared against a full one reads as a collapse when nothing has actually changed. A church board would have seen "giving down 60%" in August and had a genuinely bad evening over an artifact of arithmetic.

The automation was the easy half. Knowing which number would be misread was the half that mattered.

## What actually made these work

Three projects, three very different budgets. A university with an enterprise Acquia contract and a small church that has none. The technique did not change between them.

What they share is not the model. It is four habits:

- **Scope it small enough to describe in one sentence.** "Write a meta description for this page." Not "improve our SEO."
- **Assume it will break mid-run.** Save progress. Resume. Retry the known failure modes.
- **Measure the blast radius before you ship.** Config diffs, dry runs, a `LIMIT=5` flag you actually use.
- **Know which number a human will misread.** No model catches that for you.

None of that is about AI. It is ordinary engineering discipline, applied to a tool that will happily do 2,113 things wrong just as fast as it will do them right.

**Start with the pile of work nobody wants to do. Bound it. Measure it. Then let it run.**

1. The Drop Times, [How Bulk Metatag AI Generator Automates Drupal SEO Metadata Workflows](https://www.thedroptimes.com/67971/bulk-metatag-ai-generator-drupal-seo), 15 May 2026.
2. Specbee, [How to automate SEO metadata in Drupal at scale with Bulk Metatag AI Generator](https://www.specbee.com/blogs/automate-seo-metadata-drupal-bulk-metatag-ai-generator).
3. Dries Buytaert, [State of Drupal presentation (October 2025)](https://dri.es/state-of-drupal-presentation-october-2025), DrupalCon Vienna keynote.



  ---



  ## Keywords (Drupal AI Generated)

Drupal, SEO automation, meta descriptions, website launch, AI content generation

  ## Article Summary (Drupal AI Generated)

Launching a new website or digital project often means facing tedious, high-volume tasks—like writing thousands of meta descriptions. Using targeted Python scripts powered by AI, Governors State University generated over 2,000 custom SEO summaries overnight, saving 100+ hours of manual work. Smart automation, focused scope, and careful error handling turned overwhelming jobs into manageable wins. Applying these principles, additional projects like the Jarvis Drupal theme and a zero-cost church dashboard delivered instant results, accessibility wins, and real efficiency for all budgets. The lesson: blend smart, disciplined engineering with AI to deliver quality outcomes, fast.



  

 





 [Request the Starter Site](/index%2Ephp/contact "Let’s Talk")



  

 [Schedule a Consultation](https://rodsurl.com/meeting)



  

 





 

 [     Opens in a new window ](https://www.facebook.com/sharer/sharer.php?u=https://drupalhelps.com/index%2Ephp/tip/three-ai-projects-actually-paid-themselves&title=Three AI Projects That Actually Paid for Themselves "Share to Facebook") [     Opens in a new window ](https://twitter.com/intent/tweet?text=Three AI Projects That Actually Paid for Themselves+https://drupalhelps.com/index%2Ephp/tip/three-ai-projects-actually-paid-themselves "Share to X") [   ](mailto:?subject=Three AI Projects That Actually Paid for Themselves&body=https://drupalhelps.com/index%2Ephp/tip/three-ai-projects-actually-paid-themselves "Share by email") [     Opens in a new window ](https://www.linkedin.com/sharing/share-offsite/?url=https://drupalhelps.com/index%2Ephp/tip/three-ai-projects-actually-paid-themselves "Share to LinkedIn") [    ](# "Copy link") Copied to clipboard