BusBuddy is a Flutter app that turns a single sign-in into the right experience for each person who touches the school run. One login resolves the user's role and routes them to one of three purpose-built apps β an Admin fleet console, a Parent tracker, and a Driver companion β all sharing one Firebase backend, one typed data layer, and a polished light/dark design system.
| Role | App | Accent | What they do |
|---|---|---|---|
| π‘οΈ Administrator | Admin | Indigo | Manage buses, drivers, students, routes & assignments; watch the whole fleet live; read attendance/occupancy reports |
| π¨βπ©βπ§ Parent / Student | Parent | Mint | Track their bus live with ETA & next stop, see the driver & route, get notifications |
| π§β |
Driver | Amber | Follow the route & stops, broadcast live location, mark attendance with a QR scan |
How it works: a user's Firestore
level(1 = Admin, 2 = Parent, 3 = Driver) drivesappForRole(...)after login, so each role only ever sees its own app.
At a glance: 3 role-based apps Β· ~39 screens Β· one shared Firebase backend & typed data layer Β· 204 tests Β· full light & dark.
- π Live GPS tracking β real-time bus positions on an OpenStreetMap map (
flutter_map), with theme-aware tiles, route polylines, stop markers and staleness indicators. - π§ Route & stop progress β per-stop
reached / next / upcomingstatus with a visual timeline and progress bar. - π· QR attendance β drivers mark students present by scanning a code.
- π Push notifications β broadcast and per-role messages (Firebase Messaging + OneSignal).
- π Reports & analytics β fleet occupancy, attendance rate and per-route breakdowns with charts (
fl_chart). - π Light & dark mode β every screen, in all three apps, via
ThemeExtensionpalettes + a sharedThemeController. - π Role-based access β one branded login, three role-gated apps.
- π₯ Data export β admins can download fleet/attendance data.
- β‘ Offline-aware β Firestore persistence and streams hoisted out of
build()for smooth performance.
A single branded login (brand blue #2563EB, light & dark) is the entry point for all three roles.
Manage the entire operation: buses, drivers, students, routes, contacts and assignments; watch every bus live on one map; and read attendance & occupancy reports.
All Admin screens (light & dark)
A calm, focused experience for families: where is my child's bus, which stop is next, and how far away is it.
All Parent screens (light & dark)
| Screen | Light | Dark |
|---|---|---|
| Home | ![]() |
![]() |
| Bus | ![]() |
![]() |
| Live location | ![]() |
![]() |
| Tracking | ||
| Account | ![]() |
![]() |
| Contacts | ![]() |
![]() |
| Feedback | ![]() |
![]() |
| Notifications | ![]() |
![]() |
| Settings | ![]() |
![]() |
Everything a driver needs at a glance: the live map and route, the next stop, and one-tap QR attendance.
All Driver screens (light & dark)
| Screen | Light | Dark |
|---|---|---|
| Home | ![]() |
![]() |
| Attendance | ![]() |
![]() |
| QR / barcode scan | ![]() |
![]() |
| Account | ![]() |
![]() |
| Contacts | ![]() |
![]() |
| Feedback | ![]() |
![]() |
| Notifications | ![]() |
![]() |
| Settings | ![]() |
![]() |
BusBuddy is one Flutter project containing three role apps over a shared, typed data layer:
lib/
βββ main.dart # boot β Firebase β auth gate β appForRole(role)
βββ login_pages/ # branded login + LoginBloc
βββ routing/ # appForRole router
βββ theme/ # shared brand theme + ThemeController (light/dark)
βββ data/
β βββ models/ # typed models (Driver, Student, Bus, Route, AssignedBus, StopsStatus, β¦)
β βββ repositories/ # abstract repo + Firebase impl per collection (mockable, injectable)
βββ app1/ # π‘οΈ Admin (AdminPalette Β· indigo)
βββ app2/ # π¨βπ©βπ§ Parent (ParentPalette Β· mint)
βββ app3/ # π§ββοΈ Driver (DriverPalette Β· amber)
- State management β BLoC for flows (login, navigation) plus a repository pattern: every Firestore collection has an abstract repository and a Firebase implementation, so pages depend on interfaces and are unit-testable with fakes.
- Theming β each app defines a
ThemeExtensionpalette (light + dark) read viacontext.palette; a sharedThemeController(backed byshared_preferences) toggles Light / Dark / System. - Maps β
flutter_map+latlong2, with theme-aware tiles (OSM light / Carto dark). - Tested β 204 widget/repository tests; UI screens are guarded by render tests that fail on layout overflow.
- Flutter & Dart
- Firebase β Authentication, Cloud Firestore, Cloud Functions, Storage, Messaging, Realtime Database
- BLoC + repository pattern for state & data
- flutter_map + latlong2 for live maps Β· fl_chart for reports
- mobile_scanner / NFC for attendance Β· geolocator for driver location
git clone https://github.com/Adith-Senthil-kumar/Bus_management_app.git
cd Bus_management_app
flutter pub getFirebase config files are intentionally not committed β point the app at your own Firebase project:
# easiest: generates lib/firebase_options.dart for every platform
dart pub global activate flutterfire_cli
flutterfire configureOr add the platform files manually:
android/app/google-services.jsonios/Runner/GoogleService-Info.plistmacos/Runner/GoogleService-Info.plist
In the Firebase console, enable Authentication (Email/Password), Cloud Firestore, and Storage.
flutter run # pick a device
flutter run -d chrome # web (great for a quick demo)
flutter run --release # noticeably smoother than debugflutter test
flutter analyzeThe launcher icon is generated reproducibly from Flutter's canvas (no external image tools needed):
flutter test test/tools/generate_app_icon.dart # paint the 1024Β² masters β assets/
dart run flutter_launcher_icons # fan out to every platform- Adith Senthil Kumar β Lead Developer
Released under the MIT License.









































































