Skip to content

Mario-Vishal/splitmaa

Repository files navigation

Splitmaa

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.

Current Status

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_intent model-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

Quick Start

pnpm install
pnpm mobile:web

Useful commands:

pnpm mobile:start
pnpm mobile:android
pnpm mobile:android:native
pnpm mobile:ios
pnpm typecheck
pnpm test
pnpm eval:smoke

Native 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.litertlm

After 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:assembleDebug

The 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:web

Architecture

User 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.

Repository Layout

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

Fine-Tune Dataset Workflow

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, validation 350, locked test 350
  • Frozen pre-training target: complete
  • Converted artifacts: train.functiongemma.jsonl has 1,700 examples; validation.functiongemma.jsonl has 350 examples
  • Latest gates: strict routing valid, semantic audit zero findings, locked-test self-test 1.0 across reported metrics
  • Duplicate review: zero exact normalized duplicates; loose 0.78 near-pair scan reports 58 low-risk pairs and no pairs above 0.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:self

Convert 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.jsonl

Roadmap

The 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.

About

Edge-device LLM mobile showcase for safe local function calling in expense workflows

Resources

License

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors