An interactive photo scavenger hunt platform built with Next.js 15, Supabase, and deployed on Vercel.
- Frontend & API: Next.js 15 with App Router
- Database & Auth: Supabase
- Caching: Upstash Redis (Optional)
- Deployment: Vercel
- UI Components: shadcn/ui + Tailwind CSS
- Icons: Lucide React
- Node.js 18+ and pnpm installed
- Supabase account (for database)
- Upstash account (optional, for Redis)
-
Clone the repository
git clone <your-repo-url> cd photohunt
-
Install dependencies
pnpm install
-
Set up environment variables
cp .env.example .env
Fill in your environment variables:
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key SUPABASE_SERVICE_ROLE_KEY=your-service-role-key UPSTASH_REDIS_REST_URL=your-upstash-redis-url UPSTASH_REDIS_REST_TOKEN=your-upstash-redis-token
-
Run development server
pnpm dev
-
Build for production
pnpm build
-
Install Vercel CLI
pnpm add -g vercel
-
Link to Vercel project
vercel link
-
Set environment variables
vercel env add NEXT_PUBLIC_SUPABASE_URL vercel env add NEXT_PUBLIC_SUPABASE_ANON_KEY vercel env add SUPABASE_SERVICE_ROLE_KEY vercel env add UPSTASH_REDIS_REST_URL vercel env add UPSTASH_REDIS_REST_TOKEN
-
Deploy to production
vercel --prod
photohunt/
├── app/ # Next.js App Router
│ ├── api/ # API routes
│ ├── admin/ # Admin pages
│ ├── play/ # Player pages
│ ├── layout.tsx # Root layout
│ ├── page.tsx # Home page
│ └── globals.css # Global styles
├── components/ # React components
│ └── ui/ # shadcn/ui components
├── lib/ # Utility libraries
│ ├── supabase/ # Supabase clients
│ ├── redis.ts # Upstash Redis client
│ └── utils.ts # Helper functions
├── public/ # Static assets
├── vercel.json # Vercel configuration
└── package.json # Dependencies
- ✅ Landing page with Figma design
- ⏳ Session management
- ⏳ Player registration and authentication
- ⏳ Photo submission and approval
- ⏳ Real-time leaderboard
- ⏳ Admin dashboard
- ⏳ QR code session joining
- Create feature branch
- Implement feature
- Test locally with
pnpm dev - Build and verify with
pnpm build - Deploy preview with
vercel - Merge to main for production deploy
| Variable | Description | Required |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Your Supabase project URL | Yes |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase anonymous key | Yes |
SUPABASE_SERVICE_ROLE_KEY |
Supabase service role key | Yes |
UPSTASH_REDIS_REST_URL |
Upstash Redis REST URL | No |
UPSTASH_REDIS_REST_TOKEN |
Upstash Redis token | No |
© Luke Guo 2025
Contributions are welcome! Please open an issue or submit a pull request.