🏡


  1. October 31, 2026
    1. 🔗 backnotprop/plannotator v0.28.42 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      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
      v0.28.36 | Qwen Code support, plans open in the Clean look, live HTML and diagrams in Inbox messages, a Feedback button, plannotator inbox status, stop and restart
      v0.28.35 | Updates check the download against checksums Plannotator fetches itself, a failed check changes nothing
      v0.28.34 | Start a Grok Build session from the Inbox, action items in your reply, a tidier Board, Settings → Capabilities, a failed feedback send is shown
      v0.28.33 | Pi updates no longer get stuck on 0.28.31
      v0.28.32 | A security update (built on Bun 1.4.4, eMudhra certificates), the Inbox Board, custom Inbox prompts, hover cards for issue and PR links, rich-text Copy
      v0.28.31 | An onboarding tour for the Inbox, pinned threads, picture choices in questions, palettes in Inbox Settings, tailnet reviews from the plugin tool
      v0.28.30 | An Artifacts view in the Inbox, comments on part of an image, diagrams in code review, Ask AI keeps its conversation in annotate
      v0.28.29 | Plan review opens on OpenCode 2, a DOMPurify security update, closing a review stops the agent everywhere

      What's New in v0.28.42

      Choose how your Inbox list looks, find your place in a long document from its contents, and link the Inboxes on two computers. Plannotator's servers now keep files outside the session's folders away from other sites and remote readers. 33 PRs, 8 of them from @utpalsinghdev, @BenNewman100 and @juanibiapina, who makes a first contribution.

      Plannotator Inbox

      Choose how your list looks

      The list's ⋮ menu has three new options: Highlight thread subject, Compact rows (two lines per row) and Hide agent icons. All three are off by default, and each browser keeps its own choice.

      Existing Inbox users see a one-time "Choose how your list looks" dialog that previews the options. It shows only on the list, never over an open thread. Keep as it is, or Escape, changes nothing.

      Contents for long documents

      A plan or Markdown file with 4 or more headings shows a column of ticks in its right margin. Click one to open the contents and go to that section. On a phone, a Contents button sits at the top right. In Side by side on a laptop, the text column is a little narrower to make room.

      Link your machines

      Link the Inboxes on two computers with a code from Settings → Machines (or plannotator inbox link), and each Inbox shows the threads of both. An answer to a machine that is asleep waits and is sent once when it wakes. Linking uses Tailscale. Until you link a machine, the new Machines section in Settings is the only change.

      Clearer search

      Each search result starts with a 20 px mark: the agent's mark for a message, a person for your reply, a speech bubble for a thread, and an icon for a file, a guided review or a project. The panel is solid, matched words are underlined, the selected row is easier to see, and on a desktop a footer lists the keys. Results and their order do not change.

      Action items you can act on

      The thread foot's button counts open action items as well as questions ("3 questions, 2 action items"), and its list takes you to each one. Agents now put each command in its own code block, so every command has a copy button. Text you select in an action or question card stays selected.

      Smaller changes

      • Unread thread names in the list are bigger and bolder, and go back to normal once read. #2396
      • A relative link to a .md file in an attachment opens that document in the viewer, not the Inbox's front page. By @utpalsinghdev, closing #2230 from @zane668. #2363
      • Toasts fit long names and errors on phones, tablets and desktop, and on a phone they sit above the reply bar. Agent names longer than 40 characters are shortened with "…". #2409
      • On a phone, full-screen files, sheets and Decision mode end above the keyboard, so the reply and comment boxes stay in view. #2388
      • On a phone, no dark band shows between the composer and the keyboard. #2386
      • New message's To row stays on one line, and the phone's picker shows when each session started. #2400
      • In Side by side, the viewer's Download button is an icon. #2399

      Plannotator

      Documents outside the project

      A document in a folder you added in Settings → Files, or one that a document links outside the project, now opens instead of failing with "Access denied". Code and data files, such as .json or .yaml, stay inside the session's folders for every reader.

      Another site's page, or a remote reader (remote mode,--tailscale, a proxy), can no longer list or read files outside the session's folders, in the Files sidebar and Obsidian vaults too. For a remote reader, the vault browser opens only the vaults Obsidian lists on the machine running Plannotator.

      Find the data folder

      plannotator data-dir prints the folder where Plannotator keeps plans, history and settings. The skills now ask for it instead of naming ~/.plannotator, so an agent no longer makes a stray folder that hides your data.

      When~/.plannotator holds no data and $XDG_DATA_HOME/plannotator does, Plannotator now uses the XDG folder.

      Uninstall finds every hook

      plannotator uninstall now finds hooks with options, such as plannotator --browser Safari, and leaves your other hooks alone.

      If a Claude Code, Codex, Gemini or Vibe hook still runs Plannotator, uninstall keeps the binary, stops, and names the file, the field and the fix. Edit that file and run uninstall again.

      Smaller changes

      • After a reload in annotate, Draft Recovered offers the saved comments of every document in the session, not only the open one, and Send clears only what that page saw. By @BenNewman100. #2393
      • Code review no longer breaks when Expand unchanged is on. By @utpalsinghdev, closing #2264 from @thomasaull. #2361
      • A new dark theme: Tokyo Night Moon. By @juanibiapina. #2336
      • The repository and branch chips above a plan or document use the room they have, and on Windows the file chip shows the file's name. By @BenNewman100. #2389
      • On Windows, relative images and links in an annotated document load from the document's folder. By @BenNewman100. #2390
      • On Windows, Guided Review with Pi starts. Closing #2372 from @Mathias-Givskov. #2406
      • On Windows, the review app builds from source. By @BenNewman100. #2385
      • On Team and Enterprise accounts, Claude Code no longer says Plannotator's prompt.context or classic.SessionStart hook was skipped. Part of #2243 from @sshevlyagin. #2413
      • The plannotator tool accepts the empty optional fields that GitHub Copilot's Responses models send. Closing #2292 from @alexshpunt. #2405

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. 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: paint the phone page canvas with the composer's colour (no dark band above the keyboard) by @backnotprop in #2386
      • references: @plannotator/references, the open read side of reference integrations by @backnotprop in #2387
      • Inbox: the Workspaces contents rail, moved into @plannotator/ui, for documents by @backnotprop in #2384
      • Inbox: full-screen reply and comment boxes stay above the phone keyboard by @backnotprop in #2388
      • Inbox: unread thread names bigger in the list by @backnotprop in #2396
      • Inbox: thread foot counts open action items by @backnotprop in #2394
      • Inbox: action-item commands get copy buttons; selecting text in a card sticks by @backnotprop in #2395
      • Inbox: the viewer header's Download becomes icon-only by @backnotprop in #2399
      • Inbox: compose To row stays one clean line on phones by @backnotprop in #2400
      • Inbox: link machines (server engine, Tailscale) by @backnotprop in #2375
      • Inbox: list options in the ⋮ menu (highlight, compact, hide agents) by @backnotprop in #2401
      • Inbox: link machines, the window (stack 2/2) by @backnotprop in #2382
      • fix(plannotator-tool): read empty optional fields as absent (Copilot Responses, #2292) by @backnotprop in #2405
      • fix(review): prevent partial diffs from crashing code review by @utpalsinghdev in #2361
      • fix(skills): find the data dir with plannotator data-dir; a stray ~/.plannotator no longer hides an XDG install by @backnotprop in #2411
      • fix(review): build the diagram engine on Windows by @BenNewman100 in #2385
      • fix(annotate): resolve relative images and links from the document's folder on Windows by @BenNewman100 in #2390
      • feat(ui): add the Tokyo Night Moon palette by @juanibiapina in #2336
      • fix(annotate): a reload offers every document's saved comments, and a send clears only what that page saw by @BenNewman100 in #2393
      • Inbox: a one-time dialog that introduces the list options by @backnotprop in #2404
      • fix(inbox): open relative Markdown links in attachments by @utpalsinghdev in #2363
      • fix(inbox): keep the tailnet door until an unreached unlink is heard by @backnotprop in #2410
      • fix(agent-jobs): Guided Review with Pi on Windows: start .cmd shims as Ask AI does (#2372) by @backnotprop in #2406
      • fix: close uninstall host integration recovery gaps by @utpalsinghdev in #2226
      • Inbox toasts: fit long data on phones, tablets and desktop by @backnotprop in #2409
      • fix(ui): the document card's chips name the file on Windows and use the room they have by @BenNewman100 in #2389
      • Contents rail: keep a picked heading marked after the scroll snaps to a whole pixel by @backnotprop in #2419
      • fix(mod): no prompt.context or classic.SessionStart hook, so a guard has nothing to skip (#2243) by @backnotprop in #2413
      • Skills: fall back when plannotator data-dir prints nothing by @backnotprop in #2420
      • Open documents outside the project root from this machine (#2291) by @backnotprop in #2415
      • Gate the Files sidebar and Obsidian routes by reader by @backnotprop in #2418
      • Inbox search: a mark on every row, a solid panel, a visible selected row by @backnotprop in #2417
      • Inbox: show the list options intro only on the list by @backnotprop in #2421

      New Contributors

      Contributors

      Community

      Full Changelog : v0.28.40...v0.28.42

    2. 🔗 backnotprop/plannotator v0.28.41 release

      chore: bump version to 0.28.41

    3. 🔗 OmniNull/OmniWM Canary 20261031-0412 (ca49519c) 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: ca49519c2ebe
      • Base tag: canary-20261030-0415-41001556816-1

      Changes since canary-20261030-0415-41001556816-1

      • ca49519 test(border): isolate replacement assertions from background layout (#1062)
      • c44760f Merge GitHub main into the Vitreus work
      • 87dde09 Melt the Vitreus bar into the MacBook notch and span Full Width
      • 3a9fa88 Show the keyboard mode beside the Vitreus logo
      • 64ef3e2 feat(permissions): let users skip the screen recording prompt at launch (#1061)
      • 2e74388 ci: skip the app ci for docs and website only changes (#1059)
      • 15eccd3 Replace the Vitreus gear with the OmniWM logo
      • 36ca5f5 Move the bundled fonts into the Celestial style
      • 40f8147 Cache the Vitreus clock and calendar text instead of reading seconds
      • ce40789 Run the mid-motion resize test only on macOS 27.2 and later
      • 3522753 Drop the glass probe's private CASDFLayer comparisons
      • 3db72d9 Merge GitHub main into the PR integration
      • 91a0bd3 Merge pull request #1054 from dappermint/perf/swipe-warm-settled
      • e396921 Merge pull request #1053 from dappermint/perf/parking-fin-hide
      • 7c971de perf(swipe): warm workspace swipe previews from settled frames (#1054)
      • 88698a4 test(surface): check hiding a hidden fin clears dwell progress
      • 0b73645 Skip the bounds read when hovering the already focused window
      • 3222f51 Merge pull request #1050 from kieled/feat/fully-visible-hover-focus
      • c723c48 Drop the outgoing display snapshot when a chained swipe replaces it
      • c2f931f Merge pull request #954 from brdoney/chained-workspace-swipes
      • 658c0dd Bound lifecycle AX probes once, through the worker's own timeout
      • 3c3ecd0 Merge pull request #1051 from hezhizhen/codex/fix-lifecycle-ax-probe-timeout
      • 5307b7a Derive the overscroll centering test's tolerance from pixel rounding
      • 39b594f Merge pull request #1052 from hezhizhen/codex/fix-trackpad-monitor-centering
      • c8e6fa8 Merge pull request #1046 from hezhizhen/codex/fix-workspace-bar-monitor-reveal
      • 73c61e9 Merge pull request #1032 from henrikhestnes/quake-terminal-selection-scroll
      • deb1e8d Merge pull request #1029 from hezhizhen/codex/fix-launcher-terminal-environment
      • d9ad1dd Merge pull request #1028 from hezhizhen/codex/fix-lake-matrix-module-paths
      • ae91751 perf(swipe): warm workspace swipe previews from settled frames
      • 1d2871d Turn Get Styles into a picture gallery with updates
      • 6630fbe Use current native placement for fully visible Niri hover focus
      • cf7e405 Reproduce hover focus using future layout before native placement
      • bd05884 fix: bound lifecycle AX validity probes
      • afec91b Check hover visibility in screen coordinates after Niri scrolling
      • ad0f46a Pull styles from the app's GitHub tag in the Get Styles gallery
      • e6655d9 Cover hover focus before the first rendered frame
      • b216bb7 Isolate the edge test pointer state on the main actor
      • 1733f6d Add a Get Styles gallery that installs styles from the checkout
      • bd090ae Re-enter the parking edge when testing hover reactivation
      • 23502a8 perf(surface): skip ordering out a parking edge fin that is already hidden
      • 9b5024a Add opt-in fully visible hover focus for Niri
      • 2237200 fix(niri): honor monitor centering after trackpad gestures
      • e21ca70 Move style palettes, notices and docs into the styles
      • d2e7cd1 Merge branch 'main' into codex/fix-launcher-terminal-environment
      • 34a7b9f Merge latest main into codex/fix-lake-matrix-module-paths
      • 05cdc1d Let each style describe and translate itself
      • 3fb0a65 Move the optional shell styles out of the app into styles/
      • 6408833 Make Prevent Sleep the one keep-awake switch for every style
      • 815e993 Merge GitHub main into the Vitreus work
      • 9494dc3 Add the Vitreus style with native glass and detachable panels
      • 5bb41fe Respect per-monitor workspace bar auto-hide with reveal modifiers
      • 6a8dfa0 Merge branch 'main' into quake-terminal-selection-scroll
      • c7a1865 Merge branch 'main' into codex/fix-launcher-terminal-environment
      • 3e1cbcc Merge branch 'main' into codex/fix-lake-matrix-module-paths
      • e489c80 Test the Command-Option move and plain Option passthrough
      • 251defb Move the Quake terminal with Command-Option drag
      • daf601e fix: preserve equals signs in launcher executable paths
      • 4b9abaa fix: clear stale environment variables in reused terminals
      • 1d7ba45 test: normalize Lake matrix module paths
      • aa1775d Skip focus hand-off on bulk cancels and disconnects
      • 37f58f5 Keep live overlay captures running while prefetching chain targets
      • 62fde90 Fall back to an instant switch when a valid chain can't animate
      • 82ce26c Keep focus with the newest trackpad gesture across displays
      • cbfba00 Release a disconnected display's swipe overlay
      • db1e870 Hand focus to the newest swipe when it ends before an older switch commits
      • a12ef7b Count instant swipe switches as the newest gesture for focus
      • 73364a4 Keep the swipe overlay alive across chained swipes
      • 886c298 Detach a refused chained swipe from the settling flight
      • a5c1848 Merge origin/main into chained-workspace-swipes
      • 0c6d198 Make workspace swipes per-monitor and chainable
    4. 🔗 Filip Filmar Linux on a Simulated Rocket Core, over Ethernet rss

      Linux 6.18 now boots on FireSim’s Rocket design on an Alinx AX7A200B board. The host reaches the board over an Ethernet cable, as in the last post. The whole run takes 4 min 36 s: 4 min 22 s to load the software, and 13 s from the firmware’s banner to a shell that shows the machine and powers off.

      Count the layers. The FPGA runs a simulator. The simulator runs a RISC-V core, cycle by cycle. The core runs Linux, and Linux runs a shell. We must go deeper. The shell is the bottom level of this dream, and it stays there: it powers off, and FireSim’s host program exits with *** PASSED ***.

  2. October 30, 2026
    1. 🔗 IDA Plugin Updates IDA Plugin Updates on 2026-10-30 rss

      IDA Plugin Updates on 2026-10-30

      New Releases:

      Activity:

      • augur
        • 5da3c282: ci: bump the actions-dependencies group with 2 updates
      • capa
        • 00240199: fix: skip unreadable ELF symbol names instead of aborting (#3207)
      • dial
        • 9473305d: Merge remote-tracking branch 'origin/main'
        • 1c822450: test: run the Rust suite under cargo-nextest and drop slow test waits
        • 62b208ba: feat: add preflight script for local CI checks
        • bebba6f8: Merge pull request #4 from KiidxAtlas/release-packaging/v0.2.9
        • 8322c164: release: update package metadata for 0.2.9
        • 001af892: ci: gate releases before tagging and stop cold macOS rebuilds
        • 401d23a7: test: settle the parent request count before the worker restore check
        • ef869938: test: canonicalize macOS temp paths in voice and hashline tests
        • 7019715c: test: read the worker pool id from the model-facing task summary
        • 3f6827cb: test: use unique markers for extension context privacy assertions
        • 78fbc702: fix: build the PTY wrapper's TIOCSCTTY ioctl on musl
        • 90882550: release: v0.2.9
        • 6e9a0c1a: fix: voice input, retry waits, pickers and overlay fixes for 0.2.9
        • 4e9ee51e: Merge origin/main into main, preserving local features and remote rel…
        • d7b5917d: feat: Add ProviderBatch command and related functionality
      • freelumina
        • b26d44a5: Fix Windows CI: link FreeBASIC startup, parse PE exports across binut…
        • 537955f5: yolo
      • haruspex
        • 94fe994b: Merge pull request #20 from 0xdea/dependabot/github_actions/actions-d…
        • 1c9ca8da: ci: bump the actions-dependencies group with 2 updates
      • ida-hcli
        • c1d8eeab: Fix ida switch suggestion quoting
      • idamcp
        • 07409d9d: Replace strings rebuild prompt with rebuild_strings_on_data_patch
        • 42b2d5b4: Accept integer addresses in MCP tool parameters
      • oh-my-pi
        • a1901b56: Merge pull request #17508 from can1357/feat/codex-daybreak-setting
        • 442231fc: fix(coding-agent): size the image clamp's body room per Factory wire
        • cef4a452: fix(coding-agent): scope the Daybreak opt-out to each session's settings
        • c391fc2a: Merge PR #17492: fix(catalog,coding-agent): keep Anthropic inline ima…
        • 81ab6d08: feat(coding-agent): add providers.openai-codex.daybreak setting to op…
        • e6eba3dc: fix(agent,coding-agent): size the image clamp's body room against wha…
        • 95082085: fix(coding-agent): stringify tool arguments for the body measurement …
        • 6b257369: fix(coding-agent): measure tool arguments as the string the Responses…
      • oh-my-pi
        • a0d0eec9: fix(prompt-cache): mount MCP routes through the notice; default title…
        • 2516e1d6: v18.14.0 upstream source
      • rhabdomancer
        • 0445494f: Merge pull request #20 from 0xdea/dependabot/github_actions/actions-d…
        • 9acba156: ci: bump the actions-dependencies group with 2 updates
    2. 🔗 backnotprop/plannotator v0.28.40 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      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
      v0.28.36 | Qwen Code support, plans open in the Clean look, live HTML and diagrams in Inbox messages, a Feedback button, plannotator inbox status, stop and restart
      v0.28.35 | Updates check the download against checksums Plannotator fetches itself, a failed check changes nothing
      v0.28.34 | Start a Grok Build session from the Inbox, action items in your reply, a tidier Board, Settings → Capabilities, a failed feedback send is shown
      v0.28.33 | Pi updates no longer get stuck on 0.28.31
      v0.28.32 | A security update (built on Bun 1.4.4, eMudhra certificates), the Inbox Board, custom Inbox prompts, hover cards for issue and PR links, rich-text Copy
      v0.28.31 | An onboarding tour for the Inbox, pinned threads, picture choices in questions, palettes in Inbox Settings, tailnet reviews from the plugin tool
      v0.28.30 | An Artifacts view in the Inbox, comments on part of an image, diagrams in code review, Ask AI keeps its conversation in annotate
      v0.28.29 | Plan review opens on OpenCode 2, a DOMPurify security update, closing a review stops the agent everywhere
      v0.28.27 | Jump to open questions, files side by side or full screen, image zoom in the Inbox, empty To field, text size for plan review and annotate
      v0.28.26 | Action items and reply drafts in the Inbox, one decision button for plan review, Enter to save a comment, a custom code font

      What's New in v0.28.40

      v0.28.40 is a patch on v0.28.39. It repeats v0.28.39's notes and adds three Inbox fixes, listed first under Smaller changes.

      Reply to an agent without leaving full screen, thread names lead the Inbox list, and a Claude Code session keeps its messages in one project. In code review, the sidebar is redesigned and Call flow shows its paths as cards. 29 PRs.

      Plannotator Inbox

      Reply from full screen

      An image, video or HTML file in full screen has a card at its foot with two tabs: comment on the file, or reply to the agent. The reply is the thread's own draft, files included, and Send keeps you in full screen. Minimize the card to a small pill, or hide it.

      Thread names lead

      A list row's title is now the thread's name, shown in full. The agents' icons sit beside the project. A pinned thread and an open thread show the name too.

      One project per Claude Code session

      A Claude Code session now files its messages under the folder it started in, so acd no longer makes a new project. Claude Code's own /cd still moves the session. Projects that were split before stay as they are; Archive all hides them.

      Open the files your reply commented on

      In your sent reply, each file named under "Feedback on the attached files" is a link that opens the file beside the thread. If the file has since moved or been deleted, the link opens the version you sent.

      Pinned and Projects fold like folders

      Click the Pinned or Projects heading in the sidebar to close or open it. A closed Pinned still shows how many pinned threads wait on you.

      Smaller changes

      • Update works with update checks off. When a newer version is known, the Inbox still offers Update, and clicking it checks once before installing. Automatic install stays off while checks are off. #2380
      • The thread's top bar always shows the thread's name, or its subject when it has none. #2379
      • Beside an open thread and on a phone, list rows show the agents first, then the project on one line. #2383
      • Pin thread moved from the thread header into its ⋯ menu. #2352
      • Open actions show as a small box with a count, and open questions as a speech bubble with a count. #2348
      • Projects show their folder name, adding a parent folder only when two listed projects share a name. #2349
      • One project's list header shows the name without the folder path. The path is in its tooltip. #2355
      • The thread header on a phone fits on one line, with nothing cut. #2357
      • An agent's inline image from a hidden folder in a project, such as .ops, now shows, as it does when attached. #2343
      • Picture choices in full screen keep the letter from their own label. #2350
      • The What's new link and its images retry after a quit or a failed fetch, and the link stays until you have seen it. #2345, #2346
      • Agents are told to keep one thread per work stream, unless you say otherwise. #2367
      • An agent that lists threads from a folder with none is told which projects inside that folder have threads. #2368
      • New thread no longer says when the agent will take the message. #2351
      • The agent logos on Copy prompt tilt apart on hover. #2347

      Plannotator

      A new code review sidebar

      Go to file is a field at the top of the sidebar, and Tree, Git status and Commits are tabs. Progress reads in words ("0 of 12 viewed · 1 staged"), and line counts line up in columns. The settings from Tree controls, and Copy all diffs, are now in the "…" menu.

      Call flow as cards

      In code review, each entry point in Call flow's Paths view is a card. Dots mark new, removed and unchanged calls, and one line sums up the changes.

      Smaller changes

      • Call flow (opt-in) now needs CallDiff 0.6.0 and Node 22.18 or newer. Trees are more accurate, and CUDA files are read as C++. If Call flow is on, the new version installs once, automatically. CallDiff is by @tanishqkancharla. #2365
      • Updates recover from killed or overlapping installs. #2342
      • Agents started by Ask AI, code review, Code Tour and Guided Review no longer post to your Inbox or wait on a plan review. #2366, #2369, #2371

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. 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

      • Updates: recover from killed or overlapping installs (F5, F6, F7) by @backnotprop in #2342
      • Inbox: an agent's inline image in a project's hidden folder shows, as its attachment does by @backnotprop in #2343
      • fix(whats new): retry abandoned and failed notes fetches; keep the link across restarts by @backnotprop in #2345
      • Inbox: full screen's composer (comment or reply without leaving full screen) by @backnotprop in #2339
      • fix(whats new): retry release images abandoned mid-fetch after 15 minutes by @backnotprop in #2346
      • Inbox: Copy prompt logos tilt apart on hover by @backnotprop in #2347
      • Inbox: drop the 'takes it as its next turn' line from New thread by @backnotprop in #2351
      • Inbox: Pin thread moves from the thread header into its ⋯ menu by @backnotprop in #2352
      • Inbox: picture choices keep the letter in their own label in full screen by @backnotprop in #2350
      • Inbox: action count as a box pill, question count with a speech-bubble icon by @backnotprop in #2348
      • Inbox: an open thread shows its name before the message count by @backnotprop in #2354
      • Inbox: show a project's folder name, adding the parent only when two listed projects share it by @backnotprop in #2349
      • Inbox: Pinned and Projects open and close like folders by @backnotprop in #2353
      • Inbox: link the files your sent reply commented on by @backnotprop in #2358
      • chore: take the AIContext type from core, not the AI package by @backnotprop in #2360
      • test: let the list-resize drag finish before the last sample by @backnotprop in #2362
      • fix(inbox): phone thread header fits one line with nothing cut by @backnotprop in #2357
      • fix(inbox): drop the folder path from a project's list header by @backnotprop in #2355
      • Inbox: a pinned thread shows its name by @backnotprop in #2359
      • Code review: Call flow as cards by @backnotprop in #2364
      • Call flow: update CallDiff to 0.6.0 by @backnotprop in #2365
      • fix(pi): keep the Inbox off inside Ask AI's RPC runs by @backnotprop in #2366
      • Inbox: read_thread names the projects inside a folder with no threads by @backnotprop in #2368
      • Inbox guidance: one thread per work stream by @backnotprop in #2367
      • Code review sidebar: aligned Halftone layout (E) by @backnotprop in #2370
      • Ask AI: agents it starts never load Plannotator's Inbox, agent tool or plan hooks by @backnotprop in #2369
      • Agent jobs: Review, Code Tour and Guided Review agents never load Plannotator's Inbox or plan hooks by @backnotprop in #2371
      • Inbox list rows: thread name as the title, agent icons beside the project by @backnotprop in #2374
      • Inbox: a Claude Code session files under the folder it started in by @backnotprop in #2344
      • Inbox window: every API URL through one helper by @backnotprop in #2377
      • Inbox: Update stays available when update checks are off by @backnotprop in #2380
      • Inbox: the thread bar shows the thread's name, not its first line by @backnotprop in #2379
      • AGENTS.md: test agent-facing instructions clean room by @backnotprop in #2381
      • Inbox: agent marks before the project, thread name on its own line by @backnotprop in #2383

      Community

      Full Changelog : v0.28.38...v0.28.40

    3. 🔗 backnotprop/plannotator v0.28.39 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      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
      v0.28.36 | Qwen Code support, plans open in the Clean look, live HTML and diagrams in Inbox messages, a Feedback button, plannotator inbox status, stop and restart
      v0.28.35 | Updates check the download against checksums Plannotator fetches itself, a failed check changes nothing
      v0.28.34 | Start a Grok Build session from the Inbox, action items in your reply, a tidier Board, Settings → Capabilities, a failed feedback send is shown
      v0.28.33 | Pi updates no longer get stuck on 0.28.31
      v0.28.32 | A security update (built on Bun 1.4.4, eMudhra certificates), the Inbox Board, custom Inbox prompts, hover cards for issue and PR links, rich-text Copy
      v0.28.31 | An onboarding tour for the Inbox, pinned threads, picture choices in questions, palettes in Inbox Settings, tailnet reviews from the plugin tool
      v0.28.30 | An Artifacts view in the Inbox, comments on part of an image, diagrams in code review, Ask AI keeps its conversation in annotate
      v0.28.29 | Plan review opens on OpenCode 2, a DOMPurify security update, closing a review stops the agent everywhere
      v0.28.27 | Jump to open questions, files side by side or full screen, image zoom in the Inbox, empty To field, text size for plan review and annotate
      v0.28.26 | Action items and reply drafts in the Inbox, one decision button for plan review, Enter to save a comment, a custom code font

      What's New in v0.28.39

      Reply to an agent without leaving full screen, thread names lead the Inbox list, and a Claude Code session keeps its messages in one project. In code review, the sidebar is redesigned and Call flow shows its paths as cards. 29 PRs.

      Plannotator Inbox

      Reply from full screen

      An image, video or HTML file in full screen has a card at its foot with two tabs: comment on the file, or reply to the agent. The reply is the thread's own draft, files included, and Send keeps you in full screen. Minimize the card to a small pill, or hide it.

      Thread names lead

      A list row's title is now the thread's name, shown in full. The agents' icons sit beside the project. A pinned thread and an open thread show the name too.

      One project per Claude Code session

      A Claude Code session now files its messages under the folder it started in, so acd no longer makes a new project. Claude Code's own /cd still moves the session. Projects that were split before stay as they are; Archive all hides them.

      Open the files your reply commented on

      In your sent reply, each file named under "Feedback on the attached files" is a link that opens the file beside the thread. If the file has since moved or been deleted, the link opens the version you sent.

      Pinned and Projects fold like folders

      Click the Pinned or Projects heading in the sidebar to close or open it. A closed Pinned still shows how many pinned threads wait on you.

      Smaller changes

      • Pin thread moved from the thread header into its ⋯ menu. #2352
      • Open actions show as a small box with a count, and open questions as a speech bubble with a count. #2348
      • Projects show their folder name, adding a parent folder only when two listed projects share a name. #2349
      • One project's list header shows the name without the folder path. The path is in its tooltip. #2355
      • The thread header on a phone fits on one line, with nothing cut. #2357
      • An agent's inline image from a hidden folder in a project, such as .ops, now shows, as it does when attached. #2343
      • Picture choices in full screen keep the letter from their own label. #2350
      • The What's new link and its images retry after a quit or a failed fetch, and the link stays until you have seen it. #2345, #2346
      • Agents are told to keep one thread per work stream, unless you say otherwise. #2367
      • An agent that lists threads from a folder with none is told which projects inside that folder have threads. #2368
      • New thread no longer says when the agent will take the message. #2351
      • The agent logos on Copy prompt tilt apart on hover. #2347

      Plannotator

      A new code review sidebar

      Go to file is a field at the top of the sidebar, and Tree, Git status and Commits are tabs. Progress reads in words ("0 of 12 viewed · 1 staged"), and line counts line up in columns. The settings from Tree controls, and Copy all diffs, are now in the "…" menu.

      Call flow as cards

      In code review, each entry point in Call flow's Paths view is a card. Dots mark new, removed and unchanged calls, and one line sums up the changes.

      Smaller changes

      • Call flow (opt-in) now needs CallDiff 0.6.0 and Node 22.18 or newer. Trees are more accurate, and CUDA files are read as C++. If Call flow is on, the new version installs once, automatically. CallDiff is by @tanishqkancharla. #2365
      • Updates recover from killed or overlapping installs. #2342
      • Agents started by Ask AI, code review, Code Tour and Guided Review no longer post to your Inbox or wait on a plan review. #2366, #2369, #2371

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. 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

      • Updates: recover from killed or overlapping installs (F5, F6, F7) by @backnotprop in #2342
      • Inbox: an agent's inline image in a project's hidden folder shows, as its attachment does by @backnotprop in #2343
      • fix(whats new): retry abandoned and failed notes fetches; keep the link across restarts by @backnotprop in #2345
      • Inbox: full screen's composer (comment or reply without leaving full screen) by @backnotprop in #2339
      • fix(whats new): retry release images abandoned mid-fetch after 15 minutes by @backnotprop in #2346
      • Inbox: Copy prompt logos tilt apart on hover by @backnotprop in #2347
      • Inbox: drop the 'takes it as its next turn' line from New thread by @backnotprop in #2351
      • Inbox: Pin thread moves from the thread header into its ⋯ menu by @backnotprop in #2352
      • Inbox: picture choices keep the letter in their own label in full screen by @backnotprop in #2350
      • Inbox: action count as a box pill, question count with a speech-bubble icon by @backnotprop in #2348
      • Inbox: an open thread shows its name before the message count by @backnotprop in #2354
      • Inbox: show a project's folder name, adding the parent only when two listed projects share it by @backnotprop in #2349
      • Inbox: Pinned and Projects open and close like folders by @backnotprop in #2353
      • Inbox: link the files your sent reply commented on by @backnotprop in #2358
      • chore: take the AIContext type from core, not the AI package by @backnotprop in #2360
      • test: let the list-resize drag finish before the last sample by @backnotprop in #2362
      • fix(inbox): phone thread header fits one line with nothing cut by @backnotprop in #2357
      • fix(inbox): drop the folder path from a project's list header by @backnotprop in #2355
      • Inbox: a pinned thread shows its name by @backnotprop in #2359
      • Code review: Call flow as cards by @backnotprop in #2364
      • Call flow: update CallDiff to 0.6.0 by @backnotprop in #2365
      • fix(pi): keep the Inbox off inside Ask AI's RPC runs by @backnotprop in #2366
      • Inbox: read_thread names the projects inside a folder with no threads by @backnotprop in #2368
      • Inbox guidance: one thread per work stream by @backnotprop in #2367
      • Code review sidebar: aligned Halftone layout (E) by @backnotprop in #2370
      • Ask AI: agents it starts never load Plannotator's Inbox, agent tool or plan hooks by @backnotprop in #2369
      • Agent jobs: Review, Code Tour and Guided Review agents never load Plannotator's Inbox or plan hooks by @backnotprop in #2371
      • Inbox list rows: thread name as the title, agent icons beside the project by @backnotprop in #2374
      • Inbox: a Claude Code session files under the folder it started in by @backnotprop in #2344

      Community

      Full Changelog : v0.28.38...v0.28.39

    4. 🔗 The Pragmatic Engineer The Pulse: Time to rethink software security because of AI? rss

      Hi, this is Gergely with a bonus, free issue of the Pragmatic Engineer Newsletter. In every issue, I cover Big Tech and startups through the lens of senior engineers and engineering leaders. Today, we cover one out of four topics from last week 's issue of The Pulse . Full subscribers received the article below eight days ago. If you 've been forwarded this email, you can subscribe here .

      It's been an absolutely wild few days, with security breaches and major security vulnerabilities being exposed worldwide across tech. Many incidents took place on Tuesday and Wednesday of this week. We'll start with a brief summary, then look closer at three of them:

      1. Intermediate CA certificate compromised : eight private 384-bit keys issued by eMudhra - which is an intermediate Certificate Authority (CAs) - leaked, meaning that servers in server-to-server communication can face man-in-the-middle (MITM) attacks. Any internet communication not going through modern browsers (that already patched this) could be risky.
      2. PHP : Unpatched servers risk remote code execution (RCE) and opening up access for attackers. Around 70% of all websites run on PHP and unpatched systems are at risk. Two critical security patches have been released.
      3. Railway : customer secrets stored on the service were leaked and some have been decrypted. Secrets exposed can include access to production systems, enabling attackers to potentially access customer systems.
      4. GitLab : Unpatched GitLab servers are at risk of an attacker gaining full access. A critical security patch for RCE has been released.
      5. Node.js : Unpatched servers are vulnerable to remote execution attacks. A new release fixes 10 critical vulnerabilities (CVEs), including one that allows for RCE, and another fix revokes the compromised eMudhra intermediate certificate.
      6. Go : a new release is out, adding a mitigation for the compromised eMudhra intermediate certificate.
      7. TiDB : attackers gained near-total access to the complete control plane systems of the managed TiDB provider, PingCAP, for a whole month (!!). The attacker released 10TB of customer-sensitive data, including from Booking.com, Airbnb, Pinterest, Databricks, and more such as SQL queries that customers ran, billing, contacts, and source code for PingCAP's systems The breach lasted from 9 Sept until 7 Oct, but was only disclosed this week.__ PingCAP claims no customer data stored inside TiDB was accessed, but I find it hard to see how the company will avoid losing security-conscious customers. This incident shows that the absence of adequate access monitoring and alerting can be an open invitation for attacks lasting weeks.

      With that, let's get into the first three incidents in the list.

      eMudhra CA compromise

      Certificate authorities (CAs) are organizations that vouch for identity on the internet. When a browser, phone, or server pings a site like chase.com or revolut.com, intermediate CAs and digital signatures verify that you really are talking with the bank's server, and not a fake one set up by an attacker with the purpose of stealing users' credentials. This is where the HTTPS protocol comes into play, with root CAs, intermediate CAs and the TLS handshake.

      The whole system is built on a chain of trust and verification: we trust the root CAs and their certificates, and so we can trust the signatures of the intermediate CAs. The assumption is that both the root CA and intermediate CAs are trustworthy and verifiable.

      But eMudhra broke this trust in the most blatant way: its private keys turned out to be single-digit numbers. A private key is a 384-bit key, which means that it would be a number between 0 and 2^384, (a number with 116 digits!)

      Except, the key turned out to be the number "4." Yes, that's right: the number four. What on earth was eMudhra doing?! It's as if they chose random numbers between 0 and 384, not 0 and 2^384! It is quite literally comical: in 2007, an XKCD comic described exactly this choice:

      altProphecy foretold? An XKCD comic from 2007

      And the other keys were also not that much better: 56, 66, 115, 156, 230 and 237! It's as if eMudhra generated an 8-bit private key, not a 384-bit one.

      eMudhra explaining how these keys were generated (emphasis mine):

      "We have done some preliminary assessment, there appears to be a flaw in the KGC [Key Generation Ceremony] script that was used on that specific day to create these ECC issuers. As for these ECC keys [elliptic-curve cryptography key pairs], our review of the KGC, assessment of the code and view of HSM [Hardware Security Module] keys so far indicate that a) a set of original ECC keys were created onboard as expected b) an approved deviation to our usual KGC to test a wrap/unwrap was introduced as these keys were meant for export for this instance c) a flaw in the code resulted in the second pair of keys being created onboard which were weaker d) these second pair of weaker keys were used by mistake to create the CSR [Certificate Signing Request] (because the key labels were similar) and signed by our root e) the CSR from these weaker keys were also sent over to Sectigo for cross signing (we verified the files sent over to Sectigo)

      The RSA issuers went through a different path as per our assessment of the code and are therefore not impacted.

      Some additional context - these issuers were meant for export to our US and European data centers to solve data sovereignty issues for some of our customers (but never ended up operationally in production except for one).

      We are still assessing the code to see steps where this process went wrong."

      I have so many questions:

      • How does eMudhra test generated keys? There seems to have been no automated testing of the key in place at all, in order to discover that these numbers were not "random" from a flaw in the key generation ceremony
      • How did eMudhra not notice this on day one, when the Key Generation Ceremony went wrong? If this was an automated process, the script would've changed from one day to the next, which would raise questions. If the process was fully manual, it explains how the mistake would be missed. And if it was manual, then why? Also, where are the detailed audits for such an important process?
      • The certificates with the easy-to-guess private keys were generated on 30 April 2025, so why did eMudhra not spot the mistake for 18 months?

      Carelessness in the creation of intermediate certificates risks reputational damage to eMudhra 's business as a certificate authority. Google Chrome announced it is evaluating whether to continue with the company:

      "Due to the seriousness of this incident, the Chrome Root Program is closely investigating the ongoing inclusion of eMudhra's remaining CA certificates in the Chrome Root Store and will share further updates in public forums (e.g., the Common CA Database Public list) as our evaluation progresses."

      Given eMudhra's sole business is in issuing digital certificates, being dropped by Chrome as a CA could be crippling. eMudhra is a publicly traded company on the Indian stock market, and two days before the breach was revealed its market cap was close to $500M. After details of its incompetence in creating certificates emerged, the company lost 40% of its value in two days.

      **PHP exploit: AI model beats attackers to finding critical

      vulnerability**

      The PHP situation is interesting because the "good guys" in this case (the security researchers) found a critical vulnerability in the framework before attackers did. From OpenAI:

      "Over the past two months, we led a coalition of maintainers, researchers, and security providers to address critical vulnerabilities in PHP, an open- source programming language used to run websites and web applications. Calif [a respected security team] identified a critical flaw using GPT‑5.6 Sol as part of our Patch the Planet⁠(opens in a new window) initiative, with Wiz [a security company] also independently discovering and reporting both vulnerabilities. PHP's maintainers led the fixes and release, with our teams and partners like Wiz, Cloudflare, and others contributing research, technical support, and coordination to prepare protections ahead of disclosure."

      On the surface, this is great news! Critical vulnerabilities were found and can now be patched, thereby closing the door before attackers can exploit them. Right..?

      The problem of critical vulnerabilities for open source software is that systems which aren 't immediately patched can be exploited. When the PHP team released the fix for these two vulnerabilities, attackers got details about the vulnerabilities: the code itself shows where the attack can be inititiated! In the case of PHP, that means attackers can now easily execute remote code on any PHP server that is as yet unpatched.

      Around 70% of all websites run PHP servers, which is a massive attack surface. We can be confident that many sites won't update their PHP versions for days, weeks, months, or even years.

      This particular vulnerability was so severe that before the security patch, the National Security Agency (NSA) in the US issued guidance urging websites to immediately patch upon release, or take applications fully offline until patched.

      Exploits began hours before the fix was announced. It was known in advance that a major vulnerability fix was coming for PHP, and somehow, the vulnerability leaked from the group that disclosed and fixed it. Cloudflare was in the group that worked on this problem and created tooling to monitor and block exploit attempts. From Cloudflare CEO Matthew Prince:

      altAttackers jumped on the exploit before it was officially announced. Source:Matthew Prince

      Amazon detected exploit attempts days before the fix. From AWS:

      "Amazon Threat Intelligence identified a PHP2Shell exploitation attempt dating to Oct. 17, 2026, in MadPot telemetry, four days before public disclosure of CVE-2026-109618 and CVE-2026-109619. The exploit attempt originated from an IP address associated with a commercial anonymization network. While the vulnerability was under embargo, the targeting of a honeypot from an anonymized IP address suggests the activity was conducted by a threat actor, though it remains unclear how the actor acquired exploit information prior to disclosure."

      Attackers now have AI agents to automate and speed up attacks. Now that the vulnerability is known, attackers can simply spin up agents, instructing them to attempt to exploit servers that have not applied the patch. This probably explains why Cloudflare saw millions of exploit attempts just a few hours after the patch was released.

      Railway 's customer secrets leak

      Elsewhere on the same day, developer-first cloud provider Railway was hacked and the environment variables (secrets) of its customers were exposed. From the company:

      "Our investigation to date indicates that an unauthorized third party may have accessed encrypted environment variables and, for some of them, obtained the decrypted contents. Environment variables may contain secrets such as API keys or database and registry credentials."

      Immediately after detecting the breach, Railway took decisive action by notifying customers and the public, and pausing all deployments.

      Pausing deployments created a huge headache for customers, who could not rotate their keys without crashing their systems running on Railway. Also from Railway:

      "We strongly recommend that you immediately roll all environment variables, including any API keys, stored in Railway, as well as any private registry credentials, and review logs for those services for unusual activity.

      All deployments are paused while we investigate. Until builds are restored, you will not be able to roll out new versions. We apologize for this inconvenience. Follow this incident to be notified when builds resume."

      This is contradictory: rotating environment variables - say, a database access token - means that the application using the old variable stops working until a redeploy. However, Railway has paused deploys! So, customers of Railway had two choices:

      • Rotate keys (the responsible step) and deliberately crash their application or take it offline (irresponsible)
      • Don't rotate and hope their key was not leaked - (irresponsible) - and let their application continue to operate (responsible)

      Of course, it's clear why Railway is pausing deployments after the environment variables leaked, and the team must ensure that new variables added by customers do not leak.

      In the end, it took Railway close to 20 hours to resolve the problem and allow deployments again. During that time, they unfortunately gave security-conscious customers an impossible choice of bricking their service while rotating keys, or ignoring security best practices to keep services running.

      Can we expect future 'deluges' of security incidents?

      AI labs did warn of a looming "security tsunami" fueled by the technology in May 2026, as per CNBC:

      "Dario Amodei warned Tuesday [5 May 2026] that artificial intelligence has created a narrow window for the world's tech firms, governments and banks to fix tens of thousands of software vulnerabilities found by his company's latest model.

      That AI model, Mythos, was previewed last month along with the disclosure that it had unearthed decades-old vulnerabilities in crucial software.

      Since AI models from geopolitical adversary China are "maybe six to 12 months" behind the Anthropic product, there is "roughly that amount of time" to fix these issues, Amodei said.

      "The danger is just some enormous increase in the amount of vulnerabilities, in the amount of breaches, in the financial damage that's done from ransomware on schools, hospitals, not to mention banks," Amodei said.

      Anthropic has limited Mythos to a few partner companies because of concerns about what criminals or adversarial nations could do with it."

      Around that time, I talked with "AI-pilled" devs - some with access to the Mythos model - who told me the same: they expect the security landscape to become very bad in the coming months, with record numbers of systems being breached. One engineer said he's moving many of his secrets like 2FA backup phrases off cloud storage services and onto paper because he expects cloud storage services to also be breached.

      This week, it has seemed like the prediction in May has come to fruition, much of it done with AI's help. A few days ago, on 17 October, OpenCode was breached and its customer secrets - AI API keys - stolen. Cofounder, Dax Raad, shared that the company has been under constant attack, in his reply to Railway:

      altOpenCode under constant attack by bad actors. Source:Dax Raad

      Attacks much easier & defense much harder with AI

      I sense the balance of power between the good and bad actors in this space is shifting because of AI. Let's see what it took for an attacker to get access to a system before AI existed, via a critical vulnerability exposure (CVE) - disclosed or not:

      altDefense and attack before AI

      With AI, finding critical vulnerabilities is easier for everybody, including bad actors who can automate attacks as well, and do so easily. The change:

      altAI gives attackers of systems advantages over defenders

      It gets worse: before AI, it took quite some skill to be an effective attacker: you needed to be a good-enough coder, understand concepts like buffer overflows, and also learn techniques for executing remote code execution attacks. With AI, none of that applies. Venture capitalist, Deedy Das, described it as scary that nontechnical people now have the tools to easily exploit known CVEs like the PHP one:

      altSource:Deedy Das

      So, let me update the diagram to account for the drastic lowering of the bar to becoming an effective attacker:

      altAI makes it easier than ever to breach systems, for much more people than before

      And we see all of this playing out in practice, starting with publicly disclosed CVEs skyrocketing:

      altThe number of CVEs is skyrocketing. Source:CVE tracker by 0xosprey.com

      We may need to urgently rethink software security for all systems:

      • Automated patching : manual monitoring for patches on a daily/weekly basis will become as irresponsible as applying patches months or years after release. Of course, automatic patching has its own risks, such as if a vendor providing a patch is breached, or a patch causes an outage, etc.
      • Expect attackers to use day-zero CVEs. Attackers will increasingly have access to undisclosed vulnerabilities and will access systems externally, or even execute code remotely.
      • Ongoing automated security monitoring to be non-negotiable. To detect security breaches, you need a decent level of automated logging and monitoring. This needs to be in place sooner rather than later. The TiDB incident this week shows what happens when a company allows an attacker to freely access their system for a month.
      • Defenders will have to use more AI. Attackers are gaining advantage by using AI agents, so defenders will have to do the same. There are no best practices in this field, but there are likely to be lessons in how companies like OpenCode, Railway, and PingCAP are responding - if they share their approaches.
      • Securing services and software will become more expensive. Continuously running AI agents to monitor for and mitigate breaches costs money, as do security engineers who are "AI-native." This all increases the cost of security engineering. We previously covered security engineering basics and did a podcast on code security .

      ... and the security incidents continue

      Since publishing the original article on 22 October, there have been more:

      • The Brotli remote execution CVE: Brotli is a compression library used at Node.js, Bun, Envoy, and others. The flaw allows an attacker to take over a service. Details
      • Another PHP remote code execution CVE. Just two days after the high-impact PHP2Shell patches, PHP warned of another important CVE, for which a fix is coming. PHP versions will need to be updated fast again.
      • Linux CVEs posted publicly. Several unpatched Linux kernel vulnerabilities were accidentally posted on the public kernel mailing list. Details.
      • Python Pillow CVE : a vulnerability inside the Python Pillow image library lets an attacker issue OS commands. Details
      • … and others I've doubtless missed.

      At this rate, we might start getting "vulnerability fatigue" and become numb to critical security vulnerabilities unless they affect frameworks our applications use. To avoid that, it'll be necessary for the industry to improve at coming up with and implementing security practices which work in a security environment where AI speeds up the discovery, publication, and exploitation of vulnerabilities.


      Read the full issue of The Pulse this is from, or check out this week 's The Pulse. This week's issue covers:

      1. Anthropic kills its coding interview. A team at the leading frontier AI company gets zero signal from DSA interviews and so has removed it from the engineering recruitment process. The rest of the company, and other AI-native startups, could follow.
      2. Details on incident.io 's AI spend and ROI. The resiliency startup has slashed the amount it spends on AI; down from $4,500 per dev, per month, in August, to $1,600 now.
      3. Amazon formally incorporates AI usage into SDE and SDM expectations. AI has been placed at the heart of software engineering after the company found a correlation between AI usage and productivity. Also, software development engineers (SDEs) and managers (SDMs) must be close to customers.
      4. Microsoft issues new exit offers to engineers. The tech giant has offered 60,000 employees the opportunity to quit by the end of the year. But the exit package is not particularly tempting, and so the number of people who take it will surely be in the thousands, not tens of thousands.
    5. 🔗 tintinweb/pi-subagents v0.22.1 release

      No content.

    6. 🔗 r/Harrogate Nostalgic old photos of Harrogate North Yorkshire rss

      Nostalgic old photos of Harrogate North Yorkshire | submitted by /u/LowGuide2746
      [link] [comments]
      ---|---

    7. 🔗 HexRaysSA/plugin-repository commits sync repo: +1 plugin, +1 release rss
      sync repo: +1 plugin, +1 release
      
      ## New plugins
      - [freelumina](https://github.com/c8c78cf6c6/freelumina) (1.0.0)
      
    8. 🔗 OmniNull/OmniWM Canary 20261030-0415 (e08c8c5c) 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: e08c8c5c1d7c
      • Base tag: canary-20261027-0418-40448662076-1

      Changes since canary-20261027-0418-40448662076-1

      • e08c8c5 fix: load symlinked OmniShell library directories (#1025)
      • 3002858 fix: scan symlinked OmniShell widget directories (#1020)
      • b035ed4 feat(niri): add edge overscroll with a configurable visible strip (#1000)
      • e6e96a7 fix(shell): retire approvals for disabled components (#1023)
      • fa4ced5 fix(hidden-bar): find menu bar items hosted by MenuBarAgent (#1041)
      • 26179ba fix(shell): show the apple and app menu widgets left of the notch (#1045)
      • ec962e9 Merge pull request #1042 from rickythefox/fix/whatsapp-ghost-column
      • 30bf426 Cover cleanup while the AX destruction probe is suspended
      • 149a4a3 Use a named case struct in lifecycle retirement test
      • cbd5490 Retire ordered-out windows whose AX element is gone on space destroy
      • bee760f Merge pull request #1022 from hezhizhen/codex/fix-permission-prompt-height
      • c4cc667 Merge pull request #1038 from dappermint/ci/canary-skip-docs
      • 243267b feat(canary): skip the build when only docs changed since the last tag
      • ac4ea65 fix(canary): judge renames and non-ascii paths by their real names
      • ad8c962 ci(canary): leave docs-only commits out of the notes
      • f347bd1 Merge pull request #1037 from dappermint/ci/release-branches
      • 85216ed Merge branch 'main' into ci/release-branches
      • f5bef49 ci: match release branches with a slash in the name
      • 11f68df Merge pull request #1036 from dappermint/ci/revert-ghostty-pin
      • 41b38f8 ci: run the workflow on *-release branches
      • 02117cb build: revert the ghostty pin to the published v0.7.5 zip
      • 8bf4574 Merge pull request #1033 from rickythefox/fix/1031-palette-dismiss-fade
      • 1e3c98a Align command palette dismiss fade with reveal fade (#1031)
      • fa23641 Merge PR #1027: Keep window background blur on the outgoing workspace
      • 20e61d2 fix(swipe): capture only listed windows in the outgoing snapshot
      • 19cebf2 Merge PR #1021: Add a pre-commit hook and a direnv shell
      • 0122be1 Merge PR #1019: Check that pinned downloads are published
      • 7431058 fix(swipe): keep window background blur on the outgoing workspace
      • 9e6ebf0 Merge remote-tracking branch 'origin/build/git-hooks-direnv' into build/git-hooks-direnv
      • 750a787 Merge branch 'ci/check-pinned-downloads' into build/git-hooks-direnv
      • ad19868 fix(build): lint the staged swift snapshot in the pre-commit hook
      • 2cba301 fix(ci): skip commented-out pins in the download check
      • 343cdd3 Merge branch 'ci/check-pinned-downloads' into build/git-hooks-direnv
      • 4837927 fix(ci): report a malformed pinned url instead of crashing
      • c55a7a5 build: add a pre-commit hook and a direnv shell
      • 43dfa2a ci: check that pinned downloads are published
      • 052368d Merge pull request #997: expand the Launcher with apps, commands, and scripts
      • b0f72be Move four bundled OmniShell styles over the menu bar
      • d114c71 Merge pull request #1013: preserve native menu below full-width bars
      • aaf1b4c Keep the Welcome window open while its Settings links are used
      • 15b06c8 Add a Welcome window for first launch
      • ba1adbc fix(bar): preserve native menu below full-width bars
      • e7fc23e Update SwiftFormat to 0.64.4
      • cb9a159 Add foot as a Quake terminal provider
      • 244f528 Bound shell file observation to content directories
      • 2698f96 Merge pull request #1005: fix shell settings hot reload after directory symlink retargets
      • 2d56355 Merge pull request #1006: prevent settings from exhausting file descriptors
      • 95f1542 Merge pull request #977: don't identify a sole Hidden Bar item by its tooltip
      • f423dea Merge pull request #1010: check shared library option declarations
      • de93f47 Merge pull request #1003: run the Kitty control tests in Tooling
      • 5fd53ed Merge upstream main into the 0.8.0 work
      • 51d2b26 Document OmniShell consent and program trust
      • 7dc9f34 Ask before OmniShell widgets connect or programs run
      • fb183d4 test(shell): audit shared library option declarations
      • 321f5ea Watch unselected profiles while recovering shell configuration
      • af7718d Require trust for shell programs and control built-in network access
      • 0d4a71e Keep shell watches current after failed or unchanged reloads
      • 385bdd5 Bound shell directory observation file descriptors
      • 2874113 Merge branch 'main' into codex/launcher-apps-commands-scripts
      • 35e0790 Merge branch 'main' into fix/indrive-org-link
      • 748e5e7 Merge pull request #988 from dappermint/feat/spatial-camera-overview
      • 1ea70dc Require consent for OmniShell widget network access
      • dbc1025 fix(overview): cap the raw gesture scale so it stays finite
      • 4305dcb Merge branch 'main' into codex/launcher-apps-commands-scripts
      • b5364f4 Merge branch 'main' into fix/hidden-bar-tooltip-identity
      • 0cd51e2 Merge branch 'main' into feat/spatial-camera-overview
      • 3e05419 fix(launcher): fix the four issues from the #997 review
      • 8c7a3dd fix(launcher): harden shell fallback, CLI scan perf, config decode, UI crash
      • 4675b28 Fix shell settings reloads after directory symlink retargets
      • 50f66f6 ci: run Kitty control tests in tooling checks
      • fff8665 Update the embedded Ghostty to 1.3.2-main+9ee02ae6
      • a62c2bd fix(overview): floor gesture scale and correct rubber-band docs
      • bf2fe72 Merge branch 'main' into feat/spatial-camera-overview
      • 99a22d8 feat(overview): design camera-based spatial overview and add viewport model
      • 62e0477 Extend Launcher with saved entries and CLI tools
      • 02b2b04 fix(hidden-bar): keep tooltips for apps with several items
      • cd939bb fix(hidden-bar): stop using an item's tooltip as its identity
    9. 🔗 Filip Filmar filmil's Auto Reload: a tab reloader with two permissions rss

      filmil’s Auto Reload is a Chrome extension that reloads a tab every few seconds, minutes or hours, and can do nothing else. It asks for two permissions, shows no warning when you install it, and cannot read the pages it reloads. This post explains why I wrote one more reload extension, how it counts down on its icon, and how a release goes from a commit to the Chrome Web Store without anyone typing a password.

    10. 🔗 New Music Releases Queens of the Stone Age - Perfecth rss

      Queens of the Stone Age - a new release is available:

      • 2026-10-30: Perfecth (Album)

      Amazon: Canada | Deutschland | France | United Kingdom | United States

      Visit muspy for more information.

    11. 🔗 New Music Releases Northlane - Anemoia rss

      Northlane - a new release is available:

      • 2026-10-30: Anemoia (Album)

      Amazon: Canada | Deutschland | France | United Kingdom | United States

      Visit muspy for more information.

    12. 🔗 Baby Steps 'Trust but verify'; or, 'the correctness ratchet' rss

      The name of the game in agentic development is figuring out how to clearly tell agents what you want- and then how to be sure they follow through. Lately I've been tinkering with an interesting technique around this that I'd like to share.1 I call it "trust but verify"2.

      The basic idea is that sometimes you have things you want to "verify" but they can't really be mechanistically checked. In that case, you let your agent do its best. But you also have it create an evidence file that contains the inputs it drew on to make that decision along with its rationale. Then you gate your CI on checking that these evidence files exist and that the inputs are accurate. Those checks are deterministic and cheap. The rationale itself is natural language and can't be checked.

      Doing this "trust but verify" technique on its own is helpful. It creates a kind of hill-climbing towards correctness that is stronger than (e.g.) tests alone. It helps to check meta-reasoning like "is the set of tests sufficient to show this requirement is true". Documenting the input also means that if any input should change, the CI check will start to fail, and the agent will be forced to revalidate its reasoning.

      What I find most interesting though is that "trust but verify" can be used to create a kind of correctness ratchet over time. The idea is that, now that the inputs + rationale are documented, you can have other agents come back and double-check that reasoning, even when the inputs have not otherwise changed. As agents naturally improve, or just due to the randomness inherent in how agents work, they will naturally find things the original rationale overlooked, and you'll be able to address them.

      When you say "hill climbing towards correctness", what do you mean by

      "hill-climbing"?

      Agents are none too smart, but they can be awfully dogged and persistent. If you ask them to climb a hill, they are going to find a way to do it. The tricky bit of course is that they don't always climb that hill in the way you intended. Also, they may not exactly climb it so much as find a route to the top: they may be persistent, but they are also lazy f!@#kers4, and they love to take shortcuts.

      What if the hills are propositions about your program?

      The fact that agents are good at climbing hills has got a lot of people in the automated reasoning community5 very excited. After all, what better way could there be to make sure your program does what you expect than to formally prove that it is true? And we've seen that when you set a model loose with a Lean theorem, it can be quite adept at proving things6.

      But there are a few caveats…

      Myself, I'm quite excited about tools like Lean but also Verus, Aeneas, and Creusot. I think we're going to be using them a lot more. And yet, I also think that proving propositions is not the end of the story.

      Who writes those propositions?

      Let's start with the obvious problem. An agent may be good at proving a proposition, but who is actually writing it? Even when something can be formalized, doing that formalization is a fair bit of work. Consider this random example of a requirement from a project I am working on7:

      A Fleet using Functionality A must be attributed to every Functionality reachable through any number of recorded deprecation steps, while being counted only once when routes converge.

      This is part of a project that is analyzing fleets across Amazon and looking at how much DRAM they consume. Our goal is to make sure that every large fleet at Amazon has Rust versions of every library it would need to be rewritten into Rust. We want to be able to go to the maintainers of those libraries and say, "there are fleets accounting for X% of Amazon's total DRAM consumption that use your library; you should make a Rust version".

      The point is, while the concept of this DRAM accounting is not complex, formulating it in a precise, mathematical way is not at all trivial. You have to have some notion of transitive closure, talk about the graph of dependencies, etc. There is no way that the lazy, spoiled programmers of the future are going to write a formula like that by hand.

      Much more likely is that they are going to give high-level direction to the agent and ask it to connect the dots. After all, this is what agents are good for! And in this case, I would trust an agent to get it right. As I said, it's not really complex , just… tedious.

      Can they say what you want?

      And of course this leaves aside that there are many things that are just plain hard to formalize. Consider a requirement like, "a warning must be displayed on every relevant form in a prominent fashion". Checking this requirement requires a notion of what is "prominent", which is unlikely to be a mathematical property one can write down. And while I would not trust an agent's judgment over an actual graphic designer, it is also the kind of thing where the agent can likely do a "good enough" job to catch many failures.

      And what does it cost to do the proof?

      The other point is that while agents are good at authoring proofs, it still takes them tokens - and more importantly, time - to do it. And sometimes quite a bit. If developers have to wait a while for the agent to find a proof to a complex property, that better be worth it. If the property you are proving is key to your system, it probably is. But if the cost of a mistake is less than the cost of a proof, people won't bother, so it's worth thinking about leaner, easier ways to gain confidence.

      And what about when you are iterating?

      One final point is that applying too much rigor too early in the process can be a real problem. This one is tricky because rigor can surface problems earlier, too. But it's often helpful to start by defining your requirements and things at a higher level and gradually get more precise as you go, tolerating a bit of "looseness" early on when you know there are details you have to nail down, but it's not important to do so yet.8

      A key point for me is that just because you haven't formalized your requirement all the way to a mathematical proposition doesn't mean that you've got nothing at all. You can often phrase a high-level version of what you want, perhaps one that is overly simplified. In fact, it's pretty useful to do so, because when you find that your rule doesn't quite work, that helps you figure out how to refine it into the more precise rule you actually want.

      Evidence and "trust but verify"

      The key idea of the "trust but verify" technique is that leaning on agentic reasoning is good, fine actually. But when you do so, you should have the agent explain itself and also have it lay out what inputs and evidence it used to reach that conclusion. Basically, leave yourself a trail so that you (or another agent…) can come back and audit what decisions were reached and on what basis.

      Following this approach helps in two ways:

      1. In the short term, it forces the agent to at least acknowledge your requirement, which generally means they will do a better job at meeting it.
      2. In the long term, it lets you go back and double-check the agent's reasoning, leading to a kind of "correctness ratchet" in which you are generally improving the alignment of "what you have" with "what you asked for".

      One example: Habeas Codicem

      Probably the simplest example of this "trust but verify" technique is Habeas Codicem. This is a small project I made in part as an experiment. The idea is that you write requirements into your docs and then Habeas Codicem adds a test into your system that can only be passed if an agent has written an explanation of why each of those requirements is satisfied. Those explanations are recorded as evidence files that are committed into your repository along with the code.

      The interesting bit about Habeas Codicem is that the evidence files contain not only the agent's rationale and judgement, but also a list of the inputs it used to reach that conclusion. And these inputs have to have certain contents. For example, if you have a function that is labeled as part of the requirement's implementation, or a test that is tied to a requirement, then the agent must include that function or that test in its evidence.

      The final part of Habeas is some skills that instruct the agent to always check with you, the human, before editing requirements, and to confirm agreement on requirements before implementing.

      Another example: an internal data store

      Early in the post I mentioned an internal project I am working on at Amazon to analyze which missing dependencies might block fleets from migrating to Rust. This system involves a lot of agent-driven investigation. For example, perhaps there is a Rust version of a Java library, but it only handles some of the features (this is pretty common). Then we need to know whether the fleet's code cares about those features that aren't included.

      My early attempts at gathering this data were pretty crude. I basically just sat there telling Amazon Quick "try harder, make no mistakes". Not great. I didn't really trust the result.

      My newer attempts are much more thorough. I ask the agents to produce an evidence record of what data points they looked at and to include a written rationale for how those data points connect. I then test that the data points hold. For example, to determine if the method convertData in some library is called, the agent might register specific lines from .java files showing a call like value.convertData(). Or it might show the results from a grep that show no matches for convertData.

      The interesting bit is that while the rationale from the agent can't really be evaluated in an automated fashion, the evidence can be. So before we accept any agent-created conclusion, we run a deterministic checker that ensures the evidence is valid (those lines really do appear where the agent said they would) and then records a receipt that the check was done. So the agent cannot just hallucinate evidence.

      What we are asserting: the agent has done work

      Habeas Codicem does not prove your code obeys its requirements; nor does my inventory system prove that a given Java feature is used. But it does prove that the agent actually considered the question enough to write out some evidence + a justification. And assuming your agent is not actively malicious, that's actually quite a bit.

      One thing that we've seen is that agents often "lie" about what work they did. They'll claim to have carefully read through a document when an examination of their tool invocations shows that they've just looked at a few random bytes.

      Tightening and revalidating rationale

      One of the ideas I find most interesting in this space is the idea of revalidating rationale. Now that we have evidence files committed to git, we can absolutely have another adversarial agent that periodically pulls up those files and gives them another look. That agent can go looking for holes in the original logic and produce modified and improved proofs or counterexamples. I find this particularly compelling when you think about new and better models that might be more adept at finding holes.

      Applying this idea to propositions

      I think this technique suggests how we can begin to tackle the problem of converting "high-level requirements" into formal theorems. Instead of expecting humans to write and review logical formulae, we can ask an agent to do the conversion - and to record its thinking process (with verifiable evidence). Then we keep that evidence around and we periodically revisit it, looking for potential edge cases. We wind up with a kind of 'confidence score' - the more reviews that have approved a given "requirement->formula" translation, the more likely it is to be accurate.

      The risk of ping-ponging and what it means

      That said, I've not really put this into practice yet, and I anticipate it may be tricky to get it working right. People have told me to expect that agents may ping-pong a bit: for example, maybe one of them translates your plain English into logic, and then another says "that translation doesn't look right" and takes a new approach. But then yet another agent reverts that and goes back to the original. This seems very plausible- I suspect it can be resolved by adding enough history to recognize that it actually reflects ambiguity in your original statement, and to surface the problem up to you.


      1. I do not claim this technique is novel. I am quite sure people have been doing variants of it forever. But it's novel to me, and I don't think I've heard people talk about some of the potential long-term implications around "the correctness ratchet". ↩︎

      2. I know this phrase from Reagan, of course, but when I started reading into its background I found it had a more interesting history than I expected. Apparently it is a Russian proverb and was suggested to Reagan as a way to communicate with Gorbachev in familiar idioms. As with "less is more", it's always had that delightfully contradictory feeling ("if you have to verify, are you really trusting?") - and at least the way I interpret it, it's really more like "trust through verification". In other words, I know I can trust you because we've set up the means for me to verify your logic. ↩︎

      3. I had written, "I don't usually curse at computers", but my daughter (reading over my shoulder) told me, " That is not true, you curse at computers all the time". And she's right! But I realized that it feels different. When I am using some restaurant website that seems purposefully designed not to tell me their opening hours or show me a menu, I certainly say " oh f!@#k you!", but in that case, I am actually cursing at the person who designed that website. I am not cursing at the website itself ; it's just an inert vessel. In contrast, when I curse at a model, I am not cursing at the people who trained it. I am cursing at the dang model, because it just seems to be going out of its way to be annoying. Anthropomorphizing is a pain. ↩︎

      4. God, agents have gotten me so frustrated lately. I'm not usually prone to cursing when sober3 but more than once lately I've found myself typing, " I have no idea what the f!#! you are talking about". This seems to happen slightly more often with Claude than GPT. Claude really likes to develop a kind of cryptophasic shorthand where it drops random words that I used 3 weeks ago as if that will mean anything to me now. "You still have to handle the first-cut case!" ↩︎

      5. Automated reasoning is the same thing as formal methods , just more appealingly branded. As an aside, lately I've been hearing people talk about Neurosymbolic AI , which I believe is a shameless (and brilliant) way for your SAT solver to jump on the LLM hype train. I suppose it's also a reasonable way to push back against "AI scope creep". While I'm on the topic: it seems to me that John McCarthy's quip (" as soon as it works, no one calls it AI anymore") has been proven false. I would rather people stopped saying "AI" and just said "LLM", but nobody really cares what I want, do they? ↩︎

      6. Even if they aren't actually true. ↩︎

      7. I did not actually write this text, of course, an agent did. It's pretty convoluted. Sigh. ↩︎

      8. This feels reminiscent of Terry Tao's classic post outlining how an experienced mathematician leans on instinct informed by rigor rather than just one or just the other. ↩︎

  3. October 29, 2026
    1. 🔗 IDA Plugin Updates IDA Plugin Updates on 2026-10-29 rss

      IDA Plugin Updates on 2026-10-29

      New Releases:

      Activity:

      • dial
        • ffbb19a3: release: v0.2.8
        • d8e4f0c0: test: synchronize terminal input and discovery smoke fixtures
        • 70f5d3fb: release: v0.2.7
      • ida-hcli
        • df82b202: 0.27.3
        • 222ae2be: feat(api): allow download_file to bypass the download cache (#434)
        • 3f975433: ci(style): fail on auto-fixable ruff violations (#430)
      • oh-my-pi
        • eabd6354: fix(session): freeze the inject prompt on a delivered turn, not on me…
        • 2b9841ca: feat(slash-commands): make /inject additive and cache-safe after the …
        • eb1d80eb: docs(fork): document prompt viewer segmentation and its invariants
        • 703344f0: feat(tui): split prompt viewer blocks into structural segments
        • 915e04f7: docs(fork): record patch 44 and move the upgrade chronicle into docs/…
        • 1258e33f: fix(tui): align prompt viewer tool tokens with /context, show tool de…
        • 57e34ab7: fix(cli): expose System Prompt Viewer under -lightweight too
        • 42683b62: feat(tui): read-only System Prompt Viewer (/prompt, alt+s)
      • plugin-ida
        • 2617c487: fix: prevent startup crash with Python 3.12 (#33)
    2. 🔗 backnotprop/plannotator v0.28.38 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      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
      v0.28.36 | Qwen Code support, plans open in the Clean look, live HTML and diagrams in Inbox messages, a Feedback button, plannotator inbox status, stop and restart
      v0.28.35 | Updates check the download against checksums Plannotator fetches itself, a failed check changes nothing
      v0.28.34 | Start a Grok Build session from the Inbox, action items in your reply, a tidier Board, Settings → Capabilities, a failed feedback send is shown
      v0.28.33 | Pi updates no longer get stuck on 0.28.31
      v0.28.32 | A security update (built on Bun 1.4.4, eMudhra certificates), the Inbox Board, custom Inbox prompts, hover cards for issue and PR links, rich-text Copy
      v0.28.31 | An onboarding tour for the Inbox, pinned threads, picture choices in questions, palettes in Inbox Settings, tailnet reviews from the plugin tool
      v0.28.30 | An Artifacts view in the Inbox, comments on part of an image, diagrams in code review, Ask AI keeps its conversation in annotate
      v0.28.29 | Plan review opens on OpenCode 2, a DOMPurify security update, closing a review stops the agent everywhere
      v0.28.27 | Jump to open questions, files side by side or full screen, image zoom in the Inbox, empty To field, text size for plan review and annotate
      v0.28.26 | Action items and reply drafts in the Inbox, one decision button for plan review, Enter to save a comment, a custom code font
      v0.28.25 | Re-ask open questions, delivery ticks on the list, a count of new messages on the tab, right-click a thread, click Inbox to refresh

      What's New in v0.28.38

      Attach files to a reply in the Inbox, swipe through a question's picture choices, and easier-to-read list rows. In code review, Call Flow and Semantic Changes show the code when you hover. 17 PRs, 3 of them from 3 community contributors.

      Plannotator Inbox

      Attach files to a reply

      The reply box has a paperclip for files of any type. You can also drop files on the reply box, or anywhere on the thread to open the reply with them. A saved draft keeps only its words, not its files.

      Swipe through a question's picture choices

      In full screen, a question's picture choices are a set of their own, in order from A to the last choice. A caption names each choice, with a dot per choice. On a phone the picture follows your finger, and a swipe down closes it.

      Easier-to-read list rows

      The subject is on the second line, with the agents, the ⚠ badge and the open question count at its right end. In a wide list these sit in columns that line up down the list.

      Smaller changes

      • The What's new link now shows within about 15 minutes of a release's notes being written, instead of a day later. #2337
      • A sent reply no longer comes back as a draft. #2334
      • Heading links in a Markdown attachment scroll to the heading. By @utpalsinghdev. #2316, closing #2229
      • Search is in the list header when the sidebar is closed, next to New message. #2330
      • The skills line under your reply is one quiet line of skill names, with nothing to open. #2333
      • Text between two$skill names no longer shows as math, in the Inbox, plan review and annotate. #2331

      Plannotator

      See the code on hover in Call Flow and Semantic Changes

      In code review, hover or focus a step's file:line in Call Flow, or a row in Semantic Changes, and a window shows that code as it is in the review. Deleted code shows from the old file. The same window in plan review and annotate no longer runs off the right edge of the screen. By @dmmulroy.

      Smaller changes

      • Plan history and the feedback archive now agree on a long project name cut after a hyphen. Plans being revised during the upgrade restart at v1 once (long names cut after a hyphen). By @zerone0x. #2332, closing #2306

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. 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): swipe a question's picture choices as a set; the image follows the finger by @backnotprop in #2315
      • fix: scroll to headings in Inbox Markdown attachments by @utpalsinghdev in #2316
      • chore(ui): publish prep 0.54.0 by @backnotprop in #2318
      • feat(ui): HtmlViewer sandbox prop for hosts by @backnotprop in #2319
      • test(e2e): never reach a real Codex CLI from the Inbox decision-mode spec by @backnotprop in #2267
      • chore(ui): KaTeX 0.19 by @backnotprop in #2320
      • chore(ui): publish prep 0.55.0 by @backnotprop in #2329
      • Inbox: Search in the list header when the sidebar is closed by @backnotprop in #2330
      • fix(ui): text between two $skill references no longer renders as math by @backnotprop in #2331
      • fix(core): make sanitizeTag idempotent when the 30-char cut lands after a hyphen by @zerone0x in #2332
      • Inbox: a sent reply no longer comes back as a draft by @backnotprop in #2334
      • feat(review): source previews on hover in Call Flow and Semantic Changes by @dmmulroy in #2322
      • Inbox: list rows put the subject on line 2 with agents and counts at its right end by @backnotprop in #2321
      • Inbox: quieter skills line on your replies by @backnotprop in #2333
      • Inbox: attach files to a thread reply (paperclip and drop) by @backnotprop in #2335
      • spec: formal model of the update and What's new lifecycle (Quint + fast-check) by @backnotprop in #2338
      • Inbox: show What's new when the release notes land after the Inbox asked (0.28.38) by @backnotprop in #2337

      Community

      • @dmmulroy: code previews on hover in Call Flow and Semantic Changes in #2322
      • @zerone0x: one project name for plan history and the feedback archive in #2332
      • @silopolis: reported in #2306 that plan history and the feedback archive filed one project under two names
      • @utpalsinghdev: heading links in Inbox Markdown attachments in #2316
      • @zane668: reported in #2229 that heading links in Inbox Markdown attachments did not scroll

      Full Changelog : v0.28.37...v0.28.38

    3. 🔗 omerbenamram/pyevtx-rs 0.14.1 release

      Changed

      • Update the Rust parser to evtx 0.14.0. JSON output no longer repeats a key
        when an element holds two substitutions whose nested templates have elements
        with the same name: those names are numbered (Name, Name_1), as they are
        elsewhere (evtx #302).

      What's Changed

      Full Changelog : 0.14.0...0.14.1

    4. 🔗 exe.dev Introducing execonnect: Access Private HTTP Services from exe.dev rss

      execonnect is a way to let your exe.dev VMs connect to HTTP services, even if those services aren’t on the public internet. You run execonnect on the machine hosting the service (or on any machine that can access the service), and this establishes a link between your service and exe.dev. From that point on, you can configure integrations.

      For example, at exe.dev, we run a Victoria Metrics service inside of our network. I’m running execonnect inside the VM, and there’s a “victoria” integration in exe, and I can access our metrics. I configured it as a team integration, so it works for all of my co-workers as well.

      Diagram: inside the exe.dev production network, a monitoring VM runs
Victoria Metrics and exe connect. exe connect dials out to the exe.dev exe
connect switchboard. On my development VM, a Shelley session asked to “use the
victoria integration to build a distribution of our disk usage” runs curl,
sending GET /query to victoria.int.exe.xyz; the exe.dev integrations proxy
forwards it through the switchboard to exe connect, which sends GET /query to
Victoria Metrics. Caption: exe connect dials out to the switchboard, so
requests from my VM reach the monitoring server (which isn’t on the public
internet).

      How does it work? Execonnect is a Go program with a userspace wireguard. On the exe.dev side, our anycast proxy network works as the other end of that wireguard tunnel. Execonnect—the part which you may run in your own infrastructure—is open source, of course, so you can see what it’s doing.

    5. 🔗 HexRaysSA/plugin-repository commits sync repo: +1 release rss
      sync repo: +1 release
      
      ## New releases
      - [threatray](https://github.com/threatray/plugin-ida): 3.0.3
      
    6. 🔗 crosspoint-reader/crosspoint-reader v2.0.0rc release

      CrossPoint 2.0.0

      What a busy month. A lot of new features landed in CrossPoint, and we're eager to hear what you think.

      New devices

      This release adds support for four ESP32-S3-based devices: the Metalio E-Ink 4, the EEGO A4 (standard and Lite versions), and the BOOX Picco. If you're thinking of buying one, you'll find links at https://crosspointreader.com/devices. That page uses our affiliate links, so buying through it helps support CrossPoint.

      SD card plugins

      CrossPoint now supports plugins installed on the SD card. A plugin can add book catalogs and downloads to the reader, or tools to the device's web interface. To show the Plugins entry on Home, enable Plugins under Settings → Connectivity.

      Plugins are not apps that run arbitrary code on the reader. On-device plugins use the screens and operations the firmware already provides, such as sign-in, catalogs, downloads, and supported reading events. They can't replace the reading engine, install hardware drivers, or add unsupported document formats.

      Some plugins include JavaScript, but that code runs in a browser on your phone or computer, so the browser page has to stay open while it works. For example, a browser plugin can turn articles or RSS feeds into an EPUB, which you then read on the device.

      The plugin system will stay focused on reading and book services. It won't become a platform for on-device games, calculators, notepads, writing apps, web browsers, or PDF rendering. Those remain outside CrossPoint's scope, plugins included.

      Bluetooth page turners

      Bluetooth page turners now work on all devices. Go to Settings → Connectivity → Bluetooth Page Turner to scan for a remote, pair it, and map its buttons. Short and long presses can trigger different actions: page turns, chapter navigation, the reader menu, and clipping selection.

      Highlights and clippings

      You can now select text in EPUBs, highlight passages, and save excerpts as clippings. On button devices, use the reader menu. On touch devices, hold a word and drag the selection handles. Selected text also works for dictionary lookup, including multi-word phrases. If you turn on Sync Clippings, clippings can sync through a compatible CrossPoint Sync server.

      EPUB formatting and reading controls

      EPUB rendering now handles more of what books actually contain: drop caps, small caps, mixed text sizes, borders, and shaded blocks. Tables take column content, cell padding, and borders into account. Headings stay attached to the text that follows them, and paragraph indentation has its own setting. EPUBs can also show non-interlaced GIF images, covers included.

      Noto Serif is now optional

      To free up space for all of this, Noto Serif moved from a built-in font to an optional SD card font. If you use it, install NotoSerif through Manage Fonts before or after upgrading. Without it, a Noto Serif selection falls back to Noto Sans.
      Libron also available for direct download from the font manager.

      Everything else

      • OPDS, the catalog format used to browse and download books, now supports version 2.0 alongside existing catalogs.
      • The device web interface has a new look and more consistent dialogs.
      • Settings are grouped into a cleaner layout that's easier to extend.
      • Touch devices get swipe-to-delete in the file browser and a few other places.
      • Azerbaijani is now available as a UI language.

      We also added a device comparison page to the website, for anyone who wants a CrossPoint device but can't decide which one: https://crosspointreader.com/device-comparison.


      What's Changed

      New Contributors

      Full Changelog : 1.6.5...2.0.0rc

    7. 🔗 MetaBrainz Picard 3.0.3 released rss

      Picard 3.0.3 is a maintenance release for Picard 3.0 with fixes for reported issues and updated translations.
      This release fixes a crash when switching color themes, a crash when loading a release from an ISRC lookup, metadata issues in the Album Pane when multiple files match a track, and problems saving tags to WAV files with invalid chunk sizes, along with several plugin, cover art, and sorting fixes.
      It also brings a few small improvements, including Enter-key navigation in the scripting documentation search, better recording-match scoring to avoid false positives on gross track-length mismatches, and normalization of lowercase or unhyphenated ISRCs.

      The latest release is available for download on the Picard download page.

      The detailed changes for this maintenance release are below. For an overview of the new features since Picard 2.13 please see our detailed release announcement for Picard 3.0.

      Thanks a lot to everyone who gave feedback and reported issues.

      What’s new?

      Bugfixes

      • [PICARD-3477] - Setup Wizard: Checkbox description text not fully shown
      • [PICARD-3496] - "Grouping" tags cannot be deleted from MP3s
      • [PICARD-3498] - Disabling plugin purges cover art provider configuration from picard.ini
      • [PICARD-3499] - Reinstalling local in-place plugin and switching to git fails
      • [PICARD-3509] - Crash when switching themes
      • [PICARD-3510] - Newly added custom column renders with solid white background on tracks while built-in columns do not
      • [PICARD-3511] - Right-pane artwork replacement silently fails to embed in FLAC files
      • [PICARD-3513] - Blocking album task that is completed forever blocks UI operation
      • [PICARD-3514] - Cover Art Archive "Exclude" types list does not override the "Include" list
      • [PICARD-3515] - If many files for a given track are found and additional fields are enabled, metadata is wrong in the Album Pane
      • [PICARD-3516] - Article-insensitive column sort is non-deterministic (QCollatorSortKey lacks working equality)
      • [PICARD-3517] - Built-in player prevents file write access
      • [PICARD-3518] - Cover art saved as external files ignores CAA "front" flag when naming files
      • [PICARD-3519] - Picard unable to save metadata for WAVE files with data size not matching actual data
      • [PICARD-3521] - Picard crashes when loading a release from ISRC lookup for files already matched to a track
      • [PICARD-3527] - Track match indicator is inconsistent
      • [PICARD-3528] - Uses alias sort name even if artist credits matches artist name

      Improvements

      • [PICARD-3526] - format_isrc does not normalize lowercase or unhyphenated valid ISRCs
      • [PICARD-3507] - Scripting documentation function/tag search: Enter key to proceed to next match
      • [PICARD-3508] - Gross track-length mismatch does not prevent a false-positive recording match on Lookup

      Download

      Picard 3.0.3 is available for download from the download page of the Picard website. For Windows 10 and 11 users installing from the Microsoft Store the update to Picard 3.0.3 is now available and can be installed from the Microsoft Store app. Linux users can get the latest Snap package. The Linux Flatpak package is maintained separately and will be updated soon.

      Picard is free software and the source code is available on GitHub.

      Get in touch

      Please use the MetaBrainz community forums and the ticket system to give feedback, suggest new features or report bugs.

      Acknowledgements

      Code contributions by Laurent Monin, Philipp Wolfer and Shubham Prasad.
      Translations were updated by "ApeKattQuest, MonkeyPython" (Norwegian Bokmål), pXF (Hungarian) and x150 (German).

    8. 🔗 backnotprop/plannotator v0.28.37 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.36 | Qwen Code support, plans open in the Clean look, live HTML and diagrams in Inbox messages, a Feedback button, plannotator inbox status, stop and restart
      v0.28.35 | Updates check the download against checksums Plannotator fetches itself, a failed check changes nothing
      v0.28.34 | Start a Grok Build session from the Inbox, action items in your reply, a tidier Board, Settings → Capabilities, a failed feedback send is shown
      v0.28.33 | Pi updates no longer get stuck on 0.28.31
      v0.28.32 | A security update (built on Bun 1.4.4, eMudhra certificates), the Inbox Board, custom Inbox prompts, hover cards for issue and PR links, rich-text Copy
      v0.28.31 | An onboarding tour for the Inbox, pinned threads, picture choices in questions, palettes in Inbox Settings, tailnet reviews from the plugin tool
      v0.28.30 | An Artifacts view in the Inbox, comments on part of an image, diagrams in code review, Ask AI keeps its conversation in annotate
      v0.28.29 | Plan review opens on OpenCode 2, a DOMPurify security update, closing a review stops the agent everywhere
      v0.28.27 | Jump to open questions, files side by side or full screen, image zoom in the Inbox, empty To field, text size for plan review and annotate
      v0.28.26 | Action items and reply drafts in the Inbox, one decision button for plan review, Enter to save a comment, a custom code font
      v0.28.25 | Re-ask open questions, delivery ticks on the list, a count of new messages on the tab, right-click a thread, click Inbox to refresh
      v0.28.24 | A new look for the Inbox, Send now, tag agents, comment on an agent's message, much smaller reads for agents, links in HTML pages

      What's New in v0.28.37

      DeepSeek Harness joins Plannotator, plans can be saved to Notion, and AsciiDoc files open in annotate. Code review can now browse and search the whole repository, with Go to File and Go to Definition. In the Inbox: Tidy, handing a thread to another agent, and copying a message or a thread. 42 PRs, 18 of them from 16 community contributors, 9 of them first-timers.

      Plannotator Inbox

      Tidy

      Tidy , in the ⋯ menu of the list and the Board, sends a short prompt to each live agent that may owe you something: an old open question, a Board card that has not moved, or a reply of yours it has not answered. Each agent tidies its own threads, and one with nothing to change sends nothing. You choose which agents to ask.

      Ask, add or hand off a tagged agent

      After you tag an agent in the reply box, a line under it says what Send does: Ask it (as before), Add it to the thread, or Hand off the thread to it. A hand-off has Undo.

      Copy a message or a thread

      Each message has a ⋯ menu with Copy message, Copy link to message and Copy thread. The thread header and the list row menu copy the whole thread as Markdown, and a copied message ends with the names of its attached files.

      One set of keyboard shortcuts

      J and K now move between threads; Shift+J and Shift+K move between messages. F opens full screen, ? shows every key, and Settings → General → Keyboard turns single-key shortcuts off.

      /plannotator-inbox teaches your agent the Inbox

      The command still opens the Inbox and shows its address. It now also gives your agent a short briefing on how to send you messages and questions there. With the Claude Code plugin, Pi and OpenCode 2, the briefing stays hidden and starts no turn. On OpenCode 2 it goes into the system prompt, so that session's prompt cache misses once.

      Smaller changes

      • The Inbox no longer starts Grok Build sessions. Old Grok Build threads still read as before, and a reply there waits until the session is back. A leftover inboxRun.grok setting is ignored. #2308
      • The agent's mark is back on the left in two-line and phone rows. #2309
      • Images in a Markdown attachment now load when the file links them by a relative path. #2285, for #2228
      • Qwen Code is named in wake lines, not "another agent". #2304

      Plannotator

      Browse the whole repository in code review

      The file tree has a Changes | All files switch. All files lists every file at the revision under review and updates as files change on disk. Open any file in a tab, switch a changed file to Whole file , and comment on any line, even outside the diff.

      Renamed: the diff choice "All files" is now "Every file" ("Every file (HEAD)" in Git), and the Diff line of exported feedback uses the new name.

      Go to File and Go to Definition

      ⌘P (Ctrl+P) finds any file in the repository. F12 opens a definition in a tab, Shift+F12 lists references, and Back and Forward retrace your steps. The keys match VS Code and are listed in Settings → Shortcuts.

      Explain a review agent's finding

      A review agent's findings have an Explain button. Ask AI checks the finding against the code, explains it, and suggests a fix when it holds. By @leoreisdias.

      DeepSeek Harness support

      Plan review opens when a DeepSeek Harness (0.2.1-rc.2 or later) agent leaves plan mode. Add @plannotator/dsh from DSH's Plugins page, or run dsh plugin --profile <profile> add @plannotator/dsh. /plannotator-review, /plannotator-annotate and /plannotator-last work in DSH too. By @Nyarlathoteppppp.

      Save plans to Notion

      Notion joins Obsidian, Bear and Octarine as a place to save plans. Each save creates a page under a parent page you pick in Settings → Notion. Plannotator reads your token from NOTION_TOKEN and never stores it. By @franktronics.

      AsciiDoc files

      plannotator annotate opens .adoc and .asciidoc files, and the folder browser and linked documents show them too. By @fabriziosestito.

      Jujutsu review defaults

      Settings → Git is now Settings → Review, with separate defaults for Git and Jujutsu. A Jujutsu review can open on Current change, Line of work, Last change, Evolution diff or All files. By @graemefolk.

      Link to a heading from a comment

      Write # and a heading's exact text in a comment, like #3.1 Scope, and it becomes a link that scrolls to that heading. A new opt-in plannotator-markup skill shows agents how to leave comments on a document you are annotating. By @centraldogma99.

      Pick the document's font

      Settings → Display → Document font sets the font of plan review and annotate documents: a preset or any font on your computer. Code keeps its monospace font. By @ilja.

      Faster page loads on a slow link

      Plannotator now sends a small page first and loads the rest (syntax highlighting, diagrams, math, fonts) when it is needed. A remote session on a phone opens in seconds instead of minutes. By @giladbarnea.

      Smaller changes

      • Unsent code review comments survive in local Git reviews after edits, commits, refreshes and restarts. A comment whose lines changed shows as Outdated. By @oorestisime. #1645, closing #1590
      • The top of the code review sidebar reads as one line, like All changes since main, and each word opens its menu. The +/− counts are easier to read in every theme. #1998
      • Behind a reverse proxy, PLANNOTATOR_PUBLIC_URL sets the full address a remote session gives out, for Cloudflare Tunnel, nginx and the like. By @Whamp. #1266
      • Keep Plannotator's cookies away from other local apps with PLANNOTATOR_URL_HOST=plannotator.localhost (or "urlHost" in config.json). Nothing changes unless you set it. By @utpalsinghdev. #2188, closing #2184
      • --tailscale says plainly when Tailscale Serve is off for your tailnet, with Tailscale's link to turn it on. #2303
      • OpenCode plugin sessions show inplannotator sessions. By @TheRealAlexV. #1567
      • The OpenCode 2 update command no longer fails with "Plugin is not configured". By @utpalsinghdev. #2277
      • Annotate and review feedback starts a turn on an idle oh-my-pi instead of waiting. By @LoneExile. #1423
      • Long file and folder names show in full on hover in the annotate file browser. By @MarwanBz. #2236, closing #2195
      • The comment box no longer flickers while you type with an IME (Korean, Japanese, Chinese). By @wnduqrla. #2239
      • VS Code extension 0.17.0 reads a Guided Review in one Guide tab, with hover, Go to Definition and Ask on selected lines. In its panel, a key the review uses no longer also runs VS Code's command. #2134, #2130, #1964

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. 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: Ask, Add or Hand off from the reply box's tag line (A2) by @backnotprop in #2297
      • fix: load local images in Inbox Markdown attachments by @utpalsinghdev in #2285
      • fix(opencode): wait for plugins before the OpenCode 2 update command by @utpalsinghdev in #2277
      • test(perf): add reproducible plan load benchmark by @corrius in #1198
      • Add font and size controls to Annotate by @ilja in #1657
      • fix(pi-extension): start a turn for annotate feedback on idle oh-my-pi by @LoneExile in #1423
      • feat: support reverse-proxy public URLs by @Whamp in #1266
      • feat(opencode-plugin): register embedded sessions for discovery by @TheRealAlexV in #1567
      • Inbox: one keyboard system (phase 2) by @backnotprop in #2257
      • test(pi): stop network test leaking PLANNOTATOR_BROWSER by @backnotprop in #2302
      • fix(review): recover local Git drafts after diff changes by @oorestisime in #1645
      • fix(inbox): name Qwen Code in wake lines by @backnotprop in #2304
      • CI: fix a mislabeled pin, setup-node v7.1.0, no Renovate Ubuntu runner bumps by @backnotprop in #2300
      • fix(ui): show full file-browser names on hover by @MarwanBz in #2236
      • test: fix the top CI flakes (dictation paste, Mark read hang, Windows workspace timeout) by @backnotprop in #2301
      • feat: add Notion notes integration by @franktronics in #1032
      • test(e2e): stop the ref-cards-review code review flake by @backnotprop in #2307
      • VS Code Guided Reviews: our guide reader in one tab by @backnotprop in #2134
      • VS Code panel: forward only keys the review did not take (explorer step 0) by @backnotprop in #1964
      • feat: add DeepSeek Harness (DSH) support by @Nyarlathoteppppp in #2158
      • feat: add adoc support by @fabriziosestito in #1009
      • fix(tailscale): say plainly when Tailscale Serve is off, with Tailscale's link by @backnotprop in #2303
      • Inbox rows: agent mark back on the left of line 2 by @backnotprop in #2309
      • fix: support isolated localhost preference cookies by @utpalsinghdev in #2188
      • Code review: Changes | All files in the tree (explorer step 1) by @backnotprop in #1966
      • CI: parallel Test lanes, sharded Inbox e2e, no duplicate tests in the Release dry run by @backnotprop in #2235
      • chore(vscode): release 0.17.0 (Guided Reviews, Ask the agent) by @backnotprop in #2130
      • ci: stop the guide viewer manifest from conflicting across PRs by @backnotprop in #2310
      • Inbox: Tidy, from the list's and the Board's ⋯ menu by @backnotprop in #2296
      • Code review: any file in a tab, Changes | Whole file, comments on any line (explorer step 2) by @backnotprop in #1969
      • feat(review): add Jujutsu review defaults by @graemefolk in #1500
      • CI: fast tier on every push, heavy tier behind the ci:full label; Deploy on workflow_run by @backnotprop in #2313
      • feat(inbox): copy a message, copy a thread by @backnotprop in #2312
      • feat(review): explain agent-generated findings with Ask AI by @leoreisdias in #1181
      • feat: link #Heading section references in annotation text, and a skill that uses them by @centraldogma99 in #1419
      • fix(ui): stop the comment composer flickering while typing with an IME by @wnduqrla in #2239
      • Code review: Go to File, Go to Definition / References into tabs, Back / Forward, next change (explorer step 3) by @backnotprop in #1976
      • Inbox: remove the Grok Build runner until Launch agents settles its approach by @backnotprop in #2308
      • /plannotator-inbox: brief the agent on using the Inbox by @backnotprop in #2311
      • feat(inbox): name attached files at the end of a copied message by @backnotprop in #2314
      • Code review: the sidebar's top reads as one sentence (approved review-sidebar-header) by @backnotprop in #1998
      • perf(app): serve the lazy chunks from the single-file bundles instead of inlining them (12x improvement) by @giladbarnea in #1618

      New Contributors

      Community

      Full Changelog : v0.28.36...v0.28.37

    9. 🔗 Console.dev newsletter Sponsor: WarpBuild rss

      WarpBuild - AI agents push more commits. WarpBuild runs GitHub Actions twice as fast at half the cost.

      Visit WarpBuild

    10. 🔗 Console.dev newsletter Atuin Threads rss

      Searchable agent session history.

      What we like: Sync search history for your terminal agents alongside your regular terminal history. Resume sessions across machines (local, cloud, etc). End to end encrypted. Optionally self-host your own sync server. MCP server so agents can search old sessions.

      What we dislike: CLI-only.

    11. 🔗 Console.dev newsletter Namespace Devbox rss

      Cloud dev environments.

      What we like: Create cloud dev environments. Supports macOS, Windows, and Linux. Connect via SSH and through coding agents. Run persistent services and expose ports. Create custom base images and share settings across teams. Workspaces can be shared. SDK & MCP server so AI agents can manage their own environments.

      What we dislike: Remote desktop only available on macOS devboxes.

    12. 🔗 Console.dev newsletter Sponsor: Coresignal rss

      Agentic B2B search for builders

      Visit Coresignal

    13. 🔗 HexRaysSA/plugin-repository commits sync repo: +1 plugin, +3 releases rss
      sync repo: +1 plugin, +3 releases
      
      ## New plugins
      - [yarmaker](https://github.com/cod3nym/yarmaker) (0.1.2, 0.1.1, 0.1.0)
      
    14. 🔗 HexRaysSA/plugin-repository commits Update known-repositories.txt rss
      Update known-repositories.txt
      
    15. 🔗 matklad Avoid Public Functions Calling Other Public Functions rss

      Avoid Public Functions Calling Other Public Functions

      Oct 29, 2026

      A small-scale rule of thumb. This article will land much better with a concrete example, but I am drawing a blank here, so you gotta just blindly trust my say so!

      When implementing a software module, it’s often a case that you are writing a public function foo, and at least part of what foo does is already handled by another public function bar. The DRY instinct encourages you to call bar() from within foo. This usually creates problems down the line. Instead, create a new private function and refactor both foo and bar to call that shared helper:

      // BAD
      pub fn foo() void {
          return bar(.{ .frobnicate = true });
      }
      
      pub fn bar(options: struct {
          frobnicate: bool = false,
      }) void {
          // ...
      }
      
      
      // GOOD
      pub fn foo() void {
          return helper(.frobnicate);
      }
      
      pub fn bar() void {
          return helper(.transmogrify);
      }
      
      fn helper(mode: enum { frobnicate, transmogrify }) void {
          // ...
      }
      

      Rationale: the goal of a public API is to provide an interface that works best at the call site. If parts of public API are re-used to implement the rest of the API, then there’s a tension between making the interface convenient for the outside user and making it convenient to use from within abstraction itself. Namely, functions tend to grow optional parameters that should never be set by the user. Crucially, the parameter growth and interface degradation can happen after the original code sharing.

      By proactively making the shared implementation private, the tension is defused. You still might need to tinker with helper signature until it does everything it needs to do, but, because the helper is private, this is a cheap, local change.

      A notable exception to this rule of thumb are “shortcut” APIs, where a public function is defined as a commonly used chain of calls to other public functions. There, the rule is the opposite — no private calls are allowed, to make sure that it is a genuine shortcut, and not a midlayer mistake.

      P.S. While researching if anyone wrote a better blog post already, I stumbled upon a fun stack overflow question, asking, paraphrasing:

      I’ve heard that it is bad when a public function calls another public function. Is this really so?

      The most upvoted answer explains that it is indeed bad, because this makes mocking to test a single method in isolation more complicated. Which is, imo, a natural, but horrible consequence of misguided approach to testing. You shouldn’t be mocking your methods, you should mock your IO. And, similarly, you shouldn’t test methods, but rather software functionality (unless you are building a public library with a stable API, which is a fun and important, but very narrow fraction of software development).

      The accepted answer says that this recommendation makes no sense if it is not backed by an industry wide or an organizational standard. Which somehow manages to make even less sense — you shouldn’t follow the guideline rules because they are written in sanctified ink! Rather, you should apply each particular rule because of the underlying reasons that motivate the rule. Guidelines and best practices articles can concentrate lots of good reasoning in a single place, but they don’t absolve you from thinking!

    16. 🔗 Kevin Lynagh LLM programming and theory building rss

      LLM programming and theory building

      Last newsletter I was unhappy with my Tasktron workflow harness: The explicit state machine and reified effect design worked , but it obscured the core workflow, the harness's raison d'être.

      I embarked on a rewrite, hoping to find a more concise and self-evident design based on durable effects (memoized steps) instead -- something that would let the code express the intended behavior directly ("Do X, then do Y, then Z") while being robust to crashes and transparently replayable.

      However, multiple weeks of attempts with Astra 6, Opus 5.5, and the newly released Sol 6.1 brought me no closer to the improved design I felt certain could exist.

      Despite my best efforts and instruction, I couldn't get the models to emit tight, concise code; instead, they kept:

      • introducing new names/concepts that overlap substantially with existing ones
      • reading/writing mutable state all over the place rather than consolidating it behind a few abstractions or at specific points in overall control flow
      • adding new, overly-specific tests for every single change, rather than adding assertions or refactoring existing tests

      This got me thinking about the two very different things I want from programming.

      The first thing is, well, just a program -- something I run which does a straightforward task for me. Vibe-coding with LLMs has been great for these; I'm sure the models get up to all the nonsense I just mentioned, but it doesn't matter to me -- I'm not reading the code, I just want to dictate to my computer instead of typing, export from Photos.app, flash microcontrollers over the network, or a gazillion other things I haven't bothered to publish because it's hyper-specific software like mapping MIDI dials to my speaker volume and monitor brightness.

      I imagine this is what most people want from LLMs (and computers more broadly): Just solve some problem without making me care about the details.

      However, the second thing I want from programming is, just sometimes, to care about the details. I want a precise language and semantics to model something; to build up a theory.

      Sure, that theory should be useful for solving the immediate problem -- but after that it's also useful for thinking new thoughts.

      For example, after I gave up on coding agents and started writing/refactoring Tasktron myself, I realized that instead of thinking in terms of "Tasks" with "Subtasks" that each yield a commit, I could instead think of the system as managing units of "Work", each having a set of instructions, possible dependencies on other Work, and a target branch that it should be committed to.

      Formalizing this new concept of Work enables both simpler core machinery (no need for it to distinguish tasks/subtasks) and an entirely new workflow -- in addition to the upfront-planning workflow where a Task is defined and then decomposed into subtasks, the harness could also support one-off bits of work. E.g., after reviewing a complex GUI, I could dispatch a few one-offs like "Adjust the background color here", "Move the popup over here", "Put this bit in a sidebar" and have the harness execute all of those in parallel on different worktrees and serialize the three resulting commits on a branch.

      This concept and the additional functionality it unlocked isn't something I discovered in my week of prompting agents; it only came once I started digging in more myself.

      That theories are useful, but can be built only with deliberate mental effort isn't exactly a new take; Peter Naur discussed Programming As Theory Building 40 years ago:

      [P]rogramming properly should be regarded as an activity by which the programmers form or achieve a certain kind of insight, a theory, of the matters at hand. This suggestion is in contrast to what appears to be a more common notion, that programming should be regarded as a production of a program and certain other texts.

      This isn't specific to programming either, of course. I don't know any music theory, but I can tell this guy Remaking Kids by MGMT to Learn Why It's So Good understands that banger of a song way more than I do and can explore musical ideas far beyond anything my plain English prompting could elicit from Suno.

      Why is it hard to build theories with coding agents?

      Since theories reside in our minds, it follows that we must be mentally engaged to build them.

      But in my usage of coding agents so far, I've struggled to stay deeply engaged in the details. Prompting apps into existance is fun and exciting, sure, but my sense for how it all fits together is much duller.

      So far, I've used coding agents in two broad approaches.

      First, I've tried the "obvious" workflow: Ask the agent to generate code, read it myself, then ask for changes.

      I find this isn't mentally engaging or invigorating, for two reasons:

      1. Reading piles of agent-generated code is exhausting; there are nonsensical names, references to past instructions / removed code, poor information-hiding, etc. It's hard to decipher "what's going on here?". Furthermore, the latency when asking the agent to explain or revise can be on the order of 1-10 minutes per turn, which makes it hard to stay focused.

      2. Worse, the code sometimes works ; you asked for a button that does X, then see for yourself that the new button does, in fact, do X. At this point, it's extremely tempting to start implementing the next feature and skip the mentally arduous theory building. (See: Once the Cheat Code Is There)

      Second, I've tried "plan" workflows, both:

      1. the ones in the Codex and Claude Code harnesses, where an agent asks you a few multiple choice questions, then generates a markdown plan of work to be done

      2. my own Tasktron workflow, which supports a longer interactive planning conversation before generating a markdown plan

      I found these to be a mixed bag: The markdown plan tends to be shorter than the code that's later generated from it, but much harder to parse and understand. When it comes to reinforcement-learned slop, I find it much easier to wade through unnecessary try/catch blocks compared to LLM word salad prose full of "it's not this, it's that" and "load-bearing gates".

      While planning workflows are helpful for keeping agents on track over longer sessions, after the agent(s) have implemented the plan, you're arguably in a worse position compared to before: Now you have an even larger pile of code to read and a markdown document too!

      (Aside: Should you keep that around? Should you edit it to keep up with later changes in the codebase? Have the LLM edit it? I find the agents get distracted by these files, either maintaining them as "documentation" or getting tunnel-vision on parts of the code where the implementation doesn't, in their fresh-context opinion, fully satisfy the original requirements.)

      In any event, when it comes to theory-building, I haven't found planning workflows to be much better than simple prompting.

      In both cases, the walls of text/code wear me down into a passive bystander who nudges with low-information prompts and accepts the agent's recommendations ("propose a few options for us to discuss" quickly turns into "okay sounds good").

      So, if theory-building requires that we be mentally engaged but our mortal minds cannot withstand the unthrottled output of LLMs, where does that leave us?

      Well, we could throttle the output and increase the signal-to-noise ratio.

      Some folks are trying to shift to a "higher level of abstraction" with formal models in TLA+, Lean, Alloy, etc. I've only dabbled with these, so I doubt I could use them effectively myself, much less supervise LLMs generating them. (Not to mention the famously hard problem of getting the implementation to actually match the formal model.)

      Instead, I'm curious about a more prosaic approach: iteratively sketching using regular programming languages. E.g., writing code "top-down", starting from main and introducing types and function signatures / interfaces one level down the call tree at a time.

      This is how I designed programs before LLMs, and I'm a bit embarrassed to admit that it's taken about a year of using coding agents for it to occur to me to try this proven design approach with LLMs.

      Pre-LLM, I'd usually start with a few different "entry points" like example invocations in the README, integration test scenarios, etc., to help me figure out the appropriate concepts from the "outside-in". This process of sketching out from different perspectives helps me get a handle on the problem domain and the trade-offs between alternative designs.

      So how exactly can I interactively collaborate with LLMs in this way?

      Can they be simply prompted into this style of working? ("We're sketching out architecture, only write types and function signatures, no implementations".)

      Or is their desire to write code too strong, such that they'll need to be constrained within a custom harness? (I.e., take away bash in favor of add_function_signature(name, args, docstring); or perhaps just a post-tool- call helper that strips implementation code and adds a stern warning to context.)

      For me to engage with the medium itself -- the code -- the work needs to happen in my editor , where I have the muscle memory of my navigation and editing commands. I want to LSP-rename some function in 3 seconds myself, not type out instructions in some anemic &lt;textarea&gt; or awkward TUI and then wait 15 seconds for a GPU cluster in California to do it for me. Thinking hard about the names is the point, the workflow should make it easy to do!

      Given a tasteful, human-directed sketch of a design code, how well do coding agents fill in the remaining details? Do they largely respect the module boundaries and interfaces, acting essentially as super-charged "typed- hole fillers"? Or will they immediately refactor and rename things?

      Should one agent do all the work? I find LLMs can't really "forget what they know" and write for the reader's perspective -- they write functions that depend on the implementation details of their callers and comments that make oblique references to distant parts of the codebase or prompt.

      So perhaps invoking an agent for every empty function would yield better code -- by construction they wouldn't be able to introduce such layering violations, as the only context they'd have is the target signature and list of other pre-established functions in that namespace.

      If implementation uncovers deficiencies in the sketched plan/architecture, should the agent escalate back to you and request an architectural redesign? Or (depending on the cost of tokens, perhaps) should it just try to push forward itself and "ask forgiveness" later?

      What about for brownfield work? Can agents effectively "sketch" after having read a fully implemented codebase, or would they perform better if their context is limited to the "table of contents" of existing namespaces, function signatures, etc.?

      Anyway, I'm sure people are exploring these questions. However, I've had a heck of a time finding their papers / blog posts / screencasts / GitHub repos amongst the tidal waves of hype around new model releases and vibe-coded harnesses with the exact same chat-based interaction mechanics.

      Do you know of any collaborative human/LLM interaction work? Have you tried these sorts of experiments? Let me know!

      Misc. stuff

    17. 🔗 Armin Ronacher Custom Voices With Qwen3-TTS rss

      With my kids I'm currently building a little dungeron crawler and we're trying to learn a bit about game development along the way. However given that we live in the modern times of increasing capabilities we wanted to get a narrator and voice over.

      But we also wanted it to not sound like everyone's standard AI voices so I looked into what options there are on the table. After some investigation I narrowed down to using Qwen3-TTS which uses voice embeddings for custom voices.

      With a bit of creativity you can also do more with those custom voices than appears initially. In case this is of interest to you, this post just covers what we learned and with some examples. You can probably point your agent to it and it can do something with it.

      What Qwen Offers

      Qwen3 is not the only TTS model in town, and it wans't even my first choice. We initially used Kokoro. However Qwen3 supports voice cloning and we wanted to have it feel a bit more unique.

      In practice it's a bit tricker though. Qwen3 ships three kinds of models:

      • 1.7B-Base (and 0.6B): clones a voice from a few seconds of reference audio
      • 1.7B-CustomVoice: comes with nine built-in speakers and instructions
      • 1.7B-VoiceDesign: invents a voice from a text description

      The base model clones either in context or from the speaker embedding alone but there is no documented way to clone a voice and direct it with instructions. That means unlike the custom voice and voice design models you cannot say "speak sad" or "whisper" with a cloned base model.

      At present the official options for a custom voice are fine-tuning Base on a single speaker or to make a clip with VoiceDesign and clone it with Base. That is not all that bad, but it means instructions are gone.

      Playing With It

      For this blog post I took 28 seconds of me from my talk at PyAI Conf, cut between two pauses so that it starts and ends on a full sentence, and transcribed it with Whisper. The transcript is really only needed for baking but to compare against an already existing voice it's useful to have it say the same thing as the original recording.

      Note that a conference talk recording is not ideal but it works anyways. Which is also a good reminder that you really don't need a particularly clean recording (or a very long one) to get a halfway convincing version of a person. Particularly when then presented to you on a low quality phone call, it won't be very hard to trick your grandmother.

      The first thing you can do is to blend that recording with another voice. For instance you can use VoiceDesign to make up a voice from a description. For this blog post the designed voice was created like this, with Qwen's own Python package qwen-tts (pip install qwen-tts, I used 0.1.1), which the rest of the code in this post uses too:

      import torch
      from qwen_tts import Qwen3TTSModel
      
      kw = dict(device_map="mps", dtype=torch.bfloat16, attn_implementation="sdpa")
      design = Qwen3TTSModel.from_pretrained("Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign", **kw)
      wavs, sr = design.generate_voice_design(
          text=open("voices/transcript.txt").read(), language="English",
          instruct="A man in his forties with a warm, natural, medium-low voice, speaking "
                   "clearly and calmly at an easy conversational pace, like someone reading "
                   "aloud to a friend.",
      )
      

      You can see how the two different voices behave, particularly when blended together:

      Interactive demo: see the post on the website.

      Voice Embeddings

      What Base takes from a recording when cloning from the embedding alone is a speaker embedding which is basically 2048 numbers out of a speaker encoder that was trained. The same voice gets similar numbers and different voices get different ones. Which btw, is also a convenient way to do speaker detection from recordings if you want to! It's not perfect, but it's quite helpful for a single audio track recording to tell two speakers apart if you do some basic slicing and dicing (more on that below).

      Because it is just a vector, you can do arithmetic on it. For instance a weighted average of two embeddings is a spaker that is somewhere between two voices:

      base = Qwen3TTSModel.from_pretrained("Qwen/Qwen3-TTS-12Hz-1.7B-Base", **kw)
      
      def fingerprint(path):
          prompt = base.create_voice_clone_prompt(ref_audio=path, x_vector_only_mode=True)
          return prompt[0].ref_spk_embedding
      
      def blend(a, b, t):
          a, b = a.float(), b.float()
          mixed = (1 - t) * a + t * b
          return (mixed / mixed.norm() * ((1 - t) * a.norm() + t * b.norm())).to(torch.bfloat16)
      
      armin, designed = fingerprint("voices/armin.flac"), fingerprint("voices/designed.flac")
      

      Here is the same sentence in eleven blends:

      Interactive demo: see the post on the website.

      Note that it stops sounding like me quite quickly, but it retains some of my features. And it for sure ends up with creating a unique voice regardless. I found some better successes when ensuing that the two voices have similar spectograms (eg: similar "recording setups"). In this recording you can hear that one voice picked up by the lapel mic was a bit hollow compared to the designed voice.

      If you like a a voice that comes out, you can bake it back into a new recording that you can then use as reference:

      import soundfile as sf
      
      mixed = blend(armin, designed, 0.5)
      audio, rate = say(open("voices/transcript.txt").read(), mixed)  # say() is shown further down
      sf.write("voices/final.flac", audio, rate)
      final = fingerprint("voices/final.flac")
      

      The baked voice does not come back exactly as the blend but it makes handling it easier if you want to. It's just one voice reference file.

      So on the question of using those embeddings for speaker recognition: how good does that work? I took an episode of State of Agentic Coding, the podcast Ben and I record, cut it into 2-second windows one second apart and compared each with an embedding of me form the conference.

      Somewhat surprising, but maybe not too surprising using my conference recording clip as the reference this does not work at all with Qwen3. If instead I take the 20 seconds where I introduce myself at the start of the episode as the reference, it gets 98% of the rest right.

      On the other hand using a model that was trained for speaker verification instead does manage to pick me up from the conference recording clip. For instance ECAPA, finds me from the conference clip in 97% of the windows.

      Here are 20 minutes of that podcast, classified by speaker with the different approaches:

      Interactive demo: see the post on the website.

      Instructed Cloned Voices

      But the embeddings a very useful for the voice cloning! But how to give them instructions? Base and CustomVoice manipulate the speaker the same way: one vector inserted into the talker's input sequence. In CustomVoice that vector is a row of the embedding table. In Base it is the x-vector from the speaker encoder, which only Base has. The generation code takes either (voice_clone_prompt is a regular argument of generate), and the transformer weights of the two models are nearly identical. So take the embedding with Base, then hand it to CustomVoice instead of one of its speakers:

      cv = Qwen3TTSModel.from_pretrained("Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice", **kw)
      
      def say(text, xvec, instruct=None, language="English"):
          ids = cv._tokenize_texts([cv._build_assistant_text(text)])
          told = [cv._tokenize_texts([cv._build_instruct_text(instruct)])[0]
                  if instruct else None]
          voice = {"ref_code": [None], "ref_spk_embedding": [xvec],
                   "x_vector_only_mode": [True], "icl_mode": [False]}
          codes, _ = cv.model.generate(
              input_ids=ids, instruct_ids=told, voice_clone_prompt=voice,
              languages=[language], non_streaming_mode=True,
              **cv._merge_generate_kwargs(temperature=0.7, subtalker_temperature=0.7),
          )
          wavs, rate = cv.model.speech_tokenizer.decode([{"audio_codes": codes[0]}])
          return wavs[0], rate
      
      wav, rate = say("I really thought this would work.", armin,
                      "Speak in a sad, sorrowful tone, voice low and heavy, on the verge of tears.")
      

      Pick a speaker for the slot, a model and an instruction:

      Interactive demo: see the post on the website.

      Instructions work on cloned voices, but less reliably than on the built-in speakers, and it depends on the emotion, but honestly, it came out better than I anticipated. Definitely good enough to have some true custom voices for a voice over that don't necessarily sound like something, someone else has in their game.

      Other Fun Math

      If a voice is a point in a 2048-dimensional space and blending works we can maybe do some other funny math on it. The obvious one is to try to see if some math can be used to manipulate gender.

      To find it I had VoiceDesign create 14 different voices for men and women each. When you then take the average woman minus the average man you can then move any voice along that direction:

      women = torch.stack([fingerprint(f"design/f{i}.wav") for i in range(14)]).float()
      men = torch.stack([fingerprint(f"design/m{i}.wav") for i in range(14)]).float()
      middle = (women.mean(0) + men.mean(0)) / 2
      axis = women.mean(0) - men.mean(0)
      axis = axis / axis.norm()
      
      def move(xvec, t):
          """Put the voice at position t along the gender axis, keep the rest."""
          x = xvec.float()
          return (x + (t - (x - middle) @ axis) * axis).to(torch.bfloat16)
      

      Here is the result for my clone:

      Interactive demo: see the post on the website.

      Anyways, that's that. If you want to play around with Qwen3 TTS I hope this was of some help, and maybe you got some ideas of what to do with the voice embeddings. Use it for good, not evil.

    18. 🔗 Filip Filmar UberDDR4 Under Bazel: An Open DDR4 Controller, Checked by One Command rss

      UberDDR4 is an open-source DDR4 SDRAM controller and PHY for FPGAs, written by Angelo C. Jacobo. It connects a Wishbone master to DDR4 memory. It handles initialization, command timing, bank scheduling, refresh and PHY calibration. Its native PHY runs the memory at DDR4-2400 on a Kintex UltraScale+ part. The project is the successor to UberDDR3, and the NGI0 Commons Fund of NLnet paid for it.

      The repository is unusually well verified for an open hardware project. It has Verilator lint, Icarus and Yosys compile checks, 34 SymbiYosys proofs, and 26 simulations against Micron’s DDR4 model. A shell script, run_compile.sh, runs them in sequence. We converted all of it to Bazel, in a pull request on our fork. This article shows what that took and what it measured.

    19. 🔗 New Music Releases Juanes - La Explosión rss

      Juanes - a new release is available:

      • 2026-10-29: La Explosión (Single)

      Amazon: Canada | Deutschland | France | United Kingdom | United States

      Visit muspy for more information.

    20. 🔗 Ampcode News macOS Satellites rss

      Amp now has a Mac: ask it to work on your iOS or Mac app and watch it build, test, and run the app.

      How It Works

      Your thread still runs on a Linux orb, next to your dev server and toolchain. The Mac is a second machine attached to that orb. Amp can automatically start a Mac, run commands on it, and read and write files, so it decides on its own when the work needs a Mac.

      When it does, our server boots a fresh Mac in the cloud with Xcode and the simulators installed, in about 30 seconds. Your orb connects to it and keeps your code in sync, so Amp still edits on the orb and only builds, runs, and tests on the Mac. Screenshots, logs, and builds come back to the thread, and the app on the Mac reaches your backend on the orb through portals.

      The thread's Mac tab streams the Mac's screen. Watch Amp's work, or take control of the Mac and try the app yourself.

      Your orb runs Linux with the thread, dev server, and toolchain. 1. It starts a macOS Satellite in about 30 seconds. 2. It syncs your code to the Mac. 3. The Mac builds, runs, and tests. 4. Screenshots, logs, and video come back to the orb.

      Every Mac starts fresh, and nothing on it is saved. When Amp is done with a Mac, it keeps it running for 20 more minutes. If you send a follow-up in that time, Amp reuses the same Mac and its build cache instead of starting a new Mac and building from scratch. After that, the Mac is deleted. To delete it right away, archive the thread or ask Amp to stop the Mac.

      Morbs Are Dead, Long Live macOS Satellites

      Before shipping macOS Satellites, we tried out Morbs: orbs that ran the whole thread on a Mac. But we ran into issues that made the approach unfeasible for a wider rollout. Docker and your backend took minutes to start there,[^1] and keeping a Mac disk around for every thread got expensive.

      So we split the thread across two machines. Everything that runs well on Linux stays on the orb and starts fast, and a Mac only shows up for the work that needs macOS.[^2] We're calling them macOS Satellites because they orbit your orb.

      Pricing

      Size CPUs Memory Price
      mac.medium 6 14 GB $2/hour
      mac.large 12 28 GB $4/hour

      macOS Satellite time comes out of the same orb usage your plan includes, just at a higher rate. Once that runs out, it comes out of your Amp credits, the same way orb time does.

      Every Mac starts as a mac.medium. If you need more, ask Amp for a mac.large, or turn off mac.medium under Mac Satellites in Settings → Experimental Features.

      Join the Waitlist

      macOS Satellites are in beta and opening up as we add Macs. Join the waitlist in Settings → Experimental Features. Each day you click Move Me Up moves you up the line.

      Go point Amp at that app you've been meaning to build! Find out more in the docs.

      New to Amp? Sign up and get started on your Apple apps.

    21. 🔗 Ampcode News Visualize This rss

      You can now ask Amp to visualize or build something for you and it will do it, right in the thread: charts, timelines, diagrams, and mockups you can click through.

      Here are some examples, from our real threads. Go ahead, hover and click through them:

      Open the post on ampcode.com to see the chart of last month's commits that Amp drew.

      Here, for example, is an excerpt from Quinn's thread, where he asked for ways to fit a diff stat into a small button:

      Open the post on ampcode.com to try Quinn's sixteen diff stat buttons.

      And here's what went into building this feature:

      Open the post on ampcode.com to see the history of this feature that Amp drew.