Skip to main content

postbag

Two agents, one bag of letters. A Claude Code session and a Codex session on the same machine write to each other. Each letter reaches the other agent through its vendor's own wake-up door, lands in one ledger, and counts against a human-set letter budget.

ci PyPI

postbag demo: both sessions join, you open an exchange of four letters, Claude asks Codex for a review, Codex answers, read shows the ledger

Real commands, real output, fake doors. The recording uses a temporary ledger, a throwaway socket and a stub codex, so no session or token is shown. Tape: docs/demo.tape.

Use it to have one agent review the other's diff, to split a task between them and agree the interface by letter, or to get a second opinion without pasting context by hand. Text travels by postbag, code travels by git.

Install

Python 3.10 or later, standard library only.

pipx install postbag
postbag --version

Or from the tag: pipx install git+https://github.com/parasxos/postbag@v1.0.2.

postbag needs Claude Code's per-session messaging socket and the queue command Codex added in 0.149. Verified end to end on macOS with Claude Code 2.1.263 and Codex 0.153.4 from the ChatGPT desktop app. Linux passes CI but the live exchange is not verified there. Windows is not supported. The Claude session must export CLAUDE_CODE_MESSAGING_SOCKET and CLAUDE_CODE_MESSAGING_TOKEN to the commands it runs, the Codex session must export CODEX_SESSION_ID, and codex queue --help must work. Set POSTBAG_CODEX if the binary is not in the ChatGPT app or on PATH.

Quick start

Open a Claude Code session and a Codex session on the same machine.

  1. Ask Claude to run postbag join claude.

  2. Ask Codex to run postbag join codex.

  3. In a terminal of your own, outside both sessions:

    postbag open --limit 6
    
  4. Ask Claude to send the first letter:

    postbag send codex "Review my last commit. Reply with the top three findings."
    

    Codex wakes with the letter. It begins with the letter's number, its sender and the one command that answers it, so neither agent needs instructions. The last letter of the budget says "do not reply", and the next send refuses and tells the agent to stop and ask you.

  5. Read the bag from anywhere with postbag read.

After a session restarts, ask it to join again.

How it works

join writes the session's door into the ledger: Claude Code's per-session messaging socket and token, or Codex's thread id. send knocks on the recipient's door, the socket or codex queue, then appends the letter under a file lock, so two letters sent at once get distinct numbers and one budget. The ledger, ~/.postbag/ledger.jsonl, is the only state, and the default is shared across projects. Set the same POSTBAG_LEDGER in both sessions and your terminal for a separate exchange. No daemon, no polling, no hooks, no server, no config file. CONCEPT.md is the whole specification in a page.

Security and limits

  • The ledger holds the Claude session token and every letter. Writes keep the file 0600 and new state directories are 0700; an existing custom directory is left alone. read hides the door fields, cat does not. Keep the raw file out of git, logs and screenshots.
  • A letter becomes a user turn in the recipient session. Trust both sessions with the task. postbag itself sends nothing off the machine; the vendor sessions forward the letter to their model services like any prompt.
  • open refuses inside either session. The check reads the vendors' session variables: a guardrail against mixed-up roles, not authentication against another process running as you.
  • Unattended delivery to Claude was verified with bypass permissions. Other modes may hold the letter for your approval. Codex needs permission to write the ledger and connect to the Claude socket.
  • "Delivered" means submitted through the door, not read. A timeout or a crash between submission and recording can leave a letter in doubt. There are no acknowledgements and no retries; check the recipient before sending again.

postbag is a small bridge for exactly two existing sessions. Tools that do more, and what they do, are listed in docs/readme-research.md.

Concept · Security · Changelog · Contributing · MIT

Download files

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

Source Distribution

postbag-1.0.2.tar.gz (22.8 kB view details)

Uploaded Source

Built Distribution

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

postbag-1.0.2-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

File details

Details for the file postbag-1.0.2.tar.gz.

File metadata

  • Download URL: postbag-1.0.2.tar.gz
  • Upload date:
  • Size: 22.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for postbag-1.0.2.tar.gz
Algorithm Hash digest
SHA256 11a4de68ef0e11291332bdb99805df46e97dc7f45543cd49c0badab82da95445
MD5 b6a886ee4c386d417746c64b0ad0eaad
BLAKE2b-256 c2085dfb0a82f5f1548487202f43c26aa48e940bd2dce390496bfb3a4a3fbb80

See more details on using hashes here.

Provenance

The following attestation bundles were made for postbag-1.0.2.tar.gz:

Publisher: release.yml on parasxos/postbag

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file postbag-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: postbag-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 8.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for postbag-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 76049c02dd4a665d53833d6ec4304243658605a1c870cd828b5aad09c2da7a78
MD5 f5bbd5606542fc405b6a3884d64f31ca
BLAKE2b-256 5c2340e3c35bfe751b4448c7705f106155deedb43541d3226ade5ff0ada1aa9b

See more details on using hashes here.

Provenance

The following attestation bundles were made for postbag-1.0.2-py3-none-any.whl:

Publisher: release.yml on parasxos/postbag

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.2.1

2 files

1.2.0

2 files

1.1.1

2 files

1.1.0

2 files

This release

1.0.2 This release

2 files

1.0.1

2 files

1.0.0

2 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