DEV Community

Techfrontiers
Techfrontiers

Posted on

Night Butler: You Sleep, Your Second Brain Works the Night Shift 🦥🌙

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)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. 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.
  2. 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.
  3. 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
Enter fullscreen mode Exit fullscreen mode

Repo: https://github.com/Techfrontiers/night-butler
Licence: MIT — steal it, your mornings will thank you.

Top comments (0)