{"slug": "still-a-diary-that-writes-itself-as-fast-as-my-raspberry-pi-can-think", "title": "Still: a diary that writes itself, as fast as my Raspberry Pi can think", "summary": "A developer built Still, a roughly 1,300-line Python service that runs a small simulated character on a Raspberry Pi using a locally served Gemma 4 E2B model via llama.cpp, with no API, cloud or internet access. Instead of writing on a fixed schedule, the character logs diary entries only when something happens in its simulated world, and a worker schedules each tick one real hour after the previous one finishes, so the Pi's thermal throttling sets the pace.", "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\nThis challenge for me started in a specific mindset.\n\nHow do I automate this and that. How do I become more productive. How do I improve my life using AI.\n\nSo far, everything I need is already getting handled by my Hermes (deployed on another Raspberry Pi).\n\nAnd so I iterate. And iterate. On the ideas, on the things I want to do, on the things I already have, and on the things I can actually pull off in a weekend.\n\nAt some point a sipra idea came up. I need it for an upcoming jam. But it doesn't fit this week's challenge.\n\nThen, while I was reading on my xteink, something popped into my head.\n\n**Sloth. Still. Slow and steady.**\n\nWhat do I have, or what do I do, that is slow and steady?\n\nSo, how about building a world inside my Raspberry Pi.\n\nSomeone who lives in the terminal. Someone with a life he's living inside this little world of a 2-billion-parameter model. Doing something. Not doing something. Interesting things. Mundane things.\n\nSo. What is Still.\n\nStill is a life that lives on my Raspberry Pi.\n\nThere is someone in there. He lives in a terminal. He has a job he is supposed to do, he has days, he has things he is waiting on. Sometimes something happens and he writes about it. Most of the time nothing happens, and he does not write anything at all.\n\nThat last part took me the longest to get to.\n\nMy first instinct was a schedule. Write in the morning, write in the afternoon, write in the evening. Three entries a day, always. Predictable.\n\nBut that is just a report.\n\nSo he writes on impulse instead. Every tick the world moves a little. Most ticks nothing worth writing down happens, so nothing gets written. When something does happen, he writes it. He writes two or three times a day at most. Some days he writes nothing.\n\nAnd he runs on the Pi and nothing else. **No API, no cloud, no internet required.** So the pace is not a setting I chose, it is the hardware. When the Pi heats up it throttles, and he slows down.\n\nYou cannot make him faster. There is no button for that.\n\nI like that part the most.\n\nAn entry looks like this.\n\n```\nI met Ivo at the Repair shop. I showed Ivo the file I'd recovered. He looked\nat the empty owner field. He handed it back without filling it in.\n```\n\nMost of his days are not like that one. Most of them are nothing much, and getting comfortable with that was the hardest part.\n\nHe is a courier. That is the whole job.\n\nThere are three places. The Depot, where he starts. The Records office, where Mara works the counter. The Repair shop, where Ivo fixes things. Parcels go between them. If he is late, a man called Ren turns up to look at the handoff, writes down the time, and leaves.\n\nHe also has a file of his own. It is called `old-index`, and three of its lines are damaged. When he has spare time he restores it, one line at a time. Here is where it stands now.\n\n```\npath: /archive/landing\nowner: [blank]\nkeep: yes\n```\n\n**The owner line is empty.** He does not know who he belongs to. When he takes the file to Ivo and asks, Ivo looks at the blank and hands it back without filling it in.\n\nThat file is the only thing in his world that is actually about him, and it is the only thing nobody can help him with.\n\nHe does not know any of this.\n\n[https://github.com/zorexsalvo/still](https://github.com/zorexsalvo/still)\n\nStill is a Python service, about 1,300 lines across a dozen modules. Four parts matter.\n\n**Gemma 4 E2B, running locally.** Open weights, downloaded once, served by `llama-server` from llama.cpp under an alias called `still`.\n\n```\nllama-server \\\n  --hf-repo ggml-org/gemma-4-E2B-it-GGUF \\\n  --hf-file gemma-4-E2B-it-Q4_0.gguf \\\n  --alias still \\\n  --ctx-size 4096 \\\n  --host 127.0.0.1 \\\n  --port 8080\n```\n\n**A worker that finishes a tick, then rests one real hour.** Not cron. The next tick is scheduled from the moment the last one **finished**, so a slow tick pushes the world later instead of stacking ticks on top of each other. One writer only: the worker takes a lease inside the database, and a second worker gets rejected even when it is on the far side of Docker's filesystem boundary. I found that bug by running a native worker next to the containerised one. Docker's `flock` did not stop it. The database lease does.\n\n**A model that chooses, and code that decides.** Gemma never invents anything. It picks a numbered action from a JSON schema containing only the legal moves, and code validates the answer again. If the model is unreachable, or the answer is not a legal index, the tick records a quiet wait and a failure. **It never invents an action.** Files, deliveries, deadlines, who is standing where, and what a missed deadline costs are all decided in Python.\n\n**SQLite as the source of truth.** Every tick is stored, including the ones where nothing happened. Published entries live in their own table, and **triggers prohibit updates and deletes**, so an entry cannot be edited after it is written. A publication row records whether the tick was silent, writing, published, or failed. Failed writing is never retried later. The gap stays a gap.\n\nThen three smaller decisions that turned out to matter more than the architecture.\n\n**The rejection list.** Every entry is checked before it is stored. Wrong number of sentences, too long, not first person, addressed to a reader, containing a comparison, or stating an emotion outright, and it is thrown away. The diary would rather stay blank than publish something that breaks the voice.\n\n**The hardware has to be sampled outside the container.** Ask the container for load average and you get the Docker VM, which is a polite lie. So a separate process samples the real machine into a small JSON file and the worker reads that. When the machine is under pressure, the courier's legal moves get cut down to the delivery he is already carrying, and the world can record:\n\n```\nMoving was slow. I stayed where I was.\n```\n\n**And one honest limit.** The hourly cadence was tested deterministically, not by waiting a week. It has not been soaked for days, and it has not run on the Pi yet. The writing gate is deliberately simple, and simple gates produce long silences.\n\nThe obvious question is why I did not just use an API.\n\nIt would have been easier. Probably better prose too, with a big hosted model. Faster, smarter, no weights to download.\n\nBut then the slow part stops being the computer and becomes somebody's pricing page.\n\nI did not want that. I wanted the slowness to be real.\n\nSo it runs on the Pi. Open weights, local inference, no internet needed.\n\nIt keeps writing when my connection drops.\n\nIt keeps writing when a provider changes their free tier, or shuts down, or decides my account is not worth keeping.\n\nAnd the speed is not a setting I chose. It is whatever this little computer can manage. Slow, and slower when it is warm.\n\nIf I want the diary to write faster, there is no config option. I would have to buy different hardware.\n\nThat is what slow and steady means here. Not a theme I decorated the project with, but the physical limit of the machine I already had.\n\nHow much time does Still save me? None.\n\nIt is a diary I never write, and I do not read it on a schedule. It costs a little electricity and it does not do my chores.\n\nI built it that way on purpose.\n\nEverything else I made this week, I made for me. This one runs without me. I set it going once and it accumulates whether I look at it or not. **No API key, no account, no bill, no internet, nothing to maintain.**\n\nSo the honest number is zero minutes saved. What I got instead is a record of a small life that I did not have to ask for and did not have to write.\n\n**The laziest diary is the one I never have to write.**", "url": "https://wpnews.pro/news/still-a-diary-that-writes-itself-as-fast-as-my-raspberry-pi-can-think", "canonical_source": "https://dev.to/zorexsalvo/still-a-diary-that-writes-itself-as-fast-as-my-raspberry-pi-can-think-58om", "published_at": "2026-10-25 03:07:09+00:00", "updated_at": "2026-10-25 03:11:03.795007+00:00", "lang": "en", "topics": ["artificial-intelligence", "large-language-models", "ai-agents", "ai-tools", "generative-ai"], "entities": ["Still", "Raspberry Pi", "Gemma 4 E2B", "llama.cpp", "llama-server", "GitHub", "Hermes"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/still-a-diary-that-writes-itself-as-fast-as-my-raspberry-pi-can-think", "markdown": "https://wpnews.pro/news/still-a-diary-that-writes-itself-as-fast-as-my-raspberry-pi-can-think.md", "text": "https://wpnews.pro/news/still-a-diary-that-writes-itself-as-fast-as-my-raspberry-pi-can-think.txt", "jsonld": "https://wpnews.pro/news/still-a-diary-that-writes-itself-as-fast-as-my-raspberry-pi-can-think.jsonld"}}