A modern React Native app that helps you keep track of all your subscriptions, bills, and recurring payments in one place.
- 📊 Subscription Tracking: Monitor all your subscriptions in one place
- 💰 Cost Analytics: View monthly and yearly spending with averages
- 📅 Calendar View: Visual representation of payment due dates
- 🔔 Smart Reminders: Never miss a payment with customizable notifications
- 🎨 Color-Coded Organization: Assign colors to subscriptions for easy identification
- 📱 Cross-Platform: Works on both iOS and Android
- ⚡ Variable Cost Support: Perfect for utility bills (electricity, water, etc.)
- 📈 Spending Insights: Track spending trends and patterns
- 🏷️ Category Management: Organize by Entertainment, Utilities, Productivity, etc.
- 🔒 Secure Authentication: Firebase-powered user authentication
- ✨ Professional Animations: Smooth transitions and micro-interactions
- 🌙 Modern UI: Clean, intuitive interface with TailwindCSS styling
- Node.js (v16 or higher)
- npm or yarn
- Expo CLI (
npm install -g expo-cli) - iOS Simulator (Mac only) or Android Emulator
- Firebase account
-
Clone the repository
git clone https://github.com/Zeff01/SubTrack.git cd SubTrack -
Install dependencies
npm install # or yarn install -
Environment Setup
Create a
.envfile in the root directory:EXPO_PUBLIC_FIREBASE_API_KEY=your_api_key_here EXPO_PUBLIC_FIREBASE_AUTH_DOMAIN=your_auth_domain_here EXPO_PUBLIC_FIREBASE_PROJECT_ID=your_project_id_here EXPO_PUBLIC_FIREBASE_STORAGE_BUCKET=your_storage_bucket_here EXPO_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id_here EXPO_PUBLIC_FIREBASE_APP_ID=your_app_id_here EXPO_PUBLIC_FIREBASE_MEASUREMENT_ID=your_measurement_id_here
-
Start the development server
npx expo start
-
Run on your device
- Press
ifor iOS simulator - Press
afor Android emulator - Scan QR code with Expo Go app for physical device
- Press
SubTrack/
├── app/ # Main application code
│ ├── (screens)/ # Authentication screens
│ ├── (tabs)/ # Main app screens
│ │ ├── (screens)/ # Tab screen components
│ │ └── *.tsx # Tab navigators
│ ├── components/ # Reusable components
│ │ ├── animated/ # Animation components
│ │ ├── common/ # Common UI components
│ │ ├── forms/ # Form components
│ │ └── home/ # Home screen components
│ ├── hooks/ # Custom React hooks
│ ├── navigation/ # Navigation types
│ ├── providers/ # Context providers
│ └── _layout.tsx # Root layout
├── assets/ # Images and fonts
├── config/ # Configuration files
├── services/ # API and Firebase services
├── types/ # TypeScript type definitions
└── package.json # Project dependencies
- Frontend: React Native + Expo
- Styling: TailwindCSS (NativeWind)
- Navigation: React Navigation + Expo Router
- State Management: React Context + Custom Hooks
- Backend: Firebase (Auth + Firestore)
- Animations: React Native Reanimated
- Type Safety: TypeScript
- Forms: Custom form hooks with validation
- Create a new Firebase project at console.firebase.google.com
- Enable Authentication (Email/Password)
- Create a Firestore database
- Add your app (iOS/Android)
- Copy configuration values to
.env
users
{
uid: string
email: string
username: string
created_at: string
updated_at: string
}subscriptions
{
id: string
user_id: string
app_name: string
cost: number
cost_type: 'fixed' | 'variable'
average_cost?: number
cycle: 'weekly' | 'monthly' | 'quarterly' | 'yearly'
due_date: string
reminder: string
color: string
category: string
status: 'active' | 'paused' | 'cancelled'
created_at: string
updated_at: string
}- Tap "Add Subscription"
- Enter subscription name
- Select category (Entertainment)
- Keep "Variable Cost" toggle OFF
- Enter fixed monthly cost
- Select billing cycle
- Choose due date
- Set reminder preference
- Pick a color
- Save
- Tap "Add Subscription"
- Enter bill name
- Select category (Utilities)
- Turn ON "Variable Cost" toggle
- Enter current bill amount
- Optionally enter average (for yearly calculations)
- Complete remaining fields
- Save
- Fixed costs:
₱500(exact amount) - Variable costs:
~₱500(approximate/average) - Yearly total: Sum of all annual subscription costs
- Monthly average: Yearly total ÷ 12
- Colored dots: Indicate payment due dates
- Multiple dots: Multiple payments on same day
- Tap date: View subscriptions due that day
- Month navigation: Swipe or use arrows
- FadeInView: Smooth opacity transitions
- SlideInView: Directional slide animations
- ScaleButton: Touch feedback with scaling
- Loading: Consistent loading states
- ErrorMessage: User-friendly error displays
- EmptyState: Helpful empty state messages
- SubscriptionForm: Base subscription form
- EnhancedSubscriptionForm: With variable cost support
# Start development server
npm start
# Run on iOS
npm run ios
# Run on Android
npm run android
# Run on web
npm run web
# Lint code
npm run lint
# Type check
npx tsc --noEmit- TypeScript for type safety
- Functional components with hooks
- TailwindCSS for styling
- Proper error handling
- Loading states for async operations
- Always use TypeScript interfaces
- Implement proper loading/error states
- Use custom hooks for logic reuse
- Keep components small and focused
- Add animations sparingly for better UX
-
Metro bundler issues
npx expo start -c
-
iOS build failing
cd ios && pod install
-
Android build issues
cd android && ./gradlew clean
-
Type errors
npm run typecheck
- Firebase credentials stored in environment variables
- Secure authentication with Firebase Auth
- User data isolation (users can only access their own data)
- Input validation and sanitization
- No sensitive data in git repository
- Push notifications for payment reminders
- Data export (CSV/PDF)
- Budget limits and alerts
- Subscription sharing for families
- Dark mode support
- Multi-currency support
- Subscription recommendations
- Integration with bank APIs
- Widgets for home screen
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow TypeScript best practices
- Write meaningful commit messages
- Add appropriate comments
- Update documentation
- Test on both iOS and Android
This project is licensed under the MIT License - see the LICENSE file for details.
Zeff Adonis
- GitHub: @Zeff01
- React Native community for excellent documentation
- Expo team for the amazing development experience
- Firebase for reliable backend services
- All contributors and testers
Made with ❤️ by Zeff
If you found this helpful, please ⭐ the repository!