Tech stack
At a glance
Frappe v16.13
Python + MariaDB. REST + WebSocket. Doctype-first schema. Workflow engine for follow-up status transitions.
frappe-mobile-controlcompanion appmobile_auth.*+mobile_sync.*APIs- Bulk-fetch endpoint for 500-record pages
Mobile ConfigurationSingle Doctype
Flutter + frappe-mobile-sdk
Offline-first. SQLite local store with queue-based sync. Dynamic form rendering from Frappe Doctype metadata — no code changes for new fields.
- Branch:
om/offline_improvement(v2.1.0) - Bulk-fetch: 500/page, full sync on login
- Auth: JWT + refresh via
mobile_auth.login - Geography: district → block → GP → village chain
mform-to-frappe skill
Claude plugin skill. Turns V2 form JSONs into Frappe Doctype artefacts — 4 files per form.
- 5 phases: prep → scaffold → field-map → validate → output
- 7 recipes × 3 vendored skills, 82 files
- Output: Doctype JSON +
.py+.js+.dart - Gated per-form, not end-to-end automated
Playwright + AI regression
Frappe web tests run in Playwright. Mobile regression on dedicated QA PC + emulator. AI-assisted chart spec for dashboards.
- Dedicated PC + emulator (decision D10)
- AI-driven regression on every APK build
- Sachin owns first-run tests for new features
- HS Test Cases → regression fixtures (A25)
mForm V2 (Diceflow v4.11.4)
13 V2 form JSONs (1000–1012, skip 1012 up-test). Content source only — PM sheet overrides V2 quirks. order is the universal join key across all forms.
- Access method TBD: REST? DB dump? (A14)
- Self-link: form 1011
closedItselfterminal codes 2/4/5/12/13/14 onorder22 - Three known dump gaps (forms 1008/1009/1012)
rel-mis Frappe app
Reference only — not template. The Reliance V3 deployment shows what production-grade looks like. Two deltas: simpler geography for Swasti, import-first bootstrap (no greenfield for existing programs).
Branch map
| Repo | Branch | Role |
|---|---|---|
frappe-mobile-sdk | om/offline_improvement | Flutter pub package. Mobile runtime — sync, auth, dynamic forms, SQLite. |
frappe-mobile-control | om/mobile-sync-bulk-fetch | Frappe companion app. Server-side auth + sync + bulk-fetch APIs. |
mform-to-frappe | — (Claude plugin skill) | Conversion skill. Runs inside Claude Code session. |
Key design constraints
- PM design sheet is authority. V2 form JSONs are content source — where the two disagree, PM wins.
- rel-mis is reference, not template. Geography model for Swasti is simpler (single location per user); no User Program Assignment multi-geography.
- Offline-first on mobile. Sync queue holds mutations until connectivity restored. Conflicts resolved server-side.
- Self-link collapse. mForm's follow-up response chains (form 1011
closedItself) collapse into Frappe-native audit log on the original record (D3). - Hidden member-ID carry-forward. Child forms (Scheme, Health, Document) prefill member geography at app layer, not data layer (D2).
Last updated 2026-06-05