Completes the move to a fully package-based architecture. Every feature now lives in its own workspace package; the root app (lib/) holds no feature code.
Changed
- Feature packages —
home,profile, andsplashextracted fromlib/features/intopackages/features/, joiningauth,notifications,bookmarks, andcollections.lib/features/is removed and the app is now a pure composition root (routing, DI, Firebase bootstrap). - Splash decoupling — the splash screen no longer reaches into app routing; it restores the session and hands control back via an
onRestoredcallback the app wires, and resolves its logo against its own package asset bundle. - App shell — the three per-feature sync wrappers collapsed into one closure-based adapter; the
bookmarks → collectionscapability imports are annotated as the documented single-consumer exception.
Added
- Architecture guardrails for feature packages —
package_layering_testnow ranks and direction-checks the nestedpackages/features/*packages, andfeature_boundaries_testenforces the cross-feature capability allowlist (bookmarks → collections,profile → auth) at the package level.
Removed
- Unused app-level
freezeddev-dependency — the app declares no@freezedtypes (feature packages keep their own generator).
Migration note: this changes the public source layout — features moved from lib/features/<name> to packages/features/<name>, and lib/shared/ is gone (use the shared_contracts / shared_ui packages). Forks tracking the template structure should repoint imports accordingly.
Full changelog: https://github.com/kido-luci/flutter-starter-template/blob/main/CHANGELOG.md