Build
Clone the repo, `flutter pub get`, `flutter run` — running on a device or simulator in minutes
- Open source (MIT)
- Flutter 3.x
- iOS + Android single codebase
- Hot reload during development
A native Flutter app for iOS and Android that talks to the same JSON API as the web app. Secure on-device token storage, custom-field rendering, full ticketing depth — and you build and ship it from your own developer accounts.
Self-distributed, self-branded, self-hosted — same operational model as the rest of BottleCRM.
Clone the repo, `flutter pub get`, `flutter run` — running on a device or simulator in minutes
Point the app at your self-hosted backend URL — that's the only configuration step
Google OAuth or a 6-digit code emailed to your address — tokens land in the secure on-device store
Work tickets, leads, deals, approvals, and the timesheet from the device — switch orgs without re-signing in
Leads, contacts, accounts, opportunities, tasks, tickets, invoices, solutions, goals, timesheet — everything the web app does, available on phone.
JWT tokens stored on-device via the platform secure store. Same row-level security policies the backend enforces apply here — RLS is the safety net, the ORM filter is the contract.
The full ticketing surface from the web app — not a stripped read-only view. SLA, approvals, time tracking, @mentions, merges, analytics, all on phone.
Hit your quota and log your day without opening a laptop. Revenue/deals targets show progress in real time; the daily timesheet lets you book hours against tickets and tasks.
A user in multiple orgs swaps tenant without re-authenticating. Same auth/switch-org call the web app uses.
A deliberately calm interface — bordered cards instead of drop-shadows, Material 3 motion under the hood, consistent typography. Same design language across every screen.
One backend, one API, one schema — the mobile app is just another client. Custom fields, RLS, webhooks all carry through.
Not under our publisher account today — the repository ships the Flutter source so you (or your hosting partner) build and distribute it under your own developer account. This avoids the per-customer review friction of submitting one binary that talks to many different self-hosted backends.
No — the app is designed for personal use. Each install is signed in as one user. For shared devices (e.g. a sales floor tablet), use the web app instead and rely on browser sessions.
No. A live connection is required for every action — list, detail, create, edit. The backend runs tenant scoping (org filter + RLS) and custom-field validation on every request, and we deliberately do not buffer offline writes because the resulting merge conflicts would silently corrupt customer data. The trade-off is intentional: correctness over offline edits.
All of them. The mobile ticket detail screen mirrors the web app: SLA sidebar, Public / Internal / Emails comment tabs, custom-field rendering, parent/child links, time tracking, @mentions, merge & unmerge, solutions, the per-ticket approval panel, and the dedicated approvals inbox with Mine/All tabs. Analytics is read-only on mobile.
Two passwordless paths: Google Sign-In, or a 6-digit code emailed to your address (no deep links — you type the code in the app). Tokens land in iOS Keychain or Android Keystore via the platform secure store and refresh automatically when the access token expires.
Clone the Flutter source, point at your backend, ship to your own developer account.