Focus 4/10 · "migraine"
REPLYToday is a body day. That's data.
ACTIONLie flat for 10 minutes. Phone face down.
MINUTES10
Same input, both paths, side by side. Both run on this device. The left is the always-on JS template fallback. The right is Google's official Gemma 4 E2B Web .task build running in the browser via MediaPipe LLM Inference and WebGPU.
NEXT_PUBLIC_GEMMA_E2B_URL swaps stock for fine-tune; runtime is the same.Demo scenarios
Training data · 420 dialogues
Eight verbatim rows from adhd_dialogues.jsonl. Permission language ("you can stop here", "that counts"), ten-word replies, body-day vs work-day discrimination. The voice the model is being taught.
Focus 4/10 · "migraine"
REPLYToday is a body day. That's data.
ACTIONLie flat for 10 minutes. Phone face down.
MINUTES10
Focus 5/10 · "won't start the report"
REPLYYou're warm enough. Open it and read line one.
ACTIONOpen the file and read the first line.
MINUTES3
Focus 4/10 · "draft is blank"
REPLYBullet point. Not a sentence. A bullet.
ACTIONWrite one bullet point.
MINUTES2
Focus 4/10 · "room is chaos"
REPLYThrow five things away. Anything.
ACTIONThrow five items in the bin.
MINUTES3
Reproducible: scripts/generate_synthetic.py with seed=42 reproduces the dataset bit-for-bit. Every row passes scripts/validate_format.py against the same regex used at inference time, so the parser the runtime uses is the parser the trainer was checked against.
Both paths run on this device. Nothing on this page leaves your browser.