The Ledger

October 11, 2026

Mercury v1.1.0

Added

  • VisiblePipeline Bcc mail forwarded in from a personal address now gets a verdict report that carries the recipient’s address. Mercury used to read only the To and Cc headers, so this mail had no address and an unsubscribe from its report card could not fill in a confirmation form. It now also looks in X-Original-To, X-Forwarded-To, Delivered-To and X-Envelope-To, and in the for clause of a Received line, wherever a forwarding hop left the address. Only an address listed in identities.json counts, so a list address, a third party or the forwarding alias is never picked. Mail whose headers hold no such trace still has no address. Redeploy the backend to pick this up. (#82)

  • VisibleTelegram The Telegram card for a proposed unsubscribe now shows which address it will run for. An “Address to unsubscribe” line names the recipient address, or says none was found and that a form asking for one will fail, so a missing address shows up before Approve is pressed. The prompt sent to the browsing agent now starts with the request to unsubscribe that address. Redeploy the backend to pick this up. (#81)

  • VisibleDashboard The dashboard opens at the site root and installs as an app. It lives at https://mercury.rpgm.tools/, and /dashboard and /dashboard/login redirect there. The API paths are unchanged. Installed, it gets a home-screen icon with a winged letter and runs as a standalone app. Offline, it opens from a cache and shows only the last 24-hour counts.

  • VisibleDashboard The dashboard has a phone layout. A bottom tab bar switches between Briefing, Activity, Review, and More, with a badge for open items. Message rows show as cards, message detail opens as a bottom sheet you can swipe away, and pulling down refreshes.

  • VisibleDashboard The Briefing home page leads with what needs you. Open action items and the review sample come first, as letters with Mark done and Open message buttons. The 24-hour counts, recent decisions, categories, and trends follow.

Changed

  • InternalTelegram The /telegram/relay endpoint now answers the forwarder right away and handles the tapped button or reply as a background task. Before, it answered only after the whole handler finished. An approved unsubscribe or mailbox action can keep the browsing agent busy for a minute or more, so the forwarder gave up after 30 s and logged a relay timeout while the action was still running, even though its result still reached Telegram. A failure in the background task is logged. Redeploy the backend to pick this up. (#83)

  • VisibleDashboard The dashboard has a new look and theme controls. The Courier’s Desk style uses warm ink and brass, with Fraunces and Alegreya Sans fonts served from the dashboard itself. A theme button cycles through follow the device, light, and dark. A new Animations setting under System follows the device’s reduced-motion preference unless you set it.

  • InternalDashboard The dashboard page is now static files served by the Worker. The source in worker/ui builds into worker/public with npm run build, which npm run deploy runs first. The Worker serves only an allow-listed set of paths, under a strict content policy with no inline script or style. The page and its files need no Access login, while /dashboard/api/* still does. An expired Access session shows a sign-in link instead of a failed load. GET / still answers a plain “OK” unless the request accepts text/html, and /healthz is new. The daily digest links to the root.

Fixed

  • VisibleTelegram A brief proposal now lists any domain from the request that it leaves out. A request naming paypal.com and gog.com could come back as a whitelist proposal for paypal.com alone, and after that proposal was approved, gog.com kept being soft-deferred with nothing on the card to show it had been dropped. When a proposal changes a sender list, any domain named in the request, the new message, or the question it answers that no proposed selector covers now appears in the card’s caveat, with a prompt to reply and give it a disposition. Domains that appear only in the flagged message are not checked. Redeploy the backend to pick this up. (#85)

  • VisiblePipeline Mail whose plain-text part is only a placeholder is now judged on its html content. Some marketing platforms put a line such as “Plain text version not available” in the text part, and Mercury passed that line to the classifier and the judge instead of the html, so they saw little more than the From line and the subject. A newsletter whose subject was a promo code with a 24-hour expiry read as an account-security scare, came back UNSURE, and was soft-deferred and paged as URGENT on every delivery, even after its sender was approved. A text part that is empty, a placeholder, or under 80 characters beside an html part at least three times longer is now replaced with a plain-text rendering of the html, with scripts and styles dropped and links kept as “label (url)”. A real text part is used as before. Html-only mail is judged as rendered text rather than as raw markup cut off at 6000 characters. Flagging from Thunderbird through /rules/propose reads the body the same way. Redeploy the backend to pick this up. (#84)

  • VisiblePipeline An unsubscribe whose route passed the domain check no longer fails before the agent visits it. The unsubscribe prompt told the browsing agent to post its own progress updates to Telegram, and the execution session has no way to send them. An agent that took this literally stopped and returned FAILED, as an unsubscribe from a Mailchimp-hosted list did. The prompt now says the backend sends those updates and that being unable to send them is no reason to stop. The backend still sends the “working on it” message before it calls the agent. Redeploy the backend to pick this up. (#80)

Downloads