Personal Telegram Assistant with BuJo Memory
This playbook wires a private Telegram bot to mono-agent’s BuJo tiered memory so it captures every conversation turn, consolidates the store automatically, and recalls past notes semantically. It is a complete config-first recipe: pull the local models, init, fill in the Telegram and memory sections, validate, and start.
Who this is for
Section titled “Who this is for”Individual power users who want a private assistant that remembers — a personal Telegram bot scoped to your own chat that builds up durable memory across days rather than starting fresh every conversation.
A Telegram bot that answers via long-polling, captures every turn into BuJo memory with scheduled consolidation, and recalls past notes semantically.
Features used
Section titled “Features used”telegram.long-polling— Telegram channel via getUpdates long-polling (config)channel.final-only-delivery— Telegram delivers the final answer only, not intermediate tokens (auto)memory.bujo— BuJo tier: capture + scheduled consolidation (config)memory.per-turn-capture—writeMode: "capture"records each turn asynchronously (config)memory.bujo-consolidation— in-app lightweight consolidation (config / auto)memory.recall-tool—MemoryRecalldefaults on for every configured memory tier (auto)memory.embeddings-config— embeddings provider for semantic recall (config)
Configuration
Section titled “Configuration”The bujo tier requires both an embeddings provider (for semantic recall) and an app-level
memory.llm (for capture and effective tier selection for scheduled consolidation). Guided
init lets you choose Ollama or LM Studio for embeddings and keeps the capture LLM explicit:
generated configs use agent-host, while this older fully-local recipe deliberately keeps an
explicit Ollama memory.llm. Selecting LM Studio embeddings would not move capture to LM
Studio or create a cross-provider fallback.
Put MONO_AGENT_TELEGRAM_BOT_TOKEN=... in .env; the source config omits the credential.
{ "runtime": { "model": "anthropic:claude-sonnet-4-6" }, "telegram": { "enabled": true, "allowedChatIds": ["123456789"] }, "memory": { "mode": "bujo", "path": "./.mono-agent/memory", "writeMode": "capture", "embeddings": { "provider": "ollama", "model": "nomic-embed-text:v1.5", "endpoint": "http://localhost:11434", "dim": 768 }, "llm": { "provider": "ollama", "model": "qwen3.6:latest", "endpoint": "http://localhost:11434" }, "consolidation": { "enabled": true, "cron": "0 */2 * * *" } }}Keep botToken out of the file by setting MONO_AGENT_TELEGRAM_BOT_TOKEN in
.env instead. The memory LLM provider/model/endpoint can also come from
MONO_AGENT_MEMORY_LLM_PROVIDER, MONO_AGENT_MEMORY_LLM_MODEL, and
MONO_AGENT_MEMORY_LLM_ENDPOINT.
- Pull the local models the memory tier needs:
ollama pull nomic-embed-text:v1.5 && ollama pull qwen3.6:latest. - Scaffold the agent:
mono-agent init --model anthropic:claude-sonnet-4-6 --memory bujo. - In guided init choose Ollama for this recipe’s embeddings, put
MONO_AGENT_TELEGRAM_BOT_TOKENin.env, then editmono-agent.config.json: add thetelegramsection withallowedChatIds, setmemory.writeModetocapture, and keep the explicit Ollamamemory.llmblock shown above. To use LM Studio embeddings instead, choose it in the wizard and leave the capture LLM independently explicit. - Run
mono-agent validateand confirm memory liveness — embeddings and chat model pulled, and the consolidation cadence shown. - Run
mono-agent startand confirm telegram reports running. - Send a fact from an allowed chat (e.g. “My dog is named Pixel”), then in a later turn ask a paraphrased question and confirm recall.
Smoke test
Section titled “Smoke test”Related
Section titled “Related”- Telegram channel
- Delivery and send tools
- Memory consolidation
- Capture and recall
- Embeddings
- Artifacts and traces — where the run JSONL lands
- mono-agent-composer skill — build this agent from one config