DEV Community

Harsh Tuli
Harsh Tuli

Posted on

SlothScroll: I Taught Gemma to Read Instagram So I Never Have To

Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission πŸ¦₯

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady

What I Built

Every morning I opened Instagram "just to catch up", and every morning the feed won. One quick check became another, with ads, reposts and giveaways in between.

SlothScroll is my lazy fix. It's a morning digest of the Instagram pages I follow. Once a day a cloud browser visits those pages for me. Gemma, Google's open-weight model, reads every new post and writes a one-line gist. It also sorts the post into a topic (Sports, Science, Finance, Tech…) and quietly drops ads, reposts and giveaways. What I get is one calm page and one email, grouped by topic, with the 1–3 posts actually worth opening.

I read it in about two minutes with my coffee, then close the tab. I never open Instagram.

Who gets to be lazier? Anyone who follows news, sports or creator pages to stay informed, not to scroll.

Demo

πŸ”— Live: https://slothscroll-web-ngb7.onrender.com

What you'll see in the video:

  • Today's edition: a greeting, the "scrolling saved" number, topic tabs, and Gemma's summary for each topic with its top picks
  • The archive, an RSS feed per page, and dark mode
  • The morning email, the same edition delivered to my inbox

Code

The latest code is on the SlothScroll branch.

How I Built It

How SlothScroll works: Render Cron triggers Browserbase and Stagehand, Gemma writes gists, topics and summaries, MongoDB Atlas stores everything, and the edition is served on Render and emailed through Resend

  • Gemma (gemma-4-26b-a4b-it) is the brain. It runs through an OpenAI-compatible client set by environment variables (AI_BASE_URL, AI_MODEL), so the same code can point at a hosted endpoint or, by changing one variable, a local Ollama. I use it for three jobs:
    1. Per post: a one-line gist, the post's topic, and whether it's an ad, repost or giveaway. All three come back as JSON from a single call. When a caption is only emojis and hashtags, Gemma looks at the image instead.
    2. Per page: a fallback category when I don't set one.
    3. Per topic: a 2–3 line summary plus the posts worth opening.
  • Browserbase + Stagehand give it a real browser. I log in once through Browserbase's live view, and a persisted context keeps that session for daily runs.
  • MongoDB Atlas is the data layer. The cron job writes, the website reads, and a unique index on the post URL means a post is never processed twice.
  • Render runs everything from one render.yaml Blueprint: a cron job for the daily pipeline and a web service for the site. Every secret is sync: false, so none live in the repo.
  • The website is server-rendered HTML on Hono, with no frontend framework. It has light and dark mode, works on mobile, and loads quickly.
  • ElevenLabs narrated the demo video.

Today's edition on the live site: a greeting, minutes of scrolling saved, topic tabs, and Gemma's summary with the posts worth opening

The same edition in the morning email

Slow and steady by design: one run per day, public pages only, visited one at a time with random pauses. A page that fails is noted, and the edition still ships. If Instagram asks for a login, SlothScroll stops and tells me instead of trying to get around it.

What broke (and how I fixed it)

  • Gemma was slow for this job. A demo run took about 4 minutes because the model reasoned before every answer. Setting reasoning_effort: "minimal" brought it down to about 20 seconds, with the same quality for one-line gists.
  • Everything was "News". Topics were assigned per page, so a football page's posts and an IPO story all landed in News. Now Gemma chooses a topic per post in the same call, with no extra requests. On my real feed the same 16 posts went from one topic to five.
  • The browser died mid-run. Browserbase sessions end after 5 minutes by default, and a full run takes longer. Asking for a 30-minute session fixed it.
  • Half-emoji headlines. Shortening captions sometimes cut an emoji in half and left "οΏ½". The page now cleans those characters before showing them.

Why Does Open Innovation Matter?

What you follow says a lot about you. Your reading habits are personal, and an open-weight model means this digest doesn't have to depend on one company's closed API:

  • I choose where it runs. Gemma is reached through a plain OpenAI-compatible endpoint, so switching providers is an environment-variable change. The client is built to switch to a local Ollama the same way, so the posts never have to leave my machine.
  • It's cheap enough to run every day forever. A small open model is plenty for one-line gists and topic tags. It's a daily habit, not a premium feature.
  • It's inspectable and forkable. The prompts, the pipeline and the model are all open, so anyone can adapt SlothScroll to their own pages, language or topics.

The Lazy Payoff

From a real run this week, using a deliberately conservative estimate of 8 seconds per post:

  • 16 posts from my pages became 5 topics and one page, about 2 minutes of scrolling saved that day.
  • 0 times I opened Instagram.

The real win is bigger than the 8-second math. One "quick check" usually turns into twenty minutes. SlothScroll ends the session before it starts, and it scales with the pages you follow: I've since added six more (The Verge, National Geographic, CNBC, Tasty, Netflix and 9GAG).

Prize Categories

  • Best Use of Gemma: Gemma writes the gists, picks the topics, filters ads and summarizes each topic.
  • Best Use of Render: a Blueprint with a cron job for the agent pipeline and a web service for the front end.
  • Best Use of Browserbase: Stagehand drives a real browser with a persisted login, as a repeatable daily workflow.
  • Best Use of MongoDB Atlas: the database behind an app built on an open-weight model.
  • Best Use of ElevenLabs: narration for the demo video.

Top comments (0)