Message Yourself OS
Turn everyday messages into useful workflows.
A private command centre inside WhatsApp's Message yourself chat.
- Role
- Solo, end to end
- When
- Built May to September 2026
- Status
- Personal tool
- Sheet
5 months
May to September 2026, solo
58
test files across 88 source files
50
chats at most reach the AI in a run, ranked first in plain code
40,000
token budget a run; the rest wait for the next one
Overview
My WhatsApp is where things slip: a promise made in a group, a friend waiting three days for a reply.
Message Yourself OS turns WhatsApp's “Message yourself” chat into a private command centre. I type !today there and get who's waiting on me, what I said I'd do, and what to reply next. Nobody else sees any of it.
What I built
WhatsApp client
- A Node.js service on whatsapp-web.js with a saved linked device session, so it restarts without scanning the QR code again.
- Commands such as !today, !waiting, !promises, !people and !sync, private in the self chat and shared in any other chat.
Attention engine
- A local index of every chat, ranked in plain code with my preferences: important, watched, ignored, and a policy per group.
- Only a short list of candidates goes to the AI, and !attention shows why each one was picked.
AI layer
- Groq (gpt-oss-120b) by default, with OpenAI as fallback and Gemini still supported, behind a request budget and provider routing.
Memory
- Commitments and open loops saved locally with the source quote, date and confidence.
- A history for each person that !sync builds from their chat.
Operations
- Separate readiness checks for startup, sign in, WhatsApp sync and the chat index, with a health endpoint.
- A scheduled daily digest.
Quality
- 58 test files on Vitest, golden tests for the AI reply parsers, a local evaluation runner with metrics, and a gate of seven reviewed days before the ranked brief becomes the default.
How it works
- All chatsindexed locally
- Rankingplain code
- Short candidate list
- ModelGroq, OpenAI as fallback
- Evidencequote, date, confidence
- !today
Every chat is indexed locally. Plain code ranks the chats and picks a short candidate list. Only those candidates go to the model, whose findings are stored with their quotes as evidence. !today puts verified findings in Focus and lists the rest for review.
Key decisions
Private by default
Commands typed in my own self chat answer only me. The same commands work inside other chats, where everyone sees the reply, so the self chat is where the real work happens.
In Fig. 1:!today
The model sees a little, not everything
The bot indexes every chat locally, but only a short, ranked list of candidates goes to the AI. Ranking happens in plain code first, so every pick can be explained.
In Fig. 1:RankingShort candidate listModel
Every claim comes with a quote
When the bot says I promised something, it keeps the message that shows it: the quote, the date and the model's own confidence label. Missing evidence is flagged, and !correct records why an extraction was wrong.
In Fig. 1:Evidence
Report quota limits honestly
If the provider's quota runs out, the result is marked “not scored” and the evidence is kept for the next run.
In Fig. 1:ModelEvidence
Prove it's useful with real days
Tests keep it safe. Usefulness has to be shown on real days: the ranked, evidence backed !today stays behind a switch until it passes a gate of seven reviewed days with no errors and no misses.
In Fig. 1:!today
Where it is
My personal command centre; I run it when I need it.
What I learned
The hard part isn't adding commands; it's trust. A bot that says “you promised this” has to be right. I started with commands like summaries, tasks and a sarcastic recap, and next time I'd start with evidence.
Stack
Runtime
AI
Testing