A comprehensive mobile application for the UK hospitality industry that empowers managers to build rosters and staff to manage their working lives β all from a single, beautifully designed app.
- Overview
- Features
- Architecture
- Tech Stack
- Project Structure
- Prerequisites
- Getting Started
- Firebase Configuration
- Running Tests
- Licenses & Third-Party Packages
- Disclaimer
- Author
ShiftUp is a Flutter mobile application built specifically for the UK hospitality sector. It provides two distinct role-based experiences:
| Role | Description |
|---|---|
| Manager | Create and publish rosters, manage staff, approve shift swaps, track clock in/out, view reports |
| Staff | View upcoming shifts, clock in/out with geofencing, set availability, request swaps, view pay summaries |
The app is built on a real-time Firebase backend with full offline support via Hive local storage.
- π Roster Management β Calendar-based shift creation, editing and deletion
- π₯ Team Overview β Staff directory with roles, contact info and status
- π Shift Swap Approval β Review and approve/decline staff swap requests
- π Reports β Earnings summaries, hours worked, and coverage analytics
- π² Push Notifications β Real-time alerts for clock-ins, swap requests, and absence
- π Dashboard β Active shift card, upcoming shifts, quick actions
- π My Shifts β Tabbed upcoming / past shift view with estimated pay
- π Clock In / Out β One-tap fingerprint-style clock button with geofence verification
- ποΈ Availability β Tap-to-set calendar indicating available and unavailable days
- π° Pay Summary β Monthly earnings chart, weekly breakdown, downloadable payslips
- π Notifications β Colour-coded alerts (reminders, swaps, clock confirmations)
ShiftUp follows the MVVM + Repository Pattern with a feature-first folder structure:
Presentation (Screens / Widgets)
β
βΌ
ViewModels βββ Riverpod StateNotifier Providers
β
βΌ
Repository βββ Abstracts data sources
β
βββββ΄βββββ
β β
Firebase Hive
(remote) (local/cache)
- State Management: Riverpod v2 (
StateNotifierProvider) - Navigation: GoRouter with
StatefulShellRoutefor role-based tab navigation - Data: Firestore (real-time streams) + Hive (offline cache)
| Category | Package | Version |
|---|---|---|
| UI Framework | Flutter | 3.x |
| State Management | flutter_riverpod | ^2.5 |
| Navigation | go_router | ^13 |
| Backend | Firebase Auth + Firestore + Storage | Latest |
| Crash Reporting | firebase_crashlytics | ^4.0 |
| Push Notifications | firebase_messaging | ^15 |
| Local Storage | hive_flutter | ^1.1 |
| Charts | fl_chart | ^0.68 |
| Calendar | table_calendar | ^3.1 |
| Animations | flutter_animate | ^4.5 |
| Typography | google_fonts | ^6 |
| QR | qr_flutter + mobile_scanner | Latest |
| Location | geolocator | ^12 |
| Code Generation | build_runner, riverpod_generator | - |
shift_up/
βββ lib/
β βββ core/
β β βββ constants/ # AppColors, AppSizes
β β βββ router/ # GoRouter configuration
β β βββ services/ # HiveService
β β βββ theme/ # AppTheme (Material 3 dark)
β β βββ widgets/ # AppButton, AppTextField
β βββ features/
β β βββ auth/ # Login, Register, Splash + AuthViewModel
β β βββ manager/ # Dashboard, Roster, Shell
β β βββ staff/ # Dashboard, Shifts, Clock, Availability, Pay
β β βββ shared/ # ShiftModel, NotificationModel, repositories
β βββ main.dart
βββ test/
β βββ unit/ # Model + ViewModel unit tests
β βββ widget/ # Screen widget tests
βββ pubspec.yaml
Ensure the following are installed before cloning:
| Tool | Minimum Version | Install |
|---|---|---|
| Flutter SDK | 3.19.0+ | flutter.dev/install |
| Dart SDK | 3.3.0+ | Bundled with Flutter |
| Xcode (iOS/macOS) | 15+ | Mac App Store |
| Android Studio | 2023+ | developer.android.com |
| Firebase CLI | Latest | npm install -g firebase-tools |
| FlutterFire CLI | Latest | dart pub global activate flutterfire_cli |
git clone https://github.com/georgeikwegbu/shift_up.git
cd shift_upflutter pub get3. Configure Firebase (see Firebase Configuration)
mkdir -p assets/images assets/icons assets/animations assets/fontsNote: Font files (PlusJakartaSans) are loaded via
google_fontsat runtime, so no manual font installation is required.
# Development (debug)
flutter run
# Target a specific device
flutter run -d <device-id>
# List available devices
flutter devices# Android APK
flutter build apk --release
# Android App Bundle (Play Store)
flutter build appbundle --release
# iOS (requires macOS + Xcode)
flutter build ios --releaseShiftUp requires a Firebase project with the following services enabled:
- Authentication β Email/Password sign-in
- Cloud Firestore β Primary database
- Firebase Storage β Profile avatars
- Firebase Cloud Messaging β Push notifications
# 1. Log in to Firebase
firebase login
# 2. From the project root, run FlutterFire configure
flutterfire configure
# This will generate:
# - android/app/google-services.json
# - ios/Runner/GoogleService-Info.plist
# - lib/firebase_options.dart (optional, for multi-platform)
β οΈ Never commitgoogle-services.json,GoogleService-Info.plistorfirebase_options.dartto version control. They are listed in.gitignore.
| Collection | Description |
|---|---|
users |
User profiles (role, venue, hourly rate) |
shifts |
Shift records (staff assignments, clock in/out) |
notifications |
User notification records |
venues |
Venue/location records |
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
match /shifts/{shiftId} {
allow read: if request.auth != null;
allow write: if request.auth != null;
}
}
}# Run all tests
flutter test
# Run only unit tests
flutter test test/unit/
# Run only widget tests
flutter test test/widget/
# Run with coverage
flutter test --coverage
genhtml coverage/lcov.info -o coverage/html
open coverage/html/index.html
# Run a specific test file
flutter test test/unit/models_test.dart| Test File | What It Tests |
|---|---|
test/unit/models_test.dart |
UserModel & ShiftModel β fromMap, toMap, computed properties, copyWith |
test/unit/auth_view_model_test.dart |
AuthState + AuthViewModel β all state transitions, error parsing |
test/widget/auth_screens_test.dart |
LoginScreen & RegisterScreen β rendering, validation, loading states |
This project makes use of the following open-source packages, each governed by their respective licenses:
| Package | License |
|---|---|
flutter |
BSD 3-Clause |
flutter_riverpod |
MIT |
go_router |
BSD 3-Clause |
firebase_core, firebase_auth, cloud_firestore, firebase_storage, firebase_messaging |
Apache 2.0 |
hive_flutter |
Apache 2.0 |
google_fonts |
Apache 2.0 |
fl_chart |
MIT |
table_calendar |
Apache 2.0 |
flutter_animate |
MIT |
intl |
BSD 3-Clause |
geolocator |
MIT |
mobile_scanner |
MIT |
qr_flutter |
BSD 3-Clause |
flutter_local_notifications |
BSD 3-Clause |
uuid |
MIT |
logger |
MIT |
permission_handler |
MIT |
cached_network_image |
MIT |
shimmer |
BSD 3-Clause |
lottie |
Apache 2.0 |
Full license texts for all dependencies are available by running:
flutter pub deps --style=listUSE AT YOUR OWN RISK.
This software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement.
The author shall not be held liable for any claim, damages, or other liability β whether in an action of contract, tort, or otherwise β arising from, out of, or in connection with the software or the use or other dealings in the software.
By cloning, forking, or otherwise using this codebase, you agree that you are doing so entirely on your own terms and at your own risk. The author accepts no legal, financial, or operational responsibility for any outcomes resulting from the use of this software in any environment, including production.
This project is not affiliated with, endorsed by, or sponsored by Flutter, Google, Firebase, or any other third-party service mentioned herein.
George Ikwegbu
Senior Flutter / Mobile Engineer
π gikwegbu.netlify.app/ Β· πΌ LinkedIn Β· π GitHub
Copyright Β© 2026 George Ikwegbu. All rights reserved.
Unauthorised copying, modification, or distribution of this software, in whole or in part, is strictly prohibited without the express written permission of the author.