Horizon

A personal AI assistant. Designed from research, not assembled from plugins.

Talk to it from Telegram. Edit its behavior — your todos, journal, even what it can do — by editing plain text. One vault, one binary, no database.

What it is

A personal AI assistant you reach over Telegram or the CLI. Its memory — your todos, the people you know, your journal, your knowledge — lives as .md files in a directory you control. Even the assistant's capabilities are markdown files in that same directory.

You don't configure it through a settings screen. You open a text editor, change a file, and the next message picks up the change.

nix run github:purplenoodlesoop/horizon

It's plain markdown — not Obsidian

The "vault" is a directory of .md files with YAML frontmatter. Nothing more. Edit it with anything that touches text — vim, VS Code, Obsidian, your phone's notes app, cat > foo.md. The harness reads files; it doesn't care which editor wrote them. No Obsidian SDK, no plugin, no integration — just files.

Why not just ChatGPT or Gemini?

Horizon isn't a competitor to the model — it uses a model (Kimi K2.6 on CrofAI by default, any OpenAI-compatible endpoint works). It adds what chat apps deliberately don't do:

Why not OpenClaw or Hermes?

OpenClaw and Hermes Agent are the closest neighbors. Horizon is a smaller, different bet:

State = plain markdown, not a database

Hermes uses SQLite. OpenClaw uses an opinionated workspace with injected prompt files. Horizon has neither — capabilities, messages, turns, schedules, audit log are all .md in whatever directory you pointed --vault at.

Tools = bash templates, not MCP or plugins

One YAML entry, hot-reloaded per event. No server lifecycle, no plugin SDK, no marketplace. Adding a tool from your phone takes thirty seconds.

Idle costs nothing

The heartbeat is signal-driven. A pure-Dart filter checks which capabilities are due before any LLM call. Nothing due = zero tokens. Not "a little." Zero.

It doesn't rewrite itself

Hermes autonomously writes and edits its own skills. Horizon's skill-reflector only proposes. Promotion is an explicit /promote <id> from Telegram, or you move the file yourself.

Backed by research

The architectural choices have a paper trail:

Centralized over multi-agent — Tran & Kiela, Single-Agent LLMs Outperform Multi-Agent Systems on Multi-Hop Reasoning Under Equal Thinking Token Budgets. arXiv:2604.02460

Capabilities-as-skills, and why "semantic confusability among similar skills" is the real ceiling — Li, When Single-Agent with Skills Replace Multi-Agent Systems and When They Fail. arXiv:2601.04748

Filesystem-as-manifest over vector RAG — Sun et al., Don't Retrieve, Navigate (Corpus2Skill). arXiv:2604.14572

Signal-driven heartbeat — the HEARTBEAT_OK sentinel and pre-LLM filter are borrowed verbatim from OpenClaw's heartbeat doc; the same wake-gate idea is cross-checked against Hermes Agent's cron/scheduler.py.

Try it

# .env in your current directory
TELEGRAM_TOKEN=...
TELEGRAM_USERNAME=your-handle   # or: alice,bob,carol
LLM_TOKEN=...

nix run github:purplenoodlesoop/horizon

First run bootstraps an empty vault with a default capability bundle. Edit anything in any markdown editor — the next message picks it up. The README covers the rest: schedules, voice memos, attachments, admin commands, security, cost.

View on GitHub Read the docs