§01
Overview
- What it is: B2C food-delivery app for Restaurant chain (UZ). The customer picks a city/branch (terminal), delivery type (delivery/pickup) bound to a geo-zone via Yandex Maps, assembles the cart, places the order, pays (Payme), tracks status, accrues bonus points, reads news/promos. Version in pubspec —
1.0.70+70. - Type / status / role: mobile (Flutter, iOS+Android) · maintained (last commits — April 2025) · lead — the user is the top contributor (~108 of 268), team of 3 (with shahaa/Shahzod ~95 and Bobur ~63).
- Active period: 2021-08-30 → 2025-04-19 — nearly 4 years of continuous evolution of a single product (Flutter SDK migrations, dependency upgrades, features). Longevity = strong signal of maintaining a real product.
§02
Stack
- Languages: Dart (Flutter, SDK
>=2.17.0). - Frameworks/libraries:
- *State management (mixed):* MobX (
flutter_mobx,mobx_codegen) + flutter_bloc (9.x) + flutter_hooks — three reactive approaches in one project (legacy of long evolution). - *Local storage:* Hive +
hive_flutter+hive_generator— typed adapters via codegen (@HiveType/@HiveField, seemodels/basket.dart,terminals.dart),shared_preferences. - *Navigation/DI:*
auto_route(codegen routing) +get_it(service locator). - *Maps/geo:* yandex_mapkit +
geolocator— address/delivery zone selection, tracking. - *Auth:* local packages
authentication_repository+user_repository(repository pattern,packages/+lib/src/),otp_autofill,intl_phone_number_input,pin_code_fields— phone+OTP login. - *Firebase:* core + crashlytics + messaging (push).
- *i18n:* easy_localization (+loader) — RU/UZ/EN (fields
nameUz/nameEnin models). - *Forms/UI:*
flutter_form_builder+form_builder_validators,flutter_platform_widgets(iOS/Android adaptive),flutter_html/simple_html_css, lots of UI packages (carousel, staggered animations, rating bar, modal sheets). - *Updates:*
in_app_update+upgrader— forced/flexible updates. - Infra/deploy: native builds Android (Gradle) + iOS (CocoaPods),
flutter_native_splash,flutter_launcher_icons, Firebase (GoogleService-Info.plist,firebase_options.dart). Backend — external (Restaurant chain (UZ) API), the app is client-side. - Data: Hive (offline cache of cart/city/terminals/user), REST via
http. - Notable tooling:
patches/country_pickers— local dependency patch;dependency_overrides(fixflutter_plugin_android_lifecyclefor old Android SDK) — real work with version conflicts.
§03
What was shipped
Commit messages are often short/junk ("changed version", "dd") — conclusions are drawn from code.
- Catalog and cart: products, sections, related products, modifiers; cart on Hive (
BaskettypeId 2 — encodedId/lineCount/totalPrice) with offline persistence. - Delivery/geo: terminal and zone selection on Yandex Maps (
widgets/delivery/*: delivery_modal, terminals_modal, pickup), geolocation, delivery/pickup time calculation per terminal. - Payment: per-terminal Payme integration (fields
paymeActive,paymeMerchantId,paymeSecureKey,paymeTestMode,paymePrintonTerminals) — different merchant keys per branch. - Auth: phone+OTP with autofill of the code, repository pattern in separate packages.
- Update service:
services/app_update_service.dart(~14.5 KB) — singleton on top ofin_app_update: immediate/flexible update, restart dialog with re-show guard (_isRestartDialogShowing), debug-only emulation (kDebugModegate). - Reliability: in
main.dart, Crashlytics is wired intoFlutterError.onError+PlatformDispatcher.instance.onError(async error interception), background push handler. - Volume: 268 commits over ~3.7 years; 123 .dart files in
lib/, ~13 domain widget sections.
§04
Technical challenges
Confirmed by code/files:
- Offline-first on Hive with codegen (
models/*.dart+*.g.dart): domain models (Basket, Terminals, City, DeliveryType, PayType, Stock, User…) serialize into Hive with typed adapters (@HiveType(typeId: N)), field numbering managed manually with skips (e.g. in Terminals field 20 is skipped) — careful local-DB schema management as the app evolves. → understanding local-storage migrations. - Multi-branch payment configuration (
models/terminals.dart): each terminal carries its own Payme credentials and test/prod mode — the app effectively works as a multi-tenant across points of sale. → modeling a real retail domain. - Production-grade handling of update edge cases (
services/app_update_service.dart): singleton, idempotent dialog (flag against duplicates), graceful degradation with a toast when immediate-update is unavailable, isolation of the test path behindkDebugMode. → attention to production UX edge cases. - End-to-end crash reporting (
main.dart): both synchronous Flutter errors and async errors viaPlatformDispatcher.onErrorgo to Crashlytics as fatal — full coverage. → operational maturity. - Adaptivity and i18n:
flutter_platform_widgets(native look on iOS/Android) + easy_localization across 3 languages with localized fields directly in models. → working for a real multilingual market (Uzbekistan). - Dependency management: local patch of
country_pickers+dependency_overridesfor old Android SDK — resolving conflicts in a large package tree. → experience maintaining a long-lived Flutter project.
§05
AI-assisted development
- Sessions found: 0. Full-path normalization did not yield a directory; no neighboring/nested sessions either.
- What was done with AI: no data — the project developed before active use of Claude Code (2021–2025).
- AI-workflow patterns: none.
§06
Achievements & metrics
- Longevity: ~3.7 years of a single production app, 268 commits, version 1.0.70.
- Codebase scale: 123 .dart files, ~13 domain widget sections, ~40 models.
- Real users: public delivery app for Restaurant chain (UZ) (Uzbekistan), real payments (Payme), push, crash analytics.
- Cross-platform: unified codebase for iOS + Android with adaptive UI.