This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
Group chats pile up overnight. Reading 200 messages to find the two that matter ("can you send me the pricing doc by Wednesday?") is work nobody wants to do.
Sloth Digest does that reading for me. I drop my exported WhatsApp chats into a folder, and every morning a local model has already written one Markdown file with:
- Needs you: only the tasks assigned to me, with their deadlines.
- Per chat: a short summary and the key dates.
Pizza orders, coffee tips and football talk are ignored. I set it up once with Windows Task Scheduler, and after that I do nothing. I just open the file.
It is for anyone who wants to stay on top of busy group chats without scrolling through them, and who doesn't want to upload those chats to someone else's server to do it.
Demo
All the chats in the video are invented samples. Here is what the digest looks like for the sample chat:
# Morning digest, 2026-10-23
## Needs you
- Send the updated pricing doc, due: Wednesday at noon. Asked by Maya in chat-team
- Review slides, due: Tomorrow afternoon. Asked by Priya in chat-team
## chat-team
The team needs to finalize the client demo, with Sam responsible for sending the updated
pricing document by Wednesday at noon... The demo time has been moved to Thursday at 4:30 PM.
- Client Demo: Thursday at 4:30 PM
Code
nora-programadora
/
sloth-digest
Local AI that reads your exported chats overnight and leaves a short morning digest. Runs offline with Ollama. + Gemma
sloth-digest π¦₯
A local AI that reads your exported group chats while you sleep and leaves a short morning digest. No cloud, no API key, no cost per message.
Built for the Hacktoberfest Open-Source AI Challenge, Week 3: Slow and Steady.
- π Read the post on DEV: POST
- π₯ Demo video: VIDEO DEMO
The problem
Group chats pile up overnight. Reading 200 messages to find the two that matter ("can you send me the pricing doc by Wednesday?") is work nobody wants to do.
What it does
- You drop exported WhatsApp chats (
.txt) intoinbox/. - At a scheduled time (for example 6 am), a local model reads them.
- You wake up to one Markdown file with:
- Needs you: only the tasks assigned to you, with deadlines.
- Per chat: a two-sentence summary and the key dates.
Small talk (pizza, coffee, football) is ignored.
Example output (from theβ¦
How I Built It
Stack: Gemma 3 (4B, open-weight) running through Ollama, with Node.js and TypeScript. The model runs locally, and the scheduled run uses Windows Task Scheduler calling a script inside WSL.
WhatsApp exports (.txt) β parser β Gemma 3 via Ollama (JSON Schema output)
β code-side logic (assignee filter, dates) β daily Markdown digest
-
Parser. It turns the export into clean messages: it skips system lines, keeps multi-line messages together and drops
<Media omitted>. -
Structured output. I call Ollama's
/api/chatwith a JSON Schema in theformatfield,temperature: 0and an explicitnum_ctx, so the model always returns valid, predictable JSON. -
The model extracts, the code decides. The model lists every task in the chat with an
assignee. Plain code then keeps only the ones for me and works out which message each deadline came from. -
Scheduling. A small shell script runs the digest, and a Windows scheduled task calls it through
wsl.exeevery morning. Ollama runs on Windows and the project lives in WSL, so I used WSL's mirrored networking mode to let them talk overlocalhost.
What went wrong, and what I changed
I tested on a synthetic chat with known answers: two tasks for me, one meeting time that changes, and lots of small talk. A 4B model made real mistakes, and fixing them taught me the most important lesson of the project.
| Run | Change | What went wrong |
|---|---|---|
| 1 | Baseline prompt | A task Maya had promised to do was listed as mine; "tomorrow" left unresolved; the detail "include monthly and annual plans" got lost |
| 2 | Asked the model to resolve dates | Dates became absolute, but the model invented times (4:00 PM, 9:00 AM) and picked the wrong day for "tomorrow" |
| 3 | Model extracts all tasks with an assignee, code filters |
Assignment fixed, but dates still inconsistent |
| 4 | Model copies deadlines verbatim, no date arithmetic | All 5 tasks correct, no invented times. Still missing "monthly and annual" |
The lesson: with a small model, don't ask for judgment or arithmetic that code can do. "Is this task for me?" and "what day is tomorrow?" are easy to verify in code and unreliable in a 4B model. Extraction stays with the model, and the rest moves to code.
Limitations
- Details spread across messages can be lost (the "monthly and annual" requirement never made it into the task).
- Long chats are not chunked yet, so very long ones may be cut off by the context window.
- Only WhatsApp
.txtexports in one locale format for now. - Tested on one synthetic chat, not on a large or varied set.
Why Does Open Innovation Matter?
- My chats stay on my machine. A digest of private group chats is exactly the kind of data I don't want to send to a server I don't control.
- No cost per message. I can process every chat every day without watching a bill.
-
Swapping models is one variable.
OLLAMA_MODEL=gemma3:12b npm run digest -- inboxchanges the model without touching the code. When a 4B model fails at something, I can try another open model instead of waiting for a provider. - I could see and fix the failures. Because I control the prompt, the schema, the model and the code around it, I could trace each mistake and decide whether it belonged to the prompt or to code.
I did not compare it against a closed API, so I'm not claiming it is more accurate than one. What I can say is that this design is possible without my chats leaving my laptop.
The Lazy Payoff
- Speed: about 20 seconds for the 32-message sample chat on my laptop (Ryzen AI 9 HX 370, 63 GB RAM, integrated GPU only).
- Effort: - Effort: for the 32-message sample chat, reading it by hand took me about 5 min and reading the digest about 30 seconds. The sample is small, so the saving is modest; the point is that a morning with 10 busy chats becomes one file. I haven't measured that with real chats.
- Zero effort after setup: one scheduled task, then nothing to do.
Top comments (0)