All-in-one school app for LBS Brixen — timetable, grades, mensa, reminders.
- Timetable — weekly view, exams, cancellations, now/next indicator
- Grades — averages, full subject overview
- Mensa — daily menu, filters, offline cache
- Reminders — local push notifications for upcoming events
- Profile — settings, auto-login, biometric auth
- Fast, clean, native UI (iOS & Android)
| Layer | Technology |
|---|---|
| UI | Flutter 3.11+ / Dart |
| Backend | Firebase (Auth, Firestore, Messaging) |
| School Data | WebUntis API (JSON-RPC + REST) |
| Local Storage | SharedPreferences + Disk Cache |
| Auth | firebase_auth + local_auth (biometrics) |
| Notifications | flutter_local_notifications + Firebase Messaging |
- Flutter SDK
^3.11.4 - Dart SDK
^3.11.4 - Firebase project with
google-services.json(Android) andGoogleService-Info.plist(iOS) - Valid WebUntis school account (LBS Brixen)
git clone https://github.com/bedchem/POKYH.git
cd POKYH
flutter pub get
flutter runMake sure
google-services.jsonis placed inandroid/app/andGoogleService-Info.plistinios/Runner/before running.
flutter clean
flutter build apk --releaseOutput: build/app/outputs/flutter-apk/app-release.apk
flutter clean
flutter build ios --release
# Package into IPA
mkdir -p Payload
cp -R build/ios/iphoneos/Runner.app Payload/
zip -r ~/Downloads/Runner.ipa Payload
rm -rf PayloadOutput: Runner.ipa
- StatefulWidgets + setState (no heavy state management)
- Services layer handles all external communication
Services
| Service | Responsibility |
|---|---|
WebUntisService |
Auth, timetable, grades (WebUntis JSON-RPC) |
DishService |
Mensa menu fetch + local caching |
NotificationService |
Scheduling & managing local reminders |
FirebaseService |
User auth, Firestore, push messaging |
lib/
├── config/ # App configuration & constants
├── models/ # Data models (Dish, etc.)
├── screens/ # UI screens (timetable, grades, mensa, login, …)
├── services/ # Business logic & API layer
│ ├── webuntis_service.dart # WebUntis JSON-RPC client
│ ├── dish_service.dart # Mensa fetch + cache
│ ├── firebase_auth_service.dart # Firebase authentication
│ ├── reminder_service.dart # Local reminder scheduling
│ ├── notification_service.dart # Push notification handling
│ ├── update_service.dart # In-app update checks
│ └── secure_credential_service.dart # Keychain/Keystore storage
├── theme/ # App-wide theming
├── widgets/ # Reusable UI components
└── main.dart
- Credentials are stored in the device Keychain / Keystore via
flutter_secure_storage— never in plain SharedPreferences - Firebase API keys are scoped per platform and restricted in the Firebase Console
- Never commit
google-services.json,GoogleService-Info.plist, or any.envfile — these are excluded via.gitignore
All school-specific values (WebUntis server, school name) are set in lib/config/app_config.dart. No hardcoded secrets in source code.
| Config Key | Description |
|---|---|
webUntisServer |
WebUntis hostname for LBS Brixen |
schoolName |
School identifier used in API requests |
This project follows Semantic Versioning.
Current version: 1.1.5 — see pubspec.yaml for the full build number.
| Version | Highlights |
|---|---|
| 1.1.5 | Bug fixes, auth improvements |
| 1.1.0 | Reminders feature |
| 1.0.0 | Initial release — timetable, grades, mensa |
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature - Commit your changes:
git commit -m "feat: add your feature" - Push and open a Pull Request
Please keep PRs focused — one feature or fix per PR.
MIT
MADE BY RYHOX AND NEXOR <3