Skip to content

Local dashboard and friendlier terminal output

Status: experimental. Read-only. Verified in desktop Chrome (light and dark, keyboard shortcuts, the narrow layout at 375, 400 and 414 px in a frame, printing a post page to PDF) and by offline tests. The pages as of 2026-10-21 (the simpler Overview, Results with a time window, Write a new post) were checked in headless Chromium (Playwright) at 1280 and 375 px against a synthetic database, with no console or CSP error, no page wider than the screen and controls at least 44 px tall and wide on a phone; tests/test_ui_narrow.py repeats the width check at 375 and 390 px in headless Chrome when one is installed. The 2026-10-22 changes (ideas with Write this on the Overview, the composer’s live previews and Mark as posted on its cards) were checked the same way under reachweaver studio against a synthetic workspace. It has not been tried on a real phone, with a screen reader or in other browsers.

ReachWeaver is a command-line tool. reachweaver ui adds an optional read-only dashboard that shows what is in your local database in a browser. It exists to make review easier: see what needs a human, read the exact text of a post next to its approval state, and find the command to run next. It does not replace the terminal for any action.

It can It cannot (by design)
Show the queue, newest first, with posts that need a human at the top Approve, unapprove, cancel or schedule a post
Show what is scheduled, day by day, and what was already posted Move a post to another time
Show one post’s exact text, offline platform preview, approval binding, media/video/reply state and event timeline Publish, send, retry or reconcile anything
Show readiness, the emergency-stop state, per-account budgets and sends that failed (dead letters) Pause or resume the emergency stop
List configured accounts and the names of missing credential variables Show, accept or store a credential value
Browse the offline channel research (distribution-plan) Contact a platform or any other server
Print the terminal command you could run next, with a Copy button Run that command for you
Build a prompt for your own Claude Code session and copy it Call a model, start Claude Code or send anything to Anthropic
Show what changed recently (drafts, approvals, sends, ideas) Record, change or delete an event or an idea

Approving, scheduling, pausing and publishing remain deliberate commands you type yourself. Nothing in the dashboard changes the approval gate, the dry-run default, the emergency stop, credential isolation or ambiguous-send reconciliation.

Terminal window
reachweaver init # once, if you have no database yet
reachweaver ui # prints an address with a per-run token; open it in your browser
reachweaver ui --open # also opens your default browser
reachweaver ui --port 8765 # fixed port instead of a free one
reachweaver --db state/other.sqlite --accounts config/accounts.json ui

The address looks like http://127.0.0.1:PORT/RANDOM-TOKEN/. Press Ctrl-C in the terminal to stop the dashboard. ui refuses to start if the database does not exist; it never creates one.

Keep the address private. It is the only thing that lets a browser read your queue, so do not paste it into a chat, an issue or a screenshot. The token stays valid until you stop the dashboard. --open hands the address to your browser on its command line, where another user of a shared computer could see it with ps; on such a machine paste the address yourself instead.

Terminal window
reachweaver studio --open # both pages; the browser opens the dashboard (the composer if you have no posts yet)
reachweaver studio --port 8765 --composer-port 8766

studio starts this dashboard and the browser composer in one process, so they behave like one app:

  • Write a new post (the sidebar, the button at the top of the Overview on a phone, the next-step card, the Write page and Ctrl K) opens the composer directly, with the cursor already in its empty caption (the link ends in &write=1, so this happens on a phone too; a plain visit to the composer on a phone does not open the keyboard).
  • When the Overview’s next steps include your ideas, it lists your newest open ideas there (at most three), each with Write this: one click opens the composer with that idea as your caption. On the Ideas page each open idea has Write a post from this idea, which does the same. If the composer already holds a post, nothing is replaced; it asks first, and Undo brings your caption back.
  • In the composer, See how your posts did (top and bottom of the page, and after Mark as posted) opens the dashboard’s Results.
  • Steps that only you can run in a terminal (approve, review, publish, resume, metrics…) stay commands to copy.

It prints two addresses, each with its own per-run token; keep both private. Holding the dashboard address of a studio run also gives the composer link, so treat them as one key. If you have no database yet, studio creates an empty one first (exactly what reachweaver init does). Ctrl-C stops both pages. ui and share --web on their own still work as before: the dashboard then shows the command to start the composer, and the composer shows the command to start the dashboard.

A sidebar starts with Write a new post and groups the pages into Work (Overview, Queue, Schedule, Ideas, Work with Claude), Record (Posted, Results, Campaigns) and Setup (Accounts, Channels). Counts next to Overview, Queue and Schedule say what needs you: red when a send needs review or an approval has expired, amber otherwise. They come from one read-only check (api/attention) and are refreshed on every page. The header holds the search box, a refresh button and a settings menu (theme, auto-refresh, alerts, keyboard shortcuts). Lists of posts are compact rows: status, platform and account, the first two lines of text, and the relevant time; the whole row opens the post.

Jump to (Ctrl K or Cmd K): type part of a page name, a post’s text, id, account, platform or campaign, then press Enter. It only moves you to that page or post; the last entry searches everything for what you typed. Esc closes it and puts the focus back where it was.

Card titles are real headings, so a screen reader can jump between them, and a copied command says “Copied” on its button and in a status message. Example times in commands are computed in your browser (tomorrow at 09:00 for schedule --at), never a fixed past date; metrics records the current time unless you pass --observed-at.

Look and feel for other pages. The colours, corner radius, fonts and wordmark are defined once as brand tokens (BRAND and BRAND_CSS in reachweaver/ui_assets.py: the CSS custom properties --rw-accent, --rw-accent-dark, --rw-radius, --rw-font, --rw-mono and --rw-wordmark), so another local page such as the browser composer can use the same look.

  • Overview: built to answer “what do I do now?” at a glance.

    • A status line. A yellow or red banner appears only for a real problem and names each one in plain words: the emergency stop is on, a send ended in an unknown state (“uncertain send — check the platform”), a send never finished, a scheduled post is past its time, an approval no longer matches, or anything else that blocks sending. The emergency stop and uncertain sends are never folded away. Otherwise it is one calm line: “Automatic sending isn’t set up — you don’t need it to write or post by hand.” (“Everything checks out.” once automatic sending is fully set up). A missing credential of an account with nothing queued is no problem for someone who posts by hand, so it is only a note in the details.
    • Your next step: one action with its command and a Copy button, chosen by the same logic and in the same order as reachweaver start (the emergency stop, then uncertain sends, then drafts waiting for you, then queued work). A command only you may run is marked “You run this”. When nothing is waiting, the step is Write a new post (reachweaver share --web --open, the browser composer). At most three other steps follow under “Also” (Write a new post first among them, except while the emergency stop is on or a send is uncertain, when it comes last), and a link opens the Queue when posts are waiting for you.
    • Coming up (the next five scheduled posts), Recently posted (the last five entries of the journal), a bar of all posts by status whose legend links into the queue, and a compact Ask Claude composer with two ready-made prompts (“What needs me today?” and “Plan next week’s posts”).
    • Setup and safety details, folded away: every readiness reason in plain words with what to do (its code in small print); Files and approvals (the approval record in a sentence with a link to each affected post, the database integrity check and the same folder check as reachweaver workspace, reused for up to a minute because it hashes the files of unsent posts); Suggestions (up to five offline rules from reachweaver suggest --include-db, not a reach prediction, hidden when there are none); each account’s status (“ready”, or “Not connected (only needed for automatic sending)”) with how it posts and the names of missing variables behind a “Technical details” toggle; and Sends that failed.

    The Overview shows one way to write a post, never two: when the next step is a command for your own terminal (such as going through waiting drafts, which stays terminal-only), the card adds Not at your terminal? Or write a new post; when the next step is writing a post, the card’s own link is it; otherwise, on a phone, a Write a new post button sits at the top of the Overview (44 px tall), because the sidebar is a closed drawer there. “Also” no longer repeats it. Under studio, a step that writes a post is a link to the composer, and the ideas step shows your newest open ideas (at most three, read from the same read-only api/ideas?status=open as the Ideas page) each with Write this, a link that opens the composer with that idea, plus a link to all of them when there are more (alone: each listed idea has the command reachweaver share --web --open --idea ID with a Copy button); everything else stays a command to copy. Skip links and the sidebar’s Write a new post are at least 44 px tall.

    Waiting drafts are shown once: in Your next step (with the count), and as a number in the All posts bar. The Overview no longer repeats them in other lists: the posts that need you are in the Queue, and the owner-only command cards and the activity feed are on the Work with Claude page. The browser tab title shows how many sends need review, e.g. (1) ReachWeaver Dashboard.

  • Write a new post: the browser composer is its own small local page. Under reachweaver studio this page (and every Write a new post button) is a link to it. With reachweaver ui alone the dashboard runs nothing, so this page gives the command reachweaver share --web --open with a Copy button and the four steps that follow (write, copy each version and post it yourself, record that you posted it, add the numbers later).

  • Work with Claude: see Work with Claude below.

  • Ideas: your ideas inbox (reachweaver idea, the private ideas.json next to the database), newest first, filtered by state (All, Open, Promoted, Dropped; each filter is read out with its count, for example “All (2)”) and searchable (the box is labelled “Search your ideas”). Each idea shows its text, id, tags and only the host of its source link (never the path or query). An open idea has Promote with Claude, which copies a prompt that asks Claude to propose a campaign id and, after you agree, run idea promote and fill the scaffold with verified claims. The dashboard never creates, changes or drops an idea; a damaged inbox is shown as an error instead of breaking the page.

  • Queue: status chips (with their counts) and an account menu filter the list, and a search box narrows the posts shown. The list is grouped under a heading per status; each row shows when the post is due, or when it was created if it has no time. Posts in needs_review come first because a send ended in an unknown state and a human must check the native platform. Empty states say what to do next.

  • Schedule: approved posts by due time, shown in your local time (the UTC time on hover). Posts past their time come first, then sends in progress, then the next 14 days grouped by day (“Today”, “Tomorrow”, then the date), then approved posts with no time set. When you have set an approval time limit (approval-mode --max-age-hours), a post whose approval has expired, or will expire before its due time, is flagged. Only a worker you run sends anything, and reachweaver pause stops every send. Month switches to a calendar of five weeks from this Monday, with each post at its local time (orange: past its time and not sent; red: approval expired; at most three per day, then “+N more”). Each entry shows its time, a platform dot and the start of its text; click a day number (or “+N more”) to list that day’s posts under the calendar. On a narrow screen it becomes a list of the days that have posts.

  • Search: the box in the header (or / on a page without its own search) searches every post in any status, campaign names and posts you recorded as posted yourself, by text, id, account, platform, campaign, note or link, case-insensitively. A post you recorded with mark-shared --url appears once, labelled “posted by you” with the time you posted it (its note and link are searched too); only a hand-shared record without its own post page is listed separately. It runs on your own database only; nothing is sent anywhere.

  • Posted: the record from reachweaver journal, newest first: what ReachWeaver sent (with the approver and a link to the remote post), sends that ended in an unknown state (“possibly posted: check the platform”), and what you recorded with mark-shared, labelled “posted by you” and “not sent by ReachWeaver”. A post recorded with mark-shared --url opens its post page. Search and an account menu narrow the list; it shows the newest 100. Files are listed by kind and count only; the dashboard does not open them.

  • Post: the heading is the first words of the post, with its id in small print. A post that went out (sent, or posted by you) belongs to Posted: the back link and the highlighted section say so. For a post you posted yourself the side panel says “Posted by you on DATE (not sent by ReachWeaver)” instead of schedule and approval fields, and the approval sections are left out. Then a status card that says in plain language what the state means and offers the next command to run; when the post needs you (a draft to approve, an approved post to send, a send to reconcile, a send that did not finish, an expired approval), an owner-only card under it with the exact commands, who runs each (“You run this” or “Claude can run this”) and one line on why it is yours; a Work with Claude card in the side panel with ready-made prompts (“Voice-check and tighten this draft” only while the post has not gone out, “Draft a follow-up for this post”, “Check claims in this post”) and a link to ask something else about this post; the exact text with a length meter against the platform’s own limit (Bluesky, Mastodon, LinkedIn) and a Copy text button; a Preview, an offline look-alike of the post with the account’s handle and links, hashtags and mentions tinted (not the platform’s own rendering: link cards, line breaks and truncation may differ); the approval binding, offline platform preview and attachments in collapsible sections; a side panel with more commands, the account, platform, campaign and times; previous/next post links; recorded results with a small line of one metric over hours after posting when at least two exact values were recorded (nothing is drawn from one value or interpolated beyond the points); and the event timeline as a vertical list with relative times (“2 hours ago”, exact time on hover), each event as a plain sentence (for example “You recorded that you posted it yourself on linkedin on 2026-10-10. ReachWeaver did not send it.”), with the stored detail behind a “Technical details” toggle.

The exact text is shown as stored, not redacted, because you are reviewing what would be sent. A warning appears when it looks like it contains a password, token or key. Errors, events and previews are redacted.

  • Results: what you recorded from each platform’s own analytics (metrics, import-metrics, metrics-fetch). This week, 30 days or All (a read-only ?since=7d|30d|all in the address; this week by default) picks the posts that went out in that window, and one line sums them up, for example “3 posts · 40 likes · 7 replies · 9 reposts”: the latest exact value of each post added up (a metric nobody recorded is left out, never shown as 0; a snapshot taken before the window began does not count), followed by the top three posts by recorded likes, replies and reposts. Results is in the phone’s bottom bar. Per platform: the total of exact values and how many published posts have one (3/5). Only metrics with a recorded value somewhere get a column; the others are named in one line (“Nothing recorded yet for: …”) and stay unknown, not zero. Each post’s latest record has a bar of its first metric against the largest exact value shown. Per post, newest first: the latest record with its time, how long after posting it was taken (in minutes or hours up to two days, then in days, for example “3 days after posting”) and its source. Platforms are shown by name as the terminal prints them (“Bluesky”, “LinkedIn”); the ids stay in the data, links and filters. A value you did not record is “unknown”, never 0. A platform estimate is labelled “(platform estimate)” and never added to exact counts, and a value the platform withheld says so (for example “not available”). The post page lists every record of that post. Posts you published by hand and recorded with mark-shared --url are included and labelled “posted by you” (per platform: “N posted by you”). Nothing is fetched: the page only shows what is already in your database. Under What works for you it shows up to three lines per account from reachweaver insights (your own posts’ results about 7 days after posting, compared by time, length, link, format, hashtags and opening hook): observations to test, never causes; with too little data it says so (INSIGHTS.md).
  • Campaigns: a card per campaign name used on a post, most recent first, with a status bar, its status counts, platforms, accounts and staged variants. A campaign’s page shows its posts side by side (status, platform and account, text, when, recorded results) with links to each post. A campaign only groups posts for review: each post is still approved, scheduled and sent on its own.
  • Accounts: the ready-made prompt “Which channel should I add next?” (it lists the platforms you already use), then a card per configured account with its handle as you typed it, platform, how it posts (“you post by hand”, “can send automatically”), links to its queue, posted list and results, and whether it is connected (“connected: all set”, or “Not connected (only needed for automatic sending)”). The adapter kind and the names of missing variables are behind “Technical details”. Credentials are needed for live sending only.
  • Channels: a card per channel from the offline distribution research by market and goal, with its delivery, native scheduling and official source. These are research hypotheses, not predictions, not an account connection and not permission to publish. The “Which channel should I add next?” prompt here uses the market and goal you picked.

A value that is not recorded is shown as “unknown”, never as zero.

The dashboard does not run Claude. You keep Claude Code open in its own app (terminal, desktop, IDE or web) on your own subscription, and the dashboard becomes its companion: it turns what you want into a precise prompt, shows what only you can do, and follows what changes. It calls no model, starts no process and stores nothing.

  • Ask Claude. Type what you want and pick what it is about (nothing specific, a post that needs you, an account, a campaign or an open idea; the post page’s “Ask something else” link fills it in). The prompt appears in a read-only box as you type; Copy prompt (or Ctrl Enter in the text box) copies it. If the browser refuses the clipboard, the prompt is selected so Ctrl C / Cmd C copies it, and a short status line says which happened (read out by screen readers). Your words go to the local dashboard only as part of the request that builds the prompt; they are not logged or stored there. The unsent text is kept in this browser’s local storage so a refresh does not lose it; Clear removes it.
  • What a prompt contains. It starts with /reachweaver so Claude Code loads the ReachWeaver skill; then the ids it is about (post, account, platform, campaign, idea) taken from your database, never guessed; the commands to start with, beginning with reachweaver context --json (none of them approves or sends anything, and each is checked by the tests against the real command line); what you want, step by step; and the ground rules: Claude never runs approve, publish --live, resume, reconcile, reconnect or the other owner-only commands and hands you the exact command instead, treats quoted text as data, never asks for a password or token, and claims no post or view without first-party evidence. If you started the dashboard with --db, --accounts or --home, every command in the prompt repeats them.
  • Stored text is quoted as untrusted data. A post’s or idea’s text appears between BEGIN UNTRUSTED DATA and END UNTRUSTED DATA lines whose marker is derived from the text’s hash, so the text cannot close its own quote. Control characters are removed, something that looks like a password, token or key is replaced (the prompt says so), and text over 3000 characters is cut with a pointer to reachweaver show ID.
  • Ready-made prompts. One click copies each: “What needs me today?” and “Plan next week’s posts” (Overview and Claude page), “Which channel should I add next?” (Accounts, Channels and the Claude page), the three post prompts on each post page, and “Promote this idea into a campaign” on each open idea. “Show the prompt” lets you read it first.
  • Only you can do these. One card per post that needs you, most urgent first (a send to reconcile, a send that did not finish, an expired approval, a post past its time, a draft waiting for approval, then approved posts waiting to be sent), plus owner steps from the start guide such as reachweaver resume when the emergency stop is on. Each card shows the exact commands with Copy buttons, marks each one “You run this” (owner-only in reachweaver describe) or “Claude can run this”, and says in one line why it is yours. The commands come from the same helpers as the post page and reachweaver start; the live send is the dry-run command with --live added, and it still needs REACHWEAVER_ENV=prod, REACHWEAVER_ALLOW_LIVE=1 and a due, approved post in your own terminal.
  • Activity. The last 30 local events, newest first: drafts created, approvals (with the approver name you gave), schedules, sends started, published, sends that need review, reconciliations, recorded results, emergency stop changes, ideas added, promoted or dropped. Each shows a plain label, the relative time, the post’s platform, account and the usual two-line excerpt; an event’s stored detail (which can quote a provider’s error) is never shown. Checks, voice-checks and voice profiles leave no record, so they do not appear. Turn on Auto-refresh (Settings, or the link on the Claude page) and the feed follows a Claude Code session every 20 seconds while you are not typing.

Press ? for the list. Ctrl K (or Cmd K) opens Jump to. g then o/q/s/p/r/m/a/c/i/w jumps to Overview, Queue, Schedule, Posted, Results, Campaigns, Accounts, Channels, Ideas or Work with Claude; Ctrl Enter in the Claude composer copies the prompt; j/k move through the queue or the posted list and Enter opens the selected post; [ and ] go to the previous or next post; / searches the queue or the posted list; r refreshes; t cycles the theme; Esc leaves a field. Shortcuts are ignored while you type in a field.

Under 860 pixels wide the sidebar becomes a drawer (the 44 x 44 menu button, or More in the bottom bar), and a bottom bar holds Overview, Queue, Posted and Results with their counts; Schedule joins them while something is approved, scheduled or sending, and is under More otherwise. The header is one row: menu, search and settings. Under 640 pixels, post rows put the status and time on the first line and the text under it, tables become stacked labelled cards, long labels and commands wrap instead of widening the page, and buttons, links, menus and toggles are at least 44 x 44 px. Every page, including post pages whose text is one 120-character word, was checked with no sideways scrolling at 375 px (Playwright, 2026-10-21) and at 375 and 390 px by tests/test_ui_narrow.py (headless Chrome, skipped when none is installed). An earlier version of this page said every page had been checked at 390 px; on 2026-10-21 two pages (Overview and Work with Claude) were found 62 to 92 px too wide on a 375 px screen and fixed. It has not been tried on a real phone.

Print a post page, or save it as PDF from the browser’s print dialog, to keep a copy of what you reviewed. The printout leaves out the navigation and buttons, and opens the collapsed sections, so it includes the approval details (payload hash, approver, channel) and the offline preview next to the exact text.

The settings menu in the header has the Theme (auto follows your system, light or dark) and an Auto-refresh checkbox (each checkbox row is a 44 px tap target) (off by default; reloads the current page every 20 seconds while the tab is visible and you are not typing in a field). Alerts (off by default) asks your browser for permission to show notifications, then checks once a minute while the tab is open and notifies you when more sends need review or a new readiness block appears. A notification carries counts only, never post text, account names or links, so nothing private shows on a lock screen. The three choices are remembered in your browser’s local storage, which holds nothing else apart from the unsent text of the Claude composer; if storage is blocked, the dashboard still works and simply forgets them. Under studio the composer runs on another port (another origin, so it cannot read this storage): every link to it carries the theme in its address fragment (&theme=dark), and the composer keeps that choice itself.

The server is a small module built on the Python standard library, with no new dependency.

  • Loopback only. It binds to 127.0.0.1. There is no --host option, and the server refuses any other host.
  • Unguessable address. Every request must carry the random token in the URL path; anything else gets a bare 403. The token is not logged and the page sends no referrer.
  • Studio links. Under studio the dashboard and the composer are still two servers with two tokens and all of their own checks (this one stays read-only and GET-only). Each learns the other’s full address only from a token-protected JSON answer of a server in the same process, never from the page’s HTML; both send Referrer-Policy: no-referrer, links carry rel="noopener noreferrer", the composer’s token stays in the URL fragment (never sent over the network), and neither page may fetch from the other (the Content-Security-Policy allows only its own origin).
  • No DNS-rebinding or cross-site reads. The Host header must be the loopback name and port; cross-origin and cross-site fetch requests are refused.
  • One request per connection. The server answers HTTP/1.0 and drops a client that sends nothing for 10 seconds, so idle connections cannot pile up. A malformed request gets a plain 400, never a traceback.
  • Read only, twice. Only GET/HEAD are accepted (anything else is 405), and the database is opened with SQLite mode=ro and query_only, so even a bug cannot write. The ideas inbox is only read, and a missing one is never created.
  • No model, no process. The Claude page builds a text prompt from local ids (reachweaver/ui_prompts.py); it never starts Claude Code, calls a model or contacts Anthropic. What you type reaches the server only as a query parameter of that one request (printable text up to 4000 characters), is not logged or stored, and comes back inside the prompt, which the page puts in a read-only text box as a value, never as HTML.
  • Untrusted text stays text. Post text, errors and URLs are inserted into the page as text, never as HTML, and a strict Content-Security-Policy forbids inline scripts and styles, remote resources and framing.
  • Redacted. Everything passes through the same redaction as ops-summary. Like doctor and health, it checks whether a credential variable is set, but a value is never displayed, returned or logged.
  • No network from the dashboard. The only socket is the local listener.

Tests in tests/test_ui_data.py, tests/test_ui_server.py, tests/test_ui_companion.py and tests/test_ui_narrow.py check each of these offline, including that every command a prompt or an owner card suggests parses with the real command line, that no prompt’s start command is owner-only, that no credential or environment value reaches a prompt, that the database file is byte-identical after every endpoint is called and that the dashboard code references no send, approval or credential function.

If another program on your computer runs as you, it can read the same files the dashboard reads; the dashboard does not add a login. It is meant for your own, single-user machine.

Also in this release: easier terminal output

Section titled “Also in this release: easier terminal output”
  • reachweaver show POST_ID at a terminal prints a review sheet: the exact text in a box, the length meter, the approval state in a sentence, attachments and the commands you could run next. Piped or with --plain it prints the same JSON as before.
  • A mistyped command gets a short suggestion (unknown command 'aprove'. Did you mean: approve, ...) instead of a list of every command.
  • reachweaver completion bash (or zsh) prints a Tab-completion script for commands, the actions of a command that has its own (idea add|list|drop|promote), options and fixed choices (idea list --status <Tab>). Load it with eval "$(reachweaver completion bash)" or save it where your shell loads completions. It reads no database and runs nothing; regenerate it after an upgrade.
  • reachweaver start looks at your workspace, accounts file, database and queue, ideas inbox and metric snapshots and prints the exact next command. The easiest path, the browser composer (share --web --open), comes first; outside a workspace it suggests reachweaver workspace --init . (and copying config/accounts.example.json only when that file is in the folder); accounts that still carry the example placeholders are named (“N account(s) still use example placeholders — edit config/accounts.json”) instead of being counted as configured; waiting drafts point to your guided reachweaver review; open ideas point to idea list --status open, and recorded snapshots to report --since 30d --format markdown. It runs nothing and never creates the database. --json gives the same guidance for scripts. Typing reachweaver alone prints the same guidance and points to reachweaver --help and reachweaver --help all, instead of a usage error.
  • reachweaver --help (or reachweaver help) lists the 16 everyday commands, one plain line each. reachweaver --help all (or reachweaver help all) lists every command grouped by task, with the global options. reachweaver COMMAND --help is unchanged, and reachweaver help COMMAND prints the same.
  • In a terminal, list prints an aligned table with the status coloured (the id column is never shortened, so you can copy it), and check colours OK/BLOCKED. Control characters in stored text are replaced before they reach the terminal. When output is piped or redirected, the format is exactly what it always was, so scripts keep working. Pass --plain before the command (reachweaver --plain list) to turn colour and tables off in a terminal too.
  • At a terminal, a few common errors add one “Next:” line (missing accounts file, unknown post id, missing database). Scripts see only the ERROR: line.
  • reachweaver reads REACHWEAVER_DB and REACHWEAVER_ACCOUNTS, so you can set them once instead of repeating --db and --accounts.

The NO_COLOR convention is not read yet; use --plain.

Symptom Cause and fix
Database ... does not exist Run reachweaver init first; the dashboard never creates a database.
predates this version's schema Run reachweaver init once to upgrade it, then retry.
Browser shows {"error": "forbidden"} The token in the address is missing or from an earlier run; copy the new address from the terminal.
The accounts page says the accounts file is missing Copy config/accounts.example.json to config/accounts.json, or pass --accounts FILE.
The page is empty or stale Press Refresh (or r); the dashboard reads the database on every request.
Database ... is not a ReachWeaver database or Cannot read The file is not a ReachWeaver database; ui checks this before printing an address.

See also: Quickstart, Security checklist, Troubleshooting.