Splitmaa means Split + Gemma.
Splitmaa is an independent open-source edge-device LLM project demonstrated through a mobile expense assistant. It is not affiliated with Google or the Gemma team.
The project is framed as an AI system first: a small local function-calling model extracts one constrained workflow intent, while the app validates it, resolves local data, asks for confirmation, and only then executes deterministic product updates.
Local MVP is moving into the local-first AI phase.
- Real: pnpm monorepo scaffold, Expo mobile reference client, Splitwise/Notion-inspired Home, Groups, Contacts, and Diagnostics screens, group/contact detail views, compact bottom-sheet assistant, confirmation cards, FunctionGemma-only parser adapter, single
extract_workflow_intentmodel-facing function, strict workflow operation schemas, Android LiteRT-LM native runner module, Android debug APK build, deterministic action application, SQLite local persistence with one-time AsyncStorage migration, workflow state/audit tables, local query/search/navigation helpers, smoke eval runner, guided create-group execution animation, v3 stress dataset with percentage splits and semantic audit gates, manual v4 dataset seed, project plan, TODO tracker, and project log. - Not complete yet: full workflow engine UI for persisted
workflow_state, Splitmaa-specific fine-tuned FunctionGemma model trained on the manual v4 dataset, mobile SQLite adapter unit tests, speech-to-text, Supabase sync.
GitHub: https://github.com/Mario-Vishal/splitmaa
pnpm install
pnpm mobile:webUseful commands:
pnpm mobile:start
pnpm mobile:android
pnpm mobile:android:native
pnpm mobile:ios
pnpm typecheck
pnpm test
pnpm eval:smokeNative Android model testing requires a development build/APK, not Expo Go. The current LiteRT-LM runner loads:
/data/local/tmp/llm/mobile_actions_q8_ekv1024.litertlm
During development, push a LiteRT-LM .litertlm model with adb push path/to/model.litertlm /data/local/tmp/llm/mobile_actions_q8_ekv1024.litertlm.
On Windows with a connected Android device:
$env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk"
$env:Path="$env:ANDROID_HOME\platform-tools;$env:Path"
adb shell mkdir -p /data/local/tmp/llm
adb push C:\path\to\model.litertlm /data/local/tmp/llm/mobile_actions_q8_ekv1024.litertlm
adb shell ls -lh /data/local/tmp/llm/mobile_actions_q8_ekv1024.litertlmAfter pushing the model, open Splitmaa -> Status -> Check model. The status must show ready before assistant commands can produce real FunctionGemma tool calls. The app does not fall back to the rule-based parser at runtime.
The Mobile Actions model loads but is not useful for Splitmaa prompts. The fine-tuning path should use base google/functiongemma-270m-it with the single-function dataset format in datasets/splitmaa_functiongemma.
Speech-to-text is intentionally separate from FunctionGemma. The STT layer should later produce a transcript locally, then pass that text into the same FunctionGemma tool-call pipeline.
To build the Android debug APK locally on Windows:
$env:JAVA_HOME='C:\Users\mario\Documents\projects\Splitmaa\.local-tools\jdk17\jdk-17.0.19+10'
$env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk"
$env:ANDROID_SDK_ROOT=$env:ANDROID_HOME
$env:Path="$env:JAVA_HOME\bin;$env:ANDROID_HOME\platform-tools;$env:ANDROID_HOME\emulator;$env:Path"
cd apps\mobile\android
.\gradlew.bat :app:assembleDebugThe APK is written to:
apps/mobile/android/app/build/outputs/apk/debug/app-debug.apk
On Windows PowerShell, use pnpm.cmd if script execution policy blocks pnpm:
pnpm.cmd install
pnpm.cmd mobile:webUser text or voice transcript
-> compact product context
-> FunctionGemma native runner
-> extract_workflow_intent tool call
-> strict workflow schema validation
-> context resolution and ground-truth lookup
-> confirmation card or answer card
-> user approval for mutations
-> guided execution animation
-> deterministic SQLite-backed local state update
-> workflow audit log and diagnostics
The model is a workflow intent extractor, not an executor. It outputs names, natural references, amountText, and dateText; the app owns trusted IDs, SQLite lookups, money/date normalization, UI clarification, confirmation tokens, guarded commits, navigation, highlighting, and audit.
apps/mobile Expo React Native reference client
packages/core Shared domain logic and contracts
docs Architecture, deployment, and project narrative
tools Evals, fine-tuning, conversion, and benchmarks
datasets Splitmaa command datasets
docs/PROJECT_LOG.md Source of truth for completions, learnings, tradeoffs, and next steps
SESSION_BRIDGE.md Source of truth for session handoff
PLAN.md Build plan
TODO.md Phase tracker
Canonical staging JSONL lives in:
datasets/splitmaa_functiongemma
The trusted training path now starts in:
datasets/splitmaa_functiongemma/manual_v4
Rows in manual_v4 are manually authored. Scripts are used only for validation, semantic audit, conversion, dedupe/reporting, and evaluation. The script-built datasets/splitmaa_functiongemma/v3 split is retained only as stress/validator data, not as the trusted fine-tuning source.
Current manual v4 checkpoint:
- Total rows:
2,400 - Split: train
1,700, validation350, locked test350 - Frozen pre-training target: complete
- Converted artifacts:
train.functiongemma.jsonlhas1,700examples;validation.functiongemma.jsonlhas350examples - Latest gates: strict routing valid, semantic audit zero findings, locked-test self-test
1.0across reported metrics - Duplicate review: zero exact normalized duplicates; loose
0.78near-pair scan reports58low-risk pairs and no pairs above0.90
Validate manual v4:
python tools/finetune/validate_splitmaa_dataset.py --strict-routing datasets/splitmaa_functiongemma/manual_v4/train.jsonl datasets/splitmaa_functiongemma/manual_v4/validation.jsonl datasets/splitmaa_functiongemma/manual_v4/test.jsonl
python tools/finetune/semantic_audit_dataset.py datasets/splitmaa_functiongemma/manual_v4/train.jsonl datasets/splitmaa_functiongemma/manual_v4/validation.jsonl datasets/splitmaa_functiongemma/manual_v4/test.jsonl --fail-on-blocking
pnpm report:functiongemma:manual-v4
pnpm eval:functiongemma:manual-v4:selfConvert a validated split to FunctionGemma chat/tool-call JSONL:
python tools/finetune/convert_to_functiongemma.py datasets/splitmaa_functiongemma/manual_v4/train.jsonl datasets/splitmaa_functiongemma/manual_v4/train.functiongemma.jsonlThe full roadmap is tracked in PLAN.md, TODO.md, and docs/PROJECT_LOG.md. The next major phase is implementing the persisted workflow engine around workflow_state, then growing the validated FunctionGemma fine-tune dataset.