Hold your friends accountable. Pact is a group accountability app where friends commit to daily challenges, submit photo proof verified by AI, and face public shame when they fail.
- Create a group — Set a challenge, invite friends with a code, put money on the line
- Complete daily tasks — Take a photo, AI verifies your proof in seconds
- Miss a deadline? — Choose a penalty: pay up, or survive an AI-generated dare
- Hall of Shame — Failures get auto-roasted and displayed for the whole group to see
| Layer | Tech |
|---|---|
| Frontend | Flutter (Dart), Riverpod, GoRouter, flutter_animate |
| Backend | Supabase (Auth, Postgres, Storage, Realtime, Edge Functions) |
| AI | Gemini 2.5 Flash via Edge Functions (proof verification, challenge generation, auto-roasts) |
| Rate Limiting | Upstash Redis |
lib/
├── core/ # Theme, services, constants, utilities
│ ├── services/ # Supabase, Gemini, AI verification, payments
│ ├── theme/ # Dark neon UI (AppColors, AppTextStyles)
│ └── constants/ # Supabase & Gemini config
├── features/
│ ├── auth/ # Login, register, onboarding, splash
│ ├── home/ # Dashboard, task checklist, providers
│ ├── challenges/ # Daily tasks, proof submission
│ ├── groups/ # Create/join groups, group chat
│ ├── leaderboard/ # Rankings and points
│ ├── shame/ # Hall of Shame, reactions, comments
│ ├── penalty/ # Penalty choice, AI dare challenges
│ ├── streaks/ # Streak tracking
│ └── profile/ # User profile
└── shared/ # Reusable widgets (GlassCard, GlowButton, BottomNav)
supabase/
├── functions/
│ ├── verify-proof/ # AI image verification via Gemini
│ ├── generate-challenges/ # AI daily challenge generation
│ └── generate-penalty-challenge/ # AI dare generation for failures
└── migrations/ # SQL schema & RLS policies
- Flutter SDK
^3.8.0 - Supabase project (with Edge Functions enabled)
- Gemini API key
- Upstash Redis (optional, for rate limiting)
git clone https://github.com/Stoobyy/pact.git
cd pact
flutter pub getSet your local secrets in environment variables (do not commit real values):
cp .env.example .envThen run Flutter with required --dart-define values:
flutter run \
--dart-define=SUPABASE_URL=https://your-project.supabase.co \
--dart-define=SUPABASE_ANON_KEY=your-anon-keyFor Python demo scripts:
set SUPABASE_URL=https://your-project.supabase.co
set SUPABASE_ANON_KEY=your-anon-key
python scripts/demo_punishment.py# Set secrets
supabase secrets set GEMINI_API_KEY=your-gemini-key
supabase secrets set UPSTASH_REDIS_REST_URL=your-redis-url
supabase secrets set UPSTASH_REDIS_REST_TOKEN=your-redis-token
# Deploy
supabase functions deploy verify-proof --no-verify-jwt
supabase functions deploy generate-challenges --no-verify-jwt
supabase functions deploy generate-penalty-challenge --no-verify-jwtflutter run- 🤖 AI Proof Verification — Gemini Vision checks if your photo actually matches the task
- 🔥 Hall of Shame — Auto-generated roasts for people who miss their tasks
- ⚡ AI Challenges — Miss a task? Survive a dare generated by AI instead of paying
- 📊 Leaderboards — Points, streaks, and rankings within your group
- 💬 Group Chat — Banter with your accountability partners
- 💸 Stakes — Real money on the line with configurable daily penalties
- 🎯 Daily Deadlines — Countdown timers with push notification reminders
Private — not open source.