pkulak/opencrow

Personal AI assistant via Matrix Chat - A slightly saner alternative to OpenClaw

Go

2

370 commits

updated Oct 2, 2026

See the code

See what people are saying

README

OpenCrow

A saner alternative to OpenClaw.

OpenCrow logo

OpenCrow is a Matrix bot that bridges chat messages to pi, a coding agent with built-in tools, session persistence, auto-compaction, and multi-provider LLM support. Instead of reimplementing all of that in Go, OpenCrow spawns pi as a long-lived subprocess via its RPC protocol and acts as a thin bridge. By default, the bot behaves as a chat agent plus a separate background agent for reminders and external triggers. It can also expose an authenticated text-turn API for use as a Home Assistant conversation agent, backed by a third Pi session, and an MCP endpoint that lets another AI assistant hand requests to a fourth.

Setting OPENCROW_MATRIX_ROOM_ID gives background work and voice file delivery a stable default room, and enables multi-room invite handling.

graph LR
    Matrix -->|message| Inbox[(Inbox)]
    Reminders[(reminders)] -->|due| Inbox
    Trigger["trigger.pipe"] -->|external| Inbox
    HA["Home Assistant Assist"] -->|text turn| HTTP["voice HTTP API"] --> Inbox
    Client["MCP client"] -->|ask| MCPAPI["MCP endpoint"] --> Inbox
    Inbox -->|chat items| Chat["chat worker"] -->|RPC| ChatPi["chat pi"]
    Inbox -->|triggers| Background["background worker"] -->|RPC| BackgroundPi["background pi"]
    Inbox -->|voice turns| Voice["voice worker"] -->|RPC| VoicePi["voice pi"]
    Inbox -->|MCP requests| MCP["MCP worker"] -->|RPC| MCPPi["MCP pi"]
    ChatPi -->|response| Matrix
    BackgroundPi -->|response| Matrix
    VoicePi -->|text| HTTP --> HA
    MCPPi -->|text| MCPAPI --> Client

The Go service receives Matrix messages, optional HTTP voice turns, and optional MCP requests, forwards them to the appropriate Pi process, and routes the response back to the original transport.

[!WARNING] There is no whitelisting, permission system, or tool filtering. Trying to bolt that onto LLM tool use is inherently futile — the model will find a way around it. The only real protection is running OpenCrow in a containerized or sandboxed environment. Use a NixOS container, VM, or similar isolation. The included NixOS module does exactly that. Don't run it on a machine where you'd mind the LLM running arbitrary commands.

Documentation

  • Tutorial — Step-by-step NixOS deployment with Matrix
  • Configuration — Environment variables, Matrix settings, secrets, and authentication
  • Home Assistant voice assistant — HTTP text turns, the dedicated voice session, and Assist setup
  • MCP endpoint — Letting another AI assistant, such as LibreChat, hand requests to OpenCrow
  • Skills — Teaching the agent new capabilities via markdown instructions
  • Extensions — TypeScript lifecycle hooks and custom tools
  • Reminders — One-shot reminders, recurring schedules, and trigger pipes

pkulak/opencrow

Personal AI assistant via Matrix Chat - A slightly saner alternative to OpenClaw

Go

2

370 commits

updated Oct 2, 2026

See the code

See what people are saying

README

OpenCrow

A saner alternative to OpenClaw.

OpenCrow logo

OpenCrow is a Matrix bot that bridges chat messages to pi, a coding agent with built-in tools, session persistence, auto-compaction, and multi-provider LLM support. Instead of reimplementing all of that in Go, OpenCrow spawns pi as a long-lived subprocess via its RPC protocol and acts as a thin bridge. By default, the bot behaves as a chat agent plus a separate background agent for reminders and external triggers. It can also expose an authenticated text-turn API for use as a Home Assistant conversation agent, backed by a third Pi session, and an MCP endpoint that lets another AI assistant hand requests to a fourth.

Setting OPENCROW_MATRIX_ROOM_ID gives background work and voice file delivery a stable default room, and enables multi-room invite handling.

graph LR
    Matrix -->|message| Inbox[(Inbox)]
    Reminders[(reminders)] -->|due| Inbox
    Trigger["trigger.pipe"] -->|external| Inbox
    HA["Home Assistant Assist"] -->|text turn| HTTP["voice HTTP API"] --> Inbox
    Client["MCP client"] -->|ask| MCPAPI["MCP endpoint"] --> Inbox
    Inbox -->|chat items| Chat["chat worker"] -->|RPC| ChatPi["chat pi"]
    Inbox -->|triggers| Background["background worker"] -->|RPC| BackgroundPi["background pi"]
    Inbox -->|voice turns| Voice["voice worker"] -->|RPC| VoicePi["voice pi"]
    Inbox -->|MCP requests| MCP["MCP worker"] -->|RPC| MCPPi["MCP pi"]
    ChatPi -->|response| Matrix
    BackgroundPi -->|response| Matrix
    VoicePi -->|text| HTTP --> HA
    MCPPi -->|text| MCPAPI --> Client

The Go service receives Matrix messages, optional HTTP voice turns, and optional MCP requests, forwards them to the appropriate Pi process, and routes the response back to the original transport.

[!WARNING] There is no whitelisting, permission system, or tool filtering. Trying to bolt that onto LLM tool use is inherently futile — the model will find a way around it. The only real protection is running OpenCrow in a containerized or sandboxed environment. Use a NixOS container, VM, or similar isolation. The included NixOS module does exactly that. Don't run it on a machine where you'd mind the LLM running arbitrary commands.

Documentation

  • Tutorial — Step-by-step NixOS deployment with Matrix
  • Configuration — Environment variables, Matrix settings, secrets, and authentication
  • Home Assistant voice assistant — HTTP text turns, the dedicated voice session, and Assist setup
  • MCP endpoint — Letting another AI assistant, such as LibreChat, hand requests to OpenCrow
  • Skills — Teaching the agent new capabilities via markdown instructions
  • Extensions — TypeScript lifecycle hooks and custom tools
  • Reminders — One-shot reminders, recurring schedules, and trigger pipes

Languages

Go

86.0%

Nix

5.8%

Python

5.4%

TypeScript

2.8%