EJC Neves
An installable web app used by more than 300 young people in the EJC de Neves community. Every day it prepares the Gospel reading and five reflection questions generated with Claude, and around that habit it brings the pastorals’ calendar, a private examination of conscience and a social layer built on the community’s own pastorals and EJC circles.
- Client
- EJC Neves · João Pessoa, Brazil
- Type
- Webapp
- Built with
- Next.js, React, TypeScript, Supabase (Postgres, Auth, RLS, Storage), Claude API, Vercel Cron, Web Push, PWA, IndexedDB, Tailwind CSS
- Next.js
- Custom code
- AI-assisted

What I did
The community shared daily readings and event dates across scattered group chats, and a lot got lost on the way. I designed and built one place for it, end to end: product, interface, database, AI pipeline and deployment. It’s a Next.js app (App Router, Server Components and Server Actions) on Vercel, with Supabase for Postgres, auth and storage. It installs on the phone as a PWA with Web Push notifications.
The core is a content pipeline that runs without me. Every evening a scheduled job fetches the next day’s meditation for that exact date, sends the Gospel to the Claude API to generate five reflection questions, validates the result and publishes the day. People open the app in the morning and it’s ready.
Security lives in the database, not just the interface. Every table has row-level security, cross-user reads go through narrow SECURITY DEFINER functions that return only what is meant to be public, and data that shouldn’t be seen is never fetched at all, rather than just hidden on screen.
What it does
Daily meditation, generated with Claude
At 7 p.m. a Vercel cron fetches the next day’s meditation from the source for that exact date. It then asks Claude for five multiple-choice questions that can be answered from the Gospel alone, with plausible wrong answers. Anything that must always hold is enforced in code, not in the prompt. The position of the correct answer is assigned after generation, giving an even 25% per letter. A second pass rewrites distractors whenever the correct answer comes out noticeably longer than the rest. A validation gate blocks malformed days (fewer than five questions, a missing option, more than one correct answer) before auto-publishing, and a day someone has already answered is never regenerated. A 6 a.m. job re-checks that the day is live, and reviewers can approve or reject each question through a token-protected link.
Streaks, ranking and medals
Every day someone completes the meditation adds to their streak, shown with a flame on the home screen. Miss a day and it goes back to zero. Streaks are computed live from participation history, not read from a stored counter, so the ranking always reflects who is actually showing up. The ranking has two tabs: the whole community (top 100, with your own row pinned at the bottom if you’re outside it) and just your friends. A podium marks the top three, and ties are broken by best-ever streak and then alphabetically. On top of that, 11 medals reward consistency rather than competition: the first Gospel, streaks of 7, 15, 30, 100 and 365 days, 50 to 365 Gospels meditated, and 500 correct answers. Each medal’s criteria is stored as data in the database, and medals are awarded on the server when the day is completed, so they can’t be faked from the client.
Friends built on the community’s own structure
Each profile has a unique @username, the EJC circle the person belongs to (by year and color) and the pastorals they serve in. People recognize who they serve with and connect from there, through friend requests, public profiles and push notifications. Public profiles return only what’s meant to be shared, without email, phone or answer accuracy.
Pastorals’ calendar and room booking
Public events for the community and internal ones visible only to coordinators, controlled by role. Coordinators book the parish rooms by time range. A Postgres trigger rejects overlapping bookings, with the end time treated as exclusive so 8–12 and 12–14 don’t clash. A monthly view shows which rooms are free, partly booked or full.
A private examination of conscience
What people write here are the sins they’ll take to confession, so the text never leaves the phone: no server, no logs, not even encrypted. It’s stored in IndexedDB, in a separate database per account, and the storage module has no network path at all. Titles and notes live in separate object stores, so the list screen never even reads the notes. The app requests persistent storage to reduce browser eviction.
Daily liturgy
The full readings of the day (first reading, psalm and Gospel), plus a guide to the assembly’s responses for the Mass commentators.
Bible study in groups
A reading plan of one chapter a day, prayed with Lectio Divina. Members join the study group, mark each day as done and see who is reading along, with no chat.
Let’s work together
A Webflow or Astro site, a full product or an AI agent: tell me what you have in mind.
Paraíba, Brazil · working worldwide