| j / k | Scroll down / up |
| gg | Scroll to top |
| G | Scroll to bottom |
| / | Open search |
| ? | Show this help |
| Esc | Close search / help |
| n / N | Next / previous section |
| h | Go to landing |
| d | Go to docs |
| : | Command mode — type section name |
Press ? or Esc to close
Two top-level concerns: config/ for global services, features/ for everything product-specific. Everything has one obvious home.
lib/
└── main.dart # Entry point
└── firebase_options.dart # Firebase auto-generated config
└── app/
│ └── app_bootstrap.dart # DI setup, Firebase init, service registration
│ └── app.dart # Root widget, MultiBlocProvider, MaterialApp.router
│ └── app_router.dart # GoRouter config, StatefulShellRoute, auth guard
│ └── app_routes.dart # Route enum definitions
└── config/
│ └── constants/ # AppConstants, AppIcons, AppImages, StorageKeys
│ └── database/ # Sqflite with migration system
│ └── localization/ # 3-source localization + TranslationKeys enum
│ └── logging/ # Logger initialization
│ └── network/ # ApiClient, interceptors, BaseStore, ApiResponse
│ └── theme/ # AppColors, AppThemeColors, AppTypography, AppSpacing
│ └── ui/ # 30+ reusable widgets
│ └── utils/ # Services: analytics, crashlytics, deep_link, etc.
└── features/
└── <feature>/
└── config/ # DI registration + route definition (public API)
└── data/ # models, source, store, local (cache)
└── logic/ # Cubit + State (or Bloc + Event)
└── presentation/ # screens + widgetsNo business logic. Only global/core services registered here: ApiClient, AppDatabase, ThemeCubit, LocalizationCubit, GlobalErrorCubit. Feature DI is NOT registered here.
Stateless, globally available, has zero feature imports. All third-party service wrappers live here. Add database/ only if offline support is needed.
Route defined here, registered in app_router.dart. DI registered lazily on route entry, unregistered when the feature route is popped. This is the only public API of the feature — nothing else is imported from outside.