This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
SlothGuard is an ambient local agent that quietly watches your screen and only speaks up when you appear stuck.
Most AI tools force you to break focus: select text, switch windows, write a prompt, and wait.
SlothGuard flips that. It runs in the background, takes low-resolution screenshots every few seconds, and detects when the screen has barely changed for a while (you’re staring at the same error, the same docs, or the same failing test). When that happens, it asks a local open-weight model for one short, calm tip and speaks it through local text-to-speech. Then it goes silent again.
It exists so developers (especially the ones coding late at night) can stay a little lazier. You don’t have to notice you’re stuck. You don’t have to decide to ask for help. The agent notices the stagnation and offers a gentle nudge only when it might actually be useful.
https://github.com/tan-byte/slothguard
SlothGuard was built entirely around local, open-source AI. Rather than utilizing a closed API, every component was picked with privacy, offline capability, and customizability in mind.
| Component | Tool(s) Used | Purpose |
|---|---|---|
| Screen Capture | mss +Pillow |
Fast, cross-platform, and low-resolution captures to minimize CPU usage. |
| Stagnation Detection | scikit-image (SSIM) |
Compares perceptual similarity between grayscale, downscaled frames to detect when the screen has stayed nearly identical. |
| Local Inference | Ollama withmoondream (preferred) orgemma2:2b |
Generates a short, context-aware tip based off of the "stuck" signal. Vision capable models can utilize a cropped screenshot for better context. |
| Text-to-Speech | Piper TTS (en_US-lessac-medium ) |
Completely offline, neural TTS to audibly deliver the tip. |
| On-Screen Overlay | tkinter ,ctypes , and Windows MessageBox fallbacks |
A non-blocking, always-on-top popup to display the tip alongside audio for better visibility. |
| Orchestration | Python 3.10+ ,PyYAML ,NumPy ,Requests |
Config , timing, cooldowns, and API calls to the local Ollama instance. |
config.yaml, allowing for easy tuning between "real use" and "demo" modes.
The open-weight model isn't an optional add on for this project, it's the core. Without it, SlothGuard would only be a timer playing a static message. With it, a generic "stuck" signal is transformed into a contextually relevant nudge.
A closed API version of SlothGuard would require sending screenshots containing my actual code, stack traces, terminal output, and debugging sessions to a third-party server. For something designed to run all day in the background, this was a non-negotiable privacy concern.
Utilizing open-weight models locally allows for the following benefits:
This level of autonomy, privacy, and flexibility is only possible due to the open-weight ecosystem and the tools that allow for local inference.
The value of SlothGuard isn't measured by saving minutes on a singular task, it's measured by removing the miniscule bits of friction that add up over the course of a day.
Traditionally, to get help when stuck, you have to go through a loop of: noticing you're stuck, deciding it's worth breaking flow for, switching contexts to ask an AI, formulating a prompt, and returning to your work.
SlothGuard cuts all of these steps out. By the time your brain registers that you've been circling the same bug for far too long, there's already a gentle, local tip being spoken to you. It's not about automating the solution, it's about automating the moment of asking for help. Less self-monitoring, less activation energy, and just a tiny nudge exactly when it's needed. That is the lazy payoff.