DEV Community

Cover image for Stillbench: open Gemma + TabPFN for twelve minutes outside (Touch Grass)
S. M. Riad
S. M. Riad

Posted on AI-assisted

Stillbench: open Gemma + TabPFN for twelve minutes outside (Touch Grass)

Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass Submission 🌿

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.

What I Built

Stillbench gets you off the couch with one job: sit outside at a real bench for twelve minutes while your phone stays in your pocket.

It is not a quest app, a streak game, or a garden planner. You tap Take me outside, hear a ~40-word Gemma brief once, walk to a bench TabPFN thinks you will actually reach today, then the screen is only a timer until the chime.

Optional This sit is for… names who the sit is for. TabPFN shows a plain why this bench line (light, last bail, leave probability). The street is too much is a six-minute doorstep sit—the roof counts. Sit with someone adds a line you can play for the person next to you. Check-in text shares a return time, not GPS.

Demo

Live: https://stillbench.onrender.com (Render free tier may sleep; first load after idle ~1 minute)

Sixty seconds: open the link on your phone → optional dedication → Take me outside → listen once → I'm leaving → I'm sitting → pocket the phone. Practice sit, twenty seconds is the same flow with a short timer.

Integrations board: https://stillbench.onrender.com/integrations — shows which partner APIs are on, set, or broken on production.

Code

Stillbench

Live demo: stillbench.onrender.com · Integrations: /integrations · DEV submission (Week 1 — Touch Grass): draft on DEV · Repo: github.com/smriad/stillbench

Sit outside for twelve minutes. Stillbench picks a nearby bench, speaks a short Gemma brief once, then times your sit while the phone stays in your pocket. It is not a quest app, a streak game, or a garden planner—the screen is the short part; the sit is the product.

Optional This sit is for… names who the sit is for. TabPFN shows a plain why this bench line (light, last bail, leave probability). Take me outside is twelve minutes. The street is too much is six minutes at the closest bench (the roof counts). Sit with someone adds a line you can play for the person next to you. Check-in text shares a return time, not GPS. Afterward: one noticing prompt, optional debrief for the next…

Start at src/mastra/workflows/depart.ts, then src/lib/forecast.ts, src/lib/write-brief.ts, and src/app/walk-app.tsx.

How I Built It

Open-source AI is the spine:

  1. Mastra workflow depart — read sky → TabPFN scores benches → pick bench → Gemma writes the brief → save walk → optional ElevenLabs voice.
  2. Gemma (google/gemma-3-4b-it) via OpenRouter on Render, or Ollama locally (gemma3:4b). If inference fails, a built-in composer still gets you outside.
  3. TabPFN (Prior Labs) forecasts leave probability per bench from your walk history—hour, distance, light, whether you bailed last time—and picks the farthest bench you are still likely to walk to.
  4. Tinker (optional): half the briefs can come from a model tuned on sits that actually finished (npm run train:briefs).
  5. SerpApi at build time adds real parks near STILLBENCH_HOME to the bench pool (coordinates never sent per walk).
  6. MongoDB Atlas on Render stores walks and integration health; Tiger Data logs sit events; Backboard may echo one debrief line into the next brief.
flowchart LR
  tap[Take me outside] --> sky[read-sky]
  sky --> score[forecast-benches TabPFN]
  score --> pick[pick-bench]
  pick --> brief[write-brief Gemma]
  brief --> speak[ElevenLabs voice optional]
  speak --> timer[phone timer]
  timer --> note[one-line notice]
  note -.-> brief

Sentry: Mastra runs through @mastra/sentry with SENTRY_DSN set. Agent steps, TabPFN, and ElevenLabs calls emit spans into the javascript-nextjs project (for example AI_APICallError when OpenRouter auth was misconfigured—fixed with ollama-env.ts and a real OLLAMA_API_KEY on Render).

Sentry exporter on and Mastra on the integrations board

Why Does Open Innovation Matter?

Closed wellness apps could nag you to go outside. They would not let me:

  • Swap the brief model (Gemma on OpenRouter, Ollama locally, Tinker-tuned half the time).
  • Train on my own bails so TabPFN learns when I actually leave.
  • Keep GPS off the server while still personalizing distance and light.
  • Run the departure agent on an open harness (Mastra) I can read and change.
Open piece What it does
Gemma Spoken departure brief on open weights
TabPFN Bench choice from tabular walk history
Mastra Five-step depart workflow
Tinker Briefs tuned on sits that finished
MongoDB Atlas Walks off ephemeral Render disk

ElevenLabs is deliberately optional closed voice on top; the open stack still works without it.

What I used outside

On production (stillbench.onrender.com) I ran a full twelve-minute sit (not practice): Take me outside, dedication Hacktoberfest Week 1, TabPFN to a shaded bench in Banani Block C Park (SerpApi park in the pool), pocketed the phone until the timer finished, then one debrief line.

Bench and timer screenshots are from the same app the same evening (TabPFN often offered the lakeside step at Dhanmondi Lake when I captured UI). The debrief is from the Banani sit.

Stillbench sit

  • Where: a shaded bench (Banani Block C Park, Banani Youngstars Club), about 7 minutes away
  • Sit: twelve-minute sit (12 minutes on the timer)
  • For: Hacktoberfest Week 1
  • Why this bench: Not much light left, so the walk stays short.
  • Open stack: brief from google/gemma-3-4b-it, bench scored with tabpfn
  • Location: not tracked—check-in uses a time, not GPS

Noticed: Generator hum from the club wall and someone washing a car two streets over.

Banani, Dhaka — near where I sat (CC BY 2.0, ASaber91 via Wikimedia Commons)

Your bench with a plain why-this-bench line (production UI)

Twelve-minute timer while the phone stays pocketed

My Agent Session

Stillbench — Touch Grass HF26 (Gemma, TabPFN, Render deploy)
You

Build Stillbench for Hacktoberfest Week 1 Touch Grass: open Gemma brief, TabPFN bench pick, twelve minutes outside, phone in pocket, no GPS.

Agent

Scoped meaning layer (dedication, why this bench, sit story), Mastra depart workflow, doorstep/together paths, and integrations page for judges.

You

Deploy to Render and write the DEV submission post.

Agent

Fixed production TypeScript, OpenRouter Gemma id in render.yaml, Mongo walks, live demo at stillbench.onrender.com.

You

Fix Sentry AI_APICallError Missing Authentication header on OpenRouter.

Agent

Root cause: empty OLLAMA_API_KEY on Render with OpenRouter base URL. Added ollama-env.ts to treat blank keys as unset, skip Gemma when remote key missing, and use explicit OpenAI-compatible Mastra model config.

You

Align DEV post with a real twelve-minute sit and submission template.

Agent

Completed 12-minute production sit at Banani Block C Park; updated DEV draft with template sections, repo embed, prize categories; Mongo-backed integration health and live probes on /integrations.

Full session on DEV — curated build log (Touch Grass scope, Render deploy, OpenRouter auth fix, submission polish). Publish the session on DEV if the embed is blank.

Prize Categories

  • Best Use of Render — https://stillbench.onrender.com from render.yaml; MongoDB for durable walks.
  • Best Use of Gemma — open-weight google/gemma-3-4b-it briefs; local Ollama path in README.
  • Best Use of TabPFN — scores every eligible bench from CSV/Atlas attempt rows; picks farthest reachable bench.
  • Best Use of Tinker — tuned brief model on exportable sits; ~50% of briefs on production.
  • Best Use of Mastra — depart workflow with five registered steps.
  • Best Use of MongoDB Atlas — walks, attempts, integration health on Render.
  • Best Use of SerpApi — real Dhaka parks merged at build via npm run benches:find.
  • Best Use of ElevenLabs — production integrations show Voice: works after syncing ELEVENLABS_API_KEY on Render (TTS + Scribe path).
  • Best Use of Backboard — remembers debriefs; may suggest one line for the next brief.
  • Best Use of Tiger Data — sit_events in Timescale for analytics.
  • Best Use of Sentry Agent Tracing — @mastra/sentry exporter on production; screenshot above.
  • Best Use of Arduino — optional UNO R4 WiFi pebble in hardware/ polls /api/device and buzzes at sit end.

Built for Hacktoberfest 2026 — Week 1: Touch Grass. #hf26challenge

Top comments (0)