| 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
Every architectural decision traces back to one of these. When something feels wrong, check it against this list first.
| Rule | Why |
|---|---|
| Feature-first | Easy to find, delete, or reuse |
| Config owns route + DI | No cross-feature coupling |
| Store = data truth | Single place for data logic |
| Cubit = UI truth (default) | Clean, lightweight state |
| Bloc when complexity warrants | Event traceability, transformations |
| Multiple Cubits allowed | Feature-internal separation of concerns |
| UI is stateless | No hidden side effects |
| Design tokens only | Easy theming, consistency |
| Feature-level lazy DI | Fast startup, low memory, true isolation |
| go_router declarative | Deep-link ready, auth guards |
| sqflite opt-in | Don't add until offline is required |
| Env config via dart-define | Safe dev/staging/prod separation |