Classi is a local-first Flutter app for teachers. It stores groups, students,
grades, notes, checklists, and material tracking data in encrypted .classi
libraries, with portable .classi-backup export/import for sync.
This first release focuses on the local-first teaching workflow:
- encrypted local libraries with passphrase setup and recovery key support
- groups, students, notes, checklists, homework, and material tracking
- grade entry with configurable systems and chart-based history
- Android, macOS, Windows, and Linux desktop support
- GitHub Actions for CI and release artifact builds
- Android
- macOS
- Windows
- Linux
- SQLCipher-backed Drift database with the planned seven-table schema
- First-run passphrase setup with secure storage
- Adaptive navigation for groups, notes, and settings
- Working groups and students flow, including archive, unarchive, and clone
- Batch student creation and WebUntis class-list import
- Grade entry, chart-based grade history, checklist management, note management, material tracking, and delete actions for student history items
- Avatar editing powered by
avatar_maker, persisted per student in the local database - English and German translations through
easy_localization
Classi stores your library in a .classi folder that you choose during the
first-run setup. The setup wizard always requires an explicit folder selection
so your data is never silently placed inside an app-private directory.
Recommended locations:
| Platform | Recommended folder |
|---|---|
| Android | A folder in shared storage such as Documents — not inside Android/data/, which is erased when the app is uninstalled |
| macOS (App Store) | ~/Documents/Classi or another location outside ~/Library/Containers/ |
| macOS / Windows / Linux | Any folder in your home directory or an accessible drive |
Regardless of platform, enabling auto-export backups in Settings (or during
setup) is strongly recommended so you always have a portable .classi-backup
file in a separate location.
Linux desktop builds need native packages installed first:
sudo apt-get update
sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev libsecret-1-dev libssl-devflutter pub get
dart run build_runner build --delete-conflicting-outputs
flutter analyze
flutter test
flutter run -d android
flutter run -d macos
flutter run -d windows
flutter run -d linuxmacOS desktop builds require Xcode on a Mac with command-line tools installed.
Releases are packaged with Fastforge:
dart pub global activate fastforge
fastforge package --platform android --targets apk
fastforge package --platform linux --targets appimage
fastforge package --platform macos --targets dmg
fastforge package --platform windows --targets exeOr run all platforms at once using the project release config:
fastforge release --name releaseSee CONTRIBUTING.md for local setup, pull request expectations, and release hygiene.
Three workflows are included:
-
ci.yml— runs on every push tomain/masterand on pull requests. It installs dependencies, runs Drift code generation, analyzes the code, and executes the test suite. -
build-pr.yml— triggered by posting a slash command as a comment on any pull request. Supported commands:/build android— builds and uploads an APK/build linux— builds and uploads an AppImage/build macos— builds and uploads a DMG/build windows— builds and uploads an EXE installer
Only the requested platform is built using Fastforge. Once the artifact is uploaded the workflow replies directly on the pull request with a link to download the artifact.
Android PR builds use the application ID
org.openpatch.classi.prso they can be installed alongside the production app without overwriting it. -
release.yml— triggered by version tags (v*). It generates a changelog withgit-cliff, commits an updatedCHANGELOG.md, builds release artifacts for Android (APK), Linux (AppImage), macOS (DMG), and Windows (EXE installer) using Fastforge, and publishes a GitHub Release with all artifacts attached.
Released under the MIT License.
