One-day build events for builders. Start at 10. Ship by 5.
- Next.js 16 (App Router)
- Upstash Redis (data store)
- NextAuth v5 (Google + GitHub OAuth)
- Tailwind CSS 4
- Framer Motion
- Vercel (hosting + Blob storage)
npm install
cp .env.local.example .env.local # fill in values
npm run seed # populate Redis (run once)
npm run devRuns on localhost:3000.
See .env.local.example for the full list. You need Upstash Redis credentials, OAuth client IDs for Google and GitHub, and an AUTH_SECRET for NextAuth.
/new-york → city page (events + projects)
/new-york/shiphaus-1 → event detail page (by slug)
/new-york/silly-hacks-2026 → Shiphaus Friends event
/chicago → city page
/malaysia → city page
Old /chapter/ URLs 301 redirect to the flat structure.
src/
app/
page.tsx # homepage
[city]/page.tsx # city pages (new-york, chicago, malaysia)
[city]/[eventSlug]/page.tsx # event detail pages
projects/page.tsx # all projects
login/page.tsx # OAuth login
setup/page.tsx # Claude Code install guide
start-a-chapter/page.tsx # chapter lead recruitment
api/ # API routes (see CONTRIBUTING.md)
components/ # shared components
lib/
data.ts # static fallback data (chapters, events, projects)
redis.ts # Redis client
redis-data.ts # all CRUD operations
auth.ts # NextAuth config
types/index.ts # TypeScript interfaces
middleware.ts # admin route protection + /chapter/ redirects
scripts/
migrate-redis-events.js # one-time migration: enrich Redis events with metadata
Events live in Redis (source of truth) with static fallback in data.ts. Each event has:
- slug -- clean URL identifier (e.g.
shiphaus-1,silly-hacks-2026) - organizer -- who ran the event
- hostedBy -- venue credit (optional)
- isFriends -- true for external "Shiphaus Friends" events
Run node scripts/migrate-redis-events.js --dry-run to preview metadata updates. Idempotent.
See CONTRIBUTING.md for architecture details, data patterns, and how to add features.