Skip to content

CLI reference: Publish and recover

11 commands. Every command runs on your own computer; nothing is sent to a social network unless a publishing command is run by the owner with its live switches.

Preview due work; –live + opt-in env flag required to send

Terminal window
reachweaver publish [-h] [--live] [--limit LIMIT] [--post-id POST_ID]
[--max-per-24h MAX_PER_24H] [--min-gap-minutes MIN_GAP_MINUTES]
[--scheduled-only] [--max-lateness-minutes MAX_LATENESS_MINUTES]
[--optout OPTOUT] [--log-json] [--log-file PATH] [--json]
Option Description
--live Opt in to actual network publishing
--limit LIMIT Maximum eligible posts (default 10, max 100)
--post-id POST_ID Send or preview only this explicitly approved, due post ID (recommended for pilots)
--max-per-24h MAX_PER_24H Live per-account rolling 24h send-attempt cap 1..10 (default 2)
--min-gap-minutes MIN_GAP_MINUTES Live per-account minimum minutes between attempts 15..1440 (default 60)
--scheduled-only Worker-safe mode: skip approved unscheduled posts; only send due scheduled items
--max-lateness-minutes MAX_LATENESS_MINUTES With –scheduled-only, skip posts whose due time is >N min late (5..10080, default 180)
--optout OPTOUT Opt-out list JSON (default $REACHWEAVER_OPTOUT or config/optout.json if present); loaded once per run, a mention is BLOCKED before any claim and the post stays approved
--log-json Also emit one redacted JSON line per worker decision to stderr (dry run and live); observational only, never post text, handles, secrets or URL query strings
--log-file PATH With –log-json: append the JSON lines to PATH instead (created 0600, owner-only); an unwritable PATH refuses the run before any account or claim
--json Dry run only: the preview as JSON (due posts and what –live would skip); refused with –live

Emergency global stop for all live publishing

Terminal window
reachweaver pause [-h]

No options.

Explicitly lift the emergency stop

Terminal window
reachweaver resume [-h]

No options.

Human-confirm outcome of an uncertain send; do not blindly retry

Terminal window
reachweaver reconcile [-h] (--published | --not-published) [--remote-id REMOTE_ID]
[--remote-url REMOTE_URL] [--force]
post_id
Option Description
post_id
--published
--not-published
--remote-id REMOTE_ID
--remote-url REMOTE_URL
--force Reconcile a post still in ‘sending’ that was claimed less than 15 minutes ago (a send may be in flight). Only after checking the native account yourself

Show or tighten approval safeguards: human confirmation (#7 D6) and keyed binding (D7); both opt-in

Terminal window
reachweaver approval-mode [-h] [--confirmation {tty_hash_prefix,off}] [--require-key]
[--require-identity] [--max-age-hours N] [--json]
Option Description
--confirmation CONFIRMATION tty_hash_prefix: approve and publish –live need a terminal and the typed hash prefix; off needs the same ritual while it is on One of: tty_hash_prefix, off.
--require-key Latch keyed approval mode (needs a usable REACHWEAVER_APPROVAL_SECRET here); no command removes the latch
--require-identity Latch identity-bound approval (wave 9 item 2): approve needs –verify-identity –online and every send needs a stored identity; tighten-only, no command removes the latch
--max-age-hours N Approval time-to-live (#39): an approval older than N hours (1..8760) is expired and the post must be re-approved before any send; tighten-only, only a lower value is accepted later
--json Display the current mode as JSON; only without the options above, which stay text-only

Propose audience-local times; optional –apply queues approved posts locally only

Terminal window
reachweaver calendar-plan [-h] --account ACCOUNT --timezone TIMEZONE --start START
[--days DAYS] [--spacing-hours SPACING_HOURS]
[--post-id POST_ID] [--limit LIMIT] [--slot SLOT]
[--blackout BLACKOUT] [--include-drafts] [--apply]
[--audience-activity FILE] [--audience-top-hours N]
[--audience-max-age-days N] [--explore-share FRACTION]
[--explore-slot Wed@11:00] [--market MARKET]
Option Description
--account ACCOUNT One configured social account ID
--timezone TIMEZONE Audience IANA zone, e.g. Europe/Rome; not necessarily operator zone
--start START First eligible local day YYYY-MM-DD
--days DAYS Window length 1..60 days (default 14)
--spacing-hours SPACING_HOURS Minimum gap per account 1..168 hours
--post-id POST_ID Select a post explicitly; repeat; default is all approved posts
--limit LIMIT Maximum selected posts, at most 100
--slot SLOT Audience-local preferred slot Wed@16:00; repeat (required for some platforms)
--blackout BLACKOUT Exclude day YYYY-MM-DD; repeat
--include-drafts Preview draft and approved posts; cannot be applied
--apply Explicitly queue already approved items in local SQLite; never publish
--audience-activity FILE Owner-exported hour-of-week activity CSV (ReachWeaver interchange format, examples/audience-activity.example.csv); top hours become slots with provenance
--audience-top-hours N With –audience-activity: top activity hours used, 1..24 (default 5)
--audience-max-age-days N With –audience-activity: warn when as_of is older than N days (default 90)
--explore-share FRACTION Send this share of the posts (above 0, at most 0.5; default 0 = off) to –explore-slot times, labelled role=explore; the rest stay on the exploit slots. Not randomized
--explore-slot Wed@11:00 With –explore-share: an audience-local time to explore, distinct from the exploit slots; repeat
--market MARKET Audience market for market-specific notices: US, global or PLATFORM@MARKET (tiktok@US); adds a sourced flag only, never changes the slots

Read-only: empty and overloaded slots per account from the local queue; never approves, schedules or publishes

Terminal window
reachweaver calendar-gaps [-h] --account ACCOUNT --timezone TIMEZONE [--start START]
[--days DAYS] [--slot SLOT] [--blackout BLACKOUT]
[--audience-activity FILE] [--audience-top-hours N]
[--audience-max-age-days N]
[--tolerance-minutes TOLERANCE_MINUTES]
[--max-per-day MAX_PER_DAY]
[--min-spacing-hours MIN_SPACING_HOURS]
[--timing-source TIMING_SOURCE]
[--timing-metric {views,impressions,likes,replies,reposts,saves,clicks,signups}]
[--timing-denominator {views,impressions}] [--json]
Option Description
--account ACCOUNT One configured social account ID
--timezone TIMEZONE Audience IANA zone, e.g. Europe/Rome
--start START First local day YYYY-MM-DD (default: today in the audience zone)
--days DAYS Window length 1..60 days (default 14)
--slot SLOT Audience-local preferred slot Wed@16:00; repeat (as calendar-plan)
--blackout BLACKOUT Exclude day YYYY-MM-DD; repeat
--audience-activity FILE Owner-exported activity CSV; as calendar-plan
--audience-top-hours N With –audience-activity: top hours used, 1..24
--audience-max-age-days N With –audience-activity: stale after N days
--tolerance-minutes TOLERANCE_MINUTES A queued post within this many minutes fills a slot (1..720, default 90)
--max-per-day MAX_PER_DAY More queued posts than this on one local day is overloaded (1..20, default 2)
--min-spacing-hours MIN_SPACING_HOURS Queued posts closer than this are flagged (1..168, default 20)
--timing-source TIMING_SOURCE Annotate empty slots with timing-evaluate evidence from this exact imported source
--timing-metric TIMING_METRIC With –timing-source: goal numerator, e.g. clicks One of: views, impressions, likes, replies, reposts, saves, clicks, signups.
--timing-denominator TIMING_DENOMINATOR With –timing-source One of: views, impressions.
--json Machine-readable result

Explicit online, non-publishing account identity check

Terminal window
reachweaver connect-check [-h] --account ACCOUNT [--online]
Option Description
--account ACCOUNT One account id from local ignored config
--online Required: allow authentication/read-only remote API requests

Explicit online, READ-ONLY Postiz integration listing/receipt lookup; never posts

Terminal window
reachweaver postiz-check [-h] --account ACCOUNT [--online] [--post-id POST_ID]
Option Description
--account ACCOUNT One account with “backend”: “postiz” in local ignored config
--online Required: allow read-only GET requests to the Postiz API
--post-id POST_ID Also look up this local post’s Postiz job state (backend-reported; never reconciles)

Stop publishing to one account on this installation (#38): tighten-only, local; lists the credential variable names and the steps to revoke at the provider; revokes nothing itself

Terminal window
reachweaver disconnect [-h] --account ACCOUNT
Option Description
--account ACCOUNT One account id from local ignored config

Lift a local disconnect (#38). Human-only: needs an interactive terminal and a fresh challenge typed on /dev/tty

Terminal window
reachweaver reconnect [-h] --account ACCOUNT
Option Description
--account ACCOUNT The disconnected account id