This is your starter project for the Spirit Weekend 2026 site.
The idea is to build this out in layers instead of trying to do everything at once. The front-end pages are already here, and the next big piece is the registration flow.
By the time this project is doing its job, someone should be able to:
- visit the site
- fill out the registration form
- pay through Stripe
- end up in the database with a paid status
That is the main thing this project needs to do.
Start simple.
- Run the app locally
- Click through the existing pages
- Change a little bit of text so you get a feel for the structure
- Add a
/registerpage - After that, start wiring up Prisma and Stripe
If you want one clear short-term goal, make it this:
Get a registration page on the screen first.
Right now the project already includes:
- a homepage (Needs Editing)
- an about page (Needs Editing)
- a schedule page (Needs Editing)
- a contact page (Needs Editing)
- shared layout/components
- global CSS
So the foundation is in place already. You’re mostly building the registration and payment part on top of it.
Install dependencies:
npm install
Start the dev server:
npm run dev
Open:
Before adding anything major, just spend a few minutes looking around and seeing how the project is organized.
Most of the page text lives here:
src/app/page.tsxsrc/app/about/page.tsxsrc/app/schedule/page.tsxsrc/app/contact/page.tsx
The schedule data is here:
src/data/schedule.ts
The shared layout is here:
src/app/layout.tsx
Reusable UI components are here:
src/components
The main styling is here:
src/app/globals.css
The first feature I’d add is:
src/app/register/page.tsx
At the beginning, keep it lightweight. That page only needs:
- a heading
- a short explanation
- a form
- a submit button
Don’t worry about the backend yet. Just get the page built and make it feel like it belongs with the rest of the site.
You don’t need a huge form to start.
These fields are enough:
- full name
- phone number
- church name
- emergency contact name
- emergency contact phone
- notes
You can always add more later if the event needs them.
Here’s the clean version of the build order:
- make the public pages feel right
- add the
/registerpage - make the form UI work
- add Prisma and save registrations
- add Stripe Checkout
- add the Stripe webhook
- confirm registrations move to
paid
That’s the path I’d stick to.
Prisma is the layer between your app and the database.
You’ll use it to save registrations, update payment status, and query the event data later if you need to.
Without Prisma, the form is just UI. With Prisma, the form actually creates records you can work with.
Stripe handles the payment side.
For this project, use Stripe Checkout, not a custom payment form. That keeps the amount of payment code smaller and avoids a lot of unnecessary complexity.
The flow should be:
- collect registration details
- save them in the database
- send the user to Stripe Checkout
- wait for Stripe to confirm payment by webhook
Stripe CLI is just there to make local testing easier.
When you’re working on the webhook, Stripe CLI forwards Stripe events to your machine so you can test the full flow locally instead of guessing whether the webhook works.
You do not need all of these on the first day, but these are the main setup commands once you start on the backend.
npm install @prisma/client stripe
npm install --save-dev prismanpx prisma init --datasource-provider postgresqlnpx prisma migrate dev --name init
npx prisma generatenpx prisma studiobrew install stripe/stripe-cli/stripestripe loginstripe listen --forward-to localhost:3000/api/stripe/webhookOnce you start building the registration flow, these are the main files you’ll want:
prisma/schema.prisma
prisma.config.ts
src/lib/prisma.ts
src/lib/stripe.ts
src/app/register/page.tsx
src/app/register/success/page.tsx
src/app/register/cancel/page.tsx
src/app/api/register/route.ts
src/app/api/stripe/webhook/route.ts
prisma/schema.prisma
This is where your database models live.
src/lib/prisma.ts
This is where you create and export the Prisma client.
src/lib/stripe.ts
This is where you create and export the Stripe client.
src/app/register/page.tsx
This is the registration form page.
src/app/api/register/route.ts
This should validate the form, save the registration, and create the Stripe Checkout Session.
src/app/api/stripe/webhook/route.ts
This should receive Stripe events and update the registration to paid when payment is confirmed.
src/app/register/success/page.tsx
This is the page Stripe redirects to after a successful checkout.
src/app/register/cancel/page.tsx
This is the page Stripe redirects to if someone leaves checkout without paying.
This is the important part to keep in your head:
- someone visits
/register - they fill out the form
- the form submits to
/api/register - the app saves a registration row with
paymentStatus = pending - the app creates a Stripe Checkout Session
- Stripe Checkout opens
- the person pays
- Stripe sends a webhook to
/api/stripe/webhook - the app updates that registration to
paid
If that flow makes sense to you, the project will feel a lot more manageable.
When you add Prisma, I’d start with one model called Registration.
It can include fields like:
idfullNameemailphonechurchNameemergencyContactNameemergencyContactPhonenotespaymentStatusstripeCheckoutSessionIdcreatedAtupdatedAt
That’s enough to get version one working.
At some point you’ll need values like:
DATABASE_URL=""
NEXT_PUBLIC_SITE_URL="http://localhost:3000"
STRIPE_SECRET_KEY=""
STRIPE_WEBHOOK_SECRET=""
STRIPE_PRICE_ID=""There’s also an .env.example file in the repo to help keep the names straight.
There are a lot of things you could build here, but I wouldn’t touch these until the core flow works:
- login/auth
- admin dashboard
- roles/permissions
- discounts/coupons
- custom card forms
- multi-step registration flows
For the first working version, you really just need:
- a registration page
- a database save
- Stripe Checkout
- a webhook update
If you’re just sitting down to make progress, this is a solid first session:
- run the project
- change a little bit of content
- create
src/app/register/page.tsx - add the form
- make the page feel consistent with the rest of the site
That would be a good day.
Once the register page exists, I’d move to:
- install Prisma
- initialize Prisma
- create the
Registrationmodel - run the migration
- open Prisma Studio and make sure the database is working
After that:
- install Stripe
- create a Stripe product and price in test mode
- add
STRIPE_SECRET_KEYandSTRIPE_PRICE_ID - build
/api/register - create the Checkout Session
- redirect the user to Stripe Checkout
Then:
- install Stripe CLI
- run
stripe login - run
stripe listen --forward-to localhost:3000/api/stripe/webhook - build the webhook route
- run a full test payment
- confirm the registration moves to
paid
You’re in good shape when:
- the register page exists
- the form submits cleanly
- a registration shows up in the database
- Stripe Checkout opens
- the webhook fires
- the payment status changes to
paid
That matters a lot more than polishing every visual detail too early.
The best question to ask is:
What is the next smallest useful thing to finish?
Usually that means one of these:
- edit one page
- add one field
- save one record
- fix one route
- test one step in the flow
That’s the pace I’d use for this project.
You do not need to have the whole app in your head at once.
Just keep moving in this order:
- pages
- form
- database
- payment
- webhook
If you stay in that order, the project should stay pretty manageable.
- Noble Sherman Email: noble@noblesweb.design Phone Number: 610-690-9392