Touch Grass Card: a 270M Gemma in your browser that deals you a reason to go outside A developer built Touch Grass Card, a single-page web app that runs Gemma 3 270M entirely in the browser via Transformers.js 4.2.0 to generate one outdoor mission card at a time based on location, available minutes, and mood. The project ships fp32 ONNX weights after the smaller q4f16 WebGPU path produced garbled output from a known ONNX Runtime fp16 overflow bug, and field testing of 16 generated missions found only about 3 were practical, with two ignoring safety instructions and one hallucinating a different city. The code is MIT-licensed and runs offline after a one-time model download. Everyone tells you to touch grass. Nobody tells you where to walk, what to look for, or how to make 30 free minutes feel like a tiny adventure instead of a lap around the block. So I built the smallest possible tour guide: an open-weight AI that lives entirely in a browser tab and deals you one outdoor mission at a time. Touch Grass Card is a single web page. You tell it where you are default: my college town, Corvallis, Oregon , how many minutes you can spare, and a vibe — chill, adventurous, curious, social. It then generates a mission card: Repo: github.com/qife422/touch-grass-card https://github.com/qife422/touch-grass-card — it's one HTML file plus this README. That's the whole app. Live demo: qife422.github.io/touch-grass-card https://qife422.github.io/touch-grass-card/ first load downloads the model once; after that it runs offline — try it in airplane mode . The "brain" is Gemma 3 270M instruction-tuned, ONNX export: onnx-community/gemma-3-270m-it-ONNX , running on-device via Transformers.js 4.2.0 : fp32 weights ~1 GB one-time download on both WebGPU and the WASM fallback. I originally tried the much smaller q4f16 WebGPU weights, but ONNX Runtime has a known overflow bug for this model on the WebGPU fp16 path that makes it emit repeated unused tokens instead of English — no error, just garbage. fp32 is slower to download, but it is the path that actually works on both backends, so that is what the page ships. There is no backend, no API key, no analytics. The only "prompt engineering" is a system message that forces a strict four-field output format, because a 270M model needs guardrails the way a golden retriever needs a fence. Honest field notes on the model: 16 draws, zero garbled tokens — the fp32 fix held on real hardware Chrome on Apple Silicon , so the