What I Built
I built Loafer, a local-first CLI that reads chat and email exports while I sleep and turns them into a short morning digest.
Instead of reopening several apps and scanning hundreds of messages, I point Loafer at a folder and get:
- a two-line summary,
- a checklist of promises and requested actions,
- a per-thread breakdown,
- source file and line references for the checklist items,
- and a
nagcommand for promises that keep appearing across days.
It also has an ask command for questions over the local corpus and a grocery command that turns a fridge photo into a conservative shopping list.
The person who gets to be lazier is the person who has to remember everything from every group chat. Loafer does the first pass. The human only checks the few lines that matter.
Demo
Repository: https://github.com/Aryan1092raj/Sloth
The project runs from a terminal with no web account or hosted service:
python3 -m loafer digest --backend heuristic --input examples --out ~/loafer/digests
python3 -m loafer todo
python3 -m loafer ask "what did we promise about the invoice?"
python3 -m loafer nag
The fastest demo uses the included examples/ folder and the standard-library fallback, so it works even when no model server is running. For the full demo, I run the same commands with Ollama and an open-weight model.
Code
The complete source is in the repository:
https://github.com/Aryan1092raj/Sloth
The project is intentionally small and dependency-free. The main flow lives in:
-
loafer/collect.pyfor safe local file collection, -
loafer/digest.pyfor chunking, analysis, provenance, and Markdown rendering, -
loafer/llm.pyfor Ollama and llama.cpp backends, -
loafer/fallback.pyfor extractive no-model operation, -
loafer/watch.pyfor incremental overnight processing, -
loafer/ask.pyfor local BM25 retrieval, -
loafer/todo.pyandloafer/history.pyfor the follow-up loop.
The test suite runs with Python's standard library. The current suite has 49 passing tests.
How I Built It
Loafer uses open-weight models through local Ollama or an OpenAI-compatible llama.cpp server. The model is a replaceable component, not a hosted dependency.
The pipeline is:
- Scan a folder for text exports while skipping hidden directories, virtual environments, generated files, and the output folder.
- Split long conversations into overlapping chunks so the end of a thread does not disappear silently.
- Ask the local model for structured JSON containing a summary, actions, topics, and a rough content type.
- Fall back to an extractive summarizer and cue-based action detector when no model is installed or a model returns invalid JSON.
- Merge the results into a Markdown digest that can be read, searched, copied into another tool, or checked off.
- Match each extracted action back to the strongest source line when possible, producing references such as
team-chat.txt:L9.
The overnight watch command remembers file size and modification time, uses inotify on Linux when available, and falls back to polling elsewhere. It only reprocesses new or changed files.
The project also has a privacy guard: Loafer refuses to send data to a non-local host unless the user explicitly opts in with LOAFER_ALLOW_REMOTE=1.
Why Does Open Innovation Matter?
The input is private by default: messages with friends, client emails, deadlines, and household photos. A cloud assistant would require sending that material to someone else's server and would usually require an account, an API key, or a paid quota.
Loafer keeps the model on the user's machine. After the model is installed, the workflow can run offline, costs nothing per digest, and leaves the exports on disk. Users can swap models, serve their own fine-tuned weights, inspect the prompts, or use the pure-Python fallback when they do not want to run a model at all.
Open innovation also makes the failure mode visible. If the model produces a bad action, the digest points back to the source file and line instead of pretending the summary is authoritative.
My Agent Session
The Lazy Payoff
The main payoff is not that Loafer writes a nicer summary. It removes the need to reread every thread.
In the repository's documented benchmark, 20 exports took about 11.8 seconds with qwen3:0.6b on an RTX 4050. The no-model heuristic path took about 0.07 seconds. The user then opens one Markdown file and sees the small set of actions worth checking.
The new line-level references make that loop faster again: when a task looks questionable, I can jump straight to the sentence that produced it instead of searching the whole export.
Prize Categories
I am entering the main Slow and Steady challenge. I am not claiming a partner category unless I add and document that partner's technology in the final demo.
Disclosure
I used AI assistance while building and editing this project, then reviewed the code, tests, and claims before preparing this submission.
Top comments (0)