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:
-
Mastra workflow
depart— read sky → TabPFN scores benches → pick bench → Gemma writes the brief → save walk → optional ElevenLabs voice. -
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. - 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.
-
Tinker (optional): half the briefs can come from a model tuned on sits that actually finished (
npm run train:briefs). -
SerpApi at build time adds real parks near
STILLBENCH_HOMEto the bench pool (coordinates never sent per walk). - 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).
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.
My Agent Session
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-itbriefs; 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 —
departworkflow 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_KEYon Render (TTS + Scribe path). - Best Use of Backboard — remembers debriefs; may suggest one line for the next brief.
-
Best Use of Tiger Data —
sit_eventsin Timescale for analytics. -
Best Use of Sentry Agent Tracing —
@mastra/sentryexporter on production; screenshot above. -
Best Use of Arduino — optional UNO R4 WiFi pebble in
hardware/polls/api/deviceand buzzes at sit end.
Built for Hacktoberfest 2026 — Week 1: Touch Grass. #hf26challenge




Top comments (0)