This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
Whatchalant is a personal WhatsApp assistant that runs entirely on my laptop. It links to my account as a normal WhatsApp linked device. After that, it does the WhatsApp chores I keep putting off:
- 🦥 Catch me up. Messages pile up in my group chats while I'm away. One click, and a local model gives me one line per chat, with the chats that need me first. It can also send that digest to my own "Message yourself" chat every morning.
- 🔔 Voice alerts when I'm @mentioned. If someone tags me in a group while I'm heads-down, my laptop says it out loud. That uses ElevenLabs, or the built-in system voice offline.
- 💬 Replies drafted by my own model, sent only when I approve them. For chats I allow (or @mentions), the local model drafts a reply in my tone. It waits on a dashboard until I click Send.
- 🎙 Dictation. I speak a message; local Whisper turns it into a draft.
- ⏰ Scheduler. "Good morning" every weekday at 9, or a one-off reminder for tonight.
Everything runs from a localhost dashboard, so you don't need to learn any commands.
Who gets to be lazier: anyone in too many group chats. That means students, family admins, and people who mute everything and then miss the one message that mattered.
Demo
A sample "Catch me up" result, from three busy chats:
College Friends: Trek on Saturday, need headcount by tonight → needs you
Mom: Aunty's function date is Nov 2nd, call me when free → needs you
Project Team: Demo moved to Monday 11am
Code
Whatchalant
A local-first personal WhatsApp assistant that runs on your own computer as a linked device. It uses Baileys for WhatsApp, local LLMs to draft replies, and Whisper for speech-to-text.
- Mention alerts: when someone @tags you in a group, the alert is read aloud. It uses ElevenLabs if you set an API key, otherwise your computer's built-in voice.
-
AI replies with anti-ban pacing: replies come from Ollama, LM Studio, or your own model (any OpenAI-compatible URL, or a
.gguffile that the app launches withllama-server). Messages are sent one at a time, with a reading pause, "typing…", and a cooldown. - Draft & Approve: replies wait for your OK in the terminal, on the localhost dashboard, or in your "Message yourself" chat.
-
Voice: incoming voice notes are transcribed, and
:dictateturns your mic recording into a draft. Both use local Whisper. - Scheduler: recurring messages on a cron schedule, plus…
How I Built It
- WhatsApp: Baileys, an open-source TypeScript implementation of the WhatsApp Web multi-device protocol.
-
Models: any local model. Ollama, LM Studio, any OpenAI-compatible endpoint (I use my own harnesses), or just a folder of
.gguffiles. For a.gguffile, the app startsllama-serverfrom llama.cpp itself. I run Gemma 4 E4B (Q4_K_M) on my laptop GPU: it loads in about 8 seconds, drafts a reply in about 0.5 seconds, and summarises a batch of chats in about 1 second. - Speech-to-text: OpenAI's open-source Whisper, running locally, for voice notes and dictation.
-
Not getting banned: WhatsApp flags bots that answer instantly or in bulk, so every outgoing message goes through a single queue, one at a time. Before sending, it does three things:
- It "reads" for 1.5 s + 20 ms per character + 1–3 s of random jitter.
- It shows typing… for 2–6 s, depending on reply length.
- After sending, it cools down for 1.5–3 s.
On top of that:
- It only replies to chats I allow, or to @mentions.
- It stops after 4 replies per chat in 10 minutes, or 20 per hour in total.
- It goes quiet in any chat where I typed myself recently.
- Self-diagnosing: a health check tests the model server, Whisper, ffmpeg and WhatsApp at startup, and every error says how to fix it.
Something I hit along the way: WhatsApp now addresses chats by anonymous "LID" IDs (…@lid), not phone numbers. On Baileys 6.7, every message in my own self-chat arrived as undecryptable ("No session record"). Upgrading to Baileys 7, which handles LID sessions, fixed it without re-linking.
AI disclosure: I built this with an AI coding assistant (Claude Code). It wrote much of the code from my spec, and I tested and directed it. The finished app itself uses only open models running locally.
Why Does Open Innovation Matter?
My WhatsApp messages are the most private data I have: family, friends, work. A closed "AI inbox" API would mean uploading all of it to someone else's server. With open-weight models, not a single message leaves my laptop:
- The summaries, the drafted replies and the voice transcription all run locally.
- The AI parts need no internet at all; only WhatsApp itself does.
- It costs nothing per message, so it can summarise every chat every morning without a token bill.
Open weights also let me swap models freely. The same app runs a small model on a weak laptop or a 9B model on my GPU, and I can point it at my own fine-tuned harness with one URL. Changing the model, the prompt or the reply rules is a config change, not a feature request to a vendor.
Prize Categories
- Best Use of Gemma: the whole assistant runs on Gemma 4 E4B, locally through llama.cpp.
Top comments (0)