Atlas Demo
Fictional showcase project — the documentation template every real client project starts from.
Flutter · GetIt · GetX · Clean Architecture
Client
Atlas Retail (fictional)
product@atlasretail.example
Environments
- devapi.dev.atlasdemo.example
- stagingapi.staging.atlasdemo.example
- prodapi.atlasdemo.example
Delivery Phases
Phase 1 — Foundations & Auth
signed off3/34 May 2026 → 29 May 2026
- Design system + theming (light/dark)
- Auth flows: login, register, logout, reset
- CI pipeline with signed test builds
Client signed off 2026-05-29 after UAT on staging.
Phase 2 — Catalog & Cart
active2/41 Jun 2026 → 24 Jul 2026
- Product catalog with search + filters
- Local-first cart
- Token-refresh hardening (contract change fix)
- Deep-link handling for password reset
Phase 3 — Checkout & Launch
planned0/327 Jul 2026 → 4 Sept 2026
- Checkout with Stripe PaymentSheet
- Push notifications
- Store listings + release
Decisions
Single-flight token refresh behind a mutex
18 Jun 2026The Dio interceptor serializes refresh calls behind a mutex; concurrent 401s await the same rotation future.
›context & consequences
Two parallel 401s (e.g. home + notifications fetch on boot) each triggered a refresh, and the second rotation invalidated the first token.
Consequences: Boot-time races disappeared. The 2026-07-10 backend contract change (refreshToken rename) touches exactly one file.
Password reset always shows a neutral confirmation
20 May 2026Backend returns 200 for every reset request; the UI shows 'If an account exists, an email was sent' in all cases.
›context
Distinguishing 'unknown email' from 'reset sent' enables account-enumeration attacks.
GetIt owns construction, GetX owns lifecycle
12 May 2026Register data sources, repositories and use cases in GetIt; controllers live only in GetX bindings and receive dependencies via sl().
›context & consequences
Controllers need GetX lifecycle hooks (onInit/onClose), but repositories and use cases should be framework-free and testable.
Consequences: Tests override GetIt registrations with mocks; no controller ever appears in the service locator.