A minimal iOS app built with Expo that helps you build habits (streaks) and set periodic reminders.
- Create custom streaks with flexible intervals (hourly, daily, weekly, monthly, yearly)
- Set start and end dates
- Mark periods as complete with a single tap
- Visual progress tracking
- Celebration effects (confetti + haptics) when completing a streak
- Set periodic notifications at custom intervals
- Support for title, subtitle, and body with emojis
- Toggle reminders on/off
- Local notifications (no server required)
- Framework: Expo (React Native)
- Routing: Expo Router
- Database: Supabase (PostgreSQL)
- Auth: Apple Sign-In
- Notifications: expo-notifications (local)
- Animations: react-native-confetti-cannon, expo-haptics
- Node.js 18+
- Expo CLI (
npm install -g expo-cli) - iOS Simulator or physical iOS device
- Supabase account
-
Clone and install dependencies
npm install
-
Set up Supabase
- Create a new Supabase project at supabase.com
- Run the SQL schema from
supabase/schema.sqlin the SQL Editor - Enable Apple provider in Authentication > Providers
- Copy your project URL and anon key
-
Configure environment
cp .env.example .env
Edit
.envwith your Supabase credentials:EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co EXPO_PUBLIC_SUPABASE_ANON_KEY=your-anon-key -
Configure Apple Sign-In
- In
app.json, updateios.bundleIdentifierwith your bundle ID - Configure Apple Sign-In in your Apple Developer account
- Add the callback URL to Supabase:
https://your-project.supabase.co/auth/v1/callback
- In
-
Run the app
npx expo start --ios
| Color | Hex | Usage |
|---|---|---|
| Black | #000000 |
Background |
| Navy | #14213D |
Cards, surfaces |
| Amber | #FCA311 |
Primary accent |
| Light Gray | #E5E5E5 |
Secondary text |
| White | #FFFFFF |
Primary text |
├── app/
│ ├── (auth)/ # Auth screens
│ │ └── sign-in.tsx
│ ├── (tabs)/ # Main tab navigator
│ │ └── index.tsx # Home screen with two cards
│ ├── streak/ # Streak module
│ │ ├── index.tsx # Streak list
│ │ ├── new.tsx # Create streak
│ │ └── [id].tsx # Streak detail
│ └── reminder/ # Reminder module
│ ├── index.tsx # Reminder list
│ ├── new.tsx # Create reminder
│ └── [id].tsx # Reminder detail
├── src/
│ ├── components/ # Reusable UI components
│ ├── context/ # React contexts (Auth)
│ ├── features/ # Feature-specific logic
│ │ ├── streak/
│ │ └── reminder/
│ └── lib/ # Supabase client
├── constants/
│ └── Colors.ts # Theme and color tokens
└── supabase/
└── schema.sql # Database schema
iOS has some limitations for local notifications:
- Minimum interval is effectively 1 minute
- Maximum of 64 pending scheduled notifications
- User must grant permission
MIT