Native Flutter • iOS & Android • 100% Free

Your CRM in your pocket

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.

Full CRM
All modules, all data, on phone
Secure
Keychain / Keystore, biometric unlock
Approvals built-in
Inbox + per-ticket actions
How it works

From clone to push.

Self-distributed, self-branded, self-hosted — same operational model as the rest of BottleCRM.

1

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
2

Connect

Point the app at your self-hosted backend URL — that's the only configuration step

  • Per-install server URL
  • No vendor lock-in
  • TLS-aware
  • Works against any deployment
3

Sign in

Google OAuth or a 6-digit code emailed to your address — tokens land in the secure on-device store

  • Google OAuth
  • Magic-link OTP code
  • Keychain (iOS) / Keystore (Android)
  • Auto token refresh
4

Run your day

Work tickets, leads, deals, approvals, and the timesheet from the device — switch orgs without re-signing in

  • Approvals inbox + per-ticket actions
  • SLA, time tracking, @mentions
  • Goals + daily timesheet
  • One-tap org switch
Capabilities

A real mobile app, not a wrapper.

Full CRM, in your pocket

Leads, contacts, accounts, opportunities, tasks, tickets, invoices, solutions, goals, timesheet — everything the web app does, available on phone.

  • All entities, fully editable
  • List + detail + create + edit
  • Filter & search
  • Activity timeline on every record

Secure by default

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.

  • Keychain (iOS) / Keystore (Android)
  • Auto-refresh on access expiry
  • Org-scoped on every request
  • Sign-out clears local state

Enterprise ticketing depth

The full ticketing surface from the web app — not a stripped read-only view. SLA, approvals, time tracking, @mentions, merges, analytics, all on phone.

  • Approvals inbox + per-ticket panel
  • SLA sidebar + Public/Internal/Emails tabs
  • Time tracking, @mentions, solutions
  • Parent/child, merge, analytics

Goals & timesheet on the go

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.

  • Revenue + deal-count goals
  • Leaderboard view
  • Daily timesheet entry
  • Time-tracked against tickets

Switch orgs in one tap

A user in multiple orgs swaps tenant without re-authenticating. Same auth/switch-org call the web app uses.

  • Multi-tenant in-app
  • Profile picker
  • Per-org token pair
  • Org name in app header

Flat, focused UI

A deliberately calm interface — bordered cards instead of drop-shadows, Material 3 motion under the hood, consistent typography. Same design language across every screen.

  • Bordered flat cards
  • Light theme today, dark planned
  • Accessibility-checked tap targets
  • Per-org branding

Same data plane as the web app.

One backend, one API, one schema — the mobile app is just another client. Custom fields, RLS, webhooks all carry through.

Same API
No special mobile endpoints
Crash reporting
Firebase Crashlytics on Android
Custom fields
Render & edit on mobile too
iOS ready
Flutter build, your developer cert
Android native
Material 3 under the hood
Open source
Modify, rebrand, ship your own

Questions, answered.

Is the mobile app on the App Store?

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.

Can multiple users share one device?

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.

Does the app work without internet?

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.

What ticketing features actually work on phone?

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.

How does sign-in work?

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.

Your CRM, your brand, your app.

Clone the Flutter source, point at your backend, ship to your own developer account.