Welcome! OpenACP is a self-hosted bridge connecting AI coding agents to messaging platforms. Contributions of all kinds are welcome — bug reports, features, docs, and tests.
Please read the Code of Conduct before contributing.
Prerequisites
- Node.js >= 20
- pnpm 10.5.0+ (
npm install -g pnpm)
Getting started
git clone https://github.com/Open-ACP/OpenACP.git
cd OpenACP
pnpm install
pnpm buildDevelopment modes
pnpm dev # tsc --watch (type-check + rebuild on change)
pnpm dev:loop # auto-restart dev server on changeRunning tests
pnpm test # run all tests once
pnpm test:watch # watch modesrc/
├── core/ # Core infrastructure
│ ├── config/ # Zod-validated config, migrations, editor
│ ├── agents/ # Agent instance, catalog, installer, store
│ ├── sessions/ # Session, session-manager, session-bridge, permission-gate
│ ├── plugin/ # Plugin system (LifecycleManager, ServiceRegistry, MiddlewareChain)
│ ├── commands/ # System chat commands (session, agents, admin, help, menu)
│ ├── adapter-primitives/ # Shared adapter framework (MessagingAdapter, StreamAdapter, etc.)
│ ├── utils/ # Logger, typed-emitter, file utilities
│ └── setup/ # First-run setup wizard
├── plugins/ # All platform adapters and service plugins
│ ├── telegram/ # Telegram adapter (grammY)
│ ├── speech/ # TTS/STT (Edge TTS, Groq STT)
│ ├── tunnel/ # Port forwarding (Cloudflare, ngrok, Bore, Tailscale)
│ ├── security/ # Access control, rate limiting
│ ├── api-server/ # REST API + SSE
│ ├── file-service/ # File I/O for agents
│ ├── notifications/ # Cross-session alerts
│ └── context/ # Conversation history
├── cli/
│ ├── commands/ # CLI commands (start, plugins, dev, etc.)
│ └── plugin-template/ # Scaffold for `openacp plugin create`
├── cli.ts # CLI entry point
├── main.ts # Server startup, plugin boot
└── index.ts # Public API exports
packages/
└── plugin-sdk/ # @openacp/plugin-sdk — types + testing utilities
ui/ # Web UI (React + Vite, separate pnpm project)
OpenACP uses a plugin-based architecture. Core provides only infrastructure (ServiceRegistry, MiddlewareChain, EventBus, LifecycleManager) — all features are plugins.
User (Telegram/Slack) → ChannelAdapter → OpenACPCore → Session → AgentInstance (ACP subprocess)
- LifecycleManager boots plugins in dependency order and manages setup/teardown
- ServiceRegistry is the central service discovery layer — plugins register services, core accesses them via typed interfaces
- MiddlewareChain provides 18 hook points (e.g.
message:incoming,agent:beforePrompt,permission:beforeRequest) - CommandRegistry handles all chat commands from both core and plugins
For a complete architecture reference and AI-friendly codebase guide, see CLAUDE.md.
Install the SDK:
npm install @openacp/plugin-sdkScaffold a new plugin:
openacp plugin create my-pluginSee packages/plugin-sdk/ for the full API and src/cli/plugin-template/ for the scaffold template.
- English only — all code, comments, commit messages, and documentation must be in English
- TypeScript strict mode — all code must pass
tsc --noEmit - ESM modules — use
.jsextensions in all imports (even for.tssource files) - Zod for config validation and schema definitions
- Pino for structured logging — no
console.login library code - Use kebab-case for file names
- Versioning format:
YYYY.MDD.<patch>— e.g.2026.327.1is the first patch on March 27 2026
- Framework: vitest
- Test files:
src/core/__tests__/,src/__tests__/(integration),src/plugins/*/(plugin unit tests) - Run with
pnpm testbefore submitting a PR - Test state machines, user flows end-to-end, error recovery, and concurrency
- Mock at boundaries only (AgentInstance, ChannelAdapter, SessionStore) — not internal classes
- Do not mock away real behavior to make tests pass
- Fork the repo and create a branch from
main - Branch naming: use a prefix that matches the change type
feat/— new featurefix/— bug fixdocs/— documentation onlyrefactor/— code cleanup without behavior change
- Implement your change and write or update tests
- Commit using Conventional Commits:
feat: add slack reaction supportfix: reconnect on websocket timeoutdocs: update setup instructions
- Push and open a PR against
main - Update docs — if your change adds or modifies a feature, update
README.mdand/or thedocs/directory - CI must pass before a PR can be merged
- At least one maintainer review is required
- Browse
good first issuefor beginner-friendly tasks - Check
help wantedfor tasks that need community help - Join GitHub Discussions for questions and ideas
Use GitHub Issues to report bugs or request features. Please check for existing issues before opening a new one and include reproduction steps where applicable.
By contributing, you agree that your contributions will be licensed under the MIT License.