{"id":48908231,"url":"https://github.com/escoto/rustifymyclaw","last_synced_at":"2026-04-16T22:01:06.074Z","repository":{"id":349792670,"uuid":"1202319178","full_name":"Escoto/RustifyMyClaw","owner":"Escoto","description":"Run Claude Code, Codex, and Gemini CLI from Telegram, WhatsApp, or Slack - single Rust binary, no server required.","archived":false,"fork":false,"pushed_at":"2026-04-15T14:14:34.000Z","size":3498,"stargazers_count":3,"open_issues_count":6,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-15T14:35:51.497Z","etag":null,"topics":["ai-agents","claude-code","codex","developer-tools","gemini-cli","rust","self-hosted","slack-bot","telegram-bot","whatsapp-bot"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Escoto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-05T22:15:03.000Z","updated_at":"2026-04-15T12:53:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"409afa97-2db9-4b9d-9aa1-1ad4f60299fa","html_url":"https://github.com/Escoto/RustifyMyClaw","commit_stats":null,"previous_names":["escoto/rustifymyclaw"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Escoto/RustifyMyClaw","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Escoto%2FRustifyMyClaw","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Escoto%2FRustifyMyClaw/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Escoto%2FRustifyMyClaw/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Escoto%2FRustifyMyClaw/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Escoto","download_url":"https://codeload.github.com/Escoto/RustifyMyClaw/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Escoto%2FRustifyMyClaw/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31905895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T18:22:33.417Z","status":"ssl_error","status_checked_at":"2026-04-16T18:21:47.142Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","claude-code","codex","developer-tools","gemini-cli","rust","self-hosted","slack-bot","telegram-bot","whatsapp-bot"],"created_at":"2026-04-16T22:00:31.509Z","updated_at":"2026-04-16T22:01:06.068Z","avatar_url":"https://github.com/Escoto.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RustifyMyClaw\n\n[![CI](https://github.com/Escoto/RustifyMyClaw/actions/workflows/ci.yml/badge.svg)](https://github.com/Escoto/RustifyMyClaw/actions/workflows/ci.yml)\n[![GitHub release](https://img.shields.io/github/v/release/Escoto/RustifyMyClaw)](https://github.com/Escoto/RustifyMyClaw/releases/latest)\n[![Downloads](https://img.shields.io/github/downloads/Escoto/RustifyMyClaw/total)](https://github.com/Escoto/RustifyMyClaw/releases)\n[![crates.io](https://img.shields.io/crates/v/rustifymyclaw)](https://crates.io/crates/rustifymyclaw)\n[![Chocolatey](https://img.shields.io/chocolatey/v/rustifymyclaw)](https://community.chocolatey.org/packages/rustifymyclaw)\n[![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)\n[![Made with Rust](https://img.shields.io/badge/Made%20with-Rust-orange?logo=rust)](https://www.rust-lang.org)\n\n**A secure, self-hosted proxy that connects Telegram, WhatsApp, and Slack to your local AI CLI tools — Claude Code, Codex, and Gemini CLI.**\n\nNo database. No cloud. No accounts. A single Rust binary and one YAML config file, running entirely on your machine.\n\n```\n  Telegram ─┐                                              ┌─ Claude Code\n  WhatsApp ─┼──► SecurityGate ► Router ► Executor (local) ─┼─ Codex\n  Slack    ─┘       │                                      └─ Gemini CLI\n                    │\n               Formatter ► back to chat\n```\n\n\u003e Your prompt goes in. The model's response comes out. Your CLI tool owns its configuration and governs the agent. **RustifyMyClaw never touches your commands or runs commands on your behalf**. Nothing is stored, modified, or logged.\n\n## Why RustifyMyClaw\n\nAI CLI tools are powerful but locked to your terminal. Existing bridges require cloud hosting, databases, and trusting a third party with your prompts.\n\nRustifyMyClaw runs locally. Messages in -\u003e directly to your Agent, responses out -\u003e directly back to you - zero tinkering with your requests. One binary, one YAML file, and your Agent's own config.\n\n### Your prompts stay yours\n\n- **No database.** The only state is `is_active: bool` — whether the conversation has an ongoing session (so the backend knows to pass `--continue` or not). Restart = clean slate.\n- **No prompt modification.** Messages pass to the CLI as-is.\n- **No agent override.** Your CLI tool's own config governs what the agent can do. RustifyMyClaw doesn't touch it.\n- **No cloud. No telemetry.** Talks to your messaging platform's API. Everything else is local.\n\n## How it works\n\n1. Message arrives on your channel (Telegram, WhatsApp, or Slack).\n2. **SecurityGate** checks the sender against your allowlist. Unauthorized = silent drop.\n3. **Router** parses commands (`/new`, `/use`, `/status`, `/help`). Everything else is a prompt.\n4. **Executor** spawns your CLI tool locally. Prompt passed through unmodified.\n5. **Formatter** chunks the output respecting code blocks and UTF-8 boundaries, sends it back.\n\n## Demos\n\n- [Demo: Install via Cargo](docs/demos/cargo/README.md) — install, configure, and run.\n\n## Features\n\n- Single binary, no dependencies.\n- Env var interpolation for all secrets, zero hardcoded tokens.\n- Per-workspace process timeout to prevent runaway sessions.\n- 140+ tests, zero clippy warnings, trait-based extensibility.\n- Block-aware output chunking/formatting - natural chat feeling.\n- Graceful shutdown with 30s in-flight message drain.\n\n## Quickstart\n\n### 1. Install\n\n**Linux / macOS:**\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Escoto/RustifyMyClaw/main/scripts/install.sh | bash\n```\n\n**Specific version:**\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Escoto/RustifyMyClaw/main/scripts/install.sh | bash -s -- v0.1.0\n```\n\n**Windows (PowerShell script):**\n\n```powershell\nirm https://raw.githubusercontent.com/Escoto/RustifyMyClaw/main/scripts/install.ps1 | iex\n```\n\n**Windows (Chocolatey):**\n\n```powershell\nchoco install rustifymyclaw\n```\n\n**crates.io (any platform with Rust installed):**\n\n```bash\ncargo install rustifymyclaw\n```\n\nOr [build from source](docs/building-from-source.md).\n\n### 2. Configure\n\nGenerate a starter config with `config init`:\n\n```bash\nrustifymyclaw config init                # writes to default platform location\nrustifymyclaw config init -d .           # writes config.yaml in current directory\nrustifymyclaw config init -f my.yaml     # writes to a specific file path\n```\n\nDefault locations:\n- **Linux / macOS:** `~/.rustifymyclaw/config.yaml`\n- **Windows:** `%APPDATA%\\RustifyMyClaw\\config.yaml`\n\nRustifyMyClaw auto-discovers `config.yaml` in the current directory, so `config init -d .` followed by `rustifymyclaw` just works. See [docs/configuration.md](docs/configuration.md) for the full resolution chain.\n\nMinimal example:\n\n```yaml\nworkspaces:\n  - name: \"my-project\"\n    directory: \"/home/user/projects/my-project\"\n    backend: \"claude-cli\"\n    channels:\n      - kind: telegram\n        token: \"${TELEGRAM_BOT_TOKEN}\"\n        allowed_users:\n          - \"@your_handle\"\n\noutput:\n  max_message_chars: 600\n  file_upload_threshold_bytes: 51200\n  chunk_strategy: \"natural\"\n```\n\nTokens are never hardcoded — use `${ENV_VAR}` interpolation. Full reference: [docs/configuration.md](docs/configuration.md)\n\n### 3. Run\n\nUse default config location OR current directory when `config.yaml` is present:\n\n```bash\nrustifymyclaw\n```\n\nOr with a custom config path:\n\n```bash\nrustifymyclaw -f /path/to/config.yaml\n```\n\nValidate your config without starting the daemon:\n\n```bash\nrustifymyclaw --validate\n```\n\n### 4. Run as a Linux daemon\n\n\u003e [!IMPORTANT]\n\u003e 1 - Requires explicit workspace write permissions (otherwise your workspaces are readonly).\n\u003e 2 - As a daemon, rustifymyclaw defaults to `/etc/rustifymyclaw/config.yaml`. To use a different config file, set the `RUSTIFYMYCLAW_CONFIG` var and ensure the file is world-readable with `chmod 644` so the daemon can access it.\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Escoto/RustifyMyClaw/main/scripts/install.sh | sudo bash -s -- --system\n```\n\nThis places the binary in `/usr/local/bin/`, config in `/etc/rustifymyclaw/`, and installs a hardened systemd unit. Then:\n\n```bash\nsudo nano /etc/rustifymyclaw/config.yaml     # configure workspaces/channels\nsudo nano /etc/rustifymyclaw/env             # add API tokens and/or RUSTIFYMYCLAW_CONFIG to overwrite default config location.\nsudo systemctl enable --now rustifymyclaw\njournalctl -u rustifymyclaw -f               # check logs\n```\n\nTo allow your CLI Agent to **write**, use the built-in command:\n\n```bash\nsudo rustifymyclaw config allow-path /home/user/projects/my-project\n```\n\nSee [docs/configuration.md](docs/configuration.md#running-as-a-systemd-service-linux) for full setup details and security hardening options.\n\n## Backends\n\nRustifyMyClaw proxies to whichever AI CLI tool you have installed locally. Adding a new backend is one file and one trait implementation — see [How to Add a New Backend](CLAUDE.md).\n\n| Backend | Binary | Status |\n|---------|--------|--------|\n| Claude Code | `claude` | Stable |\n| Codex | `codex` | Stable |\n| Gemini CLI | `gemini` | Stable |\n\n## Channels\n\nEach channel connects using the platform's native protocol. No webhooks required for Telegram or Slack.\n\n| Channel | Mode | Status |\n|---------|------|--------|\n| Telegram | Long-polling | Stable |\n| WhatsApp | Webhook | Stable |\n| Slack | Socket Mode | Stable |\n\n## Chat commands\n\n| Command | Description |\n|---------|-------------|\n| `/new` | Reset the current session |\n| `/use \u003cworkspace\u003e` | Switch to a different workspace |\n| `/status` | Show current workspace, backend, and session state |\n| `/help` | List available commands |\n\n\n## Documentation\n\n- [Architecture](docs/architecture.md) — system design, data flow, and extension points\n- [Configuration](docs/configuration.md) — full field reference and examples\n- [Building from Source](docs/building-from-source.md) — build instructions and requirements\n\n## Contributing\n\nContributions welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\nLicensed under [Apache-2.0](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fescoto%2Frustifymyclaw","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fescoto%2Frustifymyclaw","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fescoto%2Frustifymyclaw/lists"}