This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
My laptop is not a GPU box, so "run a model locally" was never the interesting constraint. The interesting one was: can the lazy part be real code, and can the model be swapped without loosening it?
Sloth Queue is a small web app for the pile you keep orbiting. A group chat. An inbox. The note that has been rewritten four times. You paste it. You get a two-line morning note, at most three things worth doing, drafts for the ones that are just a reply, and a list of what got held back.
https://cursor.com/codebase/jerrie-kingdomdev/fest-finder
What effort it saves
The chore is triage. Not the work itself. The work is usually two messages and one errand, buried under newsletters, reaction GIFs, and tasks that belong to someone else. I reread that kind of pile because deciding feels harder than doing. The app does the deciding.
The samples are the demo:
- A Sunday chat with fourteen messages. Two of them are asks. The reel, the song, and "react if you see this" are dropped. Ice can wait, because someone already offered.
- An inbox where a landlord needs a yes or no before the electrician arrives, a boss will accept two lines, and a mom wants a call about a dog. The permission slip is due Friday, so it waits until Sunday evening. The lamp sale does not get a click.
- A meeting note that tried to assign you a flaky test with no owner, a 14-page PDF, and two actual asks. The PDF needs a sitting. The asks are a spare minute.
That last one is the payoff. A helpful model will turn a meeting into homework. The cap will not.
How it is built
The agent is a Mastra agent, sloth-agent. Mastra is the open-source harness: instructions, a tool, and a model you can point somewhere else. The tool is apply-sloth-cap. The model is told to be a normal helpful assistant and to mark anything slightly useful as "today". Then the tool, which is just TypeScript, keeps three.
](...)
The rules are dull on purpose:
- Today holds three items at most.
- Energy of 4 or 5 means it needs a sitting. It waits.
- Newsletters, promo, and other people's tasks are noise.
- A person who is waiting, with a real deadline, is the one thing the sloth will pull back onto the list if a draft tried to drop them.
- Something you already deferred stays deferred unless someone is blocked again.
After the model returns, the server runs the same function again. If the model skips the tool, or sweetens the buckets on the way out, the cap still happens. The screen shows the difference: "The model wanted 8 things today. The cap kept 3."
The model is not on the laptop. The default preset is openai/gpt-oss-20b on Groq, which is open weights behind a fast API. There is a larger gpt-oss preset, an OpenRouter preset for Gemma 3 12B (Google's open-weight model, for the Gemma category), and a box for any OpenAI-compatible host. Swapping the model is a settings change. Swapping the model does not change the cap.
With no key, the sample piles still run. An eager hand-labeled pass stands in for the model, and the same function edits it. A pasted pile with no key uses a smaller local sorter, and the screen says so. I would rather show a boring honest result than pretend a heuristic is Gemma.
Why open, here
A closed chat window will help you have a productive day. That is the failure. You cannot see the rule, you cannot cap it, and you cannot point it at a different open model when the first one is slow or expensive or gone.
Three open pieces are doing the work:
- Mastra, which is the agent. The instructions and the tool are in the repo.
- The cap, which is a function with tests. It does not care which model proposed the list.
- The model id, which is a string. gpt-oss, Gemma, Qwen, whatever speaks chat completions. The weights stay on someone else's machine, which is the whole point on a low-spec laptop, and you can change them without rewriting the chore.
Personal piles stay in the request you choose to send. Demo mode never leaves the machine. There is no account and no database. History is six morning notes in the browser.
The lazy payoff is the morning note. Two lines. Three things. Then you can stop reading the pile.
Try it
npm install
npm run dev
Open http://127.0.0.1:3847, pick "The inbox" or "The meeting", and hand it over. Add a Groq or OpenRouter key in Model if you want the open-weight model to read a pile of your own.

Top comments (0)