openhelm 🤠
AI-powered bot designed to work on different types of tasks. You talk to it via Telegram. It can act on the host system: reading files, browsing GitHub repos, and more, but limited by a configurable permission and profile system.
For sake of transparency: This project was 98% done with AI. Use at your own responsibility!
Table of Contents
- How it works
- Installation
- Quick start
- Commands
- Configuration
- Available tools
- Docker
- Building from source
How it works
Telegram user → Bot → Daemon (Unix socket) → LLM + Tools
↑
CLI client
The daemon runs as a background service. Users pair their Telegram account with the bot; admins approve requests and assign a profile. Every tool call is audit-logged.
Installation
Install the latest release from crates.io:
Or install directly from the GitHub repository to get the latest unreleased changes:
Quick start
1. Run the interactive setup wizard — creates ~/openhelm.toml:
Or run non-interactively:
2. Install as a systemd user service:
3. Start the daemon:
Commands
Daemon
Logs & audit
Chat (local REPL)
Start a local chat session against a profile without Telegram:
In-session commands: /reset clears history, exit or quit ends the session.
User & pairing management
When a Telegram user sends /start to the bot, they appear in the pending pair list:
Profiles
Configuration
The config file lives at ~/openhelm.toml. Use the provided example as a starting point:
Example config
[]
= "https://openrouter.ai/api/v1"
= "sk-..."
= "gpt-4o"
= 30
[]
= "123:ABC..."
[]
= "You are a coding assistant."
[]
= true
[]
= ["/home/alice/projects"]
= ["/home/alice/projects"]
= ["/home/alice/projects"]
= []
[]
= "ghp_..."
[]
# max_body_bytes = 15728640 # optional, defaults to 15 MiB
[]
= "~/.local/share/openhelm/audit.log"
Available tools
All filesystem paths are allowlist-controlled. Any access outside the configured paths is denied and logged.
| Tool | Skill | Description |
|---|---|---|
fs_read |
built-in | Read a file |
fs_write |
built-in | Write a file |
fs_list |
built-in | List a directory |
fs_mkdir |
built-in | Create a directory |
github_get_repo |
github | Fetch repository metadata |
github_list_issues |
github | List issues |
github_get_issue |
github | Get issue details and comments |
github_list_prs |
github | List pull requests |
github_get_pr |
github | Get PR diff, description, and comments |
github_get_file |
github | Read a file from a repository |
http_get |
http | Perform an HTTP GET request |
http_post |
http | Perform an HTTP POST request with an optional JSON body |
http_put |
http | Perform an HTTP PUT request with an optional JSON body |
http_patch |
http | Perform an HTTP PATCH request with an optional JSON body |
http_delete |
http | Perform an HTTP DELETE request |
http_head |
http | Perform an HTTP HEAD request (returns status and headers only) |
Docker
Run openhelm in a container instead of building locally.
Build the image
Run with Docker Compose (recommended)
- Copy and edit the config:
# Fill in your API keys, bot token, and profiles
- Start the daemon:
The docker-compose.yml bind-mounts ./openhelm.toml into the container and persists audit logs in a named volume.
- Manage the running instance:
Run with Docker directly
The config file is expected at /root/openhelm.toml inside the container.
Building from source
Requires Rust stable. The workspace contains four crates:
| Crate | Description |
|---|---|
openhelm |
Main binary |
openhelm-sdk |
Plugin API |
openhelm-github |
GitHub skill |
openhelm-http |
HTTP skill |