Skip to content

ReachWeaver 0.4.0 release notes

Released on 2026-10-16.

Made for use inside Claude Code on a subscription, and safer against posting the same thing twice: a guided way to connect accounts, a repeat guard, seven more channels (100 in all), a rewritten README and docs for newcomers, and a skill that loads about a third of the text it used to. 3 new commands (85 in all, none removed). A minor version because approve gains a new refusal (below).

Upgrade notes (behaviour you may notice).

  1. approve refuses an exact repeat. If the same account has already published, sent, left unresolved, or recorded with mark-shared the same video file, image file or identical wording on the platform, approve refuses and check prints BLOCKED. Re-approving an identical evergreen post now needs approve POST_ID --allow-repeat, which leaves a repeat_override audit event. Similar wording, another account and the same link only warn.
  2. A new shared_material table is created, empty, the first time a database is opened. Nothing existing is migrated or changed.
  3. The skill is smaller. SKILL.md went from about 37.5 KB to about 12.7 KB; the removed detail moved unchanged into references/routing-detail.md, references/workflows.md and references/cli-cookbook.md, which Claude loads only when a request needs them. No behaviour changed.
  • Skill optimised for Claude Code on a subscription. SKILL.md now opens with a statement that ReachWeaver makes no model calls and needs no API key, keeps the router and the rules that override reach targets, and loads detail on demand from three new references (routing-detail.md, workflows.md, cli-cookbook.md; the text was moved verbatim). New docs/CLAUDE-CODE.md covers install, a first session, who does what and how to keep usage low. tests/test_skill_budget.py fails if SKILL.md grows past 16 KB or any source file calls a paid model API.
  • Repeat guard: do not post the same material twice (owner request, 2026-10-16). repeat-check (read-only) and mark-shared are new; check, show and approve now compare a draft with the platform’s history. Compared: the exact bytes of the video file and of each image (SHA-256), the wording (word 3-gram overlap, the measure campaign-check --history-db already uses; identical is an exact repeat, 60% or more is similar) and the canonical link. History is every non-cancelled post for the platform in the local database plus the new shared_material ledger of things posted by hand. An exact video, image or wording repeat of material this account has already shared (published, sending, needs_review, or recorded by hand) makes check print BLOCKED and approve refuse, unless the owner passes approve --allow-repeat, which records a repeat_override audit event. Everything else (similar wording, queued twins, another account on the same platform, the same link) is a warning. The same file on another platform is never a repeat. Reports carry ids, statuses and dates, never the earlier post’s text. Limits: exact files and wording only (a re-encoded video is not recognised), nothing is read from the platform, and the check runs at check/show/approve, not again at send time. See docs/REPEAT-GUARD.md. The approval step gains one more precondition and a human-only override; the send claim, dry-run default, pause, credential isolation and reconciliation are unchanged, and a send-time recheck is deliberately left for a separate security review.
  • Fixed in connect (found while testing this): with an existing database the status table raised UnboundLocalError, because a local import in the same function shadowed the read-only opener. tests/test_repeat_guard.py now covers it.
  • Seven more channels in the distribution registry (93 to 100), all manual-only (2026-10-16). PeerTube (scheduled publication is documented for PeerTube 6.0 or later when the instance enables it), Nostr, Farcaster, Pixelfed, HackerNoon, and the human-only Matrix rooms and Kaggle. Each entry cites the official page that was fetched; where a page is rendered by script and nothing about scheduling or rules could be read, the entry says unverified instead of guessing. Patreon, Ko-fi and Dailymotion were left out because their official pages returned a 403 challenge to a direct fetch. No adapter, account connection or ranking was added; distribution-plan rankings are unchanged.
  • connect: a guided way to connect your accounts (experimental, owner-chosen 2026-10-16). reachweaver connect prints an offline status table (credential variable names only; nothing is read from the network or written to the database). reachweaver connect --guide walks through the accounts one at a time with you at a terminal: the official sign-in page and steps per platform (Bluesky, Mastodon, Telegram, LinkedIn), a hidden-input way to set each variable, and then, only after you answer y for that account, the same read-only identity check as connect-check --online. It asks for no secret, opens no browser, posts nothing, leaves approval, dry-run, pause, credential and reconciliation rules untouched, and refuses to run without an interactive terminal. tests/test_connect_guide.py (20) pins this, including a static check that the module cannot read the environment, open a browser or touch the network.
  • README rewritten as a front page for newcomers. It now opens with what ReachWeaver is in plain words, what it will never do, which platforms really work today, how one post travels from draft to approval, three ways to get started and the five commands most people use. The honest-limits statement, the liability notice and the read/run/send disclosure are unchanged. The full command list stays in the README (collapsed), because the release gate requires every subcommand to be named there.
  • New Start here guide, glossary and documentation index by goal. The long feature guides that used to fill the README moved unchanged to docs/FEATURES.md (links adjusted).
  • The quickstart and troubleshooting pages point newcomers to the guide and glossary; the quickstart no longer calls approval-mode --max-age-hours a draft.
  • tests/test_plain_language_docs.py pins the structure; tests/test_readme_channel_count.py also checks the channel count in FEATURES.md.