Website for mason-cao/firststep: a youth-led nonprofit in Metro Atlanta.
- Next.js 16 (App Router, static prerender) + React 19 + TypeScript
- Tailwind CSS v4 (design tokens in
src/app/globals.css) - Motion (scroll reveals, count-ups) + Lenis (smooth scrolling)
- Phosphor icons; League Spartan / Archivo / IBM Plex Mono / Shantell Sans via
next/font - PostgreSQL on Railway for private member applications and activity-hour approvals
npm install
npm run dev
npm run lint
npm run build
npm run db:init/joinsaves new member applications and contact information./report-hourssaves one member's activity, service time, and evidence per report./leadershipis the private review desk for member intake and hours approval.
Copy .env.example to .env.local. Set DATABASE_URL to a PostgreSQL
connection string, add the allowed LEADERSHIP_EMAILS, choose a strong
LEADERSHIP_ACCESS_CODE, and generate a long AUTH_SECRET with:
openssl rand -base64 48When using Railway's public database URL locally, set DATABASE_SSL=require.
Then initialize the tables with npm run db:init.
- Create a Railway project and add a PostgreSQL service.
- Add this GitHub repository as the web service.
- On the web service's Variables tab, add a
DATABASE_URLreference to the PostgreSQL service'sDATABASE_URL. - Add
LEADERSHIP_EMAILS,LEADERSHIP_ACCESS_CODE, andAUTH_SECRETto the web service. Do not addDATABASE_SSLwhen using Railway's private network. - Deploy and generate a public domain from the web service's Networking tab.
railway.json runs the build, applies db/schema.sql before each deployment,
starts Next.js, and checks /api/health before Railway sends traffic to it.
The "Field Day Poster" system: hi-vis orange, river blue, and deep petrol ink on warm paper, with condensed poster type, ledger-style mono records, ticker-tape marquees, and taped polaroid photo frames.
All site copy and records live as typed data in src/content/. Dashed "photo slot"
frames across the site are placeholders: add real photos to public/photos/ and
connect them to the relevant content records. Approved photos in public/photos/
supply the home page, Impact page, gallery, leadership cards, official navbar mark,
and social sharing preview. Temporary generated image files in public/images/ are
not used.