Dukkan is a Flutter retail shop management app for sales, inventory, loans, expenses, backups, and LAN data sharing.
- Android: split release APKs and AAB.
- Windows: Inno Setup installer and zip fallback.
- Linux: AppImage primary artifact, with
.debandtar.gzfallbacks. - iOS: not part of the current production target until an Apple Developer account is available.
- Backend: Appwrite Cloud.
- Build-time configuration is passed with Dart defines.
- Secrets, keystores, and local signing files must not be committed.
- Offline login is supported from cached secure auth state after a successful online login.
- Crash reporting is optional and disabled until
SENTRY_DSNis provided.
Required build defines:
--dart-define=APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
--dart-define=APPWRITE_PROJECT_ID=<appwrite-project-id>
--dart-define=APPWRITE_BUCKET_ID=<appwrite-bucket-id>Optional observability build defines:
--dart-define=SENTRY_DSN=<sentry-dsn>
--dart-define=SENTRY_ENVIRONMENT=<environment>
--dart-define=SENTRY_RELEASE=<release-or-commit>If SENTRY_DSN is empty, the app still installs and runs normally. Local logging stays redacted and release builds suppress verbose debug logs.
- Install Flutter
3.41.9or the version pinned in.github/workflows/main.yml. - Run
flutter pub get. - Run
flutter analyze. - Run
flutter test -j 1 --timeout 120swhen tests need Isar native initialization.
Android APK:
flutter build apk --release --split-per-abi \
--dart-define=APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1 \
--dart-define=APPWRITE_PROJECT_ID=<appwrite-project-id> \
--dart-define=APPWRITE_BUCKET_ID=<appwrite-bucket-id>Android AAB:
flutter build appbundle --release \
--dart-define=APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1 \
--dart-define=APPWRITE_PROJECT_ID=<appwrite-project-id> \
--dart-define=APPWRITE_BUCKET_ID=<appwrite-bucket-id>Linux:
flutter build linux --release \
--dart-define=APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1 \
--dart-define=APPWRITE_PROJECT_ID=<appwrite-project-id> \
--dart-define=APPWRITE_BUCKET_ID=<appwrite-bucket-id>Windows:
flutter build windows --release `
--dart-define=APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1 `
--dart-define=APPWRITE_PROJECT_ID=<appwrite-project-id> `
--dart-define=APPWRITE_BUCKET_ID=<appwrite-bucket-id>- Pushes to
hotpublish the moving beta pre-release tag namedbeta. - Stable releases are created when a PR is merged into
masterand the PR title contains a version such asv2.4.7. - Release artifacts are uploaded by
.github/workflows/main.ymlafter analyze and tests pass.
Current beta release:
https://github.com/ayman2ppp2/dukkan/releases/tag/beta
- Database backups are created locally before upload or sharing.
- Restore verifies the replacement before swapping the active database.
- LAN sync uses an explicit pairing address and short pairing code.
- LAN sync only serves allowed backup files and verifies the backup hash before restore.
- Pairing codes are session-scoped and should only be shared with trusted devices on the same network.
- The product UI is Arabic-first for now.
- Developer documentation and release automation remain English-first.
- New user-facing strings should be Arabic unless a specific integration requires English.
CHANGELOG.md: release notes.PRIVACY.md: privacy and data handling notes.RELEASE_CHECKLIST.md: manual release checklist.plans/production-readiness-todo.md: production hardening roadmap.