Skip to content

Pi Pocket 0.28.0: Pi 1.5, fast session switching, the Running now board - #269

Merged
TannerMidd merged 559 commits into
mainfrom
release/0.28.0
Nov 6, 2026
Merged

TannerMidd merged 559 commits into
mainfrom
release/0.28.0

Conversation

@TannerMidd

@TannerMidd TannerMidd commented Nov 3, 2026 •

Copy link
Copy Markdown
Owner

Pi Pocket 0.28.0 moves to Pi 1.5 and makes the app fast with many sessions: switching sessions is instant, the session list stays quick with hundreds of them, and a Running now board shows what runs and what is scheduled. PiP can be a board in the session's place, Pi's replies draw diagrams and math, and you can add any OpenAI-compatible endpoint.

Warning

This release upgrades your data one way. Pi Pocket 0.28 runs on Pi 1.5. As soon as a session runs on it, Pi Pocket 0.27 can no longer open the data folder. Stop Pi Pocket and back up the whole ~/.pi-pocket folder first, and do not go back to 0.27 with the same folder. Menu → Update Pi Pocket asks you to confirm, and does not roll back after this update.

Important

To update: back up first (above), then Menu → Update Pi Pocket. It installs and restarts by itself. Details under Updating.

Highlights

New

Improved

Fixed

For theme and extension authors

Updating

  1. Back up first: stop Pi Pocket, then copy the whole ~/.pi-pocket folder. This update changes the data one way.
  2. From the app: Menu → Update Pi Pocket, and confirm. A git checkout runs npm ci; a global npm install runs npm install -g. Both restart by themselves.
  3. By hand: a git checkout: git pull && npm ci; a global npm install: npm install -g pi-pocket@latest. Then restart Pi Pocket.
  4. Each session's next request misses the prompt cache once, because the prompt and the tools changed. The install grows by about 18 MB (KaTeX, Pele, and the HEIC decoder, which is LGPL-3.0).
  5. If you used Tailscale Serve in a 0.28 beta and now start in another mode, a beta 1 mount can stay. Remove it with tailscale serve --https=443 --set-path=/ off.
How this release was checked
  • Ten betas, each with its own reviews and live tests on throwaway copies, in use on the owner's server through the week; Greptile reviewed the release pull request through beta 10.
  • A final review of the whole release against 0.27.0 by five reviewers, then fresh reviewers on the fixes: it found and fixed a memory growth in the session list, and smaller things.
  • Live tests on throwaway copies at 320 to 1920 px in dark and light themes, a 0.27 data folder opened on 0.28, a real-model pass on the real launcher, and the owner's own testing of the final build on his server and his phone, PiP included.
  • npm test (1,746 tests), npm run check, lint, and Prettier pass; three browser tests that time out under load pass alone.
  • Not tested: desktop Safari, Firefox, Windows, a screen reader, the real tailscale command, and Nix on macOS.

Thanks to @vitalNohj for session switching, the Running now board, PiP as a board, endpoints, and many extension APIs; @Haichiu for icons, avatars, tabs, All artifacts, and Figma scans and resync; @piromagnus for diagrams and math, favorite models, workspace hooks, and Stop on limit waits; @Quintasan for Tailscale Serve; @wangbinyq for background output and the default workspace; @XYenon for grouped task reports; @zahradil for HEIC; @lingmann for webhook prompts; and @aSapien, @dogagenc, @caesarioshiddieq, @mikyan, @krittaprot, @Wiselfx, and @OhiyoX for their reports.

Full changes: v0.27.0...v0.28.0

Closes #183, closes #195, closes #207, closes #215, closes #219, closes #223, closes #239, closes #249, closes #257, closes #260, closes #265, closes #281. Refs #230.

… prompt editor

The Desktop group reads its items above the markup instead of in an arrow function inside it, and
the webhooks sheet uses the editing flag it already has. Follow-up to #251 by @vitalNohj and #243
by @lingmann.
Follow-up to #253 by @piromagnus. Owner decision: $HOME/bin:$PATH and
"$value" and "$type" were set as math, because only a digit after the closing
$ kept it open. A letter after it now keeps it text too; $x^2$, $a+b$,
"$x$, and" and "($y$)" still render.
…he box and PiP show a HEIC as a file

A review of the fix round: the queue moved on at the worker's answer, so two workers ran side by
side for a moment; it now waits for the exit. The message box (a restored draft) and PiP still
asked the server to show a HEIC as a picture, which it cannot (415).
Follow-up to #243 by @lingmann. Esc in the prompt editor closed the whole
sheet and dropped the draft. It now cancels the edit, as Cancel does, and
the sheet closes on the next Esc.
…a folder here

In a session on a workspace URI, design_system (scan, init, read, and the
rest), design_export, the export route, and the design system routes took
the URI ("ssh://host/work") as a relative path on this machine: a scan
read below the server's folder, and init could make .pi there. They now
refuse with "not available for remote workspaces". design_preview, the
canvas check, the prompt's design section, and an artifact's ds/ links
use no design system there. A test covers the tool's refusal.

Follow-up to #173 by @piromagnus.
An audit of the places that turn a session's folder into a local path.
In a session on a workspace URI these used it as a relative path on this
machine: the browser opened file paths (and ./x resolved below the
server's folder), prompt templates read ./.pi/prompts there, project
memory ran git there and keyed lessons to that path, a PR watch ran gh
there, and PiP's checkout search tested it. Now the browser refuses file
URLs there, templates come only from Pi's folder and whole paths, the
URI is its own memory project, a PR watch refuses, and PiP skips it.
The workspace hook docs list what is blocked. A test covers the watch
and the memory project.

Follow-up to #173 by @piromagnus.
The built-in modules were folded at the bottom, below the themes, under one line. They are now the
first section of Installed, open, with how many are on; your extensions and themes follow.
…g running

A ! command in a session whose workspace provider is off threw when the
shell task asked for its environment. No entry was written, so the card
showed "running" until a reload and then went away. The command now ends
as a failed command with the provider's message, as Pi's tool calls do.
A test covers it.

Follow-up to #173 by @piromagnus.
Recent listed every session folder, workspace URIs too. The picker showed
fake://box/work as "box/work", like a local folder, and a tap asked
/api/fs for it and got a 400 with developer text. The picker browses this
machine only, and the provider's module starts sessions on its addresses,
so /api/fs now leaves URIs out of Recent. A test covers it.

Follow-up to #173 by @piromagnus.
The stricter closing rule kept "设$z$为实数" and "$x$です" as text: those scripts put no space
between words and math. A letter of Han, kana, or Thai after the closing $ no longer counts.
Found by the post-fix check.
A linked start without a cwd took the source's folder with no owner check, so an
all-session guest could start a session in the owner's remote workspace.

Follow-up to #173 by @piromagnus.
A fork, and an edit or retry sent again, starts a session in the source's folder.
With a remote folder that let an all-session guest start one with no owner check.

Follow-up to #173 by @piromagnus.
…n conversation

A fence component now draws under a Guard, with the fence's source as the
fallback; it tries again when the source changes (streaming).

Follow-up to #253 by @piromagnus.
…English

#239: a person who talks to PiP in Chinese opened a session PiP had worked in and found it in
English, because every message between agents was Simplified Technical English. The beta 5 fix
tied the language to pip.md, which that person does not need and has no reason to write.

Now the language is the person's own, with no setting. PiP writes what agents read in the
language its person writes to it in (pip.md can still name another). A session writes to its
linked sessions and subagents in the language of the person it works for. An agent answers a
message from another agent in the language of that message. English stays ASD-STE100; another
language keeps the same short, plain style. pip.md no longer carries a language rule of its own.

Reported by @mikyan.
…tab kept

keptAsks dropped the answers of asks missing from the session's view,
also when that view was the copy the tab kept, which may be old. Back
in a session whose ask ended while another tab answered a later one,
the kept copy's card dropped the later ask's answers from the shared
storage.

Answers of ended asks now go only by a view the server sent since the
session showed (viewSynced in store.js): as it comes, and as a card
leaves it. A kept view drops nothing.

Follow-up to #282 by @vitalNohj.
@greptile-apps

greptile-apps Bot commented Nov 6, 2026

Copy link
Copy Markdown

Your organization has run out of review credits. Add credits to resume code reviews.

…an apply does, and never offers an apply

Follow-up to #213 (@Haichiu). Final review R1-D1.
… mode

Follow-up to #244 (@Quintasan). Only tailscale-serve needs tailscaled; the Nix module already adds it only for that mode. Final review R1-A1.
…te never sets it

Final review R1-D2. Follow-up to #248 (@vitalNohj).
…s, fences and inline math, and answers

Final review R1-H3.
…he pi-ai shim, session tabs, the Background sheet, and Find

Final review R1-H4.
…en, over the now line

Follow-up to #232 (@vitalNohj). Final review R1-W4.
A draw's closures held the rows of the draw before, so each row element
kept the tree it was first drawn in, and each tree kept the one before.
Switching sessions or a minute tick left a whole app tree behind each
time. The rows of the draw before now live on the ref only while the
draw runs, and a layout effect clears them.
Some browsers never answer an IndexedDB open (old WebKit, storage being
deleted). The app waited for it before it connected, so the page stayed on
"connecting" and Sign out never ended. The open now gives up after one
second, like a failed open, and a later call opens it again.
0.27 kept sent text (the up-arrow and Ctrl+R recall) in one key whose
records name their person. The first load of 0.28 removed that key, so
everybody lost it. When a person signs in, their records now move, before
any they already have, to their own key (up to 200). The records of other
people stay until they sign in, or until a sign-out removes everything.
The old drafts, pastes, and other unscoped keys still go.

Follow-up to #266 (@vitalNohj)
Goes with the R1-W2 fix on r028/fix-web.
htm keeps each element that a template makes with no values, and gives
the same one again. Such an element keeps the app's tree it was first
drawn in. When that tree had session rows (a page that starts on the
list), the rows' memo bail-outs linked it to every later tree, so each
switch left one behind. `this[0] = 3` in `html` stops htm from keeping
elements; templates stay parsed once. The leak test now also starts on
the list.
…ly would be refused

Replaces the refusal of 20d8fb8: a dry run after a .fig that cannot be read still shows which tokens it did not see. Final review R1-D1. Follow-up to #213 (@Haichiu).
Round 2 R2-R1: the trim of 6b90126 dropped this case. Test by r2-rest; it fails when the cleanup runs off with nothing mounted.
…ist reads in order

Follow-up to #232 (@vitalNohj). Live test live-b N2.
… axis is

Follow-up to #232 (@vitalNohj). Post-fix check pf-final minor; the tooltip and aria-label keep the schedule's own zone.
@TannerMidd TannerMidd changed the title Pi Pocket 0.28.0 Pi Pocket 0.28.0: Pi 1.5, fast session switching, the Running now board Nov 6, 2026
@TannerMidd
TannerMidd merged commit 5eb3404 into main Nov 6, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment