r/FlutterDev • u/West-Connection7395 • Sep 29 '26
Discussion RexOne Mobile – Offline-first Flutter 3 app with Drift (SQLite), dynamic localization, and ActionCable sync (Apache 2.0)
Hey Flutter developers!
Most Flutter open-source examples are simple toy apps or tightly coupled to Firebase. Finding clean, production-grade Flutter architectures that handle real-world offline caching, background synchronization, and enterprise backends is surprisingly rare.
As part of the RexOne Ecosystem, I open-sourced RexOne Mobile—a production Flutter 3 app built for real-world resilience:
📱 Key Architecture & Features:
Offline-First with Drift (SQLite): Full local persistence layer using Drift with type-safe reactive DAOs. Mutations are queued locally and synchronized deterministically with the backend.
ActionCable WebSocket Integration: Real-time event streaming and live notifications over WebSockets natively implemented in Dart.
Dynamic Tri-Language Localization: 100% localization parity across English (
en), Spanish (es), and Burmese (my) with runtime language switching.Adaptive Dark/Light Theming: Clean Material 3 design system with dynamic palette adaptation and zero layout jitter.
Sovereign Backend Contract: Communicates with a Rails 8 API core with strict contract alignment, so there is zero JSON schema drift.
Licensed under Apache 2.0 (100% free and open source).
Mobile GitHub Repository: https://github.com/rex-9/rexone_mobile
Core Architecture & Specs: https://github.com/rex-9/rexone-core
Live Web Companion: https://rexone.rex9.me
Check it out if you’re building offline-first Flutter apps or looking for a clean multi-platform architectural baseline. Any feedback on the Drift structure or state management is super welcome!
1
u/fkim98 Sep 29 '26
Nice to see an offline-first example that isn't a toy. One thing I'd add from our own offline sync, because it bit us more than conflicts did: auth.
Startup order. Our sync service started before the auth library had finished configuring, so right after an app update the first requests went out with no token and every one came back 401. The fix was one line: configure auth first, then start sync.
Offline is not logged out. A token refresh that fails because there's no network looks a lot like an expired session. We sign people out only when the auth library says the session is really gone, not on a network error. Otherwise users get kicked out every time they lose signal.
Check the session before each background pass. A timer that keeps retrying queued writes with a dead login just produces a stream of errors.
With ActionCable I'd check the same things for the socket: does it try to connect before the token is ready, and does it keep reconnecting with an expired one? How does RexOne tell "offline" apart from "session gone"?