A travel rewards tracking web app that helps users track their loyalty balances, set travel dates, and get matched to the best redemption opportunities.
- ✅ Authentication: Supabase Magic Link authentication
- ✅ Dashboard: Manual entry of loyalty balances (credit cards & airlines)
- ✅ Travel Preferences: Set specific dates or flexible date ranges
- ✅ Deals Page: View matched reward deals (static/mock data)
- ✅ +1 Invite Flow: Generate invite links and share trip details
- Next.js 14 (App Router)
- TypeScript
- Prisma ORM
- Supabase (Auth + Postgres + RLS)
- TailwindCSS
- shadcn/ui components
- Node.js 18+ and npm
- Supabase account and project
- PostgreSQL database (via Supabase)
-
Clone the repository
-
Install dependencies:
npm install
-
Set up environment variables:
cp .env.example .env
Fill in your Supabase credentials:
NEXT_PUBLIC_SUPABASE_URL: Your Supabase project URLNEXT_PUBLIC_SUPABASE_ANON_KEY: Your Supabase anon keyDATABASE_URL: Your Supabase Postgres connection string
-
Set up the database:
npx prisma generate npx prisma db push
-
Run the development server:
npm run dev
-
Open http://localhost:3000 in your browser
- Push your code to GitHub
- Import your repository in Vercel
- Add environment variables in Vercel dashboard:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYDATABASE_URL
- Deploy!
├── app/ # Next.js App Router pages
│ ├── api/ # API routes
│ ├── dashboard/ # Dashboard page
│ ├── travel-preferences/ # Travel preferences page
│ ├── deals/ # Deals page
│ ├── invite/ # Invite flow
│ └── login/ # Login page
├── components/ # React components
│ └── ui/ # shadcn/ui components
├── lib/ # Utility functions
│ ├── prisma.ts # Prisma client
│ └── supabase.ts # Supabase client
└── prisma/ # Prisma schema
└── schema.prisma # Database schema
Make sure to set these in your Vercel project settings:
NEXT_PUBLIC_SUPABASE_URL: Your Supabase project URLNEXT_PUBLIC_SUPABASE_ANON_KEY: Your Supabase anon/public keyDATABASE_URL: Your Supabase Postgres connection string (with connection pooling)
The app uses Prisma with the following main models:
User: User accountsLoyaltyBalance: Credit card and airline balancesTravelPreference: User travel date preferencesDeal: Matched reward deals (mock data)Invite: +1 invite links and trip sharing
- This is an MVP with mock/static data for deals
- No live API integrations or scraping
- Authentication uses Supabase Magic Links
- All data is stored in Supabase Postgres with RLS enabled