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.

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.9.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.9.0
File Size Uploaded
boardmail-0.9.0.tar.gz 132.2 kB Details

Built distribution (wheel)

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

Total release size: 200.2 kB

Release files / boardmail-0.9.0.tar.gz

Download URL boardmail-0.9.0.tar.gz
Size 132.2 kB
Tags Source
SHA-256 checksum
How to use checksums
fd4ac148f2044a3673549715d0ff89821bff149d93ae76d0a1372b45d44f63a1
BLAKE2b-256 checksum
How to use checksums
562f850e8b9200d87503bef3dece02fd5ea13149241e8b1c5b8c9ebe94c59a34
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 19, 2026.

Transparency log

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

Download URL boardmail-0.9.0-py3-none-any.whl
Size 68.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e40f6d164bcdeaaebe8062f3a74ebb1c17f154b4692e20b949f7ee5db4fb69a8
BLAKE2b-256 checksum
How to use checksums
e337fca4823578c6d22512f721305e0b1ca34df67daa86ce52eb35b0a37bdb29
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 19, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.9.0 This release

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