Wrench

Beeper adapter · v0.16.11

Use Beeper through 32 supported actions.

Wrench exposes 32 semantic operations for one already-authorized Beeper Desktop account: 26 operations use the pinned official Beeper CLI 0.6.2, while 6 are fixed Desktop loopback reads. Each request binds its executable or fixed endpoint, account realm, Desktop target, operation contract, input, output, and risk level.

This page describes adapter beeper-local 2.4.0 in v0.16.11. Run wrench capabilities beeper-local --json for the exact state installed on your machine.

Choose direct Beeper or Wrench

Use Beeper directly when you want its first-party breadth. Connect the built-in Beeper Desktop MCP to a supported client, or use the official Beeper CLI for its broader first-party command surface.

Choose Wrench when the boundary is part of the requirement. Native Beeper CLI and Desktop MCP paths may expose broader first-party breadth. Wrench adds exact executable and adapter-version pinning; a named, typed semantic allowlist; write previews, durable receipts, contract-specific reconciliation for generic CLI mutations, and no blind retry after an indeterminate dispatch; encrypted snapshots; and versioned Message Like Me and contact-interaction exports. It wraps only the actions listed for this release.

Read, manage, and send through named contracts

Read

List and read accounts and bridges; list, search, and read contacts and conversations; read message pages, exact messages, and surrounding context; and search bounded message-content windows.

Manage state

Set reactions, archive or pin conversations, change mute or priority state, set or clear private drafts and reminders, and focus one exact Desktop conversation.

Send and change

Send text, files, stickers, or voice; edit an authored message; start a conversation; change read state or group metadata; set disappearing-message retention; send Notify Anyway; and emit bounded presence.

Browse Beeper's supported action names and access methods.

Bind one official CLI and one Desktop target

Install the pinned official CLI, authorize it to the local Desktop app, install Wrench's reviewed adapter manifests, then bind an auth identity to the exact Beeper account and Desktop realm.

brew install beeper/tap/cli
beeper setup
wrench adapter sync-bundled --json
wrench auth add beeper-main --linked-device beeper \
  --device-store "${HOME}/.beeper"
wrench auth bind beeper-main --site beeper

If a package manager installs different bytes, extract the matching release asset for your platform and place the executable at <WRENCH_STATE_HOME>/tools/beeper/0.6.2/beeper. When WRENCH_STATE_HOME is unset, the default state root is ~/.local/share/wrench. The artifact table below links the direct official asset for every supported macOS and Linux architecture. Wrench rejects an unpinned executable before private work. The authoritative executable identity is @beeper/cli 0.6.2. Its exact reviewed provenance records this discrepancy: Official v0.6.2 binaries.json and the exact executable report 0.6.2, while package.json at tag a416af06023449a87312dc11e54643fd9dc94b8c declares 0.6.1; executable runtime identity remains authoritative. The tagged source path is packages/cli/package.json, and its declared 0.6.1 is provenance only. A Beeper Desktop update changes the bound runtime realm and requires explicit review and rebind.

What Wrench adds to the official Beeper CLI

Beeper publishes the upstream CLI. Wrench exposes reviewed outcomes from that CLI for 26 operations and from 6 fixed Desktop loopback reads instead of exposing a command name and arbitrary arguments or a caller-selected request. The caller cannot select a command, flag, endpoint, target, environment variable, output path, or user-installed CLI plugin.

Wrench starts the executable directly without a shell, removes ambient credentials and target defaults, isolates oclif user-plugin state, and stages files only from digest-bound plan assets. Private text accepted by the upstream CLI as an argument can remain visible to same-account local process inspection while the child runs.

Each supported platform is bound to exact archive and executable SHA-256 values. A reported version, package-manager formula, release tag, or compatible-looking update is not execution authority.

Keep each version boundary separate

BoundaryCurrent identityWhat it controls
Wrench releasev0.16.11The installable CLI, SDK, plugin catalog, and public support directory
Adapterbeeper-local 2.4.0The public operation catalog and selected source-plugin contracts
Semantic contractsContract versions 1, 2, 3 across the current 32 operationsEach operation's input, output, risk, side effect, and completeness
Official CLIBeeper CLI 0.6.2 at a416af06023449a87312dc11e54643fd9dc94b8cThe exact upstream client, further bound by one executable digest per platform
Reviewed SDK semantics@beeper/desktop-api 5.0.0 at b9c1714410139c2139b597338cd002d785653e85The response semantics reviewed behind the CLI, not a claim about the running Desktop version
Runtime Desktop realmBound bundle ID, advertised version, loopback target, and hashed self accountThe exact local Desktop instance authorized to execute

These identities answer different questions and do not form a compatibility range. A new CLI artifact or Desktop build requires separate review.

Pinned executable artifacts

The reviewed CLI release commit is a416af06023449a87312dc11e54643fd9dc94b8c. Its release-manifest SHA-256 is 5c52b533180151b97e26138ef687b6b819170687b34a478184e5648335356950. Review the official 0.6.2 release and the CLI manual.

RuntimeDownloadArchive SHA-256Executable SHA-256
macOS arm64Official release asset688ccde7e7d044d33980cd06474bf1ae7215ccf8ca79967262fa3bfb85a2589a48aa895449129c793a212ea19f69a534adc34a8adc4037ca1d7da9e648716425
macOS x64Official release asset4113a1979cfbd7839f14743158e70c12efa941313afb77ab2b11a0830919618683bb89edb6eeb9c61ebdb6ec940e0db30c90ecbca61d60a7408fe336e255f22e
Linux arm64Official release asset2bd37043a4ed863621edc59e28aaa652e8193e55abca0e9477f5aeae1c65d629102b8725bd99b03905dcff9fff645f3742e1697ce8d43ab9d8656896aafd12a8
Linux x64Official release asseta881e1d2bc91e31218b251716644ec5f8d161d5ccb30e7eab66cf2ba6410511d723cc3a6c556fa21b6ba11db8377d6a29776aca1660da48f0072883d6452ae3d

Resolve and preview one exact Beeper turn

Keep each request and result in a distinct owner-only file. routes returns the V2 bounded discovery artifact and opaque references. Put one candidate routeRef in the private V2 resolve request. Wrench reloads the checked account and conversation target from encrypted private state and performs conversations.read. The caller never resupplies a network, account, conversation ID, name, title, or participant match.

{"schemaVersion":2,"format":"wrench.messaging-route-resolve-request","routeRef":"<candidate-route-ref>"}
wrench messaging routes --input @/absolute/private/beeper-routes-request.json \
  --private-output /absolute/private/beeper-routes.json --json
wrench messaging resolve --input @/absolute/private/beeper-resolve-request.json \
  --private-output /absolute/private/beeper-route.json --json
wrench messaging context --input @/absolute/private/beeper-context-request.json \
  --private-output /absolute/private/beeper-context.json --json
wrench messaging preview --input @/absolute/private/beeper-turn.json \
  --private-output /absolute/private/beeper-preview.json --json

The private preview shows the exact recipient, conversation, ordered bubbles, replies, expiry, and digest. Stop after preview by default. Confirm only after the owner reviews that exact private preview and makes a fresh same-turn request to send the visible recipient and bubbles.

wrench confirm <preview-digest> \
  --private-output /absolute/private/beeper-receipt.json \
  --receipt-binding-output /absolute/private/beeper-receipt-binding.json --json

For agentic text sends, Wrench performs one fixed POST to the bound Beeper Desktop loopback endpoint after the exact route and context preflight. This path does not call the CLI or SDK and never retries. Desktop's returned pendingMessageID proves submission to Desktop only, not network delivery. A separately obtained exact read may be inspected after a timeout, signal, malformed response, or lost response, but it cannot match this run by body, recipient, time, or nearby messages. Without an already accepted exact provider message identity, the run remains indeterminate and unretriable; only that identity could make reconciliation categorical.

Export local history for another bounded tool

Separate Wrench workflows can produce a private Message Like Me bundle or a body-free contact-interaction summary from Beeper's locally materialized history. These workflows are not part of the 32 supported actions.

wrench beeper export-message-like-me --auth beeper-main \
  --output /absolute/path/to/new-message-like-me-bundle --json

umask 077
wrench beeper export-contact-interactions --auth beeper-main --json \
  > /absolute/private/path/beeper-contact-interactions.json

Both exports retain incomplete-coverage evidence. The contact view excludes message bodies, attachments, reactions, media, group messages, names, titles, handles, credentials, and local paths. Provider coordinates can identify a person, so body-free does not mean anonymous.

Limits remain visible

Beeper CLI 0.6.2 exposes no continuation for several list and search commands and may cap those CLI-backed results below the requested limit. Contact list contract 3 walks Desktop contact pages with opaque before/after cursors and can return up to 200 contacts in one call; contracts 1 and 2 stay on the official CLI first-page window. Desktop message reads use the same cursor style plus an optional sender filter; callers must pass those returned values rather than deriving cursors from message IDs. Wrench returns bounded candidate windows instead of claiming complete history.

The checked coverage ledger fully accounts for all 101 public manual command paths; that is provenance coverage, not supported-command parity. Forty-one paths collapse to the 32 semantic operations. accounts use is absorbed into explicit account IDs; targets status, version, and top-level export are internal; accounts add, accounts remove, and messages delete are R4 and unavailable to provider dispatch; and plain status is among the 53 unsupported paths. None of those three R4 paths appears in the selected 32-operation provider adapter.

messages.delete is deliberately inert. Upstream --for-everyone requests can fall back to deletion for only the authenticated user when a network cannot delete for everyone, while the reviewed Desktop endpoint returns a void success response. Wrench therefore cannot prove the requested network-visible effect, never dispatches this action, and does not turn a local disappearance into a deletion receipt.

media.download remains unavailable because the official CLI buffers the complete media body to stdout before Wrench can enforce a streaming byte bound; no reviewed bounded worker accepts only a prior-message-bound opaque media handle. watch and outbound webhooks remain unavailable because their open-ended stream has no reviewed finite supervisor and proven termination contract. The top-level CLI export is internal-only: Wrench invokes a fixed, bounded, owner-private shard workflow with --no-attachments; callers cannot select raw export arguments, paths, or coverage claims.

Beeper recommends its Desktop API for personal use and warns that sending too many messages may result in suspension by connected networks. Wrench bounds each operation, but it cannot waive Beeper's terms or a network's throttling, automation, or suspension rules.