Synaps is a fast, terminal-native agent harness written in Rust. It runs AI agents with built-in tools, subagents, and extensions, and works with any model, from Claude and ChatGPT to a local Ollama. Run it as a TUI, headless in CI, a server, or a daemon. Extend it with plugins in any language, MCP, and an event bus, and adapt it to your workflow instead of the other way around.


Install

cargo install synaps              # crates.io
brew install HaseebKhalid1507/tap/synaps    # macOS / Linux
yay -S synaps                               # Arch / EndeavourOS

# Debian/Ubuntu
curl -LO https://github.com/HaseebKhalid1507/SynapsCLI/releases/latest/download/synaps_amd64.deb
sudo dpkg -i synaps_amd64.deb

# Shell installer (any platform)
curl -sSL https://github.com/HaseebKhalid1507/SynapsCLI/releases/latest/download/synaps-installer.sh | sh

# From source
git clone https://github.com/HaseebKhalid1507/SynapsCLI && cd SynapsCLI
cargo build --release && ./target/release/synaps

New to agents? Start with the ELI5. Want the full tour? The Wiki has 36 pages.


Quick start

synaps login          # Claude Pro/Max, or a provider key, or point at local Ollama
synaps                # launch the TUI

Headless, same engine, for scripts and CI:

echo "summarize the git diff" | synaps chat

Sign in with what you already pay for, or nothing at all

synaps login                      # pick Claude or ChatGPT (Codex) from the provider menu

# ChatGPT / Codex
synaps                            # then: /model openai-codex/gpt-5.5

# Ollama or any local model (no account, no key, no cloud)
ollama serve                      # LM Studio, vLLM, llama.cpp all work too
synaps                            # then: /model local/llama3.2

Synaps auto-targets http://localhost:11434/v1, which is Ollama's default, so a running Ollama just works. Point it anywhere else with provider.local.url in config or the LOCAL_ENDPOINT env var. Your keys, your box, nothing phones home.


What's in the box

  • 🎭 Named agents. Crew members with roles. Dispatch by name, watch them think in a live panel.
  • 🔄 Steer them mid-flight. dispatch, poll, steer, collect. Redirect an agent while it's still working. This is the part nobody else does.
  • 🔌 Build anything on it. Process-isolated extensions in any language, MCP servers, an event bus, custom tools. A small core with enough hooks to bolt on whatever you want and glue it to whatever you've got.
  • 🌐 Any OpenAI-compatible model, cloud or local. Claude and ChatGPT natively, plus Groq, Cerebras, NVIDIA NIM, OpenRouter, or your own Ollama. Run a different model per agent. Swap mid-session with /model.
  • 📡 Event bus. Any script, cron, or service can poke a running session and the agent reacts in real time.
  • 🧠 Context that lasts. 90%+ prompt-cache hit rate. /compact checkpoints history. Chain sessions across days.
  • 🤖 Autonomous mode. synaps watcher runs a fleet with heartbeats, crash recovery, cost limits, and session handoff.
  • ⚡ Fast and lean. ~87K lines of Rust, one 15MB binary, ~2ms cold start, zero runtime deps.
  • 🎨 18 themes. catppuccin, gruvbox, nord, rose-pine, dracula, tokyo-night, plus originals like neon-rain and night-city. Hot-swap with /theme.

Modes

Command What it does
synaps Interactive TUI: streaming, markdown, syntax highlighting, subagent panel
synaps chat Headless, same engine, stdin/stdout. Scripts, pipes, CI
synaps server WebSocket API: token auth, origin validation, streaming
synaps rpc Line-JSON IPC for bridges (Slack, Discord)
synaps watcher Supervisor daemon for autonomous agent fleets

Configuration

No YAML. No TOML. No JSON. Just key = value in ~/.synaps-cli/config:

model = claude-sonnet-4-6
thinking = high
theme = tokyo-night
identity = You are a senior engineer who writes clean, tested code.
disabled_tools = bash, ls          # remove built-ins at boot (read-only profiles)
provider.groq = gsk_...

See the Wiki for the full config reference, the multi-machine auth broker (share one OAuth credential across a fleet over WireGuard or TLS), and the bridge heartbeat mirror.


Extensions

Drop a folder in ~/.synaps-cli/plugins/ and it's live on next boot:

~/.synaps-cli/plugins/my-guard/
├── .synaps-plugin/plugin.json    # manifest: hooks, permissions, keybinds
└── main.py | index.js | <any>    # JSON-RPC 2.0 over stdio, any language

Extensions are separate processes, not linked code, so they're language-agnostic, crash-isolated, and sandboxed. Hook before_tool_call, before_message, on_session_start, and 4 more.

Protocol spec: docs/extensions/.


Contributing

Synaps is young (started April 2026) and moving fast: 1,300+ commits in its first 3 months, shipped to crates.io, Homebrew, and the AUR, and listed in awesome-ratatui. Good first contributions: a new provider in the catalog, an extension, a theme, docs, or any good first issue.

git clone https://github.com/HaseebKhalid1507/SynapsCLI && cd SynapsCLI
cargo build && cargo test

See CONTRIBUTING.md. Issues and PRs welcome, the maintainer answers fast.

Come hang out in the Synaps Discord — questions, ideas, show-and-tell, or just to watch the crew run.


Philosophy

  • Agents are not chat. They're autonomous programs that happen to use language models. Treat them like services.
  • Multi-agent is the default. Single-agent is just n=1.
  • Speed is a feature. A 2-second boot already lost the dev who wanted it in a git hook.
  • The terminal is the IDE. If you need Electron to be productive, your tools are wrong.
crates/
├── agent-core/      # identity, models, auth, pricing
├── agent-engine/    # LLM runtime (Anthropic-native + OpenAI-compat router),
│                    #   tools, extensions, MCP, events, skills, sidecar
├── agent-tui/       # ratatui terminal UI, themes, settings, plugin modals
└── (root)           # the `synaps` binary crate: CLI dispatch, watcher, broker

Two API paths (Anthropic native and OpenAI-compatible for 17 providers) both emit the same StreamEvent, so the TUI and tool loop are provider-blind.


License

Apache 2.0. See LICENSE.