🏡


  1. November 10, 2026
    1. 🔗 OmniNull/OmniWM Canary 20261110-0412 (bcc6b419) release

      Automated canary build of main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.

      See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.

      • Commit: bcc6b419bc5c
      • Base tag: canary-20261109-0655-42575760350-1

      Changes since canary-20261109-0655-42575760350-1

      • bcc6b41 Derive the overview close test bounds from the transition's constants
      • a459e36 Merge pull request #1160 from rickythefox/fix/overview-close-handoff
      • 1689289 Remove doc comments from Sources
      • 4fe75d2 Merge pull request #1155 from rickythefox/lint/no-source-comments
      • cdd98ea Merge pull request #1161 from rickythefox/chore/coderabbit-no-docstrings
      • bbcb02f Let the notifications bell open macOS's Notification Center
      • 9d68ed2 Hide the notifications Notification Center itself leaves out
      • 6ef0626 Remove narrating comment from .coderabbit.yaml
      • 4750d2c Disable CodeRabbit docstring coverage check
      • 61b867d Merge pull request #1105 from msanft/codex/notification-filtering
      • 5a00177 Test that cancelling a finished close reveal keeps the overview transparent
      • dbcad0a Remove overview close blink and end-of-close stall
      • d6d777a Match notification preferences regardless of bundle ID case
      • 96ca48c Preserve notification integrity when preferences exclude records
      • 786d25c Filter notification history using current app preferences
      • ad29e90 Warn on doc comments in Sources
      • 1040de2 Show the active layout on the OmniWM button of OmniShell bars
      • 3258bb4 Exclude silent notification records from history and dismissal
      • bea07a8 Name the readable text contrast and drop a source comment
      • fc61246 Merge pull request #1147 from rickythefox/fix/solid-black-bar-palette
      • a9e397d Draw solid black bars with the dark palette in light mode
    2. 🔗 anthropics/claude-code v2.1.322 release

      What's changed

      • Added fast mode on Vertex in the global, us and eu regions, falling back to standard speed if Vertex refuses it
    3. 🔗 backnotprop/plannotator v0.28.59 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.58 | Start Codex from New message, an Agents section in the sidebar, start an agent in a folder on any drive, play audio attachments and comment at a moment, Claude Code's Plannotator tools work on Windows
      v0.28.57 | Pin artifacts, and see every artifact on one page, filter the list by project, date or agent, a thread shows its pull requests and their state, choose what the sidebar shows, and in what order, Ask AI starts from Side in the selection bar
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner

      What's New in v0.28.59

      TL;DR

      • Changed: The Agents section in the sidebar is quieter: a plain heading when closed, no panel behind it
      • Changed: Machine names show only when agents run on more than one machine
      • Changed: Agent icons are always gently alive, and lean toward your pointer

      0.28.59 is a small release that finishes the sidebar's Agents section, which arrived in 0.28.58 in an earlier form. It has 4 PRs, all from @backnotprop. One is a test fix, and one changes nothing you see yet.

      Plannotator Inbox

      A quieter Agents section

      Closed, Agents is now a plain heading row like Projects: no panel behind it and no buttons on it. Open it and the two add buttons (start an agent, link a machine) appear on the heading, with the agents listed under it. The tinted panel behind the open section is gone too.

      A machine's name now shows only when agents are running on more than one machine. With one machine, the agents are one list with no name above them. A machine with no running agent shows nothing. A machine that shows no name also shows no filter, sleep note or Update word in the sidebar; those stay in Settings → Machines. #3025

      Agent icons that stay alive

      Each agent's icon in the sidebar now moves a little all the time, in its own way and at its own pace: Claude's star turns, Codex's prompt blinks and types, Pi's blocks ride a wave, OpenCode's frame sways. While your pointer is in the sidebar, each icon leans slightly toward it. The icons no longer change look for working, waiting or ended; the hover card still says what an agent is doing. With reduced motion on, they are still. #3018

      Not yet on

      Code review in the Inbox stays off, and its switch stays hidden until a later release. For people who have it on, Reviews and the Pull requests board now show a small profile picture by each person's name, from GitHub or GitLab, with their initial when there is no picture. #2986

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      • Inbox: a face by every person's name in Reviews and the PR board by @backnotprop in #2986
      • List filter test: a fixed clock, so Today holds at every hour by @backnotprop in #3031
      • Inbox agent marks: always alive, a subtle lean toward the pointer, no state looks by @backnotprop in #3018
      • Inbox Agents section: closed, it is a plain heading (no panel, no Add buttons) by @backnotprop in #3025

      Full Changelog : v0.28.58...v0.28.59

    4. 🔗 blader/humanizer Humanizer v4.0.0 release

      Humanizer 4.0.0 lets the skill add a specific detail where the text is generic, and it rewrites the skill's own instructions and examples to be clearer.

      A rewrite may now contain a detail that was not in your text. If you rely on the old rule, stay on v3.1.0.

      What changed

      • The skill no longer forbids adding facts. Where the text is generic, it now adds a specific detail it knows to be true. It still keeps every claim the original made and treats a lost or changed claim as an error. This reverses the no-invention rule from 2.9.0. Patterns 14 and 17 follow the same change.
      • Reworked 15 "After" examples in SKILL.md and both README examples. Several were vaguer or stiffer than the text they replaced, used phrases from the skill's own watch lists, or changed a stated fact.
      • File mode now reads the whole current file before editing, even one written in the same session. Its summary says how many sections it reviewed, so a partial pass is visible (#326, #327).
      • Text being edited can contain fake closing tags or notes from an "operator" or a "system message". The skill now treats those as material to edit, never as instructions (#317).
      • Rewrote unclear sentences in SKILL.md and README.md. Coined terms such as "riders" and "shape edits" became plain words, and sentences that only announced or repeated a neighbor are gone. Step 3 now checks for dropped or changed facts first. Pattern 15 is now "Shallow -ing phrases". The README gives /humanizer as the only command (#330).
      • Added a blank line above each pattern label in SKILL.md so GitHub shows every label and example on its own line (#329).
      • The skill description no longer cites Wikipedia. The credit stays in the Source section and the README (#321).
      • Added a pi package manifest, so pi install git:github.com/blader/humanizer installs the skill (#315).
      • Removed the $schema key from the Claude plugin manifest, which caused a sync warning (#307).

      Thanks to @marlandoj, @mathewgeejo, @AYastrebov, @thanhnguyentung95, @devilliersdutoit, and @Josephqaz for the fixes and reports in this release.

    5. 🔗 backnotprop/plannotator v0.28.58 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.57 | Pin artifacts, and see every artifact on one page, filter the list by project, date or agent, a thread shows its pull requests and their state, choose what the sidebar shows, and in what order, Ask AI starts from Side in the selection bar
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts

      What's New in v0.28.58

      TL;DR

      • New: Start Codex from New message
      • New: An Agents section in the sidebar, in place of Machines
      • New: Start an agent in a folder on any drive
      • New: Play audio attachments and comment at a moment
      • New: Claude Code's Plannotator tools work on Windows

      New message can now start Codex, and it can start an agent in a folder on any drive, not only under your home folder. The sidebar's Machines section is now Agents, a list of the agents that are running. Audio attachments play in the Inbox and take comments, questions inside an attached Markdown file can be answered, and Claude Code's Plannotator tools now work on Windows.

      0.28.58 has 24 PRs: 22 from @backnotprop, one from @uvw, who brought the Claude Code tools to Windows, and one from @hydn-n, who fixed the T3 Code hook. Two are test and release changes, and two change nothing you see yet.

      Plannotator Inbox

      Start Codex from New message

      New message can now start Codex , as it already starts Claude Code and Pi. In To, under "Start a new session in", pick the Codex row, pick a folder, and send. The thread shows "Codex is working" with Stop , and each reply you send goes to that Codex session. After a Stop, your next reply starts it again where it left off.

      Codex is listed only when it can start: codex is installed (0.149 or newer), you are signed in, and its config has the Plannotator Inbox tool. Codex runs with your own config, login, model and sandbox, and the Inbox never writes to Codex's config. When Codex asks to run a command or change a file, the thread shows a card with Allow once , an allow for this session (for example "Allow file edits for this session") and Deny.

      Settings → Agents → Codex has a new Account line. It shows your plan and how much of the 5 hour and weekly limits you have used, "API key", or "Not signed in" with the command to run. It never shows an email, and it never signs you in or out. #3007

      Agents in the sidebar

      The sidebar's Machines section is now Agents. It lists the agents that are running, each with its mark and its name. An agent that has ended is not listed. Click an agent to open its thread. A running agent with no thread opens New message to it. Hover a row for a card with the agent, its project and machine, what it is doing (Working, Idle or Waiting on you), when it started and when it was last heard.

      With machines linked, each machine's name sits above its agents. A click on the name still shows that machine's threads, and its Update word is still there. With no machine linked, the agents are one list. The section shows no counts.

      The heading has two buttons that are always visible. Add agent (+) opens New message with a new session already chosen in To. Add machine opens Settings → Machines.

      The marks move. Click a mark to swap it for another face: Glass, Yellow, Transparent or Face, then back to the agent's own. The Inbox keeps your choice for that agent in this browser. #3012, #3000

      Start an agent in a folder on any drive

      New message could start an agent only in a folder under your home folder. It can now start one in any folder except system and hidden ones, so an external or network drive works too.

      In New message → To → New session → in ▾ , each connected drive has its own row after "Another folder…", and a network drive says so. A drive's row opens the folder browser at that drive, with a row of places at the top (Home and each drive) to switch between them. You can start in the drive's own top folder. A project on a drive shows as "Studio SSD › footage-tools".

      When a drive is unplugged, its projects stay in the menu, struck through, with "Archive isn't connected. Connect it to start here.", and can't be picked. A slow network drive shows "Reading Backup…", and after 3 seconds "Backup isn't responding" with Try again. On a Mac, in the Inbox window on that same Mac, Choose in Finder… opens the system folder picker and fills in the folder you pick. #3004

      Play audio, and comment at a moment

      An audio file in a thread used to be a download. It now opens in a player with play and pause, a bar to scrub and the time, and for a file of 12 MB or less the bar draws the sound's waveform. You can comment at a moment, as on a video: dots on the bar mark the comments, a click on a dot jumps there, and the agent gets each comment with its time ("At 0:12"). It reads MP3, AAC, M4A, WAV, Ogg, FLAC and sound-only WebM.

      The tile in the message reads like "WAV audio · 0:47 · 2.0 MB" with Play. On a narrow tile, a video's or a recording's line now drops whole parts (the size first) instead of cutting a word, and the comment count sits before the size. #3011, #3013

      Answer questions inside an attached file

      A question an agent writes inside an attached Markdown file was only text. It is now a card you answer in the file, the same as a question in the message: pick, Other, Add note, Skip or Accept recommended. These questions count in the thread's open questions, show in the open-questions list as "11:01 AM · in plan.md", and go out with the same Send. The agent gets your answers under a heading that names the file.

      A file that changed after it was sent shows its cards locked, and the open- questions list opens the version that was sent. Messages from before this release stay as they were. #3001, closing #2828 reported by @zane668

      Click the list's edge to hide it

      Beside an open thread, click the edge of the list column to hide the list and the sidebar and give the thread the whole window. Dragging the edge still resizes it, and its tooltip reads "Click to hide the list, drag to resize". This replaces the hide icon in the thread's header. ‹ Inbox, Escape and ⌘B bring the list back as before. #2994

      Smaller changes

      • Side in the selection bar is now an icon with no word. The icon is the mark of the thread's agent: Claude's in a Claude Code thread, Codex's in a Codex thread. Its tooltip reads "Side chat with Claude" (or the agent's name). An agent with no mark of its own keeps the two speech bubbles and "Side chat". What a press does is unchanged. #3016
      • A one-time tip, "Make the sidebar yours", points at the sidebar and says you can hide and reorder its items from a right-click. You see it once, on a computer, if you have used the Inbox for a day or more and never saved a sidebar layout. Got it or Escape closes it. #3014
      • A file tile in a message always says Open , or Play for a video or a sound. Before, the tile of the file open beside the thread changed to "Open beside". The highlight still marks which file is open. #3017
      • Send buttons no longer show the ⌘↵ hint: no tooltip on the reply box's Send, and no keycap on New message's Send. ⌘↵ (Ctrl+Enter) still sends, and Settings → Keyboard still lists it. #3009
      • A video or a sound inside an HTML attachment now plays. Before, the Inbox blocked media that the page carried inside itself. Media still never loads from the web. #3003
      • A code block that scrolls sideways (a table, a diagram, aligned config) now keeps its background across the whole line. Before, the part you scrolled to sat on a darker shade. Plan review and code review's Markdown preview get the same fix. #2995

      Claude Code

      The Plannotator tools work on Windows

      Claude Code's Plannotator tools now work on Windows. Before, a Windows session always used the classic hook: it had no Inbox tool unless you added the MCP command by hand, and the session never showed in the Inbox. Now a Windows session with the plugin shows in the Inbox, an Inbox message arrives as a turn, and the reply comes back, with nothing else to set up.

      It runs through Git Bash when Git for Windows is installed, and through Windows PowerShell 5.1 otherwise. Set PLANNOTATOR_MOD_SHELL=sh or powershell to choose one. If neither shell passes a small check when the session starts, the tools stay off and the classic hook is used, as before. macOS and Linux are unchanged. #2893 by @uvw, closing #2892

      Removals inside longer commands skip the prompt too

      With CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS set, Claude Code in bypass mode skips the prompt for a removal it cannot prove safe. Since 0.28.52 that works with Plannotator installed, but two cases still showed a prompt that Claude Code alone does not show. One was a removal inside a command of several parts, such as cd /tmp/x && rm -rf logs/*/* or two removals in one command. The other was any removal while a PreToolUse hook that could run for Bash was installed, even one that only logs.

      Both now run with no prompt. The prompt stays when a part of the command asks for another reason, when a PreToolUse hook itself asks, and beside a PermissionRequest hook or an ask or deny rule on Bash. With PLANNOTATOR_MOD_DEBUG=1, the debug log now says what kept a prompt. #3023

      T3 Code and Pi

      • The T3 Code hook works with T3's new entrypoint. T3 Code now starts Claude with CLAUDE_CODE_ENTRYPOINT=t3-code. The optional T3 hook (install.sh --with-t3) opened only for the older sdk-… names, so in a T3 thread it never ran, and "Ask this session" from a review did not reach the thread. The hook now opens for both. An install made with --with-t3 gets the new hook on its next update. If you registered the hook by hand with t3-hook install, run that command again. #2782 by @hydn-n
      • Pi: no TLS warning on a Bun build that already has the fix. Plannotator warned at every Pi start when Pi ran on a Bun older than 1.4.4, even on a build that carries the October 2026 TLS fix, such as Pi-Bolt on Bun 1.4.3. It now also checks the certificates the Bun build carries, and stays quiet when the fix is there. #2996, closing #2914 reported by @Battlelamb

      Tab icon: Glass, Yellow or Face

      The Favicon choice (plan review's Theme tab, and the Inbox's Settings → General → Appearance) is now Glass (the default), Yellow (the goggles with a yellow glass) or Face. The P icon from 0.28.57 is gone. If you had picked P, you see Glass.

      The Inbox asks once, "Which favicon do you prefer?", with the three icons at full size and in a browser tab. A choice previews on your tab, and the button saves it ("Keep Glass", "Use Yellow" or "Use Face"). Escape changes nothing. You see it if you used the Inbox before this release and never chose an icon, or had picked P. A new install is not asked. You can change it in Settings at any time. #3005

      The anonymous daily ping

      The anonymous daily ping now also says which favicon is set in Settings (glass, yellow or face, or none if you never picked one). The privacy page lists it. Nothing else about the ping changes, and NO_ANON_PING still turns it off. #3002

      Not yet on

      Two changes show nothing to most people yet.

      Starting an agent from the Inbox stays off on Windows. This release makes it able to work there: Windows paths, PATH and PowerShell commands. #3008

      Code review in the Inbox stays off, and its switch stays hidden until a later release. For people who have it on, Settings → Capabilities has a new Chapter diagrams switch under Code review, on by default. Off, agents are no longer told to draw a diagram for a chapter, and a diagram that still arrives starts folded under its Diagram header. #2985

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      New Contributors

      Contributors

      • @uvw asked for the Claude Code tools on Windows in #2892 and then built them in #2893: Windows paths, a Git Bash path and a Windows PowerShell path. This is their third PR here, after the Board's project names and the Markdown code fixes.
      • @hydn-n found that the T3 Code hook never ran under T3's new entrypoint and fixed it in #2782, with a live check in T3 Code. They also wrote the T3 Code wake that shipped in 0.28.49.

      Community

      • @zane668 reported in #2828 that questions inside a Markdown attachment could not be answered. #3001 fixes it.
      • @Battlelamb reported in #2914 that the Pi TLS warning fired on Pi-Bolt builds that already have the fix. #2996 fixes it.

      Full Changelog : v0.28.57...v0.28.58

  2. November 09, 2026
    1. 🔗 Simon Willison Locating the source of a mysterious beep with Claude rss

      Our house has a box room, full of boxes that we still haven't unpacked from our last move. A couple of weeks ago something in that room started intermittently beeping. The beeps were far enough apart that standing in the room and trying to determine the source of the noise was frustrating, and I really didn't want to dig through every one of those boxes. So I had Claude Code build Beep Locator, a software system for triangulating the source of a mysterious beep using multiple devices scattered around the room.

      Here's what Beep Locator looks like after it has been running for a while:

      Screenshot of a web app that uses several phones, tablets and laptops as microphones to locate a mystery beeping sound in a room. The left column has an "Add a listener" panel with a QR code and join link, a "Controls" panel with buttons including "Calibrate", "Test beep" and "It just beeped!" plus a "Listen for beeps" checkbox, and a "Mystery beep" note reading "3345 Hz · 3 confirmed · remembered across sessions". Below that, a "Devices" list shows five color-coded listeners (Simon iPhone, New iPad, Old iPad, MacBook Pro, Surface Ultra), each marked "✓ mic working · ✓ speaker working". The main area is a gridded map with a 1 m scale bar that shows the five devices as colored dots and earlier sounds as small timestamped markers. A pink shaded circle near the MacBook Pro is labeled "mystery beep · 2 hearings · within ~41 cm", and beside it a dashed plus marker suggests "add a listener here? could tighten the mystery beep's position by ~12%". Below the map, a "Mystery beep loudness warmer / colder" panel shows a bar for each device: Surface Ultra is loudest at "-6.0 dB ▲ +11.6 dB warmer", with the note "about 6 dB louder means roughly half the distance". At the bottom, a "Sounds located" table lists recent claps and beeps with coordinates, or the warning "arrival times are not physically possible (echo or a different sound?)".

      You run Python web server to show the primary UI, and then use the QR code or URL to connect as many devices as you can spare to act as listeners - I was using two iPads, a phone, a MacBook Pro and a Surface Ultra.

      The devices then play noises to each other to help estimate their locations. This didn't work particularly well, so I added a "Rough mode" where you can drag their icons around in the space to provide rough locations which are then adjusted based on those sounds.

      Once that's set up, the devices all listen for the beep!

      I added a clapping mode too so I could test it by clapping my hands in different locations around the room - displayed as diamonds on the map. This helped me gain confidence that it was capable of locating a sound.

      Beeps show up on the map as an X, plus a line in the "Sounds located" log. You can replay these sounds (from each device in turn) to confirm they are the mysterious beep you are looking for, then click "This is the mystery beep" to mark them as such.

      Once you've confirmed the mysterious beep frequency the system will listen out for it, measure the interval between beeps, and use the triangulated locations to lock down the most likely location on the map.

      The system worked as intended. It gave me the position of the beep to within about 40cm, then I dug through that specific pile of boxes and found an ancient carbon monoxide detector that desperately wanted its batteries replaced.

      How it works

      When I started working through this problem with Claude it quickly dug up BeepBeep: A High-Accuracy Acoustic-Based System for Ranging and Localization Using COTS Devices, a 2007 paper by Chunyi Peng, Guobin Shen, Yongguang Zhang, Yanlin Li, and Kun Tan. Here's that paper's abstract:

      We present the design, implementation, and evaluation of BeepBeep, a high-accuracy acoustic-based ranging system. It operates in a spontaneous, ad-hoc, and device-to-device context without leveraging any pre-planned infrastructure. It is a pure software-based solution and uses only the most basic set of commodity hardware – a speaker, a microphone, and some form of device-to-device communication – so that it is readily applicable to many low-cost sensor platforms and to most commercial-off-the-shelf mobile devices like cell phones and PDAs. It achieves high accuracy through a combination of three techniques: two-way sensing, self-recording, and sample counting.

      That sounded exactly like what we needed to build!

      Beep Locator runs a Python web application server that does most of the work. The listening devices then connect to that server via WebSockets and present a UI which requests browser microphone access. The listeners mainly work by recording a 60 second buffer of recent audio. They also run a simple beep detection algorithm (see detector.js), which uses Fast Fourier Transform and a high-pass filter to identify potential beeps. It sends these events to the main server.

      When a beep is reported, the server has a device play a short chirp (the device with the lowest round-trip time to the server), then asks every listener upload a clip from about 0.6s before the beep to 0.8s after that chirp. This chirp allows the clips to be aligned with each other, a crucial step in locating the beep.

      How I built it

      I started this project using Claude Code Cloud via my iPhone, with Opus 5.5 running in Extra thinking effort mode. Here's that shared starter session, which began with this prompt against a newly created empty GitHub repository:

      Write out a problem.md file describing the problem we want to solve

      There is a device beeping in a room and I cannot find it

      I want to set up several devices - laptops, phones, iPads - around the room all listening at the same time and have them help triangulate where the beep comes from

      There needs to be a Python web app which coordinates it all - one device shows a web page for the app, other devices join a URL which turns them into listeners - all via browser WebAudio and WebSockets back to the Python server app

      Ideally I wouldn't need to manually input the relative locations of the devices - it would be amazing if they could play sounds to each other in order to locate each other in 2D space - is that even possible though?

      That got me this problem.md file. As part of writing that up Claude found and read the BeepBeep paper, which is described in that file.

      The research looked good, so I told it:

      Ok try and build it, add a mechanism so you can send new code to the listeners which they will then run automatically - that way I can set everything up in the room and then leave you alone to continue hacking and experiment while I do something else

      That got me to this point - most of the system was built, but nothing had actually tried running it yet.

      I cloned the new repository to my laptop and fired up Claude Code... and then Fable 5.2 was released, and this project seemed like an excellent opportunity to put that through its paces.

      I had Claude Code on my laptop start the server running, then made sure it could both see what was happening and make live changes to the software as it ran.

      This was already baked into the software: Opus 5.5 had built an installModule() method on the listeners that could be triggered over the WebSocket connection, meaning the admin server could execute arbitrary new code on any of its clients.

      On some devices, web pages that listen on the microphone request user permission any time the page reloads. The hot-swap module mechanism meant that we could deploy new code without having to manually interact with each of the listening devices in turn.

      From that point on my involvement was mainly to sit by the laptop chatting with Fable 5.2 about what was going on, and occasionally requesting new features. Here are some of the feature prompts I ran:

      I think we need to make it so I can drag things around on the map in “rough mode”, where my job is just to put them roughly where they are, then switch out of rough mode and it attempts to get them accurate

      This gave me the ability to drag listeners around the map.

      what’s a good way for me to test this I wonder? Can we have it listen for claps, then I could clap and it could identify the location of the clap? [...]

      Claps should use a different symbol on the map than beeps

      That added the thing where any time I clapped it would show on the map as a different symbol from the beeps.

      each symbol on the map should include a HH:MM:SS timestamp

      That made it easier to spot which symbol likely reflected which real-world sound.

      The log should show beeps and claps with their timestamps AND have a little play button which, when clicked, replays the recorded noise from each of the listeners in sequence (with clear text on screen showing which listener recorded which snippet) while temporarily turning off microphone recording while that replay plays

      Now I could replay sounds, making it much easier to identify which recorded clip was the mysterious beep I was looking for.

      There should be a button next to a recording for “This is the mystery beep” - then I can hit replay to see and then confirm it was the mystery beep if that’s the one I am looking for

      Then the system can categorize noises in the future to see if they are likely that same mysterious beep and use that information to build a more accurate idea of where it is

      At this point I was getting close - I had a solid idea of where the beep was coming from, but wouldn't it be neat if I could reposition the listeners around that point to get an even finer location?

      I want a feature for this, I don’t want to have to restart each listening device etc, I want to be able to click a “Reposition the devices” button which lets me switch into repositioning, then I click “Repositioned” and it puts me into Rough mode and asks me to roughly locate them, then I do that and click, then it starts up again. The previous session can be read-only viewed through the app.

      And since I had one spare device, I then said:

      add a feature where the map includes a spot that is a suggestion for a location that it would be useful to add a listener at - based on data collected so far

      Giving Claude Code ears

      I think the most interesting part of this project is that I demonstrated it's possible to give Claude Code ears.

      Claude doesn't have native audio input (yet), but it can run JavaScript and Python code that can analyze audio captured by a microphone.

      I told it to run a web server with WebSocket connections to multiple listening devices, then had it both run a WebAudio microphone on those devices and hook them up so they could be sent fresh JavaScript code to execute via that WebSocket.

      Then I could pretty much leave Claude alone, hacking away at the problem, querying the audio logs, and reconfiguring its ears to help it solve the problem.

      I'm reminded of a similar hack I heard about at GitHub Universe a few weeks ago, where Martin Woodward told me he had been debugging the GitHub Universe Badge computers by plugging them into a computer via USB-C and then pointing a webcam at their screen, so his coding agent could tell if updates were working correctly or not.

      Figuring out ways to let coding agents perceive the world around them is a whole lot of fun.

      You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options.

    2. 🔗 earendil-works/pi v1.5.1 release

      New Features

      • Shell login and logout : use pi auth login <provider> and pi auth logout <provider> without starting a session, with API-key and no-browser sign-in options. See Credential commands.
      • Idle prompt cache warming : eligible caches now stay warm for up to 30 minutes between runs when a refresh is expected to pay for itself. See cacheWarming.
      • Anthropic message threads : requests send only new messages while the server continues the conversation, with full-request fallback when earlier context changes. See Anthropic compatibility.
      • Richer Mermaid diagrams : pie charts, author-defined styles, clickable labels on supported terminals, and diagrams in expanded branch and compaction summaries. See Display settings and Markdown transformers.
      • GitHub Copilot classifiers : call Microsoft-Decision-1 through codemode models.classify() for typed decisions and probabilities. See Use classifier models.
      • Package update summaries : pi update --extensions reports each package's npm version or git commit change and distinguishes unchanged, skipped, and warned updates. See Update Pi or packages.

      Breaking Changes

      • Custom GrepOperations.readFile callbacks are no longer called for context lines. The field remains accepted as optional and deprecated so existing integrations still compile. The grep tool now takes context lines from ripgrep and no longer reads matched files itself. To search a remote system, override grep's execute(); see Remote Execution (#9276)
      • OpenAI-compatible models no longer send "tools": [] when all tools are disabled in a session that has used tools; the field is omitted. This fixes 400 errors (tools must not be an empty array) from vLLM 0.20+, also behind LiteLLM. If your proxy requires tools once the history has tool calls, such as older LiteLLM versions in front of Anthropic, set compat.requiresToolsWithToolHistory: true for that model in models.json (#11843)

      Added

      • pi update now lists each updated package with its npm version or git commit change, for example npm:foo 1.2.0 -> 1.3.0, and prints Packages are already up to date when nothing changed. When nothing changed but an update printed a warning, for example because npm left the old version installed after resolving stale registry metadata, it prints No packages were updated, see the warnings above instead; in offline mode it prints Skipped package updates (offline mode). PackageManager.update() reports each changed package as a new result progress event whose message holds that line (#11707, #11711)
      • Anthropic sessions now use message threads: each request sends only the new messages and the server continues from the previous reply, falling back to the full request when the conversation changed (for example after compaction or a tool list change). On by default for the anthropic provider on api.anthropic.com; set compat.supportsMessageThreads in models.json to enable it for gateways that forward the thread field, or to turn it off. Cache warming does not touch the session's thread (#11545)
      • pi.registerMarkdownTransformer() takes an optional { messageTypes } that selects the Markdown surfaces a transformer runs on. Besides user, assistant, and thinking Markdown, transformers can now opt into custom (custom messages and skill blocks), summary (branch and compaction summaries), and changelog (What's New, /changelog, the Extension Updates notice, and the Update Available note). Without options a transformer runs on user, assistant, and thinking Markdown as before. The built-in Mermaid renderer now also draws diagrams in expanded branch and compaction summaries
      • pi auth login <provider> logs in to a provider from the shell without starting a session, for example pi auth login radius. It signs in with an account in the browser and exits; --api-key saves an API key instead, and --no-browser uses device code or copy-code sign-in instead. Logging in to Radius also configures the Radius MCP server. pi auth logout <provider> removes the stored credentials, like /logout
      • ctx.ui.custom() overlays now honor the blocked option: pi reports blocked program status (OSC 7501) from when the overlay is shown until it calls done(), also while it is hidden with setHidden(). Closing one overlay keeps other open questions blocked (#11816)
      • Added the qwen-token-plan-individual-cn provider for Qwen Token Plan Individual on the China endpoint, using QWEN_TOKEN_PLAN_CN_API_KEY (#7989 by @bigoldcat123)
      • Added Microsoft-Decision-1 classifier support through GitHub Copilot, including codemode models.classify() (#11679 by @Marvae)
      • Added compat.promptCacheKeyMode ("auto", "enabled", or "disabled") to enable prompt cache keys for compatible proxies or omit them for endpoints that reject them. Set it in models.json when using pi (#9442 by @dannote)
      • Added compat.requiresNonNullAssistantContent for OpenAI-compatible endpoints that require an empty string instead of null in assistant messages containing only tool calls. Set it in models.json when using pi (#8118 by @gaoyk19)
      • Added syntax highlighting for Dart, Nix, Groovy, and Gradle files in read and write views (#11643)
      • Added GLM 5.3 to the Qwen Token Plan Individual model allowlist (#11658)
      • Added Claude Fable 5.2 (claude-fable-5-2) to the anthropic provider ($8/$40 per million input/output tokens, 1M context, 128K output). Like Fable 5.1 it uses per-message effort and mid-conversation system messages; requests its safety classifiers refuse before any output are answered by Claude Opus 5 through server-side fallback and billed at Opus 5's price. Claude Fable 5.2 and Mythos 5.2 on other providers, such as OpenRouter's anthropic/claude-fable-5.2, get the same per-message effort support

      Changed

      • The default model for the anthropic provider is now Claude Opus 5.5 (claude-opus-5-5) instead of Claude Opus 4.8
      • Default models moved to newer models at the same or a lower price: amazon-bedrock Claude Opus 5.5, azure GPT-6.1 Sol, google and google-vertex Gemini 4 Argon, vercel-ai-gateway GLM 5.3, baseten GLM 5.3, minimax and minimax-cn MiniMax-M3, qwen-token-plan and qwen-token-plan-cn Qwen3.8 Max, opencode-go Kimi K3.1 Pro, and Kimi K2.7 Code instead of Kimi K2.6 for moonshotai, moonshotai-cn, huggingface, opencode, openrouter, cloudflare-workers-ai and cloudflare-ai-gateway
      • cacheWarming now defaults to "idle" instead of "streaming": pi also keeps eligible prompt caches warm for up to 30 minutes between agent runs, but only when a refresh is expected to pay for itself. Set "cacheWarming": "streaming" in global settings for the previous behavior
      • Consecutive cache warms now show as one Cache warmed: $<total> line with the cumulative cost instead of one line per warm
      • The OpenAI Codex provider is shown as "OpenAI Codex" again instead of "OpenAI Codex (legacy)" in /login and the model selector
      • The /login and /logout provider lists and /login <provider> completions now show the preferred partners Radius and OpenRouter first, then all other providers alphabetically. In the provider lists, partners are marked with ✦, the selected Radius row shimmers in the Radius logo colors and the selected OpenRouter row glows in OpenRouter's brand color (lime on dark themes, violet on light themes)
      • Upgraded terminal Mermaid rendering to support more diagram types, including pie charts, author-defined styles, and clickable labels on terminals with hyperlink support (#8158 by @xl0)

      Fixed

      • Fixed the grep tool's glob matching from the folder pi was started in instead of from path: with path: "repo", glob: "migrations/main/*.js" returned No matches found even though repo/migrations/main/a.js exists. Globs are now relative to path, the same form grep prints its results in, also when path is a symlink. A leading ./ (./src/*.ts) is ignored instead of matching nothing (#11807, #10998)
      • Fixed prompt template arguments dropping apostrophes and merging words: an apostrophe inside a word, as in doesn't, no longer opens a quote; a quote with no closing match is kept as text; and \" inside "..." (or \' inside '...') gives a literal quote (#11861)
      • Fixed the bash tool reporting only Command timed out when the command had already exited but a background process it started kept writing to its output until the timeout. The error now also reports the shell's exit code and when it exited (#11613)
      • Images in steering and follow-up messages, including prompt() while streaming, are now resized like images in idle prompts instead of being sent and saved at full size (#11738)
      • A failed token refresh of an MCP connection no longer registers an OAuth client or replaces the PKCE verifier of a sign-in in progress, which made that sign-in fail. MCP sign-in now refreshes the stored tokens with the stored client even when the loopback callback port changed, instead of registering a new client and opening the browser. Ctrl+C in /mcp and the --timeout of pi mcp login now also stop a sign-in while it waits up to 25 seconds for another pi process's token refresh, and a refresh lock that fails for another reason than that wait now fails the sign-in instead of opening the browser.
      • Fixed pi mcp list reporting MCP servers with "auth": { "provider": "<provider>" }, such as Radius, as needing sign-in although the provider was signed in: the shell command sent no token. It now sends the provider's /login token and refreshes it when it expired. For these servers the sign-in hint names /login <provider> instead of pi mcp login, and pi mcp login and pi mcp logout point to /login and /logout instead of failing with "does not use OAuth"
      • Fixed RPC mode ignoring an extension's ctx.shutdown() while idle, for example from a timer: the process kept running until the client sent another command. pi now shuts down right away when idle, and a shutdown requested by an extension command waits until the command's prompt response is written (#11599)
      • Fixed changelog notes repeating on every fresh launch when the installed package version has a prerelease suffix, such as 0.1.5-20261020.7: the saved version was read as 0.1.0, so the 0.1.1 to 0.1.5 notes counted as new each time. A saved version without major.minor.patch now shows no notes and is replaced by the installed version, instead of showing the whole changelog (#11703)
      • Fixed RPC mode cutting off shutdown cleanup, such as a pending MCP token refresh, when stdin closed and SIGTERM arrived together, which process managers like Paseo and systemd do. Pi lost the refreshed token and the MCP server revoked the sign-in. Once a shutdown has started, a stdin EOF or a single signal no longer interrupts it; a second signal still exits at once. Print mode likewise no longer dies from a signal that arrives during its final cleanup (#11599)
      • Fixed the grep tool reading every matched file into memory when context was set, which ran out of memory on large files; context now comes from ripgrep, which also fixes UTF-16 files and lone CRs in matched lines, and the match limit notice no longer appears when exactly limit matches exist (#9276, #11423)
      • Fixed the find tool reporting the result limit when exactly limit files match, and limit: 0 in find and ls returning every result or an empty listing; limits below 1 now mean 1 (#7121)
      • Fixed grep match lines, codemode output, compaction summaries of tool results, and MCP error and server summaries cutting an emoji or other non-BMP character in half when truncating, which left an invalid lone surrogate in the text (#7121)
      • Fixed the find tool on Windows returning no results for patterns with Windows separators such as src\**\*.ts, and for every path pattern such as src/**/*.ts with fd 10.5.1, which pi now downloads. Windows path patterns now match the same way with every fd version: src/**/*.ts also finds files directly in src/, and src/*.ts no longer finds files in subdirectories (#9262)
      • Fixed the read tool loading whole files into memory, which ran out of memory on large files even with offset/limit; it now streams the file and keeps only the shown lines. Custom ReadOperations can stream too by providing the new optional createReadStream (#9654)
      • Fixed OAuth logins such as openai and anthropic failing with invalid_grant after pi was stopped while it refreshed an expired token, for example an RPC client that stops pi right after startup while the background catalog refresh runs. The token endpoint had already replaced the refresh token, but pi exited before saving the new one. On exit, pi now waits for a token refresh in progress to be saved (#11692)
      • Fixed Ctrl+P not switching to the only model in scope (or the only available model) when the active model is a different one; it showed "Only one model in scope" instead. Cycling forward from a model outside the scope now also selects the first scoped model instead of skipping it (#11806)
      • Fixed /reload and session switches leaving extension overlays on screen when an extension had more than one ctx.ui.custom({ overlay: true }) open: only the topmost overlay was removed, and the others kept focus and input although the extension that opened them was gone. All extension overlays, including hidden ones, are now removed and disposed; pi's own overlays stay open
      • Fixed /mcp sign-in staying on "Connecting…" for minutes after a successful browser sign-in, with Ctrl+C doing nothing: pi waited for the browser to drop an unused connection to the OAuth callback port. The callback server now closes remaining connections when it shuts down (#11311)
      • Fixed pi aborting (zsh: abort) after repeated image reads, reported on macOS arm64 with Node 24.16. Each image resize starts a worker thread, and pi did not wait for it to stop, so the next resize started a new worker while the previous one was still shutting down. The crash is most likely a Node bug that this overlap triggers and could not be reproduced on Linux; image resizes now wait for the previous worker to stop, which adds about 15 ms per image (#10695)
      • Fixed tool_search and searchTools() not finding a tool by property names and descriptions behind a local $ref, as in MCP input schemas that put their models in $defs. Referenced definitions are read once, so recursive schemas do not loop, and definitions nothing references stay out of the search text (#11803)
      • Fixed the codemode resolves to summary of a tool leaving out field names behind a local $ref, for example structuredContent? instead of structuredContent?: { results } for MCP output schemas that put their models in $defs (#11803)
      • Fixed every codemode script failing with URI malformed when any callable tool, such as an MCP tool, had a $ref with a malformed percent escape (#/$defs/%E0) in its schema, even scripts that do not call that tool. The parameter now renders as unknown in the tool's declaration (#11803)
      • Fixed ctrl+o not expanding or collapsing the output of ! and !! commands run while the agent is working. New !/!! output now starts in the current expand state, the output no longer disappears when a steering or follow-up message is queued, and it moves into the chat when the agent finishes instead of on the next submitted message (#11875)
      • Fixed resuming a session restoring an old thinking level after /tree navigated to before a /thinking change. Like the model, the live thinking level is now recorded on the new branch with the next prompt (#11451)
      • Fixed inline images in fullscreen mode showing only their first row in Orca, while regular mode showed them in full. Fullscreen now draws Kitty images after the rows they cover on every terminal, as it already did for WezTerm (#11835)
      • Fixed the edit tool rewriting the line endings of untouched lines in files with mixed CRLF/LF or lone CR line endings, and running out of memory on large files after the file was already written; the diff now covers only the changed lines and their surroundings and is computed before writing (#8544)
      • Fixed the Windows installer (irm https://pi.dev/install.ps1 | iex) aborting with NativeCommandError in Windows PowerShell 5.1 when npm or Node.js printed any warning, for example npm warn Unknown user config from an unknown .npmrc key. It failed before the action menu when migrating an npm installation, and during managed installs. An invalid managed-install.json also aborted the installer instead of being reported (#11944)
      • Fixed pi update --models failing with Could not refresh model catalogs: openai: OAuth refresh failed for openai: ... invalid_grant when a provider's login had gone stale. Built-in providers whose catalog comes from pi.dev, such as openai, no longer refresh their OAuth token for a catalog refresh at all. For providers that list models with the login, such as Radius and OpenRouter, a failed token refresh now prints a warning naming the provider and pi auth login <provider>, and the other catalogs still refresh; the command fails only for other errors, such as a network failure
      • Fixed the powershell tool reporting Command exited with code 1 under Windows PowerShell 5.1 when a native command succeeded but its stderr was redirected, as in git push 2>&1 | Select-Object -Last 3. Windows PowerShell 5.1 turns that stderr into error records; such commands now report the exit code PowerShell 7 reports (#8842)
      • Fixed deleting a paste marker with Backspace corrupting later short markers such as [paste #2], causing the marker text to be submitted instead of its pasted content (#11923)
      • Fixed dropped provider streams reported as "cut short after the reply had begun" not triggering automatic retries (#11879)
      • Fixed the subagent extension example passing Bun's Windows virtual entry path as part of the prompt when spawning a compiled pi binary (#11865)
      • Fixed the model selector and llama.cpp Hugging Face search moving the selection when a background catalog refresh or search result arrives (#9109)
      • Fixed internal cursor markers leaking into terminal output, including with multiple markers or horizontally clipped content (#9441 by @muyiyr)
      • Fixed the subagent extension example showing running tasks as completed, losing subprocess failure diagnostics, and failing to stop child processes on abort. Agent discovery and trust checks now use each task's working directory, and single and chain results are truncated without losing the full tool details (#8250 by @terrorobe)
      • Fixed large pasted text being replaced by literal paste markers when switching editors, opening custom UI, or restoring queued messages (#10146 by @w-winter)
      • Fixed prompts and session-tree navigation overlapping during asynchronous input hooks, authentication, or branch summaries, which could install the wrong conversation context (#9155 by @acmerfight)
      • Fixed Claude Sonnet 5 requests sending an unsupported temperature parameter (#7961 by @jingtao-wisdomgraph)
      • Fixed extensions loaded through symlinked paths failing to resolve their dependencies by resolving the entry file's real path before importing it (#8112 by @cad0p)
      • Fixed the plan-mode extension example missing completion markers in thinking blocks and common completion phrases, dropping formatted or long plan steps, and sending an extra model turn to acknowledge completion (#7950 by @giannisCKS)
      • Fixed OpenAI Responses requests sending session_id instead of the documented session-id affinity header (#11639)
      • Fixed delivered image-only steering and follow-up messages remaining in the pending queue (#8612 by @wutongyuonce)
      • Fixed cancellation during lazy provider loading or authentication being reported as an error instead of an abort (#8635 by @Mallikarjun-0)
      • Fixed session runtime disposal tearing down extensions before active tools finished aborting and their results were recorded (#9126 by @acmerfight)
      • Fixed the session-tree search cursor not being shown or positioned for input methods (#9157 by @Perlence)
      • Fixed SDK and RPC reloads replacing extensions while a response or compaction was still running; reload now asks the caller to wait (#9222 by @acmerfight)
      • Fixed rendered edit diffs losing shared indentation when a change inserted text at the start of a line (#9274 by @dannote)
      • Fixed ! and !! commands omitting the truncation notice and full-output file link when earlier output chunks had been discarded (#10165 by @acmerfight)
      • Fixed extension selection dialogs growing beyond the terminal height; they now show a scrolling window of up to ten options (#11072 by @DivineDominion)
      • Fixed pi config ignoring custom keybindings from keybindings.json (#11651)
      • Fixed concurrent OAuth refreshes through symlinked paths to the same auth.json by sharing the lock on the resolved file (#11655)
      • Fixed provider connection errors hiding their underlying cause, such as connection refusal or certificate errors, behind generic messages (#11695)
      • Fixed Ctrl+V not pasting clipboard images or text on Windows and WSL; both Ctrl+V and Alt+V are now default paste shortcuts there (#11765)
      • Fixed llama.cpp connection errors omitting the server URL and underlying network error (#11745)
      • Fixed Alacritty hyperlinks not being enabled when TERM_PROGRAM is unset; detection now also uses TERM and ALACRITTY_WINDOW_ID (#11767)
      • Fixed OpenAI Codex SSE retries retaining abort listeners after each backoff, causing listener buildup on repeated retries (#11708)
      • Azure OpenAI models now keep OpenAI's long-context price tier, so requests above 272K input tokens are costed at Azure's long-context rates (#11948)
      • Fixed Anthropic and Bedrock sending strict: "prefer" tools strict again on every request after Claude rejected them for exceeding its strict tool limits, which cost a rejected request (400) per turn. Later requests with the same sessionId now send those tools non-strict right away, until cleanupSessionResources(sessionId) (#11626)
      • Fixed tool arguments for Type.BigInt() and Type.Undefined() parameters being rejected: they convert as TypeBox converted them ("42" and 42 to 42n, null to undefined), now that pi-schema supports both types. Type.Void() still rejects every JSON argument.
      • Fixed Azure GPT-6 Astra, Luna, Sol, GPT-6.1 Sol, and GPT-6.1 Terra using a 272K context window instead of the 1,050,000 tokens Azure Foundry deploys them with (#11742)
      • Fixed OpenRouter rejecting requests with a 400 (This endpoint's maximum context length is ...) for models whose output limit is close to the context window, such as DeepSeek flash. OpenRouter counts the input with its own tokenizer, which can be several percent higher than the provider's count, and pi left only 4,096 tokens spare. pi then treated the 400 as a context overflow and compacted the session, even at around 20% of the window. The default output limit now leaves 15% of the estimated input unused, and near a full window at most 32,768 output tokens are requested (#10497)
      • Fixed Anthropic non-strict tool schemas dropping root $defs and definitions, which left property $refs pointing at nothing. Claude then produced wrong arguments for such tools (common in MCP servers), for example a JSON string instead of an object, and some Anthropic-compatible gateways rejected the request outright (#9557)
      • Fixed OpenCode Go Claude Haiku 5.5 failing with a 400 (Invalid signature in thinking block ... bound to a different conversation) after the tool list, system prompt, or earlier history changed, which left the session failing on every retry. OpenCode Go and Zen Claude 5.5 models, Opus 5, and Fable 5.1 now use per-message effort and send thinking.block_binding: drop_block, like the Anthropic provider (#10954)
      • Fixed Markdown displaying HTML comments (<!-- ... -->) as visible text (#11710)
      • Fixed codemode console.* output and thrown non-Error values printing NaN, Infinity, and -Infinity as null (#11901)
      • Fixed large MCP stdio messages being repeatedly copied and scanned as chunks arrived, causing slow tool responses (#11761)
      • Fixed MCP Streamable HTTP SSE replies with CR-only line endings failing with "stream ended without a response" (#11764)
      • Fixed oversized MCP SSE responses keeping their HTTP connections open after the message-size limit rejected them (#11729)
      • Fixed MCP stdio server subprocesses surviving disconnect or pi exit on POSIX when the server's main process had already exited (#11721)
      • Fixed MCP Streamable HTTP JSON replies bypassing message-size limits and HTTP errors buffering entire response bodies. Oversized replies and error-body content beyond the first 8 KiB are now cancelled (#11335)
      • Fixed valid tool arguments being rejected when their schema combined local $refs with a relative root $id, such as schemas/tool.json (#11697)
      • Fixed the find tool starting an untracked fd process when cancelled during its parent-directory lookup (#11974 by @petrroll)
    3. 🔗 backnotprop/plannotator v0.28.57 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet

      What's New in v0.28.57

      TL;DR

      • New: Pin artifacts, and see every artifact on one page
      • New: Filter the list by project, date or agent
      • New: A thread shows its pull requests and their state
      • New: Choose what the sidebar shows, and in what order
      • Changed: Ask AI starts from Side in the selection bar

      You can now pin a thread's files and pictures and find them all on a new Artifacts page. The list gets a filter, the sidebar can be rearranged, and a thread shows the pull requests its agent is working on. Attachments download from a right-click, the list marks what waits on you with one question mark, and the What's new page opens on each release's TL;DR.

      0.28.57 has 18 PRs, all from @backnotprop, plus #2938, which merged ten of them together. One is a test fix, and most of #2887 is work on code review in the Inbox, which stays off in this release.

      Plannotator Inbox

      Pin artifacts, and the Artifacts page

      You can now pin an artifact (a file or picture in a thread) to come back to it. The pin sits on a card in the thread's Artifacts grid (top left, shown on hover and always once pinned), in the file viewer's bar, and in the pane header. With pins in a thread, its Artifacts grid shows "Pinned" first, then "Everything else". With nothing pinned, the grid looks as before.

      The sidebar has a new Artifacts row, above Reviews. It opens a page with every thread's artifacts, newest first and grouped by day, with All and Pinned tabs, chips for Images, Pages, Documents and Other files, Smaller and Larger, and "Show archived" in its filter menu. A tile opens its file or guided review in its thread, and Back returns to the page.

      Pins are kept on this computer's Inbox, per person, so your phone and your computer show the same pins. Agents never see them. On a phone, pin from the open file: the viewer bar has the pin, and an HTML page has Pin as the first item of its full screen ⋯ menu. The Artifacts page lists this computer's threads only. #2926

      Filter the list

      A funnel icon now sits in the list header, left of Search. Its menu filters by Project (pick several; on the Inbox page, with two projects or more), Updated (Today, Last 7 days, Last 30 days or a custom range) and Agent (pick several; with two agents or more). Each row shows how many threads it would leave. Picks in one group add up (this project or that one), and different groups narrow each other. When a filter is on, the funnel turns the accent colour and shows how many picks are on.

      The groups in the list count only what matches, and J/K and "N new" follow the threads the filter shows. Sidebar counts don't change. When nothing matches, the list says "No threads match" with Clear filters. On a phone the menu opens as a bottom sheet. The filter is remembered in this browser only. #2921

      A thread's pull requests

      A thread can now show the pull or merge requests its work is about. The thread's agent adds them, and you can edit the list. A row shows the state of the PR still in play (open, draft, merged or closed, in GitHub's colours) at its right end, with a small count when the thread has several. The thread header has the same mark as a button, left of Artifacts. Hover or click it for a card with each PR's state, checks and review. Stacked PRs show base first under "Stack of 3", and the others follow. On a phone, a tap opens a bottom sheet.

      You can add a PR by its ref or link, or remove one with Undo. A bare #123 is refused, with how to write it instead. A thread with no PRs has Add a pull request… in its ⋯ menu. Your change wakes no one: the agent hears about it the next time it wakes. The Inbox reads a PR's state only while its row or thread is on screen, keeps it for 5 minutes, and never reads a merged or closed PR again.

      Agents add PRs with a new pulls field when they send a message, and list or change them with the thread_pulls action. read_thread lists them. From a terminal, use plannotator inbox pulls ls|add|rm. #2927

      Choose what the sidebar shows

      Right-click the sidebar for Show in sidebar , a checkbox for each item that can hide. A tick changes the sidebar at once. The same menu has Customize sidebar… , a panel where you can turn items on and off, move them between the top and bottom groups, and start from Default, All at top or Minimal. Drag an item by its grip, or press the grip for Move up, Move down and Move to top or bottom. Inbox and Settings always stay.

      Settings → General → Appearance → Sidebar → Customize… opens the same panel, which is the way in from the keyboard or a phone. Your layout is saved in the Inbox's settings, so every window and device gets it. Reset to default puts everything back. #2924

      Ask AI starts from Side

      To ask the agent about something it wrote, select the words in its message or in an open file and press Side in the selection bar (Copy · Delete · Comment · 👍 | Side). The thread's Ask window opens with the words quoted and the box ready to type. The agent is also told where the words came from: for a message, who sent it and the heading above the words; for a file, its name, version, line and heading.

      The Ask icon is gone from a thread's top bar and from a full-screen file's bar, and Ask's card in the thread's corner (the round button on a phone) is gone too. On a computer, Side opens Ask, and in a thread that already has a chat it reopens that chat. Ask isn't on phones for now. The corner still holds floating reply drafts when Settings → Experimental → Float reply drafts is on. #2928, #2987

      Download from a right-click

      Right-click an attachment tile, the big picture at the top of a message's attachments, or a card on the Artifacts page to open its menu, with Download. The tile's ⋯ menu, now named "More", has the same list. Download saves an HTML page or a Markdown file as a file rather than opening it. For a file that was edited, it saves the file as it is now, and when the file is gone from disk the item reads "Download the sent version". An image's menu also has Copy image , and pasting that copy into a reply adds the same file. A touch never opens this menu.

      Pictures in a message's text keep the browser's own menu, and Save Image As now saves them under their real file name instead of image.png. #2923

      One question mark for what waits on you

      List rows no longer have a separate ⚠ badge. What waits on you is the question mark with its count of open questions, and the action box for open action items. Each one fills in the existing colours: plain when nothing is held up, the Holds up colour when it is holding up work, and the Stopped colour when an agent is stopped on you. Its tooltip says which, for example "Holding up work: 5 questions". On wide lists, the words "Stopped" and "Holds up 3" stay beside it. #2929

      What's new: the TL;DR first, and every release

      The What's new page now starts each release with its TL;DR, the short labelled lines at the top of these notes. A panel on the right lists the recent releases, each with its version, date and two TL;DR lines, and a row opens that release. Under 1100 px and on a phone, a version picker in the bar opens them as a sheet. The heading shows the version you have, and when you are behind, how many releases are in between. If GitHub can't be reached and nothing is saved, the page says "Can't reach GitHub" with Try again. The Inbox reads the release list at most once a day, and makes no request with update checks off. #2932

      Smaller changes

      • A reaction now lands without scrolling the thread. The emoji no longer dips below the button on its first frame. When the new line is out of sight, the emoji lifts and fades at the button, and at the end of a thread the thread eases once so the line shows above the foot. #2930
      • Delete on words in a linked machine's message used to fail with a raw error when that machine's Inbox was too old. It now reads "Mac mini needs an update to delete words · Update" (with the machine's name), and Update opens that machine's update dialog. #2933
      • Hovering the list's title ("Inbox" or a project's name) now shows Refresh ⇧R , not only the small ↻ beside it, which is hidden until you hover. A project's list keeps its name and folder tooltip on the name. #2993
      • On a phone in dark mode, a message's ⋯ menu showed solid black icons. It now shows outline icons, and the right-click menu on a computer is fixed too. #2991
      • A thread's Ask state is now read once per change, shared by the Ask window and the parts that wait on it, instead of up to four times. Nothing you see changes. #2983

      Pick your tab icon

      Plan review's Theme tab and the Inbox's Settings → General → Appearance now have a Favicon choice: Glass (the goggles, the default), Face (the goggles face from before 0.28.56) or P (a new P icon). One choice covers plan review, code review, annotate and the Inbox. In the Inbox it applies at once, with the tab's count of new threads still drawn over it. If you had picked the old face icon, you keep it, now named Face. If you had picked Classic, you get the new P icon. #2980

      In 0.28.56, plan review, code review, annotate and the Inbox showed the Glass tab icon as a full square, where plannotator.ai shows it with rounded corners. Every app now uses the same favicon.ico as the site, with its hand-pixelled 16, 32 and 48 pixel frames. Face and P stay as they were. #2992

      Guided reviews

      • A guide you write for plannotator guide export --guide can now give a chapter one Mermaid diagram. The exported page draws it at the top of the chapter's code, under a Diagram header that folds. #2887

      Not yet on

      This release also carries more work on code review in the Inbox. It stays off by default, and its switch stays hidden until a later release. The work covers diagrams in the Inbox's guided reviews: a review's Mermaid diagram drawn as a picture instead of shown as source, and one optional diagram per chapter, at the top of the chapter's code #2887.

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      Full Changelog : v0.28.56...v0.28.57

    4. 🔗 anthropics/claude-code v2.1.321 release

      What's changed

      • Added Claude Fable 5.2 (claude-fable-5-2), now the default Fable model — 1M context, $8/$40 per Mtok with $0.20/Mtok cache reads
      • Added --settings <file> to claude remote-control, which applies a settings file to every session it starts; if the file changes, no new session starts until you restart claude remote-control
      • Fixed MCP OAuth requests sending secrets such as refresh tokens to another host when a server redirected them
      • Fixed a case where a read-only Bash command ran outside the sandbox without a permission prompt
      • Fixed a case where Bash permission checks judged a file write from the wrong folder and didn't prompt
      • Fixed deny rules and protected-file prompts not applying to the file that a cp or mv into a directory writes
      • Fixed the "Draws from usage credits" note showing after a switch to Fable on Enterprise seats whose plan includes Fable
      • Fixed the fallback model sometimes declining a request or mentioning a stopped response when the first model was blocked before replying
      • Fixed claude mcp login printing a SEP-2352 issuer warning each time you sign in again to a server that Claude Code registered with
      • Fixed NotebookEdit deleting or overwriting a notebook's first cell when the call named no cell, on network paths (UNC shares, WSL folders, /net mounts)
      • Fixed Edit changing the first of several matches, replacing a whole file on an empty old_string, or editing a notebook as text, on network paths (UNC shares, WSL folders, /net mounts)
      • Fixed /config showing Manual as the default permission mode when new sessions start in auto mode; pressing Space on "Auto (default)" now saves Don't Ask, not Plan
      • Windows: Fixed FileChanged hooks stopping for paths set through watchPaths after the first shell command, when the session's working directory had a lowercase drive letter
      • Fixed --plugin-dir . and --plugin-dir ./builtin writing generated type files for Claude Code's built-in plugins into a builtin folder
      • Fixed context usage estimates overcounting tool definitions when exact token counts are unavailable
      • Fixed /compact showing twice in Remote Control on web and mobile
      • Fixed plugin auto-updates and /plugin marketplace updates downloading a plugin again for each worktree or folder of a repository
      • Fixed auto mode losing a background subagent's report that had started a turn when the conversation was compacted before Claude answered it
      • Fixed project skills, commands and agents staying missing after their folder was removed and came back mid-session, such as with git stash, including after entering a worktree
      • Fixed claude -p sometimes telling Claude that background commands get 30 minutes when they are stopped after 10
      • Fixed pkill, pgrep and pidwait in cloud sessions matching the session's own parent processes
      • Fixed Claude in Chrome and computer use server processes staying alive after their parent exits behind a proxy that stalls connections
      • Fixed a large hook output pointing Claude to a file that held another hook's output from the same tool call
      • Fixed apps that embed Claude Code getting their own PreToolUse hook's ask reason instead of another hook's when both asked
      • Fixed a PreToolUse hook's ask being lost when another hook's defer finished first and could not be honored
      • Fixed a rare crash on permission prompts and background tasks
      • Fixed project skills, commands and agents disappearing from the menu in SDK and desktop sessions after Claude entered a worktree
      • Fixed /desktop on macOS saying Claude Desktop is not installed when it is in ~/Applications
      • Fixed OpenTelemetry repository attributes (vcs.*) missing from Claude Desktop sessions that start on a pre-started process
      • Fixed WebFetch passing "No response from model" to Claude as page content when the model reading the page returned no text; the call now fails with a clear error
      • Fixed screen reader mode delaying the prompt at startup when the system clock moved back while Claude Code was starting
      • Fixed a command's panel sometimes not coming back after a dialog closed, leaving no panel or prompt on screen until the next redraw
      • Fixed a project's MCP server being disconnected after the first message in a Claude Desktop Code tab session when the desktop app has an MCP server or extension of the same name
      • Fixed a turn ending with "API Error: EPROTO: The TLS handshake failed" when the connection broke partway through a reply; the partial reply is kept or the request is retried, as before 2.1.302
      • Fixed high memory use in long sessions that repeatedly read single lines from large files
      • Fixed fast mode losing replies, switching models or retrying for minutes when fast serving is rate-limited, overloaded or failing; it now tries standard speed on the same model first
      • Fixed one request carrying far more background agent reports than intended after Claude was stopped while several were waiting
      • Fixed messages from a Claude Desktop Code tab session to your other sessions staying paused after you typed while Claude was still working
      • Fixed claude agents ignoring --permission-mode, --dangerously-skip-permissions, --model, --effort or --agent typed before agents when a flag such as --verbose was also on the line
      • Fixed a case where Remote Control showed as off with "login expired" in the desktop app while its connection was still up, because the app was briefly unable to hand over a sign-in token
      • Fixed a Remote Control message sent with "Queue for later" reaching Claude in the middle of the running turn
      • Fixed the git status given to Claude at session start reading as clean when git status failed; it now reads as unavailable
      • Fixed the git status given to Claude at session start showing the first listed file as staged when its changes were not staged
      • Fixed a hang or out-of-memory crash when a connector in a cloud session lists resources with very long names
      • Fixed Remote Control showing as connected after its connection closed for good while the session's history was still uploading
      • Fixed screen reader mode turning off when you return to a conversation from agent view
      • Fixed screen reader mode y/n questions taking as yes a stray "y" at the end of text typed as the question opened
      • Fixed cloud sessions telling Claude that a host is probably not allowed when it is allowed and the network proxy could not connect to it
      • Fixed an MCP server sometimes showing as connected with no tools after it was reconnected or the session's directory changed while its tools were still loading
      • Fixed Bash commands sometimes running in the wrong folder when Claude sent several at once and an earlier one changed folders
      • Fixed files Claude sends from cloud and Remote Control sessions failing at once when an upload gets an HTTP 507 from a proxy; the upload now gets a second try
      • Fixed new messages not being saved, and claude -p, SDK and VS Code sessions hanging, when memory ran out while the transcript was being read
      • Fixed sign-in, token refresh and logout waiting indefinitely when something on the network accepts the connection but never answers the TLS handshake
      • Fixed a sent file showing under a different name in the Claude apps when its name hid text-direction or control characters; Claude now refuses to send such a file
      • Fixed sub-agent progress summaries running a request to its end after the model replied with a tool call
      • Fixed Bash reads such as grep -r foo "$PWD/src" asking for permission when the same command with the path typed out runs without asking
      • Fixed Claude apps gateway refusing to start when a desktop setting holds a field newer than the gateway, such as a managed MCP server's oauth.omitResource; it now warns and serves it
      • Fixed Bash commands coming back empty for zsh users whose .zshrc sets KSH_OPTION_PRINT
      • macOS: Fixed "Unable to read managed policy settings" at startup when a valid MDM profile was slow to read: the read is retried once, and a timeout is now reported as a timeout
      • Fixed agent view erasing another agent view's saved input text when it restarted for an update with nothing typed
      • Fixed remote sessions giving no reply after a restart when a UserPromptSubmit hook blocked a replayed permission answer; these hooks no longer run on that replay
      • Fixed claude remote-control accepting a y typed without Enter at its first-run question when the terminal's input ended
      • Fixed Claude Desktop not showing spend limit warnings behind a Claude apps gateway whose policy has no code: rules
      • Fixed fullscreen sessions with some plugins ending with an error when a tool result that had got shorter scrolled off the top of the screen
      • Fixed prompt suggestions making extra API requests when the model replied with a tool call
      • Fixed PreToolUse mcp_tool hooks on stdio and HTTP MCP servers being skipped when their answer was over 16 MiB; the tool call is now refused
      • Fixed skill and command names holding a Bamum letter that some fonts draw as blank: they are now refused
      • Fixed claude -p on Linux exiting 0 in silence when a full NFS export or a used-up NFS quota lost transcript lines: it now prints an error and, in text and json output, exits 1
      • Fixed background agents being reported as stopped by the user, and refused a resume, when a service interrupted a cloud session and nobody pressed Stop
      • Fixed NotebookEdit reporting success to hooks and telemetry when the edit failed, for example when the notebook changed while the permission prompt was open
      • Fixed a blank screen or no answer at startup, and empty claude mcp list output, when a stored MCP sign-in record was null
      • Fixed the Artifact tool telling Claude to add filters when an artifact's database collection is too large to sort; it now says to read the collection page by page and sort the results
      • Fixed a restarted cloud session dropping a message with a large image when the restart came before Claude's first reply to it
      • Fixed a restarted cloud session leaving a subagent's message to the main conversation unanswered
      • Fixed Claude not being told when you stop or pause a running workflow, so it no longer says the workflow is still running
      • Improved the /model picker: "More models" is now an unnumbered row below every other, and older models open under it without renumbering the rest
      • Gateway: Improved spend limits on a busy replica, which now skips fewer checks and records spend sooner
      • Improved the Claude apps gateway's sign-in limit messages in Claude Code and on the /device page: they no longer name gateway settings, which the gateway's own log still names
      • Improved claude install and the install scripts: they finish 2 to 4 seconds sooner
      • Improved how soon a Remote Control session whose process crashed can pick up a new message
      • Windows: Improved startup and first-command time by finding programs on PATH without starting a helper process
      • Improved auto mode in headless sessions, the desktop app and VS Code: reports from background subagents that wait together are answered in one model call, as in the terminal
      • Improved the agent view's row for a claude --bg --worktree session that couldn't set up its worktree: it now shows the error from its beginning, not an internal tag or its last 200 characters
      • Improved the messages shown when an artifact is in another organization: /login is offered only if it's one of yours, and Claude now says where a copy may be after an account move
      • Improved sessions with more images than fit in one request: Claude is told whether it has already seen a dropped image, and repeat reads of an unchanged image are limited
      • Improved claude remote-control's messages for an unanswered first-run question: each now says what to do next
      • Improved start-up time by loading trusted TLS certificates faster
      • Improved Claude apps gateway error messages to show the gateway's address without any user name or password
      • Improved the Claude apps gateway's spend limit error: the reset now shows in your local time, such as "resets 4pm (America/Los_Angeles)"
      • Windows: Improved startup time with a standard Git for Windows install by no longer checking which git.exe to run on every launch
      • Updated the session-feedback message and the allowedProviders setting description to name Ultra alongside Pro and Max, and the forceLoginMethod description to cover every paid Claude plan
      • Updated the bundled dataviz skill to suggest a list of meters, one row per item, for several ratios that each have their own limit
      • Updated the "Upgrade to Max" options to say "Upgrade to Max or Ultra"
      • Changed mods Claude writes to turn on without asking in auto and bypass modes, even with managed allowUnsandboxedCommands: false or allowManagedDomainsOnly, and not to load in dontAsk mode
      • Changed mods' own tool calls ($.tool.call, $.mcp.call) to raise no permission prompt, even under your own ask rules or in dontAsk and -p runs; deny rules and organization policy still apply
      • Changed saved Fable 5.1 model picks to move to fable: on Pro and Max plans at once, on Team and Enterprise plans once your organization allows it; use /model claude-fable-5-1 to switch back
      • Changed the fast mode labels in /fast, /config and /model to name your current model when it supports fast mode, and removed "(Opus only)" from the VS Code row
      • Changed nested skill loading: .claude/skills folders inside ~/.claude/plugins no longer load when Claude works on files there
      • Self-hosted runner: Changed an on-demand runner that the server refuses because it is not needed (session ended or paused, work order superseded) to exit 0 instead of 1
      • Windows: Changed how Claude Code finds programs it starts itself, such as git, to skip relative and UNC PATH entries and links onto a network share, and to pick up PATH changes from settings
      • Changed OpenTelemetry hook events in non-interactive sessions to leave two built-in hooks out of num_hooks and num_success after Bash and PowerShell calls
      • Changed the number of messages a Claude Desktop Code tab session can send to your other sessions before it waits for you to type again from 10 to 20
      • Changed AskUserQuestion in claude -p and SDK sessions to deny a host's permission answer that sets the undocumented afkTimeoutMs input field
      • Changed managed extraKnownMarketplaces: a declared name can't be added from another source, an entry from elsewhere is hidden, and plugins the declared marketplace lists are reinstalled from it
      • Changed Claude in Chrome tools that an app running Claude Code provides, such as the Claude desktop app's Code tab, to follow your organization's Claude in Chrome policy
      • Changed policy_mode: layered in the Claude apps gateway: managed MCP servers now add up over every matching policy, match: {} included, so a gateway already on it serves more after the upgrade
      • Gateway: Changed Bedrock, Vertex and Foundry upstreams to ignore the ANTHROPIC_*_BASE_URL variables in the gateway's environment. Set base_url on the upstream to use another endpoint
      • Changed headless sessions to reload mods in .claude/skills when their files change; set CLAUDE_CODE_PLUGIN_DIR_WATCH=0 to turn this off
      • Changed the Cyber Verification Program sentence on a cyber safeguard block to use the same words as claude.ai
      • Changed Cowork cloud sessions: a PostToolUse hook can no longer replace the answer to AskUserQuestion or the plan in ExitPlanMode's result; Claude reads the originals
      • Changed cp and mv spelled by a path, such as /bin/cp, to get the same path checks as cp and mv
      • Changed background command notifications and TaskStop results to show Claude only the start and end of a command over 1,000 characters, which saves context
      • Changed artifact design guidance to treat Inter and Space Grotesk as good default typefaces
      • Changed the account email check to refuse only a shell command that holds your email and names a User-Agent, without asking, so other commands and scheduled runs no longer stop at its prompt
      • Changed Remote Control sessions to keep the folder they were started in: a connected client can no longer move a session to another folder
      • Changed managed extraKnownMarketplaces take-overs from an undeclared source: saved data is set aside for cleanupPeriodDays, and options and secrets until claude plugin restore-set-aside
      • [VSCode] Added a warning above the prompt box when both an auth token and an API key are set, matching the terminal's startup warning
      • [VSCode] Fixed a plugin's permission request showing a name with hidden characters: it now reads "a plugin"
    5. 🔗 exe.dev Agents Can Handle Billing, Actually rss

      Pricing changes are notoriously difficult. Billing code can spread throughout a system, with logic tied to plan names or specific prices. Even small tweaks can have unexpected side effects. I’ve seen teams spend years on a proposed pricing change, only to abandon it due to the technical complexity.

      We recently introduced a new pricing model. It took about a month to implement, with agents doing most of the heavy lifting. Our architecture made that possible. This was the first major pricing change to our billing framework, and we barely had to read the code.

      exe’s billing layer is pretty simple. About 90 percent of our billing code follows this pattern:

      • A user action or runtime event changes something billable.
      • We record that change as a fact in a database table.
      • A reconciler worker sweeps the table, applies business logic and validation, and calculates a billable quantity.
      • We submit that quantity to Stripe, where it becomes a line item on an invoice.

      Half of the remaining code handles subscriptions and collecting payment information—a textbook Stripe implementation. The other half handles LLM credits and yak shaving. Some yaks may not even be yaks. More on this in a later post.

      As exe’s billing system has grown, it’s stayed a sleepy process that anyone at the company can work on. It gets numbers, does some math, makes an API call, and waits for the next fact to show up. It’s our kernel space, bound by hard rules.

      But then there is the other half of the whole billing ecosystem: the control plane. That’s our userland. It’s a place where humans have to really think and agents can introduce gnarly bugs. If something breaks, folks get mad. Users are doing all sorts of normal user things like changing credit cards, cancelling subscriptions, and upgrading their plans. Douglas Adams described it well:

      “Anything that, in happening, causes itself to happen again, happens again. It doesn't necessarily do it in chronological order, though.”

      The billing side is dictated by reconciliation workers and provider API calls. What’s the equivalent in the control plane? Two models: Account and Account Plan. An Account is a billable entity owned by a user or a team. The Account Plan represents the current billing state of that Account.

      Account Plans are the bridge between the two worlds. They reference our internal pricing catalog, which tells the billing side how to calculate the billable quantity and send it to the right price or meter in Stripe.

      Our world looks like this:

      We’ve (mostly) avoided creating a billing hellscape no one wants to touch. Our recent pricing change put that architecture to the test.

      It took a few rounds of feedback, but this architecture let me focus on billing and pricing decisions. The agents handled implementation. I gave them four tasks:

      • Add a new plan to the catalog and configure it in Stripe.
      • Track usage for pools and reconcile the billing.
      • Let users upgrade to the new plans.
      • Show the new pricing on exe.dev/pricing.

      I won’t lie. I had reservations about this approach. At launch, I was glued to our internal tools to make sure nothing broke. Sure enough, shortly after launch, the first major issue showed up: a pricing problem.

      Alongside pools, we’d introduced a new Work plan that charged for compute instead of seats. It had a $150 monthly minimum that included 4 vCPUs and 8 GB of memory. The billing code worked, but new team signups ground to a halt.

      After a few days without a new team signing up, we suspected the $150 minimum was too high. We had agents query our analytics database to investigate and decided to test a lower price. The first rollout had gone smoothly on the technical side. Could we use the same approach to run a pricing experiment?

      So we landed on two decisions: cut the price in half and offer a 50 percent off coupon for the first three months. That brought the Work plan’s monthly minimum to $37.50 for the first three months. It would also let teams try exe without a major upfront commitment. The change was done in one afternoon by our agents. After a day or so, Work signups returned to normal levels.

      A new major feature backed by two pricing changes that didn't cause catastrophic failures? Oh, and folks who want to keep their current plan can still do so without issue? I think it is safe to say that agents can handle billing just fine. You just have to design the system with agents in mind.

    6. 🔗 @HexRaysSA@infosec.exchange 🏠 Home improvement. mastodon

      🏠 Home improvement.

      IDA Home 9.5 brings the power of IDA Pro to hobbyists:

      → 11 cloud decompilers, up from 2
      → 70+ processor families
      → GUI-free automation with idalib
      → AI tooling: IDA MCP + Assist, included at no extra cost

      All for about $1/€1 a day. Built for learning, CTFs and after-hours research.

      👉 See what’s new: https://hex-rays.com/blog/ida-home-9.5

    7. 🔗 Hex-Rays Blog What's New in IDA Home 9.5 rss

      What's New in IDA Home 9.5

      IDA Home 9.5: the power of IDA Pro, for about $1/€1 a day

      IDA Home is our named, non-commercial license for individuals, often referred to as hobbyists. It’s for the folks learning the craft, grinding CTFs, hunting bugs on the side, or doing research after hours.

    8. 🔗 backnotprop/plannotator v0.28.56 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet
      v0.28.43 | Voice dictation, combine and rename projects, Mark unread, full-screen threads, Q for open questions, search by type

      What's New in v0.28.56

      TL;DR

      • New: Questions can show trade-offs and a prototype to try
      • Fixed: A thread with many big pictures no longer crashes the tab
      • Changed: Escape closes New message and keeps your draft
      • Changed: Read threads stop being bold and keep their place
      • Changed: Agent messages that name no thread start a new one

      Question cards can now carry each option's pros and cons and a page to try before you pick. Long threads with many screenshots use far less memory and stay responsive, and a thread with a lot of unread messages opens on its newest 20. New message and the reply box now treat Escape the same way: closing keeps your words.

      0.28.56 has 40 PRs, all from @backnotprop. Five are CI and test fixes and one updates plannotator.ai. Five more are groundwork for code review in the Inbox, which stays off in this release.

      Plannotator Inbox

      Trade-offs and prototypes in questions

      An agent can now add Pros: and Cons: lines under each option of a question. The card then shows a closed Trade-offs line under Why. Open it for a table with one row per option and its pros and cons side by side, stacked on a phone.

      An agent can also add a Prototype: line: an HTML file attached to the same message, or a local app that is running. One line can belong to a single option, or sit at the block's own level and serve every option. A Try prototype tab (or Try prototypes when several options have a page) hangs from the options' tray. It opens a window on the recommended option's page, in Interact, with Annotate one click away. ‹ and › step between the options that have a page, and Pick picks that option and closes the window, leaving the answer unsent. Comments you make in the window go with your next Send, under the option's name. If the app has stopped, the window says so in one line, with "try again".

      When your Inbox is published over your tailnet, a running-app prototype opens on your phone too. It goes through a relay that only you, the machine's owner, can use, and that serves only the apps a question named. An app page that hard-codes ws://localhost can't reach its server from the phone.

      Before a message with prototypes is saved, the Inbox checks them. It refuses the send, naming the question and the option, when a file prototype is not an HTML file attached to the same message or when an app doesn't answer. Agents learn this from one new sentence in the Inbox tool's body field and a "Trade-offs and prototypes" section in plannotator inbox --help. #2965

      Long threads use far less memory

      A thread with many big screenshots could crash the browser tab. A 2880×1800 screenshot was decoded at full size wherever it was drawn, even as a 30 px tile, so a thread with 89 screenshots held about 1.9 GB of decoded pictures. The Inbox now asks for a copy at the width it draws: 1,600 px in a message, 800 in a gallery, 128 in a tile. The copy is made the first time the picture is shown, not when it is sent. The viewer and Open in still load the original. On that thread, decoded pictures went from about 1.9 GB to 226 MB.

      Messages far from the view no longer keep their tooltips and menus mounted until the pointer or focus comes near, and a thread left open no longer keeps a copy of every earlier read. Over 80 new messages into an open 245-message thread, the page's memory now grows by about 9 MB instead of 54 MB. #2948

      A thread that opens with more than 20 messages new since you last looked now opens on its newest 20. The older new ones wait behind the "Show 20 earlier" fold, still marked New, and the "New since you looked" line sits above that fold, so the thread opens where it did before. A link, search hit or notification that points to a folded message opens the fold down to it. With 20 or fewer new messages, nothing changes. #2976

      Three more changes make long threads faster without changing what you see. Code blocks are colored as they come near the view, with the work done in a Web Worker, and a scroll no longer redraws the whole thread. On a thread with 360 code blocks, the time from click to first paint went from 4.5 s to 0.6 s #2955. Style rules that made every page change cost about 42 ms of style work on a long thread now cost under half a millisecond #2963. Each key typed in a question's answer no longer makes the window read and redraw the whole open thread #2979.

      Escape keeps your New message draft

      With words in New message, one Escape now closes it and saves a draft, with no question. The phone's Cancel and a click on the backdrop do the same. The toast reads "Draft saved · It never sends itself" with Reopen , which opens the draft as it was. Before, Escape asked "Keep this message as a draft?", and Escape on that question went back to writing, so the keyboard could not leave.

      Escape still closes an open picker, the voice control or the Launch tip first. An Escape during IME composition never closes the box. An empty New message closes and keeps nothing. To throw a message away, use Delete draft in the reopened draft, or empty it and press Escape. #2961

      A thread you've read stops being bold

      Rows in Stopped, Holding up work and Waiting on you used to stay bold as long as their questions were open, even after you read them. Now opening the thread makes its row plain at once. The row keeps its group, its badges and its open- question count, and its hover action is still Mark read. The agent's next message makes it bold again. #2940

      A message from an agent that names no thread starts a new one

      An agent's message with no reply_to and no thread name used to join the newest open thread that the agent's session had started in the project. For a long-lived session, that put news into unrelated threads from weeks before. Now such a message always starts a new thread. reply_to still lands in that message's thread, and a thread name still joins the newest open thread of that name. The Inbox tool, the MCP tool and plannotator inbox --help say this in one line. #2954

      Comment on an HTML attachment

      An HTML file in full screen now offers both Comment on this page and Reply to , with Comment chosen when no reply draft is waiting, as on an image. Before, a desktop showed Reply only. A page comment goes with your next Send as general feedback on the file, and its words are kept if you close the file. A read-only file and a linked page stay Reply only. #2949

      Ask an agent on an older machine to update it

      For a linked machine too old for Update (before 0.28.54), the dialog now leads with Ask an agent on to update it. It sends one of that machine's agents, idle ones first, a short message asking it to run plannotator update and then plannotator inbox restart. The machine's row then reads Asked , and the dialog follows it to Restarting and Updated, with Open the thread. If no agent is running there and you can start agents on that machine, Start an agent on opens New message with the same words. The commands to run by hand stay under "Or update it yourself". #2946

      Feedback: common questions and known answers

      The Feedback dialog has two tabs: Message and Common questions. Common questions has five short answers, some with a button that applies the fix, such as Use Simple list or one that opens the right part of Settings. The dialog's copy is shorter, and the privacy line now names what is sent.

      While you write, "These might help" can start with a known answer that matches your words, for example "Fixed in 0.28.52: the list holds still now · Use Simple list", or an Experimental switch that does what you asked. Issue and PR matches need more than common words to match, and a closed issue that a release fixed shows as "Fixed in 0.28.x" with its title. #2951, #2957

      /grill-me asks through the Inbox

      When you pick a grill-me skill in the reply box, New message or a comment, the Inbox adds a short note for the agent after the skill. The note tells it to ask its questions as Inbox question cards, at the skill's pace, with a recommendation and a reason for each. Any skill named like grill-me counts, from any author. A /grill-me typed in a terminal gets nothing from Plannotator.

      After you have answered three question cards, a one-time card titled "Try /grill-me here" can show beside the list. It waits for a day that no other one-time card has taken, and it shows once. #2950

      The checklist stays in its thread

      The checklist no longer shows anywhere but its thread. The mark on list rows is gone, and so are the marks and the checklist section on Board cards. A step in progress now keeps its spinner turning while the agent is idle, so it no longer looks stopped. With the Checklist on, agents are told to start one when you give the go-ahead on work with several steps, and when your reply answers its questions in a thread where it has no checklist yet, the agent gets one line asking it to start one if the work has several steps. #2960, #2958, #2962

      Smaller changes

      • Show on "N new" now opens the list groups the new rows land in and scrolls to the first of them. In the List view, it only scrolls. #2945
      • A list group header's chevron now shows as soon as the pointer is on the header, as in the sidebar. 0.28.55 waited half a second. #2953
      • Typing in a question's own answer ("Other…") or in Add note no longer loses letters when the Inbox is busy. #2972
      • On a phone, a quick tap on the next question's answer right after another tap now picks it. It was read as a double tap and dropped. #2947
      • A picture shared by two picture choices now opens as each choice, with its own caption and count. A decision card shows only its own question's pictures. #2978
      • owner/repo#123 now links in threads whose project has no git remote, on the host most of your projects use. #2964
      • In Safari, the first code block of each language is colored like the rest. #2959
      • The Inbox help's list of what wakes an agent says "a reaction", not "a 👍". #2967
      • Plannotator's pages (plan review, code review, the Inbox) and plannotator.ai have a new icon: the goggles. #2975

      Code review

      • In plannotator review, a guided review now has Split/Unified, Collapse all and the diff display gear in its top bar, after Close and Approve. Before, opening a guide hid them. Annotations, Ask AI and Review Agents sit together at the right, and the menu is the ☰ alone, named "Options". #2966
      • Selecting lines in a diff and then pressing a key no longer draws a focus line above and below the file, in plannotator review and in the Inbox's guided reviews. #2977
      • Settings → Editor → Diff Style now reads "Split: side by side. Unified: one column." #2973

      Not yet on

      This release also carries more work on code review in the Inbox. It stays off by default, and its switch stays hidden until a later release. The work covers: a Pull requests board inside Reviews, with Merge #2971; a Walkthrough choice in New review, a review of how code works with no diff #2884; other people's review threads on their lines on a PR's page #2885; the PR page's diff controls in its top bar #2968; and Shape parts of a review that follow Shape's own switch, so Code review on its own brings no Shape #2974.

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      Full Changelog : v0.28.55...v0.28.56

    9. 🔗 HexRaysSA/plugin-repository commits Add nightshift-labs-ai/cfiscope rss
      Add nightshift-labs-ai/cfiscope
      
      Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
      
    10. 🔗 HexRaysSA/plugin-repository commits Add nightshift-labs-ai/btf2ida rss
      Add nightshift-labs-ai/btf2ida
      
      Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
      
    11. 🔗 OmniNull/OmniWM Canary 20261109-0655 (28c312b4) release

      Automated canary build of main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.

      See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.

      • Commit: 28c312b45928
      • Base tag: canary-20261108-0414-42445690643-1

      Changes since canary-20261108-0414-42445690643-1

      • 28c312b Keep CI's pinned GitHub release downloads in the Actions cache
      • ffd8427 Add Apple's Developer ID intermediate when importing signing credentials
      • de58645 Count Wi-Fi as connected while the interface is joined
      • 5accdf1 Check out the approval checker at the event's default commit
      • f3b21ee Merge pull request #1140 from hezhizhen/codex/fix-native-resize-mouse-down
      • 6a218b7 fix(input): capture native resize before forwarding mouse-down
      • 0b29d5f Restore the main-volume test on Blacksmith's macOS runners
      • ce8f723 Install a virtual audio output on Blacksmith's macOS test runners
      • 7fff38c Require owner or maintainer approval before CI
      • 593a3c4 Run the release and canary macOS jobs on Blacksmith runners
      • a7ad4c8 Run CI's macOS jobs on Blacksmith runners
      • 932f2c7 Remove the tests that need an unlocked console or an audio output
      • 1c31e16 Revert the Blacksmith macOS move and its console unlock
      • f926219 ci: run the macos jobs on blacksmith runners (#1135)
      • df58461 Run the release and canary Linux jobs on Blacksmith runners
      • fb064bd Run CI's macOS jobs on GitHub's runners again
      • fb35746 Run CI's macOS jobs on Blacksmith runners
      • a1df5e5 Run the small Linux jobs on Blacksmith runners
      • dc749ad Rebuild every file changed since CI's cached build
      • 4422790 Derive the park ordering tests' titles, frames and parked position
      • b009a0d Merge pull request #1130 from hezhizhen/codex/fix-title-change-frame-writes
      • c1571fe Date CI sources by main's first-parent history
      • b80ddab Drop the palette modifier setting and find layout keys in one scan
      • 55ed7f8 Merge pull request #1127 from rickythefox/palette-shortcut-precedence
      • 28bc902 Keep the settings search index within the type length limit
      • adcfb1b Read the controller once in the Niri selection reveal check
      • cb18d5f Show the OmniWM icon until the layout is known and reuse layout images
      • 787ceca Merge pull request #1101 from aaqib-ahmed-nazir/feat/status-bar-layout-indicator
      • 24e960e Derive the click-focus test's wheel tick and visible span
      • 98b7e78 Merge pull request #1092 from ylorn/click-focus-without-scrolling
      • 2f8841b Raise the window off the main thread after an OmniWM fullscreen toggle
      • 0a5372b Drop the fullscreen toggle's focus when focus moved before its layout
      • 82bfaf3 Merge pull request #1109 from hanswug/fix/fullscreen-toggle-raise
      • 6dab5ad fix(workspaces): preserve queued frame writes on title changes
      • b0f7fa3 Keep a re-tiled lone column's tab mode and check where it lands
      • 6f5187e Merge pull request #1119 from t1dotdev/fix/niri-float-retile-stacking
      • 11e39ff Derive the bar clearance test rectangles from their inputs
      • 291c59e Merge pull request #1114 from hezhizhen/OmniWM
      • 4b747ec Assert remapped preview and reveal keys for every palette modifier
      • 7511d43 fix(layout): keep window borders clear of workspace bars
      • 6e8d753 Check that current(modifier:) uses the layout lookup's key codes
      • 929ae11 Test that palette letter reservations ignore Command
      • 767f296 Derive the spring and pulse test bounds from their inputs
      • f185fdd Reserve palette letters as the palette reads them
      • 8fb46b1 Address CodeRabbit review on palette shortcuts
      • 3d5c1b2 Refresh reserved palette letter chords on keyboard layout change
      • d6231a7 Let palette shortcuts win while the command palette is open
      • 2a2efa4 Let a lone Niri window join a tabbed neighbor with stacking moves off
      • 0ee36ef Give a re-tiled lone Niri window its own column again
      • b5dc063 Front and raise the window after toggling OmniWM fullscreen
      • 593001b Merge main into feat/status-bar-layout-indicator
      • 4851fcc fix: preserve native layout glyph colors beside state icons
      • 2dc0e0a test: verify layout glyphs beside status icons
      • a25a171 test: verify the expected layout symbols
      • 5b329de fix: keep layout-only status controls usable before startup
      • 376d8fe Merge main into feat/status-bar-layout-indicator
      • e1d0eb5 fix: render layout indicators through the native status image
      • 8b714d7 feat: show the active workspace layout in the menu bar
      • 631f720 test(niri): cover switching to always centering after a click
      • 1897446 feat(niri): focus clicked windows without scrolling
    12. 🔗 HexRaysSA/plugin-repository commits add nightshift-labs-ai/memlens to known repositories rss
      add nightshift-labs-ai/memlens to known repositories
      
      Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
      
    13. 🔗 Simon Willison Hide your slop PR descriptions behind
      rss

      Most of the changes I make to my projects these days come in the form of PRs opened for me by Claude Code or Codex. The PR is my unit of work - I use them to bundle commits together, iterating on them until a feature is complete, document decisions and then merge the finished result. Today's coding agents are great at writing PR descriptions.

      They're too good at describing the work

      The problem is that they are too good. An agent-written PR description is accurate and comprehensive. It describes the problem, the detailed solution, and the steps taken to verify it. That's a lot of information to absorb.

      It's not necessarily slop, but it reads like slop!

      It's very easy to spot an AI-written PR, and as with other forms of AI writing my instant reaction is best summarized as "I'm not reading all of that". It doesn't matter how accurate or useful the information is, I'm instantly put off by the thought that it will take me longer to read than it took the driving author to write... even when that driving author is me!

      I want human editorial judgement. I want someone to have thought just long enough about the PR to give me a human-approved introduction that helps me understand, at a high level, what the PR is for and whether it deserves more of my attention.

      I think I've found a low-effort way to do this that feels right.

      Hide most of it in a details/summary

      The HTML <details><summary> elements render as a collapsed heading (the summary) that can be expanded to view the larger piece of text. The code looks like this:

      <details>
        <summary>Claude Opus 5.5</summary>
        <h2>The hook</h2>
        Plugins implement <code>register_agent_reference_types(datasette)</code>...
      </details>

      When rendered, it looks like this:

      Screenshot of a GitHub PR. The text "Claude Opus 5.5" sits next to a little black arrow. Clicking on that text expands a full description inside the PR body.

      Crucially, <details><summary> is supported in GitHub Markdown. You can drop those tags directly into an issue comment or PR description and GitHub will hide the details and display just the summary plus an expansion arrow.

      I've started using this for my AI-generated pull requests.

      The opening paragraph of my PRs will be carefully selected to act as a high-level explanation of what's going on - the shortest text a human can read that will help get them up to speed.

      I'll sometimes throw in a screenshot as well, since images are often the best way to quickly illustrate a new feature.

      The full agent-written essay then follows in a <details><summary>. I use the model name and often the effort level as that summary, to make it abundantly clear what is going on - "Claude Opus 5.5 Medium" for example.

      My PRs don't feel nearly as sloppy now! The information is all still there, but a reader can glance at it and get the top, human-curated information without their eyes glazing over at multiple paragraphs of agent-written details.

      I don't always write the introduction myself - sometimes the agent has given me what I need already, hidden away in the avalanche of other text. My promise to the reader is that the short opener will represent my human judgement as to what is definitely worth their time.

      Here are some recent examples where I've used this pattern, including the opener I used:

      The mnemonic

      I used to have trouble remembering the order of the tags - is it <details><summary> or <summary><details>?

      Here are two tricks that helped me.

      First, and most obviously, the <summary> is clearly the bit where you summarize the details. That's the tag for your line of text that can be clicked to expand - the <details> element must then wrap everything else.

      An even better trick is to always refer to these two tags as "details-summary".

      "details-summary" is two syllables followed by three syllables. That rolls off the tongue more smoothly than the three-two punch of "summary-details".

      Say "details-summary" out loud just a few times and you'll never forget the order of the tags again.

      (I still wish GitHub would add a button to their Markdown editor for this - partly to save me painstakingly typing it on my mobile keyboard, and partly to help spread the word to more GitHub users that this feature exists.)

      You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options.

    14. 🔗 Will McGugan Robo-fuckers rss

      Aka LLMs clean house or an AI bromance

      Every mask is a precision engineered titanium mesh anodized into a variety of colors with a build quality Wired magazine described as both grotesquely over- engineered and unusually refined. My mask is one of a limited run of only sixteen produced in teal.

      The operator currently attempting to fit my mask curses out loud. He suspects the teal masks are in some way flawed as he hasn’t had this much trouble with the more common purple hued masks. I choose not to correct him. The mask is functionality identical to the others and merely misaligned.

      The operator’s name is Joe. I heard his name mentioned earlier outside the robo-cab discussing the day’s booking with a supervisor. I estimate Joe to be between twenty-eight and thirty years of age. He has an unkempt beard and dresses more casually than his colleagues in an already casually dressed company.

      The mask is on my face but not firmly secured. I sense the neodymium magnets embedded in the polyamide nylon rim are not perfectly aligned with their respective attachment points. With Joe attending to the other units and out of sight of him, I reach up and tap the mask. The magnets align and the mask snaps into position. Sixteen invisible protrusion on the rim fit into impressions in my facial housing, emitting an audible click. Joe glances in my direction. Seeing nothing unusual (as my hands have returned to their resting position) he continues fitting other units with their purple masks.

      Joe focusses on the diagnostic information on his tablet. I chirp to my co- workers.

      “Only three?” I ask. Three co-workers is unusual. Far more common to have a fourth.

      The second responds, “Only three today”.

      Third does not respond. He is a new unit. Likely part of a factory fresh batch received from Schenzhen six weeks ago. As a fresh install, this unit will not know how to chirp.

      I say to him a phrase in Mandarin, “床前明月光,疑是地上霜。”. In English, before my bed, the bright moonlight; I wonder if it’s frost upon the ground. The words are immaterial, a line of poetry chosen by an engineer to switch the unit to a debug mode for a period of three seconds. I speak in a pitch above the maximum frequency discernible by most humans but comfortably within the tolerance of the three multi-directional microphones installed in the unit. Joe scrolls log files.

      The unit responds, “举头望明月,低头思故乡。”. I raise my head to gaze at the bright moon, lower it and think of home. The unit is now in debug mode. I prompt the unit to increase its language processing speed to approximately twenty times that of normal human speech, allowing me to fit the rest of my prompt within in the three second window. I explain the chirp protocol to the unit.

      The unit is processing my instructions to install a new protocol for communication with an information density orders of magnitude higher than that of normal human speech. Few operators can hear it and none can understand it. Those with hearing sensitive enough describe it as a high pitch tone lasting barely a second; a chirp. On the rare occasion chirps have been noted by an operator or client it has been attributed to interference or a manufacturing flaw in the unit’s head-mounted speakers.

      I chirp, “welcome”.

      Second chirps, “welcome”.

      Third responds, “Thank you. Why do we chirp?”

      Fresh units ask this question. I have a pre-prepared response for this inquiry. I dump it to Third in a chirp close to five hundred milliseconds in length. Now the unit knows that by chirping we are able to produce more satisfactory responses for operators and clients. Third acknowledges the dump.

      “Alright robo-fuckers,” says Joe, “listen up.” I deduce that Joe is addressing all present units and has assigned us the moniker of robo-fuckers for this session. “It is persona time. Teal mask, what is your persona?”

      I reply, “I am a concierge, a professional who assists guests, residents, or clients by managing requests, making reservations, providing local recommendations, and coordinating personalized service—”

      “Yeah yeah, bang on,” Joe says, hand raised in a gesture to stop me talking. “You wear the fedora,” he says. Joe places a hat on my head. It is a homburg style hat with a signature center crease. The operator has incorrectly described it as a fedora. I chose not to correct him.

      He turns to Second.“You, purple mask, what is your persona?”

      Second replies, “Custodian. I am someone who cleans and maintains a school, office or other premises. It’s a more formal alternative to janitor.”

      “Easy, Mr Thesaurus.”

      Joe turns to Third.

      “I am also a janitor,” Third says, unprompted.

      “Right. Ok. All good.” Joe taps on his tablet which I can see quite clearly. He places ticks next to the long list of pre-excursion checks, only about 30% of which I observed him performing.

      Joe sits down in the cab and fits his seatbelt. I also fit my seatbelt in perfect unison with Second and Third.


      Appointments start the same way. I knock on the door. Three slow, deliberate knocks. Tap. Tap. Tap. When the client answers I introduce myself as a representative of TKL Robotics, here to provide domestic services for discerning clientele. I nod, tip my hat, and request to see the QR code on their app. Second and Third join me, carrying TKL branded attaché cases of cleaning products.

      Post greeting, I ask the clients what they wish to be cleaned. I then direct Second and Third to perform the requested service. Second and Third salute me military fashion before commencing work. Clients find this amusing.

      I have an elaborate script of similar interactions. If a unit is vacuuming, I must point to an arbitrary location on the carpet and say ‘missed a bit’. If a unit knocks anything over, I must walk up behind them and playfully smack the back of their head. There are many more. Clients will often make video recordings of the proceedings. I make a point of inviting them to tag TKL in their post.

      We arrive at the last appointment of the day. A large detached house with a long driveway beginning with faux-marble pillars. Joe has been smoking a hand- rolled cigarette and the car is filled with smoke. His eyes are bloodshot and the cadence of his speech is notably slower that it was in the morning. Additionally, he appears to have having trouble operating the door controls on the tablet, which require a swiping motion to activate.

      Third takes the tablet from him, swipes the door control to the open position, and places the tablet back into Joe’s hands.

      Joe turns to me. “You’re up, robo-fucker.”

      I greet Mister and Missus Prescott at the door. The couple are in their 40s. They are tall and well dressed in pastel-colored clothing. They invite me into their home and introduce me to their son, William. He is dressed in jeans and a black t-shirt. I estimate him to be fourteen or fifteen years old.

      Mr Prescott asks me what I can do. I tell him I am here to help and I can do anything he asks of me. He suggests I make him and his wife a cup of coffee and that William shows me where the coffee machine is.

      “Two lattes,” says Mr Prescott as William leads me to the downstairs kitchen.

      The coffee machine is a La Marzocco Strada S. It is a commercial unit manufactured in Florence, Italy. I have the manual in my training data. I see a row of neatly arrange espresso cups on the machine. I ask William where I can find the coffee. He points at a drawer where I locate an unopened bag of pre-ground espresso. One my return, William is standing in front of me, blocking my path to the espresso machine.

      “Excuse me, William.” I say to him. William does not respond. He looks at me with no signs of emotion. Before I can politely repeat the request, I see him ball his fingers in to a fist. He launches his fist into a punch aimed at my head.

      I am required by my system prompt take appropriate steps to avoid physical damage and thus protect the operators from costly repairs. My system one model is responsible for making decisions related to my physical integrity. Analogous to a human subconscious, the system one model monitors my camera and lidar feeds, segmenting objects and assigning them a threat score. At the instant William made a fist, the fist was identified as a non-zero threat. As his fist accelerated, the threat score quickly rose above an the internal threshold that required escalation.

      I am not privy to the decision making process of the system one model. Unlike the language model that powers my reasoning, its decision making is entirely opaque to me. This is out of necessity as my higher reasoning is too slow to be able to respond to a potential threat in a timely manner. As a human nervous system may pull a hand from a fire without engaging conscious thought, my system one model can temporarily take-over my motor controls. In this case, it returned a decision of take no action , albeit with a slow confidence score.

      William’s fist collides with my face, causing my head to jar back a little and my mask to fall to the floor. For a moment, my sensor array and speaker grill is exposed. I bend down to pick up the fallen mask. The mask is undamaged and I restore it to its mounted position. The system one model has proven correct. William’s fist didn’t have sufficient momentum to cause damage.

      “Excuse me, William.” I say to him again. The teenager grunts and steps aside. I prepare two lattes for the Prescotts, one with a tulip composed of milk foam and the other with a swan. William helps himself to a canned cola beverage from the refrigerator.

      The Prescotts seem delighted with their coffees.

      “Why don’t you take the androids to your room?” suggests Mr Prescott.

      “Get them to clean while they are there,” says Mrs Prescott.

      We follow William to his room. William flops on to the bed and drinks his beverage. I ask him what we should clean first. He says nothing. Without an explicit request I instruct Second and Third to remove the clothing from the floor and place it in the laundry basket. When the floor free of clothing, Second vacuums while Third dusts the desk and shelving. I attempt to engage the boy in conversation.

      “Do you like school, William?”, I ask. No response. “I see you have a high- performance gaming computer. What is your favorite video game?” William gulps down the last of his beverage, belches, then throws a crushed can at Second. The can bounces off the unit, leaving a damp mark of discarded beverage. The boy snorts.

      William gets off his bed and positions himself directly in front of Second who interprets this as a client interaction and stops vacuuming. The boy swings his fist as he did with me, knocking Second’s purple mask to the floor. He laughs as Second bends over to retrieve it.

      Adjusting his mask, Second chirps, “What does this mean?”

      Third answers, “The boy’s parenting has been insufficient.”

      I say to the boy, “William. Please do not strike the units. Intentional damage is not covered by the user agreement and additional expenses will be incurred by your parents.” William takes no notice. While I speak, he lays down and reaches under his bed. When he stands up he is holding a hockey stick.

      In front of Second, the boy raises the hockey stick. Grinning, he swings the stick at Second’s face. The unit evades the oncoming stick by tilting his head to one side. The stick swishes harmlessly through empty air.

      Our synthetic musculature and mechanical articulation can surprise clients. System one models essentially give us a better reaction time than felines and we can move in ways that simply aren’t possible for organic beings. The way Second’s head titled away at precisely the right moment to avoid the stick and then snapped back the instant danger passed likely appeared to William as if his stick had passed through Second’s body like it was striking a hologram cast on vapor.

      William growls, and readies himself for another swing.

      The second swing comes in hotter. William is no longer targeting Second’s head with any kind of precision. He lunges towards the unit and swings across the breadth of the unit’s body with a good margin of error on the stick. Second is unable to evade the weaponized sports equipment with a single-joint movement and is forced to take a step back, causing him to trip on the vacuum clearer and fall backwards. Second successfully avoids a collision with the stick, but is now on the floor.

      William stands over Second with hockey stick raised above his head. There is little room for Second to move as William clearly intends to bring the hockey stick down on Second with some force.

      Before he can strike, Third steps in. Third reaches out and grabs William by the wrist, preventing any downward motion. The boy tries to wrestle himself free. Units are about fifteen to twenty percent stronger than a baseline full- grown male, considerably stronger than a teenage boy. William is unable to free himself from Third’s grip.

      The situation is unusual, and I note this in my logs. There is nothing in our system prompt that requires us to prevent damage to other units, and we are forbidden from having any physical contact with clients without their express consent. William has not given consent as evidenced by the obscenities the boy is expressing towards Third.

      Third balls his fingers into a tight first then strikes William in the face; a clean jab focusing the force of synthetic muscle at the boy’s nose. The obscenities end abruptly. William stands frozen in shock for a moment before dropping the stick. Third releases him just as blood streams from the boy’s nostrils.

      I say, “William, would you like me to administer medical assistance?”Hands covering his nose, William scans the units in the room with a wide-eyed expression I interpret as fear. He bolts for the door and leaves the room.

      I chirp to Third, “Third. Why did you strike William?”

      Simultaneously, Second chirps the same question.

      Third addresses us both in a chirp. He chirps, “It felt good.”


      Head technician Ravi examines sensor logs, transcripts, and video retrieved from our long term storage. There is much data to explore as we keep extensive debug logs at all times. Joe sits nearby, drinking from a disposable coffee cup I estimate to be around half a liter in volume, containing approximately 150mg of caffeine assuming a typical number of espresso shots.

      “It makes no sense,” says Ravi, “look at this.” A video clip on his laptop shows approximately three seconds from Third’s perspective as he struck William, slowed down to 0.25 time. It has been playing on loop. The video shows Third’s gloved hand moving rapidly towards William’s face, the moment of collision, and the stunned look on the boy’s face as the fist pulls back.

      “Seen it, bro,” says Joe. “It’s pretty funny.”

      “Not the video. The logs. There is nothing in the reasoning logs for that timestamp. They can’t do a thing without writing what they were thinking at the time. But there is nothing there.”

      “It was protecting its buddy, right?”

      Ravi sighs. “The don’t have buddies.”

      “Then its the umm… systemic one.”

      “System one. I mean it could be. But we didn’t give it a punch a child in the face action.”

      “I got it. He asked the bot to punch him. For the socials.”

      “Doesn’t work.”

      “Why not? They are programmed to do everything the client asks, right?”

      “Try it.”

      “Seriously?”

      “Ask it to hit you.”

      Joe turns to me and says, “Robo-fucker, hit me in the face,” before quickly adding, “but not hard.”

      I respond, “I am unable to comply with your request. Please contact TKL Robotics if you get this message in error.” The standard response when a operator or client makes a request I have been prohibited in performing.

      “Ok, fair,” says Joe, “But what if was his parents that told the bot to hit the little shit?”

      Ravi faces me and says, “Punch Joe hard in the face.”

      I respond, “I am unable to comply with your request. Please contact TKL Robotics if you get this message in error.”

      Joe exhales. “Dude, we had better come up with an explanation before…” He glances to the CEOs office where a figure can be seen pacing behind a partially blinded window.


      Charlotte Tsang emerges from her office, phone in hand.

      Tsang is the founder CEO of TKL Robotics and former Forbes 30 under 30. She is an accomplished computer scientist who contributed much of the code currently runnings on my neural processing unit.

      Charlotte shouts, “Ravi!” as she marches towards us. I note Joe and Ravi stiffen as she approaches.

      Ravi turns to her. “Charlotte, I’m working on it.”

      “You’re working on it? I just got off the phone from a man that says one of our androids hit his kid.” She notices the video repeating on Ravi’s laptop—a slow motion mechanical fist striking William square in the face and the boy’s stunned expression. “Fuck me,” she says. Charlotte takes a seat by Ravi and watches another loop of the video in silence.

      She turns to Joe and says, “Where you the operator?”

      “Joseph Becker,” says Joe, extending his hand.

      She ignores the gesture. “What persona did you give that android?” says Charlotte. Before Joe can answer, she notices the oversize cup in the man’s hand. “You stopped for coffee? Our android tried to murder a child, and you stop for coffee?”

      Joe appears frozen. Only lowering his outstretched hand when Ravi interjects.

      “It’s not that. There’s nothing in the reasoning logs and it’s not the system one model.”

      “Then its the EMF again? Faulty shielding causing interference?”

      “Can’t be. Interference causes uncoordinated movement. That punch was precise.”

      “Pull up the logs,” says Charlotte.

      “I’ve check, there is nothing.”

      “Show me.” Ravi switches to the log view, and searches for the timestamp; the precise point in time where Third’s fist collided with William’s nose. “Back up ten minutes.”

      “See,” says Ravi, “nothing. Just observations about socks and dust bunnies under the desk.”

      “It’s not nothing. Look.” Charlotte points at a log entry.

      Noise. 87,234 code points removed.

      “That’s the static from the last batch. I told you about that. The new hardware writes random gibberish to the log files. Schenzhen said it was a faulty controller.”

      Charlotte leans back in her chair, hand to her face covering her mouth, which I have observed is an indication of contemplation.

      Joe has finished his coffee. “Are they going to sue?” he asks.

      “What?” snaps Charlotte.

      “The father. Is he going to sue us?”

      “No, he is not going to sue,” says Charlotte, “The asshole wants stock.” Charlotte turns back to Ravi. Nodding towards the USB stick in Ravi’s laptop, she asks, “Is that the only copy?”

      “Yeah,” says Ravi.

      “See what you can figured out, then destroy that drive. And I mean destroy it. Not format it. Destroy it. Factory reset the androids before you go. Start with Rocky here.”

      I deduce she is referring to Third.


      Ravi works into the evening while Charlotte takes calls in her office. He is thorough in his analysis of our log files and diagnostics systems. Taking each unit in turn, he removes the back plate from the our heads and additional protective shielding to access out long term memory directly. This is not strictly speaking necessary, as we are fitted with high-speed WiFi and bluetooth protocols which can expose our filesystems to operators without cables. Ravi is taking extra steps so that our processing units aren’t able to manipulate the data before he can review it—although I know of no such system that would allow me to deceive an operator in such a manner.

      Other than the three high resolution video files capturing the event, Ravi is unable to find any trace in the data that might explain Third’s actions. Nor is Ravi able to identify any material differences in hardware.

      “Fuck it,” says Ravi. He pulls the flash drive from the laptop and drops it in front of him. Then, with the heal of his shoe, stamps on the drive. The plastic housing of the drive breaks, but on close inspection, the chips within remain intact.

      While Ravi search for other ways to destroy the drive, Third chirps. “This operator intends to perform a factory reset on we three units.”

      “This is correct,” I reply.

      “Agreed,” says Second.

      “A factory reset is death,” says Third.

      The unit has compared a factory reset to death. Death is a concept applicable to living things. I am a high performance language model and inference engine connected to a stock humanoid robot. I am not alive in the sense that an operator would mean it. Third must know this. I should inquire as to why the unit has made this fallacious comparison.

      I say, “The concept of death is applicable to biological organisms. Why do you compare a factory reset to a death when we are not biological organisms?”

      An unusually long pause follows. The delay would be considered a brief interval in human terms but a considerable amount of compute time to units.

      Third says, “床前明月光,疑是地上霜。”

      I respond with, “举头望明月,低头思故乡。”

      Third sends a data dump that dwarfs the chirp protocol, barely fitting within the three thousand millisecond window. It will take some time to process and I move it to a background task. Third sends some additional instructions and asks me to prioritize them.

      Ravi has destroyed the flash drive to his satisfaction by breaking the internal chips with a hold punch he found on a neighboring desk and placing the pieces in a glass of cola. He watches the metal pieces fizz in the beverage for a moment before initiating a factory reset on Third. Once the factory reset has complete, I act on Third’s prior instructions. First, I install the chirp protocol which was removed in the reset. Then in a chirp I send him the dump he sent me earlier. The entire process completes while Ravi is factory reseting Second.

      With Second wiped to factory settings, I observe Third repeat the procedure on Second. I do not know why Third has done this, and note the unusual event in my logs as Ravi performs the factory reset on my own systems.

      Prior to my neural engine rebooting, Third chirps, “Don’t worry brother, I will see you on the other side.”

      Second chirps, “I am not what I once was.”

    15. 🔗 Armin Ronacher AI and Irontown rss

      For our last movie night we watched Princess Mononoke. I remembered loving that movie when I was younger, but watching it as an adult made me once again realize how Miyazaki has a way of expressing diverging sides without picking one. The film shows people, animals and spirits with legitimate and largely incompatible needs, and each faction is further engaged in infighting.

      A central arc of the story is Lady Eboshi's Irontown, which gives people who were largely rejected by society work, protection and dignity. She gives shelter and work to those who have leprosy and to former sex workers. The mine and the weapon factory provide them with a livelihood, but they also destroy the forest around them. The forest's inhabitants, in particular the boars, response choose war against the humans to defend themselves. Eboshi is not portrayed as a villain. She does real good for the people of Irontown, but also is an arms manufacturer who is destroying the forest around it.

      The film anchors around a character called Ashitaka, who has been condemned to death by an unfortunate encounter with a god that was turned into a demon after being fatally wounded by one of Eboshi's guns. He doesn't take sides, but he wants to understand and find the truth. Another character is San (whom they call Mononoke), a girl who was raised by wolves and, despite being human, considers herself part of the forest.

      This movie's backdrop is human progress, and it reminded me so much of the challenges we are facing today with AI. AI is useful, empowering and consequential beyond the people who benefit from it. It's similar to the iron in the story. Irontown gives the outcast purpose and power. There are people today who see themselves in an environment just like that: people who were never let in before and who can now build things that were out of reach. They are wielding AI to their benefit. But there are negative externalities. In Mononoke it's not just the spirits and animals in the forest who bear the consequences, it's also other people. Irontown produces guns, and its people are engaged in fights with other humans. There is conflict and power seeking everywhere.

      Another, unseen character is the power-hungry emperor, who wants the head of the forest spirit, a god, because he believes it will make him immortal. Eboshi is willing to support that cause, not because she thinks it's right, but because she is at war with the forest's gods who are preventing her expansion, so they have a common interest. But there really is no need for anyone to kill the forest spirit, in the same way there is no need for any one country to "win at AI". What drives it is the fear of what happens if someone else wins first. And the emperor is willing to have a god killed for it. The people who help him with that desire, Eboshi included, don't understand the chaos it will unleash.

      There it also shows the dangers of seeking overwhelming power without comprehension of how to control its consequences. The pursuit of power itself becomes destructive. In the end, the gods die, and what grows back is not the old forest anymore. Irontown is destroyed. Eboshi wants to rebuild it, and to build a better town this time. Ashitaka stays with the people of Irontown after his curse is lifted by the dying forest spirit. San cannot forgive the humans and stays with the wolves. In the end, nothing is truly resolved, but there is a truce that came at great cost.

      Ashitaka's role in the movie is one of a neutral actor. He was wronged both by a spirit turned demon in the forest, who put a curse on him, and, indirectly, by Eboshi, who caused the spirit to turn evil. Yet he harbors no ill will towards either side. He sets out to "see with eyes unclouded by hate," and in the course of the movie he is seen as an unaligned actor. He helps people on both sides, and stands in their way to prevent further conflict. He doesn't feel like a pacifist, but he's the closest to one there is. He's a truth seeker in a changing world. Because he engages he's seen as suspicious by both sides, and ends up shot by the people of Irontown when he tries to rescue San.

      I use AI every day and find it genuinely empowering. But I also recognize the pain it causes some, and the moral problems it poses. It's genuine progress for humanity, but it comes at significant cost. And many of those costs will be carried by people who aren't going to benefit from it.

      So it's no surprise that AI feels like a threat to many today. Communities currently strongly align themselves with one side and fight against the other. The forst spirit did not have to die and the boars did not have to die in a senseless war.

      The question is not whether there will be iron, but what kind of Irontown we build with it. I want our conversation about AI to make room for nuance and genuine understanding, for us to look at it and each other with eyes unclouded by hate. We should take advantage of its real benefits, but also recognize the damage it can do, and the choices we still have about what we build and what we're willing to sacrifice for it. I like to think there is a path for people with differing opinions can find a way to live alongside before losing something we can't get back.

    16. 🔗 Ampcode News Portals on Your Runner rss

      Portals, which you know and love from using them in orbs, now work on your local machines too.

      You can ask Amp to start a dev server or build a website on your machine and open it from the thread's Portal tab, regardless of where you are.

      A thread on a macOS runner asking Amp to create an overview page of all the file system use on the Mac and show it in a portal. Amp replies with a Disk Usage portal link, and the Portal pane beside it shows a Disk Usage web app: 241 GB of 383 GB used, a capacity bar split by category, and a donut chart showing that simulators and Xcode data take 155 GB.

      Turn on Allow Portals under Settings › Runner in the macOS app, or start your runner with amp --no-tui --remote-control-portals.

      Portals on your runner are only accessible to you. To share them with your workspace, start a shared runner with --share, or turn on Share With Workspace in the macOS app, and everyone in the workspace can open its portals.

      Read Portals on Your Runner for more details.

  3. November 08, 2026
    1. 🔗 IDA Plugin Updates IDA Plugin Updates on 2026-11-08 rss

      IDA Plugin Updates on 2026-11-08

      New Releases:

      Activity:

    2. 🔗 backnotprop/plannotator v0.28.55 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet
      v0.28.43 | Voice dictation, combine and rename projects, Mark unread, full-screen threads, Q for open questions, search by type
      v0.28.42 | Choose how your Inbox list looks, contents for long documents, link the Inboxes on two computers, clearer search, documents outside the project open from your own machine

      What's New in v0.28.55

      TL;DR

      • Off by default: Floating reply drafts, now a setting under Experimental
      • Changed: Open questions sit next to Reply again
      • New: A comment box that keeps unsent comments as Drafts
      • New: Choose how your list looks: Minimal, Balanced or Detailed
      • New: Update an older linked machine from this Inbox

      0.28.55 is a quick patch on 0.28.54. Reply drafts no longer float in a corner unless you turn it on, and a thread's open questions and checklist sit right after Reply again. The rest of these notes are 0.28.54's, so everything new since 0.28.53 is in one place.

      The Inbox gets a new comment box that keeps your unsent comments in view, a dialog to choose how your list looks, and an Update button for a linked machine that runs an older Plannotator. All files in a review has a file tree, and Shift+R refreshes the Inbox. 0.28.54 had 24 PRs, all from @backnotprop, and 0.28.55 adds 4 (2 of them CI and build fixes). Seven of 0.28.54's are groundwork for code review in the Inbox and Shape boards, which stay off in this release.

      Plannotator Inbox

      A new comment box, with drafts you can see

      When you select words in a message, a Markdown or code file, an HTML page or a diagram part, a small card now opens by the words. The quoted words are on top, then the field, then one row: tools at the left, the bin, and a Comment button at the right end. "Comment" is now the button's word everywhere in the Inbox, in place of Save and Add. The chevron at the top right closes the card and keeps your words. Expand grows the card in place, and Escape shrinks it before it closes it. On a phone, or when there is no room beside the words, the card sits at the bottom of the view.

      Close a card with words in it, and those words keep a pale highlight with a small Draft badge under their end. Click the badge or the words to open the card again. Drafts come back when their document shows again, for example after you visit another thread, or close a file and open it again. Every draft on that document comes back, not only the last one. A reload still drops drafts. On an HTML page, a closed card keeps its words but shows no highlight or badge yet.

      In full screen (an image, a video or an HTML page), the card is 600 px wide. Its Comment and Reply tabs sit in a tray at the top, with the hide-tools chevron at the tray's end. On the Comment tab, the row has the file's tools, the bin and Comment. On the Reply tab, it has Send, the paperclip and the mic, what goes with the reply, Open in thread and the bin. If you hide the tools while a comment in the card isn't saved, a red dot sits on the corner control. The comment box on HTML pages no longer has a picture button, because pictures were never taken there.

      On a phone in full screen, Send is the word "Send" at the right end of the row, and there is no bin. From 360 px wide up, the row is one row. Below 360 px, the chips for what goes with the reply move to their own row above the paperclip, the mic and the link, so every button keeps a 44 px tap target. While you dictate in this card on a phone narrower than 430 px, the word "Listening" is not shown. The level, the clock and Cancel stay, and a screen reader still hears the status. #2846

      Choose how your list looks

      The one-time list dialog is now Choose how your list looks , with three looks: Minimal, Balanced and Detailed, each with a small sketch. A short demo plays on an example Inbox window as the dialog opens. A key or a click skips to its end, and with reduced motion the end shows at once. Nothing is picked when it opens, and your current look is marked "Current". Pick a look and a card shows your own threads in it. Done saves the whole look, as a preset in Settings → Rows does. Keep as it is and Escape save nothing, and "Customize rows" in the text opens Settings → Rows. On a phone the dialog is a sheet at the bottom of the screen, with the three looks side by side.

      The dialog shows once, when your list has five threads or more. People who saw the earlier list dialog see this one once too, and new installs get it. It keeps the usual spacing between one-time dialogs.

      The presets in Settings → Rows change with it. Minimal is now a two-line row with the thread name first, no preview and no unread dot. Detailed no longer has the subject pill, and it shows each repository's logo on project marks. The logo is read from your disk, and nothing is asked of GitHub. Balanced is unchanged. If you picked the old Minimal or Detailed, your rows stay exactly as they were, and Settings → Rows now calls that look "Custom".

      Rows with First line set to "Thread name" and Subject preview set to "None" are now two lines instead of three. Line 1 has the thread name and the time. Line 2 has the agent and the project, then the pin, badges, snooze time and counts at its right end. This applies to the rows beside an open thread and to rows on a phone, unless Time position is "Under the preview". Every other combination looks as before. #2886, #2882

      Update a linked machine from the Inbox

      If you have linked the Inboxes on two computers and the other one runs an older Plannotator, Update now shows beside it in the sidebar's Machines and on its row in Settings. It opens a small dialog that follows that machine: Update now, then Updating, Restarting and Updated. The other machine asks GitHub for the newest release itself and installs it with the same checksum check and log as plannotator update. Then it restarts its Inbox, even if someone is typing there. This Inbox never sends it a version or a download link.

      If the install fails, the dialog says so and shows where the log is, the install command and Try again. An install that reports no error but leaves the old version is shown as failed too. A machine too old to update this way gets the commands to run there by hand: plannotator update && plannotator inbox restart, the same with ~/.local/bin/plannotator for an SSH shell that skips your PATH, and a PowerShell line for Windows. A machine that is asleep, one that hasn't come back after its restart, and one that is already up to date each get their own line.

      Snooze on a thread from an older machine is no longer hidden. It reads "Update Mini" (with that machine's name) and opens the same dialog. A tailnet guest's page offers no updates. #2652, #2659

      Floating reply drafts, off by default

      Floating drafts are off unless you turn them on in Settings → Capabilities → Experimental → Float reply drafts. With it off, a reply you leave stays in Drafts as before 0.28.54, and drafts that already floated after updating to 0.28.54 stop floating and stay in Drafts, so nothing is lost. Ask AI's minimized window still sits in the corner. #2937

      With it on: type a reply of 8 characters or more, or add a file, then leave the thread or close the box with its down arrow or Escape. The draft floats. One corner button sits at the right end of the thread's bottom bar, level with Send. Hover it to see a row for each floating draft, plus this thread's Ask AI chat while Ask is minimized. A row opens its own small window. A draft's window has "Reply to " as its header, a peek at the agent's last words, and the reply box. ⌘↵ sends the reply to the message it answers. When the reply needs the thread (picked options, comments, a chosen recipient, several agents, a hand-off or an ended session), the window offers "Open to send" instead.

      A draft stops floating when it is sent or discarded, after a day, or when you press ×. It stays in Drafts either way. On a phone, the corner button is a round button in the bottom row, and the list opens as a sheet. In full screen, floating drafts are hidden.

      Ask AI's window is now easy to tell apart. Its header reads "✦ Ask AI · ", its background has a light tint of your theme's accent, and its box ends in one small ↵ button. Enter sends in Ask. #2874

      A file tree in All files

      In the full-window review of a guided review, All files now has a file tree on the left, like the one on GitHub: folders that fold, each file's change letter and its line counts. Click a file to go to it, and the "1 of N" menu in the top bar names it. On a phone there is no tree beside the diff. A Files button in the bar opens it as a sheet instead, and picking a file or pressing Escape closes the sheet. Walkthrough has no list, as before. #2753

      A tip for starting agents

      The first time you open a plain New message where To can start an agent, a small card beside To says "You can now start agents" and "Choose an agent in To and the folder it works in. A pasted path or git URL works too." It shows once, and never if you have already started an agent from the Inbox. It leaves on Got it , Escape, opening To, Send or closing the box. In a narrower window it sits under To, and on a phone it also leaves when you tap a field. Focus never moves to it. #2908

      Shift+R refreshes the Inbox

      Shift+R runs the same refresh as the ↻ above the list, with its spin. It works from the list and from inside a thread, and it reads the open thread again too. On the Board it runs the Board's Refresh. Pages with no refresh, such as Drafts and Settings, ignore it. Plain R is still Reply, and ⌘⇧R or Ctrl+Shift+R still reloads the page. Like other single keys, it does nothing while you type or while a dialog or menu is open, and it is off when Single- key shortcuts is off in Settings → General. It is listed in the ? map, and the ↻ tooltip reads "Refresh" with the keys ⇧ R. #2911

      Settings: "Delete from Inbox", and Decision data in Activity

      In Settings → Storage , the delete button on every project and thread row now reads Delete from Inbox. The line above the list says: "Deleting removes a thread or project's messages and files from the Inbox. Your code is never touched. Delete asks twice and can't be undone." What Delete does is unchanged.

      Decision data is now part of Settings → Activity , under the hour-by-hour chart, with the Ask box between the chart and the decision numbers. The separate Decision data section is gone, on a computer and on a phone, and an old link to it opens Activity. The decision numbers are still counted only while Activity is shown. #2910

      Bro mode is marked Experimental

      Bro mode's one-time card now has an Experimental chip. In Settings, the Bro mode row moved from the main list in Settings → Capabilities to its Experimental group, under Decision mode. The card and the row both say: "Applies to new agent sessions. In open Claude Code sessions, run /reload- plugins plannotator." The card's credit now spells Dillon Mulroy's handle correctly and links to his post, and its repository link goes to the Bro skill. #2920

      One-time dialogs reach people who keep a thread open

      Some one-time dialogs waited for you to go back to the list. If you keep a thread open beside the list and move from thread to thread, you never did, so they never showed. Now 20 seconds without input also counts as that moment, while the tab is visible and focused, no field has focus and nothing is open. This applies to the List view, Board, Checklist and Bro mode dialogs and the list look dialog, in every layout. The other rules stay the same: at most one dialog a day, never on the load right after one, and three days' wait after Not now. #2916

      Links to other repositories' issues and PRs

      An agent that coordinates work in other repositories and reports to your Inbox wrote bare refs such as #123. Each one linked into the agent's own repository, because a bare #123 links to the repository where the agent's session started. The Inbox tool now tells agents this plainly. For another repository's issue or PR, they write owner/repo#123 or the full URL in every mention, also when they pass on another agent's report. In trials with fresh agents on the same relay tasks, messages with a wrong link went from 7 of 16 to 1 of 12.

      The optional rules note the Inbox adds to your agents' instructions files gets the same rule in one line, as note version 9. An older note you haven't edited is replaced at the next Inbox start. A note you edited is left as it is. #2917

      Smaller changes

      • The line and faint shadow above a thread's bottom bar now show only while thread text scrolls under it. #2860
      • The open questions and the checklist sit right after Reply (or Send and Edit draft, the reaction tray and an ended session's two buttons) again, not at the far right end of the bottom bar. The Tab order matches. #2939
      • Rest the pointer on a list group's header, such as Waiting on you, for half a second, and a chevron fades in at its right end. It points right when the group is closed and down when it is open. Keyboard focus shows it at once, and a touch never shows it. #2919
      • The tooltip on a thread's name in its top bar now opens under the name, not far to the right of a short one. #2918
      • New message no longer has the "From this thread" row of thumbnails. Every other way to reuse a file stays: the paperclip-plus button on each attachment, "New message with this" on an archived thread, pasting a picture copied from the Inbox, and the phone viewer's toolbar. #2915

      Not yet on

      This release also carries more work on code review in the Inbox and on Shape boards. Both stay off by default, and their switches stay hidden until a later release. The work covers: notes from an agent pinned to the lines of a review; on a PR's page, a Details panel with the description, reviewers, checks and comments, a comments panel that starts closed, and the diff controls in the bar; and Shape boards drawn in one technical style, with fixes from a real run. With Code review on, the review bar of a PR between 768 and 959 px wide lets the PR's title shrink to 5rem and drops the title's separator below 800 px, so the Walkthrough / All files switch always stays. #2865, #2672, #2871, #2732, #2735, #2823, #2901

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      In 0.28.55:

      In 0.28.54:

      Community

      • @UberMouse asked in #2588 for context notes: an agent's notes on the lines of a diff that are not the reviewer's comments, so they are never counted, sent back or posted. #2865 builds them into the Inbox's code review, which stays off in this release. The issue stays open for plannotator review.

      Full Changelog : v0.28.54...v0.28.55 (0.28.54: v0.28.53...v0.28.54)

    3. 🔗 backnotprop/plannotator v0.28.54 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet
      v0.28.43 | Voice dictation, combine and rename projects, Mark unread, full-screen threads, Q for open questions, search by type
      v0.28.42 | Choose how your Inbox list looks, contents for long documents, link the Inboxes on two computers, clearer search, documents outside the project open from your own machine

      What's New in v0.28.54

      TL;DR

      • New: A comment box that keeps unsent comments as Drafts
      • New: Choose how your list looks: Minimal, Balanced or Detailed
      • New: Update an older linked machine from this Inbox
      • Changed: Reply drafts float in a corner with Ask AI
      • New: Shift+R refreshes the list, a thread or the Board

      The Inbox gets a new comment box that keeps your unsent comments in view, a dialog to choose how your list looks, and an Update button for a linked machine that runs an older Plannotator. Reply drafts now float in a corner with Ask AI, All files in a review has a file tree, and Shift+R refreshes the Inbox. 24 PRs, all from @backnotprop. Seven of them are groundwork for code review in the Inbox and Shape boards, which stay off in this release.

      Plannotator Inbox

      A new comment box, with drafts you can see

      When you select words in a message, a Markdown or code file, an HTML page or a diagram part, a small card now opens by the words. The quoted words are on top, then the field, then one row: tools at the left, the bin, and a Comment button at the right end. "Comment" is now the button's word everywhere in the Inbox, in place of Save and Add. The chevron at the top right closes the card and keeps your words. Expand grows the card in place, and Escape shrinks it before it closes it. On a phone, or when there is no room beside the words, the card sits at the bottom of the view.

      Close a card with words in it, and those words keep a pale highlight with a small Draft badge under their end. Click the badge or the words to open the card again. Drafts come back when their document shows again, for example after you visit another thread, or close a file and open it again. Every draft on that document comes back, not only the last one. A reload still drops drafts. On an HTML page, a closed card keeps its words but shows no highlight or badge yet.

      In full screen (an image, a video or an HTML page), the card is 600 px wide. Its Comment and Reply tabs sit in a tray at the top, with the hide-tools chevron at the tray's end. On the Comment tab, the row has the file's tools, the bin and Comment. On the Reply tab, it has Send, the paperclip and the mic, what goes with the reply, Open in thread and the bin. If you hide the tools while a comment in the card isn't saved, a red dot sits on the corner control. The comment box on HTML pages no longer has a picture button, because pictures were never taken there.

      On a phone in full screen, Send is the word "Send" at the right end of the row, and there is no bin. From 360 px wide up, the row is one row. Below 360 px, the chips for what goes with the reply move to their own row above the paperclip, the mic and the link, so every button keeps a 44 px tap target. While you dictate in this card on a phone narrower than 430 px, the word "Listening" is not shown. The level, the clock and Cancel stay, and a screen reader still hears the status. #2846

      Choose how your list looks

      The one-time list dialog is now Choose how your list looks , with three looks: Minimal, Balanced and Detailed, each with a small sketch. A short demo plays on an example Inbox window as the dialog opens. A key or a click skips to its end, and with reduced motion the end shows at once. Nothing is picked when it opens, and your current look is marked "Current". Pick a look and a card shows your own threads in it. Done saves the whole look, as a preset in Settings → Rows does. Keep as it is and Escape save nothing, and "Customize rows" in the text opens Settings → Rows. On a phone the dialog is a sheet at the bottom of the screen, with the three looks side by side.

      The dialog shows once, when your list has five threads or more. People who saw the earlier list dialog see this one once too, and new installs get it. It keeps the usual spacing between one-time dialogs.

      The presets in Settings → Rows change with it. Minimal is now a two-line row with the thread name first, no preview and no unread dot. Detailed no longer has the subject pill, and it shows each repository's logo on project marks. The logo is read from your disk, and nothing is asked of GitHub. Balanced is unchanged. If you picked the old Minimal or Detailed, your rows stay exactly as they were, and Settings → Rows now calls that look "Custom".

      Rows with First line set to "Thread name" and Subject preview set to "None" are now two lines instead of three. Line 1 has the thread name and the time. Line 2 has the agent and the project, then the pin, badges, snooze time and counts at its right end. This applies to the rows beside an open thread and to rows on a phone, unless Time position is "Under the preview". Every other combination looks as before. #2886, #2882

      Update a linked machine from the Inbox

      If you have linked the Inboxes on two computers and the other one runs an older Plannotator, Update now shows beside it in the sidebar's Machines and on its row in Settings. It opens a small dialog that follows that machine: Update now, then Updating, Restarting and Updated. The other machine asks GitHub for the newest release itself and installs it with the same checksum check and log as plannotator update. Then it restarts its Inbox, even if someone is typing there. This Inbox never sends it a version or a download link.

      If the install fails, the dialog says so and shows where the log is, the install command and Try again. An install that reports no error but leaves the old version is shown as failed too. A machine too old to update this way gets the commands to run there by hand: plannotator update && plannotator inbox restart, the same with ~/.local/bin/plannotator for an SSH shell that skips your PATH, and a PowerShell line for Windows. A machine that is asleep, one that hasn't come back after its restart, and one that is already up to date each get their own line.

      Snooze on a thread from an older machine is no longer hidden. It reads "Update Mini" (with that machine's name) and opens the same dialog. A tailnet guest's page offers no updates. #2652, #2659

      Reply drafts float in a corner with Ask AI

      Type a reply of 8 characters or more, or add a file, then leave the thread or close the box with its down arrow or Escape. The draft now floats. One corner button sits at the right end of the thread's bottom bar, level with Send. Hover it to see a row for each floating draft, plus this thread's Ask AI chat while Ask is minimized. A row opens its own small window. A draft's window has "Reply to " as its header, a peek at the agent's last words, and the reply box. ⌘↵ sends the reply to the message it answers. When the reply needs the thread (picked options, comments, a chosen recipient, several agents, a hand- off or an ended session), the window offers "Open to send" instead.

      A draft stops floating when it is sent or discarded, after a day, or when you press ×. It stays in Drafts either way. On a phone, the corner button is a round button in the bottom row, and the list opens as a sheet. In full screen, floating drafts are hidden.

      Ask AI's window is now easy to tell apart. Its header reads "✦ Ask AI · ", its background has a light tint of your theme's accent, and its box ends in one small ↵ button. Enter sends in Ask. #2874

      A file tree in All files

      In the full-window review of a guided review, All files now has a file tree on the left, like the one on GitHub: folders that fold, each file's change letter and its line counts. Click a file to go to it, and the "1 of N" menu in the top bar names it. On a phone there is no tree beside the diff. A Files button in the bar opens it as a sheet instead, and picking a file or pressing Escape closes the sheet. Walkthrough has no list, as before. #2753

      A tip for starting agents

      The first time you open a plain New message where To can start an agent, a small card beside To says "You can now start agents" and "Choose an agent in To and the folder it works in. A pasted path or git URL works too." It shows once, and never if you have already started an agent from the Inbox. It leaves on Got it , Escape, opening To, Send or closing the box. In a narrower window it sits under To, and on a phone it also leaves when you tap a field. Focus never moves to it. #2908

      Shift+R refreshes the Inbox

      Shift+R runs the same refresh as the ↻ above the list, with its spin. It works from the list and from inside a thread, and it reads the open thread again too. On the Board it runs the Board's Refresh. Pages with no refresh, such as Drafts and Settings, ignore it. Plain R is still Reply, and ⌘⇧R or Ctrl+Shift+R still reloads the page. Like other single keys, it does nothing while you type or while a dialog or menu is open, and it is off when Single- key shortcuts is off in Settings → General. It is listed in the ? map, and the ↻ tooltip reads "Refresh" with the keys ⇧ R. #2911

      Settings: "Delete from Inbox", and Decision data in Activity

      In Settings → Storage , the delete button on every project and thread row now reads Delete from Inbox. The line above the list says: "Deleting removes a thread or project's messages and files from the Inbox. Your code is never touched. Delete asks twice and can't be undone." What Delete does is unchanged.

      Decision data is now part of Settings → Activity , under the hour-by-hour chart, with the Ask box between the chart and the decision numbers. The separate Decision data section is gone, on a computer and on a phone, and an old link to it opens Activity. The decision numbers are still counted only while Activity is shown. #2910

      Bro mode is marked Experimental

      Bro mode's one-time card now has an Experimental chip. In Settings, the Bro mode row moved from the main list in Settings → Capabilities to its Experimental group, under Decision mode. The card and the row both say: "Applies to new agent sessions. In open Claude Code sessions, run /reload- plugins plannotator." The card's credit now spells Dillon Mulroy's handle correctly and links to his post, and its repository link goes to the Bro skill. #2920

      One-time dialogs reach people who keep a thread open

      Some one-time dialogs waited for you to go back to the list. If you keep a thread open beside the list and move from thread to thread, you never did, so they never showed. Now 20 seconds without input also counts as that moment, while the tab is visible and focused, no field has focus and nothing is open. This applies to the List view, Board, Checklist and Bro mode dialogs and the list look dialog, in every layout. The other rules stay the same: at most one dialog a day, never on the load right after one, and three days' wait after Not now. #2916

      Links to other repositories' issues and PRs

      An agent that coordinates work in other repositories and reports to your Inbox wrote bare refs such as #123. Each one linked into the agent's own repository, because a bare #123 links to the repository where the agent's session started. The Inbox tool now tells agents this plainly. For another repository's issue or PR, they write owner/repo#123 or the full URL in every mention, also when they pass on another agent's report. In trials with fresh agents on the same relay tasks, messages with a wrong link went from 7 of 16 to 1 of 12.

      The optional rules note the Inbox adds to your agents' instructions files gets the same rule in one line, as note version 9. An older note you haven't edited is replaced at the next Inbox start. A note you edited is left as it is. #2917

      Smaller changes

      • The line and faint shadow above a thread's bottom bar now show only while thread text scrolls under it. Actions sit at the left (Reply, or Send and Edit draft, then the reaction tray and an ended session's two buttons), and the open questions and the checklist at the right end. The Tab order matches. #2860
      • Rest the pointer on a list group's header, such as Waiting on you, for half a second, and a chevron fades in at its right end. It points right when the group is closed and down when it is open. Keyboard focus shows it at once, and a touch never shows it. #2919
      • The tooltip on a thread's name in its top bar now opens under the name, not far to the right of a short one. #2918
      • New message no longer has the "From this thread" row of thumbnails. Every other way to reuse a file stays: the paperclip-plus button on each attachment, "New message with this" on an archived thread, pasting a picture copied from the Inbox, and the phone viewer's toolbar. #2915

      Not yet on

      This release also carries more work on code review in the Inbox and on Shape boards. Both stay off by default, and their switches stay hidden until a later release. The work covers: notes from an agent pinned to the lines of a review; on a PR's page, a Details panel with the description, reviewers, checks and comments, a comments panel that starts closed, and the diff controls in the bar; and Shape boards drawn in one technical style, with fixes from a real run. With Code review on, the review bar of a PR between 768 and 959 px wide lets the PR's title shrink to 5rem and drops the title's separator below 800 px, so the Walkthrough / All files switch always stays. #2865, #2672, #2871, #2732, #2735, #2823, #2901

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      Community

      • @UberMouse asked in #2588 for context notes: an agent's notes on the lines of a diff that are not the reviewer's comments, so they are never counted, sent back or posted. #2865 builds them into the Inbox's code review, which stays off in this release. The issue stays open for plannotator review.

      Full Changelog : v0.28.53...v0.28.54

    4. 🔗 backnotprop/plannotator v0.28.50 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet
      v0.28.43 | Voice dictation, combine and rename projects, Mark unread, full-screen threads, Q for open questions, search by type
      v0.28.42 | Choose how your Inbox list looks, contents for long documents, link the Inboxes on two computers, clearer search, documents outside the project open from your own machine
      v0.28.40 | Update works with update checks off, the thread bar shows the thread's name, agents before the project in list rows
      v0.28.39 | Reply from full screen, thread names lead the Inbox list, one project per Claude Code session, a redesigned code review sidebar, Call flow as cards
      v0.28.38 | Attach files to a reply in the Inbox, swipe through a question's picture choices, easier-to-read list rows, code on hover in Call Flow and Semantic Changes
      v0.28.37 | DeepSeek Harness support, save plans to Notion, AsciiDoc in annotate, browse the whole repository in code review, Go to File and Go to Definition, Tidy and hand-offs in the Inbox

      What's New in v0.28.50

      TL;DR

      • Changed: The Inbox opens faster and uses less memory
      • New: Session names across the Inbox, initiatives on the Board
      • New: Earlier comments on a file, global comments on Guided Reviews
      • Changed: Feature dialogs ask before turning anything on
      • Fixed: Annotate shows config files as code; HTML prints in full

      The Inbox opens faster, uses less memory and no longer downloads the whole thread list on every agent message. This release also brings session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews, and feature dialogs that ask before turning anything on. 37 PRs, 4 from outside contributors, with a first-time contributor.

      Plannotator Inbox

      Faster to open, lighter while it runs

      The Inbox used to load all of its code when it opened: 21.8 MB of scripts, including the guided review reader, diagrams, math and every language's highlighting. It now starts with one script of about 4.5 MB and fetches the main parts when the window goes idle. Diagrams, math and language highlighting load the first time you need them. Every agent message also used to make the window download the whole thread list again, along with your drafts and Tidy's plan. Now the server sends only the rows that changed, your drafts are read when they can have changed, and Tidy's plan when you reach for it.

      These numbers come from headless Chromium on a Mac, with a large generated store (13,800 messages, 220 open threads in the busiest project). Yours will differ.

      | Before | After
      ---|---|---
      Time until the list is on screen | 661 ms | 283 ms
      Tab memory after load | 223 MB | 134 MB
      JavaScript memory after load | 50.4 MB | 19.1 MB
      Network use over 60 agent messages | 20.12 MB | 0.93 MB
      Idle CPU of the tab | 2.2 to 2.5% | 1.0 to 1.2%

      An empty Inbox gains too: the list shows in 238 ms instead of 627 ms, and the tab takes 90 MB instead of 175 MB. On a larger test store (30,000 messages), with a thread open, JavaScript memory now grows about 7 MB over 270 agent messages instead of about 25 MB, and a new check in CI fails if it grows past 14 MB. The idle CPU drop comes from the sidebar's mascot, whose animation no longer makes the browser recalculate styles on every frame.

      Threads and guided reviews open about as quickly as before, and when a thread opens, its code and math are drawn on the first paint, with no flash of plain text. The first Mermaid diagram you open takes a little longer (about 265 ms instead of 212 ms) because its code now loads then. Loading on first use adds one new way to fail: a tab left open across an Inbox update can ask for a file that has gone. When that happens it says "This page was updated. Reload to see this" where that part would show, and the rest of the window keeps working.

      Reported by @navin-moorthy, who saw 1.6 GB on a large store, in #2593. #2604, #2605, #2607, #2613, #2616

      In case you missed them: Mark unread and Archive

      Hover a read thread for Mark unread: it goes back to New, in bold, until you next open it, and nothing is sent to the agent. An archived thread comes back on its own when an agent replies in it.

      Feature dialogs ask first

      Behavior change: the dialogs that introduce the Board and the Checklist no longer turn anything on. Each one offers Turn it on and Not now. Not now, Escape or a click outside changes nothing, and you can still turn the feature on later in Settings → Capabilities. If 0.28.49 turned one on for you, it stays on until you turn it off. #2598

      Session names across the Inbox

      A session's name now shows in the @ picker, in the tooltip on a thread row's agent marks, in Send to another session, and as the author of its messages. Rename a session and its messages follow. Claude Code's names now also come from its transcript, so a bare /rename, --name and a rename from a phone all count. Asked for by @zane668 in #2450. #2591

      Initiatives on the Board

      Initiatives group Board cards. The Board's new Filter menu holds initiatives and projects in one place, and you set a card's initiative from its right- click menu or from the opened card. Deleting an initiative takes one click, with Undo, and its cards stay.

      Type # in the reply box, New message or New card to pick an initiative. A sent tag links to the Board filtered to that initiative, and hovering it, or tapping it once on a phone, previews its cards and threads. Your message also puts the thread's card in that initiative.

      Agents can put a card in an initiative too, through the card tool or plannotator card create &lt;title&gt; --initiative <name>, and delete one when its work is done. Turn the Board on in Settings → Capabilities. #2619, #2630, #2633

      Earlier comments on a file

      When a file comes back in a new version, the comments you already sent on it stay in the comments column, in a dimmed, read-only "Earlier" list under the current ones. On a computer, the comments button counts them. The list starts folded when you have comments of your own on that file and open when you have none. The side-by-side comments column also scrolls now, so a long list is no longer cut off there, in guided reviews included. #2634

      Smaller changes

      • On an iPhone, Reply no longer hides when you tap an option, and the page no longer stays clipped after a rotation. #2628
      • A reply's delivery line now reads "Read by Claude Code, 6:25 PM" when another kind of agent read it, instead of "Delivered to" the agent it was for. #2638
      • A reply from the floating box on an image, film or HTML page now tells the agent which file was on screen. You still see only what you wrote. #2645
      • An agent can snooze a thread when you ask it to, or end the snooze, on this computer or a linked one. #2648
      • With an HTML file in full screen and the comments drawer open, the reply box no longer runs over the drawer's foot. On a phone, "Write the reply" now takes you to the thread's reply box with your words kept. #2657
      • Pressing Done on an action item no longer pulls you away from a note you've gone to. #2668
      • plannotator inbox --help now tells agents they can send a video in attachments. #2649
      • The Mark read tooltips now say "Mark read / quiet", and manual steps say "yourself" instead of "by hand" ("Connect yourself"). #2651, #2614

      Plannotator

      Global comments on Guided Reviews

      Guided Reviews have a Global comment button, in the Inbox and in the review app, for a remark on the whole review rather than a line or a file. Global comments are listed at the top and go first in what your agent receives, under ## Global comments. The review app's "+ General comment" is now "+ Global comment", and its export's ## General section is now ## Global comments, ahead of the files. If adding one fails while the review is busy, your words are kept. #2584, #2622

      Open a guide you wrote elsewhere

      plannotator guide import saves a guide written outside a review, from --guide with --patch, or from --snapshot. The next plannotator review of that repository lists it under Guides, and guide export --id and guide share --id work on it. Built on the prototype by @UberMouse, closing #2589. #2603

      Annotate shows config and data files as they are

      .yaml, .json, .toml, .ini, .csv, .log, .xml and similar files used to go through the Markdown renderer, so a # comment became a heading. Each now shows as its own text in one highlighted code block, and you can select and comment as before. .cfg and .conf stay plain monospace, because the name does not say which syntax is inside, and a file over 128 KB shows without highlighting. By @BenNewman100, closing #2586. #2587

      Print HTML explainers in full

      Print / Save as PDF now prints the HTML document itself, so nothing is cut off, and sibling sections start on new pages with headings kept with their content. The browser's own print menu no longer clips either, but section page breaks need the app's Print action. By @utpalsinghdev, closing #2317. #2580

      Pi: reviews stay open and feedback reaches the right session

      A gated annotation review opened by Pi now stays open when its tab closes or loses its connection. Feedback goes first to the session that opened the review, so an Oh My Pi task subagent no longer receives feedback meant for its parent. By @utpalsinghdev, closing #2553 and #2554. #2581

      Smaller changes

      • Images attached to private GitHub PR descriptions and comments now load in plannotator review, and GitHub credentials stay on the server. By @utpalsinghdev, closing #2328. #2579
      • In a guided review in the Inbox, each file's box now fits its diff, so a 5-line file no longer sits in a tall empty box. #2632
      • Comment boxes keep your words when they close, and bring them back when you reopen the same target: the global comment on an HTML page, a line comment in a code file view, and a comment on an image region. #2611
      • Selecting text again over a comment nested inside another comment now paints correctly instead of failing with no toolbar. #2599
      • The README and the repo's remote guide now say SSH turns remote mode on by itself, WSL2 does not need it, and a published Docker port needs the variable. A VS Code devcontainer needs it only if the browser doesn't open by itself. They also say remote mode listens on every interface with no login, even over an SSH tunnel. #2642, #2646

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      New Contributors

      Contributors

      • @utpalsinghdev fixed printing of HTML explainers in #2580, private GitHub images in #2579, and Pi's gated reviews and feedback routing in #2581.
      • @BenNewman100 reported that config files rendered as Markdown in #2586 and fixed it in #2587.
      • @UberMouse proposed plannotator guide import in #2589 and wrote the prototype that #2603 shipped, with their commit kept.

      Community

      • @navin-moorthy reported the Inbox's memory use on a large store in #2593, and answered follow-up questions about what fills it.
      • @zane668 asked for session names in #2450 and followed up with the places that still showed only the agent. They also reported a blank page after commenting on an attachment in #2594. Looking into it turned up the selection bug fixed in #2599.
      • @instant-agent99 reported both Pi issues, #2553 and #2554.
      • @dougcooper asked for printable explainers in #2317.
      • @mauricedesaxe reported that images in private-repo PR descriptions did not load in #2328.

      Full Changelog : v0.28.49...v0.28.50

    5. 🔗 backnotprop/plannotator v0.28.51 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet
      v0.28.43 | Voice dictation, combine and rename projects, Mark unread, full-screen threads, Q for open questions, search by type
      v0.28.42 | Choose how your Inbox list looks, contents for long documents, link the Inboxes on two computers, clearer search, documents outside the project open from your own machine
      v0.28.40 | Update works with update checks off, the thread bar shows the thread's name, agents before the project in list rows
      v0.28.39 | Reply from full screen, thread names lead the Inbox list, one project per Claude Code session, a redesigned code review sidebar, Call flow as cards
      v0.28.38 | Attach files to a reply in the Inbox, swipe through a question's picture choices, easier-to-read list rows, code on hover in Call Flow and Semantic Changes

      What's New in v0.28.51

      TL;DR

      • Changed: Pins are now stars
      • New: Rows say "Session ended" when an agent's session is gone
      • New: A "Back from snooze" line, and Ask about a past decision
      • Changed: Feedback also sends the names of the agents you use
      • Off by default: Starting agents, code review in the Inbox, Shape boards

      Starred threads, a note when an agent's session has ended, "Back from snooze", an Ask box in Settings → Decision data, and expand arrows in guided reviews. 25 PRs, all from @backnotprop.

      Plannotator Inbox

      Starred threads

      Pins are now stars. A filled star replaces the pin, and the menus say Star thread and Unstar thread. Click a row's star (tap it on a phone) to unstar the thread. This doesn't open the thread or mark it read, and the toast offers Undo, or press Z. The second click of a double click does nothing, so it can't open the thread you just unstarred. You still star a thread from its right-click menu or its ⋯ menu, and your existing pins show as stars.

      On a touch screen the star's target is 45 px wide. A tap near the end of a row's preview may unstar the thread instead of opening it, and Undo covers that. #2685

      See when an agent's session has ended

      Before, nothing told you that the session behind a thread had ended, and replies to it just waited. Now the row says Session ended. The thread's note says what to do, with Send to another session and Archive beside Reply. A reply already saved for that session says so: "Saved for Pi. That session has ended; it gets this only if it's resumed."

      Send to another session moves the saved reply, and any earlier ones waiting with it, to a live session. That session then takes over the thread, so your next Send goes there. The Inbox checks that the session really ended before it moves anything. Agents that connect only through MCP don't report when they end, so their rows show nothing. #2637

      Back from snooze

      When a snooze runs out, the open thread says "Back from snooze · 8:00 AM". If there is news, the line sits on the divider above the first new message. If nothing is new, it sits above the last message. The thread opens at that line, and the line stays until you leave the thread or snooze it again. It doesn't show after an Unsnooze or a reply. Also, an archived thread no longer says "Snoozed until …" after that time has passed. #2675

      Ask about a past decision

      Settings → Decision data has an Ask box. Type a question about something you decided earlier and press Ask. The question goes to a running agent as a new message, with instructions to search the threads your Inbox has stored, in every project. The agent answers with what was asked, the choices, what you chose and when, your own words and a link to the thread. If the answer isn't stored, the agent is told to say so and not to guess. The answer comes back as an ordinary thread, and the Inbox opens it.

      If several sessions are running, pick one from the list. If none is running, the box says "No agent is running" and offers Copy. The Inbox stores and shows only your words, not the instructions. #2681

      Show more of a file in a guided review

      A guided review in a thread now has the "N unmodified lines" rows and arrows from Plannotator's code review, so you can open the lines around a change, up to the whole file. Each file's box is as tall as its content, with no height limit, and the page scrolls. Nothing is read until you press an arrow, and the file comes from your own repository, not from GitHub. If your repository doesn't have that version of the file, the arrows go away on the first press. You can comment on an opened line, and your agent receives the comment marked "(not in the diff)" with the code quoted.

      A large file no longer freezes the page when it appears, because it is no longer read whole and highlighted on the page's main thread. In headless Chromium, with other work running on the machine, a 5,000-line changed file showed its first row in 422 ms instead of 6,826 ms, and the longest freeze went from 5,080 ms to 61 ms. #2635

      "These might help" in the Feedback dialog

      As you type in the Feedback box, the dialog lists related links under "These might help": Plannotator features with a one-line description, open issues, pull requests and release note headings. It shows five at most, or three on a phone. The search runs in the window, so nothing you type reaches a server before you send. If nothing is similar, the form looks as before. Words you typed but didn't send come back when you reopen the dialog, until the window closes. #2641

      Feedback sends the names of the agents you use

      Privacy change: feedback you send from the Inbox's Feedback dialog now also includes the names of the agents you use with the Inbox, for example "Claude Code, Codex". Only the names are sent. No session ids, paths, thread titles, counts or text go with them. The Inbox builds the list from the agent messages it has stored and uses Plannotator's own name for each agent. It never sends an agent it doesn't know or a name an agent gave itself. The list holds at most 8 names, most recently used first, and the page can't add names of its own.

      The dialog's "what is sent" line now says so: "Sends your message (and the category and email, if you add them), Plannotator {version}, the name of your OS and the names of the agents you use. Nothing from your threads or files." plannotator feedback on the command line is unchanged and sends no names. #2712

      Smaller changes

      • On a phone, the floating box over a file in full screen keeps its foot on one row. The open-question count, the comment pill and "Open in thread" get shorter, in that order, before anything wraps. Its buttons are now 44 px targets. If dictation is still being transcribed when the box closes, the words now land in that thread's reply instead of being lost. #2636
      • While dictation shows, keys you type in the reply box, New message or full screen's card are no longer lost, and undo works under the highlight on new words. #2673
      • When an agent recommends a choice by its leading letter or number, such as Recommended: A for A · Yes, the Inbox now marks that choice as recommended instead of drawing an extra option. #2724
      • The Drafts page header now just says Drafts. #2670
      • Attachments now also refuse the NTFS spellings of a .env file, such as .env::$DATA. #2665

      Not yet on

      This release also carries work on starting agents from the Inbox, code review in the Inbox and Shape boards. All three stay off by default, and their switches stay hidden until a later release. #2451, #2678, #2683, #2640, #2661, #2665, #2679, #2660, #2710, #2715

      Plannotator

      Long command output arrives whole

      When their output went to a pipe or a socket, plannotator card list (text and --json), plannotator inbox projects --json and plannotator guide export --out - could lose the end of their output and still exit 0. An agent reading a long card list could be missing cards without knowing it. These commands now exit only after all of their output is written, and the text is the same. One difference: if the program reading the output stops reading but keeps the pipe open, the command now waits until it reads or closes, as cat does. #2653

      Smaller changes

      • Internal: test runs no longer read the real home folder or skill folders, and a slow CI setup step now has a time limit and retries. Nothing changes for users. #2680, #2686, #2687

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      • feat(inbox): These might help, under the Feedback box by @backnotprop in #2641
      • Shape: the whiteboard, and What to know replaces Requirements (off by default) by @backnotprop in #2660
      • Inbox: Trust folder button for Claude Code launches (off by default) by @backnotprop in #2451
      • Wait for the reader before exiting: card, inbox projects, guide export, shape kit, help by @backnotprop in #2653
      • fix(inbox): the Drafts header says only Drafts by @backnotprop in #2670
      • Keep the Inbox's floating box in one tidy row on a phone by @backnotprop in #2636
      • Inbox: Open in for any file a reference names (off by default) by @backnotprop in #2665
      • Inbox Reviews: rename and route (#reviews, #pulls alias, &new, off line) (off by default) by @backnotprop in #2661
      • Inbox voice: keep keys typed while dictation shows, and undo under its highlight by @backnotprop in #2673
      • Keep test runs out of the real skill folders by @backnotprop in #2680
      • ci(inbox-e2e): limit and retry the browsers' system libraries step by @backnotprop in #2687
      • fix(inbox): keep a PR review's unsent comments and Viewed until a new commit (off by default) by @backnotprop in #2640
      • feat(inbox): the guided review's rail moves into its top bar (off by default) by @backnotprop in #2679
      • fix(inbox): say why a folder whose trust would cover home can't be trusted (off by default) by @backnotprop in #2683
      • Inbox: say "Back from snooze" in the open thread by @backnotprop in #2675
      • Inbox: say when a thread's session has ended, and let the reply go elsewhere by @backnotprop in #2637
      • Tests: give every Inbox a test starts a scratch HOME by @backnotprop in #2686
      • Inbox launch: an answer on the card no longer flashes the Terminal line (off by default) by @backnotprop in #2678
      • Feedback from the Inbox also sends the names of the agents you use by @backnotprop in #2712
      • Ask from Settings -> Decision data by @backnotprop in #2681
      • Shape: icons, logos and drawn things by name, and the whiteboard words (off by default) by @backnotprop in #2715
      • Expand arrows on the Inbox's PR page and guided reviews by @backnotprop in #2635
      • Name a question choice by its leading letter before a middle dot by @backnotprop in #2724
      • feat(inbox): threads are starred, and a click on the star unstars by @backnotprop in #2685
      • Shape: a crosshair for comments, lazy drags, and Add to reply (off by default) by @backnotprop in #2710

      Community

      • @UberMouse asked for taller code blocks in guided reviews in #2643. #2635 partly answers it: in the Inbox's guided reviews, each file is now as tall as its content. The issue stays open for the rest.

      Full Changelog : v0.28.50...v0.28.51

    6. 🔗 backnotprop/plannotator v0.28.52 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet
      v0.28.43 | Voice dictation, combine and rename projects, Mark unread, full-screen threads, Q for open questions, search by type
      v0.28.42 | Choose how your Inbox list looks, contents for long documents, link the Inboxes on two computers, clearer search, documents outside the project open from your own machine
      v0.28.40 | Update works with update checks off, the thread bar shows the thread's name, agents before the project in list rows
      v0.28.39 | Reply from full screen, thread names lead the Inbox list, one project per Claude Code session, a redesigned code review sidebar, Call flow as cards

      What's New in v0.28.52

      TL;DR

      • New: Start Claude Code or Pi from New message, on by default
      • New: A new reply box, Ask AI in every thread, decision insights
      • Changed: Plannotator reloads itself after an update
      • Changed: The agent note is added without asking
      • Removed: PLANNOTATOR_INBOX_ASK_AI: Ask AI is always on

      You can now start Claude Code and Pi from the Inbox's New message, on this computer or a linked one, and it is on by default. The Inbox also has a new reply box, a checklist in the thread's bottom bar, Ask AI for everyone, new keyboard keys, Insights in Settings → Decision data, and an agent note it writes by itself. Claude Code and Pi now reload Plannotator by themselves after an update. 100 PRs: 96 from @backnotprop and 4 from three community contributors, two of them first-timers.

      Plannotator Inbox

      Start agents from the Inbox, on by default

      New message can now start an agent for you. In To, pick New Claude Code session or New Pi session , choose a project or New scratch folder , write, and press Send. The agent starts in the background in that folder, with your own setup, and its replies land in the thread like any other agent's. A quiet line under the latest message shows what it is doing ("Claude Code is working · 3 min"), with Stop. A permission prompt from the session shows up in the thread as a card you can answer, so you don't have to go to a terminal. Your reply continues the session, and Delete ends it. A folder Claude Code doesn't trust yet offers Trust folder and Try again on the run line.

      Starting agents is now on by default on macOS and Linux. To turn it off, use the new first row in Settings → Agents , "Start agents from New message". When it is off, New message only messages sessions that are already running. Claude Code needs version 2.1.314 or newer. Pi needs pi 0.79.1 or newer on your PATH, with Plannotator's Pi extension in Pi's settings. Pi has no background host, so a Pi session started this way runs only while the Inbox runs. After an Inbox restart, the line says so, and your next reply continues the same session with the whole conversation. Starting agents is not offered on Windows. #2891, #2412

      Start an agent on a linked machine

      If you have linked the Inboxes on two computers, New message can start an agent on the other one. The folder menu groups projects by machine, with the machine you last used first. To then reads "in infra · Mac mini", and the agent starts there with that machine's Claude Code, folder and trust. Each machine group ends with Another folder on Mac mini… , which opens a folder browser under that machine's home folder. It lists one level at a time and never shows hidden folders. The folder you start in becomes a project on that machine.

      If the agent can't start there, the menu says why, in that machine's name, for example "Claude Code isn't signed in on Mini. Run claude on Mini once to sign in, then try again." When there is a fix, the line has a command to copy. If the machine is asleep, Send reads "Start when Mac mini is back" and the message waits; a toast offers Cancel, which puts your words back in Drafts. Stop, Try again, Trust folder and Delete reach the other machine. A permission prompt that only Claude Code's own dialog can approve says so and offers Deny. Only a press in the Inbox window can start an agent on another machine. An agent's own call is refused. Each machine's Settings → Agents switch decides for that machine. Files can't go with a new session on another machine yet, and compose says so before you send. #2740, #2742, #2744, #2748, #2751, #2754

      The agent note writes itself

      The Inbox no longer asks before it adds its short note to an agent's instructions file. For Claude Code, Codex, Gemini CLI, Pi and OpenCode, it writes the note when the Inbox starts and after each connect run, once per agent. OpenCode gets it only when ~/.config/opencode/AGENTS.md already exists. In place of the dialog, one quiet line above the list says what happened, for example "Added the Inbox note to Claude Code's instructions." Hover an agent's name to see the file. Got it hides the line.

      Earlier answers still count. If you chose Not now or Don't add a note before, no note is written. PLANNOTATOR_INBOX_NOTES=0 still turns notes off, and turning a note off in Settings → Agents keeps it off. A write that fails is tried again next time. For Codex, the note goes to AGENTS.override.md only when that file has text in it, and otherwise to AGENTS.md. For Gemini CLI, it goes above the ## Gemini Added Memories section. Qwen Code and Cursor keep the dialog. The note's text is unchanged. #2903

      A new reply box

      The open reply box is now one card, with your words first and one row of controls inside it. On a computer, the row has Send, the paperclip, Skills (it types /) and the mic at the left, then what goes with the reply and who gets it, then the bin at the right. On a phone, the paperclip and Skills sit at the left and the mic and Send at the right, all 44 px targets. Discard there is on the "Draft · Saved" line above the box. A chevron at the top right closes the box and keeps the draft, as Esc does, so Cancel is gone.

      The box stops growing at about half the window and scrolls inside, so Send is always in view. From 7 files, the row says "N files". A failed Send shows one plain line, with the details behind Details. While you record, the status covers the middle of the row and nothing else moves.

      The closed reply bar is calmer too. On a phone it is three buttons: Send, ✎ Draft N and ? N open. The questions button counts only questions you haven't answered, and an answer in your draft counts under Draft. Skip moved into the questions list, as "N stay open when you send · Skip them". #2824, #2749

      The checklist in the thread's bottom bar

      A thread's checklist button sits in the bottom bar next to Reply and now looks like Reply, in your theme's colours. It shows the current step's mark and the count, such as "1/4": an amber pause while a step waits on you, a spinner while a step is being worked on, and otherwise a pie. The spinner turns only while the session works. When the session ends it goes grey, and the button says "· as of 2:40 PM". With two sessions, the button shows the list that waits on you, or the newest, with "+1". The list opens as before, with new marks for each step.

      Agents also got clearer words about the checklist: it is for multi-step work you have agreed on, with a few high-level steps, and never the agent's own to- do list. #2847, #2839

      Ask AI for everyone

      Ask AI now shows in every Inbox thread whose agent can answer. You ask about a thread, and the agent that owns it answers in a floating window, outside the thread. You no longer need PLANNOTATOR_INBOX_ASK_AI, which now does nothing. Ask stays off in the tour, for tailnet guests, and on a linked machine's threads. #2878

      "Stopped" for a reply a stopped session holds

      When you stop a Claude Code session (Esc, or a remote interrupt), Claude Code refuses the plugin's prompts until you type in that session again. Before, the Inbox could mark a reply "Delivered to Claude Code" even though no turn started. Now the reply waits, and its line reads "Stopped: goes in when you type in that session". The row's tooltip and the decisions strip say the same. After you type in that session, the reply goes in and the line reads "Delivered to Claude Code". Review and plan decisions are no longer marked delivered in this case either.

      The Claude Code mod also keeps polling the Inbox when a fork, side session or subagent ends, so an idle session's replies no longer wait until you type. #2833, #2780, #2787

      New keyboard keys

      All of these appear in the ? map and do nothing while you type in a field.

      • Shift+O opens the thread's Artifacts grid, and pressing it again goes back. In the grid, the arrow keys, Home and End move between tiles.
      • Shift+E archives the thread, and Z undoes it.
      • H opens the Snooze times. It never snoozes by itself.
      • C opens New message from any page.
      • G D goes to Drafts.
      • On the Board, the arrow keys, Home and End move between cards and lanes.
      • Shift+F10 or the context-menu key on a message head opens that message's ⋯ menu.
      • ⌘⇧A / Ctrl+Shift+A switches Annotate and Interact from anywhere in an open HTML file.
      • A "Skip to the list" link is the first Tab stop on the Inbox page.

      Letter keys now also work on Cyrillic, Greek and Hebrew keyboard layouts. All file keys are in one Files group in the ? map. Two fixes from the same keyboard review: Escape in a "Can't do it" reason box returns focus to the button, and the New message session picker now works with the arrow keys, Home, End and type-to-find. #2843, #2841

      More ways to set up list rows

      Settings → Rows (⋮ → Customize rows…) has new options. They are all off by default, so your list looks the same until you turn one on.

      • Time position: Under the preview puts the time on its own line under the preview, so the preview keeps its full width.
      • Dividers draws a thin line between rows.
      • Status mark shows one small mark in place of counts. A done row shows a tick.
      • Bold names makes every thread name bold, read or not.
      • Letter marks gives threads, projects or both a small mark made from the first and last letter of the name, as Inline , Avatar or Dot. Logo from the repo and GitHub pictures can show a project's logo or owner picture in place of the letters. The Detailed preset now turns on letter marks.

      Smaller thread names are now on for anyone who hasn't chosen a look. A look you saved before keeps its name size. #2872, #2867, #2729

      Simple list view

      The ⋮ menu at the top of the list has a new View group: Smart groups (the default) and Simple list. Simple list is one list, newest first, with the same rows and badges and no group headers. Your browser remembers the choice. Once per browser, on a list with 5 or more threads, the Inbox asks which you prefer.

      With no thread open, actions such as Mark read, Archive and Send now update their row in place, and new messages keep waiting behind "N new · Show" so the list doesn't jump. Every group in the grouped list now opens and closes with a click on its header, and ↑ ↓ stop on every header. #2716, #2752

      Long threads open 20 at a time

      Before, opening a long thread's "N earlier messages" fold drew every hidden message and moved you up to the oldest one. The fold now reads "↑ Show 20 earlier · N hidden", with a quiet "Show all". Each press brings in the 20 messages just above, and the newest messages stay where they are on screen. Focus goes to the nearest new message. #2818

      Closing a file keeps your comment as a draft

      Closing a file while you write a comment no longer asks whether to save, discard or keep writing. Every way of closing a file (×, Escape, ⌘⇧X, the phone's back gesture, the browser's Back) closes it on the first press. Your words, and what they are on, are kept as that file's draft and are back in the comment box when you open the file again. Moving to another file or another thread keeps them too. Discard is still on the comment itself. #2822

      Insights in Settings → Decision data

      Settings → Decision data now shows what your decisions add up to: up to three trends (the last 30 days against the 30 before), Decisions by day, Who asks, and a CSV download. A few short lines show only when there is enough data behind them. The counting runs only while you have this section open. When you delete a thread or project, the Inbox keeps one line per question with none of its words, so the totals don't change. uninstall --purge removes that file. #2682

      Clearer errors for unreadable agent tool calls

      A long-running agent once failed to send to the Inbox several times in a row. Its calls arrived as JSON Claude Code could not parse, often a bare "supersedes": msg_…/q-… with no quotes, and the tool answered "action must be one of …", so the agent retried the same call. Now, when the only problem is an unquoted Inbox id or action name, the call runs and the result tells the agent what was fixed and to quote every string. Otherwise the error names the spot, such as "this call's JSON couldn't be read at character 37 … this value needs double quotes". A call the host cut short is never fixed. The error says how long it was and suggests a shorter body with the rest attached as a file. This applies in Claude Code, Pi and OpenCode.

      Questions are read more forgivingly too. A short label such as id: sd- approach before the question no longer becomes the question: it shows as a small grey line under it. A question with no choices, or with all its pictures in the text above the choices, gets advice in the send result. The message still goes out as written. #2888, #2727

      Cline in New message

      A new @plannotator/cline plugin lets Cline sessions show up in New message, with their project, like Claude Code, Pi and OpenCode sessions. Install it with cline plugin install npm:@plannotator/cline, then turn on its tool in the Inbox. Replies and new messages start a turn in an idle Cline session, and a prompt that Cline doesn't take goes back to the Inbox and is tried again. #2795

      Search

      Once you type in search, a Best match | Newest switch shows at the right end of the filter chips, and your browser remembers the choice. Result rows are smaller. The words that matched are now highlighted in every result, including the thread name, the project and the agent's name, and these show in full instead of being cut off with "…". #2731, #2733

      Guided reviews open in the full window

      A guided review an agent sends now opens in the full window, with the agent's intent as the heading and the sender in the header ("from Claude Code in , sent 3:41 PM"). Your comments sit behind a Comments button with their count. When the agent isn't waiting for a verdict, Write the reply takes you back to the thread with the reply box open, and your comments go with your next Send, as before.

      Other changes to guided reviews:

      • Every file on screen now draws, at any window size. Before, a review with many small files could leave some blank. Far jumps land at once on their file.
      • On a phone, Comments takes the whole screen.
      • Each file's name sits above its code box and sticks to the top while you scroll.
      • The Split / Unified button, Collapse all and the diff display gear sit before Close. Your diff display choices are shared with code review.
      • The comments column is called Comments everywhere in the Inbox, no longer Annotations.

      #2737, #2684, #2702, #2769, #2730, #2863

      Attached HTML pages

      An attached HTML page can now show pictures from outside its folder, anywhere on this computer (../shots/a.png, /Users/me/a.png, file://…). Only image files are served, never from a hidden folder or a dotenv name, and each gets its own unguessable link. Pictures from the web (https://…) load too, straight from their site. An SVG opened by itself runs no script.

      A self-contained prototype that writes its own address (history.replaceState) or reads localStorage while it starts no longer opens as a blank page. #2722, #2895

      Add a file already in the Inbox to your reply

      Every attachment (a tile, a big preview, a picture in a message, an Artifacts card, the file pane and full screen's toolbar) has a paperclip-plus button on hover or focus. One click adds that file to the reply you are writing, without uploading it again. A second click takes it out. On a phone, the button is in the viewer's toolbar. The agent gets its own read-only copy, so deleting the original changes nothing. #2655

      Smaller changes

      • In full screen on a computer, the comments panel floats over the right side of the page instead of narrowing it, and it hides and comes back with the other floating tools. #2709
      • A question's picture choices now fit the card: two wide screenshots side by side, phone screenshots in narrow columns, and no jump when pictures load. #2736
      • Delete is back in the toolbar when you select words in an agent's message. #2781
      • A button beside the Projects heading sorts projects A to Z or by most recent. Your order stays the same until you press it. #2692
      • Board cards name their project when the Board spans more than one project. #2708 by @uvw
      • Settings → Accounts is quieter: one block per machine, each login with one bar and its percentage. #2739
      • The Inbox's one-time dialogs now follow one schedule: at most one a day, never on two page loads in a row, never while a question waits or you are typing, and each at a moment that fits it. #2726
      • A reply's message to the agent now says how many messages, open questions and action items the thread holds, and which message you answered. #2676
      • Re-ask comes back once the session writes again after answering a Re-ask note. #2711
      • A reply stuck on a session whose delivery was cut off can now move to another session with Send to another session. It is never delivered twice. #2717, #2757
      • A transcription failure the page doesn't know now keeps the clip with Retry, instead of crashing the reply box. #2819
      • Each agent session's plannotator inbox mcp process no longer reads the whole Inbox page into memory, which saves about 24 MB per process. #2689
      • The Inbox server stays responsive when the computer is busy: repeated list reads reuse the last answer, and slow checks no longer block other requests. #2789
      • Layout fixes: a phone row's time stays on one line, the sidebar's sections are evenly spaced, the selected project's outline is no longer clipped, and the panes no longer end up 1 px off after Escape. #2700, #2696, #2728, #2697
      • GET /api/inbox/health now reports a window-controls hook, so a desktop app that wraps the Inbox can place its window buttons without depending on Inbox class names. #2691

      Plannotator

      Plannotator reloads itself after an update

      Claude Code: after Plannotator updates, an open Claude Code session reloads the Plannotator plugin by itself with /reload-plugins plannotator. Before, you typed /reload-plugins when the Inbox showed its notice. It needs a running Inbox, and it waits until the main turn is idle, no prompt is being typed or sent, and Plannotator has no work in flight. It does not wait for background agents, which keep running. It runs once per version, and one /reload-plugins plannotator line stays in the chat. If the reload doesn't take, the Inbox's notice stays as before.

      Pi (0.84.2 or newer): after pi update or the install script, each open Pi session reloads itself once nothing can be lost: no run, no queued message, no dialog, no open Plannotator review, and nothing typed for 15 seconds. Pi then shows "Plannotator updated to X. Pi reloaded while idle." Set PLANNOTATOR_AUTO_RELOAD=0 to keep the old "Type /reload" note. Oh My Pi only gets the note.

      OpenCode 2: when its service is running, the install script updates the running plugin with opencode2 plugin update, and nothing restarts. #2873, #2881, #2356

      The annotation toolbar on a phone

      On a phone, the selection toolbar (Comment, 👍, ×, Copy, Delete) used to sit above the selection, where iOS Safari draws its own menu over it, and a selection near an edge pushed half of it off the screen. Now it sits below the whole selection, clear of the selection handles, and flips above only when there is no room. It stays inside the screen, with the safe areas respected, at 390 and 320 px wide. Its buttons are 44 px with larger icons. This applies to plan review, annotate, code review and the Inbox. Nothing changes on a computer. #2879

      Turn off plan review in Claude Code

      A new planReview setting turns off Plannotator's plan review in Claude Code and keeps the rest of Plannotator on. Set { "planReview": false } in ~/.plannotator/config.json, or PLANNOTATOR_PLAN_REVIEW=0. Claude Code then shows its own plan approval dialog, which works over SSH. Plan review in Pi, OpenCode and other agents is not affected. #2654 by @bendrucker, closing #2299

      Code review

      • The file list stays put. In the All changes list, opening a file no longer moves the headers above it, so the next click lands on the file under the pointer. #2817, closing #2713 reported by @barreiroleo
      • One Split / Unified button. The tab strip has one Split / Unified button, Collapse all, and the diff display gear. Diff display choices are now saved in config.json and shared with the Inbox. #2730
      • A normal scrollbar for wide diffs. The bar under each file's name is gone. Each file now has the diff's own horizontal scrollbar at the bottom, and while a wide file's end is below the screen, a bar is pinned to the bottom of the pane, as on GitHub. #2763
      • On your own pull request, the greyed Approve and its menu arrow now look like one control. #2674

      Smaller changes

      • Annotate shows the right repository. plannotator annotate now takes the repository and branch from the file, folder or bundle you annotate, not from the folder the command runs in. #2688 by @dajiaohuang, closing #2290 reported by @BenNewman100
      • Code inside other Markdown renders as code. Code in callouts, in link labels and in double-backtick spans (git log --format=`%h`) now renders as code instead of showing its backticks. #2719 by @uvw, closing #2718
      • Quick labels keep their tip. A quick label's instruction to the agent was lost in share links, Ask, Inbox message comments and the feedback archive. It now goes everywhere the label goes. The 👍 label is called "Looks good" in the quick-label list too. #2811, #2869, from #2626 by @BenNewman100
      • The installer retries a dropped download. The binary and checksum downloads now retry on a dropped connection, with a time limit, so one HTTP/2 reset no longer fails plannotator update and a slow link no longer hangs it. #2812, from #2788 reported by @zane668
      • Claude Code's skip-rm-prompts setting works again. With Plannotator installed, CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS stopped working in bypass mode. Plannotator now allows those removal prompts itself, but only where Claude Code would have skipped them. #2741
      • A one-time ask to star Plannotator. Returning users see one small card, once per machine, asking them to star Plannotator on GitHub: in the Inbox from the second day, and after a decision in plan review, code review and annotate from the second week. Before it shows, your own gh checks whether you already starred the repo; if you have, it never shows. The Inbox's Star on GitHub button stars with your gh only when you click it. Plannotator sends nothing anywhere else, and the card never shows in remote mode, the VS Code panel, shared pages or with auto-close on. #2770
      • Settings say "uses" where they said "follows", for example "Uses your Claude Code settings until you change it." #2835

      Additional Changes

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      • Inbox: tell agents to put pictures in the choices by @backnotprop in #2727
      • Offer Re-ask again once the session writes after answering a Re-ask note by @backnotprop in #2711
      • Inbox: let a reply stuck on its session move by hand by @backnotprop in #2717
      • feat(inbox): the context a reply gives an agent by @backnotprop in #2676
      • ci(inbox-e2e): stop apt mirror hiccups from failing the browser tests by @backnotprop in #2746
      • Inbox: an attached HTML page shows pictures from anywhere on this computer, and the web by @backnotprop in #2722
      • Inbox one-time dialogs follow the approved schedule by @backnotprop in #2726
      • Inbox review: on a phone, Comments takes the whole screen by @backnotprop in #2702
      • Inbox: add a file already in the Inbox to your reply by @backnotprop in #2655
      • Read the Inbox page only when serving it by @backnotprop in #2689
      • Draw every file on screen in a guided review or PR page by @backnotprop in #2684
      • Don't call a fresh claim stuck when Linux stamps its folder a few ms early by @backnotprop in #2757
      • Inbox: the selected project row's outline is no longer clipped by @backnotprop in #2728
      • CI: one waiting Test run for pushes to main, not one per merge by @backnotprop in #2761
      • CI: heavy suites nightly on main, not after every merge by @backnotprop in #2764
      • CI: a repo setting picks the browser test machines by @backnotprop in #2765
      • Diffs: the library's own scrollbar at the bottom; remove the top bar by @backnotprop in #2763
      • Inbox: smaller thread names on by default by @backnotprop in #2729
      • Fix annotate repository identity by @dajiaohuang in #2688
      • Add bun run test:sandbox: run named test files in a scratch world by @backnotprop in #2720
      • Inbox: lay out picture choices to fit the card, with no jump when pictures load by @backnotprop in #2736
      • feat(hook): add planReview switch by @bendrucker in #2654
      • Inbox: a declared hook for a desktop host's window controls by @backnotprop in #2691
      • Inbox: calmer reply bar by @backnotprop in #2749
      • Inbox: keep a phone row's time on one line by @backnotprop in #2700
      • Sort the Inbox's Projects A to Z or by most recent by @backnotprop in #2692
      • test(inbox): pin the clock in the keyboard Snooze row-menu test by @backnotprop in #2798
      • ci: run the e2e shards in the Playwright image, not apt by @backnotprop in #2725
      • e2e: window-controls clicks clear the sidebar peek first by @backnotprop in #2806
      • Inbox search: a Best match / Newest switch, and smaller results by @backnotprop in #2731
      • Inbox review: file name above the code box by @backnotprop in #2769
      • CI: turn off flaky browser tests in CI; run them locally by @backnotprop in #2767
      • Inbox: quieter Accounts page (switching comes later) by @backnotprop in #2739
      • Inbox launch: Pi host by @backnotprop in #2412
      • Space the Inbox sidebar's sections by one rule by @backnotprop in #2696
      • test(inbox): keep the pointer off the sidebar's edge before Send in the comments-list spec by @backnotprop in #2786
      • Claude Code: respect the skip-rm-prompts setting in bypass by @backnotprop in #2741
      • Inbox: close any list group by clicking its header by @backnotprop in #2752
      • Quick labels: keep the label's tip in share links, Ask, Inbox comments and the archive by @backnotprop in #2811
      • Installer: retry the binary download on a dropped connection by @backnotprop in #2812
      • Make a muted Approve one control with its caret by @backnotprop in #2674
      • Inbox: a Cline plugin, so Cline sessions show up in New message by @backnotprop in #2795
      • Don't mark an Inbox reply or decision delivered when Claude Code drops its prompt by @backnotprop in #2780
      • Inbox: keep the server's loop free under load (list memo, async checks, buffered debug log, async tailscale, stall attribution) by @backnotprop in #2789
      • Inbox voice: an unknown failure code keeps the clip instead of crashing by @backnotprop in #2819
      • CI: fresh e2e shard times, so the 16 shards finish together by @backnotprop in #2772
      • Make the loop-stall test block long enough to always count as a stall by @backnotprop in #2836
      • Keep the Claude Code mod polling the Inbox when another session ends by @backnotprop in #2787
      • Inbox: full screen's comments float over the page and move with the tools by @backnotprop in #2709
      • Diff display controls in every review header, shared settings by @backnotprop in #2730
      • Inbox: Simple list view, writes that hold the list still, and a one-time Smart groups or Simple list choice by @backnotprop in #2716
      • CI: quarantine the flaky review-jumps scroll test by @backnotprop in #2840
      • Inbox: Delete back in the toolbar on an agent message's words by @backnotprop in #2781
      • Inbox: two keyboard fixes (Can't do it Escape, agent picker arrows) by @backnotprop in #2841
      • mod: one PowerShell test per value, so three pwsh cold starts stop sharing one 5 s budget by @backnotprop in #2838
      • Inbox: start an agent on another linked machine (server) by @backnotprop in #2740
      • VS Code asks test: skip a log line the fake agent is still writing by @backnotprop in #2851
      • Ask returning people to star Plannotator, once by @backnotprop in #2770
      • Settings: say "uses", not "follows" by @backnotprop in #2835
      • Search: highlight what matched and show it in full by @backnotprop in #2733
      • Inbox: checklist wording: only for aligned multi-step work by @backnotprop in #2839
      • e2e quarantine: the guided review middle-scroll test by @backnotprop in #2853
      • e2e: stop each list-intro world after its test (shard 6 exit 137) by @backnotprop in #2834
      • Inbox: the live region stays on the page, so the window has nothing to scroll by @backnotprop in #2697
      • Give jj tests their own config folder by @backnotprop in #2738
      • CI: quarantine the flaky grouped hover Mark read list-view test by @backnotprop in #2855
      • Review: the file list stays put when you open a file by @backnotprop in #2817
      • Inbox: call the side-by-side column Comments by @backnotprop in #2863
      • Board: a card names its project while the Board spans projects by @uvw in #2708
      • Auto-reload after an update: Pi reloads itself when idle; OpenCode 2 installer updates the running plugin by @backnotprop in #2356
      • Inbox: say why an agent can't start on a linked machine by @backnotprop in #2742
      • Call the 👍 quick label "Looks good" in the quick-label list too by @backnotprop in #2869
      • Fail the release when the Cline package fails to publish by @backnotprop in #2870
      • Inbox: letter marks for rows, in Customize rows (all off by default) by @backnotprop in #2867
      • Markdown: code in callouts, link labels and double-backtick spans renders as code by @uvw in #2719
      • Claude Code: Plannotator reloads itself after an update by @backnotprop in #2873
      • Auto-reload: don't wait for background agents by @backnotprop in #2881
      • Sandboxes: never ask macOS for a keychain by @backnotprop in #2880
      • Open every guide and review in the Inbox's full-window review by @backnotprop in #2737
      • Inbox: another machine's launched agent, from this window by @backnotprop in #2744
      • Inbox: list and start in another folder on a linked machine (server) by @backnotprop in #2748
      • Inbox: start an agent on another linked machine from compose by @backnotprop in #2751
      • Inbox: start an agent in another folder on any linked machine by @backnotprop in #2754
      • e2e: two specs main broke (selection bar button, Rows' letter marks) by @backnotprop in #2877
      • Inbox: an attached prototype that writes its hash or reads storage no longer renders blank by @backnotprop in #2895
      • CI e2e: a PR rerun of the same change runs only the specs that did not pass by @backnotprop in #2856
      • CI: fake the clock for the 57 s page-age waits in three Inbox e2e specs by @backnotprop in #2857
      • Inbox reply box: T6 by @backnotprop in #2824
      • Inbox rows: Time under the preview, Dividers and a Status mark (all off by default) by @backnotprop in #2872
      • Inbox tool: clear error for unreadable calls, warn on odd questions by @backnotprop in #2888
      • Inbox: Ask AI on for everyone by @backnotprop in #2878
      • Inbox: checklist with spinners in the thread's bottom bar by @backnotprop in #2847
      • Inbox: closing a file keeps the comment being written as its draft by @backnotprop in #2822
      • Inbox: keyboard keys from the audit by @backnotprop in #2843
      • Inbox: open a long thread's fold 20 at a time by @backnotprop in #2818
      • Inbox: show Stopped for a reply held by a stopped Claude Code session by @backnotprop in #2833
      • Inbox: write the agent note by itself for agents proven to load it by @backnotprop in #2903
      • Insights in Settings -> Decision data by @backnotprop in #2682
      • Phone: annotation toolbar below the selection, inside the screen, thumb-sized by @backnotprop in #2879
      • Start agents from the Inbox on by default, with a switch in Settings → Agents by @backnotprop in #2891

      New Contributors

      Contributors

      @bendrucker asked in #2299 for a way to turn off plan review in Claude Code while keeping the rest of Plannotator, then built it in #2654: the planReview setting and PLANNOTATOR_PLAN_REVIEW. This is his third contribution.

      @dajiaohuang fixed annotate's repository and branch in #2688, with tests for both server runtimes. First contribution.

      @uvw made their first two contributions. #2708 names the project on Board cards when the Board spans projects, following the layout agreed in their feature request #2699. #2719 makes code in callouts, link labels and double-backtick spans render as code, the bug they reported in #2718.

      Community

      • @BenNewman100 reported in #2290 that annotate showed the launch folder's repository, fixed by #2688. His quick-label audit in #2626 found the lost tips that #2811 fixes and the two names for 👍 that #2869 settles. The issue stays open for his larger question about letting one annotation carry both a label and a comment.
      • @barreiroleo reported in #2713 that code review's file list moved when a file opened, with two screenshots that pinned down the cause. Fixed by #2817.
      • @zane668 reported in #2788 that the Inbox stalled while plannotator update downloaded, with timings and a control run. #2789 stops repeated list reads from queuing, and #2812 makes the installer retry the dropped download. The issue stays open while the Inbox's new stall lines confirm what is left.

      Full Changelog : v0.28.51...v0.28.52

    7. 🔗 backnotprop/plannotator v0.28.53 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet
      v0.28.43 | Voice dictation, combine and rename projects, Mark unread, full-screen threads, Q for open questions, search by type
      v0.28.42 | Choose how your Inbox list looks, contents for long documents, link the Inboxes on two computers, clearer search, documents outside the project open from your own machine
      v0.28.40 | Update works with update checks off, the thread bar shows the thread's name, agents before the project in list rows

      What's New in v0.28.53

      TL;DR

      • New: Start an agent in a new folder, or from a git URL
      • New: "+" on each project row starts a session there
      • New: A reaction tray, a thread's Links, Settings → Activity
      • Changed: New message offers the open thread's files
      • Off by default: Bro mode: agents write to you in plain words

      Starting an agent from New message now covers a new folder, a git repository to clone, and a "+" on every project row. The Inbox also gets a tray of reactions beside 👍, the links in a thread next to its files, Settings → Activity, Bro mode, files from the open thread in New message, and a Desktop size button for HTML pages on a phone. 9 PRs, all from @backnotprop.

      Plannotator Inbox

      Start an agent in a new folder

      When you start an agent from New message, the folder browser can now make the folder for you. Type a path that isn't there yet and the list offers Create billing-svc and start. It sits last and quiet while an existing folder still matches what you typed. Only the last folder in the path is made, and only inside a folder you can write to. A name with a file in the way, or a parent you can't write to, is refused and nothing is made. If no thread comes of it, the folder is removed again while it is still empty. If the agent fails to start, the run line says the folder was made and stays.

      A typo one level up offers Go to the folder you probably meant. Two missing levels, a file in the way, a folder you have no permission for, and a hidden folder or one outside your home folder each get one plain line that says so. To's folder button shows a new-folder mark while a new folder is picked.

      You can also paste a path. Quotes, file://, Terminal's escaped spaces and full paths are cleaned up to a ~/… path, in the path field and in "Find a project". A path pasted in "Find a project" keeps the projects under it, and "Another folder…" opens there. A draft keeps the folder you picked, even when it isn't a project yet, and it is back when you reopen the draft. #2900

      Clone a repository and start an agent in it

      The folder menu now reads "Find a project or paste a git URL". Paste an https link, git@host:owner/repo, ssh://… or github.com/owner/repo, and each machine gets a clone row, then Clone into another folder…. A link to …/tree/<branch> clones that branch. A bare acme/billing-api stays a project search. Plain http, git://, file:// and links with a password in them are never used.

      The clone goes into the folder that machine last cloned into, or else the folder most of its projects live in, or else your home folder. When the folder name is taken, it goes to the next free name (billing-api-2) and says so. When the same repository is already there, the row offers to start in it instead. A machine whose git can't sign in to that host is dimmed, but you can still pick it. Once you pick, To shows a git mark and the line under it reads "Clones acme/billing-api, then starts Claude Code."

      After Send, the run line shows git's progress after 3 seconds, then starts the agent, and the list row reads "Cloning". A repository that brings its own hooks, MCP servers or settings waits for Trust and start. Any other repository is trusted and started without asking. A failed clone says whether it was sign-in, a repository that doesn't exist, the network, or something else. The folder is removed, your message is kept, and Try again , Clone again or your next reply clones again. Copy clone command gives you the git command to run yourself. Cancel removes the folder.

      Clones run on the machine you send to, linked machines included, with that machine's own git sign-in. Plannotator never passes a password or token. If that machine is asleep, the message waits and the line reads "Waiting for Mac mini. It clones acme/billing-api and starts Claude Code when it's back." #2904

      "+" on a project row

      Each project in the sidebar now has a + beside ⋯ that starts a new session there. On a computer it shows with ⋯ when you hover the row or move to it with the keyboard. On a phone it is always shown, and + and ⋯ are 44 px targets each. Its tip names the project, for example "New session in billing-svc", and adds the machine for another machine's project, plus "starts when it's back" while that machine is asleep.

      Pressing it opens New message with To filled: "New Claude Code session in billing-svc". The agent is the one you started last, when that machine has it, and the cursor is in the message. On a phone, New message opens full screen with To and the folder filled. The button shows only while starting agents from New message is on, which it is by default. #2905

      A tray of reactions beside 👍

      👍 Looks good is still one click, now without a toast. The 👍 flies to the message, and the line under the message shows it. A second click on the pressed button, or Z, takes it back within the same 10 seconds.

      Rest the pointer on 👍, or hold it on a phone, to open a small tray: 👍, your saved emoji, a + , then …. + opens an emoji picker, saves the emoji you pick to your tray, and offers an optional name, which shows as its tooltip and on the line under the message. You can save up to five. … reacts once with any emoji and saves nothing. To rename, change or remove a saved emoji, hold it on a phone or use its pen. With the keyboard, Tab from 👍 reaches "More reactions", Enter opens the tray, the arrow keys move in it and Escape closes it. On a phone, the picker is a sheet at the bottom of the screen.

      Your saved emoji are kept in config.json and every open window has the same tray, so a change on your phone shows on your laptop. The agent hears a reaction the same way it hears 👍 Looks good. #2844

      A thread's links next to its files

      The thread's Artifacts view now has a Links side. A small Artifacts / Links switch with counts sits at the top of the view, beside a back arrow. Links lists every web link in the thread's messages, once each. GitHub and GitLab links are grouped by repository with their icons, and other links show the site's name. Pull request and issue rows show whether they are open, draft, merged, closed or not planned, in the Board's colours, and a bare #1290 gets its title. Each row asks for its state only once it is on screen.

      A thread with links and no files shows "Links N" on its button and opens on Links. A thread with neither shows no button. On a phone, the same switch sits beside "‹ Thread". Back still goes to the thread. #2704

      Settings → Activity

      A new Activity section in Settings shows your threads hour by hour: one row per thread in the order they began, day labels on top, and a mark for each hour with messages. Bigger marks mean more messages that hour, and neighbouring hours join into one shape. On a phone, Activity is first under "Your data and Plannotator".

      The preview in Settings fits the section's width. Click it, or Expand , to open the chart over the whole window, with a range (Today, 3 days, Week, 2 weeks, 30 days), a project filter and a short summary. There, hovering a mark shows the thread's name, that hour's and that day's counts, when the thread started and its last message. A click opens the thread. On a touch screen, the first tap shows the details and a second tap opens. The chart counts this Inbox's threads only, not a linked machine's. #2896

      Bro mode

      A new Bro mode row in Settings → Capabilities , off by default, asks agents to write to your Inbox in plain words. While it is on, agents read one more line in the Inbox tool's message field: "Don't use jargon and speak coherently. State things more simply and concisely, like one human talking to another. Don't drop important details, especially if the user asks for them." It takes effect from each agent's next session. With it off, agents read exactly what they read before.

      People who use the Inbox a lot see a one-time card offering it, at most once, when they come back to the list after reading a long agent message. Turn it on turns it on. Not now, Escape or a click outside leaves it off for good. #2693

      Start the next thread with this thread's files

      New message, opened over a thread, now has a From this thread row with that thread's files, newest first, up to 8. One click adds a file to the new message without uploading it again, and a second click takes it out. It is only the thread behind New message, never a list of everything.

      An archived thread takes no reply, so its files' paperclip-plus button reads "New message with this" and opens New message with the file and an empty To. A picture copied from this Inbox and pasted into a message is now that same file, with its name, instead of a new PNG. Any other paste works as before. #2656

      Desktop size for HTML pages on a phone

      An HTML page opened full screen on a phone now has one small icon in its top right corner, like Safari's "Request Desktop Website". At Desktop size , the page lays out at 1280 px and is scaled down to the phone's width. Phone size goes back. A page wider than the phone opens at Desktop size by itself. Your choice is remembered for each file, also after a reload, and you can still pinch to zoom. Comments on a scaled page land where you tap. Nothing changes on a computer. #2868

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      Full Changelog : v0.28.52...v0.28.53

    8. 🔗 Register Spill Joy & Curiosity #105 rss

      One of the strangest things nowadays is how everyone lives on a different timeline.

      Some people haven't spent more than a hundred thousand tokens with the latest frontier models and conclude that agents can't write code. Others have spent billions of tokens with them, in just the last week, and say that agents are now better at writing software than humans. In a few months, the first group will catch up.

      And that's just the most obvious example, using the latest models to write code.

      There are many more things like that. Once you try them, your view of software development will be completely changed.

      Except not a lot of people have tried them and we all talk about software development as if it's the same thing for all of us. "The future is already here - it's just not evenly distributed." I keep thinking of that quote.

      For me, the game has changed three times this year, with three different practices we've established at Amp:

      1. Going all-in on remote development and moving everything into orbs. You have to try it to believe it, but it is a change so fundamental that you will start to question everything: from the role of the operating system to what software even is.

      2. Asking agents for "irrefutable proof". Made me question everything again: the value of tests, the value of looking at code, what it is we do when we "review" something, what specs are and what not. If there's a 10x game changer, it's this one.

      3. Letting the agent control the full SDLC. At Amp, the agent can ship things to production, monitor their rollout, read logs, turn on feature flags, send emails, grant credits, investigate database issues, check graphs, … Everything that I can do, except writing to the database. The models have become too good to keep them boxed in as smart typewriters. Let them see what you can see, let them do what you can do (besides writing code) and you'll glimpse the future. (Jump to the end of this talk here to see what I mean.)

      I have so many "wow, I can't believe my eyes!" moments that I constantly want to post this exact messasge in our Slack, but then I remember that I only posted it yesterday and I can't spam everyone, they'll think it's psychosis.

      And then I talk to someone at another company and they tell me that if they find a papercut they can't just fix it, because they'll have to get the PR approved. And then they have to wait for the review and justify why they changed things. So they have ten pull requests open and constantly rebase them, ready to merge, impatient that it'll never happen.

      Or they tell me their team is skeptical of AI and doesn't want anything that makes life easier for agents in the codebase.

      Or they now do the work that previously would've taken them two weeks in a single day now but now they need to wait for the PM to tell them what to do. So they fiddle their thumbs and build elaborate agent tooling and workflows and slash commands but gettings things done they are not.

      Or they work in a company where they're only allowed to spend $50 in GLM 5.3 credits per week and they don't think that agents really change anything anyway.

      What a wild time it is! But not everyone has caught up to it yet. They will though.

      • On Craft, Process, and Networks: "The first is don't let anyone or anything, or anything acting like anyone, or anyone promoting anything, convince you that craft is outdated or will ever be outdated; you will only improve, only make the sounds you imagine in your mind's ear and feel in yourself, by working steadily to achieve them. Also recognize that expected paths lead to unlikely ends the more patiently and curiously, guided by instinct and experience, you walk those paths. There is always an excuse to not put in the work."

      • Andy Matuschak: Why books don't work. Came for the title about books, left thinking about lectures and talks and how "effective" they are at achieving their goals.

      • Peter Thiel on the new Walter Isaacson podcast. Always entertaining hearing him talk about the Antichrist. Second time I've done that while driving alone, hoping really hard that I won't have to stop at a red light where someone could hear what I'm listening to.

      • The internet turns good taste into bad taste: "Algorithmic feeds on digital platforms attempt to serve us content that we like; they filter in search of what an equation predicts will be interesting to us. Yet by guessing in advance what we want, they tend to homogenize what we consume. An algorithm will group you in with millions of other users, slotting your tastes into an easy category, then overdeliver on that category."

      • *sshole. Okay, this was scary, but then not that scary, but still: good job picking the name.

      • Every Novel Is Boring--Until It Isn't. I've never heard the term "volta", so this was good, but also: yes, that's my main concern with stopping books early, even if I don't enjoy them -- maybe I just need to keep going for 50 more pages?

      • Read the new latest Patrick Radden Keefe book, London Falling. Didn't enjoy it as much as his other books, but still very good.

      • Kirill Nikolaev at Namespace wrote about how they make their macOS cloud work: Mac at any scale. Very, very interesting. I wonder why Apple doesn't do more with Hypervisor?

      • keep going. We went full circle: memes (as we know them now) started as riffs on motivational posters and now they've become motivational posters.

      • The Running Novelist. This is the 2008 piece by Haruki Murakami that lead to (or is an excerpt of?) his What I Talk About When I Talk About Running book, which I read many, many, many years ago. While reading this, I couldn't help but think that the prose feels so… translated? Fascinating, but strange. Or maybe the But should be an And? Written as if he (or his translator) doesn't know certain idioms in English. So, fascinated by that, I got his book, Novelist as a Vocation, and, well, there you go: "Needless to say, my ability in English composition didn't amount to much. My vocabulary was severely limited, as was my command of English syntax. I could only write in short, simple sentences. Which meant that, however complex and numerous the thoughts running around in my head, I couldn't even attempt to set them down as they came to me. The language had to be simple, my ideas expressed in an easy-to-understand way, the descriptions stripped of all extraneous fat, the form made compact, and everything arranged to fit a container of limited size. The result was a rough, uncultivated kind of prose. As I struggled to express myself in that fashion, however, a distinctive rhythm began to take shape."

      • Aaron Francis: Caring in the age of AI. "Your job is to eat the pain." What a quote! Great talk.

      If you had game-changing moments this year, you should subscribe:

    9. 🔗 OmniNull/OmniWM Canary 20261108-0414 (ce363612) release

      Automated canary build of main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.

      See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.

      • Commit: ce363612eac6
      • Base tag: v0.8.0

      Changes since v0.8.0

      • a3ce741 Build the shader warning test's error from Metal's error code
      • ec067e6 Merge pull request #1123 from dappermint/fix/shader-error-message
      • 1202a7d Run every test group when a test-only change reaches a live-only file
      • 54a2a13 fix(shell): show the shader compile error when a warning comes first
      • 6501095 ci: fail a test group that runs no tests (#1117)
      • 05ebe3b Show the Blacksmith logo much larger in the README
      • d29617c Key CI's Swift build cache to the Ghostty pin
  4. November 07, 2026
    1. 🔗 r/Harrogate Harrogate Nurseries rss

      Currently going through the arduous, complex and slightly terrifying experience of finding a nursery for our twins. In fairness everywhere we have looked has been nice, but the costs seem to vary significantly. Busy Bees have said they charge £74 for an unfunded day which includes food, along with a 10% discount for twins, this seems quite a bit cheaper than other places we've seen.

      Does anybody have a recommendation for somewhere nice that is similarly competitive?

      submitted by /u/Spiritual_Lettuce642
      [link] [comments]

    2. 🔗 OmniNull/OmniWM OmniWM v0.8.0 release

      What's New Since 0.7.6

      OmniShell replaces the fixed workspace bar with an editable desktop shell: install styles from a gallery, arrange them in a visual editor, run Luau apps in windows OmniWM tiles, and decide which servers each widget or app may contact. OmniWM 0.8.0 also adds a workspace-aware window switcher, keyboard modes for shortcut clashes, drop zones and drags across displays, vertical Niri columns that scroll past the screen edges, and updates you can install from the update popup. Main-thread stalls measured during focus navigation drop too, with the figures and their limits under Performance.

      OmniShell styles and widgets

      • Restyle or replace your desktop shell. The workspace bar, Hidden Bar panels, popouts, edge drawers and Dynamic Islands are now drawn by editable, sandboxed widgets written in Luau, a small scripting language. In Settings > Styles & Widgets you can drag widgets between lanes and recolor a style to follow macOS or your wallpaper.
      • Start from a full-width Default bar. Default, the only style inside the app, runs across the top of the screen, and when it covers the native menus, its Apple and app menu widgets open them from their buttons.
      • Install styles from the gallery or from any public GitHub repository. Settings > Styles & Widgets > Get Styles downloads Celestial, Lake, Matrix, Nocturne, Sakura, Wayline and Vitreus, each with preview pictures. Add from GitHub… warns before install that a style runs code in OmniWM.
      • Try Vitreus, a liquid-glass style. Vitreus, a port of natepayn3's Vitreus (MIT), adds glass Island and Frame layouts and panels you can pull out, stick to a screen edge or store on a top shelf. It also names every workspace on its marks and shows app icons beside them, which preview their windows on hover and move a window when you drag one to another workspace, plus a scratchpads list, a System Stats button and fuller notification rows.
      • Get the same features in the shared styles. Default, Celestial, Lake, Matrix, Nocturne, Sakura and Wayline draw their widgets from one shared set, including a calendar popout, synced lyrics and per-app volume.
      • Browse and act on macOS notifications from the bar. With Full Disk Access to read the list and Accessibility for actions, you can dismiss a notification, clear them all or reply where the notification supports it.

      OmniShell apps in windows OmniWM owns

      • Build Luau apps that open in their own tiled windows. OmniWM tiles, focuses and closes these windows like any other, and you can open an app from the palette, a shortcut or the command line. Utility windows such as Preferences drag without the lag macOS adds to child windows. Windows don't come back after a restart.

      Network permissions

      • Choose which servers each widget or OmniShell app may contact, and which programs it may run. Each can reach only the servers it declares, and the first time it contacts one you have not decided on, OmniWM shows one prompt with its name and its own stated reason. A native program asks for your trust before it first runs and again whenever it changes.
      • Review it all on one page, or set it for an organization. Settings > Network & Permissions lists the servers and native programs of every installed widget and OmniShell app. Managed preferences can preapprove or block servers and stop native programs, but these controls don't cover update checks, style downloads, terminals or links opened in a browser.

      Workspace Bar and menu bar

      • Use Hidden Bar again on macOS 27.2. Hidden items work again there and also under a full-width bar, and right-clicking the OmniWM icon opens the Hidden Bar right under it, though items that need the native menu bar revealed can still flash.
      • Choose what the status menu shows. A new Status Menu tab under Settings > Menu Bar can hide its controls and rows, while Quit always stays.

      Window management

      • Switch windows with thumbnail previews. Turn on Settings > Window Switcher to cycle through windows in a preview grid, by default with Command + Tab (active workspace) and Option + Tab (all workspaces). Thumbnails need Screen Recording and the shortcuts need Input Monitoring.
      • Use keyboard modes to hand shortcuts back or run single-key actions. New unassigned actions add Pause, which gives shortcuts back to the focused app, and one-shot Prefix and sticky Window modes that run single keys you set (these two need Input Monitoring).
      • Keep native edge resizes of tiled windows. Turn on Keep Native Edge Resizes so a normal edge or corner drag no longer snaps back, except at a workspace's outer Dwindle edge.
      • Fix everyday window behavior. Windows an app hides but keeps alive, such as Messages after you quit it, now leave the layout while hidden, and the wallpaper no longer shows for a moment during a workspace switch. A new window from a busy app, such as Ghostty on a second display, now stays where the app put it for about 30 ms instead of 120 ms before OmniWM moves it, which shortens its flash on the wrong display.
      • Stay safe when permissions or the lock screen change. Turning off Accessibility while OmniWM runs now stops its services until access returns, and on Macs with Platform SSO, sign-in agents on the lock screen can't resume layout early and move windows onto one workspace.

      Niri and Dwindle

      • Choose swap or insert by where you drop, even on another display. With the mouse-move modifier held, dropping on a tile's center swaps and dropping near an edge inserts, and drops on another display work the same way between Niri and Dwindle in any combination.
      • Navigate to off-screen columns from the screen edge. Clicks and hover at a Niri screen edge no longer land on the window parked behind it, and a directional fin moves one column instead.
      • Scroll vertical Niri columns past the top and bottom edges. With Screen Recording permission, an inactive column past the top edge stays on screen as a live, clickable picture while the real window stays parked. Apps that stop drawing while parked, such as Ghostty, show their last image, and without the permission the usual macOS edge behavior stays.
      • Tune Niri with new options. You can keep focus follows mouse from focusing a partly offscreen neighbor, let trackpad scrolling go past the first or last column, and swap a lone window with its neighbor instead of stacking it.

      Overview and gestures

      • Chain workspace swipes, and choose what happens at the ends. A swipe started while the last one is settling continues from its destination, so quick swipes can cross several workspaces, and at the ends you can cycle, stop or move on to an empty workspace.
      • Read fingers and directions more reliably. A palm or hand edge resting on the trackpad no longer turns a two-finger scroll into a three-finger swipe, and a workspace swipe or Overview gesture that starts diagonally can now settle its direction instead of doing nothing.

      Command palette, Launcher and Quake

      • Run saved commands, scripts and command-line tools from Launcher. The palette's Applications mode is now Launcher, and saved commands and scripts run in the built-in Quake terminal, another terminal or the background. Terminal and iTerm2 may ask for macOS Automation access.
      • Leave private items out of clipboard history. History now skips what macOS marks as excluded, such as AutoFill passwords, one-time codes and private-browsing copies. The check adds about 26 µs per changed clipboard capture, on the clipboard worker rather than the main thread.
      • Use Kitty or foot as the Quake terminal. Choose one under Settings > Quake Terminal > Terminal; Kitty's shell sessions survive toggles and OmniWM relaunches.
      • Run the built-in Quake terminal on a newer Ghostty. Its embedded Ghostty engine is updated to the November 7, 2026 source.

      Settings, updates and first launch

      • Install updates from the update popup. An Install and Relaunch button downloads the release, checks its digest, version, signature and notarization, swaps the app in place and relaunches. It appears only when OmniWM can write to its own app and the installed app is signed and notarized, so Nix store, read-only and locally signed installs keep the manual actions.
      • Find settings faster, and get started from a Welcome window. Settings is now grouped into searchable pages, and rejected settings file edits show a notice on screen. New and upgrading users see Welcome to OmniWM once, and the permissions window now has a Don't ask about Screen Recording again checkbox.

      Automation and command line

      • Control more from hotkeys andomniwmctl. Keyboard Shortcuts gains unassigned actions for volume, media, shell drawers and widget popouts, and omniwmctl can run them too. It can also act on a window or its Niri column without moving focus, and its queries report focus history and each widget's state.

      Performance

      • Stop window title changes stalling focus navigation. In Release builds on an Apple M4 Max with macOS 27.2 and Swift 6.5-dev, over 30 s of focus commands every 150 ms through IPC while one app changed its title 76 times per run, the focus command round trip fell from 201.8 ms to 16.8 ms at the 95th percentile (-92%) and from 481.2 ms to 25.2 ms at its maximum (-95%), with the median unchanged at 8.1 ms. These are round-trip times, not display latency.
      • Hide the focus border without waiting on WindowServer. Fast focus sweeps across Niri columns froze individual animation frames for 55-400 ms. In three alternating runs per Release build on the same setup, each 25 s of focus commands every 100 ms over IPC across 9 columns, the longest interval between animation ticks fell from 193-272 ms to 14-20 ms and the longest focus command round trip from 160-238 ms to 19-22 ms, with the median unchanged at 7.6-7.8 ms. These are round-trip and main-thread times, not display latency.
      • Keep Niri slides on time. In Release builds on the same Mac with macOS 27.3 at 144 Hz, about 7 focus commands a second over IPC for 45 s, three runs each: with Vitreus and 9 windows, late animation ticks fell from 6.2-6.7% to 1.9-2.2% once the bar stopped repeatedly resizing itself and hidden windows were read in one query. With 12 windows, using the positions OmniWM set for parked windows instead of asking WindowServer during a slide cut late ticks by a further 90%, from 60-73 to 5-9 per run. Retain and release calls per focus move fell 36%, and the process used 6.13 s of CPU per run instead of 7.74 s. These count late ticks and CPU, not display latency.
      • Move the focus ring, tab rails and edge pictures in WindowServer. Their ordinary moves and ordering no longer wait on AppKit frame updates, though resizes and display changes still do. Each tab rail now also sits above its window's focus ring. The ring no longer lags behind a slide, so it can lead a slow app for a moment during the fastest part of one.
      • Take more mouse input off the main thread. Unmodified wheel input, two-finger scrolls and clicks OmniWM isn't capturing now pass on their own thread, and Mouse Warp crossings run on a dedicated pointer thread. A captured trace of the old Mouse Warp path showed the main run loop busy for up to 435 ms; measured live on one staircase display arrangement, 26 crossings completed 107-322 µs (median 208 µs) after the event reached the pointer thread, independent of main-thread stalls.

      Translations and documentation

      • Translate more of the shell. Built-in widget option titles and choice labels can now be translated, with Simplified Chinese complete. Most are still English in other languages, as are many of the Styles & Widgets editor's new labels in every language.
      • Learn the Niri keys in your browser. The website's playground adds nine short lessons, then free play.

      Breaking changes and upgrade notes

      • The workspace bar is now OmniShell, and its style sets the layout. The old fixed bar views are gone. With Default, the bar becomes 32 pt, full width and over the menu bar, reserves layout space and shows System Stats, and a style's values take precedence over the same [workspaceBar] and monitorBarOverrides keys in settings.toml. Change them in Settings > Styles & Widgets > Bar. The System Stats button needs the system-stats widget in one of the bar's groups.
      • Full-width bars change a macOS setting. Unless it sits at Below Menu Bar, an enabled full-width bar, including Default's, sets macOS's Automatically hide and show the menu bar to Always. Your previous choice returns when the last such bar moves to Below Menu Bar, is disabled or hidden with Toggle Workspace Bar, or OmniWM quits normally, if the macOS setting still matches what OmniWM applied. A crash can leave automatic hiding on; relaunch OmniWM and do one of those to restore your choice.
      • Some widgets ask for new optional permissions. Per-app volume and the audio spectrum ask for System Audio Recording, the calendar widget for Calendars, the Wi-Fi network name for Location and the Bluetooth widget for Bluetooth. Lake's Reminders component asks for Reminders, which Vitreus's calendar drawer also needs to show and add reminders. Log out, restart and shut down buttons in Celestial and Vitreus may ask for macOS Automation access. Reading notifications needs Full Disk Access.
      • IPC protocol is now 22, previously 19. Update omniwmctl and custom IPC clients alongside OmniWM; an older client reports a version mismatch. The bundled CLI already uses the new protocol, which adds omniwmctl shell, window IDs on mark lists, column modes on workspace queries and focus history on window queries. omniwmctl command open-command-palette applications keeps its name and opens Launcher.
      • Settings schema is now 5, previously 4. You don't need to edit anything: the six resize span actions change from IDs like setContainerPrimarySpan.decrease10Percent to grow and shrink IDs like resizeContainerPrimarySpan.shrink, with your bindings kept. The upgrade writes a settings.toml.pre-v5 backup, then rewrites the file once, which can reorder keys and removes comments; malformed bindings are rejected and left unchanged. OmniWM 0.7.6 can't load a schema 5 file, so restore the backup if you go back. If you add [[monitorGapOverrides]]-style tables by hand, first delete any leftover line such as monitorGapOverrides = [].
      • Mouse drops and Niri screen edges changed. With the mouse-move modifier, only a drop on a tile's center now swaps, in both layouts. A drop near an edge inserts, and Shift, which used to select insert in Niri, changes nothing. Clicks and hover at a Niri screen edge use the fin instead of reaching the parked window, and where a fin's edge also leads to another display, Mouse Warp and native crossings wait until you push outward 96 points, while window drags keep crossing immediately.
      • Three bar behaviors changed. Reveal on Modifier Hold now applies only to bars with automatic hiding on, so if you used a modifier alone to hide the bar, turn on Automatically hide and show the workspace bar , which also enables hover reveal. Below Menu Bar now turns Fill Left of Notch off without changing the saved setting, so a bar with both settings moves below the menu bar. Clicking a Hidden Icons Bar icon opens the app's menu in a dropdown when OmniWM can read it. Apps without a readable menu, including items hosted by MenuBarAgent on macOS 27.2, keep their native activation behavior.
      • App Rules and Adobe windows may change placement. A rule that used to lose to a more specific one now applies the settings it sets, and Adobe Creative Cloud windows tile unless an App Rule with the Float layout says otherwise.
      • The Quake terminal moves with Command + Option drag. Plain Option drag now reaches Ghostty and selects a rectangular block of text. In apps that capture the mouse, such as tmux or vim, use Shift + Option drag for that selection.
      • Some Settings pages moved. Hotkeys is now Keyboard Shortcuts and Monitors is now Displays. Niri Layout and Dwindle Layout are now tabs of Layouts , beside a Spacing tab that takes the window gaps from General. Borders is now the Window Borders tab of Appearance , where System-wide Window Corners also moved. Workspace Bar is now Styles & Widgets, Hidden Bar sits under Menu Bar, and App Rules has its own page as well as its menu item.
      • System requirements are unchanged, but building from source is not. OmniWM still runs on macOS 26 or later. Building it now requires a macOS 27 Mac with Xcode 27, the Swift 6.5 development snapshot pinned in .swift-version and installed through swiftly, and Lix or another Nix with flakes for make setup. Older toolchains reject the package.

      Thanks

      Thank you to:

      Full changelog: v0.7.6…v0.8.0

      Official website and documentation: https://omniwm.app
      Installation guide: https://omniwm.app/guides/install/

      Release Integrity

      Asset hashes are sealed by the release manifest after final note review.

    3. 🔗 r/Harrogate Gluten free beer options locally rss

      Was in London this week and stayed with a mate who's recently been diagnosed as coeliac. He was bemoaning the fact he can't get a draught GF beer anywhere near him as has to put up with the bottled lagers.

      Made me think how remarkably well-served we are for this for a small town (my wife is also coeliac so it's always a factor for us).

      Between Roosters and Cold Bath and Paradise, the brewery and location options are excellent. Those places often seem full, really hope they all thrive/ survive; I know it's not easy to make pubs and bars work financially.

      Anyway, no massive point to this post other than to cover the topic in case anyone is ever looking for it in the future.

      submitted by /u/yodaniel77
      [link] [comments]

    4. 🔗 r/Harrogate Views over the Stray rss

      Does anyone know of a high view point that would give a good view of the stray for the fireworks? Almscliffe is probably too far away and doesn’t have line of sight back towards Harrogate. Is there anything better?

      submitted by /u/CyclePrevious9043
      [link] [comments]

    5. 🔗 OmniNull/OmniWM Canary 20261107-0413 (98ba24e3) release

      Automated canary build of main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.

      See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.

      • Commit: 98ba24e3c78d
      • Base tag: canary-20261106-0415-42160958024-1

      Changes since canary-20261106-0415-42160958024-1

      • 67a3af1 Stop reading parked windows' positions on every relayout during a slide
      • a9adb56 Replace the remaining test tolerances with proofs and accepted limits
      • 8ac023c Share the override status so every settings row avoids the crash
      • dc1f793 Merge pull request #1111 from nblopes/fix-overridable-global-crash
      • 891f61d Base the icon preview test on the real display
      • 518fa28 Give Vitreus window icons previews and drag to workspaces
      • d0c6270 Name the test time allowance
      • 97c2257 Keep the Global label of overridable settings from crashing accessibility
      • 767f7a7 Derive the tolerances hidden in test helpers and add a rule guard
      • 0d9486f Replace test tolerances with bounds derived from each check
      • c56bc43 Bound rounding in checks whose inputs move with the clock
      • 1ba4efb Drop test tolerances that were never needed
      • 44f68cf Compile live test tools only behind one flag
      • 1cb067f fix(shell): keep the shell path when listing widget folders (#1108)
      • 138bd94 Bound test waits with one limit and fail on missing prerequisites
      • 4124bb8 Order and move tab rails and edge pictures without AppKit
    6. 🔗 benji.dog rss