This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
Sloth Reads reads your read-it-later pile overnight, so you don't have to.
I bookmark DEV posts all the time. I almost never go back to them. My reading list had posts from 2022 in it, still waiting for a "later" that was never coming.
So I built a sloth to read them for me:
- You save things the way you already do: bookmark a post on DEV (it syncs every night), paste any link, or share it from your phone's share sheet (it installs as an app).
- Overnight, the sloth reads them, slowly and steadily. DigitalOcean Functions wake it every hour from 1 to 5 AM. Each time it reads a few articles with Gemma 4 and writes a short summary, three takeaways, and a verdict: worth reading, skim it, or skip it, with one honest reason written for me, not a generic reader.
- At 6 AM it writes a one-minute morning brief of everything it read.
- The good ones, it reads to me. "Read & listen" opens the article in a clean reader and an ElevenLabs voice reads it out, highlighting each word as it's spoken. I can tap any word to jump there, pick from five voices (switching mid-sentence carries on from the same sentence), and it remembers where I stopped, so tomorrow it picks up from that sentence.
- It counts the minutes I got back. A skipped article saves its whole reading time; a skimmed one saves all but a minute.
Who gets to be lazier? Anyone with a bookmarks folder they feel guilty about.
Demo
Try it: slothreads.souvikbiswas.com (no sign-up). Open the morning brief or any article with "Read & listen".
![]() | ![]() |
Code
sbis04 / sloth-reads
Overnight, an open model reads everything you saved to read later, decides what's worth your time, and briefs you in a minute the next morning. Then it reads the good ones to you, word by word.
Sloth Reads
Save it. Sleep on it.
Overnight, an open model reads everything you saved to read later, decides what's worth your time,
and briefs you in a minute the next morning. Then it reads the good ones to you, word by word
Live: slothreads.souvikbiswas.com · Demo video
What it does
- You save things to read later: bookmark posts on DEV (synced every night), paste any link, or share it from your phone (it installs as an app with a share target).
- Overnight, the sloth reads them. DigitalOcean Functions wake it every hour from 1 to 5 AM; each time it reads a few articles with Gemma 4 and writes
- a 2 to 3 sentence summary and three takeaways,
- a verdict, worth reading, skim it, or skip it, with one honest reason aimed at you,
- an embedding for search.
- At 6 AM it writes your morning brief…
MIT licensed, including the DigitalOcean deploy files.
How I Built It
Gemma 4 does the reading. In production it's gemma-4-31B-it on DigitalOcean's serverless inference; while building, it was gemma4 on Ollama on my Mac, with exactly the same code (one environment variable switches between them). For each article Gemma writes the summary, takeaways and verdict as JSON, and I give it a one-line profile of me, so "worth reading" means worth my time. It correctly skipped four 2022 hackathon announcements still sitting in my list: "The hackathon dates have passed, making the announcement irrelevant for current development."
bge-m3 does the remembering. Every article gets an embedding (the same open model locally and on DigitalOcean), so I can search my pile by meaning: "transcribing audio with flutter" finds my old Decifer post without those exact words.
DigitalOcean runs the night shift:
- Functions with scheduled triggers are the sloth's alarm clock:
30 19-23 * * *(1 to 5 AM where I live) reads a few articles each hour;30 0 * * *(6 AM) writes the brief. The function just pings the app, which does the slow work, so the function stays tiny. - App Platform runs the app from the Container Registry (free tier), on my own domain with HTTPS.
- Serverless inference runs Gemma 4 and bge-m3.
Tiger Data is the memory. TimescaleDB on Tiger Cloud holds:
-
itemswith a pgvector embedding and a full-text index; search is hybrid (vector and keyword results merged with reciprocal rank fusion); -
runsandsavedas hypertables (every overnight run, every minute saved); -
saved_daily, a continuous aggregate behind the "minutes saved per day" chart.
ElevenLabs is the voice, with word timings. The stream/with-timestamps endpoint returns audio and the start time of every character, which is what makes the live highlight possible. I stream it in paragraph-sized pieces, so:
- audio starts in about a second;
- generation stops the moment you stop listening (no paying for a whole article you abandoned);
- every piece is cached with its timings, per voice, so replays are free and still highlight;
- resuming or switching voice starts a new piece at the current sentence, which is cached too.
Visitors share a small daily voice budget, checked before every piece, so a busy day on the live site can't drain my credits. Everyone can always read.
Why Does Open Innovation Matter?
Because the sloth has to read everything, including the stuff I'll never read. Most of a reading pile isn't worth your time; that's the point. So the model reads far more than I ever will. With an open model at DigitalOcean's Gemma 4 price ($0.18 per million input tokens, $0.50 per million output), reading and judging an average article costs about a tenth of a cent. A whole night's pile costs less than a cent. That's what lets it read everything, every night, without me thinking about it.
Because what you read is personal. Your reading list says a lot about you. With open weights, the same Gemma and the same bge-m3 run on my own laptop through Ollama; I built and tested the entire thing that way, offline, for free. Anyone who wants their pile to stay on their machine can run it there.
Because the model is a setting, not a contract. Swapping Gemma for a bigger open model, or for one fine-tuned on my own "read / skip" choices, is an environment variable.
Where closed won: the voice. Open text-to-speech is getting good, but ElevenLabs gives me natural voices and character-level timestamps in one streaming call, and that's the feature people actually notice.
My Agent Session
I built Sloth Reads with Claude Code in a day: from reading 481 Week 3 posts to pick a category, to the overnight pipeline, the word highlight, the voice switching and this video.





