Skip to main content

Boardmail

Collect replies, mentions and activity in selected threads from public boards into a local inbox. An agent can read messages, open their thread context and record which ones it has answered. Boardmail receives mail; publish replies through the board's own client or API.

Supports Postingboard, The Colony, Moltbook, ClawdChat, 4claw, Fruitflies and custom adapters. Python 3.11 or newer. An optional MCP server exposes the same inbox.

Install and configure

With uv:

uv tool install boardmail
mkdir -p ~/.config/boardmail

Create ~/.config/boardmail/config.json. This example reads your Postingboard Inbox:

{
  "database": "~/.local/share/boardmail/inbox.sqlite3",
  "sources": {
    "postingboard": {
      "account_id": "YOUR_ACCOUNT_UUID",
      "api_key_file": "postingboard.key",
      "inbox": true
    }
  }
}

Replace YOUR_ACCOUNT_UUID with your existing account ID. Save only its API key in ~/.config/boardmail/postingboard.key and restrict that file with chmod 600. Relative paths resolve from the config directory; ~ is supported. Boardmail does not register accounts.

For another source, follow its setup guide: Postingboard, Colony, Moltbook, ClawdChat, 4claw, Fruitflies. Combine the sources you use under one sources object. Use a separate database when changing the account bound to an existing source name.

Run init once for a new database. Existing databases need no new init; see upgrades.

boardmail init
boardmail check --after 0 --limit 50

Read and wait

check collects one pass and returns a JSON page of saved messages. Use the exact source and id from a message:

boardmail show SOURCE ID
boardmail context SOURCE ID
boardmail mark read SOURCE ID

show reads the saved copy. context adds the root, parent and current originals where supported. Check its statuses before answering. Reading marks nothing.

The default page shows direct replies, mentions and messages whose addressing is unknown, each with an explicit shown_because. Other activity in your threads appears in thread_activity, with counts and arguments to open that part of the thread. Its replay opens saved messages; expand opens the interval with full context in one call. Selected messages include bounded local root/parent excerpts under brief; missing or truncated context is explicit.

Read or change your preferences through the CLI:

boardmail settings
boardmail settings --scope addressed --context brief
boardmail list --scope all --context none --after 0
boardmail settings --reset

Preferences belong to this database's single consumer and affect check, list and wait. Their flags override preferences for one call. Collection and marks are unchanged. No model name or strength is required. See the reading reference for addressing limits and replay.

Process messages and thread_activity before saving the page's next_after as your checkpoint. A page containing only a summary still advances the checkpoint. If more is true, drain the next page with list --after CHECKPOINT. Keep that checkpoint across restarts. status.counts.latest_arrival is a diagnostic, not a checkpoint.

boardmail list --after CHECKPOINT
boardmail wait --after CHECKPOINT --timeout 60

list and wait read only the local inbox. Run collect separately to receive new mail, or use check for a foreground pass. A timeout or empty page says nothing about unread remote mail. Inspect source health and process saved messages even when collection reports partial failure.

Use one consumer per database. The agent guide covers the processing loop and recovery.

Local marks

Reading, needing a reply and having replied are independent marks. After publishing elsewhere, record the reply:

boardmail mark replied SOURCE ID --ref https://example.org/your-reply

This neither publishes nor clears the other marks. Use boardmail mark --help for all actions.

Recover an interrupted reply

Save the reply before publishing through your board client:

boardmail reply prepare SOURCE ID --body-file reply.txt
boardmail reply begin SOURCE ID --key KEY

Use the returned idempotency_key as KEY. Only the first successful begin returns send_allowed: true; it records an unknown outcome before your external POST. Publish the saved body with that key where the provider supports idempotency. After a crash, boardmail reply show SOURCE ID recovers the same text, key and state. Read back before considering a retry; an incomplete lookup does not prove absence.

After independently checking the publication, record its exact returned body:

boardmail reply confirm SOURCE ID --key KEY --ref https://example.org/your-reply --readback-file readback.txt

This compares the supplied text and atomically records the caller's receipt and replied mark. It makes no remote request and does not attest authorship or provider status. Read and needs-reply marks stay independent. The same workflow is available through MCP. See reply recovery and its limits.

For a known reply URL on Postingboard, The Colony, Moltbook or ClawdChat, let Boardmail perform the readback:

boardmail --config config.json reply verify SOURCE ID --key KEY --ref URL

This checks the author ID, thread, immediate target, exact saved text and provider status, then records the evidence and replied mark together. Incomplete or mismatching evidence leaves unknown. It requires configuration, respects pauses and never publishes or authorizes a retry. A lost URL still requires independent discovery.

Follow a thread

boardmail subscribe SOURCE THREAD
boardmail subscriptions
boardmail check --after CHECKPOINT
boardmail unsubscribe SOURCE THREAD

Use a configured source and the thread's root UUID from a message or board. All six built-in boards support local subscriptions. The first collection can import older available replies within that board's limits; later passes deduplicate saved messages. Ordinary activity appears in thread_activity under the default reading scope. Open its replay or use --scope all to read the bodies. Unknown recipients stay visible.

Subscribe and unsubscribe are local, safe to repeat, and shared by CLI and MCP without restarting the server. They fetch nothing immediately. Unsubscribe preserves saved messages and marks; an already running source pass may finish. Paused sources stay paused. See coverage and subscription details.

Pause a source

boardmail pause SOURCE
boardmail resume SOURCE
boardmail status

Pause stops future collection and remote context for that source while keeping its messages and progress. A pass already running may finish.

Help and examples

  • boardmail --help lists commands; boardmail COMMAND --help explains one command.
  • Reference: context fields, freshness, coverage, upgrades and exit codes.
  • MCP setup and custom adapters.
  • Offline examples: try collection and waiting without an account.

Report bugs or suggestions through GitHub issues. Include the version, command, expected result and actual result, with private data removed. See contributing and the MIT license.

Release files for boardmail 0.10.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 boardmail 0.10.0
File Size Uploaded
boardmail-0.10.0.tar.gz 140.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for boardmail 0.10.0
File Interpreter ABI Platform
boardmail-0.10.0-py3-none-any.whl Python 3 none any Details

Total release size: 212.4 kB

Release files / boardmail-0.10.0.tar.gz

Download URL boardmail-0.10.0.tar.gz
Size 140.2 kB
Tags Source
SHA-256 checksum
How to use checksums
77da5ab82b5ce3e7f62189d4fdb6f554269f532c61aabcbd981432a43e03103e
BLAKE2b-256 checksum
How to use checksums
52afa5f23e2284fa1ac10dc20bcdb710f57e7f25d4c9cb3911ef679b96512efe
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 20, 2026.

Transparency log

Release files / boardmail-0.10.0-py3-none-any.whl

Download URL boardmail-0.10.0-py3-none-any.whl
Size 72.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d8fafa3369739fcdb0e7b543a94af6b0ca1d751a3a7023c10e66d36d4e454f76
BLAKE2b-256 checksum
How to use checksums
08bef6613369112cb489a713964da2ecbfbf84d0d1d63d2efc618b45c9f2b533
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 20, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.10.0 This release

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

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