This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
I do not read the pile. I paste it and close the tab.
Lazyyyyy is that pile. Messages, newsletters, half-plans, the lease you have been circling. You drop them in a box. You get two lines back, and each note gets one stamp:
- Pardoned. Nothing breaks if you ignore it.
- Two minutes. Someone, or a date, is actually waiting, so it writes the reply.
- Already seen. You got away with this shape of thing before. It does not make you decide again.
The person who gets to be lazier is anyone whose unread pile has become a second job. The sample pile is six notes. A raccoon video, a playlist with no date, a morning-routine newsletter, a lease that needs a yes or no by Friday, the same lease again, and Priya, who is blocked until you say whether the demo is Thursday or Friday. The raccoon can wait. Priya cannot. The second lease is not a new problem.
Demo
Click Use the sample pile and leave the tab open. The first thing that appears under Already gotten away with is two old pardons: a playlist from Oct 11, and a morning-routine newsletter from Oct 3. Those are planted on purpose. Then the page searches them, and Gemma stamps the six notes. A two-minute stamp includes the reply, with a button to copy it.
The public page calls Gemma through Ollama's hosted API. The vectors come from EmbeddingGemma on a machine I control, because that model is not in Ollama's hosted catalog. If you open a new pile while that machine is asleep, the old pardons are still in Tiger. A fresh stamp needs the tunnel.
Code
Lazyyyyy
You paste the messages, notes, and links you are not going to read. Lazyyyyy stamps each one.
Pardoned. Nothing breaks if you ignore it Two minutes. Someone or a deadline is actually waiting, so it writes the reply Already seen. Tiger remembers you already got away with this, or the same ask showed up twice in the pile.
The only thing you are supposed to read is two lines.
Why this is local
The notes people avoid are the personal ones: a lease, a person waiting, a chat they do not want in someone else's log. Gemma 4 E4B runs through Ollama on the same machine as the paste. EmbeddingGemma turns each note into a vector here too. Nothing in the pile is sent to a model API.
Tiger is the memory, not a log bolted on at the end. Every stamp is stored with its text and its…
github.com/Shashank-blip/Lazyyyyy
MIT. The pile lives in its own Postgres schema, lazyyyyy, so it can share a Tiger service without touching anything else on it.
How I Built It
Gemma does two jobs, and only those. It splits a paste into separate notes. Then, after search, it stamps each note. The prompt forbids a todo list. A date, money, or a named person waiting on a reply cannot be a pardon. A merge has to point at a real earlier note. If a stamp comes back missing, the pile stops and asks you to try again. Quietly pardoning a deadline would be the lazy version of a bug.
Between those two calls, each note is embedded with EmbeddingGemma (768 dimensions) and looked up in Tiger. Keyword rank is BM25 through pg_textsearch. Meaning rank is pgvector cosine distance on a halfvec. The two lists are fused with reciprocal rank fusion, k = 60, and the top three go into the prompt. Exact words like "Friday" and "Priya" survive the keyword side. "Send the playlist whenever" still matches "the playlist when you can" on the vector side.
flowchart LR
paste[Paste] --> split[Gemma splits the notes]
split --> embed[EmbeddingGemma]
embed --> tiger[Tiger hybrid search]
tiger --> stamp[Gemma stamps verdicts]
stamp --> lines[Two lines]
stamp --> memory[Tiger stores the decision]
Vercel hosts the site. It cannot hold Gemma 4 E4B, which is about 6 GB before it even starts. So the deployed app sets OLLAMA_HOST to https://ollama.com and GEMMA_MODEL to gemma4. The same /api/chat call runs against gemma4:e4b on my laptop when OLLAMA_HOST is local. One environment variable swaps them.
Ollama also refuses a public hostname. A tunnel to port 11434 returned 403 until the request's Host header was rewritten to localhost:11434. That is the whole of the deployment trick. The model did not get more clever. The header did.
Why Does Open Innovation Matter?
The notes people avoid are the personal ones. A lease. A person waiting. A chat they do not want in someone else's log.
An open-weight Gemma is what makes the pardon possible without renting a closed chat product for it. On the laptop, gemma4:e4b and EmbeddingGemma run through Ollama, and the pile does not need a model API at all. On the public demo I serve Gemma through Ollama instead, which is still Gemma, still swappable, and still not a closed assistant with a monthly seat. GEMMA_MODEL and OLLAMA_HOST are the whole provider. A bigger local model, or a smaller one, is a config change.
Tiger is the part that gets lazier over time. The stamp is stored with the text and the vector. Next time, hybrid search recalls the old decision and Gemma is not asked to re-litigate it. A closed organizer would call that memory a feature on a higher plan. Here it is a table in a schema I control.
A closed API could sort the same six notes. It would also be the place those notes live, and it would charge me to look at them again tomorrow. The open setup let me keep the judgment, the vectors, and the veto in pieces I can replace.
Prize Categories
Best Use of Gemma. Gemma splits the pile and writes the stamps. Locally that is gemma4:e4b through Ollama. On the deployed site it is gemma4 served by Ollama. EmbeddingGemma, also Gemma, builds the 768-dimension vectors the search uses.
Best Use of Tiger Data. Every note and every stamp is a row in Tiger with a pgvector embedding. Search is hybrid: BM25 keyword rank plus cosine distance, fused with reciprocal rank fusion. The agent reads and writes that database. It does not keep a side file of "memory."
Top comments (0)