Local-first AI · Gemma 4 · open source

Water decisions for plots the network forgets.

When the network is absent — and the human is far — local criteria still irrigate.

Sprout is a safety-bounded Gemma 4 decision network for irrigation under absence: Rhizome decides beside the water, Pollen turns each visit into expiring criteria, Meristem refines policy at home, and an ESP32 safety coprocessor owns the physical veto.

What is real in this submission

RhizomeJetson + Gemma 4 E2B via llama.cpp
PollenAndroid device path + Gemma 4 E4B via LiteRT-LM, native audio
ESP32Physical board, pump/soil supervised TEST_ONLY path
MeristemHome laptop evaluator + Gemma 4 E4B tool-calling

The browser demo below is deterministic by design. It lets reviewers inspect contracts, TTLs, receipts and refusal paths instantly; it does not pretend to run Gemma 4 in the browser. Real Gemma 4 execution lives in the Android, Jetson and laptop paths documented in the repo.

Sprout architecture overview: Pollen Android + Rhizome Jetson + ESP32 physical veto + Meristem home laptop
Sprout distributes irrigation criteria across three Gemma 4 nodes with different jurisdictions and one physical veto layer.

Try the three jurisdictions

Click any node to inspect its contract live. Mock code is public in js/api.js.

Rhizome · minutes

Should I irrigate now?

The plot node reads local state, proposes a bounded action and signs a DecisionReceipt. The ESP32 can still veto.

Deep dive →

Pollen · visit TTL

The farmer speaks. Pollen compiles.

Human intent becomes an expiring MissionPatch. If it cannot be grounded, Pollen refuses.

Deep dive →

Meristem · days

What policy for the next window?

The home laptop ingests bundles and refines durable PolicyPacket after the urgency is gone.

Deep dive →

Click a node to inspect a contract.

How Gemma 4 is used

  • E2B on Rhizome: short, bounded local rationales over decisions already closed by deterministic gates. Runs via llama.cpp on Jetson Orin Nano Super.
  • E4B on Pollen: native audio multimodal on Android via LiteRT-LM (com.google.ai.edge.litertlm:litertlm-android:0.10.0). Voice → validated MissionPatch with no STT pipeline.
  • E4B on Meristem: tool-calling-assisted policy review on a home laptop via llama.cpp.

Each node has a different model profile. Configuration is a property of jurisdiction, not a global choice.

Gemma proposes language, structure and rationale. The physical layer still owns water.

Safety & Trust

  1. Physical layer prevails. The ESP32 firmware enforces five hard rules (JETSON_HEARTBEAT_LOST, TANK_LOW, EVENT_DURATION_OUT_OF_RANGE, NO_FLOW_DETECTED, ALERT_LATCHED). No LLM can weaken them.
  2. Every intelligence has jurisdiction. Rhizome arbitrates in minutes. Pollen mediates within visit TTL. Meristem refines in days.
  3. Every criterion expires. MissionPatch, WeatherDigest and PolicyPacket carry TTL or validity windows. Late objects are rejected, not silently obeyed.
  4. Refusal is a feature. When Pollen does not understand a voice instruction, it asks for rephrasing. When Rhizome sees an expired policy, it rejects. When the ESP32 detects an unsafe condition, it blocks.
  5. A second local voice audits without authority. ShadowSkeptic records objections inside Rhizome with affects_decision=false. Even skepticism has jurisdiction.
Authority stack: ESP32 prevails (physical), Rhizome arbitrates (minutes), Pollen mediates (visit TTL), Meristem refines (days)
The farther a node is from the water, the less physical authority it has. The ESP32 can always say no.

Get the apps and the hardware path

Beyond the browser simulator, Sprout is real software you can install and real hardware you can build.

Pollen · demo flavor

Install the app, no model needed

~39 MB APK. Uses a deterministic mock evaluator. Runs on any Android emulator or device without downloading a 3 GB model. Walk through the UI, the voice path and refusal/retry flow.

Download demo APK

Pollen · device flavor

Run real Gemma 4 E4B on your phone

Real LiteRT-LM pipeline. Side-load the model and grant microphone permission.

# Build the device flavor
./gradlew assembleDeviceRelease

# Side-load the model
adb push gemma-4-E4B-it.litertlm \
  /data/local/tmp/gemma-4-E4B-it.litertlm

Requires Android 12+ (API 31+), 12 GB RAM recommended, NPU/GPU capable device. CPU runtime is stable but slow.

Hardware proof

Reproduce the Rhizome + ESP32 path

Jetson Orin Nano Super (or Raspberry Pi 5 with adapted build), ESP32-S3 N16R8, 12V pump, relay, capacitive soil sensor, 5L tank. Total bench ~370 €.

Rhizome Jetson setup →
ESP32 firmware →

What comes next

Read the full roadmap →