Case study — custom CMS
← All workHope Community Church
A custom website and content system, built so the office can run it themselves.
- Client
- Hope Community Church — Glenview, IL
- Engagement
- Full rebuild + custom CMS
- Built
- July – September 2026
- Stack
- Next.js 16 · React 19 · Drizzle · Railway

The build, in numbers
Who maintains this in eighteen months?
The old site ran on WordPress. That stack works fine for a lot of organizations — it stopped working for this one. A church website is not a brochure: service times change, a sermon series starts, a summer camp page needs to exist in April and disappear in September, a form needs to reach a different person this month.
Every one of those is a small job. Add them up across a year and they become the whole job. So the question we started with wasn't “how do we make this look better” — it was: who is going to maintain this in eighteen months, and can they?
Studio — a content system, not a page builder.
We built the CMS from scratch rather than bending an existing one. That sounds like more work, and it is — but it buys something specific: every control in the editor exists because someone at the church needed it, and nothing exists that doesn't.
A page is a stack of sections — thirty types, from a hero to a livestream embed. Staff build pages by adding sections, filling in plain-language fields, and dragging them into order. The preview is the real page; click a section and its settings open.
- 01
Drafts, then Publish
Nothing goes live by accident. Leave a page half-finished on Tuesday, come back Thursday — the public never sees the in-between.
- 02
Undo that works
Delete a section and one undo brings it back whole. Type a sentence and undo takes the sentence, not the letter.
- 03
Hide, don't rebuild
The Christmas band switches off in January and back on in November. Nobody rebuilds it every year.
- 04
A third state: archived
Whole, findable, out of the nav and out of Google — one click from being back. A seasonal page lives there eleven months a year.
- 05
Focal point + zoom
8MB portrait phone photos become avatars, cards and banners without cutting anyone's head off — every upload auto-optimized.
- 06
Spacing in plain language
“None — join to the section above.” The most common request on any website, solved without anyone learning CSS.


Build for the person who will maintain it, not the person who approves it.
The rule every Studio decision answers to
Spam, without ever losing a prayer request.
A few weeks after launch the church called: the forms were flooded. A lot of agencies reach for a CAPTCHA and declare victory. The failure we were most worried about was the opposite one — a real person filling in a real prayer request and getting silently blocked.
So the filter quarantines, never refuses. Suspicious submissions are flagged and moved to a review screen instead of thrown away. Nothing from a human is ever lost; it just might need a glance. And the church's own Wi-Fi is on a trusted list, so twenty sign-ups from one table on a Sunday morning don't trip the rate limit.
- Signal 01
Structural signals
A hidden field only a bot fills in. A form submitted in under three seconds. Near-certain on their own.
- Signal 02
reCAPTCHA as a signal
Scored invisibly in the background — a low score adds weight, it never decides alone.
- Signal 03
Content patterns, weighted lightly
Words from someone in genuine distress can look like a spam email. The scoring knows that.
- Signal 04
Tests with a priority
The “must never be flagged” half of the test suite is deliberately longer than the “must be caught” half.
Owning your platform is the point.
There's no subscription to a page builder, no plugin that stops being maintained, no upgrade that breaks the homepage. The code is the church's. Admins configure, editors publish, staff get exactly the tools they use — and the office changes the fall schedule themselves.
Meet Studio, the CMS →Let’s make your marketing compound.
Tell us what you’re building. We reply the same day with a plan, not a pitch.