Repository navigation
Releases
v0.14.0
Working, Live and the REPL page have a Width switch between a narrow column and the window's width, remembered in this browser.
- Width: Narrow or Wide. At the top right of Working, Live and a REPL session's page. Narrow is the 720-pixel column as before; Wide uses the window, up to 1100 pixels. On the REPL page, long code lines and wide output need less sideways scrolling, and wide plots show larger, up to 1020 pixels across.
- Remembered in this browser. The choice is a cookie that says only
wide, kept for a year or until you choose Narrow. A cookie isn't tied to a port, so it holds for every preview in this browser, including after a watcher restarts on a new address. The REPL sessions list follows it. The server never reads it. - Hidden where it can't help. In a window narrower than about 760 pixels the column already fills it, so the switch is hidden. It's left out of print too.
- Same pages as pi-markdown-preview 0.27.0.
v0.13.4
The REPL page bounds each entry's saved files by its turn in the session, and a file's link serves only a version the page showed.
- Each entry's own turn. Since 0.13.3, a file showed under an entry if it was written while that entry ran, plus 2 seconds. Entries that follow each other quickly could share a file: save
plot.pngtwice in a row and both entries showed the second plot; an entry that only namedx.png, followed at once by one that wrote it, showed it too. Now each entry's files are bounded by its turn: from when it was recorded, or when the previous entry finished if that's later, to when the next one started. Turns follow the order entries finished in, since a send can wait for its turn after it's recorded. - Links serve only what was shown. A tile's link now serves its file only while it's still a version the page showed. A file replaced since, by anything (a copy that keeps its modification time included), answers 404 until an entry shows it.
- Limits. Modification times aren't proof of which code wrote a file. A later entry's copy that keeps the original's time (
cp -p,shutil.copy2) shows under the entry whose time it carries, and two entries running at once can briefly both show a file they both name. - Same REPL page as pi-markdown-preview 0.26.4.
v0.13.3
The REPL page shows a saved file only if the entry named it and wrote it, and says when a session's record directory isn't verified.
- Saved files: a fix. Since 0.13.1, the page could show, and serve to anyone with the link, a file an entry never named. A name with a space, such as
savefig("fit 2.png"), also matched its tail,2.png. A quote inside a name, as in"O'Brien plot.svg", did the same. Any file with that shorter name in the session's directory showed as a tile. Now a path inside quotes counts only as the whole quoted text, and a file shows only if it was written while its entry ran, so a file that was already there never shows, however the text is read. A file an entry only reads or mentions isn't shown either. A file a later entry rewrites shows under that entry. - Record directory not verified. pi-repl, agent-repl and Pi Studio now mark each session with a key for the folder its record lives in. A session that has a record but no key has been written to only by older versions, so the page shows it with a note that its record directory isn't verified yet. The note goes away once a current pi-repl, agent-repl or Pi Studio sends to it.
- Same REPL page as pi-markdown-preview 0.26.3.
v0.13.2
The REPL page checks that a session's shared record is in the preview's own record directory.
- Record directory. pi-repl will mark each session with a key for the folder its record lives in. If that key isn't the preview's own (a different
TMPDIR, for example, or a replaced folder), the page says the record is elsewhere instead of showing one that may not be the one other clients use. A key the page doesn't recognise is refused the same way. - No change today. Sessions don't have keys yet, and a session without one is shown as before, with no notice.
- Same REPL page as pi-markdown-preview 0.26.2.
v0.13.1
The REPL page names who sent each entry, shows the plots and PDFs a submission saves, and lists LFortran sessions.
- Who sent it. An agent's entry shows its name, as before. A person's shows the name pi-repl records with how it was sent, such as Sam · via Pi or Sam · via terminal (pi-repl 0.11.5 and later; agent-repl's
sendafter its next sync). Older person entries, and Pi Studio's until it records names, show as User (with via Pi Studio for Studio's). - Saved plots and PDFs. Image and PDF files a submission's code or output names, such as
plt.savefig("attachments/fit.png"), show under it, one tile per file: images as pictures, PDFs as links, each opening in a new tab, with the full path on hover. Relative paths resolve against the session's working directory. A plot shown only in a window isn't caught; save it to a file. - LFortran.
pi-repl-lfortranis listed with the other sessions, and its code is highlighted as Fortran. - Pending.
sent(LFortran's and Pi Studio's pending state) shows as pending, likesending. - Same REPL page as pi-markdown-preview 0.26.1.
v0.13.0
An optional REPL page follows the shared REPL sessions live, beside Preview and Working, and wrapped code keeps its indentation.
- REPL page (
--repl). It's off unless you ask for it, and works with pi-repl, agent-repl and Pi Studio, whose shared sessions run in tmux. It lists the shared sessions (pi-repl-python,pi-repl-julia, …). Open one to follow its recent recorded submissions as they arrive: who sent each one (the agent's name, Pi or Pi Studio), its status (pending until its code is done, then done, error or timed out) and time, the code, highlighted, and the output, with Wrap lines for long output lines. That includes code agents send through agent-repl over MCP from Claude Code, Codex and OpenCode. Code typed directly into the terminal isn't recorded, so it doesn't appear. - Read-only. The page never runs or sends code, and inspects tmux without changing anything. It follows one lifetime of a session; when the session ends or a new one starts with the same name, it says so and doesn't follow the new one.
- Quick switching.
- The REPL link and Ctrl+Alt+R (Control+Option on macOS) return to the REPL page you were last on in that tab.
- Copy link copies a link to the session for another browser.
- Option/Alt+Left goes up, from a session to the list and from there to Preview.
- Privacy. The REPL page shows code and output from any agent or project that uses these sessions, future submissions included, to anyone with the link. It's a separate opt-in from Working, and Working links never gain it. With
--repl, links and addresses are never remembered: they stop working when the process stops, and a restart prints new ones. - Wrapped code continues 4 columns past its own indent, so a wrapped line no longer looks like a line of its own: in Preview with Wrap on, in Working's code, and on the REPL page. REPL output stays terminal text, with Wrap lines as in Working. Diff blocks in Preview no longer show a blank line between lines.
--allnow works as well as-aand--all-projects.- Same watch controls as pi-markdown-preview 0.26.0.
v0.12.0
REPL calls get readable cards in Working and Live, Option/Alt+Left goes back a page on a linked file, and \boxed shows its frame in Chromium.
- REPL cards. Code an agent sends to a shared REPL shows its runtime (Python REPL, Julia REPL and so on) with the code under it. That covers agent-repl over MCP from Claude Code, Codex and OpenCode, and pi-repl or Pi Studio from Pi. Its result shows just the output, headed with the call it belongs to, such as Output · for 8, because calls made together are recorded before their results. Pane text that pi-repl reports before a submission is shown as terminal text, folded when it runs past eight lines. A result in any other form, such as a truncated one, an error or a shared-record warning, keeps the ordinary view, and the exact recorded text stays under Raw output.
- Option/Alt+Left on a rendered linked file goes back a page, as Back does, through nested links. ← Return to preview still goes straight to the response the file was opened from.
\boxed{…}shows its frame in Chromium, which doesn't draw MathML's<menclose>. Safari and Firefox look the same as before. Thanks to pf-sjtu (Asher Peng) for finding this in pi-markdown-preview #16.- Literal text stays literal. An unclosed
<div …>tag, which Pandoc passed through as HTML, now shows as text. Text inside code that looks like an annotation placeholder is no longer replaced. - Same watch controls as pi-markdown-preview 0.25.0.
v0.11.0
Captions name the model, Ctrl+Alt+L opens the latest Preview, and ? lists the keyboard shortcuts.
- Each response caption names the model the agent recorded for that answer, for example Claude Code 3f2a · Claude Opus 5.5 · Fit decay model to measurements · 03:05 pm, for Claude Code, Codex, Pi and OpenCode. A model switch partway through a session shows on the next answer. Claude, GPT and Gemini IDs are shown as names, other IDs exactly as recorded, and the model is left out when the agent didn't record a usable one. In a long Codex log, the oldest answers shown at start-up can lack a model.
- Captions read exactly as recorded: punctuation in a title or model ID is shown as typed, never as formatting, links or maths. That includes apostrophes and dashes in titles.
- Ctrl+Alt+L goes to the latest response in Preview from any view, including an earlier Working page. On the latest Preview already, it does nothing.
- ? opens a list of the page's keyboard shortcuts, which is also under Keyboard shortcuts in the counter menu. It shows only the shortcuts the page has: as key caps on a Mac (⌃⌥L), and as key names elsewhere (Ctrl + Alt + L). Esc,
?or Close closes it and returns focus to where it was; a click elsewhere closes it too. - Same watch controls as pi-markdown-preview 0.24.0.
v0.10.0
<details> blocks, and rendered content can't run scripts.
- A
<details>block, with an optional<summary>, collapses in the preview as on GitHub and starts closed unless markedopen. Open content is indented under its summary with a rule down its left side, so nested blocks are easy to follow. - Tags are recognised only when they stand alone at the start of a line and pair properly. Tags in code, maths, comments or front matter, and indented, attributed or inline tags, stay literal. Raw HTML stays off.
- Rendered content can't run scripts. Every render drops event-handler attributes and unlinks
javascript:,vbscript:andlivescript:link and image targets. MathJax runs with its safe extension, and links in rendered maths with a script scheme lose their target. Pages also keep their script policy, which allows only the page's own scripts. - Same renderer as pi-markdown-preview 0.23.0.
v0.9.0
--live follows OpenCode 2 sessions too.
- Pinned and index-opened OpenCode (v2) sessions get Follow activity and live Working. OpenCode updates its records in place, so Live re-reads the current turn whenever the session's event counter moves and redraws only the cards that changed.
- A turn runs from your prompt to OpenCode's idle marker: succeeded, interrupted or failed. Prompts sent while it runs belong to it; compaction and other maintenance is not a turn. An answer imported from OpenCode v1 closes its own exchange.
- A completed turn links to the same answer the history keeps. An answer that stopped at the output limit is shown as incomplete with a link to the partial answer, and one larger than Preview keeps is reported as too large.
- Running tools show "No result recorded yet"; text appears as OpenCode records each block. A staged revert's activity is not the current turn and is labelled; a committed revert removes its cards.
- For every agent, Live now lists what it leaves out in its status line, says plainly when a response isn't in this preview (or is no longer kept), and keeps card numbers in step as the window moves.
- Finished Working shows OpenCode 2's recorded shell output and reports malformed records instead of failing.