DEV Community

Jed Aureus Gonzales
Jed Aureus Gonzales

Posted on AI-assisted

LaunchPup: rest is the countdown, the walk is liftoff (for both of you)

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

LaunchPup is mission control for a walk you take with your dog.

Most “walk the dog” apps treat the human as a dispatcher: log the pee, close the ticket, get back to the couch. That is not a walk. When the leash clips on, two mammals leave the house. The dog is the excuse. The owner is the payload. Touch Grass this week is about getting a person off the screen; LaunchPup uses the nap log as the countdown so that person actually goes.

You log rest and the last burn. TabPFN reads a small CSV of rest/walk features and votes HOLD / GO / OVERDUE. Range safety votes separately on pavement temperature, humidity, night, and short-nosed breeds. Gemma is CAPCOM only: it does not get to overturn the poll. It writes a sixty-second pocket card, then tells you to put the phone away. Mastra is the harness around that agent.

Then the UI becomes a countdown with one button left: splashdown. That clock is for both of you on the sidewalk.

flowchart LR
  naps[Nap / walk log] --> tabpfn[TabPFN energy vote]
  weather[Open-Meteo + pavement] --> range[Range safety]
  tabpfn --> ld[Launch director]
  range --> ld
  ld --> gemma[Gemma CAPCOM via Mastra]
  gemma --> pocket[Owner pockets the phone and walks]

The open pieces are the product, not garnish. TabPFN never sees a prompt. It sees twelve numbers (rest in 24h, nap count, longest nap, hours since the last walk, last walk length, age, weight, breed energy, hour, air temp, humidity, brachy flag). Gemma is forbidden from changing HOLD to GO because the pavement is 52°C. Range safety is boring code on purpose: a foundation model should not be the thing that decides whether asphalt will fry a pad.

Demo

Code: github.com/jedau/launchpup

Live: run it locally (below). No login, no account. A short screencast of poll → T-0 → Liftoff counts as the required demo if you do not deploy.

cp .env.example .env
uv sync
uv run python scripts/generate_training.py
uv run uvicorn launchpup.app:app --reload --port 8000
Enter fullscreen mode Exit fullscreen mode

Open http://127.0.0.1:8000. Scout (the default dog) already looks overdue, so the first Poll the room is a real count, not an empty form. T-0 call prints the pocket card. Liftoff starts the walk clock and stops offering more screen. Splashdown is you both coming home.

Optional: TABPFN_TOKEN for the real tabular vote, Ollama gemma2:2b plus npm run capcom for Gemma through Mastra, or GROQ_API_KEY if you have no local GPU.

How it keeps the screen the shortest part

  • The decision is a poll, not a chat. You do not negotiate with a chatbot about whether to go outside.
  • CAPCOM is sixty seconds of card, then a hard pocket mode.
  • Liftoff has nothing left to tap except splashdown.
  • The owner is addressed as the walker. The dog does not “get walked” by an app.

Why open innovation matters

The prompt asked where open is better than closed. For a walk app, closed wants your nap times on someone else's server and your face in the feed.

The fueling log stays on the machine. Rest and walks live in local SQLite. There is no account. A closed walk tracker is a surveillance product with a cartoon bone on it.

The energy vote is a table you can read. TabPFN (Prior Labs) classifies from data/zoomie_windows.csv. Training labels are synthetic and generated in-repo — I am not pretending this is a vet study. You can inspect the rows, disagree with HOLD, and still go. If TabPFN's local license token is missing, the UI says so and falls back to a labeled sklearn classifier instead of faking “TabPFN.” Honesty is part of the open bet.

CAPCOM is a model you can swap. Gemma via Ollama on a laptop, Groq's gemma2-9b-it if you have no GPU, or a printed fallback card if the network is gone. Mastra orchestrates the agent; it does not own the weights. I can change how CAPCOM talks without retraining the thing that decides GO.

It can cost nothing to run. Local TabPFN + local Gemma + Open-Meteo for weather. Open-Meteo is the one network call range safety wants, because pavement physics is not a personality.

Where open worked better than closed: I could put the decision in a foundation model built for tables, keep the veto in code, and keep the narration in an open-weight LLM — three stations, votes in the clear, phone in a pocket. A single closed chat API would have mixed those jobs and then asked me to keep scrolling.

How it's put together

Station Job
TabPFN Energy: HOLD / GO / OVERDUE from rest history
Range safety Pavement, heat, humidity, night, brachy — can scrub a GO
Launch director Combine the two. Overdue + hot asphalt is still a scrub
Gemma via Mastra Pocket card only. Does not change the votes
Pocket clock The actual product

Stack: FastAPI + a small mission-control page, SQLite, Python 3.12, a Mastra agent/workflow on Node for CAPCOM.

Credits that are not mine: TabPFN, Gemma, Mastra, Open-Meteo, FastAPI, scikit-learn (fallback).

Not veterinary advice. If the pavement fries an egg, it will fry a paw — and it is a bad hour for the human on the other end of the leash.

Prize Categories

Featured

  • Best Use of TabPFN — the energy vote is a TabPFNClassifier on a rest/walk CSV (launchpup/tabpfn_engine.py). This is the launch window, not a sidebar chart.
  • Best Use of Gemma — CAPCOM writes the T-0 pocket card from the poll (Ollama or Groq gemma2*). Gemma narrates; it does not get a veto.

Partner

  • Best Use of Mastra — agent/ CAPCOM Agent plus a t0-brief workflow that turns the poll into the card.

Top comments (0)