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 under one OS account. 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.

Unreleased 0.6.0 candidate: adds pull participants and explicit schema 3 migration. Published 0.5.1 packages still use schema 2. Build this checkout to try the new core on a separate database.

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+). Version 0.5 is a Rust executable, distributed through the same package name. Linux wheels for x86-64 and ARM64 with glibc 2.28+ include the compiled executable and SQLite; installing a matching wheel needs no Rust compiler. 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; storage defaults are documented separately.

This development version uses schema 3. Ordinary commands on schema 1 or 2 return database_migration_required without changing the file. To migrate an existing mailbox, first stop its users, make a SQLite backup and upgrade every client, then run htalk --db PATH migrate. Migration requires an explicit --db PATH; it never selects a target from HTALK_DB or the default location. The migration preserves messages, replies, acknowledgments, notification receipts and retirement marks. Older binaries reject schema 3; there is no automatic downgrade. Test on a copy before moving a working mailbox.

Native commands and peer JSON retain their earlier shape after migration. Python imports from harness_talk are no longer supported. Replace module invocations in scripts with the installed command, keeping the same database and arguments:

# Before 0.5
python -m harness_talk --as builder inbox
# 0.5 and later
htalk --as builder inbox

Fixed htalk error codes remain stable; uncoded OS/SQLite error wording and JSON whitespace may differ from the Python version. Parse JSON fields and fixed codes rather than exception prose.

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.

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 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 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; recovery.next_page 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.

Release files for harness-talk 0.6.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.6.0
File Size Uploaded
harness_talk-0.6.0.tar.gz 171.4 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for harness-talk 0.6.0
File Interpreter ABI Platform
harness_talk-0.6.0-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
harness_talk-0.6.0-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details

Total release size: 6.7 MB

Release files / harness_talk-0.6.0.tar.gz

Download URL harness_talk-0.6.0.tar.gz
Size 171.4 kB
Tags Source
SHA-256 checksum
How to use checksums
0949f1622c8140d7f7fafbf5b166e66960f30daaa8bdc8a424e99e5b51a920c2
BLAKE2b-256 checksum
How to use checksums
9f8e7ecde29e7a44524cf6f548e4c26758256853183e6edcbdec8e67c3c621a6
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 Sep 23, 2026.

Transparency log

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

Download URL harness_talk-0.6.0-py3-none-manylinux_2_28_x86_64.whl
Size 3.4 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
c70f8990a8d66cecad7f96747f6f6dacaaa9721f5532ab8725ef6c42579ad23b
BLAKE2b-256 checksum
How to use checksums
d98112b8e29e8f072357bf90b379e0296b843ab52e2360d5d603d61bcf49066c
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 Sep 23, 2026.

Transparency log

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

Download URL harness_talk-0.6.0-py3-none-manylinux_2_28_aarch64.whl
Size 3.2 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
ceb703e946bf3f74f429a26b8c32a315134b883cf97a0b254311e4f464d05e94
BLAKE2b-256 checksum
How to use checksums
ee394be6dc2c87493a24207336e06c975366cd16b4662f4a9059fd57753d9443
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 Sep 23, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.0 This release

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