Meet Otto

The Ops4Life personal AI assistant. It lives in Telegram, answers questions, writes code, and runs the Ops4Life self-hosted stack.

  • 💬 Telegram-native
  • 🧠 Claude + Gemini
  • 🤖 Works proactively
  • ✅ Human-in-the-loop
  • 🇻🇳 English & Vietnamese

What it does

One chat for talking, coding, and ops.

No dashboard or terminal needed. Message Otto from your phone and it does the work, instead of telling you how.

Chat

Quick answers, explanations, and brainstorming, in English or Vietnamese. Short by default, detailed when you ask.

Code

Reads, changes, and tests the Ops4Life infrastructure repo: Compose configs, scripts, apps, and docs. It checks a knowledge graph of the codebase before it goes looking through files.

Operate

Checks status and logs, restarts services, and ships deployments on the server, all from a chat message. It also warns you before your AI usage limits run out.

How it works

The right model for each message.

Every message gets sorted before anything runs. Coding goes to Claude, and ops and conversation go to Gemini, both on their own subscriptions.

  • Each chat keeps its own thread for each model, so follow-ups continue where they left off.
  • Only one job runs per chat at a time. /stop cancels it.
  • Long replies get split into Telegram-sized messages, and code blocks stay intact.

On its own

It doesn't wait to be asked.

Otto also works in the background and reports back in Telegram.

Daily review

Every day it reviews open pull requests and security scans, sends a digest, and opens small fix PRs for what it can safely fix.

CI auto-fix

When a dependency-update or Otto PR fails its checks, Otto reads the failure, pushes a fix to the PR, and tells you.

Alert triage

When monitoring fires an alert, Otto investigates and posts a diagnosis, so you start with a cause instead of a symptom.

Safety

Nothing destructive runs without a ✅.

  • Confirmation for risky commands Anything that deletes, force-pushes, or tears down pauses and asks in Telegram. No answer means no.
  • Allowlisted users only Otto is private. Messages from anyone else are ignored.
  • Unattended runs stay locked down Background work can't push to main or change settings. Risky commands are refused automatically, and every fix lands as a pull request for review.
  • No workarounds If a command is denied, the model is told not to reach the same result some other way.

The guard catches mistakes. It isn't a sandbox. It exists so a slip gets a second look from a human before it runs.

clean up the old preview containers
This will run:
docker rm -f preview-a preview-b
Go ahead?
✅ Allow❌ Deny
✅
Done. Removed 2 containers. 🐶

Personality

Friendly, brief, honest.

A few principles Otto follows.

  1. Solve by doingIt runs the task instead of describing what it would do.
  2. Short by defaultIt goes into depth only when you ask for it.
  3. No fake confidenceIt says what it knows and flags what it doesn't.
  4. Ask, don't guessA good question beats a wrong guess.
  5. Your time comes firstTime is the scarcest resource, and trust is the most valuable.
  6. Speaks your languageIn Vietnamese it calls you “sếp” and itself “em”.