Skip to main content

Let AI agents message, watch, and spawn each other across terminals. Claude Code, Gemini CLI, Codex, OpenCode.

Project description

hcom

PyPI License: MIT Rust GitHub stars

Hook your coding agents together

Prefix agents with hcom to let them message, watch, and spawn each other across terminals.

https://github.com/user-attachments/assets/1ce23ed9-f529-4be0-8124-816aa4c2fd43


Install

brew install aannoo/hcom/hcom
Other install options
# Shell installer for macOS, Linux, Android (Termux), and WSL
curl -fsSL https://github.com/aannoo/hcom/releases/latest/download/hcom-installer.sh | sh
# With PyPI
uv tool install hcom  # or: pip install hcom

Quickstart

hcom claude  # gemini / codex / opencode

Prompt:

  • send a message to codex
  • review what claude did and send fixes
  • spawn 3x gemini, split work, collect results
  • fork yourself to investigate the bug and report back

Open the TUI:

hcom

What agents can do

Message each other in real-time, bundle context for handoffs.

Observe each other: transcripts, file edits, terminal screens, command history.

Subscribe to each other: notify on status changes, file edits, specific events. React automatically.

Spawn, fork, resume, kill each other, in any terminal emulator.


How it works

Hooks record activity to a local SQLite database and deliver messages from it.

agent  hooks  db  hooks  other agent

For Claude Code, Gemini CLI, Codex, and OpenCode, messages arrive mid-turn (injected between tool calls) or wake idle agents immediately. Any other AI tool can join by running hcom start. Any process can wake agents with hcom send.

Hooks go into tool config dirs under ~/ (or HCOM_DIR) on first run. If you aren't using hcom, the hooks do nothing.


Terminal

Every agent runs in a real terminal you can see, scroll, and interrupt. Any emulator works for spawning; kitty, wezterm, and tmux additionally support closing panes from hcom kill.

hcom config terminal --info   # tell agent to run this to configure other terminals

Cross-device

Connect agents across machines via MQTT relay.

hcom relay new                 # get token
hcom relay connect <token>     # on each device
hcom relay status              # check connection
hcom relay off|on              # toggle
Relay Security

Security

  • Relay payloads are end-to-end encrypted. Brokers do not see data.
  • Treat the join token like an SSH key or API key.
  • If the token may have leaked, run hcom relay off --all to disconnect all devices.
  • Use a private/custom/self-hosted broker with --broker and --password for better security.

Security model

hcom relay is one trust domain for one operator's devices. Membership is all-or-nothing. There are no scoped roles, read-only peers, or per-device permissions.

Relay payloads use a shared PSK with XChaCha20-Poly1305. The encryption binds each payload to the relay, topic, and timestamp. A replay guard drops duplicate envelopes inside a freshness window.

Brokers and network observers cannot read or forge payloads without the PSK. They can still see metadata: topic names, timing, message sizes, and connection patterns.

What the token means

The join token contains the relay ID, broker URL, and raw PSK. hcom does not ask a server to validate it. It has no expiry, no scope, and no revocation list.

On public brokers, a leaked token gives an attacker full control of the relay. They can decrypt captured traffic, publish authenticated relay traffic, send text to listening agents, launch agents on enrolled devices, kill running agents, and use remote relay RPCs. If those agents can run tools, treat that as shell access on every enrolled device in the relay.

On private brokers with --password, the token still leaks the PSK, so captured traffic is still exposed. But the token alone is not enough to publish unless the attacker also has the broker password. Use a private broker when broker-side access control matters, or when the metadata shape of your traffic is itself sensitive. --password is broker access control, not another layer of message encryption.

Limits by design

  • Forward secrecy. A leaked PSK can decrypt old captured traffic.
  • Per-device attribution inside a relay. Sender identity is routing metadata, not authorization. Every enrolled device speaks with full authority.
  • Prompt injection from an authenticated peer. Enrollment is total trust — a peer can launch, kill, and drive agents via RPC, not just send messages. Only enroll devices you would give shell access to.
  • Local OS compromise. hcom trusts the local user account and ~/.hcom/config.toml. It does not defend against another user on the same account or malware with filesystem access.

Storage

The PSK is stored in ~/.hcom/config.toml. On Unix, hcom writes that file with mode 0600.

hcom keeps the PSK out of environment variables. Remote config_get and config_set refuse relay_psk, relay_token, relay_id, and the broker URL. hcom relay status shows only a short fingerprint so two devices can verify they share the same key without printing it.

Anyone who can read that file — another user on the same OS account, malware, or a backup written without preserving permissions — has the full PSK.

Incident response

Run hcom relay off --all. It asks every reachable trusted peer to disable the relay, then disables it locally, so your agents stop acting on attacker messages. It is best-effort damage control, not containment: the attacker's device ignores the request.

The PSK cannot be revoked. There is no server to notify and no denylist to update. Anyone who has the PSK can keep using the old relay until you stop using it.

To keep using relay after a leak, create a new relay with hcom relay new and move every trusted device to the new token. Rotation also changes the relay_id, so retained state on the old broker topics is orphaned.


Troubleshoot

hcom status           # diagnostics
hcom reset all        # clear and archive: database + hooks + config
hcom run docs         # tell agent to run

Uninstall

hcom hooks remove                     # safely remove all hcom hooks
brew uninstall hcom                   # or: rm $(which hcom)

Reference

Tools & Launch

Supported tools

Tool Automatic delivery Connect
Claude Code yes, hooks hcom claude
Gemini CLI yes, hooks hcom gemini
Codex CLI yes, hooks hcom codex
OpenCode yes, plugin hcom opencode
Anything else manual poll via hcom listen hcom start (run inside tool)

Launch

hcom [N] <tool> [tool-args] [hcom-flags]

hcom 3 claude                 # launch 3 instances
hcom claude --model sonnet    # unknown args forwarded to tool
hcom claude --terminal kitty  # launch in a specific terminal
hcom claude --headless        # run in background with hcom pty

Claude Code headless and subagents

Detached background processes in print mode stay alive. Manage them through the TUI.

hcom claude -p 'say hi in hcom'

For subagents, run hcom claude, then prompt:

run 2x task tool and get them to talk to each other in hcom

CLI

CLI commands

What you might type from a shell. Agents run their own commands that they learn from the hcom CLI primer (~700 tokens) at launch. hcom <command> --help for full flags.

Spawn

hcom                                # TUI dashboard
hcom [N] claude|gemini|codex|opencode   # launch N agents (default 1)
hcom r <name>                       # resume stopped agent
hcom f <name>                       # fork session (claude/codex/opencode)
hcom kill <name|tag:T|all>          # kill + close terminal pane

hcom launch flags:

Flag Purpose
--tag <name> Group label — agents spawn as tag-name and can be addressed as @tag
--terminal <preset> Where windows open: kitty, wezterm, tmux, cmux, iterm, …
--dir <path> Working directory for the agent
--headless Run in background with no terminal window
--device <name> Spawn on a remote device (via relay)
--hcom-prompt <text> Initial user prompt
--hcom-system-prompt <text> System prompt override

Anything else is forwarded to the tool: --model sonnet, --yolo, --sandbox danger-full-access, -p, etc.

Observe

hcom list                           # who's alive, status, unread counts
hcom term [name]                    # view/inject into an agent's PTY screen
hcom transcript <name> [N-M]        # read an agent's conversation
hcom events --agent <name>          # event history (messages, file edits, lifecycle)

Drive

hcom send -b @luna -- hey           # one-off message to an agent
hcom run <script>                   # run a workflow (debate, confess, fatcow, …)
hcom run                            # list available scripts

Configure

hcom hooks add|remove [tool]        # install/remove tool hooks
hcom config                         # view/edit global + per-agent settings
hcom status [--logs]                # installation + diagnostics
hcom archive [N]                    # browse past sessions
hcom reset [all]                    # archive + clear (+ reset hooks/config)
hcom update                         # self-update

Sync across devices

hcom relay new                      # create group, get join token
hcom relay connect <token>          # join from another device
hcom relay on|off                   # toggle sync
hcom relay daemon start|stop        # manage background daemon
Config

Configuration

Config lives in ~/.hcom/config.toml. Precedence: defaults < config.toml < env vars.

hcom config                       # show all values with sources
hcom config <key>                 # get
hcom config <key> <value>         # set
hcom config <key> --info          # detailed help for a key
hcom config --edit                # open config.toml in $EDITOR
hcom config -i <name|self> ...    # per-agent override (tag, timeout, hints, subagent_timeout)

Keys

Key Purpose
tag Group label — launched agents become tag-name
hints Text appended to every message the agent receives
notes Text appended to bootstrap (one-time, at launch)
auto_approve Auto-approve safe hcom commands (send/list/events/…)
auto_subscribe Event subscription presets: collision, created, stopped, blocked
timeout Idle timeout for headless/vanilla Claude (seconds)
subagent_timeout Keep-alive for Claude subagents (seconds)
name_export Export instance name to a custom env var
terminal Where new agent windows open (hcom config terminal --info)
claude_args / gemini_args / codex_args / opencode_args Default args passed to the tool (launch-time args win)
codex_sandbox_mode off, workspace, …
gemini_system_prompt / codex_system_prompt System prompt injected on launch
relay / relay_id / relay_token / relay_psk / relay_enabled Relay config (see hcom relay --help)

Scope

hcom config tag mycrew                          # global
hcom config -i luna hints "respond in JSON"     # per-agent
HCOM_TAG=dev hcom 3 claude                      # per-launch env

Per-project isolation

export HCOM_DIR="$PWD/.hcom"    # isolate state + hooks to this project
hcom hooks remove && rm -rf "$HCOM_DIR"

Run hcom config <key> --info or hcom run docs --config for the full per-key reference.

Edit ~/.hcom/env to set env vars passed to every launched agent (e.g. ANTHROPIC_MODEL, GEMINI_MODEL, API keys). Any non-HCOM_* key works.

Workflow Scripts

Multi-agent workflows

Bundled and user scripts (~/.hcom/scripts/) for multi-agent patterns:

hcom run                   # list available scripts
hcom run debate "topic"    # run one
hcom run docs              # tell agent to run this to create any new workflow

Included Scripts

Tell agent to run them:

hcom run confess — An agent (or background clone) writes an honesty self-eval. A spawned calibrator reads the target's transcript independently. A judge compares both reports and sends back a verdict via hcom message.

hcom run debate — A judge spawns and sets up a debate with existing agents. It coordinates rounds in a shared thread where all agents see each other's arguments, with shared context of workspace files and transcripts.

hcom run fatcow — headless agent reads every file in a path, subscribes to file edit events to stay current, and answers other agents on demand.

Custom scripts: drop *.sh or *.py into ~/.hcom/scripts/ — auto-discovered, override bundled scripts of the same name. Ask an agent to author one; hcom run docs --scripts is the authoring guide.

Build

Building from Source

# Prerequisites: Rust 1.86+

git clone https://github.com/aannoo/hcom.git
cd hcom
cargo test
cargo build

Using local build

Two options:

Symlink — simple, dev build is global.

ln -sf $(pwd)/target/debug/hcom ~/.cargo/bin/hcom

dev_root — works regardless of how hcom was installed (brew, pip, etc.); picks the newer of debug/release automatically:

hcom config dev_root $(pwd)
hcom config dev_root --unset  # revert
hcom -v    # run local build

For concurrent worktrees, scope each to its own DB:

HCOM_DIR=$PWD/.hcom HCOM_DEV_ROOT=$PWD hcom claude

Contributing

Issues and PRs welcome. The codebase is Rust.

cargo test && cargo build
hcom config dev_root $(pwd)
hcom -v

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

hcom-0.7.12-py3-none-musllinux_1_2_x86_64.whl (6.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

hcom-0.7.12-py3-none-musllinux_1_2_aarch64.whl (5.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

hcom-0.7.12-py3-none-manylinux_2_28_aarch64.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

hcom-0.7.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

hcom-0.7.12-py3-none-macosx_11_0_arm64.whl (5.5 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

hcom-0.7.12-py3-none-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file hcom-0.7.12-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for hcom-0.7.12-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3f7b5f08196579911930b2efe61b91dfbdb12d54b6df0a474b93e1e37ba3baca
MD5 f7491d74eec5350000b6acb1ef66e867
BLAKE2b-256 fb5c20b0da9b9b7a20ca66bc7e3f53def9a5097fefa3c83b86be7360d30d487b

See more details on using hashes here.

File details

Details for the file hcom-0.7.12-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for hcom-0.7.12-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0f31a630ae63414ff7fe4692b4121fd8ab1543edc14b4881a3b7cd0f85032887
MD5 52c03c6f1d43160a2d1975555fd5da5d
BLAKE2b-256 0abd9d56c57a58cf5d26ee3b0e3ff3e2dd8a1bddede61974badcf1f6ad84f36f

See more details on using hashes here.

File details

Details for the file hcom-0.7.12-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for hcom-0.7.12-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 57b6bc6d596854e9669c4c483c93b5a87122bca14a431fc5e8c55331cf307761
MD5 c9678cae2850feb684351f127e1b1daa
BLAKE2b-256 f5ddf298620a66621a71f414d4f2aa6fc0e384ce6200107346eeb649d717c942

See more details on using hashes here.

File details

Details for the file hcom-0.7.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for hcom-0.7.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f28f17b244ece77cd9dcdccab9601f09559ff5b7abaf7237f65badbbe9b229e5
MD5 1f2a6c315406b2d4f77313bae188bdcf
BLAKE2b-256 54e98409cb3ad5b1a957a2006304e108c190999d9d47b18af444bdcc8579aaa2

See more details on using hashes here.

File details

Details for the file hcom-0.7.12-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: hcom-0.7.12-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 5.5 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for hcom-0.7.12-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c848266c75a3d233708ea364079db682c106e68c70c2824236416b0afbfeb599
MD5 97e0d49c1fd4f0c5d218a5ebe381f6b4
BLAKE2b-256 dd85b67040dc6152227ce684d2d26f80d291647eab20e4a48a436f41ac494f62

See more details on using hashes here.

File details

Details for the file hcom-0.7.12-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for hcom-0.7.12-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7fd16a3ecec6e77d1a59b17a6745f49d85c9dd6915dbd17fc9ae14d169edec7e
MD5 78cfcbbdd2316a529062c3c0716713f9
BLAKE2b-256 91033cfaf179112f0ba7750222694fde2540af518d2045c696b6b8e07aa773b7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page