Offline-first is not a switch. It is a set of product decisions about what can be cached, what must be fresh and how the app explains uncertainty.
Cache what supports momentum
Lessons, progress state and recently used media should survive weak networks. Account settings and payment-sensitive state can stay online-only if freshness matters more.
Sync with intent
We prefer explicit sync boundaries over background magic when conflict risk is high. The app should know which records are local, pending or confirmed by the server.
Design for recovery
The important UX question is not “can we avoid every conflict?” It is “can a user recover without losing trust?” Clear state labels and retry actions matter more than clever sync code.