DEV Community

Cover image for While your build runs, walk
Aditya
Aditya Subscriber

Posted on

While your build runs, walk

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

A GitHub Actions run already knows how long it is. You start it, and then you sit there, watching a bar that has already done the counting.

Build Break takes that length and puts it on the phone. You paste a public repository, press start, and the screen becomes a clock that stays awake. You leave. If the street is worth keeping, you take one photo. When the run finishes, or when you decide you are done, a short journal entry is waiting.

The first screen says the whole thing in one breath. While your build runs, walk. Snap what you see. An open model writes the entry when you get back.

The screen is a glance. The walk is the rest of it.

Paste owner/repo, or a github.com URL, and the walk follows the newest run that is still going. The browser calls the public GitHub API from the phone, with no token. The countdown is the median of the last ten successful runs, minus the time already spent, and it never goes below zero. A repository with no successful history gets a fifteen-minute guess, and the page says so. "No recent successful runs, so this timer is a fifteen minute guess. The walk still ends when the run finishes." It checks that run every thirty seconds.

If the guess runs out and the build is still going, the headline changes. "Go walk," becomes "Still out." Under it: the build has not finished.

If nothing is in progress, the walk becomes a demo and one line says why. "No run in progress on that repo. This is a demo walk." A rate limit says "GitHub rate limit. This is a demo walk." A malformed URL stays on the start screen: "That does not look like a public GitHub repo." A repository GitHub cannot find stays an error too: "That repository is not public, or it does not exist." I would rather be told than be sent outside on a timer that was never real.

Leave the field blank and it is a demo from the first step, anywhere from ten to sixty minutes. That is the walk in the pictures below. The end is the start plus those minutes, so a reload keeps counting.

Demo

It is live at build-break.onrender.com. Open it on a phone. On a desktop the same page sits in a narrow column, because this is a thing you carry.

Build Break on a phone. The line under the title says: while your build runs, walk.

Press start with the field empty. The phone says go, and then a number. This one is 32:59, marked demo, with the screen kept awake.

The walk screen. Go walk, back in 32:59, demo. Capture, or end the walk.

Capture is there if you want a picture. End walk is there if you come back early. In this demo there is no model key, so the note under the photo is written on the machine, one sentence from a small local set:

A stand of trees over pavement, and the note: the way ahead is quiet.

The way ahead is quiet: pavement, trunks, and a pale sky.

That sentence is a stand-in. It lets you see the shape of a note before Gemma is pointed at a real street. It is not a record of a walk I took.

When the demo clock hits zero, the journal writes the entry in the same voice. You can also end the walk yourself and get the entry then. This one is stamped 11 Oct 2026, 12:45 PM IST, one minute, demo.

The journal. This week: 1 walk, 1 min outside while CI ran.

I went out Sunday afternoon, 12:45 PM, and stayed for a minute. The way ahead is quiet: pavement, trunks, and a pale sky. It was a short loop, and a good one.

The line I keep looking at is the one above the entry. This week: one walk, one minute outside while CI ran.

Point the app at Gemma and those stand-in sentences are replaced by whatever was actually in the photo, the weather if you allowed it, and how the run ended. On the laptop that model is Gemma 3 4B, because it can see. On Ollama Cloud it is Gemma 4 31B. The prompts stay the same.

On a wide screen, Build Break stays a phone-width column in the middle of the black.

Code

The license is MIT. The app is Next.js and TypeScript. Walks, notes, and the journal live in one SQLite file. Photos sit on disk next to it, under DATA_DIR.

GitHub is called from the browser. The model is one chat-completions client. The three screens are a start page, a walk, and a journal.

How I Built It

The open piece is the model, and the model is one HTTP call.

Build Break speaks the OpenAI chat completions API. Three environment variables aim it, and nothing else is hardcoded: LLM_BASE_URL, LLM_MODEL, and LLM_API_KEY. With no key, you get the local stand-in in the screenshots above. LLM_PROVIDER=mock keeps that path even when a key is sitting in the environment.

For a real note I point it at Ollama on the laptop:

LLM_PROVIDER=ollama
LLM_BASE_URL=http://localhost:11434/v1
LLM_MODEL=gemma3:4b
LLM_API_KEY=ollama
Enter fullscreen mode Exit fullscreen mode

The key has to be non-empty, or the app assumes you have not chosen a model. Ollama ignores the value.

The photo needs a model that can see. Gemma 3 at 270M and at 1B is text only, so those builds cannot read a picture. Gemma 3 4B can. It is asked for one short, warm sentence about what someone on a walk would notice: plants, animals, sky, the life of the street. No guessing past what is in the frame. The image is sent before the text, which is the order Gemma prefers.

The same model writes the journal. Three to five sentences, first person, drawn from the time of day, the minutes outside, the notes, and the last few entries. A fact it was not given is left out. Weather appears only if you allowed location. A pattern gets a sentence only when a word actually shows up again. Plain, warm, no hashtags.

Gemma 3, including the 4B, is released by Google under the Gemma Terms of Use (last modified 1 April 2026). The appendix on that page lists Gemma 3. It is Google's own license, with a prohibited-use policy. It is not the Apache License, and it is not an OSI open-source license. I use it because it can see a photo on a machine I already have, and that limit belongs in the post.

When the laptop cannot hold the model, the same client talks to Ollama Cloud at https://ollama.com/v1. The model id is gemma4:31b, taken from Ollama's own list. The :cloud alias is for a signed-in local Ollama, and it is the wrong string to send to the cloud API. Gemma 4 31B takes text and images and returns text, so one model still does both jobs. Gemma 4 is under the Apache License 2.0.

Changing the model is one line.

LLM_MODEL=gemma3:12b
Enter fullscreen mode Exit fullscreen mode

Point LLM_BASE_URL at another host and the prompts stay put.

GitHub is called from the browser, so the request uses the phone's address. Unauthenticated calls are about sixty an hour. That is why a 403 becomes a demo walk with a sentence attached. Photos are resized in the browser to about 1024 pixels on the long edge, saved as JPEG, and only then uploaded to our own API. They are not sent to a model until an endpoint is configured. On localhost, that endpoint is Ollama on the same machine.

The journal clock is the browser's time zone. That is why the demo stamp reads IST. The page asks for location once: add the weather from where you are. A no is remembered. Coordinates are not stored.

Why Does Open Innovation Matter?

The picture is of the street you are standing on. I wanted it read on the machine, with no account and no fee for each photo.

Gemma 3 4B through local Ollama does that. If the sentence is too thin, I change LLM_MODEL. The prompts stay. A closed vision API would have been a shorter afternoon, and then every walk would have been a metered call, with the photo leaving the phone for someone else's account. A walk every time a build starts is a bad match for a meter.

Location is a choice for the same reason. Allow it, and the server asks Open-Meteo for the current conditions. There is no weather key. The sentence comes back in a fixed shape, like "28°C and clear." The latitude and longitude are not written into the journal. Refuse the prompt, and the entry never brings the weather up. Open-Meteo does see the coordinates when you allow them. A model provider does not receive the GPS. The database does not keep a record of where you were.

Gemma 4 is there for the day the laptop is not enough. Because it is Apache 2.0, I can host it, or let Ollama Cloud host it, on the same three variables. The Render blueprint points the host at gemma4:31b on Ollama Cloud, so the phone in your pocket does not have to be the computer that runs the weights.

Prize Categories

Best Use of Gemma. The one-line note and the journal entry are the model's work. On the laptop that is Gemma 3 4B, under the Gemma Terms of Use, because it can see. On Ollama Cloud it is Gemma 4 31B, under Apache 2.0. Either way the app is a thin timer around an open-weight model, and the model is one line to change.

Best Use of Render. Build Break is a Node server with a SQLite file and a folder of photos. That wants a disk that survives a restart. render.yaml is the blueprint: the web service on the starter plan, DATA_DIR at /var/data, a 1 GB disk, and the model variables in the host environment. A persistent disk needs a paid instance. A free instance forgets the journal on restart. The app is live at build-break.onrender.com.

Top comments (0)