{"slug": "peresos-a-sloth-that-eats-one-item-of-my-backlog-a-day-with-gemma-4-on-my-own", "title": "Peresós: a sloth that eats one item of my backlog a day, with Gemma 4 on my own GPU", "summary": "A developer built Peresós, an open-source terminal tool that uses Gemma 4 (12B) running locally via Ollama to process one backlog item per day, drafting replies, decisions, or first steps for the user to accept, discard, defer, or regenerate. The tool accepts text, images, and PDFs, keeps a persistent pile with edit and remove commands, and ships with a tray-based pixel-art desktop window; it installs via a one-line script on Linux, macOS, and Windows and falls back to a non-LLM mode when Ollama is unavailable.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady](https://dev.to/challenges/hacktoberfest-week3-2026-10-19)*\n\nI have a pile. Everyone has one: the message from the landlord I haven't answered, the gym membership I keep meaning to cancel, the friend asking whether Friday still works. None of these takes long. All of them need me to sit down, think for a minute and write something, and that minute is what I keep putting off.\n\n**Peresós** (Catalan for *sloth*, and for *lazy*) is a sloth that lives in my terminal and eats that pile, one item a day.\n\nI feed it whatever I'm avoiding:\n\n```\nperesos feed \"From my landlord: the yearly boiler check is due. The technician needs a morning next week when someone is home. Which day suits you?\"\n```\n\nIt eats files too: `peresos feed bill.jpg`, or right-click a photo or a PDF and **Feed to Peresós**. Gemma looks at photos itself. Ollama takes no PDFs, so Peresós reads them on my computer and gives Gemma the text, or pictures of a scan's first pages.\n\nWhen I change my mind about an item, `peresos pile edit 3` opens it in my editor, and `peresos pile remove 3` takes it off. In the window, a pencil next to each item does the same.\n\nOnce a day I wake it with `peresos`. It takes the oldest item, and Gemma 4, running on my own machine, prepares the **finished version**: the reply written as me, the decision with one sentence on why, the note cleaned up, or for a task, only the first five-minute step. Then it waits, and I do the only part that needs me:\n\n`y` take it: the finished version is saved, and the item leaves the pile for good`n` bin it: deciding not to do something also finishes it`l` later: back to the bottom of the pile`a` another try: Gemma writes a different version, and knows which ones I didn't want\nThe rules are what make it lazy in a good way:\n\n`peresos --lazy` (or And it's yours to dress up: `peresos wear sunglasses coffee` puts things on it, from sunglasses and a cap to a barretina (the red Catalan cap) or a steaming mug on the branch. Each item is a small drawing function, so adding your own is a good first pull request.\n\nIt also has a home. `peresos window` puts it in the tray, like JetBrains Toolbox: a pixel face in the top bar that shows what it's doing, and a small window with a pixel-art jungle, today's bite and a menu for everything the terminal does. The terminal can close, and the desktop tells me when Gemma is done. The leaves follow the season and the sky follows the weather outside, from fog to snow on its branch. Click the sloth and it answers: a pat and it closes its eyes, a tickle and it laughs, a poke while it chews and it says *\"Mmf. Mouth full.\"*\n\nAn arrow in the title bar folds the window up to the sloth alone, so it can hang there while I work. Folded, the title bar says when a bite waits.\n\nGetting it is one line, on Linux, macOS or Windows:\n\n```\ncurl -fsSL https://raw.githubusercontent.com/deeptelar/peresos/main/install.sh | sh\n```\n\n(`irm .../install.ps1 | iex` in PowerShell.) It brings its own Java, then `peresos doctor` checks Ollama and Gemma and says what's missing. Where Ollama can't be installed, `peresos gemma off` still brings one item a day, as I wrote it.\n\nWho gets to be lazier: anyone whose backlog is made of small things that each need a minute of thinking. The sloth does the minute. You do the yes.\n\nThat's a real session on Gemma 4 (12B) in Ollama, with the waiting cut short. First I tell it one fact about me, which it uses from then on: I work from home on Tuesdays and Thursdays. It turned the landlord's question into \"Tuesday morning next week works well for me as I'll be at home\", without me typing a day. The second `peresos` on the same day gets \"It already ate today. One item a day is plenty.\"\n\nA sloth that eats one item of your backlog a day. You feed it what you keep putting off, and\n**Gemma 4, on your own machine**, prepares the finished version. You only say yes or no.\n\n*Peresós* is Catalan for sloth, and for lazy.\n\n```\n# Linux and macOS (Apple silicon)\ncurl -fsSL https://raw.githubusercontent.com/deeptelar/peresos/main/install.sh | sh\n# Windows, in PowerShell\nirm https://raw.githubusercontent.com/deeptelar/peresos/main/install.ps1 | iex\n```\n\nIt brings its own Java, the `peresos` command, a menu entry and **Feed to Peresós** in the\nright-click menu of photos and PDFs. You also need [Ollama](https://ollama.com/download):\n\n```\nperesos doctor --fix    # checks everything and pulls Gemma 4 (gemma4:12b, about 8 GB)\n```\n\n`peresos update` and `peresos uninstall` do what they say. To build it yourself, see\n[CONTRIBUTING.md](https://github.com/deeptelar/peresos/CONTRIBUTING.md).\n\n```\nperesos about \"I work from home on Tuesdays and Thursdays\"   # facts\n```\n\n…\nAbout 5,500 lines of Kotlin, plus 2,400 lines of tests. The tests run the whole workflow against a scripted model, so they need no GPU. On every release, GitHub Actions builds the installers for Linux, macOS and Windows, then installs, updates and uninstalls each one on a fresh machine. A soak test clicks the window's buttons at random through months of simulated days, while a terminal feeds and wakes the same sloth and Ollama stops halfway. It checks the pile, the checkpoint and the screen after every click, and it found four bugs in the window before I did.\n\n**The model: Gemma 4, in Ollama, on an 8 GB GPU** (an RTX 3070). I use `gemma4:12b` through Ollama's OpenAI-compatible API. Gemma 4 thinks before it answers by default, and that turned out to be the most important knob:\n\n`reasoning_effort: \"none\"`. In my test, a three-word answer took 37 seconds with thinking and 4 without.\n**The workflow: a small graph.** Peresós is built on [Telar](https://github.com/deeptelar/telar), an open-source Kotlin library for AI workflows that I maintain. To be clear about what's new: Telar existed before this challenge, and Peresós is a new app that uses it from Maven Central like any other library. One thing I did add to Telar this week, because the sloth needed it: images and PDFs in a model call (`Attachment`, released in 0.1.0-alpha14). Feeding Gemma a photo is one more argument:\n\n```\nmodel.ask<Bite>(chewPrompt(sloth, plate.text, about()), system = CHEF, attachments = plate.attachments)\n```\n\nA wake is five nodes:\n\n```\nSTART then wake\nconditionalEdge(wake, targets = setOf(pick, chew, NodeRef.END)) { sloth ->\n    when {\n        sloth.rest != Rest.NONE -> NodeRef.END // already ate today, or nothing to eat\n        sloth.lazy -> pick                     // a lazy wake: Gemma picks the easiest item first\n        else -> chew                           // a normal wake eats the oldest\n    }\n}\npick then chew\nchew then swallow\nconditionalEdge(swallow, targets = setOf(chew, diary)) { sloth -> if (sloth.bite == null) chew else diary } // \"another try\" loops back\ndiary then NodeRef.END\n```\n\nThree things in there carry the whole idea:\n\n**The sloth is one data class, saved after every step.** When it last ate, what it's chewing, its meals, its diary: all in a `@Serializable` `Sloth`, written to a checkpoint file. Its memory from one day to the next is simply the checkpoint of the last run.\n\n**It waits for me by stopping, not by blocking.** The graph pauses before `swallow`. The process ends, the terminal can close, the computer can sleep. The next `peresos` finds the paused run and resumes it with my answer, without asking Gemma again. For a sloth, a workflow that can wait a day for a human is not an edge case, it's the main feature.\n\n**Gemma answers with a typed value, not text I have to parse.**\n\n```\n   @Serializable\n   data class Bite(\n       @Description(\"REPLY for a message that waits for an answer, DECISION for a choice to make, NOTE for something to keep, TASK for something to do\")\n       val kind: Kind,\n       @Description(\"A title of at most six words\") val title: String,\n       @Description(\"The finished thing, ready to use as it is ...\") val finished: String,\n   )\n\n   val bite = model.ask<Bite>(chewPrompt(sloth, about()), system = CHEF)\n```\n\n`ask` gives Gemma the JSON schema of the class and asks again, with the error, if an answer doesn't fit.\n\nOne small detail I like: `swallow` changes the pile and writes the finished file inside an `effect`, which is saved with the step. If the computer dies halfway through, the sloth never eats the same item twice.\n\nThe window runs the same graph through Telar's `GraphSession`: the run is a `StateFlow` of snapshots (running, waiting for my answer, done, stopped) that Compose draws, and the buttons call `start` and `resume`. The terminal and the window share one checkpoint, so they're two views of the same sloth.\n\nThree lessons from the first runs:\n\n`peresos about`: a few facts it uses every time, kept in a local file.` peresos gemma off` came from.\nLook at what's on the pile: a message from a friend in Catalan, my landlord's email, how often I actually went to the gym, a photo of a bill. Together with the facts I gave it about myself, that's a small diary of my life. I would not paste it into a hosted API every day for the convenience of not writing a reply.\n\nWith an open-weight model, I don't have to. Gemma 4 runs on my own GPU, and the pile, the facts, the diary and the checkpoints are plain files in `~/.peresos`. Nothing leaves my machine, and there's no bill. (Only two things go out, and only when I ask: my town to Open-Meteo for the weather, and `peresos update` to GitHub. Never the pile.) That also means a slow model is fine: the sloth can think as long as it likes, and nobody is counting tokens.\n\nThe open pieces all the way down (Gemma, Ollama, an open-source workflow library) are why this could be a toy I trust with real messages, instead of a demo I'd only feed fake ones.\n\nAnd a personal opinion, since this is what the theme is about for me: open-source models like Gemma are going to redefine how we think about IoT and small devices, especially self-contained intelligence in offline environments, where privacy and security are key. Devices and programs with these capabilities, that we can interact with, will help people in their daily lives. This is the integration of AI into society that will benefit everyone.", "url": "https://wpnews.pro/news/peresos-a-sloth-that-eats-one-item-of-my-backlog-a-day-with-gemma-4-on-my-own", "canonical_source": "https://dev.to/cuento3yllevo2/peresos-a-sloth-that-eats-one-item-of-my-backlog-a-day-with-gemma-4-on-my-own-gpu-j6a", "published_at": "2026-10-25 14:42:04+00:00", "updated_at": "2026-10-25 14:45:01.319930+00:00", "lang": "en", "topics": ["ai-tools", "large-language-models", "generative-ai", "ai-products", "developer-tools"], "entities": ["Peresós", "Gemma 4", "Ollama", "Hacktoberfest", "GitHub"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/peresos-a-sloth-that-eats-one-item-of-my-backlog-a-day-with-gemma-4-on-my-own", "markdown": "https://wpnews.pro/news/peresos-a-sloth-that-eats-one-item-of-my-backlog-a-day-with-gemma-4-on-my-own.md", "text": "https://wpnews.pro/news/peresos-a-sloth-that-eats-one-item-of-my-backlog-a-day-with-gemma-4-on-my-own.txt", "jsonld": "https://wpnews.pro/news/peresos-a-sloth-that-eats-one-item-of-my-backlog-a-day-with-gemma-4-on-my-own.jsonld"}}