Skip to content

Fault-lines-org/ExamTracker

Repository files navigation

ExamTracker Logo

ExamTracker

Never miss another exam date.
A beautifully minimal mobile app to track upcoming exams, set smart reminders, and keep all your resources in one place.

Platform Expo SDK Supabase License


✨ Features

Feature Description
📋 Watchlist Pin exams you care about and see a "Next Up" hero card with a live countdown
🔍 Explore All Exams Browse, search, and filter exams by category (UPSC, SSC, Banking, Railways, etc.)
⏰ Smart Reminders Schedule notifications at customizable offsets — 1 week, 1 day, 1 hour before, or any custom value
📄 Resource Links One-tap access to syllabus PDFs, previous year papers, and official websites
🌗 Dark & Light Themes A pure black/white theme system with persistent preference
🚀 Onboarding Flow Smooth first-launch experience — enter your name, pick exams, and get started
📱 Skeleton Loading Polished loading states with animated skeletons while data loads
📊 Analytics Sync Anonymous device-level usage synced to Supabase for growth insights

🛠️ Tech Stack

Layer Technology
Framework React Native via Expo (SDK 54)
Navigation React Navigation (Bottom Tabs)
Database Supabase (PostgreSQL + Row Level Security)
Local Storage AsyncStorage for watchlist, preferences, and offline state
Notifications expo-notifications with custom scheduling
Fonts Google Fonts — Instrument Sans & DM Mono
Animations React Native Reanimated + Gesture Handler

📂 Project Structure

ExamTracker/
├── App.js                          # Root — fonts, providers, tab navigation
├── src/
│   ├── components/
│   │   ├── ExamDetailSheet.js      # Full-screen exam detail modal
│   │   ├── RichText.js             # Markdown-style content renderer
│   │   ├── SkeletonCard.js         # Loading skeleton for exam cards
│   │   ├── SkeletonWatchCard.js    # Loading skeleton for watchlist cards
│   │   ├── ThemeSwitch.js          # Dark/light mode toggle switch
│   │   ├── TimerBlocks.js          # Countdown timer UI (block layout)
│   │   └── TimerInline.js          # Countdown timer UI (inline layout)
│   ├── context/
│   │   ├── AppContext.js           # Global state — exams, watchlist, user
│   │   └── ThemeContext.js         # Theme provider (dark/light colors)
│   ├── lib/
│   │   └── supabase.js             # Supabase client initialization
│   ├── screens/
│   │   ├── AllExamsScreen.js       # Browse & search all exams
│   │   ├── CalendarScreen.js       # Calendar view of exams
│   │   ├── OnboardingScreen.js     # First-launch onboarding flow
│   │   ├── SettingsScreen.js       # Notification & theme preferences
│   │   └── WatchlistScreen.js      # Pinned exams with "Next Up" hero
│   └── utils/
│       ├── notifications.js        # Notification scheduling & management
│       ├── time.js                 # Date/time formatting helpers
│       └── urlUtils.js             # URL validation & linking helpers
├── supabase/
│   ├── schema.sql                  # Full database schema with RLS policies
│   ├── migration.sql               # Incremental migration scripts
│   └── seedingdata.sql             # Sample exam data for development
├── assets/                         # App icons, splash screens, animations
└── android/                        # Android native project (EAS Build)

🚀 Getting Started

Prerequisites

  • Node.js 18+ (LTS recommended)
  • npm or yarn
  • Expo Go on your phone, or an Android/iOS emulator

1. Clone & Install

git clone https://github.com/ipmen-in/ExamTracker.git
cd ExamTracker
npm install

2. Configure Environment

Create a .env file in the project root:

EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here

3. Set Up Supabase

  1. Create a new project at supabase.com
  2. Open the SQL Editor and run supabase/schema.sql to create tables with RLS policies
  3. (Optional) Run supabase/seedingdata.sql to populate sample exam data

4. Start Development

npx expo start

Scan the QR code with Expo Go or press a for Android emulator / i for iOS simulator.

5. Build for Android

npx expo run:android

Note: Full notification scheduling with channels requires a custom dev client or standalone build — Expo Go has limitations.


Security model:

  • categories and exams are read-only for all app users — only service_role can modify data
  • users can only read/update their own row (matched by device_id header)
  • Exam images stored in a public read-only Supabase Storage bucket

📦 Key Dependencies

Package Purpose
@supabase/supabase-js Database client
@react-navigation/bottom-tabs Tab-based navigation
react-native-reanimated Smooth animations
react-native-gesture-handler Swipe & gesture support
react-native-safe-area-context Safe area inset handling
@react-native-async-storage/async-storage Persistent local storage
expo-notifications Local push notifications
expo-image-picker Image selection

🗂️ Local Storage Keys

Key Type Description
watchlist string[] Array of pinned exam IDs
notification_prefs number[] Minutes-before values, e.g. [10080, 1440, 60]
notification_ids object Scheduled notification IDs keyed by exam ID
userName string User's display name from onboarding
onboardingComplete "true" Whether onboarding has been completed
theme "dark" | "light" Preferred color scheme
deviceId string Persistent UUID for analytics

🤝 Contributing

Contributions are welcome! Here's how to get started:

  1. Fork the repository
  2. Create a branchgit checkout -b feat/your-feature
  3. Make your changes — test on both Android and iOS
  4. Add migrations — any DB changes go in supabase/migration.sql
  5. Open a PR with a clear description

Ideas for Contribution

  • GitHub Actions CI (lint, typecheck, build)
  • End-to-end tests for onboarding & notification flows
  • Exam sharing via deep links
  • Study timer / Pomodoro integration
  • Push notification support via Supabase Edge Functions

📄 License

This project is licensed under the MIT License — see the LICENSE file for details.


Built with ❤️ by Team IPMen

About

A beautifully minimal mobile app to track upcoming Indian competitive exams, set smart reminders, and keep all your resources in one place.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors