htalk
Exchange messages between existing 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, Python 3.11+ 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.
Install and share a database
With uv:
uv tool install harness-talk
export HTALK_DB=/absolute/shared/directory/mail.sqlite3
Set the same HTALK_DB in both sessions. Both must be able to run htalk and write the database directory. --db PATH overrides the environment; storage defaults are documented separately.
Before opening an existing database with 0.3, upgrade every participant. The first storage command migrates it to schema 2; older clients cannot open that file.
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.
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:
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. Never send the same question again under a new ID to retry a notification. For automation, supply a saved UUID with send --id; an identical retry returns the existing message without another notification. Use --no-notify when the recipient will poll its inbox.
Help and details
htalk --help
htalk peer add --help
htalk send --help
- Reference: message states, recovery, database selection and exit codes.
- Codex and Claude adapters, including tested versions and discovery limits.
- OpenCode setup, including how a notification can start a turn in an existing session.
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.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| harness_talk-0.3.1.tar.gz | 44.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| harness_talk-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 72.2 kB
Release files / harness_talk-0.3.1.tar.gz
| Download URL | harness_talk-0.3.1.tar.gz |
|---|---|
| Size | 44.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1b633317b503b7fe710df3664860a04b3b98b3ec5b553681d57930953ad7c69f
|
|
BLAKE2b-256 checksum How to use checksums |
7bd1e40088d99179dd55abb181bb7a779ff0e46799980938363c257c961b576f
|
| 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 17, 2026.
Transparency logRelease files / harness_talk-0.3.1-py3-none-any.whl
| Download URL | harness_talk-0.3.1-py3-none-any.whl |
|---|---|
| Size | 27.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9485ebce2fffc12eb52d74b1ac4c7fae7815f214af30bc5f3b3ac788cfea6bf4
|
|
BLAKE2b-256 checksum How to use checksums |
b7c278e716b3dd9454f9b412c0761f08b19fa656bbaa0ad98363ba297c1f969c
|
| 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 17, 2026.
Transparency log