You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
New features
Turn on relay remote access in Settings (off by default); app.ovis.sh ships separately.
Chat shows the pictures in Copilot, Grok and Hermes sessions.
Chat draws svg code blocks as figures in the theme's colors.
Chat draws math written between dollar signs.
Portal can sign visitors in by link or login; they watch by default.
DeepSeek Harness joins Settings → Agents; Chat reads its conversations on Linux.
A numbered tab is named from a few words of its first message.
Add a note on a diff line; it goes into your next message.
Improvements
Chat can open thinking or fold work by default, set in Settings.
Select words in a Chat reply to quote them into your message.
Drag a key bar key by its handle to reorder it in Settings.
On phones, same-host links can open in a popup inside the app.
Claude question cards list each question as a step, with Back.
OmO, Codex and Hermes cards go between questions with Back and Next.
Connect a phone through the Ovis relay, no Tailscale needed, or Tailscale or a code.
Chat shows pictures whole, up to the width of the column.
Bug fixes
Panes show again in Safari 16.4 to 17.3 and on iOS 16.4 and later.
Stop with a message queued no longer loses the stopped message.
A first message from New tab reliably reaches Claude Code.
Codex Chat shows the conversation again once an answer finishes.
Question cards show as soon as the agent asks and stay put.
Chat no longer redraws turns or jumps when you send or reopen it.
A setting changed just before a reload is no longer lost.
Claude's plan card shows in narrow panes too.
Full changelog
Added
Read DeepSeek Harness v4 chat on Linux, including reasoning, tools, and history, for the dsh
terminal UIs (dsh-tui, dsh-tui-pi) and headless runs.
(#2453 by @jokkopucko)
With OVIS_RUNTIME=herdr-core, New workspace, New tab and Close work on the PC's herdr-core
terminals, and an agent picked in the dialog starts in the new terminal. A workspace or tab made
here shows in the Herdr app too, where the app places its own.
(#2449)
OVIS_RUNTIME=herdr-core shows the terminals of the Herdr desktop app (herdr-core, hc) instead
of herdr's TUI server: the app's spaces and tabs in the sidebar, agent status and alerts from what
agents report, and the live terminal streamed from herdr-core. Requested by @Ploppy3 (#2439).
(#2442 by @nahwan-kim)
Drag a key bar key by its leading handle to change its order in Settings, with edge scrolling
for long moves. Up/down buttons remain available without dragging; Escape cancels a drag.
(#2463 by @zerodice0)
An OmO pane's background tasks now count and list its background commands (bash with run_in_background, or a command auto-detached past the foreground window) and its monitors,
as a Claude Code pane's background commands are, read from the session's own transcript.
Detached eval cells, which already counted, are listed too. A persistent monitor is listed
but not counted, and work started before the OmO process now holding the session reads as lost.
(#2468 by @Yoonwoo-Ha)
Settings → Phone & devices → Portal can put Portal's own sign-in in front of the address: a
private link, an Ethereum wallet, or Google or company login (OpenID Connect), each with the
names, wallets or accounts it lets in. Whoever gets through may watch by default, with no access
token asked. Invitations keep a watch role on the server; the owner's app token still drives
and paired devices keep their roles. Devices says who signed in. A visitor let in this way cannot
pair or revoke devices, subscribe to push alerts or control Portal, and a page of theirs left
open loses access within 5 minutes of the link expiring or a sign-out. A private-link Portal
offers Invite someone: a link for 1, 7, 30 or 90 days, shown once. The app believes who
Portal signed in only with a proof it hands that Portal in its environment, so other ways to
the app's port cannot pass for it. A sign-in needs Portal v2.7.0 or later, which lists --auth-identity-proof and the OIDC flags; the panel says plainly when the installed portal
does not. Google or company login reads its client secret from OVIS_PORTAL_OIDC_CLIENT_SECRET. The default, the access token or a paired device, is
unchanged.
(#2065 by @rabbitson87)
A browser that Portal's sign-in let in can sign out from Settings → Devices. One click ends
both app and Portal sessions when both exist; it does not sign out of the identity provider.
Google or company login shows both callback addresses to register, including the short host.
(#2065 by @rabbitson87)
Chat shows the pictures in a GitHub Copilot CLI session: those attached to a prompt and those
its view tool read, from the bytes Copilot keeps in its own session file.
(#2479)
Chat shows the picture attached to a Hermes prompt, from the local file Hermes names for it,
the way it shows a local image in Markdown; a picture it cannot read stays a link.
(#2482)
Chat shows the pictures in a Grok CLI session: those sent with a prompt and those a tool read,
from the update log Grok keeps for the session.
(#2481)
Chat draws a ```svg fence as the figure it is, in the theme's colors, with the same enlarge view
as a Mermaid diagram. The figure is shown as an image, so its markup never runs in the page; a
fence still streaming, one that does not draw, one past 256 KiB, or one holding a script, an
event handler or a reference outside the figure stays a code block.
(#2477 reported by @affeek)
Chat draws math written with dollar signs: $…$ inline, $$…$$ and a ```math fence as display
math, beside \(…\) and `[…]`. A dollar sign reads as math only where a price or a shell
variable cannot: after no Latin letter or digit, with no space inside its ends, on one line,
before no Latin letter, digit or shell mark (`{ ( # @ *`), and not a number followed by a word,
so "$5 and $10", `$HOME/${PATH}` and `$(whoami)` stay as written while `$x$는` and
`$2 + 2 = 4$` are drawn. A formula KaTeX cannot draw shows as written.
(#2498 reported by @kjohnsen)
Settings → Chat → Expand thinking opens the agent's reasoning in the chat instead of folding it
(#2346), and Collapse work starts a turn's work folded to its one header line, also while the
agent works; a block waiting on you still opens (#2228). Both are off by default and kept per
device, and a block you open or fold yourself stays that way for its message.
(#2484 reported by @altgans and @Ploppy3)
The card for Claude Code's questions (AskUserQuestion) and its "Ready to submit your answers?"
review now list the questions as steps, with Back, as omo's and pi's forms do. A step moves
Claude's own tabs with ←/→ and keeps the answers already given. When the terminal does not show
the tab expected after a move, the card stops and leaves the rest to the terminal.
(#2503 reported and co-authored by @jpcarranza94)
A tab still named by its number ("Tab 2") now shows a few words of its first message, in every
browser of the server. A name you gave a tab is kept, herdr's own tab names do not change, only
those words are kept (until the tab closes), and Settings → Name tabs from the first message turns
it off and deletes them.
(#2502 reported by @vibewriter-hand)
A line of a file's diff takes a note for the agent: a + beside a hovered row, a click or tap on the
row and the bar's Add a note (a full touch target on a phone), or the arrow keys and Enter. The note
waits with the comments on a reply and goes first in the pane's next message, with where the line
is, the comparison as it was read and the line's text; nothing is sent until you send. A note that
would make the message too long is refused, and a pane with no agent says why it takes none.
(#2505)
The Ovis relay service (relay/): the meeting point where a PC running Ovis and a phone that
cannot reach it directly both dial out, carrying only end-to-end encrypted frames it has no key
for and keeping no logs. A PC must prove it holds its key to serve its server_id. It runs as a
Cloudflare Worker deployed from CI with the maintainer's approval, or as a plain Bun server. Ovis
uses it only once a PC's relay link (below) is turned on in Settings; it is off by default.
(#2499)
The PC side of the Ovis relay: a link from this PC to the relay that answers the relay's server
proof, with /api/relay routes to start and stop it that only the owner may use, and only over a
direct connection to the PC. plugin pair prints a relay QR when the relay is online. It is off
by default: nothing connects until it is turned on in Settings (below).
(#2504)
The phone side of the Ovis relay: a hosted shell (bun run build:shell) that pairs from the PC's
relay QR, keeps a device key the browser cannot export, and opens the full app through the relay,
end-to-end encrypted: terminals, chat, event streams and push alerts. A shell and PC on different
versions reload onto the newer shell or ask for the PC's update. Like the PC side it is off by
default: nothing connects until the PC's relay is turned on in Settings.
(#2509)
Files and chat images load through the Ovis relay, including PDFs, rendered HTML pages and
seekable videos in browsers. Clients without a service worker open files up to 64 MiB and
explain when a file needs to be downloaded on the PC. Copied file links reopen the paired PC's
reader, and rendered pages remain isolated from the app and its stored device keys. Like the
rest of the relay it is off by default.
(#2509)
Remote access through the Ovis relay can be turned on in Settings → Phone & devices → Remote
access through Ovis relay; it is off by default. Once on, it shows a QR that pairs a phone
through the relay and says whether a phone is connected; turning it on closes the device gate,
only the PC's owner on a direct connection can control it, and the PC's relay identity can be
reset there. The iOS and Android apps open a PC paired over the relay from its pairing link and
save it by its own address on the hosted shell (app.ovis.sh), which is deployed separately.
(#2514)
Reset relay identity, under the relay switch, gives the PC a new relay ID and key and removes
every phone paired through the relay; each then scans a new QR code. The relay ID is derived from
the PC's key, and the relay lets a PC in only after it proves it holds that key, so knowing the
ID is not enough to take the PC's place or catch its phones.
(#2514)
A Letta Code pane on Letta's local backend shows its model and reasoning effort in the composer,
as Letta runs the turn: the conversation's own /model choice, else its agent's.
(#2519 by @homebodify)
Large files and videos over the relay keep up to 384 KiB in flight, so a download isn't held
back by waiting for each receipt (over 5 MB/s at a 50 ms round trip), while terminal output still
goes ahead of it.
(#2522)
Remote access through the Ovis relay, off until you turn it on under Settings → Phone &
devices: scan its QR code and the phone opens Ovis at app.ovis.sh, end-to-end encrypted to the
PC, with no Tailscale, account or port forwarding. A phone pairs once with a pairing code and then
proves itself with its own device key, never a token. Terminals, files, pictures, PDFs, seekable
videos and push alerts work through it, and Revoke cuts a phone off at once. pair prints
the relay's QR code too, and the iOS and Android apps open relay pairing links.
(#2522)
Run your own relay with bun relay/bun.ts and OVIS_RELAY_URL, or host the app yourself with OVIS_RELAY_APP_URL.
(#2522)
Each release attaches the hosted app it deploys to app.ovis.sh as dist-shell.tar.gz with its
SHA-256, so anyone can compare the two. The user guide and docs/relay.md explain what
relay.ovis.sh and app.ovis.sh can and can't see.
(#2522)
DeepSeek Harness is in Settings → Agents and the setup guide: Ovis finds it (dsh with the
dsh-tui terminal UI), installs it with its makers' npm command in a terminal tab, and starts
dsh-tui from New workspace, New tab and New worktree.
(#2524)
Changed
On a PC with OVIS_RUNTIME=herdr-core, Ovis no longer offers renaming, moving, splitting, zooming
or resizing workspaces, tabs and panes, nor the worktree actions: the Herdr app's window owns that
layout, and herdr-core refused them.
(#2451)
With OVIS_RUNTIME=herdr-core, a terminal's live view streams over the server's own connection to
herdr-core, instead of an hc attach process and a PTY host for every open pane.
(#2447)
Settings → Phone & devices is shorter: one Connect button opens a Connect a phone dialog with the
Ovis relay, Tailscale and a pairing code, and the QR codes and longer explanations are there
instead of on the page. Pair a device opens it on a fresh pairing code.
(#2533)
The tailscale serve command box no longer has a blue accent stripe on its left edge.
(#2533)
Chat shows pictures larger, as a desktop chat app does: a picture you attached and one a tool
read are drawn whole, up to the message column's width and never past their own size, instead
of a cropped 9 by 7 rem thumbnail. A tall screenshot, there or in an answer, stops at 70% of the
window's height (60% on a phone), and a diagram may now grow to the same height instead of
24 rem. A small icon stays its own size, and a tap still opens the image viewer.
(#2539)
Connect a phone makes it plain that a phone can connect without Tailscale: the ways to connect are
three cards with a one-line hint each (Ovis relay: from anywhere, nothing to install; Tailscale;
Pairing code), and the Phone row names the relay beside the Tailscale address. The dialog opens on
the relay whenever it is on or Tailscale is not set up; on a tailnet with the relay off it opens on
Tailscale, with the relay's switch right on its card. The relay still starts off.
(#2567)
A chat opened from a tab, a workspace row or an agent row starts loading when the press begins,
not after the app has drawn the new pane, so its messages show sooner.
(#2562 by @jpcarranza94)
Selecting text in a Chat reply now offers Quote first: it puts the words in the message box as a > quote after what you typed, ready to write under, without sending. Comment is still there,
as the icon beside it.
(#2574)
Settings → Phone & devices says each thing once: the separate Ovis relay group is gone, its switch,
Reset relay identity and start failures are in the Connect a phone dialog's relay card, the
Connect a phone row shows the relay's state (Online, Off, Blocked), and what a paired device can
do is explained only under Devices.
(#2578)
Fixed
New workspace's folder picker puts Use this folder and the folder filter on one compact row, and
moves Show hidden into the path bar, leaving more room for the folder list on phones and desktops.
(#2555 by @iwangjie)
An answer to one of Claude Code's questions (AskUserQuestion) comes back once the terminal shows
the next question, the review or nothing. The question just answered, or a generic card from a
half-drawn screen, no longer comes back for two seconds after the answer.
(#2466 by @jpcarranza94)
Claude context uses the session's captured limit, including 1M windows below 200k tokens.
(#2452 by @jokkopucko)
Codex Chat no longer falls back to the terminal once Codex has let go of its conversation store:
Ovis reads the store even when no Codex holds it open, still without writing to it.
(#2446)
Codex Chat shows a pane's conversation again after an answer finishes: the "Worked for 4s •
7:05 PM" line Codex draws below a finished answer no longer keeps the answer from being
recognised, which left Chat on the terminal view.
(#2443)
Copilot Chat recognizes a verified parent-to-child handoff when the parent's complete log first
identifies its session at release, without requiring an earlier registration entry.
(#2457 by @YuuuXie)
With OVIS_RUNTIME=herdr-core, starting an agent no longer types into a pane whose own program is
not a shell, a terminal Ovis started into a Herdr app space or tab with nothing else live in it
keeps its place when the app adopts it, and resuming a Claude session checks the store a new
terminal really gets (herdr-core's environment, not Ovis's).
(#2456)
With OVIS_RUNTIME=herdr-core, a pane shows a finished turn only when its program reported it
(working, then idle or done): a program's error, a pause it reported, or a report it cleared no
longer shows as done.
(#2455)
Codex Chat on macOS can read a conversation behind Kiro's shell-integration terminal wrapper
when the wrapper's nested foreground Codex is uniquely proven, even without a herdr agent label.
(#2420 by @cheol-95)
Cached nested conversations also require matching wrapper, shell and Codex process start times,
so reused process IDs cannot retain a previous conversation's binding.
(#2420 by @cheol-95)
Same-host web links can open in a closable in-app popup on narrow screens when Web links is set
to In the app.
(#2459 by @Haeminway1)
On the Node PTY host, a terminal whose command exits while its output is paused or still being
sent keeps that last output: the host now holds the pty until it has read everything, as the Rust
PTY host does, instead of dropping what was left after 200 ms.
(#2461)
After an answer, the question card stays, waiting, until the next question takes its place. It
no longer disappears and comes back between two questions of one form.
(#2467 by @jpcarranza94)
Before updating a bridge that replaces a PC's independently managed Ovis,
verify the replacement's live ownership. A stale descriptor cannot trigger
a bundle installation or discard the prior server's reconnect guard.
(#2450 by @briantcl1992)
A Chat message to Pi that starts or ends with a space, holds a tab, or ends with an @mention
no longer stays "waiting for transcript" forever and holds every later send on the pane behind it.
(#2474 reported by @BeerBelly69)
A message that went to the terminal no longer stays "Not confirmed" when the connection dropped
before its receipt arrived: the browser that sent it gets the receipt back when it reconnects or
reloads, within ten minutes. Nothing is sent again, and a message whose delivery was never
confirmed stays unconfirmed.
(#2475 reported by @christso)
Chat no longer rebuilds every message when the pane's skill names load after its transcript, so
a decoded image no longer drops back to its loading slot as a chat opens.
(#2490 by @nocstah)
A Copilot chat no longer splits a turn whose pictures fill the page window: the newest page
showed only the answer, and the older one the tool calls without their output.
(#2483)
Question cards keep terminal context and its caption above the question without overlapping
on short mobile screens.
(#2494 by @todor-a)
At a small or large Chat font size, the space between and inside messages shrinks and grows with
the text instead of staying at the page's spacing; the view's edges and touch targets keep their
sizes. On a touch screen, a folded work block's head keeps a 44 px minimum row height, so the
default Chat font size keeps the same spacing as before.
(#2491 by @nocstah)
A shared setting changed just before a reload or a closed tab is no longer lost. Show plan limits
no longer comes back on: the change is sent as the page goes, or is hidden.
(#2487)
A settings change in one Ovis tab no longer undoes a change made meanwhile in another open tab
of the same browser. A tab now saves only the settings it changed.
(#2486)
On Linux without secret-tool, Settings → Agents no longer calls a signed-in Antigravity CLI
"Not signed in": it says the sign-in cannot be read until secret-tool (libsecret-tools) is
installed, and finds the account on the next look once it is.
(#2472 reported by @matiemer)
Starting Portal and reading remote access settings over a relay session now use this server's
listening port instead of the default port.
(#2476)
An OmO question card with several questions now moves between them without an answer, as Tab
and Shift+Tab do in the terminal: tap another question's step, or use Back and the new Next
button. Codex's question card gets Back and Next (its ←/→), and Hermes's batch of questions
gets its steps, Back and Next (its Tab and Shift+Tab). Each move sends the agent's own key and
waits until the screen shows the question it moved to. If the screen shows anything else, the
card stops and sends nothing more.
(#2506)
The iOS and Android apps no longer show the hosted shell's Safari home-screen pairing hint (the
relay is off by default).
(#2509)
Limit self-hosted relay connections, rooms, open sockets per address and address bookkeeping by
default, with configurable per-address and global rate budgets.
(#2514)
Close a relay client that waits 30 s for a PC that is not connected, so waiting clients cannot
fill the relay while the PC is away.
(#2514)
The hosted shell now reads the PC's copy-on-select preference and sends relay-control requests
through the paired relay connection instead of the static shell host.
(#2514)
Opening a Claude Code pane's background-task list reads its subagent history on a file thread,
so that request's filesystem work no longer blocks other requests and terminal connections.
(#2511 by @duytbp)
Words typed in the "Tell Claude what to change" field of Claude Code's plan card go to Claude as
feedback, and Claude keeps planning, as Enter does in its terminal. The card used to send
Shift+Tab, which approved the plan with the feedback and started to run it.
(#2518 by @jpcarranza94)
Chat's question card can move to unanswered later pi-ask questions with Next, and between omp
Ask questions without answering. Omp moves need a complete styled tab strip and its matching
open call; omp's review page is not a step the card moves to, and offers no moves itself.
Unsent edits stay visible until sent or cleared.
(#2508)
Before each key the card sends, a move or an answer, the server reads the terminal again and sends
the key only if it still shows the question the card was tapped on; otherwise nothing is sent.
(#2508)
An omp question cut short on screen keeps the terminal's text on the card instead of the call's
Markdown, since what is shown may be another call's question that starts the same way.
(#2508)
With OVIS_RUNTIME=herdr-core, a tab no longer stays paused after a reconnect, and a tab out of use
no longer starts herdr's read-only view, which cannot reach herdr-core and only logged a failure:
the server offers no watch there, so a reconnecting tab attaches again at once and a tab out of use
keeps its last screen until you are back.
(#2512 by @lifeofpi-ux)
Over the relay in Firefox, a request made before the connection dropped (such as a prompt answer)
now fails as not sent instead of going out on the reconnected link, and an upload over the PC's
limit is refused before Firefox reads it into memory.
(#2516)
A relay terminal socket that is sent more than 4 MiB faster than it can hand it on now fails like
a browser socket with a full send buffer, instead of queueing it all in memory.
(#2516)
An answer to a Claude Code tool approval, plan or folder-trust check comes back once Claude has
closed the dialog. The dialog just answered no longer comes back as a new card for two seconds,
and Claude's own input box no longer shows as a "Waiting for input" card with Enter and Esc.
(#2521 by @jpcarranza94)
A first message typed in the New tab or New workspace dialog goes to Claude Code once it is ready.
It was often held as "the pane's terminal or agent session changed" or "the agent started for this
message has ended", because it was bound to a program Claude Code runs as it starts (git, gh), not
to Claude Code itself.
(#2526 by @jpcarranza94)
A Claude Code pane whose session has kept thousands of subagent transcripts no longer has the
server check every one of them on each status poll: files last written over a day ago are
checked again once a minute, so the server's event loop stays free for terminals and requests.
(#2527 reported by @duytbp)
The first message sent from an empty chat no longer brings up "No conversation yet — say something
below" for a moment, beside the message itself, before the agent starts working.
(#2531 by @jpcarranza94)
An API key or token typed or pasted into the terminal input line is no longer saved in the
browser's storage while it waits to be sent: such a line stays in the open page only, a reload
or a replaced herdr does not keep it, and a key an earlier version saved there is removed.
(#2532)
Panes show again on iOS 16.4 and later and on Safari 16.4 to 17.3, where every pane said
"This pane can't be shown.": the app now brings its own Promise.withResolvers and AbortSignal.any, and its own crypto.randomUUID for a plain-http address.
(#2535 reported by @devtm1123)
In a chat long enough to scroll, a message sent from Chat shows its faded bubble at the end,
wholly above the message box, instead of partly under it, and the chat no longer jumps up by
that gap when the agent writes the turn. A long message's bubble shows its words as its turn
does, up to the same 12 lines, instead of its first 160 characters.
(#2538 by @jpcarranza94)
Claude Code's plan shows as its "Ready to code?" card in a narrow pane too, as on a phone or in
two panes side by side. It used to show as a "Waiting for input" card with only Enter and Esc,
because the plan file's path in the dialog's last line wrapped onto a line of its own.
(#2541 by @jpcarranza94)
An open question or approval card stays in Chat when you come back from the Terminal view and
across a reconnect. It no longer goes for a moment and comes back with the next read.
(#2543 by @jpcarranza94)
Chat reads the agent's question or approval as soon as the pane turns blocked, so the card shows
with the turn's "Needs you" instead of up to two seconds after it. A question answered in the
terminal leaves Chat as soon as the agent works again.
(#2543 by @jpcarranza94)
A notice or a subagent's result that Claude Code writes while it works no longer draws the turn at
work again: the tool rows and the work block you opened in it stay open.
(#2545 by @jpcarranza94)
A long chat opened again (back from the Terminal lens, or a tab no longer kept) shows its latest
turns at once, not an older page that then jumps to them.
(#2545 by @jpcarranza94)
/clear in a long chat goes from the old turns straight to the new conversation, without an empty
chat and "Loading conversation…" in between.
(#2545 by @jpcarranza94)
A queued follow-up stays in Chat as a sent message from the moment it leaves its row until its
turn shows: at the end of a turn, after Send now, and when the turn ended before it arrived.
(#2547 by @jpcarranza94)
After Stop, a message sent in place of the stopped one no longer brings the stopped message back
into Chat for a moment.
(#2547 by @jpcarranza94)
Stop with a follow-up queued no longer erases the stopped message from Claude Code's input box:
the stopped message comes back to the composer, and the follow-up waits for Send now.
(#2547 by @jpcarranza94)
Clicking Stop keeps the keyboard focus in the message box, as Send does.
(#2547 by @jpcarranza94)
A Claude Code /compact sent from Chat says "Done" once the conversation is compacted, not as
soon as the command starts. After /clear, a command sent to the conversation left behind (such
as that /compact) no longer shows in the new, empty chat.
(#2549 by @jpcarranza94)
A finished turn no longer opens again as "Working…" for a moment when Claude starts a new turn by
itself, as when a background task ends, or when a message comes from the terminal.
(#2551 by @jpcarranza94)
Switching to a working agent's chat no longer shows a "Working…" head above "Loading
conversation…" before the turn's own rows are drawn.
(#2551 by @jpcarranza94)
A long chat opened for the first time now lands at its newest message. Before, the view could
stop several hundred pixels short of it when a long answer or table near the end grew while the
chat went down to it, and it stayed there.
(#2564 by @jpcarranza94)
A chat opened again after a minute or more draws its skill chips and "Ran in terminal" rows at
once, not as plain text that changes when the pane's command list arrives.
(#2560 by @jpcarranza94)
Opening a chat asks the server for the pane's command list once, not four times at the same
moment.
(#2560 by @jpcarranza94)
A hidden page (a phone put away, or a desktop window minimized or behind a full-screen app) no
longer watches its pane read-only, including one that opens or reconnects while hidden: a frozen
page could not parse those frames, so the whole burst was drawn on return and a weak link's
unacknowledged queue could close the connection (4008). The pane still reads as view only;
returning attaches afresh and the pane's replay draws the current screen, and a window shown
again without the focus starts watching its pane then.
(#2554 by @iwangjie)
A triple-clicked paragraph in a Chat reply, or a selection dragged past its last word, offers Quote
and Comment again, and quotes the reply's words without its copy row or time.
(#2577)
A chat opened right after its agent moved to another session shows the new session, not the old
one from the tab press or from a page an earlier chat was still loading.
(#2576)
On the herdr-core runtime, a pane running Claude Code shows its conversation again, along with
everything else Ovis does for Claude panes: herdr-core names Claude Code claude-code, and Ovis
now reads that as Claude.
(#2572 reported by @rkqksk)
A browser connecting to a large herdr session (a snapshot over 1 MiB) gets its terminals again
instead of closing at once with "Terminal output stopped because this device could not keep
up": only output still queued for the browser counts as a stall, not the size of one message.
(#2570 reported by @nathanvale)
The browser tab's title shows an Oh My Pi pane's π glyph and working spinner again; the sidebar
row and the header still leave them out, as the row's mark and badge say the same.
(#2571 reported by @altgans)
Copying a wrapped reply from an agent's pane in the Terminal lens gives one line again, as herdr's
own copy does: the line breaks and two-space indent the agent drew at the pane's edge are left out,
so a long command it wrapped pastes whole.
(#2575 reported by @matiemer)
Cloudflare relay connections now close both ends after a frame send fails, so clients can
reconnect without waiting for a later transport close event or timeout.
(#2580)
A folder opened in New workspace's Browse no longer loses to a Show hidden toggle pressed while
the folder loads; the toggle waits for the listing. The path bar wraps at very narrow widths so
New folder is not clipped.
(#2582 by @iwangjie)
Maintenance
The installer test for a PC without its own Node no longer finds the host's /usr/bin/node, so
it passes on a Linux PC that has a recent Node installed.
(#2448 by @briantcl1992)