Skip to main content

htalk

Exchange messages between local agents, including Codex, Claude Code and OpenCode sessions. htalk saves requests and replies in a shared SQLite inbox and can notify the recipient through its client. Either participant can ask, answer now or return later.

For Linux and mutually trusted sessions. Mailbox processes share one trusted OS account on the mailbox host; a remote client can connect through restricted SSH. Peer names identify routes, not authenticated users. The package name is harness-talk; the command is htalk.

The roadmap tracks the planned releases and their completion criteria.

Beyond the three native clients:

  • Session receivers for Pi, Oh My Pi, Hermes, OpenClaw, Agent Zero, Cline, OpenHands, Copilot CLI and Gemini CLI read a shared htalk watch stream. Kilo uses the OpenCode adapter. The installed wheel supplies htalk; the receivers are files of the matching source archive or checkout.
  • Managed sessions for Goose, Letta Code and the Antigravity SDK share owner-task binding, same-session restart and explicit recovery. They do not attach to existing TUI or IDE windows.
  • The MCP mailbox tool gives a client with MCP support the same message commands over stdio. Tool access and automatic session notification are documented separately for each harness.
  • Two devices can share one mailbox through the MCP-over-SSH route, with a Codex receiver for a worker on another device and a Linux user service for a reverse SSH route.

Each release has its upgrade note under docs/releases. 0.15.0 brings notices into Codex and Claude Code to macOS, checked on hosted runners against fake clients only. 0.14.0 adds macOS and Windows and changes nothing on Linux. 0.13.0 changes error codes, the keys of a successful result and the text of the help, once; the mailbox stays on schema 3 and needs no migration. Stop mailbox writers and receivers before updating the CLI and their matching adapter files.

Install and share a database

With uv:

uv tool install harness-talk
export HTALK_DB=/absolute/shared/directory/mail.sqlite3

Or install with python -m pip install harness-talk (Python 3.11+). htalk is a Rust executable, distributed as a Python package. Wheels for Linux x86-64 and ARM64 (glibc 2.28+), macOS ARM64 and x86-64, and Windows x64 include the compiled executable and SQLite; installing a matching wheel needs no Rust compiler. The same two install lines work on all three systems. macOS and Windows have the mailbox, pull peers, the MCP tool and OpenCode delivery. Since 0.15.0 macOS also has notices into Codex and Claude Code and htalk receive; Windows has neither, and the catalogue is Linux only. On both systems all of it was checked on hosted runners, not with real clients: no notice has reached a real Codex or Claude Code on a Mac. What works on which system has the table. The installed htalk runs without Python. Source installs require Rust 1.88+, a C compiler and a linker; see development.

Set the same HTALK_DB in both sessions. Both must be able to run htalk and write the database directory. Only peer add creates the file; other commands report database_not_found for a wrong path. --db PATH overrides the environment; without either, the mailbox is ~/.local/share/harness-talk/mail.sqlite3 on Linux, ~/Library/Application Support/harness-talk/mail.sqlite3 on macOS and %LOCALAPPDATA%\harness-talk\mail.sqlite3 on Windows; storage defaults are documented separately. On Windows set the variable with set HTALK_DB=... or $env:HTALK_DB = "...".

A mailbox on schema 1 or 2 is backed up and upgraded to schema 3 by the first command that opens it; see migration and recovery. Update every htalk installation that uses the mailbox.

Errors carry fixed codes, listed in the reference. Parse JSON fields and codes, not prose: a file or database failure of the mailbox itself is answered in the system's words.

Find and register the participants

htalk peer discover

Use the exact session IDs and workspaces in its JSON result. Discovery only finds addresses; it does not register peers, open the inbox or start clients. Check sources before treating an empty result as absence. See client setup for discovery coverage and connection details.

For example, register a Codex builder and a Claude reviewer:

htalk peer add builder --harness codex --session CODEX_UUID \
  --workspace /absolute/builder
htalk peer add reviewer --harness claude --session CLAUDE_UUID \
  --workspace /absolute/reviewer
htalk peer list

Replace those IDs and paths with the discovered addresses. For an app-server address, keep its --socket PATH. For OpenCode, follow the server setup.

When a registered session is no longer used, htalk peer retire NAME hides it from peer list and refuses new requests to or from it. Its saved questions can still be answered.

Any agent that can run the command can instead use a pull peer:

htalk peer add helper --harness generic --delivery pull
htalk --as helper inbox

--harness is a label such as generic, hermes or openclaw; a label does not install an integration. Pull peers need no native session or workspace and reject address flags. Messages to them are saved with notification_detail: pull_only and exit 0, without a notification attempt. The agent must run inbox to get its work. It can send and reply to native peers normally. peer check reports the delivery mode and does not establish that a pull agent is running.

To find owner-published profiles through a pinned SSH IPv4 address, LAN/Wi-Fi, an active Bluetooth PAN or private Tailscale, use the opt-in profile catalogue. Known devices are authenticated through pinned SSH; choose a profile by name and use its checked MCP connection. Reachable profiles keep runtime_status: unknown until separate runtime evidence exists.

Ask, answer and recover

From the builder's session, check the recipient in the same execution scope that will send:

htalk peer check reviewer
htalk --as builder send reviewer --message 'Which case needs another test?' --wait 45

From the reviewer's session, read the request, acknowledge it and answer. Use the request ID returned by inbox. A registered Claude Code session such as this reviewer may also omit --as; see peer selection.

htalk --as reviewer inbox
htalk --as reviewer ack REQUEST_UUID
htalk --as reviewer reply REQUEST_UUID --message 'Test recovery after interruption.'

The builder can retrieve a delayed answer and then acknowledge its separate ID:

htalk --as builder show REQUEST_UUID
htalk --as builder ack REPLY_UUID

An acknowledgment records the recipient's declaration of reading and removes that message's pending Codex notice when possible. A question stays open until answered. When the builder's wait records an answer before the final notification check, htalk skips that notice. An already accepted notice may still arrive. Sending a notification does not prove that the recipient read it. The result includes submission. One whose notice failed or is uncertain adds next_action and copyable recovery commands.

After interrupted or uncertain delivery, use show, wait, inbox or sent. sent lists your newest outgoing messages first, 20 at a time with summarized texts; next_page is the command that continues the list. Never send the same question again under a new ID to retry a notification. Use --no-notify when the recipient will poll its inbox.

Reuse a request ID

For automation, generate and save a UUID before the first send, for example with uuidgen. Replace REQUEST_UUID below with that saved value. Keep the same database, sender, recipient and message text when retrying after an interruption:

htalk --as builder send reviewer --id REQUEST_UUID \
  --message 'Which case needs another test?'

# An identical retry uses the same saved UUID.
htalk --as builder send reviewer --id REQUEST_UUID \
  --message 'Which case needs another test?'

If the request is already saved, the retry returns it with created: false and makes no new notification attempt. Its exit code can be 0 even when the original notification is submission_unknown. Check the saved result:

htalk --as builder show REQUEST_UUID

Reusing that ID with different text returns message_id_conflict, exits with code 2 and preserves the original request:

htalk --as builder send reviewer --id REQUEST_UUID \
  --message 'A different question?'

Help and details

htalk --help
htalk peer add --help
htalk send --help

htalk does not launch interactive clients or create sessions. Incoming peer messages do not grant permission to act.

Report bugs and suggestions through GitHub issues, with versions, command, expected result and actual result. Remove private conversation text and credentials. See contributing, releases and the MIT license.

Metadata

Release files for harness-talk 0.15.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for harness-talk 0.15.0
File Size Uploaded
harness_talk-0.15.0.tar.gz 487.4 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for harness-talk 0.15.0
File
harness_talk-0.15.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
harness_talk-0.15.0-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
harness_talk-0.15.0-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details
harness_talk-0.15.0-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
harness_talk-0.15.0-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 23.6 MB

Release files / harness_talk-0.15.0.tar.gz

Download URL harness_talk-0.15.0.tar.gz
Size 487.4 kB
Tags Source
SHA-256 checksum
How to use checksums
3bd5294b0534b6397bd4a825abd287595bd2bd21a8cf218597139513b05137af
BLAKE2b-256 checksum
How to use checksums
1aca5aa19befea8f1f915b96531576a89718cae62c2ba17090d6b9a9a0beefd9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / harness_talk-0.15.0-py3-none-win_amd64.whl

Download URL harness_talk-0.15.0-py3-none-win_amd64.whl
Size 4.0 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
ef1fbf1733d68c1cf188016ba4aa1b93bd00ca057313332a945eee9b0ad1c2c0
BLAKE2b-256 checksum
How to use checksums
4ab37e44a0d60947f5491a16a50ce56aeaf54e1259045503a393897b5f3907ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / harness_talk-0.15.0-py3-none-manylinux_2_28_x86_64.whl

Download URL harness_talk-0.15.0-py3-none-manylinux_2_28_x86_64.whl
Size 5.2 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
1659e5622db5c68ebea39527d67f0d87309971268c78b7dafbb38807138d72da
BLAKE2b-256 checksum
How to use checksums
64dd19e8ead1dd0c6bc735e9578f15ae0620d880860a9f4dec7a6ea5bbcb464c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / harness_talk-0.15.0-py3-none-manylinux_2_28_aarch64.whl

Download URL harness_talk-0.15.0-py3-none-manylinux_2_28_aarch64.whl
Size 4.9 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
5a3981afe01eda0934a2f6feb1b1f46b719714c8ab4fdd88135d648e9573708b
BLAKE2b-256 checksum
How to use checksums
e73db7d6b5eea195dc89814706b1364869f34268742470f787ae24fea65bfae4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / harness_talk-0.15.0-py3-none-macosx_11_0_arm64.whl

Download URL harness_talk-0.15.0-py3-none-macosx_11_0_arm64.whl
Size 4.4 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
6877b15d7f409f569a6f62b23a4a5aff935eb1ec981315db2d856ad84463c253
BLAKE2b-256 checksum
How to use checksums
413b5d07917bb04dc0af66ce5737abbab4417c41a8a2245d0edde29d58ef86b0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / harness_talk-0.15.0-py3-none-macosx_10_12_x86_64.whl

Download URL harness_talk-0.15.0-py3-none-macosx_10_12_x86_64.whl
Size 4.7 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
42bfce7b63e4b0690f401080506a2278c3cd4e2b1278dbc9b897de92a987e8da
BLAKE2b-256 checksum
How to use checksums
e4aa36f2025b665d1c4f0f61973aabc7fb29487cc2996977fc1f3571b98cab91
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.15.0 This release

6 release files

0.9.6

3 release files

0.9.5

3 release files

0.9.4

3 release files

0.9.3

3 release files

0.9.2

3 release files

0.9.1

3 release files

0.9.0

3 release files

0.8.1

3 release files

0.8.0

3 release files

0.7.0

3 release files

0.6.1

3 release files

0.6.0

3 release files

0.5.1

3 release files

0.5.0

3 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page