Open source · MIT + AGPL-3.0

Build an offline-first Flutter app on your Frappe backend.

Two packages: the Flutter SDK on the device, Control on the server. Install both, build against mForm.
$ flutter pub add frappe_mobile_sdk
What mForm is made of

One framework, two packages

mForm is the framework. The SDK and Control are the packages that implement it — install both, build against mForm.
Client · frappe-mobile-sdk

The SDK

Direct Frappe API access, metadata-driven dynamic forms, offline-first SQLite sync, and ready-made screens — login, doctype and document lists, forms, sync status.
Flutter / Dart · MIT · published on pub.dev
Server · frappe-mobile-control

Control

Mobile auth (login, OTP, social OAuth/PKCE, token refresh), app status and force-update, and translations. Required on the Frappe server for every mForm app.
Python · Frappe app · AGPL-3.0 · installed via bench
What you get

Forms, sync, and auth for a Frappe backend

Three capabilities on the device, three on the server.
On the device · SDK

Offline-first sync

Entries save to on-device SQLite. Retries automatically; data stays on the device until the server confirms.

Metadata-driven forms

Screens render straight from doctype metadata. Change the doctype, the app follows — no rebuild.

Ready-made screens

Login, list, document, form, and sync-status views ship in the box.
On the server · Control

Mobile auth

Login, OTP, social OAuth/PKCE, and token refresh — handled by Control on the server.

Force-update & status

Gate old app versions and push a required update from the server when you ship a breaking change.
🌐

Translations

Serve field-worker languages from Control, managed alongside your Frappe site.
Getting started

Four steps to a running app

From a clean Frappe instance to a deployed mobile app.
1

Install Control

Add frappe-mobile-control to your Frappe instance. It exposes auth, metadata and sync endpoints.
2

Add the SDK

Pull frappe_mobile_sdk into your Flutter project from pub.dev.
3

Configure auth & sync

Point the SDK at your site, pick your auth method, and choose which doctypes sync offline.
4

Build & deploy

Ship to the Play Store or App Store. Your forms follow your doctypes from then on.
Quickstart

Install both packages

Control on the server, the SDK in your Flutter app.

Server — Control

# on your frappe bench
$ bench get-app https://github.com/dhwani-ris/frappe-mobile-control
$ bench --site yoursite install-app frappe_mobile_control

Client — SDK

# in your flutter app
$ flutter pub add frappe_mobile_sdk
# then point it at your Frappe site

Read the docs.

Architecture, offline sync model, auth flows and examples.