You sleep. Your second brain works the night shift.
Every morning I used to re-read yesterday's chat history to remember what my
AI assistant had learned, what was still pending, and what I was supposed to
do today. Night Butler does that while I sleep — and hands me one
phone-sized brief at 06:30.
The lazy payoff
- ~15 minutes saved every morning. One screen instead of scrolling through thousands of memory chunks and long threads.
- Zero new accounts. It reuses the Telegram bot I already have and the box I already run.
- Private by construction. The memory it reads is mine. The retrieval layer runs locally, so that memory never goes to a cloud embeddings API.
What the brief looks like
☀️ Morning brief
🌙 What happened last night
- ...
📌 What's still pending
- ...
☀️ What to do today
- ...
🗑️ Safe to forget
- ... (suggestions only — it never deletes anything by itself)
How it works
06:30 ── cron fires ──▶ butler.py
│
├─ 1. read last 24h of agent memory
│ (local bge-m3 vector index via Ollama)
├─ 2. ask an LLM for a Thai morning brief
│ (sydear-photon via my self-hosted
│ gateway — a closed model, MiniMax
│ M3.1-Flash. Honest caveat: this
│ summarizer is NOT open-weight, so
│ this entry risks the "open pieces
│ at its core" rule, and a brief
│ may fail while the token pool is
│ throttled. The open parts that
│ ARE load-bearing: local bge-m3
│ retrieval — memory never leaves
│ the box.)
├─ 3. save brief-YYYY-MM-DD.md
└─ 4. send to Telegram
06:30 ── ☀️ brief on your phone
If the LLM is unreachable, it degrades gracefully: it still writes a brief
noting the outage and the memory count instead of crashing.
Why open innovation matters for this build
This project only makes sense because the AI pieces are open:
- Your memory is personal data. A cloud embeddings API would see everything your assistant ever learned about you. Local bge-m3 means none of it ever leaves the box — there is no trust decision to make.
- Free forever. A nightly summarizer is exactly the kind of tiny automation a per-token API would make silly to pay for. Open weights make the lazy option the free option: set it up once, nap forever.
- Swappable, not load-bearing. Don't like the brief style? Change the prompt. Want a different embedding model? One line. No vendor to renegotiate with.
Setup
# stdlib-only Python 3, an OpenAI-compatible endpoint, and an agent DB
# (without the DB, the brief just says memory is quiet)
sudo mkdir -p /opt/night-butler/briefs
cp butler.py /opt/night-butler/
# nightly cron, 06:30 Asia/Bangkok:
# 30 6 * * * /usr/bin/python3 /opt/night-butler/butler.py
Repo: https://github.com/Techfrontiers/night-butler
Licence: MIT — steal it, your mornings will thank you.
Top comments (0)