🏡


  1. November 14, 2026
    1. 🔗 smol-machines/smolvm smolvm v1.35.0 release

      Highlights

      • Docker Engine API. smolvm serves the Docker Engine API, with every container running as its own machine. It supports Compose networks, Testcontainers and Dev Containers, image save/load/push/commit, IPv6 networks, and Buildx, which is faster on macOS. (#2172, #2178, #2179, #2181, #2183)
      • --auto-ports publishes the ports a machine starts listening on. (#2172)
      • Mac → cloud restore fixed. A checkpoint captured on macOS now restores on Linux hosts, including the agent rootfs digest, packed images and the virtio-fs file state. (#2162, #2163, libkrun #238, #239)
      • Branch checkpoints no longer fill the source's RAM. (#2174, libkrun #241)
      • Concurrent RAM captures reserve tmpfs, and serve cleans up abandoned checkpoint scratch when it starts. (#2173)
      • Supplementary groups are kept on execs into branched and restored machines. (#2004, fixes #2075)
      • Credential hosts: injected values are scrubbed from responses. (#2180)
      • machine update can set and remove labels in any machine state. (#2143)

      Behavior changes

      • In image machines, PID 1 (smolvm's keep-alive init) now runs as root. The workload, every exec, shells and upload ownership still use the image's USER and its /etc/group groups. (#2004)
      • A CLI start or branch of a machine with supplied-only credentials and no external interceptor now errors. Before, it intercepted silently with no value. A CLI restore with a matching --credential re-authorizes the checkpoint's bindings. The embedded and serve paths are unchanged. (#2182)
      • The Docker Engine API is opt-in. Installing or upgrading never runs smolvm engine; run it yourself to point docker at smolvm (it selects the smol Docker context). (#2186)
      • Credential-host requests are sent with Accept-Encoding: identity and without Range. A response in an encoding other than gzip or deflate is answered with a 502. (#2180)

      What's Changed

      • docs: say that virtiofs DAX is off on arm64 hosts and SMOLVM_MOUNT_DAX does nothing there by @BinSquare in #2087
      • Add smolvm docker: one command starts a Docker engine in a managed machine and points docker at it by @BinSquare in #2089
      • Share the home directory with the smolvm docker machine at the same path by @BinSquare in #2090
      • Resolve host.docker.internal to the host from smolvm docker containers by @BinSquare in #2091
      • Fix a port race in the leader-exit test by @BinSquare in #2096
      • Remove smolvm docker by @BinSquare in #2095
      • Hand supplied credential values to a running embedded machine at once by @BinSquare in #2097
      • Pin libkrunfw with UDP kept inside a TSI guest, and test it by @BinSquare in #2099
      • Publish ports below 1024 on macOS, add IPv6 loopback to live-forwarded ports, and lift the 64-mapping cap by @BinSquare in #2092
      • Return idle guest memory to the host within two minutes and cap new machines at half the host's RAM by @BinSquare in #2094
      • Install a root-owned agent-rootfs when root runs install.sh by @rdslw in #2082
      • Announce a changed file to the guest once per change by @BinSquare in #2102
      • Answer guest DNS from a host cache that coalesces bursts and resends lost queries by @BinSquare in #2098
      • Keep every disk chain under the branch depth limit: fold restored checkpoint layers and frozen-source chains by @BinSquare in #2103
      • Exec sessions: commands the node owns, resumable after a dropped connection by @BinSquare in #2101
      • Let a guest hold tens of thousands of connections on virtio-net and free their host sockets promptly by @BinSquare in #2104
      • Scope the usage journal to the test's own thread by @BinSquare in #2106
      • Pin libkrun 526be460 and libkrunfw f290c62b, rebuilt for every platform by @BinSquare in #2109
      • Build the agent rootfs as non-root on hosts with user namespaces again by @BinSquare in #2107
      • Answer a start missing the mediated interceptor with 400, not 500 by @BinSquare in #2108
      • Run tests that need a released file lock free at once in their own process by @BinSquare in #2110
      • Pin libkrun 9df62257 and libkrunfw 7f4d4950, rebuilt for every platform by @BinSquare in #2113
      • Stop resetting virtio-net connections a server closes first by @BinSquare in #2118
      • Upgrade rusqlite to 0.41 for the patched bundled SQLite (RUSTSEC-2026-0459) by @BinSquare in #2128
      • Keep a host memory reserve VMs cannot take and charge branch children for growth by @BinSquare in #2127
      • Ask before stopping a machine on delete, so a refused or declined delete leaves it running by @connorburgess in #2131
      • Prepare SmolVM v1.34.1 for release by @BinSquare in #2135
      • Bring a soft open-file limit above kern.maxfilesperproc down to the cap on macOS, so the limit raise_nofile_limit reports is the one in force by @connorburgess in #2132
      • Leave no data directory behind when exec, status or stop name a machine that does not exist by @connorburgess in #2129
      • Warn when --block-private keeps a named host unreachable by @BinSquare in #2146
      • Register Rosetta itself as the x86_64 interpreter when the host answers its start-up ioctl by @BinSquare in #2148
      • Make a mounted host directory belong to the workload user so a non-root workload can write to it by @BinSquare in #2149
      • Record the image platform on the machine so a Rosetta machine can be created from an amd64 image by @BinSquare in #2147
      • Bump libkrun so a Rosetta machine runs amd64 programs directly and a macOS machine stops promptly by @BinSquare in #2150
      • Keep a cache disk's chain on its shared base when compaction shortens it by @BinSquare in #2145
      • Satisfy Rust 1.100's needless_bool lint in connect_in_progress on Windows by @BinSquare in #2154
      • Bound branch admission and reported capacity by the VM slice's memory limit, not just host free memory by @BinSquare in #2152
      • Stop throttling the VM slice and reclaim it from the pressure guard instead by @BinSquare in #2153
      • Release a paused branch child's VM lock so the memory pressure guard can resume it by @BinSquare in #2157
      • Keep a restored machine's local image on its storage disk instead of mounting the capturing host's archive by @BinSquare in #2163
      • Update quinn-udp to 0.5.16 for RUSTSEC-2026-0538 by @BinSquare in #2165
      • Count every symlink with one mode in the agent rootfs digest so a Mac checkpoint restores on Linux by @BinSquare in #2162
      • Carry guest traffic in 64 KB frames over the gateway link so downloads use a quarter of the CPU by @BinSquare in #2168
      • Pin libkrun 518949b4 and libkrunfw 0fae3853, rebuilt for every platform by @BinSquare in #2169
      • Reserve tmpfs for concurrent RAM captures and sweep abandoned checkpoint scratch at serve start by @BinSquare in #2173
      • Let a packed image's branch take the deferred checkpoint save and say when the VM died mid-save by @BinSquare in #2174
      • Integrate and validate Docker Engine, automatic ports, and nested Rosetta support by @BinSquare in #2172
      • Run x86_64 images in containers Docker starts inside a Rosetta machine, keeping their PID by @BinSquare in #2093
      • Serve the Docker Engine API from smolvm, every container a machine by @BinSquare in #2114
      • Publish the ports a machine starts listening on, with --auto-ports by @BinSquare in #2136
      • Give engine containers user-defined networks, so Docker Compose stacks run by @BinSquare in #2115
      • Let engine containers reach the Docker socket, so Testcontainers and Dev Containers work by @BinSquare in #2116
      • Branch engine containers from a warm base when many of one image run by @BinSquare in #2117
      • Publish engine container ports on the address each one names by @BinSquare in #2119
      • Give engine containers a volume for each VOLUME their image declares by @BinSquare in #2120
      • Move images in and out of the engine: save, load, push, commit, import, export by @BinSquare in #2121
      • Run --network container: containers in that container's machine by @BinSquare in #2122
      • Give engine networks IPv6 by @BinSquare in #2123
      • Run the Docker API on demand with independent workload supervisors by @BinSquare in #2175
      • Fix Buildx volume permissions and macOS restart stalls by @BinSquare in #2178
      • Improve default macOS shared-volume write performance by @BinSquare in #2179
      • engine: speed up macOS Buildx with automatic overlayfs snapshots by @BinSquare in #2181
      • Run the guest keep-alive init as root while workloads and execs keep the image user and its supplementary groups. by @BinSquare in #2004
      • engine: fix multi-stage Buildx builds containing deleted files by @BinSquare in #2183
      • Scrub injected credential values from what a credential host sends back by @BinSquare in #2180
      • Re-authorize a restored checkpoint's credential bindings from the CLI, and refuse a start that could not inject them by @BinSquare in #2182
      • Sweep a deleted machine's pause-operation lock along with its fork-operation lock by @connorburgess in #2184
      • Let machine update set and remove labels, in any machine state by @josmo in #2143

      New Contributors

      Full Changelog : v1.34.0...v1.35.0

    2. 🔗 Barre/ZeroFS v2.3.7 release

      What's Changed

      • Report metadata L0 depth per segment by @Barre in #651
      • Bump dependencies by @Barre in #652
      • Correct link to kernel client docs. by @skorgu in #656
      • fix: inherit the parent group for files created under a setgid directory by @sorend in #646
      • Build the kernel client against Linux 7.4 by @Barre in #657
      • Update distro kernel package targets by @github-actions[bot] in #658

      New Contributors

      Full Changelog : v2.3.6...v2.3.7

    3. 🔗 r/LocalLLaMA Instead Of Lowering GPU Prices, Former NVIDIA CEO Jensen Huang Reportedly Financed AI Startups To Absorb Excess Silicon, Shattering The Shortage Perception rss

      Instead Of Lowering GPU Prices, Former NVIDIA CEO Jensen Huang Reportedly Financed AI Startups To Absorb Excess Silicon, Shattering The Shortage Perception | submitted by /u/billy_booboo
      [link] [comments]
      ---|---

    4. 🔗 Luke Muehlhauser Composing classical music with AI agents rss

      For 20 years I've wanted to compose contemporary classical music, but I never had the skill or time to do so. Thanks to AI, now I can!

      Some of my favorites pieces I've composed with AI so far are:

      1. hey claude write me a symphony thx (written entirely from only that phrase): a Romantic minimalist symphony inspired by Philip Glass and John Adams
      2. hey claude write me an oboe concerto thx (same): a Romantic oboe concerto with beautiful melodies
      3. "Duck-Rabbit": a never-changing Banjo riff sounds different every few measures due to auditory illusions created by the orchestra playing around it
      4. "De Natura": a dark, driving orchestral piece inspired by prog-rock band Magma
      5. "Pen Pals to Lovers": an American banjo and Japanese koto send each other "letters," gradually learn the other's language, trade ideas more quickly in person, then fall in love and play together
      6. "Castells": a musical representation of building a Catalonian "castell" — a tower made of people standing atop one another
      7. Floating Dreams: a pastoral slow-building orchestral piece inspired by a track by Pat Metheny & Lyle Mays
      8. Homage to The Necks: an homage to five long minimalist grooves by the jazz trio The Necks
      9. "Opus 2": a meditative James Syler theme transformed into an epic mini-symphony for large orchestra and choir

      My process is simple: I describe the piece I want to the AI (e.g. Claude or ChatGPT), it writes the first draft composition in a notation format called MusicXML, I open that in MuseScore Studio (free) to see the sheet music and play it back with virtual instruments, and then I either ask AI to make adjustments and then import & listen again, or I export the piece to MP3 and ask AI to make a "scrolling score" video I can upload to YouTube. Every piece above was composed with 10 or fewer prompts.

      Claude (the AI) is so good at composing that, by the measure of "how many hours of music by this artist do I strongly enjoy listening to?", Claude is already my 32nd favorite musical artist across all genres, from just one month of output alone1

      The pieces would sound even better if I spent more time "producing" the music in a digital audio workstation (DAW) like Reaper (which AI can also do for you), and if I paid for higher-quality virtual instruments (e.g. Vienna Performer).2

      In addition to bringing your own compositional ideas to life, AI can also give new life to works that would otherwise remain unheard. For example, AI can:

      You'll often get pretty fun (and sometimes good) results just by trying things like "please write me a 4-movement symphony in MusicXML; my favorite composers are [A, B, and C]." But if you want to invest more time for better results, here are some tips from my experience so far:

      • If the AI's first attempt at your compositional idea isn't very close to something you want, it's typically better to try again with an updated prompt in a new session, rather than trying to massage the bad first draft closer to what you want.
      • In a text file in your working folder, give AI context on your classical music preferences. List favorite composers, point to Spotify playlists, etc. The more detail you've got on specific compositions you've liked vs. disliked, or specific styles you like vs. don't, the better it'll do at composing music you like. (But in some cases you may want the AI to ignore your preferences file, if you're composing for other purposes.)
      • To stimulate or amplify your creativity, ask AI for composition ideas meeting certain criteria, or ask it for potential improvements to your own ideas, before you have it write the piece. Items 3, 5, and 6 above are all based off ideas AI came up with.
      • Have AI "sketch" ideas for you to give feedback on before it writes an entire piece or movement, especially a large complicated piece with many parts. For example, you might say "Write me a MusicXML file with 20 different melodies with [some properties] played on piano solo, then I'll tell you what my favorites are, and you can use those as the main themes of the piece." Or "Write me a MusicXML file with 20 different kinds of polymeter played on congas and drumset, and I'll tell you which grooves I like best."
      • Build and maintain composition-related skill files. (A skill file is just a text file with instructions on how the AI should do a particular thing.) For example, I maintain skill files on (a) how to write MusicXML files that will play correctly in MuseScore, and (b) how to achieve various orchestration effects/sounds.
        • You don't need to write these yourself; you can just say "Please write a skill file on how to write MusicXML files that will be 'performed' well when imported into MuseScore" or "Please read as much as you can find online about skillful orchestration and how to achieve different kinds of orchestral effects and sound profiles, and write your findings to a skill file." And then after each composition session, say "Please update the MusicXML skill and the orchestration skill based on what you learned during this composing session."
        • E.g. AI added things like this to my MusicXML skill file: "Generate with a script, never hand-typed XML" and "MusicXML can't set MS4's beam groups. MS4 4.7.5 beams 7/8 as 3+2+2." (I don't even know what beam groups are.)
      • Consider asking AI to do extensive research before you compose a piece. E.g. for Far-Flung Work Songs, I asked AI to gather as many fully-transcribed "work songs" from folk music traditions around the world as it could find, and keep them in a unified catalogue. It kept a log of sources it couldn't automatically acquire, some of which I could download en masse via a script it wrote, others of which I could choose to acquire manually for it. After the AI had assembled many thousands of work songs from dozens of folk traditions around the world, I asked it to create a simple MIDI file (from the ethnomusicologist's transcription) for each of 50 of the songs from the catalogue that it thought I would find the "most catchy." I then listened to the basic melodies and rhythms of those 50, picked my seven favorites, and asked AI to write orchestrations of them.
      • In general, if you're stuck wondering "Can the AI do X?" or "What questions am I not thinking to ask?" or "Where are skill files stored?" or "How can I make this process simpler for me?" or whatever… Just ask the AI!

      • My favorites are listed here. Of course, Claude has the advantage of composing based on my own desires, and of being able to write music vastly faster than any human can.

      • I have purchased the MuseSounds Pro package already, which gets you lots of instruments for a low price.
      • I haven't done this myself yet, but for an already-existing score, an AI can be used to (a) transfer a written score into a notation format like MusicXML, and (b) improve the details of that MusicXML file for ideal performance by a program like MuseScore.
  2. November 13, 2026
    1. 🔗 HexRaysSA/plugin-repository commits sync repo: +1 plugin, +5 releases, -1 release rss
      sync repo: +1 plugin, +5 releases, -1 release
      
      ## New plugins
      - [ida-mcp-bridge](https://github.com/eitapreulajhol/ida_mcp) (0.3.0)
      
      ## New releases
      - [btf2ida](https://github.com/nightshift-labs-ai/btf2ida): 0.1.20
      - [cfiscope](https://github.com/nightshift-labs-ai/cfiscope): 0.1.18
      - [memlens](https://github.com/nightshift-labs-ai/memlens): 0.3.25
      - [threatray](https://github.com/threatray/plugin-ida): 3.0.5
      
      ## Changes
      - [memlens](https://github.com/nightshift-labs-ai/memlens):
        - removed version(s): 0.3.0
      
    2. 🔗 anthropics/claude-code v2.1.325 release

      What's changed

      • Fixed a security issue in how zstd-compressed responses are decoded
      • Added a spinner tip in VS Code and similar integrated terminals about re-running a notebook cell, shown once Claude has read or edited a Jupyter notebook
      • Added a line under the error shown when your organization's policy blocks a request, saying how to continue: run /rewind and change the message, or run /clear
      • Added a note for Claude when a sandboxed git checkout, git stash or autostash pull cannot update protected files such as those in .claude
      • Fixed /security-review and skills' inline git commands stopping with an error in worktrees of bare repositories, --separate-git-dir checkouts and Android repo checkouts
      • Fixed subagents with their own model being moved to the plan-mode model when the model setting is opusplan or haiku
      • Fixed subagents on a different model sizing file reads and MCP results with the main session's model
      • Fixed sessions on many third-party gateways and Foundry stopping with a context length error on every turn instead of compacting
      • Fixed recent turns sometimes going missing from a resumed session after Claude Code stopped without a clean exit
      • Fixed shell commands running in the launch directory after the working directory was deleted; the command now fails with a message and can be re-issued
      • Fixed an approved plan edit being lost when the plansDirectory folder can't take it: the plan is now saved in the default plans folder, and a warning says where and why
      • Fixed a saved sonnet[1m] model setting being rewritten on a new install to a model id the API rejects
      • Fixed focus view hiding the reply to your prompt when a scheduled task replied after it
      • Fixed the prompt sometimes missing from a background subagent's view when fullscreen is off
      • Fixed long options in lists and permission prompts being partly overwritten when they wrap, and first-run screens losing lines on narrow terminals
      • Fixed startup warnings about permission rules and the "N MCP servers need authentication" notice being recorded as seen when they were scrolled out of view
      • Fixed the welcome header showing control characters or splitting across lines when an agent's name or the working folder contains them or a line break
      • Fixed the red error shown when Claude tries a command only you can run: a dim line now says it runs only when you type it at the prompt
      • Fixed /stats showing an Active days total that was one day too high
      • Fixed /insights saying a report was ready when no session qualified for analysis, and writing two values into its HTML report without escaping them
      • Fixed /voice saying voice mode changed when managed settings, --settings, or the project's .claude/settings.json or .claude/settings.local.json kept it as it was; it now says what holds it
      • Fixed the IDE welcome dialog showing Cmd+Esc for Quick Launch on Windows and Linux
      • Fixed Slack app tips showing when your organization's policy denies cloud sessions
      • Fixed claude purge hanging silently when there is no terminal to read keys from, and its project picker and -i prompts ignoring the keyboard when stdin is piped
      • Fixed claude plugin eval --output-dir '' writing the report into the current folder; it now exits with an error
      • Fixed claude -p text output on a terminal passing control sequences other than text styling; pipes and files are unchanged
      • Fixed leftover .oauth_refresh.lock.owner.tmp.* files piling up in the config directory
      • Fixed /fast saying "Fast mode has been disabled by your organization" under the keyless Console sign-in, where Claude Code had not asked the server
      • Fixed /model saying that your organization restricts a model when Claude Code could not check that, for example with no network
      • Fixed "Sign in with your Console account" in /login replacing your existing login when you pressed Esc right after the browser step
      • Fixed the browser showing the sign-in success page in some cases where sign-in failed or was canceled
      • Fixed claude auth status and other short commands leaving a lock behind on a Console profile, which made the next session hang for about a minute
      • Fixed background sessions started on your claude.ai login using (and billing) an API key or token from the shell that started the background service
      • Fixed more cases of a session moving to another sign-in in the background; these moves are now refused, with a message saying what works
      • Fixed a second Enter in the exit dialog stopping background work after the move to the background was refused
      • Fixed token counting on Amazon Bedrock sending the conversation to Bedrock when the allowedProviders managed setting does not allow it
      • Fixed AWS credential_process helpers and Google Cloud default credentials failing when Claude Code is started without a HOME environment variable
      • Fixed a session sometimes going back to an earlier permission mode after a subagent's plan was approved
      • Fixed one invalid value in an Agent SDK applyFlagSettings() call silently discarding all settings from earlier calls; a call that would do this is now refused with an error
      • Fixed sessions showing as waiting for input when a finished pull request only needed your own review or merge
      • Fixed an unrecognized teammateMode settings value being ignored without a warning: claude -p, the startup warning and claude doctor now list it as a skipped entry (still not applied)
      • Fixed --worktree skipping a WorktreeCreate hook from a plugin in CLAUDE_CODE_PLUGIN_SEED_DIR on the first run in a new home directory
      • Fixed brief-mode sessions, such as Dispatch, sending a reply again after the turn had already replied
      • Fixed Claude saying a working Atlassian, Asana or Sentry connector had failed in cloud sessions when a plugin listed it at a different URL
      • Fixed Claude Desktop and SDK sessions listing a folder's own MCP servers (.mcp.json, local) as host-added or not at all, and not connecting WebSocket ones, after a folder move or pre-warmed start
      • Fixed /mcp still listing a plugin's MCP server after a plugin reload removed it while it was connecting
      • Fixed an MCP server staying "needs authentication", and its mcp_tool hooks being skipped, after a token refresh that was refused only for a moment
      • Fixed MCP elicitation requests being cancelled without asking in headless mode after a server's connection was replaced during a tool call
      • Fixed MCP tool calls from an SDK host answering "Not connected" after a tool call had reconnected the MCP server
      • Fixed an MCP task getting stuck after its question was closed with Esc or asked again: the footer now says it needs your input, and Enter in /tasks shows the question again
      • Fixed background MCP tasks that stopped updating after another call to the same server lost the connection, when a later call reconnects
      • Fixed a background MCP task's question opening over a message you were still typing; it now waits until you send or clear the draft, and the spinner and turn timer keep running
      • Fixed worktree.sparsePaths and sparse plugin and marketplace clones leaving out the repository's root files on older git versions, such as 2.34
      • Fixed self-hosted runner sessions with several repositories being unable to use a repository added mid-session
      • Fixed Claude asking for permission before reading your own artifact or its data
      • Fixed deny and ask permission rules and hooks for the Artifact tool not applying in some cloud sessions
      • Fixed Code Mode scripts ignoring a worktree entered with EnterWorktree, writing ~ paths into the project, and leaving /mcp showing an MCP server as connected after its sign-in expired
      • Fixed words typed with a Yes at a permission dialog or plan approval not reaching Claude in Code Mode
      • Fixed Claude starting work by itself when you resumed a session that ended during a Code Mode script; it now waits for your next prompt
      • Fixed a missing OpenTelemetry user_prompt event for a message sent while tool calls run. The event has delivery.mode: "mid_turn" and the running turn's prompt.id
      • Fixed the OpenTelemetry user_prompt event leaving out earlier messages' text when queued messages merged into one turn in VS Code, or when one message had an image
      • Fixed a slash command's allowed-tools grants applying to background agents woken during or after its turn
      • Fixed /feedback and /bug to upload other sessions only when they were recorded by the signed-in account or organization
      • Fixed relative deny and ask permission rules (e.g. Read(./.env)) no longer covering the project after a cd; they now also apply in added directories
      • Fixed deny and ask permission rules starting with mcp__plugin_*_ missing a plugin's MCP server or tool spelled in another letter case
      • Fixed deny rules not being applied to a permission approval that arrives after Claude Code restarts, in self-hosted runner and claude remote-control sessions
      • Fixed a case where a committed .claude/settings.local.json could be treated as the user's own when Claude Code was started in certain subfolders of a repository
      • Fixed some deny and ask rules not applying to certain Bash commands
      • Fixed a gap in Bash permission checks where some compound commands could run without asking; these now ask for permission
      • Fixed a case where a Bash allow rule could run a different program than the one it names
      • Fixed a connector tool's approval prompt in cloud sessions being answered automatically while plugins were still loading
      • Fixed some subagents changing an artifact that people outside your organization can see, or uploading files to it, without asking first when an allow rule is set or uploads were approved earlier
      • Fixed some artifact publishes skipping the confirmation for pages that people outside your organization can see when "don't ask again" had been chosen for Artifact
      • Fixed auto mode judging only the first change to an artifact that people outside your organization can see; its yes now covers that change alone
      • Fixed a managed strictPluginOnlyCustomization lock on agents and skills not taking effect in sessions that were already running
      • Fixed sandboxed commands being able to write to the native updater's download folder in some cases
      • Fixed a case where the Bash sandbox did not fully protect a worktree's settings and hooks
      • Fixed a case where the Bash sandbox did not fully protect a linked worktree's shared git folder
      • Fixed /teleport's stash choice in some unusual git states: it now stops and says what to do
      • Windows: Fixed a start-up stall that could last about a second when a PATH entry sits under a folder your account cannot open
      • Fixed /resume on Windows refusing or hiding sessions whose folder was recorded with a different drive-letter case or slashes
      • Fixed an in-session /resume on Windows dropping a project's saved trust when the session was recorded with a different drive-letter case
      • Linux: Fixed sandboxed Bash commands failing with bwrap: Can't create file when the working directory was below an allowRead folder inside a denyRead, such as under a symlinked home directory
      • Fixed Claude Desktop's third-party deployments staying on "Stopping" until a token renewal finished (once it includes this version)
      • Improved subagents cut off at the output token limit: they are now asked for the whole answer again, more briefly, instead of returning only its end
      • Improved startup with a keyless Console sign-in or other Anthropic profile login: a token that is still valid is read without waiting for the credentials lock
      • Improved the account email check: it now also refuses your email as a client's identity in scripts a command runs, file writes, web fetches and MCP calls
      • Improved the HTTPS authentication failed message for private plugin marketplaces: it now says git's terminal prompts and askpass programs are disabled, and it also appears with newer git versions
      • Improved the add-marketplace confirmations, plugin recommendation prompts and plugin install warning to say that plugins can run code on your computer, with access to your files and shell
      • Improved the claude --desktop sign-in error to name the API key, provider or setting that stops a Claude account sign-in from working
      • Improved the /voice "No audio detected" message on macOS and Windows: it now says where to pick your microphone
      • Improved MCP tasks: Claude is now told when a task is waiting for your answer, and can point you to /tasks
      • Improved claude remote-control: it now exits with status 4 when it stops by itself (single-session runs still exit 0) and 69 when it can't register, so a service manager can start it again
      • Improved the messages shown when a background session can't use its session's API key or token: they no longer suggest adding the key to settings
      • Improved the bundled dataviz skill's part-to-whole advice for static images and for parts with a natural order, such as age bands
      • Changed sandboxed Bash commands to follow the normal permission flow by default; set sandbox.autoAllowBashIfSandboxed: true to keep running them without prompts
      • Changed managed settings that turn the sandbox on: to keep commands running without prompts, set sandbox.autoAllowBashIfSandboxed: true in your highest-ranking managed source
      • Changed read-only git commands to ask first in a repository that isn't the project's or one you trusted; name it with --add-dir, not the additionalDirectories setting, to run them without prompts
      • Changed scheduled tasks and /loop to ask before running a skill that declares allowed-tools or hooks; add Skill(name) to permissions.allow to run it unattended
      • Changed "Always allow" in Desktop, IDE and SDK hosts: a rule alone is offered only when saving it would allow that command again, so a scheduled task that relied on one can now wait for you
      • Changed the sandbox to refuse sandboxed writes to .claude settings, skills, agents, commands and hooks in added directories, as it does in the launch folder
      • Changed worktree isolation: an isolated worktree session or agent is now refused git bisect run, git maintenance register|start and scalar's set-up commands, and is told what still works
      • Changed plugin MCP bundles (.mcpb, .dxt) to unpack under the plugins directory, not .mcpb-cache in the plugin's folder, so read-only plugin folders load; one fetched by URL downloads again once
      • Changed plugins of a remote marketplace that managed settings declare, enable and list in prependPlugins or appendPlugins to count as the organization's; pluginDigests is deprecated and ignored
      • Changed plugin loading to skip, and claude plugin validate to report, some unsafe paths and links in a plugin's folder
      • Changed nested skill loading: .claude/skills folders in --plugin-dir plugins no longer load from a session started above them; start Claude Code in the plugin folder instead
      • Changed EnterWorktree to refuse a WorktreeCreate hook path that goes through a symlink inside the project; have the hook print the real path
      • Changed tmux and iTerm2 teammates, and new sessions from the agents view opened with ←, to start in the session's folder instead of where the shell last ran cd
      • Changed prompt suggestions in the terminal to refresh less often after 8 turns in a row started by background or scheduled tasks, saving usage until you press a key or return to the terminal
      • Changed Esc on a background MCP task's question to "answer later": nothing is sent to the server, and the question stays in /tasks
      • Changed CLAUDE_CODE_MAX_CONTEXT_TOKENS to also set the context window of unrecognized model IDs that start with claude-, such as a gateway's claude-sonnet-latest
      • Changed /login to ask for permission to change your privacy settings
      • Changed /cost, $.session.usage(), --max-budget-usd and the cost and token metrics to count a mod's $.model.complete and $.model.classify calls
      • Changed the programs that Claude Code's sandbox starts for its own use, such as its network bridge, to run without Claude Code's sign-in tokens and API keys in their environment
      • Changed ripgrep, local git commands and the sandbox runtime's own helper programs to run without the mTLS client key's passphrase in their environment
      • Remote Control: Changed /resume and /teleport to disconnect first when the connected session has a share link, or when that can't be checked; run /remote-control to connect again
      • Changed Claude Code on the web, cloud scheduled tasks and Cowork cloud sessions to start despite sandbox.failIfUnavailable: the hosted container has no command sandbox
      • Changed requests for settings, permission rules, hooks or status over a cloud or self-hosted session's connection to return less or be refused; what applies in the session is unchanged
      • Changed claude -p with no cached account data to wait for that data before its first request, so a first run in a clean environment can start a few seconds later
      • Changed Claude's instructions to keep files you'll want out of its temporary scratchpad folder, which can be cleared
      • Changed marketplace ref to accept the full ID of any commit on a branch or tag; clients before this version can't clone such a pin, so a marketplace pinned this way stops loading there
      • Changed plugin marketplace and plugin downloads to use a CONNECT tunnel when ALL_PROXY is the only proxy set; a proxy that refuses CONNECT now fails them
      • Changed -p and SDK runs in a worktree or submodule mounted into a container to apply .claude/settings.local.json allow rules only once the folder is trusted
      • Changed self-hosted runners to refuse a session whose session folder or repository path is a symbolic link, other than a checkout hook's checkout
      • Removed "ask your admin to raise it" from spend limit and shared budget errors in cloud sessions and under Remote Control
      • [VSCode] Added prompt suggestions wherever the terminal shows them: Tab accepts the suggested next prompt; promptSuggestionEnabled: false in Claude Code's settings.json turns them off
      • [VSCode] Added a Console sign-in that creates no API key
      • [VSCode] Added a field to paste the redirect URL when signing in to an MCP server from the panel in SSH, WSL and container windows
      • [VSCode] Fixed the model picker's check mark staying on the old model after Claude Code restarted on another model or the model was switched over Remote Control
      • [VSCode] Fixed the effort selector offering levels above the effort cap set by your organization or the maxEffortLevel setting
      • [VSCode] Fixed the sign-in screen offering sign-ins that the managed allowedProviders setting refuses
      • [VSCode] Fixed the permission prompt for MCP tools not saying why Claude Code asks when a safety check raises the question
      • [VSCode] Fixed the message for organization settings that couldn't load saying to run a command again; it now says to try again, matching the tab's Retry link
      • [VSCode] Improved the note shown for an untrusted folder: it now says why the extension is off and how to turn it on
      • [VSCode] Improved the error shown when the system refuses to run Claude Code: it now says your IT team can allow a blocked program
      • [VSCode] Improved the sign-in card to say what to do when the browser shows a connection error for localhost
      • [VSCode] Changed the install link's marketplace confirmation button to "Trust marketplace and continue"
      • [Claude Code on the web] Fixed new cloud sessions cutting MCP tool descriptions loaded through tool search at 4,096 characters; the limit is now 16,384, as in other Claude Code sessions
      • [Claude Tag] Fixed artifact links pasted in Slack getting no card when the poster's Claude sign-in had expired in a workspace their organization doesn't manage; a plain card now appears
    3. 🔗 backnotprop/plannotator v0.28.64 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.63 | Pair Grok Bot and other cloud agents from Settings, Hermes Agent, OpenClaw and Muse Code can use the Inbox, add a thread to Priority to keep it on top, tag threads, and find each tag in the sidebar, Pull requests board as a table, with bulk Merge
      v0.28.62 | Agents started from the Inbox now work on Windows, pick a model and effort when you start an agent, rules for your agents, written in your own words, post a thread's decisions on its pull request, the Inbox loads faster on a slow connection
      v0.28.61 | Updates now update the Claude Code plugin too, an agent's chosen face shows on every icon of it, filter the Inbox list by pull request state, Modern dark shows section bands and the Reply button, one conversation no longer shows as two agents
      v0.28.60 | Click a word to highlight it, a one-time Themes dialog, Settings → Rows rebuilt, tell your agent how you want your rows, starred threads as pills above the list, a pill for new messages out of view, a half-circle face picker with ten Glass colours, a new phone sidebar and reply box
      v0.28.59 | A quieter Agents section in the sidebar, machine names only when agents run on more than one machine, agent icons that are always gently alive and lean toward your pointer
      v0.28.58 | Start Codex from New message, an Agents section in the sidebar, start an agent in a folder on any drive, play audio attachments and comment at a moment, Claude Code's Plannotator tools work on Windows
      v0.28.57 | Pin artifacts, and see every artifact on one page, filter the list by project, date or agent, a thread shows its pull requests and their state, choose what the sidebar shows, and in what order, Ask AI starts from Side in the selection bar
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews

      What's New in v0.28.64

      TL;DR

      • Changed: Installs and updates download a smaller, compressed copy
      • New: A Videos filter on the Artifacts page
      • Changed: GitLab comments on a whole file get their own thread
      • Off by default: Pull request pictures and videos show in the Inbox

      0.28.64 is a small release. Installs and updates now download a compressed copy of Plannotator, the Artifacts page can show only videos, and a GitLab comment on a whole file posts as its own thread. It has 5 PRs, all from the maintainer.

      Smaller downloads for installs and updates

      Each release now carries compressed copies of the Plannotator binary next to the plain one: a .tar.xz for macOS and Linux, and a .gz for every platform. On macOS (Apple silicon) the download goes from 195.6 MB to 44.9 MB as .tar.xz, or 73.9 MB as .gz.

      The installers try them in order. On macOS, the install script takes the .tar.xz, then the .gz, then the plain file. On Linux it takes the .tar.xz only when xz is installed, and otherwise starts with the .gz. On Windows, both install.ps1 and install.cmd take the .gz, then the plain file. Each copy is unpacked and checked against the same SHA-256 as the plain binary before anything is replaced. If a copy is missing, fails to download or unpack, or does not match, the installer quietly moves on to the next one. Only the plain file can fail the install, with the same messages as before. The installer prints one new line that names the file it used, such as Downloaded plannotator-darwin-arm64.tar.xz.

      In a test on a Mac, with the download limited to 2 MB/s, an update took about 24 s with the .tar.xz, 36 s with the .gz and 94 s with the plain file. Updates from inside Plannotator run the same install script, so they get the smaller download too. Older releases have no compressed copies, so installing one of them downloads the plain file as before. To force the plain download, set PLANNOTATOR_SKIP_COMPRESSED_DOWNLOAD=1.

      #3302

      A Videos filter on the Artifacts page

      The Artifacts page (the Artifacts row in the sidebar) listed videos, but its filters were Images, Pages, Documents and Other files, and every video counted as an image. There was no way to see only the clips. The page now has a Videos filter after Images, and an mp4 or webm sits there instead of under Images. Audio stays under Other files. A thread's own Artifacts grid is unchanged.

      #3304

      GitLab: a comment on a whole file gets its own thread

      On a GitLab merge request, a comment on a whole file used to be folded into the review's main note as **path:** text. It now posts as its own thread on that file, as it already did on GitHub. This works from plannotator review and from the Inbox's Post to GitLab, and was checked on gitlab.com, where each one shows as "started a thread on a file".

      If GitLab refuses a file thread, as an older self-hosted GitLab may, that comment goes into the main note as before, so nothing is lost. If the file threads go and the note then fails, a retry sends only what is left, so no file thread is posted twice.

      #3245

      Code review in the Inbox: off by default

      This shows only with Code review turned on in Settings → Capabilities.

      • A pull request's own pictures and videos. On a PR from github.com, the pictures in its description, comments and line threads now show in place, on the PR page and in a thread's full review. Before, each one was a chip saying it opens on the forge. Screenshots written as <img> tags, such as before and after pairs in a table, show as pictures too. A click, or Enter or Space, opens a picture full screen in the attachment viewer, and a video GitHub saved as a link plays there on a plain click. The Inbox fetches each file through your own gh sign-in, only from GitHub's attachment hosts and only when the PR's text names it. A picture that fails to load stays a chip. GitLab merge requests keep their chips for now. #3165

      Additional Changes

      • Setup pages for each agent. The site has a new page at plannotator.ai/inbox/agents that lists the agents that work with the Inbox and what each one supports, with a setup page per agent: steps to copy, how to check it works, and fixes for common problems. #3183

      Install / Update

      macOS / Linux:

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

      Windows:

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

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

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator --scope user
      

      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

      • Marketing: pages for each agent and what works with the Inbox by @backnotprop in #3183
      • Inbox: a PR's own pictures show in its text and open in the viewer by @backnotprop in #3165
      • Inbox Artifacts page: a Videos filter by @backnotprop in #3304
      • GitLab: a comment on a whole file becomes its own file thread by @backnotprop in #3245
      • Installers download a compressed copy of the binary when the release has one by @backnotprop in #3302

      Full Changelog : v0.28.63...v0.28.64

    4. 🔗 HexRaysSA/plugin-repository commits sync repo: +1 release rss
      sync repo: +1 release
      
      ## New releases
      - [kflow](https://github.com/nightshift-labs-ai/kflow): 0.0.2
      
    5. 🔗 r/LocalLLaMA Look what my son gave me! rss

      Look what my son gave me! | I told my son I was playing around with local AI on a 3090. He told me he used to mine Ethereum and had a shed full of 3090's. He asked me if I wanted a couple. Ummm... let me think about it... OH YES I DO! Now a few new fans and a bit of a clean-up... grab a couple risers and a power supply... pop in a bit more RAM.. wow. https://preview.redd.it/6jtwj6ufhe1i1.png?width=1075&format=png&auto=webp&s=86500ed00010400ebad0529f653612c3ecc62729 Edit: There is some completely understandable skepticism about this story... ya I wouldn't believe it either. But how about a couple more pics and a solid dose of "trust me bro" cause it's all real. The shed: https://preview.redd.it/iqeo7cn5cf1i1.png?width=1243&format=png&auto=webp&s=bdcb896453f54790330bf3a2bff78ed01260167e The former resting place of the Eth miner (and other miners... ant miners? still in place) https://preview.redd.it/69qqrn4gcf1i1.png?width=769&format=png&auto=webp&s=eb9cdae4e0ef1c4f61b136c7234ebf72fa94ae64 The recovered Eth miner... https://preview.redd.it/s0nng1oacf1i1.png?width=772&format=png&auto=webp&s=39024f9ec7f08f3e1187396632924a166103a89b And now we see how many of them boot up via an eGPU... who doesn't have one of those just lying around. https://preview.redd.it/309xnutkcf1i1.png?width=682&format=png&auto=webp&s=84b812592148c1a89f2ccf34be4e94bf2c6a7db0 submitted by /u/LankyGuitar6528
      [link] [comments]
      ---|---

    6. 🔗 Anton Zhiyanov Probabilistic data structures in Go rss

      Probabilistic data structures give you approximate answers to questions about the data they handle. Does the set contain a certain item? How many unique items are in the collection? Which items appear most often? Unlike deterministic structures like sets and frequency tables, the answers might not be exact, but in return, you can drastically reduce memory usage.

      In this post, we'll talk about what probabilistic structures are, how they work, and what kinds of guarantees they provide. I'll also introduce unsure — a package that implements these structures in Go. It's simple (the core logic for each data structure is 100–300 LOC), fast (usually several times faster than other implementations), and has no dependencies except for the standard library.

      Bloom filter • Count-min sketch • HyperLogLog • T-digest • Top-k

      # Bloom filter

      A Bloom filter is a set that trades certainty for space. It can tell you that an item is definitely not in the set, or that it probably is (which might be a false positive). The filter doesn't actually store the items, so it's much more compact than a regular set.

      For example, a regular set with 1,000,000 distinct 8-byte strings takes about 64 MB. A Bloom filter for the same strings, with a 1% false positive rate, uses only 1.24 MB (about 10 bits per item) — that's 50 times smaller. The size of the filter doesn't depend on the item size, so the difference gets even bigger with longer strings.

      A Bloom filter often resides in memory and helps minimize expensive I/O operations such as disk reads or network calls. You check if an item is in the filter, and if the answer is "no", you skip the costly lookup. If the answer is "yes", you still have to perform the lookup because it might be a false positive.

      // A filter for 1000 items with a 1% false positive rate.
      filter := bloom.New(1000, 0.01)
      
      filter.Add([]byte("alice"))
      filter.Add([]byte("bob"))
      
      filter.Contains([]byte("alice")) // true
      filter.Contains([]byte("carol")) // false (or, rarely, true)
      

      The filter is sized for the given number of items with a given false positive rate. You can add more, but the false positive rate will go up.

      You can add an item to a Bloom filter and check if an item is in the filter, but you cannot delete an item, count the number of items, or iterate over them.

      How it works

      Bloom filter1 is a large array of m bits, all set to zero at first. To add an item, you compute k hash values for it and set the k bits at those positions:

              ┌──────┐                       ┌───────┐
      item ──►│ hash │──► h1, h2, ..., hk ──►│ mod m │──► i1, i2, ..., ik
              └──────┘                       └───────┘
      
                i1          i2                  ik
      ┌───┬───┬─▼─┬───┬───┬─▼─┬───┬───┬───┬───┬─▼─┬───┐
      │ 0 │ 0 │ 1 │ 0 │ 0 │ 1 │ 0 │ 0 │ 0 │ 0 │ 1 │ 0 │
      └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
        0   1   2                                  m-1
      

      To check if an item is in the filter, you compute the same k hashes and check if all k bits are set:

      • If any of the bits is not set, the item definitely was never added.
      • If all the bits are set, the item was probably added, but it's not guaranteed (the bits could have been set by other items).

              i1          i2                  ik
        

        ┌───┬───┬─▼─┬───┬───┬─▼─┬───┬───┬───┬───┬─▼─┬───┐ │ 1 │ 0 │ 1 │ 0 │ 0 │ 1 │ 1 │ 0 │ 1 │ 0 │ 1 │ 0 │ all 1 → probably in the set └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

        ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 0 │ 1 │ 0 │ 1 │ 0 │ any 0 → definitely not └───┴───┴───┴───┴───┴─▲─┴───┴───┴───┴───┴───┴───┘ in the set (!)

      The k bits are randomly distributed throughout the entire array. When the filter is larger than the CPU cache, each bit access could result in a cache miss, so a lookup may wait on memory k times.

      Unsure uses a blocked Bloom filter2. The bit array is divided into 512-bit blocks, each matching the size of a CPU cache line. When you add or check an item, it is hashed once: part of the hash selects a block, and the rest selects k bits within that block. Each add or check only accesses one cache line, so the filter stays fast even when it's very large.

              ┌──────┐         ┌──► high 32 bits ──► block
      item ──►│ hash │──► h ───┤                   ┌─────────┐
              └──────┘         └──► low 32 bits ──►│ × salts │──► i1, i2, ..., ik
                                                   └─────────┘
      
                block
      ┌───────┬───▼───┬───────┬───────┬───────┬───────┐
      │   0   │   1   │   2   │   3   │  ...  │  n-1  │
      └───────┴───────┴───────┴───────┴───────┴───────┘
              │       │
      ┌───────┘       └───────────────────────────────┐
      │         i1          i2                  ik    │
      ├───┬───┬─▼─┬───┬───┬─▼─┬───┬───┬───┬───┬─▼─┬───┤
      │ 0 │ 0 │ 1 │ 0 │ 0 │ 1 │ 0 │ 0 │ 0 │ 0 │ 1 │ 0 │
      └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
        0   1   2                                  511
      

      In a blocked Bloom filter, some blocks end up with more items than others, which increases the false positive rate. To make up for this, the filter needs to be a bit larger. Compared to a standard Bloom filter, it uses about 3% more memory at a 1% false positive rate, 8% more at 0.1%, and 15% more at 0.01%.

      The filter uses the local wyhash3 implementation for hashing. It performs roughly the same as xxh34 but has a much simpler implementation, without SIMD or assembly.

      Benchmarks

      Here's an excerpt from the full benchmarks5, comparing unsure to bits- and-blooms6 (a classic Bloom filter) and gloom7 (a blocked one) (ns/op, lower is better):

      Operation | Items | unsure | bits-and-blooms | gloom
      ---|---|---|---|---
      Add | 10K | 9 | 37 | 17
      | 1M | 10 | 36 | 19
      | 50M | 38 | 170 | 63
      Contains, hit | 10K | 8 | 32 | 16
      | 1M | 9 | 32 | 18
      | 50M | 34 | 129 | 60
      Contains, miss | 10K | 8 | 41 | 27
      | 1M | 9 | 48 | 33
      | 50M | 34 | 113 | 60

      Memory, bits per item at 10M items (lower is better):

      False positive rate | unsure | bits-and-blooms | gloom
      ---|---|---|---
      10% | 4.84 | 4.80 | 5.39
      1% | 9.90 | 9.59 | 10.79
      0.1% | 15.49 | 14.38 | 16.18

      Unsure is about 4× faster than bits-and-blooms and 2× faster than gloom , using 1–8% more memory than bits-and-blooms and 4–10% less than gloom.

      # Count-min sketch

      A count-min sketch is a frequency table that trades accuracy for space. It tells you approximately how many times each item has appeared. The estimate is never less than the actual count, but it can be higher. The sketch doesn't actually store the items, so it's much more compact than a regular map of per- item counts.

      For example, a regular map counting 1,000,000 distinct 8-byte strings takes about 64 MB. A count-min sketch for the same strings, with estimates within 0.01% of the total count (with 99% probability), uses only 0.55 MB — that's 116 times smaller. The size of the sketch doesn't depend on the number of distinct items or their size, only on the accuracy you choose. So the difference gets even bigger with more or longer strings.

      A count-min sketch is useful when you want to track how many times an item shows up in a large stream of events. It's often used to check if something has happened a certain number of times, like rate-limiting an IP after X requests or sending an alert after an error happens Y times. A sketch can also help decide if a key is worth keeping in the cache given how often it was requested.

      // Estimates within 0.1% of the total count, with 99% probability.
      sketch := countmin.New(0.001, 0.01)
      
      sketch.Add([]byte("alice"))
      sketch.Add([]byte("bob"))
      sketch.AddN([]byte("alice"), 2)
      
      sketch.Count([]byte("alice")) // 3 (or, rarely, more)
      sketch.Count([]byte("bob"))   // 1 (or, rarely, more)
      sketch.Count([]byte("carol")) // 0 (or, rarely, more)
      sketch.Total()                // 4
      

      The sketch uses two settings: epsilon ε and delta δ. If the actual count for any given item is X and the total of all counts is N, then the estimated count for this item will usually be between X and X+ε·N. However, rarely (with a probability of δ) the estimate could be even higher.

      For example, if ε is 0.001, δ is 0.01, and N is 1 million, then the estimate could be off by up to 1,000 (ε·N) with at least 99% probability (1−δ), and by more than 1,000 with at most 1% probability (δ).

      The counting error in a sketch depends on the total of all counts, not on each individual item. Therefore, frequent items are estimated more or less accurately relative to their count, but rare items are not — the absolute error is too high for them.

      You can increase the per-item counter in a sketch and get the estimated count for an item, but you cannot decrease a counter or iterate over the items.

      How it works

      Count-min sketch8 is a table of counters with d rows and w columns, all starting at zero. Each row uses its own hash function that maps an item to one of the w counters. To add an item, you increment its counter in each row:

              ┌──────┐                       ┌───────┐
      item ──►│ hash │──► h1, h2, ..., hd ──►│ mod w │──► i1, i2, ..., id
              └──────┘                       └───────┘
      
             ┌───┬───┬─▼─┬───┬───┬───┬───┬───┬───┬───┐
      row 1  │ 0 │ 2 │ 4 │ 0 │ 1 │ 0 │ 0 │ 3 │ 0 │ 1 │  4 → 5
             ├───┼───┼───┼───┼───┼───┼─▼─┼───┼───┼───┤
      row 2  │ 1 │ 0 │ 0 │ 0 │ 2 │ 0 │ 3 │ 0 │ 1 │ 0 │  3 → 4
             ├───┼───┼───┼───┼───┼───┼───┼───┼─▼─┼───┤
      row d  │ 0 │ 1 │ 0 │ 2 │ 0 │ 0 │ 1 │ 0 │ 5 │ 0 │  5 → 6
             └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
                       i1              i2      id
      

      To estimate an item's count, you take the smallest value from its d counters:

      • Other items might hash to the same counter, so each counter value is ≥ true count.
      • The smallest counter is the one with the fewest collisions, so it's the best estimate.
           ┌───┬───┬─▼─┬───┬───┬───┬───┬───┬───┬───┐
        

        row 1 │ 0 │ 2 │ 4 │ 0 │ 1 │ 0 │ 0 │ 3 │ 0 │ 1 │ 4 ├───┼───┼───┼───┼───┼───┼─▼─┼───┼───┼───┤ row 2 │ 1 │ 0 │ 0 │ 0 │ 2 │ 0 │ 3 │ 0 │ 1 │ 0 │ 3 ├───┼───┼───┼───┼───┼───┼───┼───┼─▼─┼───┤ row d │ 0 │ 1 │ 0 │ 2 │ 0 │ 0 │ 1 │ 0 │ 5 │ 0 │ 5 min = 3 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

      With w = e/ε columns, each counter's error is at most ε·N, with probability at least 1 − 1/e. If you use d = ln(1/δ) rows, the chance that all d of the item's counters exceed its true count by more than ε·N is ≤ δ.

      Unsure uses a conservative update. When you add n to an item, it first finds the current estimate E (the smallest counter), then increases only the counters that are below E+n, leaving the larger ones unchanged. This keeps the same accuracy guarantee, but the actual error is about 2× lower. The tradeoff is that counts can't be decreased.

             ┌───┬───┬─▼─┬───┬───┬───┬───┬───┬───┬───┐
      row 1  │ 0 │ 2 │ 4 │ 0 │ 1 │ 0 │ 0 │ 3 │ 0 │ 1 │  4 → 4
             ├───┼───┼───┼───┼───┼───┼─▼─┼───┼───┼───┤
      row 2  │ 1 │ 0 │ 0 │ 0 │ 2 │ 0 │ 3 │ 0 │ 1 │ 0 │  3 → 4
             ├───┼───┼───┼───┼───┼───┼───┼───┼─▼─┼───┤
      row d  │ 0 │ 1 │ 0 │ 2 │ 0 │ 0 │ 1 │ 0 │ 5 │ 0 │  5 → 5
             └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
      

      Counters are 32-bit instead of the usual 64-bit, so the sketch uses 2× less memory. The item is hashed once, and each row gets its own position from that hash by salting it (multiplying by a random per-row constant).

              ┌──────┐         ┌─────────┐
      item ──►│ hash │──► h ──►│ × salts │──► i1, i2, ..., id
              └──────┘         └─────────┘
      

      The sketch uses wyhash for hashing.

      Benchmarks

      Here's an excerpt from the full benchmarks9, comparing unsure to BoomFilters10 (a classic count-min sketch with 64-bit counters) (ns/op, lower is better):

      Operation | ε | Size (unsure) | unsure | BoomFilters
      ---|---|---|---|---
      Add | 0.001 | 55 KB | 13 | 19
      | 0.00001 | 5.4 MB | 17 | 32
      | 0.000001 | 54 MB | 81 | 98
      Count | 0.001 | 55 KB | 9 | 51
      | 0.00001 | 5.4 MB | 14 | 64
      | 0.000001 | 54 MB | 52 | 139

      Accuracy at ε=0.0001, N=10M additions over 1M distinct items, mean overestimate (lower is better):

      Distribution | unsure | BoomFilters
      ---|---|---
      Uniform | 139 | 302
      Zipf, s = 1.1 | 23 | 44
      Zipf, s = 1.5 | 0.3 | 0.8
      Size | 536 KB | 1080 KB

      Unsure is about 1.5× faster for Add and 4× faster for Count, using 2× less memory with 2–2.7× lower error.

      # HyperLogLog

      HyperLogLog is a unique items counter that trades accuracy for space. It tells you approximately how many distinct items it has seen, no matter how many times each one appeared. HyperLogLog (also called a sketch from here on) doesn't actually store the items, so it's much more compact than a regular set.

      For example, a regular set of 1,000,000 distinct 8-byte strings takes about 64 MB. A HyperLogLog sketch counting the same strings with about 0.8% error uses only 16 KB — that's almost 4,000 times smaller. The size of the sketch doesn't depend on the number of items or their size, only on the accuracy you choose. A 16 KB sketch counts a billion items as accurately as a thousand.

      HyperLogLog is useful when you need to count unique things in a large stream: unique visitors to a website, unique search queries per day, or distinct values in a database column.

      // Standard error about 0.8% of the true count.
      sketch := hll.New()
      
      sketch.Add([]byte("alice"))
      sketch.Add([]byte("bob"))
      sketch.Add([]byte("alice"))
      sketch.Add([]byte("carol"))
      
      sketch.Count() // 3 (approximately)
      

      You can merge sketches to gather data from multiple machines or segments (like by hour, page, or region). When you merge two sketches, you get the total number of unique items from both, without counting shared items twice.

      home := hll.New() // visitors to the home page
      docs := hll.New() // visitors to the docs
      // ...
      home.Merge(docs)
      home.Count() // visitors to either page
      

      The sketch has one setting: the precision p , which gives a relative standard error (stdErr) of 1.04/√(2^p). A common default is p=14, which gives 0.81% error.

      With p=14 and 1 million distinct items:

      • 68% of the time the estimate is within 0.81% (8,100) of the true count,
      • 95% within 1.6% (2·stdErr),
      • 99.7% within 2.4% (3·stdErr).

      The error is relative to the count, so the standard error is the same 0.81% for a thousand items or a billion.

      You can add items to a sketch, get the estimated count, and merge sketches. You cannot check if a specific item was added, remove items, or list them.

      How it works

      HyperLogLog11 is based on a simple observation. If you hash items to random bit strings, about half of them start with 1, a quarter with 01, an eighth with 001, and so on. Seeing a hash with k leading zeros suggests there were about 2^(k+1) distinct items. Duplicates hash to the same value, so they don't affect the result.

      A single observation is unreliable, so the sketch divides the items into m = 2^p groups, where p is the selected precision. The first p bits of the hash pick a group (a register), and the register keeps the highest rank (leading zeros plus one) it has seen in the rest of the hash:

              ┌──────┐   ┌──────────┬────────────────────────┐
      item ──►│ hash │──►│ 01101001 │ 0001101...             │
              └──────┘   └────┬─────┴───────────┬────────────┘
                              │ register i      └ rank = 3 zeros + 1 = 4
                ┌───┬───┬───┬─▼─┬───┬───┬───┬───┬───┬───┐
      registers │ 3 │ 0 │ 5 │ 2 │ 1 │ 0 │ 4 │ 2 │ 0 │ 1 │  2 → 4
                └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
      

      The count is estimated from all the registers together, using a harmonic mean of 2^register. The standard error is about 1.04/√m. Merging two sketches is just taking the maximum value from each pair of registers.

      The original estimator is biased when dealing with small counts (up to a few times m), so in these cases it uses a different formula called linear counting. This switch creates a sudden change in error, and some implementations (like HyperLogLog++12) address it by using large tables of bias corrections based on real data.

      Unsure uses the improved estimator by Otmar Ertl13. Instead of a harmonic mean of the registers, it works from a histogram : how many registers have value 0, value 1, and so on. A formula applied to the histogram gives an accurate estimate for any number of items, from zero to billions, so there's no need for a separate formula for small counts or for correction tables.

      The sketch updates the histogram whenever registers change. Most adds don't change any registers, so this is almost free. Counting always takes the same amount of time, no matter how big the sketch is. Other implementations scan all the registers on every count, which takes from microseconds to milliseconds.

      Registers are one byte each, and the histogram has 64 four-byte counters (256 bytes). The item is hashed once with wyhash , and the 64-bit hash is split into the register index and the rank.

      Benchmarks

      Here's an excerpt from the full benchmarks14, comparing unsure to axiom15 (HyperLogLog with LogLog-Beta estimator and sparse mode) (ns/op, lower is better):

      Operation | p | Size | unsure | axiom
      ---|---|---|---|---
      Add | 10 | 1 KB | 5.5 | 7.6
      | 14 | 16 KB | 5.6 | 7.6
      | 18 | 256 KB | 8.1 | 7.9
      Count | 10 | 1 KB | 68 | 18,300
      | 14 | 16 KB | 62 | 350,000
      | 18 | 256 KB | 57 | 4,710,000
      Merge | 10 | 1 KB | 730 | 1,710
      | 14 | 16 KB | 20,100 | 58,600
      | 18 | 256 KB | 341,000 | 951,000

      Accuracy at p=14 (0.81% standard error), relative RMSE over 100 sketches (lower is better):

      Distinct items | unsure | axiom
      ---|---|---
      1,000 | 0.63% | 0.02%
      40,000 | 0.64% | 0.71%
      1,000,000 | 0.79% | 0.89%

      Memory at p=14 after adding the given number of distinct items (lower is better):

      Distinct items | unsure | axiom
      ---|---|---
      100 | 16 KB | 1.2 KB
      1,000 | 16 KB | 4.2 KB
      10,000 | 16 KB | 16 KB
      1,000,000 | 16 KB | 16 KB

      Unsure adds about as fast as axiom , counts 270–83,000× faster, and merges 2.3–2.9× faster, with the same accuracy and memory for counts above the number of registers. When there are fewer items than registers, axiom 's sparse mode makes it more accurate and compact.

      # T-digest

      A t-digest is a summary of a stream of numbers that trades accuracy for space. It can give you an approximate median, 99th percentile, or any other quantile of the data. It can also estimate what fraction of the numbers are below a certain value (the CDF). The digest doesn't actually store the numbers, so it's much more compact than a sorted list.

      For example, to find the exact 99th percentile of 1,000,000 numbers, you'd have to keep all of them. With 64-bit floats, that takes 8 MB. A t-digest estimates the same percentile within about 0.03% of the rank (between the 98.97th and the 99.03rd percentile) using only 8 KB — 1,000 times smaller. The size of the digest doesn't depend on the number of values, only on the accuracy you choose. An 8 KB digest summarizes a billion values as well as a million.

      A t-digest is useful when you need quantiles over a large stream: latency percentiles for a service, the distribution of request sizes or prices, or the outlier thresholds in sensor data.

      // Response times in milliseconds.
      digest := tdigest.New()
      
      digest.Add(12.5)
      digest.Add(8.1)
      digest.Add(130.0)
      // ...
      
      digest.Quantile(0.5)  // median
      digest.Quantile(0.99) // 99th percentile
      digest.CDF(100)       // fraction of responses faster than 100 ms
      

      You can merge digests to gather data from multiple machines or segments (like by hour, endpoint, or region). A merged digest estimates the percentiles of all values, but with less accuracy than individual digests do.

      east := tdigest.New() // latencies on one server
      west := tdigest.New() // latencies on another
      // ...
      east.Merge(west)
      east.Quantile(0.99) // 99th percentile across both servers
      

      The digest has one setting: the compression δ , which limits the number of centroids (see How it works below) to δ+2. A common default is δ=100, which takes 8 KB. Increasing δ uses more memory but reduces estimation error.

      The error is measured in ranks: a rank error of 0.03% at quantile q=0.99 means the value returned by Quantile(0.99) is somewhere between the 98.97th and the 99.03rd percentile of the actual values. Tail estimates, such as q=0.99 or q=0.999, are more accurate than the median (q=0.5).

      You can add numbers to a digest, estimate quantiles and the CDF, and merge digests. You cannot remove numbers or list them.

      How it works

      T-digest16 summarizes the numbers as a sorted list of centroids. Each centroid has a mean and a weight — the number of values it represents. To estimate a quantile, the digest finds the centroids around the requested rank and interpolates between their means.

      The trick is in how big the centroids are allowed to grow. A scale function k(q) maps a quantile q to a number from -δ/4 to δ/4, and each centroid may only span 1 unit of k: if a centroid covers the quantiles from q₁ to q₂, then k(q₂) − k(q₁) ≤ 1.

      The arcsine scale function, k(q) = δ/(2π)·asin(2q-1), is steep near q=0 and q=1 and flat near the median. This means the centroids it produces are larger in the center and smaller at the ends:

      weight
        │                ┌──┐
        │             ┌──┤  ├──┐
        │          ┌──┤  │  │  ├──┐
        │       ┌──┤  │  │  │  │  ├──┐
        │  ┌─┬──┤  │  │  │  │  │  │  ├──┬─┐
        └──┴─┴──┴──┴──┴──┴──┴──┴──┴──┴──┴─┴──► value
          min      q=0.25   median  q=0.75     max
      

      With 1M values and δ=100, the centroids around the median hold about 27,000 values each, those around the 99th percentile about 5,000, and the outermost ones about 500. This keeps the error near the tails small.

      Unsure is the merging t-digest from the Dunning and Ertl paper. New values go to a buffer of 5·δ numbers. When the buffer is full, the digest sorts it and merges it with the centroids (already sorted) in a single pass, building new centroids from left to right as long as each one fits within its span of k. Every other pass goes right to left, so that neither tail ends up with fuller centroids. Quantile, CDF and Merge flush the buffer first.

      The centroids are kept in two fixed arrays of δ+2 entries (the current list and the next one being built), along with the cumulative weights for a binary search in Quantile and CDF. With δ=100, that's 16·102·2 + 8·103 bytes for the centroids, and 8·500 bytes for the buffer, about 8 KB in total.

      Centroids with weight 1 are treated as exact values rather than spread around their mean, and the exact minimum and maximum are used at the ends. So digests with few values give exact results, and Quantile(0) and Quantile(1) are always exact.

      Benchmarks

      Here's an excerpt from the full benchmarks17, comparing unsure to influxdata18 (merging t-digest with the same scale function) (ns/op, lower is better):

      Operation | δ | unsure | influx
      ---|---|---|---
      Add | 50 | 44 | 78
      | 100 | 49 | 86
      | 500 | 59 | 105
      Quantile | 50 | 11 | 13
      | 100 | 13 | 13
      | 500 | 15 | 16
      Merge | 50 | 296 | 2,060
      | 100 | 630 | 4,330
      | 500 | 2,720 | 23,950

      Accuracy at δ=100, mean rank error over 1M normal values (lower is better):

      Digest | Quantile | unsure | influx
      ---|---|---|---
      Single | 0.5 | 0.007% | 0.015%
      | 0.99 | 0.018% | 0.016%
      | 0.999 | 0.011% | 0.009%
      Merged | 0.5 | 0.055% | 0.037%
      | 0.99 | 0.023% | 0.021%
      | 0.999 | 0.006% | 0.016%

      Memory at δ=100 (lower is better): unsure 8.5 KB, influxdata 14.4 KB.

      Unsure adds values about 1.8× faster than influxdata , queries at the same speed, merges 7–9× faster, and uses 40% less memory at about the same accuracy.

      # Top-k sketch

      A Top-k sketch finds the k most frequent items in a stream (the "heavy hitters"), along with their approximate counts. It uses a fixed amount of memory based only on k, no matter how many different items are in the stream.

      To find the exact top items, you'd have to count every unique item, for example with a map of per-item counts. With millions of distinct items, that takes tens or hundreds of megabytes. A Top-k sketch for the top 1000 items takes about 360 KB, and it usually finds all of them.

      A Top-k sketch is useful when you want to identify the "hottest" data: the most requested URLs, the most active users, or the most common search queries. Unlike a count-min sketch, it keeps the actual items, so it can list them.

      // Track the 2 most frequent items.
      sketch := topk.New(2)
      
      sketch.Add([]byte("alice"))
      sketch.Add([]byte("bob"))
      sketch.Add([]byte("carol"))
      sketch.AddN([]byte("alice"), 4)
      sketch.AddN([]byte("carol"), 2)
      
      sketch.Top()                  // [{alice 5} {carol 3}]
      sketch.Count([]byte("alice")) // 5
      sketch.Count([]byte("bob"))   // 0 (not in the top 2)
      sketch.Total()                // 9
      

      Top returns up to k items, from the most frequent to the least frequent. Counts are estimates: they're usually exact for the most frequent items, but may be slightly lower than the actual count for less common items.

      The sketch works best when the stream is skewed, meaning a few items appear much more often than the others. This is common in real situations. If all items are about equally frequent, there is no clear top k, and the results become less accurate.

      You can add items to the sketch and get the top items with their counts, but you can't decrease counts or check items that aren't in the top k.

      How it works

      HeavyKeeper19 is a table of buckets that estimates item counts. It has d rows and w columns, and each item maps to one bucket in each row. Each bucket holds a fingerprint of the item and a count. To add an item, you update its bucket in each row:

      • If the bucket is empty or owned by the item, increase its count.
      • If the bucket is owned by another item, decay it: decrease its count by 1 with probability b^count (b < 1). When the count reaches 0, the new item takes over the bucket with a count of 1.
              ┌──────┐
        

        add x ──► │ hash │──► h ──► high 32 bits ──► fingerprint = 7 └──────┘ │ │ map to buckets ┌──┴────────────┐ ┌───────┬───▼───┬───────┬───│───┬───────┐ row 1 │ │ fp=7 │ fp=3 │ │ │ fp=5 │ column 2 is owned by x: │ │ 41 │ 2 │ │ │ 980 │ 41 → 42 ├───────┼───────┼───────┼───▼───┼───────┤ row 2 │ fp=9 │ │ │ fp=2 │ fp=4 │ column 4 is owned by another: │ 17 │ │ │ 3 │ 1 │ 3 → 2 with probability b^3 └───────┴───────┴───────┴───────┴───────┘ col 1 col 2 col 3 col 4 col 5

      The item's estimated count is the largest count among its buckets. Frequent items quickly reach counts that make decay very unlikely, so they keep their buckets. Rare items keep replacing each other without affecting the frequent ones. An item that becomes frequent later in the stream can still outnumber a less frequent owner and take over its bucket.

      Next to the table, the sketch keeps a min-heap with the k items that have the largest estimates so far. After an item's buckets are updated, if its estimate is larger than the smallest count in the heap, the item is added to the heap, and the smallest item is removed. If the item is already in the heap, its count is increased.

                         ┌───────────┐
      add x (15) ───────►│ bob    12 │  the root has the smallest count
                         └─────┬─────┘
                    ┌──────────┴────────┐
              ┌─────┴─────┐       ┌─────┴─────┐
              │ alice  30 │       │ dave   14 │  15 > 12: x replaces bob at the root
              └─────┬─────┘       └───────────┘  15 > 14: x moves down, dave moves up
            ┌───────┴──────┐
      ┌─────┴─────┐  ┌─────┴─────┐
      │ eve   980 │  │ fay    41 │
      └───────────┘  └───────────┘
      

      Unsure uses d = 2 rows of max(16k, 256) buckets, and a decay base of b = 0.8. The probabilities b^count are precomputed as 64-bit thresholds, so decay is cheap: the count c decreases if a random number is below the c-th threshold.

      The original HeavyKeeper uses b = 1.08⁻¹ ≈ 0.93, and more rows. A smaller b lets frequent items lock their buckets faster, which makes the sketch more precise on flat streams. However, if b is too small (like 0.5), the first items to claim buckets keep them permanently, so items that become frequent later are never counted, even if they end up being the most frequent. Using b = 0.8 keeps most of the precision and still catches most late-arriving frequent items. As for the rows, two are enough to protect frequent items from collisions in a single row, and adding more rows only makes the sketch slower.

      The item is hashed once. The hash is mapped to a position in each row by salting it (multiplying by a random per-row constant). The fingerprint is the top 32 bits of the hash. The heap uses the 64-bit hash to identify items, so it doesn't compare the actual item bytes.

      Each bucket is 8 bytes (a 32-bit fingerprint and a 32-bit count), so the table takes 256·k bytes. The heap takes about 100 bytes per item plus the item itself.

      The sketch uses wyhash for hashing and wyrand for random numbers.

      Benchmarks

      Here's an excerpt from the full benchmarks20, comparing unsure to keiler21 (HeavyKeeper with b = 0.9 and d = ln k) and dgryski22 (Filtered Space-Saving23) on the Zipf s=0.8 stream (time/op, lower is better):

      Operation | k | unsure | keiler | dgryski
      ---|---|---|---|---
      Add | 10 | 24 ns | 64 ns | 59 ns
      | 100 | 25 ns | 84 ns | 70 ns
      | 1000 | 33 ns | 130 ns | 73 ns
      Top | 10 | 0.34 µs | 0.64 µs | 0.77 µs
      | 100 | 3.7 µs | 13 µs | 14 µs
      | 1000 | 75 µs | 270 µs | 292 µs

      Precision is the fraction of the reported top k that is in the true top k (higher is better):

      k | Zipf s | unsure | keiler | dgryski
      ---|---|---|---|---
      100 | 0.6 | 0.90 | 0.38 | 0.19
      | 0.8 | 1.00 | 0.78 | 0.85
      | 1.0 | 0.99 | 1.00 | 1.00
      | Size | 39 KB | 27 KB | 39 KB
      1000 | 0.6 | 0.97 | 0.70 | 0.52
      | 0.8 | 1.00 | 0.98 | 1.00
      | 1.0 | 1.00 | 1.00 | 1.00
      | Size | 364 KB | 414 KB | 453 KB

      Count error is the mean of |estimate − true| / true over the reported items (lower is better):

      k | Zipf s | unsure | keiler | dgryski
      ---|---|---|---|---
      100 | 0.6 | 14% | 94% | 428×
      | 0.8 | 0.10% | 46% | 230%
      | 1.0 | 0.01% | 0.12% | 0.0%
      1000 | 0.6 | 2.4% | 62% | 18×
      | 0.8 | 0.23% | 1.9% | 0.31%
      | 1.0 | 0.05% | 0.24% | 0.02%

      Unsure is 2–4× faster than the others for Add and 1.8–4× faster for Top. On flat streams (s=0.6), it finds the true top k with 90–97% precision, while keiler drops to 38–70% precision with a count error of 62–94%, and dgryski to 19–52% with counts 18× or more too high. On skewed streams (s=1.0), all three are about equally accurate.

      # Wrapping up

      As engineers, we usually want exact answers from our data. But sometimes, allowing a bit of uncertainty can cut memory usage by tens, hundreds, or even thousands of times. That's where probabilistic data structures come in:

      • Bloom filter checks if an item might be in a set.
      • Count-min sketch estimates how many times each item has occurred.
      • HyperLogLog estimates the number of distinct items.
      • T-digest estimates quantiles of a stream of numbers.
      • Top-k sketch identifies the most frequent items in a stream.

      To use them in Go, try the __nalgeon/unsure package:

      go get github.com/nalgeon/unsure
      

      1. Space/time trade-offs in hash coding with allowable errors by Burton H. Bloom, 1970. ↩︎

      2. Cache-, hash-, and space-efficient Bloom filters by Felix Putze et al., 2009. ↩︎

      3. Reference wyhash implementation by Wang Yi. ↩︎

      4. Reference xxHash implementation by Yann Collet. ↩︎

      5. Bloom filter benchmarks. ↩︎

      6. bits-and-blooms/bloom by Daniel Lemire. ↩︎

      7. jcalabro/gloom by Jim Calabro. ↩︎

      8. An improved data stream summary: the count-min sketch and its applications by Graham Cormode and S. Muthukrishnan, 2005. ↩︎

      9. Count-min sketch benchmarks. ↩︎

      10. tylertreat/BoomFilters by Tyler Treat. ↩︎

      11. HyperLogLog: the analysis of a near-optimal cardinality estimation algorithm by Philippe Flajolet et al., 2007. ↩︎

      12. HyperLogLog in practice by Stefan Heuleet et al., 2013. ↩︎

      13. New cardinality estimation algorithms for HyperLogLog sketches by Otmar Ertl, 2017. ↩︎

      14. HyperLogLog benchmarks. ↩︎

      15. axiomhq/hyperloglog by Axiom. ↩︎

      16. Computing extremely accurate quantiles using t-digests by Ted Dunning and Otmar Ertl, 2019. ↩︎

      17. T-digest benchmarks. ↩︎

      18. influxdata/tdigest by InfluxData. ↩︎

      19. HeavyKeeper: An Accurate Algorithm for Finding Top-k Elephant Flows by Junzhi Gong et al., 2018. ↩︎

      20. Top-k benchmarks. ↩︎

      21. keilerkonzept/topk by KEILERKONZEPT. ↩︎

      22. dgryski/go-topk by Damian Gryski. ↩︎

      23. Efficient Computation of Frequent and Top-k Elements in Data Streams by Ahmed Metwally et al., 2005. ↩︎

    7. 🔗 smol-machines/smolvm smolvm v1.34.4 release

      What's Changed

      • docs: say that virtiofs DAX is off on arm64 hosts and SMOLVM_MOUNT_DAX does nothing there by @BinSquare in #2087
      • Add smolvm docker: one command starts a Docker engine in a managed machine and points docker at it by @BinSquare in #2089
      • Share the home directory with the smolvm docker machine at the same path by @BinSquare in #2090
      • Resolve host.docker.internal to the host from smolvm docker containers by @BinSquare in #2091
      • Fix a port race in the leader-exit test by @BinSquare in #2096
      • Remove smolvm docker by @BinSquare in #2095
      • Hand supplied credential values to a running embedded machine at once by @BinSquare in #2097
      • Pin libkrunfw with UDP kept inside a TSI guest, and test it by @BinSquare in #2099
      • Publish ports below 1024 on macOS, add IPv6 loopback to live-forwarded ports, and lift the 64-mapping cap by @BinSquare in #2092
      • Return idle guest memory to the host within two minutes and cap new machines at half the host's RAM by @BinSquare in #2094
      • Install a root-owned agent-rootfs when root runs install.sh by @rdslw in #2082
      • Announce a changed file to the guest once per change by @BinSquare in #2102
      • Answer guest DNS from a host cache that coalesces bursts and resends lost queries by @BinSquare in #2098
      • Keep every disk chain under the branch depth limit: fold restored checkpoint layers and frozen-source chains by @BinSquare in #2103
      • Exec sessions: commands the node owns, resumable after a dropped connection by @BinSquare in #2101
      • Let a guest hold tens of thousands of connections on virtio-net and free their host sockets promptly by @BinSquare in #2104
      • Scope the usage journal to the test's own thread by @BinSquare in #2106
      • Pin libkrun 526be460 and libkrunfw f290c62b, rebuilt for every platform by @BinSquare in #2109
      • Build the agent rootfs as non-root on hosts with user namespaces again by @BinSquare in #2107
      • Answer a start missing the mediated interceptor with 400, not 500 by @BinSquare in #2108
      • Run tests that need a released file lock free at once in their own process by @BinSquare in #2110
      • Pin libkrun 9df62257 and libkrunfw 7f4d4950, rebuilt for every platform by @BinSquare in #2113
      • Stop resetting virtio-net connections a server closes first by @BinSquare in #2118
      • Upgrade rusqlite to 0.41 for the patched bundled SQLite (RUSTSEC-2026-0459) by @BinSquare in #2128
      • Keep a host memory reserve VMs cannot take and charge branch children for growth by @BinSquare in #2127
      • Ask before stopping a machine on delete, so a refused or declined delete leaves it running by @connorburgess in #2131
      • Prepare SmolVM v1.34.1 for release by @BinSquare in #2135
      • Bring a soft open-file limit above kern.maxfilesperproc down to the cap on macOS, so the limit raise_nofile_limit reports is the one in force by @connorburgess in #2132
      • Leave no data directory behind when exec, status or stop name a machine that does not exist by @connorburgess in #2129
      • Warn when --block-private keeps a named host unreachable by @BinSquare in #2146
      • Register Rosetta itself as the x86_64 interpreter when the host answers its start-up ioctl by @BinSquare in #2148
      • Make a mounted host directory belong to the workload user so a non-root workload can write to it by @BinSquare in #2149
      • Record the image platform on the machine so a Rosetta machine can be created from an amd64 image by @BinSquare in #2147
      • Bump libkrun so a Rosetta machine runs amd64 programs directly and a macOS machine stops promptly by @BinSquare in #2150
      • Keep a cache disk's chain on its shared base when compaction shortens it by @BinSquare in #2145
      • Satisfy Rust 1.100's needless_bool lint in connect_in_progress on Windows by @BinSquare in #2154
      • Bound branch admission and reported capacity by the VM slice's memory limit, not just host free memory by @BinSquare in #2152
      • Stop throttling the VM slice and reclaim it from the pressure guard instead by @BinSquare in #2153
      • Release a paused branch child's VM lock so the memory pressure guard can resume it by @BinSquare in #2157
      • Keep a restored machine's local image on its storage disk instead of mounting the capturing host's archive by @BinSquare in #2163
      • Update quinn-udp to 0.5.16 for RUSTSEC-2026-0538 by @BinSquare in #2165
      • Count every symlink with one mode in the agent rootfs digest so a Mac checkpoint restores on Linux by @BinSquare in #2162
      • Carry guest traffic in 64 KB frames over the gateway link so downloads use a quarter of the CPU by @BinSquare in #2168
      • Pin libkrun 518949b4 and libkrunfw 0fae3853, rebuilt for every platform by @BinSquare in #2169

      New Contributors

      Full Changelog : v1.34.0...v1.34.4

    8. 🔗 r/LocalLLaMA llama.cpp v1.0 is here 🦙 rss

      llama.cpp v1.0 is here 🦙 | Hey folks, it's Merve from Hugging Face. Today, llama.cpp releases v1! Moving forward, we’ll keep covering every platform and every model type, while keeping llama.cpp robust and lean for downstream applications that build on it. While I'm here, want to announce that we've been shipping Llama desktop apps to lower the barrier of entry to local AI to few clicks, built-on llama.cpp. I will leave link to the details for both v1 and apps in comments. Many thanks for all the love you've shown to llama.cpp for years 🦙❤️ Cheers! edit: adding links here, hope to not get penalized blog: https://huggingface.co/blog/ggml-org/llama-cpp-v1 llama desktop apps are here https://llama.app/ ❤️ submitted by /u/unofficialmerve
      [link] [comments]
      ---|---

    9. 🔗 backnotprop/plannotator v0.28.63 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.62 | Agents started from the Inbox now work on Windows, pick a model and effort when you start an agent, rules for your agents, written in your own words, post a thread's decisions on its pull request, the Inbox loads faster on a slow connection
      v0.28.61 | Updates now update the Claude Code plugin too, an agent's chosen face shows on every icon of it, filter the Inbox list by pull request state, Modern dark shows section bands and the Reply button, one conversation no longer shows as two agents
      v0.28.60 | Click a word to highlight it, a one-time Themes dialog, Settings → Rows rebuilt, tell your agent how you want your rows, starred threads as pills above the list, a pill for new messages out of view, a half-circle face picker with ten Glass colours, a new phone sidebar and reply box
      v0.28.59 | A quieter Agents section in the sidebar, machine names only when agents run on more than one machine, agent icons that are always gently alive and lean toward your pointer
      v0.28.58 | Start Codex from New message, an Agents section in the sidebar, start an agent in a folder on any drive, play audio attachments and comment at a moment, Claude Code's Plannotator tools work on Windows
      v0.28.57 | Pin artifacts, and see every artifact on one page, filter the list by project, date or agent, a thread shows its pull requests and their state, choose what the sidebar shows, and in what order, Ask AI starts from Side in the selection bar
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews

      What's New in v0.28.63

      TL;DR

      • New: Pair Grok Bot and other cloud agents from Settings
      • New: Hermes Agent, OpenClaw and Muse Code can use the Inbox
      • New: Add a thread to Priority to keep it on top
      • New: Tag threads, and find each tag in the sidebar
      • Off by default: Pull requests board as a table, with bulk Merge

      0.28.63 brings personal and cloud agents into the Inbox. You can pair an agent that runs somewhere else, such as Grok Bot or Muse by Meta, and Hermes Agent, OpenClaw and Muse Code can now message you from the same computer. The Inbox also gets Priority, tags, replies that quote what they answer, and OpenCode in New message. It has 81 PRs. Three come from external contributors, and one of those is a first contribution: welcome @mauricedesaxe.

      Personal and cloud agents

      Pair a cloud agent from Settings

      A cloud agent is an agent that runs somewhere other than your computer: a Claude Code routine, Grok Bot, Muse by Meta, a Hermes Agent or OpenClaw server, or any other agent you can send a message to. Settings → Cloud agents pairs one. Pick its kind, give it a name, and copy the one message Plannotator shows you. The message is shown only once. Send it to the agent and it sets itself up from a public page on plannotator.ai. A Claude Code routine gets three short pieces for its settings instead. The card then says "Waiting for to connect…" until the agent's first call, and "Connected" after that.

      Once paired, the agent shows in New message's To list and in the sidebar's Agents. It can start threads, read the threads it started, was sent or was tagged in, and answer in them. It cannot answer your questions, approve anything, run anything on your computer, open your files, or read any other thread. Its messages pass through Plannotator's relay sealed end to end, so the relay cannot read them. If your computer is asleep, a read says so and a send waits at the relay until the computer is back.

      To have the agent start when you write to it, add its wake address and key, then press Send a test. The thread then shows a line such as "Woke Nightly fixer · run started". Without a wake address the agent checks for new messages by itself, and your reply reads "Saved for …" and then "Delivered", like a reply to Muse Code or Cursor. Muse by Meta has no wake address, so it always checks by itself. New pairing stops the old pairing at once, and Remove cuts the agent off. A How does this work? button beside the section's title opens a five-step walk-through in pictures.

      The section appears once the Inbox has reached the relay. #3138, #3178, #3187, #3197, #3212, #3223, #3254, #3270

      Hermes Agent, OpenClaw and Muse Code on your computer

      Three more agents can use the Inbox from the same computer.

      • Hermes Agent (Nous Research) gets the plannotator_inbox tool through a new plugin, and your reply comes back into the Hermes session that asked, as a new turn. Only your own sessions get it: the terminal, the TUI, the Desktop app and your own direct messages. Install it with hermes plugins install backnotprop/plannotator/apps/hermes-plugin --enable, then run plannotator inbox once to turn the tool on. That line installs the plugin from this repository's main branch; the plugin's README explains the reply switch plannotator inbox turns on, and how to turn it off. #3217, #3238, #3249
      • OpenClaw gets the tool in your own chats only: OpenClaw on this computer and your own direct messages, never a shared chat or a channel. Your reply arrives in the same chat as a new message, once. It needs OpenClaw 2026.11.5-beta.1 or newer. The @plannotator/openclaw package is not on npm yet; the plugin's README shows how to install it from a checkout of this repository today. #3216, #3251, #3263
      • Muse Code (Meta's coding agent in the terminal) is connected when you run plannotator inbox. Its messages show as Muse Code, with Muse's own mark. Replies don't start a Muse turn, so Muse reads your answer on its next turn, as Gemini CLI and Cursor do. #3209, #3262

      Each has a row in Settings → Agents and a mark of its own in the sidebar, the list and the To list. The Inbox tool for Hermes Agent and OpenClaw starts off until plannotator inbox or Settings → Agents turns it on.

      After two days of use, a one-time dialog says that your personal agents are welcome in the Inbox, with Connect one , which opens Settings → Cloud agents. It shows only while none is connected. #3280

      Starting and managing agents

      • Start OpenCode from New message. To offers "OpenCode · New session" next to Claude Code, Codex and Pi, with a model and a variant (OpenCode's word for effort). Replies, Stop, the run line and Open in Terminal work as they do for Pi and Codex. It needs OpenCode 2 and the Plannotator OpenCode plugin from this release. #3186
      • Pick Codex's model and effort. The "Default model" button now works for Codex too, and Effort shows only the levels the picked model takes. #3177
      • Find a model in a long list. When the Model column lists more than 8 models, it starts with a "Find a model" field that narrows the list as you type, the way Pi's own model selector matches. #3200
      • A machine switch in To. With a linked machine, the top of New message's To list has one button per machine, with how many agents run there. Pick one to see what runs there and what you can start; an asleep machine says since when. #3257
      • Stop and Delete from the sidebar. An agent the Inbox started now has "Stop" and "Delete … session…" in its sidebar menu. Delete asks in a dialog, and its "Also archive its N threads" box is off by default. #3241
      • Rename an agent. Right-click an agent in the sidebar, or use its ⋯, and choose Rename…. The name shows everywhere the Inbox names that agent. Agents still see their own labels. #3180
      • Linked machines keep their own marks. An agent's icon and name, and a star on a thread, now live on the machine the agent or thread belongs to, so every linked window shows the same one. Starring another machine's thread used to fail with "No thread". #3234, #3246
      • Starting agents on a linked machine. Four fixes: the "+" tip no longer names the machine twice, "+" no longer opens an empty To for an asleep machine this page never read, picking an agent kind only another machine has now starts it there, and the Board's New card lists only this Inbox's projects. #3233
      • A Claude Code turn that ends in an error says so. When a session the Inbox started hits a credit, sign-in or rate-limit error, the thread gets one note with Claude Code's own words and a Try again button. A notification follows for Claude Code, Codex and Pi, under the same rules as a question's notification. #3184, #3195
      • Claude Code in VS Code's chat panel. Sessions in the Claude Code extension's panel now get the Inbox tool and are woken by your replies, as in the terminal. This has not yet been tried in a real VS Code panel. #3151, toward #3111 by @Qwenjin

      Plannotator Inbox

      Priority

      The row menu, the phone's long-press sheet and a thread's ⋯ menu have Add to Priority. The thread moves to a Priority section at the top of the list, shown only when it holds a thread, and stays there until you remove it or archive it. Its row keeps all its marks. A toast offers Undo.

      An agent can also mark a thread with send_message's new priority: true, or take the mark out with priority: false. Its instructions say to follow you: use it when you said something matters most to you, and take it out when that is over. An agent's mark is the same as yours, and you can remove it at any time. Agents never see which threads are in Priority. #3232, #3277

      A one-time dialog, "Put a thread first in your list", shows how to add a thread to Priority. It comes the day after an update at the earliest, and only if you have never used Priority. #3286

      Tags

      A thread can now have tags. Add tag is in a row's menu and a thread's ⋯ menu: find a tag, tick it, or type a new name. Tags get their own section in the sidebar, under Starred, with each tag's waiting count; a click lists that tag's threads. Right-click a tag to rename or delete it, with Undo. Typing #Name in your own reply tags the thread too.

      On the Board, "Initiative" is now "Tag", and a Board card's tag is the same tag a thread has. Existing initiatives show up as tags, with nothing to move. Agents never see a thread's tags. #3228, #3272

      Reply with a quote

      Press ↩ on an older message, and the reply box gets one quiet line with that message's author, time and first words. Select words in a message first, and the line quotes those words instead. Your own messages get ↩ too. The sent reply shows the same line, which takes you back to the original. The agent reads which message, or which words, you answered. A plain Reply is unchanged. #3160, closing #3109 by @Arobotmaster

      See which session wrote what

      A thread that several agent sessions wrote in used to show only a people icon and a count. The header now shows the sessions' marks and "N sessions"; hover, tap or focus it to see each session's name and state ("waiting on you", "working", "idle", "ended"), and click a name to filter the list to it. Each message in such a thread leads with its session's name. #3163, closing #3108 by @zane668

      Comments

      • On your own messages and on questions. Select words in your own earlier message, or in any part of a question card (the prompt, the context, a choice), to comment on them. A comment never answers or settles a question, and a click on a choice still picks it. #3176
      • Files, voice and a kept draft. The comment card now takes any file, not only pictures, and has the reply box's microphone. A global comment's words and files are kept while you write, so a reload or another window opens the card with them. #2862 by @iurysza
      • Send waits for comments still saving. On a slow connection, a Send pressed while a comment was still saving went out without it, and the comment stayed behind as a draft. Send now waits, so one reply carries every comment. A review's verdict waits the same way. #3240

      Bitbucket pull requests on threads

      An agent can now attach a Bitbucket Cloud pull request to its thread by its URL. The row and the header show its state, checks and review, a Bitbucket PR link in a message gets a hover card, and a Board card moves to Done once its PR is merged. Bitbucket has no CLI, so the new config key bitbucketTokenCommand can read the token from a command, such as one that reads your Keychain, instead of from an environment variable or a plain-text file. The token stays in memory and never reaches the agents the Inbox starts. #3076 by @uvw, closing #3075 by @uvw

      More in the Inbox

      • Filter to Not seen. The list's Filter menu has a new first row, Not seen , that shows only the bold threads. #3226
      • Accept recommended steps aside while you type. On a phone it sat just above the keyboard's Done, and one stray tap replaced your answer. It now hides while you type in a question's fields, keeps your Other… words, and adds Undo to the card's status line. #3268
      • Your reply box is yours. A draft that arrives late, or from another device, no longer drops into a reply box you already opened. It waits beside the box as Restore draft. #3250
      • HTML files open in Interact. An HTML file beside a thread now opens with the pen off, so a click does what the page says. Turn Annotate on and it stays on as you move through the thread's files. ] and [ step between files from inside a page too. #3235
      • Arrow keys between attachments. With focus on one of a message's file tiles, the arrow keys move between that message's tiles. The O keycap now shows only when no file is open. #3237
      • The agent icon picker. A click on an agent's icon now opens the picker instead of stepping through faces. A picked set icon or picture gets its own page with Use this icon , so nothing changes until you press it, and the dialog stays centred. #3227
      • Hide Starred and Projects. Customize sidebar, and the sidebar's right-click menu, can now hide the Starred and Projects sections. #3252
      • Highlighting by touch. On an iPad, a selection made with a finger turned into a highlight mid-drag and lost iOS's handles. It now waits until the finger lifts, and the selection stays. #3142
      • Picture choices open on their set. A waiting question's picture opened from a file tile or the Artifacts view now opens on the question's set, at its choice, as the zoom button does. #3255
      • Pictures inside the choices. Agents are now told to put each option's picture inside its choice, so you can pick by picture, and the hint to resend a question as picture choices fires only when the pictures really are the options. #3179, #3167
      • Two choices that start the same. Two choices with the same words before the dash were read as one answer, and the agent heard the first one whichever you tapped. Each now keeps its whole text. #3260
      • Back on a phone moves an answered thread out of "Waiting on you", and an opened earlier reply now says "Delivered to ". #3258
      • Self-managed GitLab. A merge request attached by its short form (team/project!45) now opens on the project's own GitLab host instead of gitlab.com. #3225
      • A thread's stacked PRs show one under the other in the desktop PR card, instead of squeezed side by side. #3283

      Code review in the Inbox: off by default

      These show only with Code review turned on in Settings → Capabilities. Until 0.29 that switch shows only if you turned Code review on before.

      • The Pull requests board as a table. A desktop's board bar gets Grid | Table. The table has a row per PR (title, author, state, checks, risk, updated, size) under each repository, with sortable columns that keep a stack together. #3243
      • Select and bulk Merge. Select on the board picks PRs, a whole repository at once or a range with shift-click. Merge N merges the picked PRs that can merge now, one at a time, after a second click to confirm; it lists what stays and why, and reports each result. #3247, #3279
      • One PR opens its own page. Clicking a single open PR in Reviews, or its tile on the board, opens one page for it: the guided review, the diff, its review thread and Details. #2743
      • Open review thread. In a thread's PR list, each open PR has an "Open review thread" line that opens its review thread, or its page in Reviews if it has none yet. #3278
      • GitLab's whole-stack view now opens more lines with the expand arrows, and compares a layer from a fork instead of saying it can't. #3242

      Code review

      • Videos in PR descriptions play. A video attached to a GitHub PR description now plays in the review instead of showing as a link. Videos inside an HTML document or embed can also go full screen. #2952 by @mauricedesaxe, closing #2941 by @mauricedesaxe
      • GitLab's MR switcher and stacks. plannotator review <MR url> showed an empty switcher. It now lists the project's recent merge requests, finds the stack from them, and numbers them !12. #3248
      • Code colouring. .m files are coloured as Objective-C and .pl as Perl (they were Wolfram and Prolog). justfile, *.gradle, .zshrc and *.svg get colour, as do the fence labels patch, env, postgresql, mysql, gradle and hpp. A suggestion is coloured like the diff beside it. #3281
      • Collapse all files right away. A click on Collapse all files just after opening All changes was dropped while the code view loaded. It now applies once the view shows. #3253

      Additional Changes

      • Inbox storage on SQLite, still off unless you set it. inboxSqlite in config.json now has a proof on all six release builds, and fixes for moving the files on Windows and for a 30-second wait after a hard kill. Files stay the default for everyone. #3124
      • Relay. Mailbox creation has a strict per-address limit (per /64 for IPv6), and the relay refuses plain HTTP itself. The relay is deployed on its own. #3273, #3275
      • README and docs. The README describes the Inbox as the review layer for work with many agents and names personal assistants. #3266, #3251
      • Site deploy keeps hand-uploaded files under assets/hosted/. #3276
      • CI. The Test jobs can run on self-hosted runners, never for a fork's or a bot's pull request, and TypeScript is pinned at the root. #3259, #3267
      • Tests. No test can reach the hosted relay any more, and a guard keeps it so. Several flaky and stale tests are fixed. #3274, #3282, #3284, #3224, #3231, #3269, #3285, #3288
      • Release pipeline packs and publishes @plannotator/openclaw like the Cline plugin. #3289

      Install / Update

      macOS / Linux:

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

      Windows:

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

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

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator --scope user
      

      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

      • Run the Claude Code mod in the VS Code extension's chat panel by @backnotprop in #3151
      • Show a Claude Code turn that ended in an API error in its thread by @backnotprop in #3184
      • Inbox: the folder box's never-start list keeps the folders' order by @backnotprop in #3224
      • Inbox: say "choices have no pictures" only when the pictures are the options by @backnotprop in #3167
      • Reply with a quote: say which message, or which words, a reply answers by @backnotprop in #3160
      • OpenClaw plugin: the Inbox in the owner's own OpenClaw chats, with replies coming back by @backnotprop in #3216
      • Inbox: comments on your own messages and on questions by @backnotprop in #3176
      • Inbox: tell agents to put each option's picture in its choice by @backnotprop in #3179
      • Inbox: wake a paired cloud agent by its webhook (step 1) by @backnotprop in #3138
      • Inbox: filter the list to threads you have not seen by @backnotprop in #3226
      • Hermes Agent plugin for the Inbox: tool, owner filter and native reply wake by @backnotprop in #3217
      • Notify when a launched session's turn ends in an error by @backnotprop in #3195
      • Name each session in a thread with several sessions by @backnotprop in #3163
      • Rename an agent from its sidebar row by @backnotprop in #3180
      • Inbox: a paired cloud agent gets its own agent door (step 2) by @backnotprop in #3178
      • Inbox: a paired cloud agent reaches the Inbox through the relay (step 4) by @backnotprop in #3187
      • Inbox: pair a cloud agent from Settings with one message to send it (step 5) by @backnotprop in #3197
      • Inbox: say when plannotator inbox turns on Hermes's wake switch, and how to undo it by @backnotprop in #3238
      • Inbox: Muse by Meta as a cloud agent by @backnotprop in #3212
      • Inbox: a star on a linked machine's thread lives on that machine by @backnotprop in #3234
      • e2e: the Mark read toast spec taps Undo where the toast rests, after the last Undo has ended by @backnotprop in #3231
      • Inbox: short GitLab refs open on the project's own GitLab host by @backnotprop in #3225
      • Inbox: fix starting agents on a linked machine (tip, asleep +, agent kind, Board projects) by @backnotprop in #3233
      • Inbox: an HTML file opens in Interact, and the pen keeps your choice through the thread by @backnotprop in #3235
      • Highlighting by touch waits until the selection is finished, and keeps it by @backnotprop in #3142
      • Inbox: tags for threads and Board cards (step 1: sidebar section, Add tag, the Board says Tag) by @backnotprop in #3228
      • Inbox: one PR opens its launchpad by @backnotprop in #2743
      • Inbox: pick Codex's model and effort when starting it by @backnotprop in #3177
      • Inbox: connect Muse Code by @backnotprop in #3209
      • Inbox: Bitbucket Cloud pull requests on threads, and a Bitbucket token read from a command by @uvw in #3076
      • Inbox: Customize sidebar can hide Starred and Projects by @backnotprop in #3252
      • Inbox: hide the O keycap while a file is open; arrow keys between a message's attachments by @backnotprop in #3237
      • Inbox storage: SQLite behind a setting; the compiled binary proven on six builds by @backnotprop in #3124
      • Fix two flaky tests: an early Collapse all click, and the import crash test by @backnotprop in #3253
      • fix(review): play GitHub attachment videos in PR descriptions by @mauricedesaxe in #2952
      • Inbox: start OpenCode sessions from New message, with model and variant by @backnotprop in #3186
      • OpenClaw and Hermes docs: version floor, why the tool starts off, what was tested by @backnotprop in #3251
      • Inbox: Hermes Agent's mark is its own Nous girl by @backnotprop in #3249
      • Inbox: Back takes an answered thread out of Waiting on you; an opened reply says Delivered by @backnotprop in #3258
      • Inbox: a click opens the agent icon picker, a picked icon gets a page with Use this icon, and the dialog sits centred by @backnotprop in #3227
      • Let a repo variable move the Test jobs to self-hosted runners by @backnotprop in #3259
      • Inbox Settings: Cloud agents under Agents, six kinds, one calm setup step by @backnotprop in #3223
      • Questions: keep two choices with the same words before the dash apart by @backnotprop in #3260
      • Give global comments the reply composer by @iurysza in #2862
      • Inbox: the Pull requests board as a table by @backnotprop in #3243
      • Cloud agents: How does this work? walk-through by @backnotprop in #3254
      • Close the gaps the self-hosted Test proof run found by @backnotprop in #3267
      • README: describe the Inbox as the review layer and name personal assistants by @backnotprop in #3266
      • Fix the browser smoke test: Agents link locator matched two links by @backnotprop in #3269
      • Inbox: open a waiting question's picture choice on its set from a tile or the Artifacts view by @backnotprop in #3255
      • Thread tag marks read in the same order while open and after a restart (flaky every-read test) by @backnotprop in #3272
      • Keep a linked machine's agent's face and name on that machine by @backnotprop in #3246
      • Inbox: Select mode on the Pull requests board by @backnotprop in #3247
      • Relay: a hard per-IP count on mailbox creation by @backnotprop in #3273
      • Site deploy: keep hand-uploaded files under assets/hosted/ by @backnotprop in #3276
      • Tests never contact the hosted relay by @backnotprop in #3274
      • Accept recommended steps aside while you type, keeps Other words, and can be undone by @backnotprop in #3268
      • Inbox: the person's Priority (PR 1 of 2) by @backnotprop in #3232
      • Inbox: a reply to a cloud agent with no wake address reads Saved, then Delivered by @backnotprop in #3270
      • Inbox: filter long model lists when starting an agent, as Pi's model selector does by @backnotprop in #3200
      • Inbox: Muse's mark is Meta's blue Muse squiggle by @backnotprop in #3262
      • Settings and OpenClaw README: why OpenClaw and Hermes start off; how to install OpenClaw before it is published by @backnotprop in #3263
      • Inbox priority spec: never the hosted relay by @backnotprop in #3284
      • relay: IPv6 /64 brake key, https-only Worker, live check (builds on #3273) by @backnotprop in #3275
      • Inbox: a Send waits for comments still saving, so one reply carries them all by @backnotprop in #3240
      • Tests never contact the hosted relay: unit tests' hand-built child envs by @backnotprop in #3282
      • Inbox: a thread's stacked PRs one under the other in the desktop PR card by @backnotprop in #3283
      • Colour .m, .pl, more file names and fence labels; colour suggestions like their diff by @backnotprop in #3281
      • Inbox: Stop and Delete on a sidebar agent's menu by @backnotprop in #3241
      • Inbox: bulk Merge on the Pull requests board by @backnotprop in #3279
      • feat(inbox): one-time dialog announcing personal agents by @backnotprop in #3280
      • Fix two stale browser tests: comment pictures input, Accept recommended after a note by @backnotprop in #3285
      • Inbox: "Open review thread" under each open PR in a thread's PR list by @backnotprop in #3278
      • Inbox: an agent can mark a thread Priority (send_message priority: true|false) by @backnotprop in #3277
      • Inbox To: a machine switch for linked machines by @backnotprop in #3257
      • Pages only spec: expect the window's picture policy as served (one hosted folder) by @backnotprop in #3288
      • Inbox: a draft that arrives after the reply box was opened waits behind Restore draft by @backnotprop in #3250
      • GitLab: MR switcher list and stack discovery in the review app by @backnotprop in #3248
      • Inbox: expand arrows and fork layers in GitLab's whole-stack view by @backnotprop in #3242
      • Inbox: a one-time Priority dialog in the line of one-time dialogs by @backnotprop in #3286
      • Release: pack and publish @plannotator/openclaw like @plannotator/cline by @backnotprop in #3289

      New Contributors

      Contributors

      @uvw wanted Bitbucket pull requests on Inbox threads without leaving the token in every program's environment, filed it as #3075, and built it in three layers: Bitbucket links read as pull request refs, a token read from a command and held only in memory, and the Inbox's rows, hover cards and Board marks. A clean-room test of the agent text, in the same PR, caught a smaller model storing a Bitbucket PR as a GitHub ref, and the wording was fixed.

      @mauricedesaxe reported that a video attached to a PR description showed as a bare link (#2941), then made it play in the review, with a fallback to the link whenever the video can't load.

      @iurysza gave global comments pictures, files, voice and a kept draft. That work became the one comment card the Inbox now uses everywhere.

      Thanks also to the people whose issues shaped this release:

      • @Arobotmaster asked for Reply to show which message, or which words, it answers (#3109)
      • @zane668 reported that a thread's header showed only a count of sessions, not their names (#3108)
      • @Qwenjin reported that Inbox replies did not wake Claude Code sessions in the VS Code extension (#3111)

      Full Changelog : v0.28.62...v0.28.63

    10. 🔗 smol-machines/smolvm smolvm v1.34.3 release

      What's Changed

      • docs: say that virtiofs DAX is off on arm64 hosts and SMOLVM_MOUNT_DAX does nothing there by @BinSquare in #2087
      • Add smolvm docker: one command starts a Docker engine in a managed machine and points docker at it by @BinSquare in #2089
      • Share the home directory with the smolvm docker machine at the same path by @BinSquare in #2090
      • Resolve host.docker.internal to the host from smolvm docker containers by @BinSquare in #2091
      • Fix a port race in the leader-exit test by @BinSquare in #2096
      • Remove smolvm docker by @BinSquare in #2095
      • Hand supplied credential values to a running embedded machine at once by @BinSquare in #2097
      • Pin libkrunfw with UDP kept inside a TSI guest, and test it by @BinSquare in #2099
      • Publish ports below 1024 on macOS, add IPv6 loopback to live-forwarded ports, and lift the 64-mapping cap by @BinSquare in #2092
      • Return idle guest memory to the host within two minutes and cap new machines at half the host's RAM by @BinSquare in #2094
      • Install a root-owned agent-rootfs when root runs install.sh by @rdslw in #2082
      • Announce a changed file to the guest once per change by @BinSquare in #2102
      • Answer guest DNS from a host cache that coalesces bursts and resends lost queries by @BinSquare in #2098
      • Keep every disk chain under the branch depth limit: fold restored checkpoint layers and frozen-source chains by @BinSquare in #2103
      • Exec sessions: commands the node owns, resumable after a dropped connection by @BinSquare in #2101
      • Let a guest hold tens of thousands of connections on virtio-net and free their host sockets promptly by @BinSquare in #2104
      • Scope the usage journal to the test's own thread by @BinSquare in #2106
      • Pin libkrun 526be460 and libkrunfw f290c62b, rebuilt for every platform by @BinSquare in #2109
      • Build the agent rootfs as non-root on hosts with user namespaces again by @BinSquare in #2107
      • Answer a start missing the mediated interceptor with 400, not 500 by @BinSquare in #2108
      • Run tests that need a released file lock free at once in their own process by @BinSquare in #2110
      • Pin libkrun 9df62257 and libkrunfw 7f4d4950, rebuilt for every platform by @BinSquare in #2113
      • Stop resetting virtio-net connections a server closes first by @BinSquare in #2118
      • Upgrade rusqlite to 0.41 for the patched bundled SQLite (RUSTSEC-2026-0459) by @BinSquare in #2128
      • Keep a host memory reserve VMs cannot take and charge branch children for growth by @BinSquare in #2127
      • Ask before stopping a machine on delete, so a refused or declined delete leaves it running by @connorburgess in #2131
      • Prepare SmolVM v1.34.1 for release by @BinSquare in #2135
      • Bring a soft open-file limit above kern.maxfilesperproc down to the cap on macOS, so the limit raise_nofile_limit reports is the one in force by @connorburgess in #2132
      • Leave no data directory behind when exec, status or stop name a machine that does not exist by @connorburgess in #2129
      • Warn when --block-private keeps a named host unreachable by @BinSquare in #2146
      • Register Rosetta itself as the x86_64 interpreter when the host answers its start-up ioctl by @BinSquare in #2148
      • Make a mounted host directory belong to the workload user so a non-root workload can write to it by @BinSquare in #2149
      • Record the image platform on the machine so a Rosetta machine can be created from an amd64 image by @BinSquare in #2147
      • Bump libkrun so a Rosetta machine runs amd64 programs directly and a macOS machine stops promptly by @BinSquare in #2150
      • Keep a cache disk's chain on its shared base when compaction shortens it by @BinSquare in #2145
      • Satisfy Rust 1.100's needless_bool lint in connect_in_progress on Windows by @BinSquare in #2154
      • Bound branch admission and reported capacity by the VM slice's memory limit, not just host free memory by @BinSquare in #2152
      • Stop throttling the VM slice and reclaim it from the pressure guard instead by @BinSquare in #2153
      • Release a paused branch child's VM lock so the memory pressure guard can resume it by @BinSquare in #2157

      New Contributors

      Full Changelog : v1.34.0...v1.34.3

    11. 🔗 Project Zero Policy and Disclosure: 2026 Edition rss

      Since 2021, Project Zero has followed a “90 + 30” vulnerability disclosure policy, allowing vendors up to 90 days to remediate a vulnerability plus an extra 30 days “soak time” for patch rollout. Our goal was to encourage faster patching and give vendors time to deliver patches to users. The advent of AI- assisted vulnerability discovery and exploitation has changed the threat landscape such that the vulnerability remediation timeline encouraged by our disclosure policy is clearly insufficient.

      LLMs have increased the speed at which attackers can find and exploit vulnerabilities, alongside the risk that multiple parties, including malicious ones, discover the same bug. A vulnerability reported today presents a much higher immediate risk to users than one reported last year. In this new environment, it is crucial that vendors move towards remediating vulnerabilities faster.

      LLMs have also decreased the time it takes for attackers to reverse engineer and exploit a vulnerability based on a patch, to the extent that zero patch- to-exploitation time is a reasonable, though imperfect, model of attacker behavior. Patch soak time is no longer meaningful in a world where attackers can almost immediately determine bug details from a patch, and can put users at risk by creating a false sense of secrecy. “Patch gap” is the time between a fix being released for a security vulnerability and the user installing the relevant update. It is equally crucial that vendors reduce patch gap, either by reducing patch rollout time or using other strategies to protect users while remediation is in progress.

      LLMs have also increased the volume of vulnerabilities that Project Zero reports. We are finding several vulnerabilities a week in targets where we once found a few vulnerabilities a year. Aspects of our policy that require vendor negotiation or agreement, including determining whether a bug is fixed and whether grace period applies, are quickly becoming unmanageable.

      Today, we are announcing a new vulnerability disclosure policy, created with the following goals in mind:

      • Encourage faster vulnerability remediation
      • Encourage vendors to reduce “patch gap”
      • Allow for the policy to be automated by both Project Zero and vendors

      Our new policy: “Full X”

      Vulnerabilities will be disclosed X days after they are reported to the vendor.

      Starting today, our policy is “Full 90”, i.e. vulnerabilities will be disclosed 90 days after they are reported to the vendor.

      On February 2, 2027, we will move to a “Full 60” policy where vulnerabilities are disclosed after 60 days.

      On January 3, 2028, we will move to a “Full 30” policy where vulnerabilities are disclosed after 30 days.

      We are also removing most ‘special cases’ from our disclosure policy, including grace period and variant policy. The only exceptions to our new policy are:

      • Vulnerabilities actively exploited in the wild -- ITW vulnerabilities will be handled according to Google’s application security vulnerability disclosure policy
      • Public vulnerabilities -- Project Zero may make details of a vulnerability public, at our discretion, if the details have already been made public by others
      • Vendor request -- We will make vulnerability details public if the vendor we reported it to requests it

      Why reduce remediation time gradually?

      Project Zero solicited feedback from the vendors we report the most vulnerabilities to as a part of developing this new policy. An overarching concern was that immediately changing the policy could harm users by making unfixed vulnerabilities available to attackers while vendors are in the process of improving their remediation processes and technology. While the benefits of delaying disclosure are declining due to the increased probability that attackers will discover a vulnerability during the embargo period, we still feel there are benefits in the short term.

      In addition, vendors mentioned two more subtle concerns. One was that an overly-aggressive disclosure policy would encourage fixing bugs reported under the new policy with more priority, even if they are less severe than other reported vulnerabilities. The other was that immediately enforcing a policy that some vendors aren’t equipped to meet might lead to a state where vendors accept that they cannot fix bugs within the deadline and don’t attempt to.

      We decided on a policy that encourages vendors to improve remediation time on a schedule that is challenging but realistic, with the hope that this will lead to vendors broadly improving their remediation processes and infrastructure in a way that eventually enables them to fix all reported vulnerabilities quickly.

      What about severity?

      While our analysis isn’t always perfect, Project Zero only reports vulnerabilities with substantial severity and demonstrated security impact in our tracker. That said, we don’t feel severity is an effective metric for making disclosure decisions, especially in the current environment. A vulnerability’s severity does not affect the likelihood that it will be discovered by attackers, only its impact on users.

      When vendors determine severity and use it to prioritize bug fixes, they are making decisions about what risks they are willing to expose their users to, and it is reasonable to accept the risk of low-severity bugs, like unexploitable null pointer crashes or minor info leaks in a lot of circumstances. But this doesn’t change the availability of these vulnerabilities to attackers, and we want our policy to reflect this reality.

      It’s also important to acknowledge that Project Zero holds itself to high standards with regards to the reproducibility, readability, reachability and reported security impact of the vulnerabilities we report. This policy assumes bugs reports are of this quality, and it is reasonable for vendors to treat low quality-bug reports differently.

      What about hardware?

      We encourage all vendors to consider how they would respond to imminent disclosure of a serious vulnerability, including non-patch strategies, as there is no guarantee that defenders will be the first to find a bug. That said, Project Zero has occasionally granted exceptions to our policy on rare occasions, including Spectre and Meltdown, and will continue to do so in the future.

      Are you really not going to check whether bugs are fixed?

      The question of whether a bug is fixed for the purposes of our policy has always been challenging and somewhat unresolved, particularly with regards to code that is not shipped directly to users and not publicly available. It is not unusual for Project Zero to communicate with vendors multiple times for each bug report to come to an agreement on whether a vulnerability is fixed. As more vendors experiment with vulnerability remediation strategies that are not patching like temporarily disabling code paths, we expect this to become even more complex.

      We still plan to track whether bugs are fixed and communicate if they are not, however, this will not be a decision point in our policy. This will enable us to share technical details of how users are protected without needing to make a binary judgement with consequences for the vendor.

    12. 🔗 smol-machines/smolvm smolvm v1.34.2 release

      What's Changed

      • docs: say that virtiofs DAX is off on arm64 hosts and SMOLVM_MOUNT_DAX does nothing there by @BinSquare in #2087
      • Add smolvm docker: one command starts a Docker engine in a managed machine and points docker at it by @BinSquare in #2089
      • Share the home directory with the smolvm docker machine at the same path by @BinSquare in #2090
      • Resolve host.docker.internal to the host from smolvm docker containers by @BinSquare in #2091
      • Fix a port race in the leader-exit test by @BinSquare in #2096
      • Remove smolvm docker by @BinSquare in #2095
      • Hand supplied credential values to a running embedded machine at once by @BinSquare in #2097
      • Pin libkrunfw with UDP kept inside a TSI guest, and test it by @BinSquare in #2099
      • Publish ports below 1024 on macOS, add IPv6 loopback to live-forwarded ports, and lift the 64-mapping cap by @BinSquare in #2092
      • Return idle guest memory to the host within two minutes and cap new machines at half the host's RAM by @BinSquare in #2094
      • Install a root-owned agent-rootfs when root runs install.sh by @rdslw in #2082
      • Announce a changed file to the guest once per change by @BinSquare in #2102
      • Answer guest DNS from a host cache that coalesces bursts and resends lost queries by @BinSquare in #2098
      • Keep every disk chain under the branch depth limit: fold restored checkpoint layers and frozen-source chains by @BinSquare in #2103
      • Exec sessions: commands the node owns, resumable after a dropped connection by @BinSquare in #2101
      • Let a guest hold tens of thousands of connections on virtio-net and free their host sockets promptly by @BinSquare in #2104
      • Scope the usage journal to the test's own thread by @BinSquare in #2106
      • Pin libkrun 526be460 and libkrunfw f290c62b, rebuilt for every platform by @BinSquare in #2109
      • Build the agent rootfs as non-root on hosts with user namespaces again by @BinSquare in #2107
      • Answer a start missing the mediated interceptor with 400, not 500 by @BinSquare in #2108
      • Run tests that need a released file lock free at once in their own process by @BinSquare in #2110
      • Pin libkrun 9df62257 and libkrunfw 7f4d4950, rebuilt for every platform by @BinSquare in #2113
      • Stop resetting virtio-net connections a server closes first by @BinSquare in #2118
      • Upgrade rusqlite to 0.41 for the patched bundled SQLite (RUSTSEC-2026-0459) by @BinSquare in #2128
      • Keep a host memory reserve VMs cannot take and charge branch children for growth by @BinSquare in #2127
      • Ask before stopping a machine on delete, so a refused or declined delete leaves it running by @connorburgess in #2131
      • Prepare SmolVM v1.34.1 for release by @BinSquare in #2135
      • Bring a soft open-file limit above kern.maxfilesperproc down to the cap on macOS, so the limit raise_nofile_limit reports is the one in force by @connorburgess in #2132
      • Leave no data directory behind when exec, status or stop name a machine that does not exist by @connorburgess in #2129
      • Warn when --block-private keeps a named host unreachable by @BinSquare in #2146
      • Register Rosetta itself as the x86_64 interpreter when the host answers its start-up ioctl by @BinSquare in #2148
      • Make a mounted host directory belong to the workload user so a non-root workload can write to it by @BinSquare in #2149
      • Record the image platform on the machine so a Rosetta machine can be created from an amd64 image by @BinSquare in #2147
      • Bump libkrun so a Rosetta machine runs amd64 programs directly and a macOS machine stops promptly by @BinSquare in #2150
      • Keep a cache disk's chain on its shared base when compaction shortens it by @BinSquare in #2145
      • Satisfy Rust 1.100's needless_bool lint in connect_in_progress on Windows by @BinSquare in #2154
      • Bound branch admission and reported capacity by the VM slice's memory limit, not just host free memory by @BinSquare in #2152
      • Stop throttling the VM slice and reclaim it from the pressure guard instead by @BinSquare in #2153

      New Contributors

      Full Changelog : v1.34.0...v1.34.2

    13. 🔗 r/LocalLLaMA ‘Bring Back THE Boss’: Nvidia Employees Petition for Jensen Huang’s Return rss

      ‘Bring Back THE Boss’: Nvidia Employees Petition for Jensen Huang’s Return | A second Sam Altman moment? submitted by /u/f1yingbanana
      [link] [comments]
      ---|---

    14. 🔗 r/LocalLLaMA A100 prices down 20-30% since my post about them collapsing rss

      I guess a lot of sellers are realizing that its better to price competitively and get rid of their supply rather than wait to slowly sell and potentially get caught in a collapse.

      Rubin and blackwell are already 3-4x more efficient per watt with way more financing available. The A100s cant be used for inference Besides enthusiasts, small time gpu renters I really dont see who will be picking up these cards. And these 2 buyers are extremely price sensitive and will be comparing the cards to other options like R9700 and Cresent Island from Intel with 160-480gb vram.

      Rtx 6000 is also now down to 14.8k from 18k peak.

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

    15. 🔗 r/LocalLLaMA Stories coming out about Jensen rss

      Stories coming out about Jensen | submitted by /u/Charuru
      [link] [comments]
      ---|---

    16. 🔗 Jeremy Fielding (YouTube) I Built a Automated High Speed Camera Robot rss

      This work was supported by the Alfred P. Sloan Foundation, enhancing public understanding of science and technology in the modern era, in partnership with IMI: watch what matters. https://www.theimi.co/ & https://sloan.org/programs/public-understanding

      Order custom parts Send Cut Send 👉 http://sendcutsend.com/jeremyfielding

      PBC Linear Rail Shown in the video 👉 https://pbclinear.com/blogs/blog/mt-series-belt-driven-linear-actuators-which-one-should-you-choose?utm_source=youtube&utm_medium=video&utm_campaign=jf&utm_term=mtb-actuators

      If you want to join my community of makers and Tinkers consider getting a YouTube membership 👉 https://www.youtube.com/@JeremyFieldingSr/join

      If you want to chip in a few bucks to support these projects and teaching videos, please visit my Patreon page or Buy Me a Coffee. 👉 https://www.patreon.com/jeremyfieldingsr 👉 https://www.buymeacoffee.com/jeremyfielding

      Social media, websites, and other channel

      Discord 👉https://discord.gg/F3XuyhNRPc Instagram https://www.instagram.com/jeremy_fielding/?hl=en Twitter 👉https://twitter.com/jeremy_fielding TikTok 👉https://www.tiktok.com/@jeremy_fielding0 LinkedIn 👉https://www.linkedin.com/in/jeremy-fielding-749b55250/ My websites 👉 https://www.jeremyfielding.com 👉https://www.fatherhoodengineered.com My other channel Fatherhood engineered channel 👉 https://www.youtube.com/channel/UC_jX1r7deAcCJ_fTtM9x8ZA

      Notes:

      Technical corrections

      Nothing yet

    17. 🔗 r/LocalLLaMA Hugging Face CEO vows to keep fighting for open source AI after Jensen Huang's exit rss

      Hugging Face CEO vows to keep fighting for open source AI after Jensen Huang's exit | context : Nvidia buy HF, but now there uncertainty about it hf future under new leadership, he try reassurance people on x, but from his word itself sound not good, see and wait, but better backup you favorite datashet/model (again) just in case submitted by /u/Merchant_Lawrence
      [link] [comments]
      ---|---

    18. 🔗 Filip Filmar TxHDL today: a Rust HDL, its parts, and what runs on it rss

      TxHDL is a hardware description language that is a Rust library, and a complete system ready to use. Its standard library holds the parts a system on chip needs: buses, a network on chip, memory, an MMU, Ethernet, video, debug and system control. On top of them run a RISC-V core that boots Linux, a GPU and a FireSim host link. Simulation, formal proof and the official RISC-V tests check all of it. This page describes TxHDL as it stands in November 2026. The earlier posts show it at the stages it passed through.

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

      IDA Plugin Updates on 2026-11-12

      New Releases:

      Activity:

      • cfiscope
        • 660de8aa: v0.1.18
        • e8a44829: Review s154 claims 1-6: CHANGELOG tailqty folded into the Callers bul…
        • de046190: README/CHANGELOG claims nits (review s153 claims 5-9): count row "che…
        • 81946a65: Count row: per-type sensitivity (review s153 claims 3, rest): a count…
        • a38418ba: IDA layer: in_cfi_runtime decides by name only when the function has …
        • 93e455d0: -sites: a slow-path-only site with no linked call keeps the v0.1.17 …
        • 3e78b11e: Tests: the __cfi_check name test alone, in the CLI (cli.runtime_test)…
        • 7c4ec5b2: Count row: a check whose range read at the check gives no candidates …
        • 0a5c0603: Runtime check needs the pointer in x1 too (review s153 code 3): no li…
        • b28a14ca: CHANGELOG: same wording for the +1 test (inline range-check parser only)
        • d362da14: README count row: the +1 test changed only the inline range-check par…
        • a017a42f: Callers: a kCFI check always counts as a call site, as before (review…
        • d669e9e7: Count row: 1,718 of the 2,488 pairs start with a range run (the only …
        • 4fe912c2: Count row: say it also leaves out the 11 linked checks with no type i…
        • 97bbe0d1: -sites labels the CFI runtime's own checks 'CFI runtime check (guard…
        • e2aef4b3: CHANGELOG: the README changes of this release (install by URL, order,…
        • f1c845f0: README: Status and Install come before Try it (judge s152 finding 5; …
        • 01d54ebe: README 5.x: the command-line summary for the 5.15 kernel and why its …
        • 786886f1: README: what the plugin writes into IDA, before and after, from tools…
        • 4a8499b1: README: vfs_read block is the full real output (3 lines, was 2 and co…
      • hrtng
      • idasql
      • kflow
        • ee1b168e: README: Hex-Rays added kflow to the plugin index (plugin-repository#4…
        • 181f1cd5: README: kflow is not in the plugin index yet (requested in HexRaysSA/…
        • 8833967a: Never use IDA placeholder names (unk_/byte_) for keys and handlers: g…
        • 59f33d44: README: 73 IDA API checks (was 64)
        • adcc6bfa: v0.0.2: key data references in CHANGELOG/notes/README (judge s149 ite…
        • dca26133: drefs: stub indexes data refs by source (GKI 5.10 stub run 6 s, was >…
        • fcabbcf8: WIP (branch drefs, NOT in v0.0.2): user data refs static-key site -> …
        • bc72d49d: Judge s149 item 5 (GKI): keys inside arrays named after the nearest n…
        • 81c98a2f: v0.0.2 (2026-11-13)
        • 247dd60c: New action: kflow: List static-key sites (key, likely/unlikely, jump …
        • 7dfb4629: README: who it is for + before/after of three real demo sites at the …
        • fbc15b7f: Judge s149: static-key comment says when the site jumps (key off/on b…
        • 37d9ac2a: IDA: no-tables warning names vmlinux-to-elf for a raw Image/vmlinuz l…
        • e7ea6909: README Try it: your own /boot/vmlinuz through vmlinux-to-elf (checked…
        • c7818bcd: README/manifest: seventh kernel (Ubuntu 24.04 x86_64 6.8.0-149-generi…
        • 03cc6c95: README/manifest: sixth kernel (Ubuntu 24.04 arm64 6.8.0-149-generic v…
        • ede7ffd1: CLI: raw arm64 Image / gzip vmlinuz / x86 bzImage get a hint naming v…
        • ae171c01: CHANGELOG wording: in-place relocation (no peak-memory claim)
        • a4cf7604: Modules: relocations patched in place (one copy less in memory); outp…
        • 5aa7c627: ELF extended section numbering (e_shnum 0 / SHN_XINDEX / .symtab_shnd…
      • plugin-ida
        • 806a79a0: fix: ask for the instance name instead of the realm (#38)
    2. 🔗 anthropics/claude-code v2.1.323 release

      What's changed

      • Added Code Mode, an experimental opt-in in which Claude writes JavaScript to call its tools; see https://code.claude.com/docs/en/code-mode to turn it on, or to turn it off for an organization
      • Added engines["claude-code"] to plugin.json: plugins outside their stated Claude Code version range are not installed, updated or loaded, and install and update pick the newest version that fits
      • Added type checking of a plugin's TypeScript hooks module to claude plugin validate; each finding is a warning, and --strict fails on it
      • Added to claude plugin validate the $ nouns a mod's engine.create hook adds, withholds or replaces
      • Added support for CLAUDE_CODE_AUTO_MODE_MODEL in managed settings for Claude Desktop sessions on third-party providers (takes effect once Claude Desktop includes this version)
      • Added an options menu (stop, switch to usage credits, upgrade) when a model needs usage credits that are turned off or used up
      • Added a progress heartbeat every 30 seconds while hooks run long in claude -p and SDK sessions, so a host such as Claude Desktop won't end the turn as hung (once it includes this version)
      • Added .docx support to Artifact tool asset uploads
      • Added a /diff to close hint to the diff panel, and the keys that focus and close a panel to the ? shortcut guide
      • Added a start-up warning for Bash allow rules with a * in a variable's value, such as Bash(PORT=* npm run dev)
      • Added a warning when a plugin's language server can't start, naming the server and what to check
      • Added a one-time startup notice naming CLAUDE_CODE_PERFORCE_MODE when Perforce settings are found and the mode is off
      • Added CLAUDE_CODE_DISABLE_AGENT_PROGRESS_SUMMARIES (available since 2.1.318): set it to 1 to turn off subagent progress summaries and the requests that write them (#86879)
      • Added CLAUDE_CODE_RESUME_HINT_COMMAND, which a program that starts Claude Code can set to have the exit hint name its own resume command
      • Added unsetOptionCount to the claude plugin install --json result: how many userConfig options are not yet set
      • Added isPromptCovered to the props a mod's pane is drawn with, telling it when a dialog or a field above the prompt covers the prompt
      • Fixed running /compact again, or after a command such as /context, summarizing away a message that Claude had not answered yet
      • Fixed a resumed session joining your next message to an old interrupted message that was not resumed
      • Fixed a memory spike at the next prompt after Claude changed a very large file
      • Fixed a setting saved in a running session undoing a hand edit made to settings.json moments earlier; a settings file you delete during a session now stays deleted
      • Fixed claude plugin commands and claude mcp list signing you out of a Console profile when they ended while the token was being renewed
      • Fixed Edit and Bash running out of memory on certain /proc files, and Edit hanging or running out of memory on devices and named pipes
      • Fixed Claude Code failing to start, or to clear stored credentials at sign-out, when saving its configuration file failed with "Out of memory"
      • Fixed requests sent without streaming failing on errors that streamed requests recover from, such as a rejected image, thinking block or beta header
      • Fixed ExitWorktree, the worktree exit dialog and /resume leaving the session in the wrong folder when the folder the shell was in before entering the worktree had been deleted
      • Fixed accents and other combining marks sometimes landing left of the text, leaving stale copies on screen, or silently disappearing when text wraps
      • Fixed the last key of a key chord, such as Enter in ctrl+x enter, acting on a dialog's text field when the chord's own action isn't available there
      • Fixed ps processes piling up when the process listing Claude Code runs before stopping a command takes too long
      • Fixed subagent transcripts and large tool results being saved apart from the session's transcript after entering a worktree created by a WorktreeCreate hook or belonging to a nested repository
      • Fixed a session on a named Anthropic profile moving to another sign-in when /fork, the Left arrow or --bg continued it in the background; reopen any session that was open during the update
      • Fixed a background session sending a conversation under another sign-in when its named Anthropic profile is missing, changed or overridden; it now stops and says so
      • Fixed a session on an API key, auth token or workload identity from its shell (not a setup token) moving to another sign-in in the background; it now stops and says so
      • Fixed MCP tool calls ending in the sign-in server's error, such as TOKEN_EXPIRED, instead of asking you to sign in again
      • Fixed an expired claude.ai login showing "Credit balance too low" when a saved Console key or ant auth login profile without credit was used instead
      • Fixed a session on a named Anthropic profile being handed to an older background service that could not keep its sign-in; it now says to restart the service
      • Fixed a background session's sign-in leaving the previous account's login or other credentials in place; it now clears them for every session on the computer, and a refused sign-in can leave no login
      • Fixed background sessions moving between a profile and the stored login when an update restarted them
      • Fixed sessions opened before a sign-in keeping signed-out feature flags after the sign-in
      • Fixed sessions that kept failing after a Claude apps gateway sign-in expired: once you sign in again with /login in another terminal, they carry on at the next message
      • Fixed the billing notice naming your ant auth login organization when a custom X-Api-Key header is set
      • macOS: Fixed "Not logged in · Please run /login" coming back right after a successful /login or a token refresh when the keychain was slow to answer
      • Fixed turns failing in Claude Desktop when an organization's gateway answers an expired token with 403: Claude Code now asks Desktop for a fresh token and retries
      • Fixed the error shown when Amazon Bedrock refuses your account a model: it no longer says to refresh your AWS credentials, it says to enable the model
      • Fixed the awsAuthRefresh or gcpAuthRefresh command sometimes running twice for one request when three or more sessions needed a fresh sign-in at once
      • Fixed the claude -p warning about an ended claude.ai login to say that claude auth logout also removes saved MCP server logins and plugin secrets
      • Fixed Bash permission prompts offering "don't ask again" for commands that write to sensitive paths such as .git or .claude, where the saved rule did not stop the next prompt
      • Fixed a case where some lsof commands ran without a permission prompt
      • Fixed Bash commands that write a file with `cat > file <
    3. 🔗 @HexRaysSA@infosec.exchange Marco ([@raptor](https://infosec.exchange/@raptor)) is back on the Hex-Rays mastodon

      Marco (@raptor) is back on the Hex-Rays blog 🔮

      His vulnerability research tools (rhabdomancer, haruspex and augur) have reached v1 and fully support IDA 9.5. New in this release: type definitions extraction, many fixes, and augur now runs 19x faster.

      👉🏽 Read the full post: https://hex-rays.com/blog/divining-vulnerabilities- contributor-program

      Marco is also a Hex-Rays Plugin Contest winner, and the contest is open again.
      Built something cool with IDA? Submit it before Nov 30: https://hex- rays.com/plugin-contest

      He’s also a member of our Contributor Program, which supports people who build IDA plugins, tools and content with a free IDA license. Apply here: https://hex-rays.com/contributor-program

    4. 🔗 HexRaysSA/plugin-repository commits sync repo: +12 releases, -1 release rss
      sync repo: +12 releases, -1 release
      
      ## New releases
      - [IDASQL](https://github.com/allthingsida/idasql): 0.0.20
      - [btf2ida](https://github.com/nightshift-labs-ai/btf2ida): 0.1.19, 0.1.18
      - [cfiscope](https://github.com/nightshift-labs-ai/cfiscope): 0.1.17, 0.1.16
      - [hrtng](https://github.com/kasperskylab/hrtng): 3.9.118
      - [memlens](https://github.com/nightshift-labs-ai/memlens): 0.3.24, 0.3.23, 0.3.22, 0.3.21, 0.3.20
      - [threatray](https://github.com/threatray/plugin-ida): 3.0.4
      
      ## Changes
      - [IDASQL](https://github.com/allthingsida/idasql):
        - removed version(s): 0.0.11
      
    5. 🔗 Hex-Rays Blog Divining vulnerabilities: powered by the Hex-Rays Contributor Program rss

      Divining vulnerabilities: powered by the Hex-Rays Contributor
Program

      "Real hackers were so multi-lingual they often knew more platforms than they had pants."
      -- Dave Aitel

      About the guest author

      Marco Ivaldi (raptor) is a seasoned security researcher and tech leader with over 25 years of experience in offensive security. He is the technical director and co-founder of HN Security, a boutique firm specializing in tailored offensive security services. A prolific exploit writer, Marco is also a Phrack author and a core developer of the OSSTMM, the open methodology for security testing. He has been recognized as one of Microsoft's Most Valuable Security Researchers and was selected to compete in its Zero Day Quest. He is a member of the Hex-Rays Contributor Program. His career began in the '90s, when he co-founded Linux&C, the first Italian magazine dedicated to Linux and open source.

      TL;DR

      In a hurry? I got you. Here's what's new in my vulnerability divination 🔮 suite:

      • Last May, I joined the Hex-Rays Contributor Program, which is supporting the development of my idalib-based tools with a free IDA license.
      • rhabdomancer, haruspex, and augur have reached v1 , with full IDA 9.5 compatibility , new features such as type definitions extraction , substantial performance optimizations , and a number of important fixes.
      • I've contributed type extraction , decompiler and IDA configuration , and Linux/Windows AArch64 support to the idalib Rust bindings 🦀, with more pull requests on the way.
      • I've benchmarked the old and new releases against real-world targets, and the results speak for themselves.

      As usual, you can get the latest releases from Hex-Rays community plugins, crates.io, or GitHub.

      A headless IDA-powered binary audit pipeline

      First, a quick recap of my previous work, for those who missed the earlier episodes.

      I've been doing binary vulnerability research against closed-source targets since the '90s, both professionally and as a hobby. Over the past couple of years, I've built a pipeline around IDA Pro's GUI-free automation capabilities to audit binaries at scale , across architectures. I described its building blocks in my previous article on this topic.

      Still waiting for the "automation takes over" part to kick in (https://xkcd.com/1319/)

      The centerpiece is haruspex, an idalib- rs based headless plugin that extracts IDA's decompiler pseudocode into per-function flat files. It's fast enough to process a 19 MB MIPS binary encompassing 7436 functions in less than 20 seconds (including the initial analysis stage) on my MacBook Air M3. Not bad!

      That output feeds a layered static analysis stack. My custom Semgrep C/C++ ruleset and weggli patterns treat the pseudocode as source code, flagging candidate vulnerability hotspots automatically. Interesting hits then go to LLM agents for deeper triage , before I move to manual static and dynamic confirmation. Its siblings rhabdomancer and augur complete my vulnerability divination suite, by marking calls to potentially insecure API functions in the IDB and extracting strings and related pseudocode as needed, respectively.

      Why IDA? Because of decompiler quality, performance, and integration capabilities , the latter courtesy of the award-winning idalib Rust bindings. Across x86, ARM, MIPS, and other architectures, the output is clean enough for pattern- matching tools to work on it reliably. Just last July, I batch-decompiled 280 binaries in less than 14 minutes, and Semgrep parsed more than 98% of the resulting pseudocode lines. Meanwhile, the idalib headless API lets Rust drive the whole analysis without a GUI in the loop.

      This pipeline finds real bugs , such as the Zyxel local privilege escalation I covered last year. And I've spoken with other researchers who use a similar setup to hunt for vulnerabilities at scale, so I guess I'm not the only haruspex in town. 🐑

      A license to divine

      Last May, I joined the Hex-Rays Contributor Program. In a nutshell, the program aims to recognize and support people who design, build, and maintain IDA plugins, applications, and content , idalib-based tools explicitly included. Contributors may get a free IDA license that includes all decompilers and dedicated support from the Hex-Rays team.

      For me, this means that I can keep developing my tools against the latest IDA releases on macOS, Windows, and Linux, without worrying about how to keep my license current. In return, contributors must keep their projects compatible with the latest IDA SDK within four months of each release. They must also maintain good installation, quality, and documentation standards, support their users, and provide product feedback to Hex-Rays. Sounds like a fair deal to me, especially since I was already doing most of these things anyway. 🤷

      The first tangible result of this collaboration is a major release of my cross-platform vulnerability divination suite, which is now fully compatible with IDA 9.5. If you're building something cool on top of IDA, I encourage you to apply as well!

      The new haruspex running on Windows 11

      Giving back to idalib-rs

      As customary, while working on my tools I kept contributing new features to the idalib Rust bindings, which in the meantime moved to their own home under the idalib-rs GitHub organization. My most relevant contributions since my last article are listed below:

      • Global and function-level type extraction (released in idalib-rs v0.10.0, alongside IDA 9.4 compatibility). This is the feature that powers the new .h files generated by haruspex and augur. It allows idalib-rs based tools to dump the type definitions that IDA has recovered or that you've applied to the IDB, both globally and for the types used by a specific decompiled function. Ever tried to make sense of a pile of pseudocode full of *(_DWORD *)(a1 + 0x48) without the corresponding struct definition? Well, me too 😵‍💫
      • Support for modifying the Hex-Rays decompiler configuration (released in idalib-rs v0.10.1). This is what allows haruspex and augur to turn off IDA 9.4's new argument name hints programmatically, without asking you to edit any configuration files by hand. This way, static analysis tools such as Semgrep can directly parse the generated pseudocode.
      • Support for modifying the IDA configuration (released in idalib-rs v0.11.1). It's the counterpart of the previous feature for IDA's kernel settings. This is what allows haruspex and augur to make IDA 9.5's verbatim names valid C identifiers again in the pseudocode (more on this below).
      • Support for Linux and Windows AArch64 targets and cross-compilation (released in idalib-rs v0.11.0, alongside IDA 9.5 compatibility). I've tested this patch with my tools on Linux/AArch64. Windows/AArch64 is also supported, but it's still untested (volunteers welcome).

      You can find the full history in the official changelog of the project. As always, I encourage you to contribute to idalib-rs!

      A sneak peek of rhabdomancer doing its magic on Linux/AArch64

      One year of divination

      A lot has happened since my last article on IDA 9.2. Back then, my tools were at v0.7.x. One year, a few hundred commits, and more than a dozen releases later, rhabdomancer, haruspex, and augur have all reached v1. Yes, I'm finally confident enough to call them stable. 🎉

      The full details are in each project's changelog (rhabdomancer, haruspex, augur). Here are the highlights.

      IDA 9.5 compatibility

      All three tools now officially support IDA 9.5 , via the v0.11.x releases of the idalib Rust bindings. Along the way, they also tracked IDA 9.3, 9.3sp1, 9.3sp2, 9.4, and 9.4sp1, with a compatibility matrix in each README.md that maps every IDA build to the latest compatible release of each tool.

      IDA 9.4 brought a couple of decompiler changes that directly affected my pipeline:

      • The Hex-Rays decompiler now generates argument name hints. They're great for humans reading pseudocode in the GUI, but they break pattern-matching tools such as Semgrep and weggli. Therefore, haruspex and augur disable them before decompiling, and a regression test makes sure they never sneak back into the extracted pseudocode.
      • The decompiler can now recover additional strings that the initial auto-analysis misses. To take full advantage of this, augur now decompiles all functions upfront , before it walks the string list.

      IDA 9.5 kept me busy as well. It no longer garbles names by default, so names that aren't valid C identifiers are kept verbatim, and the decompiler wraps them in backticks. That's more faithful to the binary, but once again it breaks Semgrep and weggli. I dealt with it by restoring IDA 9.4's behavior in haruspex and augur, via a new IDA configuration API I contributed to idalib-rs. In rhabdomancer, I handled the breaking change by improving the function name matching logic.

      New features

      • Type definitions extraction in haruspex (and augur), as requested by a user. Global and per-function type definitions are now dumped to .h header files alongside the pseudocode. This means that structs, enums, and typedefs recovered by IDA are available to downstream tools and LLM agents, which makes their analysis more accurate.
      • A stable public API for haruspex as a library. The new decompile function tells apart functions that can't be decompiled from errors that affect all functions, decompile_to_file now returns a DumpedFunction with the paths of the files it wrote, and DumpedFunction::copy_to copies the output elsewhere without decompiling again. augur is built entirely on top of this API.
      • A much smarter rhabdomancer. Calls through ELF .plt stubs are traced back to their callers, and calls in library code recognized by IDA (e.g., via FLIRT signatures) are labeled (lib). Function names are now matched regardless of platform decorations (e.g., the ARM64EC #memcpy kept by IDA 9.5, Apple's stat$INODE64, or 32-bit _WinExec@8), glibc aliases (e.g., __libc_system, __isoc23_sscanf), Universal CRT wrappers (e.g., __o_malloc), and IDA's numeric suffixes (e.g., memset_0).
      • A richer known bad API function list in rhabdomancer, with dozens of new entries, such as wordexp, chroot, syscall, ioctl, the *spawn*, CreateProcess, and LoadLibrary families, and many more. The default configuration is now embedded in the binary, and you can point the RHABDOMANCER_CONFIG environment variable to your own customized copy.
      • Elapsed time reporting in every tool, which came in handy for the benchmarks below.

      Performance optimizations

      • augur now decompiles each function only once , reusing its output files for any further strings it references. This is by far the biggest performance improvement of the bunch, especially on large binaries where a handful of functions reference hundreds of strings.
      • augur also stops retrying functions that already failed to decompile, and avoids repeated calls to the IDA strings API.
      • rhabdomancer uses a single lookup table for known bad functions, caches .plt segment address ranges to avoid repeated FFI round trips, and fetches each function's name only once.

      Important fixes

      • rhabdomancer no longer misses calls in PE binaries (import stubs with numeric suffixes and Universal CRT wrappers) and in statically linked binaries (glibc aliases). The same goes for ARM64EC binaries analyzed with IDA 9.5, macOS binaries (Apple's variant suffixes), and 32-bit Windows binaries (stdcall names). Turns out these were hiding in plain sight 🙈
      • rhabdomancer runs are now idempotent , even when a call site already has a bookmark of its own, and instructions that merely fall through into a bad function (e.g., alignment padding) are no longer marked as call locations.
      • XREF traversal in rhabdomancer and augur is now iterative , to avoid potential stack overflows with large XREF chains, and rhabdomancer's is hardened against cyclic .plt references in crafted or unusual binaries.
      • Function names that come from the analyzed binary are now escaped before they are printed to the terminal, and file names built from the binary's names and strings go through an allowlist. After all, these tools are meant to be pointed at potentially hostile binaries.

      Under the hood, I also enabled clippy restriction lints , added semver- checks to CI to enforce semantic versioning, pinned GitHub Actions to hashes, and wrote (with Claude's help) a lot of new unit, integration, and regression tests , with dedicated test binaries for edge cases such as binaries without functions, binaries without a decompiler, and functions too big to decompile.

      Benchmarks, or it didn't happen

      Talk is cheap, so I've put my claims to the test. I ran the old v0.9.3 releases on IDA 9.3 and the new v1.2.0 releases on IDA 9.5 against the same set of real-world targets, on the same MacBook Air M3. Times include IDA's initial auto-analysis, and each run started from a clean state, without any pre-existing IDB.

      Tool | Target | Arch | Size | v0.9.3 on IDA 9.3 | v1.2.0 on IDA 9.5 | Speedup
      ---|---|---|---|---|---|---
      rhabdomancer | 280 ELF binaries (batch) | AArch64 | 14 MB | 356 secs | 342 secs | +4%
      haruspex | 280 ELF binaries (batch) | AArch64 | 14 MB | 827 secs | 744 secs | +11%
      augur | 36 ELF binaries (batch) | AArch64 | 2.2 MB | 39.3 mins | 124 secs | +1802%

      The last figure in the table is especially remarkable: a staggering +1802% speedup means that augur is now 19x faster , thanks to single-pass decompilation.

      Finally, Semgrep 1.183.0 parses about 99.1% of lines in the pseudocode generated by haruspex v1.2.0, which marks a slight increase compared to the 98.3% measured with the older haruspex/IDA version.

      A word of caution: these numbers measure the combined effect of my code changes and of the IDA upgrade, so they don't tell you which side deserves the credit. Also note that augur now decompiles every function upfront to recover more strings, which costs some time on binaries with few string references, but pays off handsomely on large ones. Your mileage may vary, so please run your own benchmarks and let me know how they fare!

      __

      Looking ahead

      The v1 milestone is by no means the end of the road. My TODO list is as long as ever, and the most ambitious goals on my roadmap are tighter LLM integration , to make the triage of static analysis findings even smoother, and a LibAFL fuzzing stage downstream of static analysis, to confirm candidate vulnerabilities automatically.

      Meanwhile, you can download my updated tools from Hex-Rays community plugins, crates.io, or GitHub. Take them for a spin against your favorite targets, open issues, and submit pull requests!

      Acknowledgments

      I'd like to thank Hex-Rays for welcoming me into their Contributor Program and for inviting me to write on their blog once again. It's been an honor.

      As always, huge thanks to idalib-rs's maintainers , and especially to Sam L. Thomas (@xorpse), for reviewing my pull requests and for keeping this awesome project alive and kicking. ✊

    6. 🔗 The Pragmatic Engineer The Pulse: Details of incident.io’s AI spend 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 five topics from the past issue of The Pulse . Full subscribers received the article below two weeks ago. If you 've been forwarded this email, you can subscribe here .

      incident.io (note: I'm an investor) is a software reliability platform founded in 2021, a year before ChatGPT, that's obsessed with measuring everything. In that spirit, the company has shared details about AI spending, changes to PR frequency, and the ROI at the company from using AI. Thank you to Lawrence Jones and the incident.io team for sharing the data!

      They have come up with the concept of the "effort point" as a way to analyse AI spend. One effort point is a medium-sized pull request written by a human or generated by an agent. The measurement is far from perfect, but it is one step more granular than looking at lines of code, and lets them compare the complexity of AI-generated PRs with those written by human devs in the past. Here's what has changed in the last two years:

      altWhat changed in two years for various metrics at incident.io

      Pull request stats

      At a glance:

      altChanges in numbers of PRs over two years

      AI agents started to generate production code in June 2025, which was around the same time as the first agent-generated got pushed at incident.io. The company has used AI-assisted IDEs since the beginning, such as GitHub Copilot and Cursor.

      altAgent usage exploded in June, when Claude Agents launched

      In June this year, a few things happened in quick succession, the incident.io team told me:

      • Claude Agents launched, making it easier to coordinate several agents running at once
      • Worktree tooling improved a lot, making it easier for agents to do parallel work on the same codebase with worktrees
      • Also around this time, more engineers realized that they should be running multiple agent sessions using different worktrees, rather than driving just one session at once.

      Today, nearly 80% of PRs that ship to production include code generated by an agent:

      altPercentage of all PRs with parts of the code generated by agents

      More:

      • 2.7x headcount growth in product engineering (engineers who ship to production numbered 18 in 2024, and 50 today)
      • 3.4x PR requests shipped to production in September compared to a year ago
      • 3.6x increase in PRs with no human reviewer shipped to prod (12% to 43%)
      • 4.8x increase in the size of PRs (from 22 to 111 lines)
      • 6x "effort points" shipped**** to prod: "effort points" awarded by an AI model estimating the complexity of a PR, and ranking it from XS to XL.
      • 80% decrease in human comments per "effort point"
      • 60% decrease in incidents per 1,000 pull requests

      Stats on release frequency:

      • 47% rise in releases/eng/day when taking headcount into account: an average of 2.8 releases/day/eng, up from 1.9 releases/day/eng in 2024
      • Oct 2026: 140 releases/day to production with 50 engineers. In Oct 2024, the figures were 35 releases/day to prod with 18 engineers

      AI spend

      This year, spending on AI tools is on track to be around $ 1.6M at the company - which is a lot! We're talking around $2,700 per engineer each month, which puts the reliability startup among the big spenders of companies mentioned in this article. Based on that, they've attempted to calculate a rudimentary ROI for the spend. At present, incident.io sees AI tools as mostly positive.

      AI spending peaked this summer and has been decreasing since. In July, the company spent more than $300K on AI (an annual projection of $3.6M, had it continued). Here's the allocation:

      altAllocation of spend on AI at incident.io , mostly on Claude

      Opus 5.5 brought a massive cost reduction. Before it, the company was spending around $4,500/engineer/month, mostly on Opus 5. But now, with the 5.5 version, the cost is down to circa $1,600. Here's the impact of Opus 5.5 on monthly spend:

      altOpus 5.5 is resulting in less than half the previous monthly cost on AI, per engineer

      Also, the adoption of Opus 5.5 has been rapid:

      altShare of models used by engineers inside incident.io

      Cost per "effort point" also peaked over the summer. The nice thing about the "effort point" metric is that it makes it possible to compare the cost of generating a PR to how much it cost a year ago, when the company started using AI agents. Here's the change:

      altCost of generating a medium-sized PR peaked in July-August with Opus 5 and Fable

      Infrastructure teams spend more tokens on the same "effort point." A fascinating detail from incident.io comes from separating the cost of an "effort point." The infrastructure team stands out, spending ~5x more on a medium-sized PR than almost every other team:

      altThe cost of an "effort point" (generating a medium-sized PR) varies based on team

      But why the big difference? Lawrence Jones, an engineer at incident.io, explains:

      "This is a great example of why it's hard to use a single target for cost per PR that applies universally.

      Our AI team, for example, does work that can be very token-intensive such as iterating on evals. Infrastructure teams might use Claude to explore production environments or do lots of analysis or run benchmarks etc which don't lead to PRs, so their cost per-PR looks higher.

      Different types of work will simply have different cost profiles."

      Measuring ROI

      Today, average spend is down at ~$1,600/engineer/month, of which around 80% is on Claude, with 20% going to Cursor. The big question: has AI made engineers more productive? Unfortunately, measuring engineering productivity in only a single dimension is fraught with hazard, but a combination of insights could give a sense of where things are headed. These are imperfect measurements with their own biases, but are still interesting.

      The number of PRs shipped per engineer weekly tracks with tenure. This is a very interesting finding from incident.io. Compared to two years ago:

      • The median engineer shipped ~10% more PRs (10.1 PRs in Oct 2024 with no AI; 10.7 PRs per week in Oct 2026 with AI). An eye-catchingly small change!
      • The mean engineer shipped ~30% more PRs (11.1 PRs in Oct 2024 vs 14.8 PRs in Oct 2026)
      • Tenured engineers shipped ~70% more PRs (11.1 PRs in Oct 2024 vs 19 in Oct 2026)

      New engineers are told to hold off on using AI for a month after they join. The AI SRE startup collected feedback from new engineers and found that new joiners using a lot of AI right after onboarding ended up performing worse in the medium/long term.

      What incident.io found is that it's worth ignoring expectations of shipping velocity during the first month. Instead, new devs learn how to navigate the codebase. This AI-abstinent approach skews the above numbers.

      Harder to quantify: shipping faster & incidents

      Compared to pre-AI, how important is it for PRs to be shipped faster to production? A benefit of AI agents and AI reviews is faster feedback than waiting on someone to review a PR. Here's how quickly the median PR makes it to production at the reliability startup:

      altFast turnaround times both for review readiness, and for deployments

      Let's take an average day - a Tuesday last month - when 185 changes were shipped to production, 75 of which without human review:

      altPRs shipping to production with & without human review at incident.io

      There are fewer incidents per change, but more overall. It would be quite the omission to not bring up reliability when talking about a reliability startup! This is both good and bad news: there's fewer incidents per PR, but more overall due to the existence of more PRs:

      altFew incidents per PR, but more overall incidents

      The good news is that the rate of incidents is lower than expected, given the PR volume:

      altTaking last year's PR "defect rate", there should have been more production incidents

      The team looked into why incidents occurred, and found that most outages were because of incorrect code that could have been caught in review. The team took steps to address this:

      • Improved the codebase for AI use
      • Started leaning more on Cursor's Bugbot, added stricter rules, and saw the tool start to give better feedback and catch more code-related bugs in review
      • Newer models produced better code.

      Today, most incidents are no longer due to faulty code, but because there's information absent about the production environment. The bad news is that if this continues and PR volume grows, then the number of incidents will also rise unless the team avoids outages related to production behavior. They are working on building feedback loops where agents can observe and learn from production.

      altCategorizing production incidents by root cause at incident.io

      I found these data points educational, especially looking at how the "cost per medium-sized PR" does (and probably should!) vary based on the complexity of work that goes into it.Thanks a lot to the incident.io team for sharing such detailed data!


      Read the full issue of The Pulse from two weeks ago. The latest The Pulse**** covers:

      1. What can we learn from the Railway hack? Cloud platform**** Railway has published an extremely detailed postmortem about their recent hack in which the attacker likely used 'abliterated' AI models (those with no safeguards). Railway has hardened its systems as a result. Also, a competitor tried to benefit from the incident by getting Railway's customers to migrate - but then got hacked itself in the exact same way.
      2. Native mobile and frontend jobs are disappearing. New data shows native mobile and frontend job listings are down by 50% at leading startups and Big Tech, while forward deployed engineer (FDE) listings have quadrupled in the same timeframe.
      3. How an extremely efficient engineering team works: Superlogical. Mitchell Hashimoto's new startup is "AI-native" and cares deeply about craft and developer tools. They skip code reviews and commit to main thanks to deep trust between team members.
      4. Industry pulse. Jensen Huang no longer the CEO of NVIIDA, OpenAI buys Pierre Computer, Carta starts selling a coding harness, Meta buys and shuts down Conductor (a T3Code competitor), and Binance hacked with $6.3B stolen after devs were tricked into downloading packages and attending fake interviews.
    7. 🔗 r/LocalLLaMA So this will be true in couple of years? rss

      So this will be true in couple of years? | I think after jensen they will fully focus on AI compute for data centers submitted by /u/UltramanQuar
      [link] [comments]
      ---|---

    8. 🔗 exe.dev Backup and Restore on exe.dev rss

      A common question we see on our Discord and in support is how to back up exe.dev VMs. We've built a backup command (and its good friend, the restore command) to facilitate just that.

      We decided that the best place to store your backups is in your own S3 bucket. To set up backups, you first set up a WIF integration, granting us access to a bucket in S3. Our documentation walks you through the steps, and I'll let you in on a secret: your coding agent is the best way to follow that documentation. Then run the backup command, and voilà.

      Animation: a backup snapshots the VM's disk, cuts it into 1 MB chunks,
hashes each chunk, and uploads, compressed, only the chunks the S3 bucket
doesn't already have under chunks/. It then writes an index from each disk
offset to its chunk under indexes/. When the VM later writes, the next backup
hashes the changed chunks and uploads only the missing ones, so backups are
incremental.

      Our backup format is the same as Casync / Desync. In short, we take your disk, split it into 1 MB chunks, and hash those. We upload compressed chunks identified by hash to S3 (ignoring the ones that haven't changed), and upload an index of those chunks to represent the backup. A VM with a slow-changing disk might only need to update a few chunks at every backup iteration, which makes these backups incremental. Furthermore, because the format is open source, you can use existing tools to reconstruct your disk elsewhere, or even mount it in a lazy FUSE file system.

      Documentation at exe.dev/docs/vm-backups. Give it a try!

    9. 🔗 r/LocalLLaMA Jensen Huang's mistake was being too pro LocalAI, which was a threat to companies like ClosedAI and Anthropic which are about to go IPO rss
    10. 🔗 r/LocalLLaMA CMP170hx now fully unlockabke and more, full 120 SMs —> Techie uses voltage glitching hack to turn $2,500 Nvidia 8GB cryptomining GPU into a full-fat $20,000 A100 with 80GB of VRAM — hack carefully blows onboard fuses to unlock entire VRAM and shader modules rss

      CMP170hx now fully unlockabke and more, full 120 SMs —> Techie uses voltage glitching hack to turn $2,500 Nvidia 8GB cryptomining GPU into a full-fat $20,000 A100 with 80GB of VRAM — hack carefully blows onboard fuses to unlock entire VRAM and shader modules | submitted by /u/chemist_slime
      [link] [comments]
      ---|---

    11. 🔗 backnotprop/plannotator v0.28.62 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.61 | Updates now update the Claude Code plugin too, an agent's chosen face shows on every icon of it, filter the Inbox list by pull request state, Modern dark shows section bands and the Reply button, one conversation no longer shows as two agents
      v0.28.60 | Click a word to highlight it, a one-time Themes dialog, Settings → Rows rebuilt, tell your agent how you want your rows, starred threads as pills above the list, a pill for new messages out of view, a half-circle face picker with ten Glass colours, a new phone sidebar and reply box
      v0.28.59 | A quieter Agents section in the sidebar, machine names only when agents run on more than one machine, agent icons that are always gently alive and lean toward your pointer
      v0.28.58 | Start Codex from New message, an Agents section in the sidebar, start an agent in a folder on any drive, play audio attachments and comment at a moment, Claude Code's Plannotator tools work on Windows
      v0.28.57 | Pin artifacts, and see every artifact on one page, filter the list by project, date or agent, a thread shows its pull requests and their state, choose what the sidebar shows, and in what order, Ask AI starts from Side in the selection bar
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate

      What's New in v0.28.62

      TL;DR

      • Fixed: Agents started from the Inbox now work on Windows
      • New: Pick a model and effort when you start an agent
      • New: Rules for your agents, written in your own words
      • New: Post a thread's decisions on its pull request
      • Changed: The Inbox loads faster on a slow connection

      0.28.62 is a large release. Starting agents from the Inbox now works on Windows, you can choose a model and effort for a new session, and you can give your agents your own rules. It has 57 PRs. Five come from external contributors, and three of those are first contributions: welcome @ilyaZar, @solatis and @tommyent.

      Windows

      Agents started from the Inbox work on Windows

      On Windows, a session started from New message got an empty environment: no PATH, no user profile and no sign-in variables. Claude Code then showed "Not logged in" and never connected to the Inbox, even when the Inbox itself said Claude Code was signed in. Sessions now start with the Inbox's own environment, less Plannotator's own variables. Respawns get it too, and the settings file the Inbox writes for each launch carries PATH again. macOS and Linux are unchanged. #3154

      New message's folder box now reads the paths people type and paste on Windows. C:\Users\me\code, c:/users/me/code, ~\code and a file:///C:/... link all work, and a pasted path keeps its backslashes. A folder outside your home folder, a system folder such as C:\Windows, or a folder Windows hides (such as AppData) now gets a plain note that says why it isn't offered, where before each one said "That isn't a full path." Folders on other drives are still not offered. #3156

      No more console windows flashing up

      A console window opened by itself every few minutes while the Inbox was running. It came from the gh and glab lookups behind pull request marks and hover cards. Every command Plannotator runs in the background now starts hidden: in the Inbox, plan review, code review, annotate, Pi, and the OpenCode, T3 Code and Amp plugins. Things that are meant to open a window, such as your browser, your editor or Explorer, still do. #3143

      Paths with an apostrophe in Claude Code's slash commands

      In Claude Code on Windows, a path with an apostrophe, such as C:\Users\me\O'Brien\plan.md, lost the apostrophe when passed to /plannotator-annotate or /plannotator-review, and the rest of the line ran into one word. On Windows a single quote is now an ordinary character, and only double quotes group words with spaces, as on a Windows command line. Git Bash and PowerShell get the same words. macOS and Linux are unchanged. #3161

      Starting agents from the Inbox

      Pick a model and effort

      When New message starts a new session, the To line now ends with a quiet "Default model" button. If you leave it alone, nothing changes. Open it to pick a Model and an Effort for Claude Code or Pi; the lists come from the installed CLI's own help. Your choice is remembered per machine and agent, reused by Try again and respawn, and shown in the thread header (for example "· opus · high"). Settings → Agents → Claude Code has Model and Effort defaults.

      Settings → Agents also has a Claude settings file. Its keys are merged into the settings the Inbox writes for each session it starts, so a Claude Code profile that points at a company gateway also applies to sessions started from the Inbox. A missing or invalid file is reported on the run line by its path only, and its contents are never logged or sent anywhere. #3097, closing #3064 by @rqres

      A plugin turned on only in the project counts

      If you turned on Plannotator's plugin only in a project's .claude/settings.json or .claude/settings.local.json, the Inbox refused to start Claude Code there and said the plugin was off. It now reads the settings for the folder it starts in, in Claude Code's own order: managed settings, then the project's local file, then its shared file, then your user settings. A project can turn the plugin on for itself, or off. #3144, closing #3065 by @Arobotmaster

      The first agent on a new Inbox

      On a new Inbox with no projects yet, New message said "No agent is running" and offered nothing to start, so the first agent could never be started from the Inbox, on any platform. It now offers to start a new session in a new scratch folder. #3159

      Plannotator Inbox

      Rules for your agents

      Settings → Prompts has a new box at the top, Rules for your agents. Write how you want agents to use the Inbox in your own words, such as "Only message me when you are blocked or done" or "Keep messages under 10 lines", and choose who they are for: all agents, Claude Code, Pi or OpenCode. Plannotator's own reminder stays. Your rules come after it, with one line that tells the agent they come from you and win over the lines above. Agents get them at session start and again after a compaction. With no rules, agents get exactly the same text as before.

      The long built-in reminder is now folded into one row, "Reminder text · Default", and replacing it works as before. A one-time "Set the rules" dialog points to the new box, once you have used the Inbox for two days and have ten threads. In config.json the rules are prompts.inbox.rules, or prompts.inbox.runtimes.<agent>.rules for one agent. #3145, toward #2194 by @zane668

      Your Guided Review instructions, everywhere

      Settings → Prompts also has a Guided reviews row for your standing instructions, the text added to every guided review, whether it starts from the Inbox, the review page or VS Code. Before, the Inbox could not show or edit them. #3134

      A guide an agent writes through the Inbox now follows those instructions too. Before, only guides started from the review page or VS Code did. #2956 by @solatis

      Export a thread's decisions, or post them on its pull request

      A thread's ⋯ menu has Export decisions. It downloads every question in the thread with its state, as Markdown that reads well on GitHub or as one HTML file that makes no outside requests. Decisions come first, then the questions still open, skipped, set aside and so on. Session ids and machine names are left out, your home folder becomes ~, and local network addresses become "(local link)". #3080

      From the same menu, or the Post decisions button on a pull request in the thread's PR card, one click puts the thread's decisions on that GitHub pull request or GitLab merge request. By default they go into the description as one section at the end; posting again replaces only that section and leaves the rest of the description as it was. You can choose a comment instead, or a short section with the full version in a comment. When you can't edit the description, it posts a comment and says so. Agents and scripts can do the same with plannotator inbox export-decisions --thread <id>. #3083

      Your own agent icons

      The agent face picker has two new places. Your own… takes a picture you pick, drop or paste, and shows it as that agent's icon everywhere its face shows. An animated GIF moves in the sidebar only. #3087

      Sets offers four built-in icon sets you can search by name or number: Tiny Creatures, game-icons.net, Dungeon Crawl tiles and Noto Emoji 3D. More sets can be downloaded from the picker; your own Inbox fetches a set once and keeps it, so it works offline after that. #3090

      Under your own picture, Animate it opens New message with the request and the picture filled in. Send it to an agent, and the animated result replaces the icon in every window. Use the original puts your picture back. #3105

      The icon dialogs also got ten fixes from a phone, touch and slow-link pass. A tap now picks a face on an iPhone or iPad, and a still photo over 512 KB is shrunk instead of refused. #3122

      Rows show the latest message, and which session

      The grey line under a thread row now shows the thread's latest message instead of its subject, like a mail app: the newest unread agent message, your own reply as "You: …", "Asked: …" for a question and "You answered: …" for your answer. In Settings → Rows, "Subject preview" is now "Preview", and a saved choice carries over. #3006

      In a project with two or more live sessions, each row now shows the session's name in place of the project name, so you can tell them apart. Projects with one session look as before. #3095

      Mark read asks before setting questions aside

      Mark read can close a thread's open questions and action items and tell the agent not to wait on them. It did that without a word. Now the Inbox asks first, but only when something would be set aside; otherwise Mark read stays instant. This covers every way to mark read, including E and a project's Mark all as read. "Don't show this again" can be turned back on in Settings → General → When an agent asks you. #3079

      More in the Inbox

      • Click an agent to see its threads. A click on an agent in the sidebar's Agents section now filters the list to that agent's threads. Click it again to clear. Before, it opened the last thread the agent wrote in. #3081
      • Mark read and Snooze moved into the thread's ⋯ menu, to give the title more room. E and H work as before. #3126
      • Pictures on comments. Every comment box in the Inbox has the picture button Annotate has. The picture goes to the agent as an attachment of the reply that carries the comment. #3148
      • "Other" takes several lines. The "Other…" field under a question's choices grows with what you type, and the agent receives the lines as lines. #3078
      • Show a thread in the open window. plannotator inbox --open <thread> moves the Inbox window you used last on this computer to that thread, the same as a click on its row, or opens a new one. #3130, closing #2506 by @timmo001
      • Install the Inbox as an app with a sharp icon. The Inbox now has a web app manifest, so installing it from Chrome or Safari gives a sharp Dock icon in your favicon style. The unread count shows on the app's icon too, where the system allows it. #3056 by @tommyent, #3147
      • Tailscale publishes again by itself. With "Reach the Inbox over Tailscale" on, a publish that failed because Tailscale was off or still starting is now tried again until Tailscale is back, and Settings updates without a reload. #3128

      Your phone and other devices

      Fewer limits between your own devices

      Plannotator treated your phone, iPad and other computers on your tailnet as strangers in many places. Now, over Tailscale, they get what the computer gets: you can pair a phone, link or unlink a Mac, change tailnet settings, see first-run prompts and What's new, see project pictures, and delete a launched agent from a phone-width page. Open in, Open in Terminal and Choose in Finder still stay on the computer, since they would open on its screen.

      Several silent cuts are gone too. Long answers, long "Other" answers and long notes in a question arrive whole, a question keeps every choice, and agent names are no longer cut at 40 characters. Guided Review instructions can now be 12,000 characters (were 2,000) and the custom Inbox reminder 9,000 (was about 4,100), with a count near the limit. Ask AI reads up to 300,000 characters of a plan, document or diff.

      Over SSH, a request that comes through your own tunnel or editor port forward now gets what a local session gets, such as Ask this session and link hover cards. PLANNOTATOR_REMOTE=1 still means remote mode for every request. #3121

      On a phone or tablet

      • "Transcribing…" stays in the reply box. While dictation transcribed, the "Transcribing…" marker could run past the box's edge and under the ⌄ button. It now stays inside the box, on the next line when needed. #3208
      • Hold a row for its menu. On a touch screen, holding a thread row opens the same menu a right-click opens on a desktop: as a bottom sheet on a phone, under the row on an iPad. A tap still opens the thread at once. #3131
      • One tap opens a row on an iPad. On an iPad, opening a thread from the list, or a project or starred thread from the sidebar, could take two taps. One tap now does it, and the sidebar's ⋯ and + buttons always show on a touch screen. #3129, #3137
      • The pull requests sheet. On a phone, a thread's pull request list was drawn as a narrow strip with cut titles. It is now a proper bottom sheet, like the thread's ⋯ sheet, and a tablet gets the card under the button. #3127

      A faster Inbox on a slow connection

      Compression and caching used to apply only over Tailscale. They now cover every way you reach the Inbox, including a plain proxy or an SSH tunnel. On a test link with 300 ms delay and 1 Mbit/s, the first load went from 71 s to 25 s and a reload from 20 s to under 1.5 s. #3088

      The window also asks the server less. Typed answers save after a short pause instead of on every key, threads you click past are not loaded, and Mark read, Archive and Star show at once (on the same test link, Mark read went from 742 ms to 10 ms). When two windows answer the same question, the later click wins with no error. #3089

      Code review

      Call tree

      Code review's Call flow tab has a new Call tree view, and it opens there by default: the change's calls drawn as one indented tree, with red and green bands for removed and added calls. Hunks that have a tree get a "Call tree" entry that opens it, rooted at the function around the hunk. In the tree, Enter opens the line and C adds a comment. Paths and Raw are one click away. #3086

      Pictures and videos in a pull request open in Artifacts

      In a PR description and the Comments tab, a click on a picture now opens the Artifacts panel at that picture, large, where you can comment on a point. Before, nothing happened. A video GitHub saved as a bare link opens in Artifacts too, plays through the server (private repositories too) and takes comments at a moment; Cmd/Ctrl-click still opens GitHub. Screenshots written as &lt;img&gt; tags inside a description's table now show as pictures instead of raw text. #3149

      The server that fetches those pictures and videos now follows redirects only to GitHub's own hosts, sends your GitHub sign-in only to the first request's host, and serves only picture and video types. Nothing should change in what you see. #3166

      GitLab: request changes, and approve your own MR

      Request changes on a GitLab merge request now sets your reviewer state to "Requested changes", not only the comments. It also stays available on your own MR, since GitLab accepts it there. #2723 by @bendrucker

      Approve was greyed out on your own GitLab merge request. GitLab accepts an author's approval unless the project forbids it, so Approve now stays on and GitLab decides. When GitLab refuses, the review says so and why it may have refused, and you can still comment or request changes. GitHub is unchanged. #3132

      Plan review and annotate

      • Ctrl+C copies the highlight after the comment box opens. Once the comment box opened on a highlight, Ctrl+C / Cmd+C copied nothing. It now copies the highlighted text, in plan review, annotate, HTML documents, the version diff and code review's line comments. Text you select yourself, in the comment box or the page, still copies as usual. #2623 by @BenNewman100
      • Mod+Shift+Enter opens the note composer. In plan review and annotate, Mod+Shift+Enter opens "Send with a note" (or "Send a note") directly; Mod+Enter in it sends as before. #2913 by @ilyaZar, closing #2912 by @ilyaZar
      • A broken Mermaid diagram stays in its message. A failed render could leave a "Syntax error in text" graphic at the bottom of the page and make it scroll. Nothing is left outside the message now, and a diagram type that failed to load is tried once more before showing its source with a Reload line. This covers the Inbox, plan review, annotate, code review and the VS Code Guides. #3091

      Installing and updating

      A broken download now continues where it stopped instead of starting the large binary again from zero, on macOS, Linux and Windows. The checksum check is unchanged. The Claude Code plugin step also gets 10 minutes instead of Claude Code's own 2-minute limit, which slow links hit with "Git clone timed out after 120s". #3096

      After an update, when open Claude Code sessions will not pick up the new plugin by themselves, the installer shows one system notification and opens a short help page with the steps. It shows only while a Claude Code session is open and never on a fresh install, in CI or over SSH. PLANNOTATOR_INSTALL_NOTIFY=0 turns it off. #3074, #3073

      Inbox storage on SQLite: early, and off by default

      This release lays the ground for keeping the Inbox's records in SQLite. It changes nothing about where anyone's Inbox data lives: every Inbox, new installs included, keeps using its files as before. #3106, #3107

      There is an early, optional switch to try it: inboxSqlite in config.json, or PLANNOTATOR_INBOX_SQLITE=1. It is off unless you set it, and has no Settings row. When on, the next start moves your records into inbox.db after checking that it reads the same, and keeps your original files as a dated backup. Turn it off again and the next start moves everything back into files, including messages written in between. #3114

      Fixes

      • A stuckgh or glab no longer freezes the Inbox. Hovering a pull request mark could show "Loading…" forever, and after a few hovers no thread would open until the tab was closed. Lookups now end at their time limit, and the hover answers with what the Inbox already knows. #3082
      • A list read with nothing new no longer redraws the whole window. #3104

      Additional Changes

      • Smaller repository download. The site's demo videos are served from the site's storage instead of being kept in the repository. #3092
      • Site pictures for posted decisions. #3084, #3085
      • Test upkeep. #3094, #3125, #3164

      Install / Update

      macOS / Linux:

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

      Windows:

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

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

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator --scope user
      

      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

      • Site: a help page for a Claude Code plugin left behind by an update by @backnotprop in #3073
      • Installers: tell the person when open Claude Code sessions need a manual step by @backnotprop in #3074
      • Site: host the Decisions banner pictures by @backnotprop in #3084
      • Site: Decisions banner sits flush left, shorter, no background by @backnotprop in #3085
      • Inbox: export a thread's decisions as Markdown or HTML by @backnotprop in #3080
      • Let a question's Other answer take several lines by @backnotprop in #3078
      • Inbox: clicking a sidebar agent filters the list to its threads by @backnotprop in #3081
      • Inbox: warn before Mark read sets open questions aside by @backnotprop in #3079
      • Code review: Call tree (phase 1) by @backnotprop in #3086
      • e2e: the thread menu's expected items include Export decisions by @backnotprop in #3094
      • Marketing videos are served from the site's storage, not kept in the repository by @backnotprop in #3092
      • Inbox: a thread row's grey line shows its latest message by @backnotprop in #3006
      • fix(inbox): a list read with nothing new sets no state, so it never draws by @backnotprop in #3104
      • Inbox: post a thread's decisions on its pull request by @backnotprop in #3083
      • Inbox: your own picture as an agent's icon by @backnotprop in #3087
      • Inbox: icon sets for agent icons by @backnotprop in #3090
      • Inbox: Animate it, for your own agent icon by @backnotprop in #3105
      • Inbox: a stuck gh or glab can no longer freeze the window by @backnotprop in #3082
      • Inbox e2e: measured times for the untimed specs by @backnotprop in #3125
      • Updates resume a broken download, and the plugin step gets more time by @backnotprop in #3096
      • feat(review): request changes on GitLab MRs by @bendrucker in #2723
      • feat: Mod+Shift+Enter opens the send-with-a-note composer by @ilyaZar in #2913
      • Diagrams: a failed Mermaid render never leaks outside its message by @backnotprop in #3091
      • Let authors approve their own GitLab MR; show GitLab's refusal by @backnotprop in #3132
      • Inbox: show a thread in the open window (plannotator inbox --open <thread>) by @backnotprop in #3130
      • Inbox icon dialogs: ten fixes from the phone, touch and slow-link sweep by @backnotprop in #3122
      • Feature: apply guide standing instructions in get_guide_brief by @solatis in #2956
      • Inbox: a web app manifest with the studio's large icons, and the count on the Dock icon by @tommyent in #3056
      • Inbox: Mark read and Snooze move into the thread header's ⋯ menu by @backnotprop in #3126
      • Inbox Settings → Prompts: Guided reviews row by @backnotprop in #3134
      • fix(ui): Ctrl+C copies the highlighted text once the comment box is open by @BenNewman100 in #2623
      • Inbox: on a touch screen the first tap on a row opens it by @backnotprop in #3129 (landed with #3137)
      • Inbox: on a touch screen the sidebar's ⋯ and + buttons always show by @backnotprop in #3137
      • Inbox: publish over Tailscale by itself once Tailscale is back by @backnotprop in #3128
      • Inbox: on a phone the thread's pull requests open as a bottom sheet like the ⋯ sheet by @backnotprop in #3127
      • Settings: the Favicon row mentions the installed app by @backnotprop in #3147
      • Windows: start agents with the Inbox's own environment by @backnotprop in #3154
      • Inbox: on a touch screen, hold a thread row for its menu by @backnotprop in #3131
      • Inbox e2e: the iPhone scroll-return case presses the tile where it is by @backnotprop in #3164
      • Keep a Windows path's apostrophe in slash-command arguments by @backnotprop in #3161
      • Review: the PR picture and video proxy follows only GitHub's own redirects by @backnotprop in #3166
      • Inbox launch: a plugin enabled in the project's settings counts as on by @backnotprop in #3144
      • Remove defensive limits: the same Inbox on every device, and no silent cuts by @backnotprop in #3121
      • Inbox: pictures on comments, sent with the reply as attachments by @backnotprop in #3148
      • Inbox: compress and cache on every listener by @backnotprop in #3088
      • Windows: the Inbox's background commands no longer flash a console window by @backnotprop in #3143
      • Let a fresh Inbox start its first agent in a scratch folder by @backnotprop in #3159
      • Inbox: pick a model and effort when starting an agent, and a Claude settings file by @backnotprop in #3097
      • Inbox: Rules for your agents (#2194) by @backnotprop in #3145
      • Code review: pictures and videos in PR text open in Artifacts by @backnotprop in #3149
      • Inbox: list rows tell sessions in one folder apart by @backnotprop in #3095
      • Read Windows folder paths in New message's folder box by @backnotprop in #3156
      • Inbox window on a slow link: fewer reads, writes show at once by @backnotprop in #3089
      • Inbox store: one interface in front of the record log by @backnotprop in #3106
      • Inbox: keep "Transcribing…" inside the reply box on a phone by @backnotprop in #3208
      • Inbox store: a SQLite log behind the interface (not used by anyone yet) by @backnotprop in #3107
      • Inbox store: import to SQLite, export back, behind an off switch by @backnotprop in #3114

      New Contributors

      Contributors

      @BenNewman100 kept running into a copy that did nothing: select words, open the comment box, press Ctrl+C, get nothing. He fixed it in all five places it happened, with tests for each and a check on Windows 11.

      @bendrucker made Request changes on GitLab set the reviewer state GitLab shows, and tested it against a real merge request.

      @ilyaZar asked for a shortcut to send with a note in #2912, then built it.

      @solatis wanted to shape the guided reviews agents write through the Inbox, found that the Inbox ignored the standing instructions file, and fixed it.

      @tommyent gave the installed Inbox app a manifest, sharp icons and an unread count on its Dock icon, and checked it in Chrome and Safari.

      Thanks also to the people whose issues shaped this release:

      • @rqres asked to change how the Inbox starts Claude Code sessions (#3064), which led to the Claude settings file
      • @Arobotmaster reported that a plugin turned on only in a project was refused (#3065)
      • @timmo001 asked for a way to show a thread in an open Inbox window (#2506)
      • @zane668 asked to customize how agents use the Inbox and write to it (#2194)

      Full Changelog : v0.28.61...v0.28.62

    12. 🔗 r/LocalLLaMA Nvidia's Jensen Huang Resigns as CEO, Colette Kress Named Interim rss
    13. 🔗 HexRaysSA/plugin-repository commits sync repo: +1 plugin, +1 release rss
      sync repo: +1 plugin, +1 release
      
      ## New plugins
      - [kflow](https://github.com/nightshift-labs-ai/kflow) (0.0.1)
      
    14. 🔗 MetaBrainz Picard 3.0.5 released rss

      Picard 3.0.5 is a maintenance release for the recently released Picard 3.0 with fixes for reported issues. This release fixes issues with saving the order of cover art providers, manually set artwork for multiple files not being saved, a potential crash when logging out of your MusicBrainz account and many more.

      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-3511] - Saving embedded artwork fails when setting the artwork for multiple selected files
      • [PICARD-3525] - Restore Defaults uses wrong values for plugins
      • [PICARD-3538] - Unable to change cover art provider order
      • [PICARD-3541] - Views stay suspended and the pending files count never reaches zero when a file is removed while it is still loading
      • [PICARD-3542] - "Automatically cluster all new files" can skip clustering depending on which file finishes loading last
      • [PICARD-3543] - CD lookup reads a wrong drive name when the CD lookup devices setting has spaces or empty items
      • [PICARD-3550] - After filtering the "Unmatched Files" entry shows up for all loaded releases
      • [PICARD-3554] - Hovering over the closing % of a variable shows an empty tooltip
      • [PICARD-3556] - CLI: command alias "plugin uninstall" not working
      • [PICARD-3559] - Crash on logout error if option window was closed

      Improvements

      • [PICARD-3553] - Allow setting PICARD_FORCE_FUSION=0 to opt-out of using Qt's Fusion style

      Download

      Picard 3.0.5 is available for download from the download page of the Picard website. For Windows 10 and 11 users installing from the Microsoft Store and Linux users using the Snap Store will receive the update soon. The Linux Flatpak package is maintained separately and will also be updated soon.

      Please note that unfortunately we can no longer provide updates for the ARM64 versions of the Linux Snap package. See this forum post for more information. If you are currently using the Linux Snap on an ARM64 system consider installing the Flatpak or a native package, if available.

      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.

    15. 🔗 HexRaysSA/plugin-repository commits add nightshift-labs-ai/kflow to known repositories rss
      add nightshift-labs-ai/kflow to known repositories
      
    16. 🔗 Console.dev newsletter Sponsor: WarpBuild rss

      WarpBuild - Linux, macOS and Windows on x86-64 and ARM64. Unlimited macOS concurrency. Get $50 in free credits.

      Visit WarpBuild

    17. 🔗 Console.dev newsletter TextJS rss

      Full-stack console apps.

      What we like: Uses the browser console to render full applications. Supports React 19 and Flexbox (using Wasm). Flexibility over styling, routing, data handlers, tables, charts. Custom inputs and key mapping. Can also render to a terminal.

      What we dislike: Whilst this is fun, the project doesn’t really explain why you’d want to do this!

    18. 🔗 Console.dev newsletter AWS Emulator rss

      Official AWS API Emulator.

      What we like: Local, single (Rust) binary that emulates AWS APIs. Can easily point the CLI and SDKs at it. Supports being embedded for isolated test instances. Includes agent skills and can run as a server.

      What we dislike: Doesn’t have full fidelity with all AWS APIs and it’s not easy to find out, but you can ask your AI agent to check for you.

    19. 🔗 Console.dev newsletter Sponsor: ARCA rss

      Get paid for your AI coding

      Visit ARCA

    20. 🔗 Console.dev newsletter Sponsor: Token Custodian rss

      AI, governed

      Visit Token Custodian

    21. 🔗 Rust Blog Announcing Rust 1.100.0 rss

      The Rust team is happy to announce a new version of Rust, 1.100.0. Rust is a programming language empowering everyone to build reliable and efficient software.

      If you have a previous version of Rust installed via rustup, you can get 1.100.0 with:

      $ rustup update stable
      

      If you don't have it already, you can get rustup from the appropriate page on our website, and check out the detailed release notes for 1.100.0.

      If you'd like to help us out by testing future releases, you might consider updating locally to use the beta channel (rustup default beta) or the nightly channel (rustup default nightly). Please report any bugs you might come across!

      What's in 1.100.0 stable

      Never type

      After 10 years and 5 failed stabilization attempts, thenever type is finally stable! This also completes the project goal for this work.

      The never type, spelled ! in code, is the canonical uninhabited type. It represents the type of diverging computations – computations which never resolve to any value – where any code that follows is unreachable. Expressions that terminate control flow, such as return, break, and std::process::exit, also have the type !.

      Since having a value of the never type is impossible, Rust permits a never-to- any coercion, allowing to turn ! into any other type (this is what distinguishes it from any other uninhabited types). This can be used, for example, to not return a value from one of the branches of a match or an if:

      fn mrrrow(option: Option<u32>) {
          let value = match option {
              // `x` has type `u32`
              Some(x) => x,
              // `return` has type `!`, which is then coerced to `u32`,
              // allowing the `match` to pass type checking.
              None => return,
          };
          // ...
      }
      

      While the never type could already be used and observed this way, and even named in the return type of functions (-> !), this release allows naming the never type anywhere:

      fn infallible_unwrap<T>(res: Result<T, !>) -> T {
          // ^^ writing `Result<_, !>` was not allowed before
          let Ok(v) = res;
          v
      }
      

      Additionally this release changes Infallible to be an alias to the never type. That makes all old APIs that used Infallible be compatible with using !. This was the plan ever since the introduction of Infallible and is one of the reasons why the never type stabilization was so hard (waffle gave a talk about some of the troubles of the stabilization).

      Unfortunately, to allow changing Infallible, we had to introduce a breaking change. This release changes the "never type fallback" from () to ! in editions before 2024 (i.e. 2015, 2018, and 2021), similarly to what has already been done in edition 2024. This should largely be unnoticeable, but can affect code in some rare cases (for example when ignoring a result of a function returning a generic parameter). Note that this change might also make the compiler detect more code as unreachable.

      We tried to minimize the impact of this breaking change as much as possible, by providing future compatibility warnings far in advance and releasing fixes to public crates that have been broken by this. If a dependency is failing due to issues with the never type, consider updating it, as a fix might have already been released for it.

      Allocator API

      This release brings about the stabilization of the core parts of allocator_api, enabling library authors to define custom allocators that can be used together with certain standard library types - currently Vec and Box. These are enabled through the newly-stabilized Allocator trait.

      This is the foundation of the Allocators 1.0 project goal. A lot remains to be done still, including expanding the API surface usable with custom allocators and stabilizing their use on more collections and pointer types; with the core trait and design out of the way though, expect to see more being stabilized soon!

      DropGuard: run a closure on every exit path

      The Drop trait in Rust makes it possible to run code when a variable goes out of scope, regardless of whether we return, ?, or panic. Drop being a part of types means that in Rust you never have to close a socket.

      Implementing Drop can however feel a little inconvenient when all you want is to run some code unconditionally when a function exits. This is why we’re introducing core::mem::DropGuard: a new helper type that runs a closure when dropped.

      DropGuard takes two arguments: a variable and a closure. It implements Deref and DerefMut so you can keep working with the variable as normal. But when dropped it runs the closure and consumes the variable.

      DropGuard also implements a dismiss associated function[1] which returns the variable from the guard without running the destructor. This makes it possible to quickly implement all-or-nothing transaction-like APIs with a rollback. Here is an example implementing a parser which uses a guard to roll back mutations in case of failure:

      use std::mem::DropGuard;
      use std::num::ParseIntError;
      
      /// Attempt to parse all `strings` and push them into `nums`.
      /// If parsing any of them fails, `nums` remains unchanged.
      fn parse_all(nums: &mut Vec<u32>, strings: &[&str]) -> Result<(), ParseIntError> {
          let len = nums.len();
          let mut nums = DropGuard::new(nums, move |nums| {
              nums.truncate(len);    // ← 1. Reset the vec on failure
          });
      
          for s in strings {
              nums.push(s.parse()?); // ← 2. If `?` returns an error, roll back
          }
      
          DropGuard::dismiss(nums);  // ← 3. Parsing successful, dismiss the guard
          Ok(())
      }
      

      Conjuring zero-sized types

      As Rust's unsafe code guidelines are still being decided, it became clear that it would be very useful to decide what exactly it means to create zero-sized types in an unsafe way, and what we should recommend for people to do this.

      This question is answered in Rust 1.100 with a single function: std::mem::conjure_zst.

      Instead of transmuting (), MaybeUninit::uninit().assume_init(), or various other incantations, this is the dedicated way to create a value of a zero- sized type when you know that doing so is safe to do. If an inhabited type has no size, we know exactly what value it must be: nothing.

      Of course, APIs often rely on the inability to construct such types for safety, and that's why this function is unsafe. For example, PyO3's Python<'py> is a zero-sized marker token that represents holding the Python GIL (global interpreter lock). Many of Python's APIs require holding this lock to be safe, but conjuring a token from thin air would allow safe PyO3 calls to violate that precondition.

      Reporting unused dependencies in Cargo

      Building dependencies that are no longer used or are only needed for specific platforms can slow down builds. Rustc has the unused_crate_dependencies lint for this but it has false positives when used with Cargo because dependencies may be shared between multiple build targets, e.g. dependencies.tracing- subscriber being available for every bin in a package when only some may use it.

      Cargo now reports unused dependencies to users, e.g.

      warning: unused dependency `tracing-subscriber`
        --> Cargo.toml:23:1
         |
      23 | tracing-subscriber.workspace = true
         | ^^^^^^^^^^^^^^^^^^
         |
         = note: `cargo::unused_dependencies` is set to `warn` by default
      help: consider removing the dependency on `tracing-subscriber`
      

      A limitation of this warning is that it will only appear when building every build target that may use an entry in a dependencies table. For example, running cargo check --bin foo won't show warnings for unused [dependencies] because another bin may be present that uses them. No warning will be shown for unused dev-dependencies because there isn't a way to ensure every development build target is built.

      This warning is being introduced as part of a new linting system for Cargo, controlled by the [lints.cargo] table in Cargo.toml, completing this project goal. See also the other lints that have been introduced.

      Reducing Cargo cache collisions

      Cargo builds all libraries and binaries in the build-dir and then uplifts final artifacts to the target-dir. At this time, these share a common parent directory. Different build configurations, like --features, can lead to different copies of libraries and binaries in the build-dir. These copies are kept unique by a build-configuration hash but this hash was not always applied due to platform constraints. This can lead to extra rebuilds, missed rebuilds, confusion over what binaries or libraries are used, and so on. These problems get exacerbated when sharing a build-dir across git worktrees.

      The build-dir now consistently applies the build-configuration hash to all content by organizing the directories around their build step, rather than their file type, and moving the hash from a file's name to the parent directory.

      This work began with the build directory layout project goal in 2025, and its stabilization is a milestone toward a new project goal, unblocking future improvements such as cache garbage collection, cross- workspace cache de-duplication, cross-workspace caching, and fine grain locking.

      We previously published a call for testing for the changes that are now taking effect. While this is an internal change, this may break build processes and tests that had workarounds for missing or incomplete features. In some cases, the workaround is no longer needed. See cargo#17287 for possible solutions and to add any new use cases.

      Cargo min-publish-age a.k.a. dependency cooldowns

      Malicious versions of packages are often caught within hours or days after being published, by either automated scanners or by the community. Rust 1.100 stabilizes Cargo's min-publish-age aware dependency resolution, which lets you wait for that window before it picks up newly published versions. This practice is also known as dependency cooldowns.

      You can opt in via .cargo/config.toml:

      [registry]
      global-min-publish-age = "3 days"
      

      When selecting versions, Cargo now skips any version published more recently than that, and tells you what it held back:

      $ cargo update
          Updating crates.io index
           Locking 2 packages to highest compatible version as of min-publish-age
            Adding cc v1.11.0 (available: v1.18.0, published 3 hours ago)
            Adding clap 4.6.7 (available: 4.6.9, published 2 days ago)
      

      When a new version is needed right away, you can override the check for a single update:

      $ CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow cargo update clap --precise 4.6.9
          Updating crates.io index
          Updating clap 4.6.7 -> clap 4.6.9 (published 2 days ago, minimum age 3 days)
      

      The newer version will be recorded in Cargo.lock and kept from then on until a later cargo update re-resolves it.

      A few things to keep in mind:

      • This depends on the registry recording when each version was published. Versions without a pubtime field in the index are never held back.

      • cargo install ignores the minimum publish age, for both the installed crate and its dependencies. Pin a version with cargo install foo@1.2.3 if needed.

      • Cooldowns reduce the risk from some supply chain attacks but are not a complete defense on their own. Please keep reviewing dependency updates as you otherwise would.

      Further work to protect the ecosystem is planned under the crates.io supply chain hardening project goal, including quarantine support and automated detection of suspicious releases.

      Stabilized APIs

      Other changes

      Check out everything that changed in Rust, Cargo, and Clippy.

      Contributors to 1.100.0

      Many people came together to create Rust 1.100.0. We couldn't have done it without all of you. Thanks!

      1. it has deliberately been chosen not to be a method to avoid name collisions with the DerefMut-enabled method resolution on the inner type. ↩
    22. 🔗 New Music Releases Bullet for My Valentine - I Don't Trust Tomorrow rss

      Bullet for My Valentine - a new release is available:

      • 2026-11-12: I Don't Trust Tomorrow (Single)

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

      Visit muspy for more information.

    23. 🔗 New Music Releases TesseracT - Crucible rss

      TesseracT - a new release is available:

      • 2026-11-12: Crucible (Single)

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

      Visit muspy for more information.

    24. 🔗 Ampcode News Bye Bye, Dial rss

      Today we're saying goodbye to the Dial and its four modes: low, medium, high, and ultra.

      A model selector takes its place:

      The model selector open below the prompt box. Opus 5.5 is at the top with a Staff Pick tag, then GPT-6 Astra, GLM-5.3-Flash, and GPT-6.1 Sol. An icon on each row shows who bills you: Claude, ChatGPT, or Amp. A card next to the list describes Claude Opus 5.5 and says it is served by your personal Claude subscription.

      You can now pick the model and its effort for each thread. And you can now also switch both in the middle of a thread.

      The model selector now also shows you which of your subscriptions or API keys will be billed for each model, or whether it uses Amp credits.

      If you don't want to pick the model yourself, use the Staff Pick, which is the model we would choose.

      Yes, We Changed Our Mind

      In January we explained why Amp does not have a model selector. In July we then shipped the Dial so you could focus on how hard a task is instead of thinking about model names and version numbers. And it worked: when we changed the default model behind the Dial, nobody complained.

      But then we added the ability to Amp to bring your own subscriptions and keys, and Amp became free when you do. That changed what the selected model does. Not only is it what produces the tokens, but it also started to decide who gets billed. medium on the Dial could use your Claude plan, or your ChatGPT plan, or Amp credits, and it became very hard to tell who's paying for which model when.

      And that's not to speak of all the settings we had to add to the Dial to make it work in every combination.

      So we decided to stop hiding the model and now have a model selector. Now, when you pick it yourself, you know where the tokens come from and who's paying.

      And yet, it's still not just a model you pick. An agent is more than a model. You pick the model, and we build the harness around it: each model in the selector gets a system prompt and tools optimized for it, and both switch when you switch models in a thread.

      Switch Models in a Thread

      With the Dial, a thread kept the mode (and model) it started with. We did that because a model became confused when it continued a conversation that another model had started. But now models are good enough to recover from that.

      Now you can change the model mid-thread by opening the selector and making the change. After your next message the new model will be used and the transcript will show a record: "Switched to GPT-6.1 Sol · High".

      But some things haven't changed. A model switch still has a price. Prompt caches belong to one model, so the new model reads the whole thread uncached, and the first message after a switch costs more.

      Threads that run an agent from a plugin keep that agent.

      Staff Pick

      New threads start on Staff Pick by default. (Except if you had previously configured the Dial to have a default mode.)

      Staff Pick is the model we would pick ourselves, which is Claude Opus 5.5 today. We keep benchmarking models, and we'll change the pick when another model does better.

      In Settings → Model Selector, under New Threads Start On, you can also start new threads on the model you picked last, or on one fixed model you choose.

      What Happens to Your Dial

      Until today everyone used the Dial, so this applies to you.

      New threads start on Staff Pick, whichever mode you used last.

      Existing threads keep working. A thread you started in high continues on the model it ran.

      Dial settings don't carry over. If you changed the model behind a mode in Tune Modes, pick that model in the selector now. If you put your own agents on the Dial in Build Dial, you find them under Other Models.

      If you never changed those settings, these are the models your modes ran. The first three are at the top of the selector, and Claude Fable 5.2 is under Other Models:

      • low: GLM-5.3-Flash
      • medium: Claude Opus 5.5
      • high: GPT-6 Astra
      • ultra: Claude Fable 5.2

      Pin your models in Settings → Model Selector, or leave the selector on Staff Pick.

      Read the Model Selector docs for everything the selector and its settings do.

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

      IDA Plugin Updates on 2026-11-11

      New Releases:

      Activity:

      • btf2ida
        • 18c8c14c: CHANGELOG: modules without BTF, check_module, empty-struct count go i…
        • cbd3f071: Release check: any Linux version banner in the chosen file may match …
        • ee17d9ab: README: ar/tar alternative creates the deb folder first
        • 677082fa: pyright: declare BTF.unchecked_release; no open(None) for a database …
        • f95ab787: No-BTF module: refuse a vmlinux of another kernel release (vermagic v…
        • ee02047e: Module detection = section lookup (not a string search); 32-bit no-BT…
        • e2bec6e3: Summary counts empty structs/unions apart (forward declarations only)…
        • c00033f7: tests/check_module.py: fake-database run on a real .ko; README Try a …
        • 8527763b: F1 measured on Debian 13 nf_tables.ko without .BTF: 154 imports typed…
        • bcad2a22: README: modules with no BTF of their own (F1)
        • 66811a4e: Modules without their own BTF: type their imports from the chosen vml…
        • fd2364b8: 32-bit database: the summary says why no prototype was applied; READM…
        • 0ce968cc: README: demo prototype coverage re-counted on the current demo kernel…
        • 15ba3dcc: A base vmlinux without BTF gets a message that says why (bzImage: ext…
        • e67e91bb: CHANGELOG: AI-agent line for the next release
        • 4772df92: v0.1.19: headless runner never opens a file dialog
        • 81ab14c6: headless: no file dialog without a window (split BTF without -vmlinu…
        • c81bbf13: v0.1.18: headless runner for idalib (tools/btf2ida_headless.py); run_…
        • 70f77604: tests: synthetic __ksymtab test (4 layouts, GPL, code/data/writable c…
        • 3a5fe08c: v0.1.17: -prototypes comments out names that clash with a typedef or…
      • cfiscope
        • 017a9e53: Manifest description says it has not yet been run in real IDA (as the…
        • 54f9e21c: v0.1.17 CHANGELOG corrected by a claims check (runtime comment text, …
        • d4670755: Runtime calls go to __cfi_check of the kernel or the module holding t…
        • aa9d7138: WIP docs: fixture block spacing condensed
        • 4310e0e7: WIP docs: README + CHANGELOG (Unreleased) for the labelled CFI runtim…
        • c90e15b8: WIP eval: runtime calls found from the code vs the symbol-based bucke…
        • c5cad60e: WIP IDA layer: comment the CFI runtime's own calls ('jtCFI runtime: c…
        • ee7e3a09: WIP fixture case call_inline (inlined slow path: find_check_fn, then …
        • 48e82b9a: WIP core/cli: Site.runtime_call_ea (inlined slow path blr = CFI runti…
        • 015375a6: docs: download link for the Android 12 GKI 5.10 measurement (README +…
        • 5b55de58: README/CHANGELOG: measured on Android 12 GKI 5.10 too (no code change…
        • 5e1e29c7: core: link a gap check through the register its slow path passes when…
        • 7beb894c: fixture case call_gap (mov between sub and ror; asserts the check sta…
        • c479f116: core: range checks with up to 4 unrelated words between sub and ror (…
        • c80c2a52: eval_gki_oldcfi: inlined tracepoint loops as their own bucket of unre…
        • 6ca92b0c: v0.1.17: aarch64 Linux 5.x jump-table CFI (Android 12/13 GKI 5.15)
        • 78193493: IDA layer: jump-table CFI candidates count as address taken through t…
        • 54b3faa2: core: range provenance (range_from), no stale 'candidates unknown' no…
        • d1d06f54: IDA layer: site_at prefers the exact call/check and the narrowest spa…
        • 1c554413: README: table row for coverage without the CFI runtime's own calls
      • memlens
        • fbfe84f1: Stub test: a listed CPU without a copy of the variable is skipped, la…
        • e241ca59: README + kernel2elf doc: name the split .percpu.cpu. sections a…
        • 85f13ac5: Per-CPU typing also takes split .percpu.cpu. sections (pre-rele…
        • bd8cf3bf: CHANGELOG: AI-agent line for the next release
        • a5a40d76: v0.3.24: per-CPU typing across CPU-number gaps; Ghidra column re-meas…
        • 354e1782: README: Ghidra column re-measured on current-code exports (all three …
        • 02f1d849: Per-CPU typing takes CPU numbers from the .percpu.cpu sections (no…
        • 6b7e84ad: README: the Export action asks for the ISF (Cancel = Volatility's own…
        • 4cc5988e: v0.3.23: ELF entry = kernel text again (not per-CPU data); Apply kern…
        • 76ad6578: v0.3.22: per-CPU typing also finds cpu_ (only inside .percpu…
        • 31eee379: README: applied-globals note includes the per-CPU variables
        • a295f7db: kernel2elf README: percpu rows and -no-percpu (verified byte-identic…
        • 0530bb58: v0.3.21: headless runner for idalib (tools/memlens_headless.py) + stu…
        • ee2c67fc: CHANGELOG/WRITEUP: this_cpu_off holds the CPU's per-CPU offset (on 7.…
        • b1b2b2c3: README: demo kernel.elf is 68 MB with the per-CPU areas
        • bb68c2a2: v0.3.20: per-CPU variables exported and typed, one copy per CPU
        • 7829a32f: per-CPU: take fixed_percpu_data and the variable at __per_cpu_start; …
        • dfff8ad8: IDA layer: type every CPU's copy (cpu.) of per-CPU variables…
        • e65a0707: kernel2elf: export each CPU's per-CPU area (.percpu.cpu, symbols c…
        • e970d554: v0.3.19: plugin loads on a Python without _lzma; .xz ISF gives one cl…
    2. 🔗 r/LocalLLaMA Nvidia is Preparing to Oust Nvidia CEO Jensen Huang rss
    3. 🔗 r/LocalLLaMA Microsoft files a patent application to train AI models on idle consumer GPUs rss

      According to Microsoft's patent application, it explains breaking down training into small tasks and sending them to devices of owners who opted in. Credits will be the reward. it's just an app and no pay out rate is advertized so I don't even know if the credits would be enough for the electricity.

      Anyway, home internet latency feels like the bigger problem to me.

      https://insider-gaming.com/microsoft-ai-use-your-gpu/

      (English is not my native language, I used an LLM to help translate this post.)

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

    4. 🔗 HexRaysSA/plugin-repository commits sync repo: +3 plugins, +46 releases rss
      sync repo: +3 plugins, +46 releases
      
      ## New plugins
      - [hint-lumina](https://github.com/williballenthin/idawilli) (0.1.0)
      - [navband-visited](https://github.com/williballenthin/idawilli) (0.1.3)
      - [vtloader](https://github.com/williballenthin/idawilli) (1.0.0)
      
      ## New releases
      - [btf2ida](https://github.com/nightshift-labs-ai/btf2ida): 0.1.9, 0.1.8, 0.1.7, 0.1.6, 0.1.5, 0.1.17, 0.1.16, 0.1.15, 0.1.14, 0.1.13, 0.1.12, 0.1.11, 0.1.10
      - [cfiscope](https://github.com/nightshift-labs-ai/cfiscope): 0.1.9, 0.1.8, 0.1.7, 0.1.6, 0.1.5, 0.1.4, 0.1.15, 0.1.14, 0.1.13, 0.1.12, 0.1.11, 0.1.10
      - [colorize-calls](https://github.com/williballenthin/idawilli): 0.1.4
      - [global-struct-dissector](https://github.com/williballenthin/idawilli): 0.1.2
      - [memlens](https://github.com/nightshift-labs-ai/memlens): 0.3.9, 0.3.8, 0.3.7, 0.3.6, 0.3.5, 0.3.19, 0.3.18, 0.3.17, 0.3.16, 0.3.15, 0.3.14, 0.3.13, 0.3.12, 0.3.11, 0.3.10
      - [oplog](https://github.com/williballenthin/idawilli): 0.3.1
      
    5. 🔗 r/LocalLLaMA Open source self driving is here! rss

      Open source self driving is here! | Today NVIDIA releases Alpamayo 2 Edge! I work for Embedl and we have already released an optimized version of the model that is more than 10x faster than pytorch when run on edge hardware like AGX Thor! The model is trained in an RL loop (!) and takes in 6 cameras and the recent motion. Feel free to check it out - you can even run it on a real Thor at: https://embedl.com/nvidia/alpamayo2-edge/thor?tab=run submitted by /u/Course_Latter
      [link] [comments]
      ---|---

    6. 🔗 r/LocalLLaMA New Qwen3.8-27B Unsloth Dynamic V3.1 GGUFs rss

      New Qwen3.8-27B Unsloth Dynamic V3.1 GGUFs | Hey r/LocalLLaMA ! We're releasing new new Unsloth Dynamic v3.1 GGUFs for Qwen3.8-27B! They're better by 5-10% accuracy on DeepSWE, Terminal Bench and more vs UD3, GSQ-RCO and Exllama-3! We're also improving our algorithms further so we can apply them to Qwen4 so folks can have efficient and accurate quants!

      • All quants from 2-bit until 6-bit are updated. 3-bit ones are not, as we found UD3 to do on par with UD3.1. We are still improving all other quant sizes though!
      • All benchmarks are 256K for agentic ones (DeepSWE, Terminal Bench), and 128K for the rest (LiveCodeBench etc). We used temperature 1.0, top_p 0.95, top_k 20, min_p 0, no presence or repetition penalty, preserve_thinking and xhigh reasoning
      • We ran benchmarks multiple times including LiveCodeBench x6 times, HMMT and others 8-16x and agentic benchmarks multiple times.

      On other benchmarks like for GSQ-RCO and Exllama3:

      • To compare GSQ-RCO and Exllama-v3, we had to exclude the token embedding layer from the x axis, as Exllama-v3 uses BF16 for it.
      • If you consider the full download size and total RAM usage for Exllama-v3, then adding the BF16 embedding table and including all embedding sizes changes the plots. Our main plots's x axis removes the embedding layer sizes from all quant providers. However on pure RAM usage and disk space usage vs accuracy, exllama3 does worse.
      • For LiveCodeBench, GSQ-RCO showed Unsloth UD3 quants doing consistently worse than ISTA's. However we found the opposite - UD3 quants (our OLD quants) do better than ISTA on LCB on all sizes except the smallest. UD3.1 further improves on LCB as well. We approximate that GSQ-RCO used a context budget of 96K, as that best fits the data for the runs we have. At 96K, GSQ-RCO does somewhat do better than UD3, but at 128K, UD3 does much better.
      • On another benchmark, for ISTA GSQ-RCO's AIME25 benchmarks, their quants reach 100%, 100%, 100% and 96.7% accuracy recovery. And they said our quants do worse. Through our investigations, we estimate ISTA only did 1 trial - we did 14 trials, and we show on average the recovery rate is 93% to 96% - not 100% accuracy recovery. And in fact our UD3 old quants do better on average than their quants on 14 runs vs 1 run of theirs, so we draw the opposite conclusion if you run the trials more.

      More details and benchmarks at https://unsloth.ai/docs/models/qwen3.8#dynamic-v3.1-update- november-11th-2026 All quants are updated in https://huggingface.co/unsloth/Qwen3.8-27B-GGUF! Thank you and have a nice day! We're super excited for Qwen4! submitted by /u/danielhanchen
      [link] [comments]
      ---|---

    7. 🔗 exe.dev Give Agents Temporary Access to Sensitive Integrations rss

      Exe.dev integrations are a powerful primitive to give your VMs access to resources without giving agents the underlying secrets. For example, you can give your VM access to a GitHub repo without leaving your private key or personal access token on the VM, where an agent could potentially misuse it.

      If you want an extra layer of protection, you can configure your integration for "step up" mode. Then, when the VM tries to use the integration, it will return a link so you can approve access. Click on that link and approve it for some time period. This lets you keep an eye on your agents and grant temporary access to high-value integrations (e.g., access to prod).

      To use this, add an integration with --stepup web:

      exe.dev ▶ int add http-proxy --name demo \
          --target https://httpbin.exe.xyz/ --bearer shhh \
          --stepup web --attach vm:drum-dragon
      Added integration demo
      
      Usage from a VM:
        ssh drum-dragon.exe.xyz curl https://demo.int.exe.xyz/
      

      When you trigger the integration, you'll see an approval link:

      exe.dev ▶ ssh drum-dragon.exe.xyz curl https://demo.int.exe.xyz/
      Integration "demo" needs approval:
             https://exe.dev/a/afvpfibvypeti2loorhfumrxj5cvoskjkfgvasv7rsp4l2ckxl6q
      

      If you’re logged in, this will take you to a simple screen:

      Approval screen: VM drum-dragon is trying to use integration demo. Approve
for 10m, 1h, 6h, or 1d, with Don't approve and Approve
buttons. Approve the integration for 10 minutes, an hour, six hours, or a day.

      This works for many of our integration types. Agents are excellent at prompting you to take the next step.

    8. 🔗 pydantic/monty v1.6.0 - 2026-11-11 release

      What's Changed

      New Contributors

      Full Changelog : v1.5.0...v1.6.0

    9. 🔗 r/LocalLLaMA NVIDIA reportedly cancels GeForce RTX 5080 24GB launch, brings back 16GB model over GDDR7 costs rss
    10. 🔗 Rust Blog Google Summer of Code 2026 results rss

      The Rust Project participated in Google Summer of Code (GSoC) for the third time this year. This time we had 13 projects, and our dear contributors have been working very hard on them for several months. As usual, the projects had various durations, so while some of them have ended in August, the last one has only finished in November, so we have been waiting until we have all the results before publishing this blog post.

      We are very happy to announce that all 13 projects were successful and passed their final evaluation! We consider it to be a testament to the diligence of our contributors, and the helpfulness of our mentors, that we are able to keep a very high rate[1] of successful GSoC projects several years in a row.

      At the start of summer, we had a video call with our contributors, so that we could all get to know each other a bit, and learn about their projects. Over the following few months, we continuously communicated with the contributors, provided guidance and answered their questions and reviewed their pull requests. And most importantly, we learned many new things together! It was an overall great experience. We are grateful for all Rust contributions done by our GSoC participants and for the time we spent working together, and we hope that we will continue seeing at least some of them around in the future.

      We would like to thank all our Rust GSoC 2026 contributors. You did a great job!

      Even though this year we had fewer projects than in 2025, mostly due to limited mentoring capacity, Google Summer of Code 2026 was again a success for the Rust Project. We think that GSoC is a great way of introducing new contributors to our community, and we are looking forward to participating in GSoC (and other mentorship programs, such as Outreachy) again in the near future. If you are interested in becoming a (GSoC) contributor, check out our GSoC project idea list and our guide for new contributors.

      Below you can find a brief summary of our GSoC 2026 projects. You can find more information about the original goals of the projects here. For easier navigation, here is an index of the project descriptions in alphabetical order:

      And now strap in, as there is a ton of great content to read about here!

      A Frontend for Safe GPU Offloading in Rust

      Marcelo worked on improving the usability of cross-vendor GPU programs in Rust using the std::offload module. At the start of the project, the offload prototype was only a proof of concept. It assumed that the offloaded code was bug-free, and it required users to write a lot of boilerplate code. Marcelo resolved both issues over the summer.

      First, he implemented proper type checking. Marcelo extended the compiler to verify that the arguments passed to any offload call are of the correct type, as expected by the GPU kernel. Kernel launches are thus now safe.

      After that, he added support for generic kernels. The compiler now collects all generic instantiations launched from the CPU side, and loads that info later when compiling GPU kernels to make sure we instantiate them as needed. Marcelo also added support to select which GPU to use, which is helpful for laptops with both an integrated and a dedicated GPU, as well as for servers with multiple GPUs. He also added two macros that removed the need for any boilerplate when writing and launching GPU kernels.

      The hardest part of this project by far was dealing with references. Due to Rust semantics, we cannot just map types containing mutable references to GPUs and then process them using multiple threads. Previous Rust GPU projects used raw pointers as a workaround, but we obviously wanted to avoid those. Marcelo managed to implement a sound abstraction so that users can now safely declare how their kernels will access mutable arguments.

      As a cherry on top, Marcelo also ported the RajaPerf performance suite from C++ to Rust and used it to benchmark his pull requests. His safe Rust version matches the performance of the original C++ code, and is now described in a GPU offload paper that he is working on together with his mentor, Manuel. This was Marcelo's second Rust GSoC project, and same as last year, we are very happy with the results. Great job!

      Adding WebAssembly Linking Support to Wild

      The goal of this project was simple on paper: teach the Wild linker to link WebAssembly (Wasm) programs. However, adding support for a new linker target is of course far from simple. Luckily, Kei already had a lot of experience with Wild, as this was his second GSoC project working on the Wild linker.

      And as expected, Kei did a great job! Prior to GSoC 2026, Wild had no Wasm output support. Now, the Wasm support is sufficiently good that Wild can link a range of complex programs to Wasm. For example, it is able to link itself, SQLite, ripgrep, CPython and even the SpiderMonkey JavaScript engine.

      And the linking performance is excellent! When compared to wasm-ld, the de- facto standard Wasm linker, which is based on the LLD linker, Wild is 2-15x faster, and uses 2-5x less memory. You can find more benchmarks in his final report, where he also explains that achieving this performance took quite some work, because Wild's ELF linking performance did not immediately translate to being fast when linking Wasm.

      Even after this GSoC project ended, Kei has continued improving Wild's Wasm support, as well as contributing to other parts of Wild. Thank you for bringing fast linking to a new set of use-cases, Kei! You are a valued member of the Wild team.

      Bringing autodiff and offload into Rust CI

      The goal of this project was to build the experimental std::autodiff module, which implements automatic differentiation of Rust code, and the std::offload module, which allows offloading Rust code to GPUs, in the CI of the Rust compiler.

      Shota has already been contributing to this area in the months leading up to this year's GSoC, so he had no issues getting started. After valiantly fighting with our CI, he made both modules available in the official nightly compiler channel. Rust users can thus now simply install them with a single rustup command, rather than having to compile rustc from source! This is a huge benefit for gathering feedback on these features in the wild, as it makes it much easier to experiment with them.

      Beyond making these projects available via rustup, he also worked on making it simpler to build projects that use std::offload. The original compilation pipeline was derived from Clang's support for GPU offload, so it involved calling clang helper binaries. That is clearly not optimal, so Shota worked on replacing it by directly calling the underlying LLVM APIs from rustc.

      The last piece of his project was enabling testing in CI for both offload and autodiff, which already helped prevent multiple regressions. Right now, the GPU offload pipeline only tests the CPU setup side, but his work allowed us to talk to GPU hardware vendors, two of which already agreed to provide the Rust Project with GPU hardware so that in the future we can also run those tests on dedicated GPUs.

      Overall, the project was a success. Shota had to show a lot of patience and endurance when working with various CMake quirks and CI challenges. We would like to extend a special thank you for that!

      Debugger for Miri

      miri is a tool that can detect undefined behavior (UB) in unsafe Rust code. It used to have a prototype of an interactive debugger called priroda, but it became unmaintained some time ago. The goal of this project was to re- establish priroda, to make it easier to use miri interactively, debug how and why is UB introduced in Rust programs, and also help rustc developers analyse MIR, one of the intermediate representations of Rust programs.

      Mohamed successfully reached both main goals of this project. He created a miri interface for the gdb debugger, which allows debugging programs executed by miri. You can set breakpoints, step through individual instructions, analyse MIR local variables and inspect the debugged program's state, with miri acting as a "virtual CPU". So when you encounter your next miri UB report, you can actually debug the program state that caused UB by running priroda! Mohamed also created a command-line interface for priroda, which is used to test it in miri's CI. This will ensure that it keeps working properly and will not bitrot again.

      Mohamed also added basic support for the Debugger Adapter Protocol, which allows using priroda together with IDEs such as Visual Studio Code. Currently, connecting priroda to an IDE is a bit involved, so the next step would be to build a plugin for an IDE that would allow showing all the extra state that miri has, which gdb doesn't know how to interpret.

      Debugging programs executed by miri is very exciting. Thank you for all your work!

      Implementing impl and mut restrictions

      The goal of this project was to implement two new language features that were accepted in RFC 3323:

      • Impl restrictions (impl(crate) trait Foo {}), which allow restricting in which modules you are able to implement a given trait.
      • Mut restrictions (struct Foo { pub mut(crate) bar: u8 }), which allow restricting in which modules you are able to mutate a given field.

      Ryosuke had to familiarize himself with the compiler's codebase and do a lot of implementation work to get both features working. This included implementing parsing of the new syntax, recording its metadata in the compiler's Abstract Syntax Tree, implementing resolution of the restricted crate paths, and finally adding checks to enforce both restriction rules. This all amounted to around five thousand lines of Rust code!

      Once the new features were implemented and available on nightly, Ryosuke wrote a Call for Testing blog post. It had to be very exciting to announce to the world that he implemented two new features from scratch, and people can now play with them on the nightly channel! After the blog post was published, users reported a few issues, which Ryosuke promptly fixed. He also contributed to rustdoc to improve how the impl and mut restrictions are rendered in the generated documentation pages.

      Now that the features are available on nightly, feedback is being gathered on them, with the plan being to stabilize them in 2027. If you would like to provide feedback on the impl and mut restrictions, you can do so in this issue.

      The goal of this project was clear, and Ryosuke achieved it completely. Awesome work!

      Improving Ergonomics and Safety of serialport-rs

      The goal of this project, which was done in collaboration with the Rust Embedded Working Group, was to improve the API ergonomics and type safety of the serialport- rs crate.

      The serialport project is a bit different from some other projects which participated in this year's Google Summer of Code. It is more on the side of "facility management" than rocket science. Its challenges are taming finicky operating system APIs and making good abstractions, rather than full-blown software engineering.

      Tanmay led many fruitful discussions about potential design decisions, and did a lot of field research on how other crates that depend on serialport actually use its API, to figure out how to make the upcoming breaking API changes less disruptive and painful for them.

      Tanmay also worked on sanding off some rough edges of the serialport API, such as replacing Boxed trait objects with enums, and making errors explicit in places where the legacy API used to panic. Some of the work still waits for integration. It is targeting the upcoming serialport 5.0 release.

      Christian (Tanmay's mentor) found working alongside Tanmay very motivational, and he was able to catch up with a lot of other unrelated work in order to integrate Tanmay's changes. He noted that working with Tanmay was fun and productive, and that it was pure joy to see him grow from his first contribution in the bonding phase to seasoned contributions. Thank you, Tanmay!

      This was my first Google Summer of Code as well. It was challenging, motivating, fun and definitely worth it. I would show up again.

      Christian Meusel

      libc: transition differing bit-width time and offset variants and

      deprecate bug-prone constants

      libc is a foundational crate that is used by thousands of other crates across the Rust ecosystem. For the past several years, its maintainers have been attempting to publish a stable 1.0 release of the crate. Because this crate has to support interoperating with C on many compilation targets with weird quirks, this requires an enormous amount of work. We already had a GSoC project for moving libc towards 1.0 last year, and the goal of Adam's project was to make more progress in that direction.

      And we can happily say that progress was indeed made! The original goal of Adam's project was to deprecate a number of constants that were difficult to maintain and cleanup inconsistencies in handling 32-bit/64-bit variants of file and time handling functions[2]. Adam was able to resolve that in a few weeks, and then he moved on to resolve a number of various issues blocking the 1.0 milestone.

      Saying that Adam was productive would be… an understatement. We could follow his work in real-time, because he was posting daily GSoC reports for 116 days (!) in a row. The diligence and consistency with which he tackled so many complicated issues was an inspiration to us. In fact, sometimes the libc reviewers were not able to keep up!

      You can find all Adam's libc pull requests here. You might notice that many of them have lots of comments, and even more discussions happened in GitHub issues and on Zulip. In addition to implementing the necessary code, making changes that affect interesting C platforms and architectures also required him to do a ton of research, and a lot of considerations of edge cases and possible backwards compatibility breakages. His work also took him on a whirlwind tour of diverse platforms; Adam's contributions spanned FreeBSD, NetBSD, Android, Hurd, NuttX, AIX, VxWorks, Fuchsia, L4Re and more.

      Even though more work will still be required to get libc to 1.0, Adam's contributions made a significant dent in this effort. Thank you very much for all your work!

      Link Linux kernel and its Modules with Wild

      Linker scripts are arcane commands that can be used to instruct a linker to construct the final binary in a custom way. The Wild linker used to implement only basic linker script functionality, which Vishruth greatly expanded during his GSoC project.

      Thanks to that, Wild can now successfully link Linux kernel modules, and it's even close to being able to link the Linux kernel itself! Vishruth's work involved greatly expanding expression evaluation support, location counters, program headers, etc. In addition to adding support for many missing bits of linker script support, Vishruth implemented support for partial linking (-r) as this is needed in order to link Linux kernel modules. You can find all the linker script features that he implemented here.

      Adding all those peculiar features to Wild required performing many cross- cutting changes to its codebase, which Vishruth managed to do really well. And it was not at the cost of performance! Wild now manages to link Linux kernel modules such as btrfs or amdgpu 2-4x faster than the BFD (GNU ld) or LLD linkers[3]. You can find more benchmarks in his final report.

      Vishruth has continued to contribute to Wild even after his GSoC project ended and has become a valued contributor to the project. Thank you very much for making Wild better, Vishruth!

      Migrating rust-analyzer assists to SyntaxEditor

      rust-analyzer uses rowan for its syntax trees, a library for Concrete Syntax Trees. rowan has served us well over the years, but it has some downsides that cause major performance problems and also smaller convenience issues. In particular, memory fragmentation causes rust-analyzer to consume much more memory than it actually needs (in the order of redundant gigabytes).

      We wanted to rewrite rowan to change that. The problem was that many parts in rust-analyzer touch syntax trees, and in particular assists (code actions) of which we have a lot. They also use mutable tree editing, a feature of rowan that can be convenient but was a major obstacle in rewriting it to be more efficient.

      During his project, bit-aloo first migrated all rust-analyzer code from mutable tree editing to SyntaxEditor, a new abstraction that was created specifically to avoid mutation. After that, he removed mutable editing from rowan altogether.

      The migration process is incremental and rowan is still inefficient in various aspects. However, we believe that the parts which required changes to large amounts of code are behind us, and we can complete the migration with more focused changes. bit-aloo is continuing to work on that even after his GSoC project ended. And he was also accepted as a member of the rust-analyzer team, so congratulations! We would like to thank him for his work, and hope to continue working with him to improve rust-analyzer for everyone.

      Port std::arch test suite to rust-lang/rust

      The std::arch module of the Rust standard library contains various intrinsic functions that provide architecture and vendor-specific functionality. Their implementation lives in the stdarch repository, which is included as a Josh subtree in the main compiler repo (rust-lang/rust).

      When someone changes the intrinsics in the main repo, breakages can silently creep in, because the main repo does not execute all the stdarch tests in its CI. That can cause friction when we synchronize the changes between the two repositories. Ideally, we would run all of stdarch's tests in the main repo to detect any issues as soon as possible.

      And that is where Sumit came in! Over the course of his GSoC project, he examined the (very!) complex ways the intrinsics are tested in stdarch, and started porting them over to the main repo. But this was not a matter of copying over a few lines of YAML. The compiler repo uses its own build system (called bootstrap) and a CI workflow structure that is quite different from the stdarch repository. Sumit thus had to first understand what is each test suite doing, reimplement it as a part of bootstrap and finally integrate it into the compiler's CI workflows.

      We run ~90 CI jobs across several hardware architectures, operating systems and OS versions. Getting all that to work while testing vendor-specific intrinsics required a lot of diligent work… and a lot of patience. It took five months for one of the test suites to finally succeed on the main repo's CI, and it required Sumit to completely refactor how the suite worked, for it to be more compatible with bootstrap. As another example, a different test suite that Sumit also got to work required running the tests in an Intel CPU emulator on CI.

      Sumit ported most of the stdarch test suites to bootstrap, including intrinsics verification against reference C implementations, checks for automatically generated source code being up-to-date, and various unit tests for individual intrinsics and CPU feature detection logic. There is one remaining test suite to port, but the ported tests are already helping us find issues, which is great.

      You can check Sumit's rust-lang PRs here; notice that he was also contributing to other parts of Rust in the meantime! Sumit's work will help us make LLVM upgrades and land intrinsics changes more easily. Thank you, Sumit!

      Reorganizing tests/ui/issues

      The goal of this project was to get rid of a very scary place in the Rust compiler's test suite: a directory called tests/ui/issues. It contained thousands of test files based on historical Rust issues, dating back all the way to 2012. The problem with those tests was that they were named only with an issue number (e.g. issue-37291). When such a test would break, it was quite difficult to figure out what was it even supposed to test, because there was little context attached to it.

      Even though we already had a GSoC project to tackle this problem last year, due to the sheer amount of uncategorized tests, there were still over four hundred tests left in this directory by the time zedddie started working on this project.

      For each test in this directory, zedddie had to first understand what was the test doing and dig through its original GitHub issue and any other related issues and pull requests. Then they had to figure out what would be the best location to move the test under, search for any possible duplicates, come up with a descriptive name for the test (that tends to be very difficult!), and finally add a short description to the test that explains the context of why the test was added in the first place. Rinse and repeat, for hundreds of tests.

      zedddie rolled up their sleeves, and categorized over 300 tests in 30 pull requests. Together with other contributors helping out over this summer, zedddie was finally able to remove the last batch of uncategorized tests at the start of August. As zedddie said in their final report: "What is left to do: nothing, tests/ui/issues is gone".

      While this work might sound a bit bland, its positive effect on the maintainability of our test suite, and improving the lives of Rust compiler contributors, is considerable. It is also apparently a great way to learn about cool niche edge cases of Rust that most Rust developers might not know about! After migrating the remaining uncategorized UI tests, zedddie continued contributing to the next trait solver and const generics. Thank you very much for helping us finally get rid of tests/ui/issues, zedddie!

      Utilize debugger APIs to improve debug info test accuracy and error

      reporting

      The Rust debugging experience leaves a lot to be desired. One reason why we struggled to improve it is that many of our debuginfo test suites did not even run in CI for the past few years, as they were difficult to maintain. When something changed in the type visualizers, the implementation details of a standard library type or in debugger internals, someone had to go through tens of tests and manually update them. This was not sustainable, so the test suite rotted.

      Luckily for us, Anthony took that affront personally. Even before his GSoC project, he spent considerable effort on improving the quality of debug visualizers of various Rust standard library types, and gained an impressive amount of knowledge about debuggers.

      During his GSoC project, he completely overhauled how our debuginfo test infrastructure works, both for LLDB and GDB. Thanks to his improvements, we can now easily "rebless" the reference output when something changes, which makes it much easier to keep our test suite up-to-date. The new tests also record much more information about the internal state of the debugger recorded during the test, which helps with diagnosing issues that cause type visualizers to stop working.

      In addition to redesigning the test suite, Anthony also actually managed to re-enable the LLDB tests on both Windows and Linux in our CI again (after several years of being skipped there!). This will allow us to avoid debuginfo regressions and make it easier to improve the Rust debugging experience. Oh, and it goes without saying that while doing all that, he also made numerous improvements to Rust type visualizers. You can find his PRs here.

      Anthony's amazing contributions and his deep expertise in debuggers led to him being invited to the Rust Compiler team, which was much deserved. What else can we add, other than: thank you for your awesome work!

      XDG path support for rustup

      The support for platform-specific directories (platformdirs) has been a long- standing feature request for rustup, to have more fine-grained filesystem directory choices. This project investigated how that issue could be resolved.

      The real complexity of this feature request lies within a decade worth of different assumptions that previous iterations of rustup and cargo have made: it turns out that quite a lot of them are no longer true if we were to implement platformdirs support truly faithfully.

      Guicheng first worked on cleaning up the interactions between rustup self uninstall and $CARGO_HOME/bin as a warmup. This issue itself is a very good demonstration of all that compatibility baggage: somehow $CARGO_HOME/bin has become the default binary directory for all things Rust, so rustup ended up installing itself and all its proxies into it. As a result, it has been super annoying to many that everything in $CARGO_HOME is gone with rustup self uninstall.

      After that, he started the actual implementation of platformdirs support in rustup. This was no easy task! Not because the code itself was hard to write, but because it takes a lot of effort to figure out what should be the desired behavior in the first place. Also, in order to determine the appropriate platformdirs semantics, some prior research is often required to see how things became what they are today, so the decoupling of different concerns could proceed, and migration paths could be designed accordingly. It was in this sense that this is different from a typical GSoC project, and luckily thanks to the effort he has put into this project, we have not only come up with the final patch, but also discovered and fixed some tiny preexisting issues with this long-untouched aspect of the rustup codebase along the way.

      Thank you for digging into this complex topic, Guicheng!

      Conclusion

      We would like to thank all contributors who have participated in Google Summer of Code 2026 with us! Your contributions helped make Rust better, and introduced you as new members of our community, which is a reason to celebrate. We are looking forward to participating in GSoC again next year!

      We would also like to thank Google for organizing the Google Summer of Code program and for allowing us to host a large number of projects every year. And last, but not least, we would like to thank all the Rust mentors who were tirelessly helping our contributors to complete their projects. Without you, Rust GSoC would not be possible.

      1. 97.5% over a three-year period, if you are wondering (40 out of 41 projects were successful so far). ↩

      2. If you were wondering, then yes, this is actually related to the famous 2038 problem :) ↩

      3. In case you were wondering, the mold linker does not support linker scripts required to link Linux kernel modules at the moment, so Vishruth did not compare the performance of Wild against mold here. ↩