DEV Community

Cover image for Break Buddy: a private, offline "what should I do right now?" web app
Onkar Raskar
Onkar Raskar

Posted on AI-assisted

Break Buddy: a private, offline "what should I do right now?" web app

My entry for the Hacktoberfest 2026 Weekend Challenge: Build for a Friend

The problem

My friends and I were talking about breaks. Someone takes a 10 minute break and it turns into an hour. Some of us end up scrolling mindlessly, some play games, some just sit there doing nothing.

The break itself was never the problem. After studying, your brain is tired, and it tries to weigh every option it has. Scrolling wins because it is the only option that needs no decision.

We didn't want to quit our phones. We wanted something that would just tell us what to do, in that exact moment, so we didn't have to decide.

I built it for my friend Aryan.

What I built

Break Buddy is a small web app that runs on his own computer. He taps four things: how much time he has, how he feels, where he is, and who is around. It gives back one suggestion and one 10-second first step. No list of ten ideas.

Break Buddy suggesting a quick walk

Break Buddy UI 2

Break Buddy UI 3

Demo

A short walkthrough: setting the options, getting a suggestion, and finishing it.

Code: View the project on GitHub

To run it yourself you need Ollama and Python:

ollama pull qwen2.5:3b
pip install -r requirements.txt
streamlit run app.py
Enter fullscreen mode Exit fullscreen mode

My first version was wrong in obvious ways

The first version asked a small local model to pick an activity from a list. It told people to play football when they were alone. Aryan and I looked at that and agreed: if a suggestion doesn't fit your real situation, you ignore it and open Instagram.

How it works now: code decides what's possible, the model only words it

taps (time, mood, place, who's around)
  -> Python removes every activity that is impossible right now
  -> Python picks one (weighted by mood, goals, variety, history)
  -> a local model writes 2 short sentences + a 10-second first step
  -> the reply is checked; if it fails, a plain fallback is shown
Enter fullscreen mode Exit fullscreen mode

Every activity declares where, when, with whom and for how long it makes sense:

mk("ball", "Get a quick game going with whoever is around: football, badminton, anything",
   "move", 30, 180, moods=["restless", "bored"], places=HOME,
   company=("friends",), hours=(6, 21), intense=True, tags=["exercise"])
Enter fullscreen mode Exit fullscreen mode

A model can forget a rule. Python can't. Football needs friends nearby, outdoors, and daylight hours. A walk to a saved place only appears if the round trip plus a few minutes fits the break. Nothing loud late at night, no calls in a silent library, no videos when the internet is off, no heavy thinking right after studying on a short break.

Proof: what the model is allowed to choose from

I ran the real rule engine on fixed situations (sample profile):

Situation Options left What shows up / what is blocked
Library, 11 pm, tired, 10 min, just studied, alone 7 Stretch, corridor walk, breathing, eyes rest, music, a short writing task. No calls, no sports, no videos.
Room, 7 pm, bored, 1 hour, friends nearby 17 Card game, chess with someone, a walk with a friend, football, a walk to the park or the cafe.
Room, stressed, 10 min, internet off, just studied 22 Nothing that needs the internet: no videos, no LeetCode, no podcasts, no anime.
Outside, 5 min, restless, alone, 10 am 22 Only things that fit 5 minutes. No park walk, no episode, no movie.
Outside, 1 hour, restless, alone, 4 pm 7 Walk, workout, read, call a friend. No football, no cards, no chess game, because he's alone.
Room, 3 pm, tired, 10 min, just studied 18 Stretch, breathing, daylight, music, a short video. No puzzles, no LeetCode, no Japanese words.

The fifth row is the football problem from the first version, now fixed in code.

Why open-source AI mattered here

  • Privacy. The app knows his mood, his routine and who he hangs out with. With Ollama running the model locally, none of that leaves his computer. There is no account and no server.
  • It costs nothing to run. No API key, no per-request bill.
  • It works offline. The core app needs no internet. When the internet is off, the app simply stops suggesting anything that needs it.
  • I could swap models in one line. The model name is a single constant in the code.
  • I could see and control the behavior. Because the rules live in my code and the model is replaceable, I could trace every odd suggestion and fix it.

Speed on a normal PC (CPU only, no GPU)

I timed the same request from clicking the button to seeing the result.

Model 1st request (includes loading) 2nd 3rd
qwen2.5:7b 47.5 s 20 s 10 s
qwen2.5:3b 24.9 s 10 s 10 s

Both ran 100% on CPU. Once warm, the two ended up close. The big difference is the first request: 3B halves the cold start. His first complaint was that the app felt slow, so I moved to 3B and made the app load the model in the background when it opens.

Why there is no live link

I tried to host it, and I'm glad I did, because the attempt taught me something.

  • Streamlit Community Cloud runs the interface fine, but there is no Ollama on that server, so the app couldn't reach a model. I changed the app so that when no model is found, it still works and shows the plain, rule-based suggestion with a short note. That version shows the rules, but not the friendly wording.
  • Hosting the model myself meant a paid server with at least 4 GB of RAM, because the 3B model alone is about 2 GB, while the cheapest plan I looked at has 512 MB. It also meant adding a card.
  • The bigger reason: a hosted version would send his mood, routine and friends' names to a server. That is the exact thing this project is meant to avoid.

So the real app is local on purpose, and I'm sharing a video and the code instead of a live link.

What Aryan said

The biggest win was the strict, short phrasing. I usually ignore long-winded productivity advice, but getting a simple two-sentence prompt and a 10-second "first step" made it completely frictionless to just drop my phone and knock out 15 squats or clear my desk. It also really nailed the context of living with roommates. Around 7 PM, when my friends were hanging around, I swapped the company setting to "With friends". Instead of telling me to meditate or read alone, it instantly suggested starting a card game or walking over to the cafe for a break. [...] Getting a prompt to do exactly one easy LeetCode problem or watch a single short robotics video kept me from spiraling into a massive YouTube black hole when I only had 15 minutes between study blocks.

His complaints were just as useful:

  1. Too many taps. He had to set everything again every time. The app now remembers his last settings.
  2. It was too heavy when he was tired. It suggested writing five Japanese words when he had set his mood to "tired". Now, when the mood is tired, anything that needs effort is blocked and only gentle options remain.

What the usage log shows

The app logs what it showed and what he did with it. For the day of testing and real use, the log has 59 events: 39 suggestions shown, 8 skipped, 2 marked "Can't now", 5 started, and 5 finished.

I won't call that a completion rate. The finished ones were tapped a few seconds after starting, so they show he pressed the button, not that he did the activity. What is more telling is what he rejected: the Japanese word activities were skipped or refused four times, more than any other activity. That matches his "too heavy" complaint.

Where it still goes wrong

  • The model sometimes invents details. In one test, the activity was "read a few pages of a book", and the 3B model wrote that he should pick up "that book on chess strategies" and flip to page 10. He never said he owns that book. My name check only catches invented capitalized names, so it missed this.
  • It sometimes mixes his interests awkwardly. One suggestion was to voice-message a friend "for some lo-fi music chat". Fine, but odd.
  • A small model on CPU is still slowish. A 10-second wait is a real cost when the point is avoiding friction.

All three come from using a small local model. The rules in Python hold, but the wording still needs closer checks.

What's next

  • Stricter checks on the model's wording, so it can't add things that aren't in the activity.
  • A weekly summary that balances moving, creating, connecting, learning and resting.
  • A phone-friendly version that still runs locally.

How I built it

I built this with AI-assisted coding (Claude) for the code, and ran, tested and edited it myself. The app itself uses only open-source pieces: Ollama, a Qwen2.5 model, Python and Streamlit.

If you build something for a friend, ask them what annoys them first. Then watch them use it.

Prize Categories

  • Build for a Friend

Top comments (0)