Repository navigation
Releases: opensec-git/Pi-Bolt
Release list
Pi-Bolt 0.8.6
Pi-Bolt 0.8.6 runs Pi 1.2.0. Everything else is 0.8.5.
Pi 1.2.0
Everything in Pi 1.2.0, among it:
- OpenRouter model lists per key: with an OpenRouter key,
/modellists only the models that key may use, with its context
size, output limit and prices, including regional endpoints set inmodels.json. - Configuration schemas: add
$schematosettings.json,models.json, keybindings and themes for validation and
completion in your editor. - Copying over remote sessions:
PI_CLIPBOARD_OSC52=1sends copied text to a remote client's clipboard when Pi-Bolt cannot
tell it runs remotely, for example in a multiplexer attached from another machine. - Codemode: tool declarations show input constraints (integer, minimum, maximum, default), and codemode rows show how long a
script has run. pi-bolt -pexits 1, with a warning, when the answer was cut off at the model's output limit.- Anthropic requests that the provider refuses for the size of the strict tool set are retried once; "The upstream provider
returned an error" is retried like other temporary provider errors. - MCP: tool calls accept structured content that is not an object, servers with resources register their tools at once, and a
call cancelled while waiting for a sign-in refresh is not sent. - Key bindings that name a shifted symbol, such as
ctrl++, match under the Kitty keyboard protocol. - On Windows, reading or writing
auth.jsonretries briefly instead of failing while a previous lock is still being removed.
For extension authors
Pi 1.2.0 changes two things extensions can see:
before_agent_startalso fires for runs thatpi.sendMessage(..., { triggerTurn: true })starts. Its event has a
messageType:"user"events carrypromptandimages,"custom"events the startingmessage. A handler meant only
for prompts should checkevent.messageType === "user".- The session counts as busy while a run starts:
pi.sendUserMessage()then needsdeliverAs.
OpenSec's extensions (opensec-pi-subagents, opensec-pi-todo, opensec-pi-fff) work with both unchanged.
Themes: the theme schema is now https://pi.dev/schemas/theme.schema.json. A theme that fails it is reported when it loads.
Startup
Pi 1.2.0 builds the models.json and theme schemas, and compiles a checker for each, when it starts. Pi-Bolt keeps both out of
its start: models.json is checked against the same schema as plain JSON Schema, generated from 1.2.0's definitions, and the
theme schema is built the first time a theme of your own is loaded.
Engine
Unchanged since 0.8.5: this release's runtimes are 0.8.5's.
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shirm https://pi-bolt.opensec.in/install.ps1 | iexpowershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-win32-x64.zip |
Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others. |
pi-bolt-win32-x64-jit.zip |
Windows, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.
Pi-Bolt 0.8.5
Pi-Bolt 0.8.5 is faster and lighter where you spend your time: typing and answers in long conversations, streamed replies,
large edits and long tool output. Everything else is 0.8.4.
Faster in use
Against 0.8.0 (0.8.4 measures the same as 0.8.0), on an Apple M5 and on Linux (an AMD EPYC 7B13 VM, pinned to 4 cores):
| macOS 0.8.0 | macOS 0.8.5 | Linux 0.8.0 | Linux 0.8.5 | |
|---|---|---|---|---|
| Interactive session (5 prompts, 25 model turns): CPU | 171 ms | 136 ms (−21%) | 253 ms | 199 ms (−21%) |
| Interactive session: time per turn | 196 ms | 179 ms (−9%) | 269 ms | 210 ms (−22%) |
One prompt with pi -p: CPU |
58 ms | 54 ms (−7%) | 74 ms | 63 ms (−14%) |
pi --version: peak memory |
27 MB | 25 MB (−7%) | 63 MB | 59 MB (−6%) |
| Long conversation (~4.2M tokens): CPU per prompt | 133 ms | 108 ms (−19%) | 256 ms | 177 ms (−31%) |
| Long conversation: memory | 533 MB | 462 MB (−13%) | 289 MB | 244 MB (−16%) |
| Long conversation, a pause after each answer: memory | 458 MB | 311 MB (−32%) | 182 MB | 170 MB (−7%) |
-
The screen redraws only what changed. Messages, tool rows and the editor keep the lines they drew; the spinner and each
key press no longer redraw the whole conversation. Late in a long conversation that is up to 17× less work per frame in the
default (non-fullscreen) mode, and 5× less in fullscreen. Key bindings are matched once per key press. -
Streamed replies are read faster. OpenAI-style streams are parsed with a faster reader, and tool-call arguments are
parsed as they arrive instead of again from the start: a 400 KB file write streams in about 50 ms instead of 765 ms. -
Memory is given back when Pi is idle. After an answer, once Pi has been idle for a moment, it collects garbage if memory
grew; long conversations hold much less. -
Edits and long output are cheaper. The edit tool's preview and patch only compare the changed lines (an edit in a 230 KB
file: 23 ms → 1 ms), long tool output is cut in one step, and truncated output is kept once. -
Startup does less. Grammars, the image decoder, compression and network modules load when first needed; in tmux the
hyperlink check runs in the background; on Kitty-type terminals such as Ghostty Pi is ready about 30% sooner. -
Extensions are not called for events they do not listen to, and the session's size and name are not recomputed every
frame. -
Extensions load faster when stock Bun is installed too. Pi-Bolt keeps its compiled-extension cache in a folder of its own
(@t@pi-bolt, beside Bun's@t@). Sharing one, each runtime took the other's entries for stale and compiled them again:
with three extensions, a start after Pi on stock Bun had run took about 200 ms longer on Linux and macOS, and pi-subagents
took 4 s instead of 0.5 s on Windows. -
@file completion runs its two searches at the same time.
Windows
- The bash tool starts Git's
bash.exeitself, without Git's launcher in front (the-jitbuild keeps the launcher, which
its job object needs): 10 bash calls 1.6 s → 1.45 s. - A program started by name is looked up on
PATHonce. - An idle Pi-Bolt no longer wakes every 4 seconds once it has made a request.
- Against 0.8.4 on an Intel Core i5-1335U laptop: interactive CPU 301 → 260 ms, CPU per prompt in a long conversation
177 → 160 ms, its peak private memory 332 → 254 MB.
For extension authors
pi-tuihasmarkStableRender()andContainer.renderShared()for components whose lines do not change between frames.
Components that do not opt in are compared with what was drawn before, so existing extensions draw as they did.- In session files and extension events,
details.truncation.contentof the read, grep, find, ls and bash tools is now empty;
the counts are unchanged.
Fixes
- Installing from npm handles a download base address with many trailing slashes quickly.
- The Windows install script's tests run on any machine.
From Pi
Fixes from Pi's main branch since 1.1.0:
- A terminal's late replies (colour or cursor queries) no longer end up as typed input.
- Images show in Kitty-protocol terminals inside Herdr.
- Compaction summaries leave out thinking.
AGENTS.mdthat is a symlink is found in nested git worktrees.- MCP OAuth refuses an issuer when no authorization server metadata was found.
- Codex request bodies and Mistral timeouts (the timeout covers the response headers only).
- Extensions can override the colours of the compaction status indicator.
- Packaging works with npm 12.
Engine
Both engines change, so all three runtimes are new.
- Faster request bodies. Text is converted to UTF-8 in one pass into a buffer of the right size, instead of growing and
copying it: a large part of the savings in long conversations. - From upstream WebKit: faster
replace()with an empty string, string search,parseIntand number conversion of
strings that are not numbers, and microtasks queued without copies. - From upstream Bun:
sliceAnsi/stripANSIof huge input; fixes to FileSink, PipeReader, child processes' standard
output andspawnSync; the idle collection also gives back the allocator's free memory. - x86-64 (Linux, Windows): property lookups by a name held in a variable, and dispatch-table slots, in ahead-of-time
compiled code (thanks to @carsteneu, #18). MapandSetwith long string keys compare them many characters at a time (a lookup with 64 KB keys: 7× faster).- macOS: what the image builder takes for an address in the code is narrower, so large numbers are not mistaken for one.
- Windows: the sockets' sweep timer stops with the last socket (oven-sh/bun#37096), and a task left queued after a tick wakes
the event loop (oven-sh/bun#42968).
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shirm https://pi-bolt.opensec.in/install.ps1 | iexpowershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-win32-x64.zip |
Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others. |
pi-bolt-win32-x64-jit.zip |
Windows, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.
Pi-Bolt 0.8.4
Pi-Bolt 0.8.4 lets Pi-Bolt and Pi share one setup without getting in each other's way, and makes installing on Windows smoother.
Everything else is 0.8.3.
Pi and Pi-Bolt side by side
- Pi-Bolt never changes the packages Pi loads. Both use
~/.pi/agent(logins, models, settings, sessions). Until you
install or remove a package withpi-bolt, Pi-Bolt loads the packages insettings.jsonas Pi does; the first such change
gives Pi-Bolt a list of its own (piBolt.packages, made from Pi's) and changes only that. A package you install with
pi-bolt installis Pi-Bolt's; one you install withpi installis Pi's. - OpenSec's extensions load in Pi-Bolt only.
opensec-pi-subagents,opensec-pi-todoandopensec-pi-fffare built for
Pi-Bolt's runtime, and Pi on Node cannot load them. Earlier installers added them to the list Pi reads too, so Pi started
with "Failed to load extension" for each. Pi-Bolt moves them to its own list as it starts, and the installers have it do so
right after installing: update Pi-Bolt (pi-bolt update) and Pi starts cleanly again. - README: Pi and Pi-Bolt side by side.
Windows
- The install commands are
irm https://pi-bolt.opensec.in/install.ps1 | iexin PowerShell and
powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"in Command Prompt. The longer command the README and the
site showed for a day, which turned TLS 1.2 on first, was blocked by Microsoft Defender; an older Windows 10 that needs TLS
1.2 for the first download has two lines on the docs' Installation page. - Installing or updating from a PowerShell 7 prompt works:
install.ps1uses Windows PowerShell's own modules first (thanks to
@Vlyn, #14).
Releases
- A
publishrun again for a release, to put the site and the installers up again, skips thepi-boltversion npm has.
Engine
Unchanged since 0.8.3: this release's runtimes are 0.8.3's.
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shirm https://pi-bolt.opensec.in/install.ps1 | iexpowershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-win32-x64.zip |
Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others. |
pi-bolt-win32-x64-jit.zip |
Windows, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.
Pi-Bolt 0.8.3
Pi-Bolt 0.8.3 fixes updating in place on macOS and restores 0.8.1's speed on Linux and Windows. Everything else is
0.8.2.
macOS
- A session started before an update keeps working. Updating with the installer or
pi-bolt updatereplaces the build's
files, and a session of 0.8.1 that was still running stopped at the end of its next command (a tool's command, or the version
check that endspi-bolt update, which installed 0.8.2 and then did not return). Such a session now goes on; only the
resource usage of its commands is not reported until it is restarted. - If a session or a
pi-bolt updatestopped like that on 0.8.2: end it (Ctrl+C), and start Pi-Bolt again. 0.8.2 was installed.
Performance
- Linux and Windows: 0.8.2's engine read some properties of the compiled code the generic way on x86-64, which made the TUI
start and respond a few percent slower than 0.8.1. 0.8.3 reads them as 0.8.1 did. - The built-in Herdr extension is set up only in a Herdr pane.
- Measured against 0.8.0 and 0.8.1 as released (interleaved runs on the same cores): startup, a headless prompt and the TUI
(time to interactive, five turns) are the same within 1% on Linux x86-64 and macOS, with a little less memory.
Plugins
scripts/build-pi.sh: when the compiler stops the build (a plugin's module over the size limit, say), the build shows the end
of what the compiler printed and where all of it is, rather than nothing (#8).
Engine
- Typed fields (
useAOTTypedFields, off in every build) are off on CPUs other than ARM64, whose compiled accesses do not check
them; the table of types is as in 0.8.1.
The runtimes
From the engine trees that patches/webkit.patch and patches/bun.patch make on the pinned sources (git rev-parse HEAD^{tree}):
WebKit 927e43f44e123e14ae9bab949fa51bd5d78cb171, Bun 38c350d92af2b622768f89794c6710ed03ef6202.
| Runtime | Built on | bun.exe / bun SHA-256 |
|---|---|---|
| Windows x64 | the maintainer's Windows 11 machine (Intel Core i5-1335U), ThinLTO, Control Flow Guard | 777fbb38a28a33a28ee93d87aaa56bd61f8d91a78b8fc5ca00bcf5ebb664035b |
| Linux x86-64 | a Linux x86-64 VM (AMD EPYC 7B13), LLVM 23.1, ThinLTO, glibc 2.17 sysroot | 96bf1c743a75d68fda3b21353027768c7d3ec0e67a2bbc7d221dc67157d200bb |
| macOS arm64 | the maintainer's MacBook Air (M5), LLVM 23.1, ThinLTO | 874bd2e2a1b0e041e81398e2a55891544ca449d4cf81228db405adf9ad40a756 |
Linux, Windows, npm installs and new installs were not affected by the macOS update issue.
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shpowershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-win32-x64.zip |
Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others. |
pi-bolt-win32-x64-jit.zip |
Windows, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.
Pi-Bolt 0.8.2
Pi-Bolt 0.8.2 runs Pi 1.1.0 on Linux x86-64, macOS on Apple silicon and Windows x64. It works with Herdr, offers opensec-pi-fff,
and has many fixes for Windows, the installers and the engine.
Herdr
In a Herdr pane, Pi-Bolt shows up as pi-bolt in Herdr's sidebar and in herdr agent list:
| When | Herdr shows |
|---|---|
| Pi-Bolt starts, or a run ends | idle (done, until you look) |
| A run is going, or background subagents still are | working |
An extension waits for an answer during a run (a dialog, or the herdr:blocked event of pi-ask-user and pi-subagents) |
blocked, with its message |
| You quit | the pane is free again |
- Sessions come back. Pi-Bolt hands Herdr the command that reopens its session,
pi-bolt --session <file>, so after a Herdr
server restart the same conversation is back in the same pane. This needs Herdr 0.9.2 or later andpi-bolton the PATH of
the Herdr server: start Herdr from a terminal, not withbrew services. - Only the interactive session reports.
pi-bolt -p, JSON and RPC runs, and subagents started inside Pi-Bolt do not take
over the pane of the session that started them. - Herdr's own Pi integration is not needed, and not used. The file
herdr integration install piwrites reports aspi
and restores withpi --session, which starts Pi, not Pi-Bolt; Pi-Bolt does not load it. Pi, which shares~/.pi/agent,
still does. - pi-herdr, which starts other agents in Herdr panes from a Pi
session, works in Pi-Bolt (pi-bolt install npm:@andrewjacop/pi-herdr). Herdr starts Pi agents aspi, so the Pi agents it
spawns run Pi, which must be installed; Claude Code, Codex and the others need only their own CLIs. Pi-Bolt turns off
pi-herdr's own report of its pane (PI_HERDR_NO_SELF_REPORT=1), which would show the pane aspiand lose the resume command. - On Linux and macOS the reports go to Herdr's socket, with no process started for each; on Windows they go through the
herdr
executable of the pane (HERDR_BIN_PATH), as Herdr recommends there. - Outside Herdr nothing changes.
"-builtin:herdr"in theextensionssetting turns it off.
Extensions
- The installers offer opensec-pi-fff: pi-fff's fast find, grep and @-mentions, as fast on the default build as pi-fff with the
JIT (not offered when @ff-labs/pi-fff is installed). - opensec-pi-todo 2.13.1: the todo panel now closes once the work is done, and finished tasks no longer come back after
compaction or /reload. scripts/build-pi.sh --plugins-from-installedcompiles in the extensions installed on this machine: it generates the
manifest folder that docs/PLUGINS.md asks for (scripts/gen-plugin-manifest.mjs), with--plugins-only
and--plugins-excludeto choose (Windows:-PluginsFromInstalled). Thanks to @toadkicker (#10).- docs/PLUGINS.md: what to do when a plugin's module is over the compiler's size limit, and when a build stops without saying
why (#7, @toadkicker). - The tool-conflict hint links to a new README section, "Pi and Pi-Bolt side by side" (
piBolt.packages).
Windows
- Stopping a command ends everything it started, also the programs a Git Bash command started.
- The bash tool passes a command to Git Bash unchanged: doubled backslashes (
C:\\Usersin a heredoc, a regex) are kept.
Git Bash is found wherever Git for Windows is. AshellPaththat is not a bash (cmd.exe, PowerShell) is refused with a
message. - A bare program name in a tool's command is looked up on PATH only, not in the working folder.
- read, write and edit take Git Bash's
/tmpfor the user's temporary folder. - Ctrl+Break and closing the console window shut Pi-Bolt down as SIGTERM does (the terminal is restored, extensions get
session_shutdown). - A link's click opens web and mail links and local images, text and PDFs; any other local file is shown in Explorer.
- The find tool's path patterns: escapes and classes (
src/[[]id]/*.ts) and\as a separator. - A trusted folder stays trusted in any letter case; a project's settings apply to the session directory once it is trusted.
install.ps1: an install folder outside the profile is checked together with the folders above it; extensions are installed
and removed from Pi-Bolt's own folder; the install command turns TLS 1.2 on first (README, site).pi-bolt updateleaves PATH as the user left it.- docs/TROUBLESHOOTING.md has a Windows section; docs/BUILDING.md covers building on
Windows.
Install and update
install.shstages the download in the install folder: a/tmpmountednoexecno longer stops an install or an update
with "the downloaded executable does not run on this system". A download that fails or is stopped is removed.pi-bolt updatedownloads the installer with curl or wget, whichever there is, and runs it from the home folder.- On macOS the PATH line for bash goes in the file a login shell reads (
~/.bash_profile). - The npm launcher removes the builds of earlier versions from
~/.pi-bolt/npmonce a new one is installed.
Pi-Bolt
- MCP: a sign-in page is opened over https, or http to this machine, as the token endpoint already was.
- Bedrock: a tool call whose stream ends without its
contentBlockStopgets its full arguments. - bash: the full output of a command that printed more than the output file holds ends with what the command printed last.
- A finished message is lexed in full, so its final rendering is what the whole text gives.
--smolis not left inprocess.execArgv.
Engine
- x86-64: a function constructed by calling it unwinds an exception it throws with the stack aligned as C++ expects.
- Inlined code reads which items of a spread are spread from its own code; a module variable declared with
varat more than
one place is not taken to keep its first value; a regular expression search from past the end of a string finds nothing at
once; off ARM64, a typed field whose structure has to be checked is read the generic way. - The build without the JIT keeps the JIT off also where it cannot open its own file (no
/proc). - macOS:
resourceUsage()of a child process is the program's own (it was pi-spawn's, about 1 ms); a sync spawn in a process
group of its own starts directly; a Pi-Bolt started with two of descriptors 0 to 2 closed keeps its spawn helper. fs.WriteStream: a batched write that is retried after a short write goes on at the right position.- The runtime stamp includes the linker-order hints (
profiles/runtime-*.hints), so a change to them builds new runtimes.
The runtimes
The engine changed, so the runtimes of this release were built by hand (RELEASING.md).
From the engine trees that patches/webkit.patch and patches/bun.patch make on the pinned sources (git rev-parse HEAD^{tree}):
WebKit b553f99e901bf720ece4b679123e50fcfb657aa0, Bun 38c350d92af2b622768f89794c6710ed03ef6202.
| Runtime | Built on | bun.exe / bun SHA-256 |
|---|---|---|
| Windows x64 | the maintainer's Windows 11 machine (Intel Core i5-1335U), ThinLTO, Control Flow Guard | 3ba3fe7d6f5bc35265ff4540fd0485dd493da9817f6b3f3a62e9f86564b23394 |
| Linux x86-64 | a Linux x86-64 VM (AMD EPYC 7B13), LLVM 23.1, ThinLTO, glibc 2.17 sysroot | 6a65d31165a9d9a37eb0690d3e4caa11f8c19d5be42e9bfe3bd8065d66bc1db3 |
| macOS arm64 | the maintainer's MacBook Air (M5), LLVM 23.1, ThinLTO | 80499e790a2bf9287b330c51b2583fa24101ba8703aae4a6a0680277625e9c30 |
A runtime is not yet built bit for bit the same twice, so these are what was built, not what anyone would get. Tested on each
platform: tests/aot 61/61 (new: edge-cases.mjs), tests/runtime 6/6 and Pi's checks on every build; on Linux also the old
distributions and CPUs (tests/compat: CentOS 7, Debian 9, Amazon Linux 2, Haswell to Nehalem).
Releases
release: a dry run of the latest release takes its runtime from the signed release.tagtags a version bump also when
pi-boltmoved on only with filesciignores.fetch-sourceschecks an existing checkout againstsources.jsonand the
patch, and stops when it is another engine's.- The site has documentation: pi-bolt.opensec.in/docs.
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shpowershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-win32-x64.zip |
Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others. |
pi-bolt-win32-x64-jit.zip |
Windows, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.
Pi-Bolt 0.8.1
Pi-Bolt 0.8.1 runs Pi 1.1.0 on Linux x86-64, macOS on Apple silicon and Windows x64. pi-fff works on the default build, and
installing with npm or Bun is easier.
Extensions
- pi-fff works without the JIT. On the default build, pi-fff stopped at "FFF init failed: bun:ffi requires the JIT". It now
uses its Node.js backend there (the same native search library), with nothing to set up; the-jitbuild uses its Bun backend
as before.
Install
- npm and Bun:
npm install -g --allow-scripts=pi-bolt pi-boltandbun add -g --trust pi-bolt. Both package managers now
ask before running a package's install script, which on Windows puts the executable in place. - When a build is not on npm yet, the installers say "not available from npm; downloading from GitHub instead", rather than
that the download failed.
Benchmarks
- 0.8.0 measured on Linux and macOS against Pi 1.1.0 on Bun and Node, and against PiG and oh-my-pi in the same runs
(docs/BENCHMARKS.md). The site shows them too.
Installer
install.shrefuses checksums that say they are another release's, asinstall.ps1does: an older release, signed all the
same, served as a newer one, is no longer installed as the newer.
Engine
- On Windows: an idle keep-alive connection is aged on a clock nobody sets (GetTickCount64), as on Linux and macOS since 0.7.3.
- The writer of the prebuilt heap no longer stops at a pair of numbers that reads like an address of the builder's own memory;
a word that could be a pointer there still stops it.
Corrections to earlier notes
- 0.7.1 to 0.7.3 said the installer detects Linux or macOS: it is
install.shfor those, andinstall.ps1for Windows. - 0.7.1 said git sources are passed with
--end-of-options. They are refused when the repository or ref starts with-, which
works with every git version.
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shpowershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-win32-x64.zip |
Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others. |
pi-bolt-win32-x64-jit.zip |
Windows, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.
The runtimes
The engine changed (Windows, and 0.7.3's and 0.7.4's changes merged with it), so the runtimes of this release were built by
hand (RELEASING.md). From the engine trees that patches/webkit.patch and
patches/bun.patch make on the pinned sources (git rev-parse HEAD^{tree}): WebKit f527504e0d1d9f14c73b7aab4682fe44972507fa,
Bun 2c4f4980f78e0986a324aa46f648ce05542d9369.
| Runtime | Built on | bun.exe / bun SHA-256 |
|---|---|---|
| Windows x64 | the maintainer's Windows 11 machine, Visual Studio 2022, LLVM 23.1, ThinLTO, Control Flow Guard | 3770b10e74eb4036d5df080173ed54ae956de6891a1babfeab1b65953f4bb059 |
| Linux x86-64 | a Linux x86-64 VM (AMD EPYC 7B13), LLVM 23.1, ThinLTO, glibc 2.17 sysroot | fb9ee22ef65619272e3e8d5cfb80020b24590aac82d8bcbf705a301edfe8acc8 |
| macOS arm64 | the maintainer's MacBook Air (M5), LLVM 23.1, ThinLTO | 24b6d7ffb4076db2fe4cfe67f65fda18f5c4aeb4e32f98c37b0ada5da0aeb785 |
A runtime is not yet built bit for bit the same twice, so these are what was built, not what anyone would get.
Pi-Bolt 0.8.0
Pi-Bolt 0.8.0 runs on Windows. It adds Windows x64 (Windows 10 and 11) to Linux x86-64 and macOS on Apple silicon,
with Pi 1.1.0 on all three, and the installers offer OpenSec's extensions again.
Windows x64
powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"or npm install -g pi-bolt. The installer puts pi-bolt.exe in %USERPROFILE%\.pi-bolt and on your PATH, so pi-bolt
works in cmd, PowerShell and any terminal. pi-bolt update updates it in place.
On a Windows 11 laptop (Intel Core i5-1335U), against Pi 1.1.0 as released (medians;
docs/BENCHMARKS.md):
| Pi-Bolt 0.8.0 | Pi on Bun 1.4.2 | Pi on Node 24 | |
|---|---|---|---|
| Launch to interactive | 92 ms | 177 ms | 311 ms |
pi-bolt --version |
35 ms | 98 ms | 219 ms |
pi-bolt -p: one prompt, 4 tool calls |
113 ms | 203 ms | 383 ms |
| CPU, interactive session of 5 prompts | 291 ms | 805 ms | 1,125 ms |
| CPU per prompt, 4.2M-token session | 166 ms | 298 ms | 634 ms |
| Peak private bytes, interactive session | 113 MB | 345 MB | 197 MB |
| Longest stall writing a 200 KB file | 63 ms | 43.9 s | 46.6 s |
- Signed.
install.ps1and the npm package check the release's Ed25519 signature themselves (Windows has no tool for it)
and refuse checksums of another version. A mirror is accepted only if it is signed too. - Hardened. DEP and Control Flow Guard; the prebuilt heap is read-only, so a write to it stops the
program instead of changing it; the DLLs Pi-Bolt loads late come from System32 only, never from the folder it is in; the
debugging options that reach memory or load code are off. - Works as Pi does on Windows: PowerShell, cmd and Git Bash for the
bashtool, images (resized in a worker), extensions
and their programs, MCP servers. A program is never looked up in the current folder. - Older CPUs: CPUs without AVX2 (before Intel Haswell, 2013) run the same build on its bytecode.
- JIT build:
pi-bolt-win32-x64-jit($env:PIBOLT_VARIANT = "x64-jit"before installing) is for extensions that do heavy
JavaScript work themselves, such as pi-lens. With the default build their work runs on the interpreter. - The executable has no Authenticode signature yet. SmartScreen may warn about one downloaded with a browser; the installers do
not mark what they download, so installs through them are not affected.
From 0.7.4
- Pi-Bolt does not load code from the directory it is started in, on Windows too: code built into the executable resolves no
module or package from the working directory (0.7.4). - Extensions resolve their own packages as on Node, through their
package.json(packages such assharpload).
Extensions
- The installers offer OpenSec's two extensions again (opensec-pi-subagents, opensec-pi-todo). 0.7.1 to 0.7.3 were
published withoutextensions.txt, the signed list of their versions, so no installer offered them; it is back, and
publishing now checks it is there. pi-bolt updateinstalls into the installation that is running.PIBOLT_INSTALLdecides only for an executable that is not
in an installation (a build of your own). Before, aPIBOLT_INSTALLleft in the environment could put the update elsewhere and
leave the running copy as it was.
Installer
install.shrefuses checksums that say they are another release's, asinstall.ps1does: an older release, signed all the
same, served as a newer one, is no longer installed as the newer.
Engine
- On Windows: an idle keep-alive connection is aged on a clock nobody sets (GetTickCount64), as on Linux and macOS since 0.7.3.
- The writer of the prebuilt heap no longer stops at a pair of numbers that reads like an address of the builder's own memory;
a word that could be a pointer there still stops it.
Corrections to earlier notes
- 0.7.1 to 0.7.3 said the installer detects Linux or macOS: it is
install.shfor those, andinstall.ps1for Windows. - 0.7.1 said git sources are passed with
--end-of-options. They are refused when the repository or ref starts with-, which
works with every git version.
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shpowershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"or pi-bolt update, or npm install -g pi-bolt.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-win32-x64.zip |
Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others. |
pi-bolt-win32-x64-jit.zip |
Windows, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.
The runtimes
The engine changed (Windows, and 0.7.3's and 0.7.4's changes merged with it), so the runtimes of this release were built by
hand (RELEASING.md). From the engine trees that patches/webkit.patch and
patches/bun.patch make on the pinned sources (git rev-parse HEAD^{tree}): WebKit f527504e0d1d9f14c73b7aab4682fe44972507fa,
Bun 2c4f4980f78e0986a324aa46f648ce05542d9369.
| Runtime | Built on | bun.exe / bun SHA-256 |
|---|---|---|
| Windows x64 | the maintainer's Windows 11 machine, Visual Studio 2022, LLVM 23.1, ThinLTO, Control Flow Guard | 3770b10e74eb4036d5df080173ed54ae956de6891a1babfeab1b65953f4bb059 |
| Linux x86-64 | a Linux x86-64 VM (AMD EPYC 7B13), LLVM 23.1, ThinLTO, glibc 2.17 sysroot | fb9ee22ef65619272e3e8d5cfb80020b24590aac82d8bcbf705a301edfe8acc8 |
| macOS arm64 | the maintainer's MacBook Air (M5), LLVM 23.1, ThinLTO | 24b6d7ffb4076db2fe4cfe67f65fda18f5c4aeb4e32f98c37b0ada5da0aeb785 |
A runtime is not yet built bit for bit the same twice, so these are what was built, not what anyone would get.
Pi-Bolt 0.7.4
Pi-Bolt 0.7.4 runs Pi 1.1.0. A security fix and better compatibility with Pi extensions. Updating is recommended.
Security
- Pi-Bolt no longer loads code from the directory it is started in. In the compiled executable, a package that Pi looked up
by name could be found in the working directory'snode_modules, and one such lookup loaded a native module. A repository
could therefore supply code that Pi-Bolt ran. Pi-Bolt now takes its own code only from itself and the files next to it, and
the runtime no longer resolves a module or package for code built into the executable from the working directory.
Pi run with Node is not affected.
Extensions
- Extensions resolve their own packages as on Node. An extension's dependencies are found through their
package.json
(exports,main), so extensions that use packages such assharpnow load. Checked against the 50 most-installed Pi
extensions on npm: each installs, loads and runs as it does on Node, except@ff-labs/pi-fff, which needs the-jit
build. Without Node.js installed, extensions whose packages compile native code when installed (better-sqlite3,
node-pty) need Node.js and npm.
Building
- Pi builds offline. Pi's model catalog is now part of the repository, so
scripts/prepare-pi.shneeds no model provider
to answer, and the same sources give the same Pi.--refresh-modelsfetches the catalog again. A step that fails prints
its output (docs/BUILDING.md). - Internal names and messages of the macOS launcher and runtime cleaned up.
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shor pi-bolt update, or npm install -g pi-bolt. The installer detects Linux or macOS by itself.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon.
Pi-Bolt 0.7.3
Pi-Bolt 0.7.3 runs Pi 1.1.0. It uses less CPU and memory than 0.7.2 in long sessions and with large tool output, starts
much faster from disk on macOS, and fixes a memory leak that took a real session to 59 GB.
Fixes
- A command with very large output no longer fills memory. The bash tool (and
!commands) wrote the full output to its
file through an asynchronous stream without waiting for it: when a command printed faster than the stream drained, the rest
queued in memory, and each write that completed spent longer the longer the queue was. A three-day session reached 59 GB and
a core at 100%. The output file is now written as the output arrives, so the command waits while the disk is busy; it stops
at 1 GiB with a note, and a full disk no longer costs the model the output and exit code it already has. - From upstream Bun and WebKit ahead of their release: fetch no longer aborts the process when a TLS 1.2 server renegotiates;
an FTL compiler fix for wrongNaNs (JIT builds); Linux reads OS randomness withgetrandom(2).
Faster, lighter
Measured against 0.7.2, both installed from their release archives (medians; docs/BENCHMARKS.md):
| macOS 0.7.2 | macOS 0.7.3 | Linux 0.7.2 | Linux 0.7.3 | |
|---|---|---|---|---|
pi -p with pi-bin not in memory (after a restart or update) |
177 ms | 64 ms | ||
| 32 MB of command output, a line at a time: CPU | 2.0 s | 0.26 s | 5.1 s | 1.7 s |
| ... peak memory | 104 MB | 56 MB | 202 MB | 128 MB |
| Long session: CPU per prompt (prompt 70 / 50) | 73 ms | 63 ms | 252 ms | 231 ms |
| Interactive session, 5 prompts: CPU | 131 ms | 125 ms | 345 ms | 326 ms |
| ... peak footprint / peak memory | 51 MB | 46 MB | 172 MB | 154 MB |
pi -p: CPU |
30 ms | 30 ms | 97 ms | 90 ms |
| ... peak footprint / peak memory | 32 MB | 29 MB | 144 MB | 127 MB |
| Streaming a reply in tmux: CPU | 592 ms | 565 ms | 408 ms | 363 ms |
pi --version: peak memory |
30 MB | 30 MB | 80 MB | 66 MB |
| One RPC session of hundreds of prompts: floor of memory | flat | +5 MB per 100 prompts | flat |
Where it comes from:
- Pi: no work that grows with the whole history or output on every step: the session path is kept between requests
instead of walked from the root (5-8 times per tool turn); a tool call is drawn again only when its arguments change; streamed
tool arguments are parsed as they grow, not in full on every delta (Pi Messages, Mistral, the agent proxy, grammar tools);
read, truncation,grep,edit, JSONL, MCP stdio and Anthropic's event stream go over their input once; pastes and the
editor's undo no longer copy everything on each keystroke;!command output keeps only what can be shown; the context is
not copied for every request when no extension handles it. - Engine:
fs.WriteStreamwrites queued data together withwritevas Node does (800,000 queued lines: 10 s -> 0.3 s);
stream queues compact in amortized constant time; mimalloc from upstream, which no longer wakes its scavenger thread on every
turn of the event loop, with freed memory given back once 25 ms old; threads waiting for work give back their free memory;
on Linux a collection every 5 s instead of every second while Pi waits, and the runtime's code laid out in the order Pi runs
it. - macOS launcher: reads ahead, all at once, the parts of
pi-bina start needs (pi-bin.hot, recorded at build time).
For extension authors
BashExecutionComponent.getOutput()returns the end of a!command's output, at most its last 200,000 characters, not all
of it: the component no longer keeps a command's whole output in memory.
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shor pi-bolt update, or npm install -g pi-bolt. The installer detects Linux or macOS by itself.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon.
Pi-Bolt 0.7.2
Pi-Bolt 0.7.2 runs Pi 1.1.0.
Pi 1.1.0
Everything in Pi 1.1.0, among it:
- Claude Haiku 5.5 (
anthropic/claude-haiku-5-5), with adaptive thinking up toxhigh/maxeffort. --toolsadjusts the defaults with+nameand-nameentries:pi-bolt -t +codemode,-write.- Program status (OSC 7501): terminals and agent dashboards that support it see whether Pi-Bolt is working, waiting on a dialog or a login, done, or failed.
PI_PROGRAM_STATUS=1|0overrides detection. - Classifier models: OpenAI's GPT-6 Luna through the Decisions API, images in codemode's
models.classify(), and native llama.cpp decision models through/v1/systemone. - Tool results record how long they ran (
durationMs), andTookstays right after reloading a session. /mcpopens at once and updates while servers connect; an MCP sign-in can be cancelled with Esc at every step.- Fixes for codemode output items running together,
server_busyand Mistralfinish_reason: "error"responses not being retried, long-prompt pricing tiers undercounting costs, Anthropic browser login when its port is taken, clipboard paste in Termux, and Markdown links in Herdr.
Install
curl -fsSL https://pi-bolt.opensec.in/install.sh | shor pi-bolt update, or npm install -g pi-bolt. The installer detects Linux or macOS by itself.
| Asset | For |
|---|---|
pi-bolt-linux-x64.tar.xz / .tar.gz |
Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+). |
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz |
Any x86-64 CPU with SSE4.2. |
pi-bolt-linux-x64-jit.tar.xz / .tar.gz |
JIT also on, for plugins loaded at run time. |
pi-bolt-darwin-arm64.tar.xz / .tar.gz |
macOS. Macs with Apple silicon, macOS 13 or later. |
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz |
macOS, JIT also on. |
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz |
The Pi-Bolt Bun runtime, for compiling plugins in. |
Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon.