A cross-platform mobile app that helps university student clubs run their internal operations — task assignment, events, announcements, polls, and member management — in one structured place instead of scattered group chats and spreadsheets.
Built with Flutter (iOS & Android), Supabase, and Firebase Cloud Messaging.
- Role-based access — a President → Vice President → Director hierarchy, with permissions enforced per role and by PostgreSQL Row-Level Security.
- Multi-club membership — a user can belong to several clubs at once, each with its own role; join requests are approved by the club President.
- Tasks — create, assign, and track tasks with due dates, urgency, status, comments, and file attachments.
- Events — shared calendar, event creation, and RSVPs.
- Announcements — a club-wide announcement board.
- Polls & voting — audience-targeted polls (whole club / VPs / Directors) with one vote per member and shared results.
- Member directory — searchable directory with role-aware profiles.
- Push notifications — FCM-powered alerts for assignments, events, announcements, and approvals, plus an in-app notification feed.
- Activity log — a President-only audit view of club activity.
- Resources — a club constitution / resource page, editable by the President.
| Layer | Technology |
|---|---|
| Mobile (iOS & Android) | Flutter / Dart |
| Backend · auth · storage · realtime | Supabase (PostgreSQL) |
| Push notifications | Firebase Cloud Messaging |
| State management | Riverpod |
| Navigation | GoRouter |
lib/
├── app/ # Router and theme
├── core/ # Supabase client, FCM service, constants
├── features/ # Feature-first modules (auth, tasks, events, polls, …)
│ └── <feature>/
│ ├── data/ # Supabase queries / repositories
│ ├── providers/ # Riverpod providers
│ ├── screens/ # Full-page screens
│ └── widgets/ # Feature-specific widgets
└── shared/ # Shared models, providers, and widgets
supabase/
├── migrations/ # Database schema & RLS policies
└── functions/ # Edge functions (e.g. push-notification sender)
flutter pub getCreate a .env file in the project root. It is gitignored — never commit it:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-anon-keyPlace your Firebase config files (also gitignored):
android/app/google-services.jsonios/Runner/GoogleService-Info.plist
Apply the migrations in supabase/migrations/ to your Supabase project using the Supabase CLI:
supabase link --project-ref <your-project-ref>
supabase db pushflutter run # current device / simulator
flutter run -d ios
flutter run -d androidflutter analyze # static analysis
flutter test # run tests
flutter build appbundle # Android release
flutter build ipa # iOS releaseMIT © 2026 Bashar Yousef