Looking for a boutique Flutter team for your next release?
Let’s talk
ABOUT PROJECT
Ownstable is a digital platform that connects horse owners, trainers, and service providers across the thoroughbred horse racing industry. The platform centralises operations, billing, communications, and horse records to improve transparency, speed up payments, and support better care and decision-making.
CLIENT REQUIREMENT
"Develop a role-based mobile application (Owners, Trainers, Service Providers) that complements the client’s existing web platform and backend. The app should expose role-specific dashboards and workflows and enable users to: request and manage bookings, submit and validate service reports, create invoices from completed work, upload and view media for horses (photos/videos), message owners, see upcoming bookings, and optionally use biometric authentication for fast secure access. Workflows and UI had to be iterated based on client and user feedback while integrating with the client’s backend."
Flutter, Dart
BLoC / Cubit (flutter_bloc)
Freezed
json_serializable
Dio
Mixpanel
Sentry
Flutter, Dart
BLoC / Cubit (flutter_bloc)
Freezed
json_serializable
Dio
Mixpanel
Sentry





Designing and implementing distinct role-specific experiences within a single codebase required careful UX design and precise access-control logic to ensure parity with the web platform and meet business requirements.
The client’s backend and web platform were actively evolving. Maintaining compatibility, handling API changes, and synchronising data models between mobile and web demanded close coordination with the client’s team and robust versioning and error-handling strategies.
The app handles photo and video capture, gallery imports, audio recording and playback across a wide range of devices. Building a reliable pipeline – custom camera experience, thumbnail generation, format and codec differences between iOS and Android, large-file uploads over unstable mobile networks with progress and resume handling – required significant engineering effort and device-specific tuning.
Sensitive user data and credentials are stored on-device, so we implemented AES-GCM 256-bit authenticated encryption with PBKDF2 key derivation, backed by the platform Keychain / Keystore and gated behind Face ID / Touch ID. Handling the many edge cases – biometrics disabled, device passcode changes, OS-level keystore invalidation, fallback to manual login – while keeping the flow seamless was a notable challenge.
The in-app messaging module supports text, media attachments and HTML email previews rendered inside an embedded webview. Ensuring consistent rendering of arbitrary third-party HTML, correct sizing and scrolling behaviour, safe handling of remote content, and smooth playback of attached media required a dedicated rendering and caching strategy.
Schedules, bookings, horse records, invoices and contact lists can contain thousands of entries with grouping, filtering, alphabetical indexing and calendar views. Keeping scrolling smooth and startup fast required careful list virtualisation, image caching, payload compression, skeleton loading states and disciplined state management.
Users often work in areas with poor connectivity (stables, tracks, outdoor venues). The app needed caching of previously loaded data, clear error states, retry logic for failed requests and uploads, plus production monitoring to detect and diagnose issues quickly.