Dex Bennett / Stylenecy

Case 02 · 2026

Space Youth GKKK

Volunteers running a church youth ministry

A weekly bulletin that happens to be an admin system, for volunteers who were coordinating a ministry through spreadsheets and group chats. The measurable part of this project is accessibility: the old palette failed WCAG on every line of body text.

Status
Live — running in demo data
My role
Designed and built it
Built with
Next.js 16 · TypeScript · Tailwind v4 · Supabase · ISR on Vercel
Space Youth GKKK — screenshot of the live site, 6 Oct 2026
0text elements failing WCAG AA100 audited in production
4.56:1worst contrast ratiowas 2.20:1
134 KBfont payloaddown from 262 KB
0third-party requestswas 3

(01) The problem

What was actually in the way

A youth ministry runs on rhythm: a midweek meeting, two Saturday services, small groups. The coordination for all of it lived in spreadsheets, chat threads and documents that nobody could find six months later. Who is serving this week, what was decided in the last meeting, where the money went.

The first version I inherited was a generic SaaS landing page wearing cream colours. It described a product. What the people actually needed was to see this week.

And the volunteers are volunteers. If the tool is not pleasant, it goes unused and everything goes back to the group chat.

(02) Decisions

What I chose, and why

01Design the bulletin, not the dashboard

The front page headline is this week's service theme, not the name of the product. The people serving are listed by name and role, because being named is the point of a stewardship roster — not decorative initial circles. A "rhythm of the week" section carries the structure. One dark section gives the page weight so it does not read as an endless scroll of cards.

02Fix the contrast before anything else

The palette I started from failed WCAG AA outright. The muted ink used for all body copy measured 3.57:1 and the caption tone measured 2.20:1 against the paper background. Every foreground token was retuned to clear 4.5:1 against both paper tones. The result was then audited in production rather than asserted: 100 text elements checked, zero failures, worst ratio 4.56:1.

03Three bugs that made the app unusable, not just imperfect

Nine of ten routes returned HTTP 500 whenever the database environment was empty, because middleware asserted non-null on an undefined value on every single request. All dates rendered in the server timezone, so a Saturday evening service could display as Sunday to a user in Jakarta. And the dashboard sidebar was desktop-only, which meant a phone user had no way to move between modules at all. All three are fixed; dates are now pinned to Asia/Jakarta in one place.

04Always render something

The data layer runs dual-mode: real database when configured, seed data otherwise. The site is never a blank error screen. The front page is served from cache with hourly revalidation, so it is fast but "this Saturday" is never more than an hour stale.

05Deliberately not shown

Member detail pages do not display phone numbers, because any signed-in user can open them and those numbers belong to the members, not to the app. The dashboard and login routes are excluded from search engines. Chat exports, member spreadsheets and personal notes are excluded from the deployment entirely.

(03) Result

What is true now

  • Ten of ten routes verified returning HTTP 200 in production on 1 August 2026.
  • Front page around 300 KB across 13 requests, with fonts self-hosted and no third-party connections at all.
  • Accessibility verified by measurement in production, not by claim: skip link, global focus-visible, touch targets of at least 44px, associated labels, clean reflow at 320px, reduced-motion and contrast preferences respected.

(04) Not done

What is unfinished or untrue yet

  • The live site is running on seed data. The database is not connected yet — that step needs account access I do not have.
  • Forms can add records but cannot yet edit or delete them.
  • There are no automated tests. Verification so far has been computed styles and programmatic audits, not screenshots and not a test suite.
  • One decision is still open and is not mine to make: once real data is connected, the public front page would show members' real names. That is normal for a bulletin, but it is the ministry's call.

(05) Sources

Where these claims come from

Working documents on my own machine, not marketing copy. Listed so the numbers above can be challenged.

— Youth-GKKK_MS/PROJECT_MASTER.md — deploy log, accessibility audit numbers, performance table, bug list, open decisions
Animations are off on this device