A full-stack venue operations platform built for Kings Court Boston, a live comedy club, coffee shop, and 420-friendly creative venue in Boston, MA. Handles membership, artist booking, and show lineup management in one system.
Live: member.kingscourtboston.com
- Account-based signup with email + password (creates Supabase Auth account)
- Member login with authenticated account page
- Digital member cards with QR code, visit counter, and light/dark mode toggle
- Apple Wallet and Google Wallet pass integration
- Instant QR code delivery via email and SMS
- Staff QR scanner (camera-based, works on iPhone/Safari via jsQR)
- Door check-in with manual search by name, email, or phone
- Admin panel: member management, status control (active, VIP, staff, comp, suspended), CSV export
- Visit tracking and check-in history
- Upcoming events display on member account page
- Artist signup and login (shares auth with staff/members — same email can be multiple roles)
- Profile management: display name, bio, Instagram, video links, tags
- Browse upcoming shows with real-time spot availability
- Self-serve spot requests with optional notes to the booker
- "My Spots" dashboard to track request statuses and cancel
- Staff create shows with date, time, venue, capacity, and optional Eventbrite link
- Booking request queue: approve, reject, or waitlist incoming requests
- Email notifications to artists on booking status changes (approved, rejected, waitlisted)
- Auto-waitlist when show hits capacity, auto-add to lineup on approval
- Lineup builder with reordering, role assignment (performer, host, feature, headliner), and set length controls
- Show lifecycle management: scheduled, closed, canceled
- Artist directory with search, filter, approve/ban
- Dark purple gradient theme with ambient glow effects
- Hand-drawn SVG doodle art (mic, coffee, joint, leaf, star, crown, speaker) scattered across all pages
- Circle-cropped graffiti brand art (OSN, KCTV, Smile High Club) as subtle side decorations
- Page fade-in animations
- Fully responsive mobile-first design
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) + TypeScript |
| Styling | Tailwind CSS v4 |
| Database | Supabase Postgres + Row Level Security |
| Auth | Supabase Auth (multi-role) |
| SendGrid (domain-verified) | |
| SMS | Twilio |
| QR | qrcode (generation) + jsQR (scanning) |
| Apple Wallet | passkit-generator |
| Google Wallet | jsonwebtoken (JWT signing for skinny pass approach) |
| Hosting | Vercel |
- Visitor signs up at
/joinwith email + password (creates an auth account) - System creates their record, generates a secure token, emails a QR code + card link
- Member can log in at
/members/loginto view their card, account settings, visit count, and upcoming events - Member can add their card to Apple Wallet or Google Wallet
- At the door, staff opens
/scanon their phone and scans the QR - System verifies member status and staff taps Check In
- Fallback: staff uses
/doorto search by name/email/phone
- Artist signs up at
/artists/join(existing members can use the same email) - Browses upcoming shows at
/shows, picks one, hits Request Spot - Staff sees the request in
/admin/shows/[id]and approves, rejects, or waitlists - Artist receives an email notification with the decision (approved, rejected, or waitlisted)
- On approval, the artist is auto-added to the lineup
- Staff reorders the lineup, assigns roles, sets time lengths
| Route | Description |
|---|---|
/ |
Auth-aware homepage (personalized when logged in) |
/join |
Membership signup |
/perks |
Member benefits (comedy, coffee, 420-friendly lounge) |
/m/[token] |
Digital member card with QR code + wallet buttons |
/terms |
Terms of Service & Privacy Policy |
/shows |
Upcoming shows (artist view) |
/shows/[id] |
Show detail + request spot |
| Route | Description |
|---|---|
/members/login |
Member login |
/members/account |
Member dashboard — card, settings, visits, events |
| Route | Description |
|---|---|
/scan |
Camera QR scanner |
/door |
Search + manual check-in |
/admin |
Member management + CSV export |
/admin/shows |
Create and manage shows |
/admin/shows/[id] |
Requests queue + lineup builder |
/admin/artists |
Artist directory + approve/ban |
| Route | Description |
|---|---|
/artists/profile |
Edit profile |
/artists/bookings |
Track spot requests |
| Endpoint | Description |
|---|---|
POST /api/join |
Create member + auth account + send email/SMS |
GET /api/scan/m/[token] |
Look up member by token |
POST /api/checkin |
Log a check-in |
GET /api/members |
List all members |
GET /api/members/search?q= |
Search members |
GET/PATCH /api/members/account |
Authenticated member account data |
PATCH /api/members/[id] |
Update member (staff) |
POST /api/members/[id]/rotate-token |
New membership token |
GET /api/members/export |
CSV export |
GET /api/wallet/apple/[token] |
Generate Apple Wallet .pkpass |
GET /api/wallet/google/[token] |
Redirect to Google Wallet save URL |
POST /api/artists/signup |
Create artist account |
GET/PATCH /api/artists/me |
Artist profile |
GET/POST/PATCH /api/shows |
Show CRUD |
GET/POST /api/requests |
Booking requests |
PATCH /api/requests/[id] |
Approve/reject/waitlist |
GET/PATCH/DELETE /api/lineup |
Lineup management |
7 tables with Row Level Security:
- members — profiles, tokens, statuses, contact info, linked to auth accounts via
auth_id - checkins — check-in log with staff attribution
- comedians — artist profiles linked to auth accounts (table name kept for compatibility)
- shows — schedule, capacity, status, Eventbrite links
- booking_requests — spot requests with approval workflow
- show_lineup — confirmed lineup with ordering and roles
- comedian_checkins — show-day comedian check-ins
- Node.js 18+
- Supabase project
- SendGrid account (verified sender/domain)
- Twilio account
- Apple Developer account (for Apple Wallet passes)
- Google Cloud project + Google Wallet issuer account (for Google Wallet passes)
git clone https://github.com/AwkCode/kcp-membership.git
cd kcp-membership
npm installCreate .env.local:
# Supabase
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
NEXT_PUBLIC_BASE_URL=http://localhost:3000
# SendGrid
SENDGRID_API_KEY=your_sendgrid_key
SENDGRID_FROM_EMAIL=your_verified_email
# Twilio
TWILIO_ACCOUNT_SID=your_twilio_sid
TWILIO_AUTH_TOKEN=your_twilio_token
TWILIO_PHONE_NUMBER=your_twilio_number
# Apple Wallet (base64 encoded certificates)
APPLE_WWDR_CERT=base64_encoded_wwdr_cert
APPLE_PASS_CERT=base64_encoded_pass_cert
APPLE_PASS_KEY=base64_encoded_pass_key
APPLE_PASS_KEY_PASSPHRASE=your_passphrase
APPLE_PASS_TYPE_ID=pass.com.kingscourtboston.membership
APPLE_TEAM_ID=your_team_id
# Google Wallet
GOOGLE_WALLET_ISSUER_ID=your_issuer_id
GOOGLE_WALLET_SERVICE_ACCOUNT_KEY={"type":"service_account","project_id":"...","private_key":"...","client_email":"..."}
Run migrations in order in Supabase SQL Editor:
supabase/migrations/001_create_tables.sqlsupabase/migrations/002_checkin_notes.sqlsupabase/migrations/003_comedian_portal.sqlsupabase/migrations/004_show_eventbrite_url.sqlsupabase/migrations/006_members_auth_id.sql
Create a staff user in Supabase Auth dashboard with role: "staff" in user metadata.
npm run devnpx vercelSet all environment variables in the Vercel dashboard.
MIT