New features
- Ovis now comes as a desktop app for macOS, Windows and Linux.
- Sign in with GitHub or Google to see your PCs; new devices ask first.
- Pair a phone through the relay by comparing six digits, no code.
- Ovis also runs on herdr-core, the terminals of the Herdr app.
- Add another PC through the relay, with no SSH or open port.
Improvements
- Phones nearby connect through a regional relay, with far less wait.
- A phone reconnects within about a second after its PC restarts.
- Chat shows a reply at once after a silent network drop.
- On a phone, Return adds a new line and the Send button sends.
Bug fixes
- Typing sent just before a connection drops is kept, not lost.
- A long Antigravity chat no longer stalls other requests.
- Pictures in a long Claude conversation load quickly.
- The app loads again on Safari and iOS 16.0 to 16.3.
Full changelog
Added
- Add a PC to your account once: sign in on the new PC and choose Add this PC to my account, then
tap the card that appears on your phone or another PC, type the number the new PC shows, and
approve it there. The account's other devices can then use that PC without pairing again.
(#3088) - A browser on a PC's own https address can sign in to your Ovis account in Settings → Phone &
devices: it shows a code to enter at github.com/login/device, with no redirect back to the PC.
(#2995) - A PC linked to the account for the first time keeps out the devices this device removed from
the account.
(#2947) - The PC side of linking devices through an account: a relay device can link its pairing to an
account, account members add and remove devices on every PC with signed records, and a PC that
was off collects the records left for it. A device removed through the account stays out until it
is paired on the PC itself.
(#2867) - A PC linked to the account for the first time also keeps out a device another member removed,
when this device has seen that removal on another PC: it passes the signed removal on as it is.
Devices of the account still join such a PC by approval.
(#3007) - Settings > Agents: Claude Code's and Codex's rows set the model and effort a new agent starts
on. New workspace and New tab fill their fields with them, still changeable there, and New
worktree starts the agent on them. Empty keeps the agent's own model and effort.
(#3116) - The Agents list shows panes tagged
role=background(herdr pane report-metadata --token),
such as an orchestrator's workers and subagents, after the others under a folded
Background agents heading with their count. One that asks a question stays with the others.
(#2906) - Settings → Appearance → Group agents by state lists the agents above the workspaces on this
device, in Needs you, Working, Done and Idle groups, each ordered by Longest wait, Recent or
Name. Pinned agents stay on top.
(#2869) - Lock pinned agents (experimental, off by default, in Settings > Appearance): a pinned agent can
be locked from its row's menu in the Agents list, and the app then offers no Close for its pane,
its tab or its workspace, and it keeps its pin until unlocked. The lock is shared with every
browser and phone; closing from herdr itself or a script is unaffected. A locked pane's own menu
offers Unlock agent too, so a pane whose agent exited is never stuck locked, and a new pin always
starts unlocked.
(#2971) - Named agent groups (off by default, in Settings > Appearance): split the Agents list into groups
you name, such as Agents, Replies or Tasks. New workspace and New tab offer the groups, starting
on the one last picked for that folder, and an agent's menu moves it between them. Each group
folds and shows its count and whether an agent in it needs you or is working; every browser and
phone shares the groups.
(#3005) - An alert for an approval or question with two short options (Allow / Deny, Yes / No) carries
them as buttons, under the question and the command or file it is about, on desktop browsers
and Android: a tap answers it without opening Ovis. When the question changed or was answered on
another device meanwhile, nothing is sent and a new alert says so. Devices paired to watch only,
and iOS, keep the alert that opens the pane.
(#2939) - Settings → Alerts has finer choices for each device: Needs permission apart from Needs input
(for agents that say they wait for a permission), Stopped on an error (OmO and GJC turns that end
on an error, off by default), and, with two PCs or more, which PCs alert this device. Each push
now says what kind of alert it is. Every device keeps today's alerts until its choices change.
(#2870) - Settings → Alerts → Also send to posts the same alerts to an ntfy topic, a Slack or Discord
webhook, a Telegram bot or plain JSON at any URL, with its own choice of alerts, a test button
and the last error. The URL or token stays on the PC and is shown masked; a message names the PC,
the pane and what happened, with a link to the pane.
(#2940) - The Android app opens a relay pairing link (
https://app.ovis.sh/s/...) tapped in a message or
read from the PC's QR code by the camera, instead of the browser, once a build with it is
installed and the hosted app serves its link files.
(#3130) - An opt-in beta update channel: with
betain the state dir'supdate-channelfile (or
OVIS_UPDATE_CHANNEL=beta), a PC also updates to thebeta/vX.Y.Z-beta.Nbuilds made from each
commit on main whose checks pass, and the desktop app to its beta builds. Off by default.
(#2805) - Settings > Chat > Compaction and failed requests (off by default): for OmO, omp and pi, a
compaction names the token counts the agent recorded with it, and each run of back-to-back
failed requests shows as one row that says whether another request followed and opens to their
errors. A conversation search's pick of words in one of those errors opens its row.
(#3080) - Search conversation, in the pane's menu and the command palette, finds a word in your
messages and the agent's answers, earlier pages included, and lists the matches newest first;
picking one opens the chat at that message. Tool output and thinking are not searched, and
nothing is added to the chat's screen. A remote PC offers it once its bridge is updated.
(#2891) - The header says how long the selected chat's agent has worked (the sum of its turns' durations,
"at least" until earlier messages are loaded), how large its transcript file is, and its omo
goal's status. The More menu repeats them, with the goal's objective, at every width.
(#2909) - The card for a Claude Code question whose options carry a preview (AskUserQuestion's mockups)
shows the preview the terminal draws for the option under its cursor, under that option, and
follows the cursor when it moves in the terminal.
(#3060) - Settings > Terminal > Experimental > Codex panes: let Codex select and scroll (off by default,
per device): a drag in a Codex pane goes to Codex, which selects through its whole history and
scrolls it while the drag is held past the top or bottom edge, where Ovis's own selection stops at
the screen's edge. Codex copies it on Ctrl+C or Enter. On herdr that copy does not reach the
browser's clipboard, so a note after such a drag says Shift+drag (Option+drag on a Mac) still
selects, copies and quotes in Ovis.
(#3126) - Ctrl+Enter in the Chat message box sends the message now while the agent works, as the queued
row's Send now does, without the extra click. Enter still queues it for the next turn.
(#2881) - A gjc, omp, omo or pi pane's composer shows the plan limit of the subscription its current model
runs on, when the agent records a provider only a subscription signs in to:openai-codexthe
Codex plan, OmO'santhropic-subscriptionthe Claude plan. A plainanthropic(a Claude sign-in
and an API key are recorded the same) or any other provider shows no meter, as before.
(#3098) - The chat's message box can show a Paste and send button that sends the text copied on this
device as a message, as Send would. It is off until turned on in Settings → Chat → Composer.
(#2907) - On Linux, when Chat shows terminal output for a single Copilot process started without
--ui-server, a notice says starting it withcopilot --ui-server --port=0may help, and that its local
API has no authentication.
(#3076 by @YuuuXie) - Typing
/in a GitHub Copilot CLI chat lists Copilot's own commands and the skills it would
load from the project, your personal folders and folders added withcopilot skill add. Picking
one only fills the composer; commands that open a Copilot picker or panel are listed under
Terminal commands.
(#3049) POST /api/workspace/createandPOST /api/tab/createtake an optionalenvobject, set in the new
pane's shell and any agent started there, so an API client no longer has to type variables as a
command prefix. Names must be shell identifiers and values text without control characters (at
most 64 names, 32 KiB in all); anything else is refused with 400invalid_env.
(#2776)- The desktop app builds for Windows x64 as a per-user installer, carrying herdr-core (with its
ConPTY) and Bun like the Linux and macOS builds; on Windows the server reaches herdr-core through
a named pipe. If Windows shows 'Windows protected your PC', choose More info → Run anyway.
(#2814) - Desktop app: Keep Computer Awake in the tray holds off system sleep while an agent works on
this PC, so phones and browsers keep reaching it. Off by default; on battery only when also
allowed; the tray says while it holds the computer awake.
(#2938) - The desktop app for macOS can be built signed with a Developer ID and notarized, dmg included,
so it opens without a Gatekeeper block and updates itself.
(#2820) - Settings → Devices and PCs says how each paired device reaches this PC right now: connected on the
same Wi-Fi, over Tailscale or through the (Seoul) relay, with its round trip in ms, or offline with
when it was last seen and a short reason. Check now measures every connection again.
(#3206) - The phone's list of PCs checks each saved PC without signing in and says whether it answers, the
way it answers on and how fast, or whether the PC is off or the relay did not answer, with Check
now above the list. Only a device signed in to the PC is called connected.
(#3206) - A script or CLI can pair as a device of its own:
POST /api/devices/pairwith
Accept: application/jsonreturns the device's token, which then works as
Authorization: Device <token>with the same role, last-seen time and Revoke as a paired
browser's cookie.
(#2777) - The file viewer can edit a text file in the pane's folder: turn on Settings → File viewer → Edit
text files (off by default). Save asks once more, and a file that changed on the PC since you
opened it is not overwritten. Only a device that drives the PC can edit, on Linux and macOS PCs.
(#3064) - Settings → Appearance → File text size gives an open file's text a size of its own on this
device, in its Markdown preview and its source, without changing the chat or the interface.
Until one is chosen the preview follows the chat's size as before; Reset goes back to it. A
chosen size stays when the chat or interface font size changes later.
(#2968) - Settings > Chat > Reopen files on return (off by default): a file left open
when you switch to another tab shows again when you come back to that tab, from the tab strip,
the sidebar, a shortcut or Back (#3179).
(#3185 by @jakublech) - Settings → Chat → Files beside the pane (off by default) opens Browse files as a panel on the
right of the pane on a wide window, instead of a dialog over it. A file opened from it shows in
its place, and closing the file brings the list back.
(#3002) - Files can show a Documents tab (Settings > Chat > Documents in Files, off by default): the
Markdown files under the pane's folder, newest first, with a filter and a Refresh button. A row
opens the file in the viewer, which renders it (and edits it with Edit text files on). It lists
git's files that are not ignored, or outside a repository a bounded walk of Markdown files, on
another PC too, and a watching device cannot list them.
(#3073) - Settings > Appearance > Fold helpers under their agent (off by default) folds the helpers an
agent started under one line below its row in the Agents list, with how many there are and a dot
when one needs you or is working. A helper that needs you and the selected one stay in sight, the
line opens and folds them, each agent's choice is kept on this device, and the sidebar filter
still shows every row it keeps.
(#3071) - Continue with Google signs in to your Ovis account next to GitHub, in the desktop app, on a
PC's own page (with a code at google.com/device) and on app.ovis.sh, once the account service is
set up for Google. Google is its own way in: an account is never joined to another because their
email addresses match.
(#3151) - Settings → Devices and PCs → Account lists the ways your account signs in, with Remove for
any but the one this device signed in with, and in the desktop app Add Google (or GitHub) to
add one on purpose.
(#3151) - On a herdr-core whose layout no Herdr app keeps (the desktop app's own core), panes can be split,
resized, swapped, zoomed and named, and workspaces and tabs reordered. Ovis keeps the order and
splits in its ownovis-layoutdocument on the core (docs/herdr-core-layout.md).
(#2830) - On herdr-core, every other machine the core reaches (
hc machine add, or added in the Herdr
app) shows as a PC of its own, through this PC's core, with nothing installed there: its
workspaces as the Herdr app lays them out, its live terminals, status and alerts, and new
workspaces and tabs started there.
(#2955) - On a herdr-core whose layout no Herdr app keeps (the desktop app's own core), workspaces and tabs
can be renamed and a one-pane tab moved to another workspace. Ovis keeps these in terminal labels.
Worktrees stay hidden there, and where the Herdr app lays the core out, its workspaces, tabs and
splits remain the app's.
(#2799) - The header now always says how this device reaches Ovis: through the Ovis relay, over Tailscale,
on the local network, straight to its address, or at a loopback address.
(#2819) - The header now shows how many sessions on the PC are working, waiting for you and done, and the
selected tab's place in its workspace (1/2). A tap on the waiting count opens the next session
waiting for you.
(#2872) - A PC with no screen links itself from its terminal:
bun scripts/plugin.ts linksigns in to your
account with a device code and approves the device that adds the PC after comparing six digits,
andlink --codeprints a code to type and the relay QR code (the QR code alone when the relay
mints no code), renewed until Ctrl+C, which takes both back. A plugin checkout from before
linkneeds a plugin reinstall first.
(#3187) - Settings → About → Terminals says which runtime this PC serves, herdr's TUI or the Herdr app
(herdr-core). On herdr's TUI, when the Herdr app's core is on the same PC too, it says how to
show the app's terminals instead.
(#2626) - Herdr app terminals (
OVIS_RUNTIME=herdr-core): a helper an agent started withhc runnow has
its tab right after that agent's tab, instead of under Other terminals, and its Agents row is one
line indented under the agent's. A blocked agent's row says why after its name ("Needs
permission", with its message in the tooltip), and a progress the agent reports shows as a
percent after its name.
(#2669) - On herdr-core, an agent pinned in Ovis is pinned in the Herdr app, and one pinned or unpinned
in the app is pinned or unpinned in Ovis (while Ovis's list has room for it).
(#2694) - On herdr-core, Ovis and the Herdr app agree on which finishes someone has read: one read in
Ovis is no longer done in the Herdr app, and one looked at in the app is no longer done in Ovis.
(#2687) - With
OVIS_RUNTIME=herdr-coreon Windows, New workspace and New tab with agent start the
agent in the pane's PowerShell or cmd, typing the line that shell reads and telling a busy shell
and a started agent from this PC's process table. An argument the shell would change is refused
before anything is typed, and in PowerShell so is one holding%or^, or&,|,<or>
outside the quotes PowerShell gives an argument with a space (any"in the line counts), which
cmd would read again if the agent starts through a.cmdfile. Claude Code's Ultracode settings file sits in a folder named
with a space, so a profile folder likeR&Dstill starts it. A POSIX shell (Git Bash, WSL)
takes no start there, and a Windows PC offers no agent on another machine of its core.
(#3044 by @photojupi) - On the desktop app's runtime (herdr-core), a workspace on a git repository offers New worktree,
Open worktree… and Delete worktree checkout… as it does on herdr, shows its branch under its
name, and draws its worktree workspaces under it. Ovis runs git's worktree commands itself there.
(#2899) - Settings → Shortcuts → Use herdr's prefix keys (off by default): herdr's prefix, then a key that
herdr's config.toml binds, runs that action in the app (new terminal tab, splits, zoom, tab and
workspace steps, tabs 1-9, sidebar, Settings, the palette). The config is only read; fields,
dialogs and IME input keep their keys, and the prefix pressed twice reaches the pane.
(#3081) - Settings → About → Terminals can switch this PC between herdr's TUI and the Herdr app
(herdr-core) when it has both: Ovis asks first, restarts on the chosen runtime and shows it in
place; a start that fails goes back to the previous runtime. WithoutOVIS_RUNTIMEand a choice
made there, a PC with no trace of herdr's TUI but the Herdr app's core serves the Herdr app.
(#2667) - A phone's browser tab shows one dismissible line on adding Ovis to the home screen for alerts:
iPhone names Share → Add to Home Screen, Android installs in one tap when Chrome offers it.
It stays away once dismissed or installed, and never shows on desktop or in the phone apps.
(#2885) - The one-line installer (
install.sh) sets Ovis up on a Linux or macOS PC that has herdr-core (hc)
and no herdr: it installs neither herdr nor the plugin, builds Ovis in~/.local/share/ovis/app,
runs it on herdr-core, and starts it at login from a user service (systemd on Linux, launchd on
macOS).OVIS_RUNTIME=herdrorherdr-corepicks the runtime by hand. On Windows,
install.ps1keeps herdr and says why.
(#2688) OVIS_IPV6_LOOPBACK=1adds an IPv6 loopback listener on::1besideHOST=127.0.0.1, so
localhost can reach the same HTTP and WebSocket services over either address without redirecting
origins. Other binds ignore it.
(#2644 by @cheol-95)- Kimi Code panes get a chat: the conversation is read from the CLI's own wire log
(~/.kimi-code/sessions/wd_<dir>_<hash>/session_<id>/agents/main/wire.jsonl), with user prompts,
answers, thinking and tool calls as turns, instead of falling back to the terminal scrollback.
Injections, task notifications and cron firings the CLI stores as messages are not shown as
prompts. The pane's session is proven by the session lock the CLI writes for the pane's own
process (~/.kimi-code/locks/sessions/), or on Linux by the main log that process holds open,
and an idle Kimi keeps its last session while the same process runs, until/sessionsor
/resumeis typed there; without that proof the pane keeps its terminal, never another session
of the folder. Prompts/undotook back are left out of every page.
herdr-core'skimi-codelabel maps tokimi.
(#2615 by @daniel-marthaler) - Read Kiro CLI chat on Linux: prompts, answers, tool calls and their results,
/clearand/compact, from
the session the pane's own Kiro process has open.
(#3063) - An opt-in HTTPS listener for devices on the same network:
OVIS_LAN_HTTPS_PORTopens one on the
PC's private addresses with a self-signed certificate (or your own viaOVIS_LAN_HTTPS_CERTand
OVIS_LAN_HTTPS_KEY), which lets in only the token or a paired device. Off unless set.
(#3048) - With Settings → Web links set to In the app, the command palette opens a page this PC serves by
its address: typelocalhost:8448(or pick Open a page on this PC…) to show a local tool's web
UI, such as a Git client, beside the pane.
(#3050) - Settings > File viewer > Markdown outline (off by default): a Markdown preview lists its headings
beside the text and marks the one being read, kept in the middle of the list. On a narrow screen
or the docked panel, an Outline button opens the list as a drawer over the text.
(#3065) - With Settings → Chat → Composer buttons → Suggestion on, tapping the grey suggested reply on a
touch screen fills the chat input without sending it. Desktop Tab acceptance stays available.
(#3181 by @jokkopucko) - Settings > About offers the move to herdr-core on a herdr PC without herdr-core too: "Install
herdr-core and move everything" installs herdr-core 0.1.17 into ~/.local/bin (checksum-pinned, no
sudo, herdr itself untouched), then shows the move's plan before anything moves.
(#3205) - OmO's chat shows when OmO goes on with its goal by itself: a quiet "Goal continues" divider
before that turn, with the goal's objective on request, and, while the goal waits on background
work, a line saying what it waits on (tasks, monitors, background terminals, DAG runs, code
cells) and around when it continues.
(#3077) - An OMP pane's chat can list the side conversations its session saved with
/btw: a Side
conversations chip in the message box opens each topic's questions, answers and follow-ups,
read-only. It is off until turned on in Settings → Chat → Composer → Side conversations chip (experimental).
(#3019) - A headless PC can approve a phone waiting to pair by comparing digits from its terminal:
bun scripts/plugin.ts pair --approveshows the digits and asks y/n.
(#2867) - A running OpenCode subagent in the background tasks list opens its details, as a Claude Code
subagent's do: the prompt it was given, then its words and the tools it called, read from
OpenCode's own store.
(#2990) - Settings → Appearance → Read OpenCode subagent ends from their session (experimental, off by
default): an OpenCode subagent counts as running, and keeps its turn's BG wait, until the session
that started it is told it ended, not as soon as the subagent goes idle while its own background
work still runs.
(#3167) - Drop a pane's title on another pane's body in the same tab to move it beside that pane, on the
side nearest the pointer: left, right, above or below. The half it will take is highlighted while
you drag. Works on herdr and herdr-core.
(#2915) - A client that shows a pane's chat but not its terminal can follow the pane's conversation and its
prompts without attaching it:conversation-watchwithdetached: true, and a newprompt-watch
frame that says when a prompt opens, closes or changes, also one an idle agent opens.
(#3018) - A split pane's title shows a Zoom pane button, and the zoomed pane keeps its title with an
Unzoom pane button, so the hidden panes are one click away. Settings > Shortcuts has a Zoom or
unzoom pane binding (no key by default).
(#2911) - Each PC in the sidebar shows its CPU, memory and fullest disk as three small meters under its
name. Tap them for memory used, load average, uptime and every disk. A figure at 85% or more
turns red. Nothing is read for a PC that is folded, offline or in a background tab, or while the
sidebar is closed, and a PC whose bridge is from before this release shows nothing until its
bridge is updated. A herdr-core machine shows none. It is on by
default once two or more PCs are connected; Settings → Remote PCs → PC load in the sidebar turns
it on or off on this device.
(#3038 by @thefahien) - The phone key bar has a More keys button at its end that opens a second row (Esc, Tab, |, ~, /, -)
and an arrow pad shaped like a keyboard's, so the arrows no longer scroll out of reach. Held, the
pad's arrows repeat. The choice is kept on each device.
(#2875) - Chat suggests the slash commands that pi's extensions and packages register (such as
/team),
read from the running pi through the web UI's pi extension. To get them, run
bun scripts/install-pi-integration.tsagain and restart pi.
(#3017) - Regional relay endpoints: a PC that uses the Ovis relay measures a regional relay (first
relay-ap.ovis.sh, in Seoul) againstrelay.ovis.shand, when it answers in at most half the
time, also connects to it and puts it in new pairing QR codes, so phones nearby connect with far
fewer slow round trips. The PC stays onrelay.ovis.shtoo, so phones paired before keep working,
and a phone that cannot get through a regional relay triesrelay.ovis.shat once.
(#2832) - The phone apps connect straight to a PC on its Tailscale address when the phone has Tailscale on,
the same way they do on the same Wi-Fi: same encryption and pinned PC key, paired devices only,
and the same "Same Wi-Fi direct connection" switch turns it off.
(#3202) - The iOS and Android apps connect straight to a PC on the same network once they are paired through
the relay, and go back through the relay away from it. It is on whenever the relay is on: Settings >
Devices and PCs > My devices says "Same Wi-Fi direct connection on", who can sign in there (only
devices paired through the relay; nothing pairs on it), and has a switch to turn it off. The
connection mark says "direct" while it is used.
(#3180) - When a pairing link or a saved pairing carries a relay key that is not the one its PC id names,
the phone shows that id and the id of the other key in groups of four, the groups that differ
marked, each labelled by where it came from (the link, or this phone's saved pairing). The PC
shows its own id under its pairing QR code in Settings → Phone & devices to compare with. Both
are worked out on the device, so nothing new reaches the relay.
(#2703) - A phone can pair through the Ovis relay without a code: Copy a link without a code under the
QR code gives a link to send any way you like, good for 10 minutes. The phone and the PC then
show the same six digits, and the pairing finishes only when the phone says they match and you
approve it on the PC. A relay in the middle gets matching numbers only by chance, about once in
a million tries. The phone lists the PC under its name, as after a QR pairing. QR pairing works
as before.
(#2696) - Pair a device through the Ovis relay by typing a short code, for a desktop or laptop with no
camera pointed at the PC: Show a code to type under the QR code in Settings → Phone & devices
shows ten characters, and Pair with a code at app.ovis.sh takes them. The device then shows
the PC's ID to compare with the PC's screen before it pairs. The code works once, for 10 minutes,
and three wrong tries end it; neither the relay nor anyone reading the traffic can test guesses
offline. The QR code and links work as before.
(#2883) - A PC added through the relay is reached straight on its own network (or its Tailscale address)
when this PC can reach it there, as the phone apps already do, and through the relay otherwise.
Its saved addresses follow it, and when this PC changes networks or wakes from sleep it checks the
direct route again and moves back to it without the PC showing as disconnected; terminals open on
that PC reconnect when it moves.
(#3200) - Settings > Remote PCs > Add a PC through the relay adds another PC with no SSH or open port: paste
the pairing link from that PC's Settings > Phone & devices, or type the code it shows there and
match its ID, and its workspaces join the sidebar. It pairs as a phone does, end-to-end
encrypted, and revoking it on that PC ends its access.
(#2829) - The server reads a pane's repository history: a page of commits with the branches and tags on
them (/api/workspace/git/log), the local branches with their upstreams and how far ahead or
behind they are (/api/workspace/git/branches), and one commit's whole message with the base
its changes are read against (/api/workspace/git/show), on this PC or another one. The diff
routes now read a root commit's changes against the empty tree.
(#3079) - Settings can reuse one browser tab for external links from any coding agent, while new tabs remain the default.
(#2731 by @jokkopucko) - While a move to herdr-core waits for busy panes, each shell running a command has an End button
(Ctrl+C to that pane only), with Force end offered only if the command is still running a few
seconds later, and End all and move now ends them all after one confirm. An agent's row opens its
pane instead: agents are still ended by you.
(#3229) - Move everything to herdr-core in one click (Settings > About, on a PC running herdr): every
workspace, tab, split and pane name comes along, agents reopen on their own conversation (or
start new in the same folder when it cannot be told), and shells start in the same folder. Ovis
ends an idle Claude Code itself; other agents wait for you to end them, so nothing typed in their
input is sent. Nothing moves while an agent works or a shell runs a command: the move waits for
them. If any step fails, Ovis puts back in herdr what it can and lists what it could not; herdr
itself is never closed.
(#3161) - A phone can draw the terminal, chat and interface in a font only your PC has: font files copied
intofonts/under the state folder (default~/.config/ovis/fonts/) are served to signed-in
devices, and a device downloads those its font settings name. Nothing changes until that folder
has fonts.
(#3068) - Settings has a search field over its pages: type a few words to see the matching settings of
every page together and change them right there.
(#3085) - Settings > Appearance > Agents under workspaces (off by default) lists each workspace's agents under
it in the PCs list, so the sidebar reads PC > workspace > agent. A row shows the agent, its tab
where the workspace has several, and its state, and opens its pane; the Agents list stays as it is.
(#3069) - Settings > Appearance > Background workspaces apart (off by default) lists the workspaces a tool
tagsrole=background(herdr workspace report-metadata --token) after the others, under a
folded Background workspaces heading with their count. The open one, and one whose agent asks a
question, stay in sight.
(#3078) - Settings > Appearance > Context left on agent rows (off by default) shows the chat's context ring
on each agent row in the sidebar, with the percentage left and the same tooltip ("Context 62%
left · 76k of 200k tokens"). It turns red at 20% left or less, as the composer's ring does, and
shows for Claude Code and Codex agents, whose context window is known.
(#3059) - Settings → Appearance → Show the sidebar on hover (off by default): on a desktop with the sidebar
hidden, resting the mouse on the sidebar button shows it over the pane until the mouse leaves, so
you can switch panes without the chat or terminal changing size. Escape hides it; a click on the
button keeps it open.
(#3067) - A line between the sidebar's PCs and Agents resizes them: drag it to give either list more height,
double-click it to reset, or use ↑/↓ while it is focused. The height is kept on this device.
Dragging a list down to its head folds it. With Group agents by state on, Agents is on top and the
line sizes it the same way, with a height kept for that order.
(#2944 by @duytbp) - Chat shows skill rows for Grok, Antigravity and Devin CLI: a skill the user invoked appears on
the prompt, and a skill the agent read or invoked appears in its answer, only where the agent's
own record shows it.
(#3034) - The split view holds up to four panes, side by side and stacked. Drop a pane on the edge of another
to open it beside, above or below that pane, or on its middle to open it in its place, and drag the
line between two panes, or focus it and use the arrow keys, to resize them. Two panes still open as
two halves. The beta's "Split into rows and columns" switch is gone: every device gets this.
(#3072) - Connect a device lists the other PCs on your Tailscale whose Ovis already lets this PC in as your
own login, and Add PC adds one through the relay in one tap: this PC asks that PC for its code over
Tailscale and checks that the relay found the same PC. PCs of another login, tagged nodes and phones
are never asked, and Tailscale alone never adds a PC to your account.
(#3194) - Settings > Terminal > Attach files button (off by default, touch screens): an Attach button in the
terminal's input line and an Attach files key in the key bar while typing straight into the
terminal open the phone's file picker; each file is saved beside the pane and its path goes into
the line or the terminal, without Enter.
(#2969) - Settings > Terminal > Fold the key bar (touch screens, off by default): in Input line mode the key
bar's row stays folded and the terminal gets it back. A Terminal keys button in the input line
opens and folds it.
(#3006) - Settings > Terminal > Pictures in the terminal (off by default) draws the sixel and iTerm2 inline
images a pane program prints (imgcat, img2sixel, chafa) on a PC that runs herdr-core, as the
desktop app does. herdr does not pass pictures on, and kitty's graphics protocol is not drawn.
(#2871) - Settings > Terminal > Keyboard only from the key bar (off by default): on a phone or tablet, a tap
on the terminal, the input line or a key no longer brings up the keyboard; the key bar's keyboard
key shows and hides it.
(#2966) - The subscription usage popover shows Claude's usage credits (spent against the monthly cap, in
its currency), Codex's credit balance, and the one-off limit resets Codex still offers with when
the soonest expires. Each row shows only when the provider reports it.
(#3075) - Settings > Voice input has a Speech recognition choice per device: Auto (the API key when one
is saved, else the browser), Browser (even with a key saved) or API key (never falls back to
the browser). The composer and terminal mic follow it.
(#2860) - Files has a Pull request tab for the pane's branch: its checks (failing first) and open review
threads, read through that PC's ownghsign-in. Send to agent puts a failing check's log tail,
or a review comment, into the pane's draft without sending it, and Merge asks first and merges
with the repository's default method only while GitHub would merge.
(#2941)
Changed
- The phone app puts signing in first; the QR code and pairing code move under Other ways.
(#3088) - A PC you bring into your account now gets the account's devices at once: the device that links it
first reads the account's other PCs for every device removed there, hands the new PC those
removals, then the devices still in the account, so they no longer ask the new PC again. A device
removed anywhere it could read stays out, and none of them is let in before that handover.
(#3087) - An agent without a logo of its own draws its initial in a color picked by its kind.
(#2869) - Following the latest output in the chat no longer glides; it keeps the end in view at once.
(#2655, re-landing #2624 by @odfalik) - While a command sent from Chat is waiting for its result, a poll asks herdr for the pane's processes
fewer times: once instead of twice on an omp or gjc pane, twice instead of four times on Codex.
(#2764) - On compact-height phones, including the iPhone Duo's outer display, a workspace's only tab no
longer takes a row above the pane, leaving more room for the chat or terminal. The header's ⋯
menu then also offers the pane's actions, New terminal, New tab with agent… and Rename tab, so
a new tab stays one tap away and no second ⋯ sits below the header.
(#2622 by @davidgamero) - When Copilot Chat cannot prove its conversation for a while, the messages already shown stay,
marked paused, and update again on the agent's next activity instead of switching to terminal
output.
(#2724 by @YuuuXie) - Settings → Devices and PCs is simpler: your account on top, then My devices, one list of this
PC (with its ID), the other PCs and the paired phones and browsers, each marked with what it is.
One Connect button opens every way in: the Ovis relay's QR code and a code to type side by
side with Refresh and Copy, and under Other ways to connect the same Wi-Fi's code, Tailscale,
Portal and adding a PC over SSH. Signed in to your Ovis account, a new device just signs in and
is approved once on a device already in the account. Keep screen on, the relay's switch and
identity reset, Show in sidebar and the access facts are under More settings.
(#3148) - A device that typed a PC's code compares that PC's ID with the one at the top of its
My devices, no longer in the connect dialog.
(#3148) - Settings → Devices and PCs holds two things: what is connected to this PC (its name atop one list
of the other PCs, phones and browsers, the device in use first and tagged "This device now"), and
one Add a connection button whose sheet picks the way (sign in and approve once, the QR code and
code, a PC on your tailnet, a PC with no screen). The account, the relay and same-Wi-Fi switches,
revoking every device, the relay identity reset and the rest are under More settings.
(#3225) - libghostty no longer has xterm.js redraw the rows it hides, so a pane printing fast costs about
what it costs with xterm.js alone, and screen readers read the rows
libghostty draws and hear the lines a program writes, as xterm's screen reader mode does.
(#2959) - The terminal now always draws with libghostty, the terminal engine of Ghostty, and falls back to the
classic xterm.js renderer by itself where libghostty cannot draw a pane. On a PC that runs herdr-core,
as the desktop app does, it also shows the pictures a program sends with the Kitty graphics protocol
(kitty icat, timg, chafa). Typing, selection, links and search still go through xterm.js underneath.
(#3035) - On herdr-core, the browser terminal's own answers to a program's queries (a cursor position, a
mode report) reach hc as automatic input once hc says it takes it, so they no longer count as
that viewer typing and taking the terminal's size. Until then, and on herdr's TUI, they are
typed as before: hc 0.1.14 to 0.1.17 do not name the feature, and drop the frame unasked.
(#2678) - On a desktop window the header is one row, laid out like a browser's tab bar: the workspace's
tabs with their agent's icon,+after the last tab, and Chat/Terminal, Files and More at the
far end. The open tab runs into the pane under it. The sidebar's top shows the Ovis logo.
(#3156) - Chat/Terminal is one segmented control that shows both, the open one highlighted; the terminal
is labelled in a monospace face. On a phone it shows the two icons in a bordered control.
(#3156) - A thin status bar under the pane on a desktop window shows the PC, workspace, branch,
connection and how many sessions wait for you. The header no longer shows session counts or
the Tailscale/LAN route; the More menu still names the route and the session's totals and goal.
(#3156) - On a desktop window the header's tab row no longer shrinks tabs until their close button takes
most of each tab. A tab stays at least 120 px wide; the tabs that do not fit are listed behind a
More button after+(its count shows how many), with their agent and state, and picking one
opens it in the row. The open tab is always in the row. A phone keeps its tab list.
(#3199) - With
OVIS_RUNTIME=herdr-core, Ovis findshcthe way the Herdr app does:OVIS_HC_BIN, the
PATH, the login shell'sPATH, then the usual install places such as~/.local/bin, taking
only one whose--versionsayshc, so an unrelatedhcfrom a window manager is passed over.
When none answers, Ovis does not start and says where it looked.
(#2626) - A new tab, workspace or worktree shows about half a second sooner. The pane list is read again
as soon as it is made, instead of after a 500 ms wait for herdr's event.
(#2529 by @jpcarranza94) - On a PC linked to an account, only a phone linked to that account with drive access may start a
pairing code through the relay or approve a waiting device, and it must pick the new device's
digits out of three. Every connected device is told who approved each new device.
(#2867) - Signing in from a PC's own page or from
linkon a PC with no screen now shows one Ovis sign-in
page (account.ovis.sh/link), a code and a QR code: open it on any device, choose GitHub or
Google there, sign in and confirm. An account service without that page, andlink --github/
link --google, keep the provider's own device page.
(#3197) - Connect a phone, opened on a phone, no longer leads with QR codes to scan with that same phone.
With the Ovis relay online, Use the relay on this phone pairs the phone through the relay in one
tap, and Connect another device sends a link (Share or Copy link). The Tailscale address has
Copy address, and a pairing code is shown large. Every QR code waits behind Show QR code. A phone
already on the relay is pointed to a pairing code. The desktop is unchanged.
(#2603) - On a phone the tab row under the header is gone: the pane's title opens a list of the
workspace's tabs, each with its state, its agent and a Close button, plus New terminal and New
tab with agent…. The header is one row (52px instead of 96px), so the pane gets the room.
(#3099) - Tabs show their agent's icon, and a working tab's dot turns.
(#3099) - A tap on the key bar's Ctrl, Alt or Shift now holds it for the next key only, as a phone
keyboard's Shift does. A second tap locks it (filled and underlined) for every key, and a third
lets it go.
(#2875) - On a phone or tablet, the keyboard's Return now inserts a new line in the chat's message box by
default and the Send button sends, as in the ChatGPT and Claude apps; a desktop's Enter still
sends. A choice made in Settings → Chat → Composer is kept, and Mod+Enter on a hardware keyboard
still sends.
(#2597) - A pane with no agent shows its terminal output as one preserved snapshot with one copy control,
instead of splitting it into guessed chat messages with their own copy buttons. A command sent
from there keeps its state, names the command when the snapshot does not show it, and repeats
a recorded result only when the snapshot lacks it. Long lines wrap on narrow screens.
(#2702) - A dropped connection is said plainly in the header: "Reconnecting…" in place of the pane's location
line (under the title on a phone), then "Connected" for a moment once it is back. Nothing typed is
sent by the return; a draft stays a draft.
(#2606) - A pairing link for a PC on a regional relay opens the app from a copy beside that relay, so the
first open no longer waits on a far-away host. PCs already saved, and the iOS and Android apps,
keep usingapp.ovis.sh.
(#2850) - Opening a PC through the Ovis relay waits for fewer round trips: the PC sends its greeting right
behind its side of the encrypted handshake instead of waiting for the phone's, and keeps one
relay connection ready in advance, so a phone no longer waits for the PC to open and prove a new
one. Older phones and PCs keep working as before.
(#2842) - A phone paired through the Ovis relay before its PC picked a regional relay now learns it on its
next connection and uses it from then on, without pairing again.
(#2847) - The phone app opens a PC away from home about 1.2 s faster: it tries the PC's same Wi-Fi and
Tailscale addresses at once, and when none answers within 300 ms it opens the relay too and uses
whichever connects first, instead of waiting 1.5 s for the direct addresses before the relay.
(#3201) - Reopening a PC paired through the Ovis relay starts its app from the copy the phone kept, without
waiting forapp.ovis.sh; the newer copy is fetched in the background for the next open.
(#2845) - The Ovis relay at
relay.ovis.shnow keeps usage counters for capacity planning: per PC, under
a hash of its relay ID, the bytes each way, time connected and sessions, for three months. It
still keeps no content, addresses or logs.
(#2821) - Reduce roster and health reads to a 30-second backstop while the event stream is open and its
latest roster shows this PC connected. A lost stream, this PC going away (pushed or read), a
failed health check, or a locked tab restores five-second checks; background tabs still poll
nothing.
(#2722 by @kilhyeonjun) - Settings > Alerts reads as a name and a control per row: which alerts come is one line of chips
(Needs input, Needs permission, Long turn finished, Any turn finished, Stopped on an error), and
rows carry an icon and a ↺ that restores a changed value.
(#3158) - Settings > About starts with the runtime in use (herdr or herdr-core) and its version; with both
installed, that line is the switch between them. Ovis, herdr and the plugins follow as one list.
(#3158) - A new Settings > Experimental page holds Named agent groups, Lock pinned agents, Codex panes'
drag, and OMP's Side conversations chip, moved from Appearance, Terminal and Agents.
(#3158) - Settings → Appearance is shorter: each row is a name and its control, without sentences or group
captions, and a ↺ beside a changed row puts it back. Themes are picture cards in one row that
scrolls sideways, and the terminal and chat fonts and sizes moved here from their pages.
(#3162) - Settings → Chat and Settings → Agents are shorter: each row is an icon, a name and its control,
without sentences, and a ↺ beside a changed row puts it back. Chat keeps short group headings; its
message box buttons (Paste and send, and Claude Code's Artifacts and Suggestion chips) are one row of
chips. Each agent's row on Agents shows the model and effort New tab starts it with, and Plan limits
is one row: Off, Used or Remaining.
(#3157) - The compaction and failed-request details in the chat, the Markdown outline in the file viewer and
the Documents tab in Files are always shown; their switches are gone.
(#3157) - Settings has eight pages: Voice input is now a group of Chat, and Remote PCs a group of the page
renamed Devices and PCs. Links to the old pages still open where they went.
(#3108) - Settings → Agents keeps each installed agent's own settings in its row: Claude Code's permission
mode and its Artifacts and suggestion chips, Codex's sandbox and approvals, and OMP's side
conversations chip. They left the New agents group and the Chat page.
(#3108) - Settings keeps more rarely changed rows under More settings: which alerts come (Needs input,
Needs permission, Finished) under a new Alert me when group, Dictation language, Wrap long lines,
Keep screen on and Name tabs from the first message. The quick replies list shows only while
Show above the message box is on. Nothing is removed: saved values stay, and search and links
still find every row.
(#3132) - Each Settings page shows the settings most people change first and folds the rest under More
settings and Experimental at its end; the folded line says how many of them you changed,
and Settings' search and links still reach every row.
(#3096) - Three pairs of Settings rows are one row each: Agents order offers By state beside Workspaces and
Activity, Show thinking is Hidden, Folded or Expanded, and Tidy dictated text is Off, Chat,
Terminal or Both. Every earlier choice is kept.
(#3117) - Settings pages line up on one grid: every row is one height, switches end on the same edge as the
other controls, captions and the More settings line start where the rows do, and a sentence under
a row with an icon starts under its name.
(#3196) - Settings > Shortcuts and Settings > Terminal show each setting as its name and control, with an icon
where the name alone is not enough, and a reset button beside a changed row. herdr's prefix keys move
under More settings; the key bar's own rows move into its editor and show on touch screens only.
(#3160) - Terminal: "herdr window" is one choice (Separate, Use alongside, Follow its focus) instead of two
switches.
(#3160) - Pictures in the terminal are on by default on a PC running herdr-core. A device that turned them on or
off keeps its choice.
(#3160) - On a first run on the PC itself (the desktop app, or a browser on localhost), the setup guide shows
Connect your phone open from the start, with the Ovis relay to turn on for the phone's QR code.
(#2801) - The setup guide's Connect your phone now leads with the Ovis relay: one tap turns it on and its
pairing QR code shows right there. Use Tailscale or Wi-Fi instead keeps the page's own address and
pairing QR code, or Settings, as before.
(#2692) - On a PC's page in app.ovis.sh and in the phone app, the bottom of the workspace list now names
the PC you are on and goes back to your list of PCs in one tap.
(#2808) - The sidebar filter shows a magnifying glass, and its placeholder says what it filters, instead of
a "Filter" label beside it.
(#2999 by @duytbp) - The sidebar's PCs and Agents heads both count what they hold, open or folded, and always show
their fold chevron.
(#2999 by @duytbp) - Folded PCs take one row each. At rest a PC's header says how many agents run on it; its fold and
- Both sidebar lists fade only at an edge that has more rows past it, top or bottom.
(#2999 by @duytbp) - The PCs hidden on this device are counted in the sidebar's PCs head, by a crossed-out eye that
opens a menu to show each one again or choose PCs in Settings, instead of a line under the PCs.
(#2998 by @duytbp) - Manage PC in the sidebar opens a menu (a sheet on phones) instead of a panel that pushed the workspaces
down: Rename… edits the name in place, Remove PC… asks in a dialog, and Hide on this device hides the PC
here, as Settings → Remote PCs → Show in sidebar does.
(#2997 by @duytbp) - The sidebar starts with your workspaces right under the logo: the Filter field is off by default
(turn it on in Settings → Appearance → Sidebar filter, or open it any time from the command
palette's Filter workspaces and agents), and the PCs heading with its count is gone. With several
PCs, each PC's own header still names it; hidden PCs are listed in Settings → Devices and PCs.
(#3245) - Approving a new device for your account now shows what is asking: its system and roughly where
its request came from (country and city, never the address), with "approve only if you started
this yourself". The Ovis sign-in page shows the same for the PC that started the sign-in.
(#3203) - The first-run line about anonymous usage counts says why they are sent and has a one-tap
Turn off; its text opens the counts in Settings, which now link to every field explained.
(#2861) - The anonymous install, update and daily active messages name the terminal runtime the server
serves (herdrorherdr-core). The receiver still takes messages from older apps without it.
(#2695) - A terminal that has been following new output at the bottom for a second reads its scroll
position every 1 to 2 s instead of every 250 ms, so a busy pane no longer sends four requests a
second. New output after a quiet spell, scrolling (the mouse wheel and swipes included),
resizing, paging and search still read it at once, and a page asked for on a position read
before the latest output reads it again first.
(#2700 by @kilhyeonjun) - The sidebar reads every repository's branches on a PC in one request every 30 s instead of one
request per repository, so branch labels arrive in one round trip over the relay or another PC's
connection (about 1.1 s to 0.16 s for eight repositories at a 133 ms round trip). A PC whose
Ovis is older is still read one repository at a time.
(#3129)
Removed
- Chat no longer offers Rewind in terminal on a Claude Code, grok or Antigravity message. Run
the agent's own/rewindin the pane's terminal; Chat still follows the branch it picks.
(#2595) - Settings > Alerts > In the app: in-app alerts always drop in while the app is on screen. A value
an older version saved for it is ignored.
(#3158) - Settings has four fewer rows: History page size (a chat's history loads 10 prompts a page), the
composer's New tab button (New tab with agent… stays in the tab menu, the command palette and its
shortcut) and Markdown width (a Markdown preview keeps the readable width), whose saved values are
now ignored; and Diff layout, which the diff viewer's own Unified and Split switch still sets and
keeps.
(#3089)
Fixed
- Settings > About no longer splits its card under an "Updates" caption while an update installs,
fails or cannot run from this checkout.
(#3230) - A device approved into the account still reaches every PC when the account service refused or
missed its record: the approving device keeps the record and sends it again when it next reads
the account.
(#2929) - The desktop app offers Sign in with GitHub in Settings → Phone & devices out of the box, with
account.ovis.sh;OVIS_ACCOUNT_SERVICE_URLstill names another service, and
OVIS_ACCOUNT_SERVICE_URL=offturns the account off.
(#2960) - Signed in, Settings > Devices and PCs lists the account's PCs as rows again, not as an unstyled
bulleted list.
(#3131) - Settings > Phones and devices no longer offers "Disconnect from all PCs" to a browser whose account
key is not a member on this PC (signed in on the PC's own address): every PC refused it. Revoke
stays.
(#3004) - Agent accounts can be removed from Ovis with confirmation without signing out their CLIs or deleting
credentials. Removal survives restarts; a removed account waits under Removed from Ovis in
Settings > Agents, where Restore lists it again, and a browser sign-in of that account restores it too.
(#2645 by @eddieparc) - Settings → Agents no longer lists herdr integrations for agents that are not on the PC and have
no hook installed, so an uninstalled agent stops showing under Not found on this PC.
(#2754) - An Antigravity chat on a long session no longer stalls every other request and terminal while
its conversation store is read: the read runs on a file thread.
(#2755) - Antigravity chat no longer falls back to the terminal on a long session whose conversation
database and its write-ahead log pass 32 MiB during a turn; a catalog that has not changed for
a few seconds is no longer copied on every read.
(#2697) - Antigravity chat on Windows no longer rescans every conversation lock on each refresh while a
pane's lock keeps changing hands; that pane now backs off like any other unresolved one.
(#2760) - Settings → Alerts → Also send to: an alert that arose before the destination was changed no
longer goes to the new one, and a save from this PC's own localhost keeps the address other
devices open the pane link at. The form says when messages have no link a phone can open yet.
(#2965) - A PC turned off in Settings > Alerts > Alerts from is silent on every channel, also where another PC
names it differently (a relay PC named at pairing, an SSH PC shown by its address): it is kept by its
relay ID, which its own server knows too, so a phone subscribed to that PC directly hears nothing of it.
(#2923) - Dictation on Android (HeliBoard, Gboard and other AOSP-based keyboards) no longer leaves the
transcript out of the box until the next key when the caret sits right after a word. A
composition something was typed into, such as an open Hangul syllable, still holds it until the
composition ends.
(#2877) - In the Android app, Download in the chat's image viewer saves the picture to Downloads (the
share sheet on Android 8 and 9) instead of doing nothing. This needs the next app build; an
older app now says it couldn't save the picture.
(#3159) - The Android app opens a PC behind a sign-in page such as Cloudflare Access or another
authenticating proxy: the sign-in shows in the app, without the app's bridge, and its cookie
stays in the app, where it used to end on the error page.
(#2924) - After the PC restarts, your own devices on Tailscale are no longer asked for a pairing code for
up to five minutes: Ovis reads the PC's Tailscale login again once Tailscale has finished
starting, instead of keeping the empty answer it got at boot.
(#2732) - A bare name in a Chat code span that nothing on the pane's PC has, such as a systemd unit
(user-1000.slice) or a host, reads as plain code instead of a file link that could only open
"No readable file at this path". A file of that name, several of them, or a folder keeps the link.
(#2873) - A Claude Code
/compactsent from Chat no longer says "Done" when Claude compacts the
conversation on its own before that/compactruns.
(#2734) - Command receipts stay with the right conversation around
/clearand/resume: a/resumeback
to an earlier conversation keeps the chips of the commands sent there, a slow poll no longer
brings the left conversation's commands into a cleared chat, and a/cleartyped in the terminal
no longer shows the commands sent since the last Chat/clearin the new, empty chat.
(#2734) - A Chat link to a local file written percent-encoded (
/a%20b/%EC%82%AC%EC%A7%84.png), as agents
write paths with spaces or non-ASCII names, opens that file instead of "no readable file".
(#2750) - While an answer streams, the chat keeps its newest text in view in the same frame it is drawn,
also on a slow device, where it used to fall behind each change and stay behind.
(#2655, re-landing #2624 by @odfalik) - An empty chat's greeting goes, and the composer docks, in the frame Send is pressed again, also
while another tab's send briefly holds the pane: it no longer waits for the send's cross-tab claim.
(#2766) - Chat shows attached image previews when the workspace folder contains spaces, including macOS iCloud folders.
(#2640 by @cheol-95) - The chat's turn rail no longer squeezes its ticks closer than 4px together in a short pane; a
rail too short for four ticks now stays hidden.
(#2757) - A chat opened on a busy machine no longer stops short of its newest message, or shows Jump to
latest as if you had scrolled away.
(#2720) - A Markdown image in Chat no longer jumps when the chat is opened again or its row scrolls back
into view: it keeps the size it had from the first frame, instead of a wide loading box that
moved the text below once the image was checked and loaded again.
(#2739) - After the connection comes back from a silent network drop, Chat shows the agent's reply as soon
as it is written, instead of up to a minute later behind a read stuck on the lost connection.
(#2848) - Returning to a hidden chat no longer waits for an abandoned conversation read to time out;
its pending request and older-page reads are cancelled with the screen that requested them.
(#2584 by @bonecool999) - Selecting text in the chat while the agent's turn ends no longer moves the words under the mouse
or the finger: the chat holds still while a selection is in progress and goes back to its end
once the selection goes.
(#2658) - Chat keeps a message sent before the chat first loaded marked as on its way when the agent's
transcript (Grok's whole-second times) already holds the same words from earlier in that second.
(#3192) - A message sent from Chat no longer stays faded beside its own turn after the PC's clock was set
back, and another device's identical message sent just before it no longer clears its waiting copy
when the chat had not read the pane for a long time.
(#3165) - Scrolling up while a long chat is still landing at its newest message on first open keeps you
where you scrolled instead of being pulled back to the end.
(#2735) - A Claude Code turn no longer shows "Working…" end about a second before its answer, as if it
had ended with no answer: the chat keeps the turn at work until the answer is read, or for up
to 2 seconds with no new transcript content.
(#2742) /clearin an empty Claude Code chat no longer flashes "Conversation unavailable" and drops
the composer to the bottom: the greeting stays in place.
(#2742)- A "Working…" head no longer shows under a finished answer when the agent's status takes longer
than usual to catch up, or when the next answer is read in with the same start time as the last.
(#2729) - Reading the background-command history of a long Claude transcript on slow storage, such as an
SSHFS home, no longer blocks the server for its bulk reads, and reads each part once instead of
once for every task notification or task ID in it. One stuck transcript no longer holds up the
history of other sessions. On a local Linux filesystem, a transcript the page cache holds is
still read as fast as before.
(#2616 by @duytbp) - A Claude session's background-command history no longer gives up and falls behind while a
picture of the same transcript loads slowly, such as a first picture of a long transcript on an
SSHFS home: its read now waits for the picture's lookup to end instead of timing out behind it.
(#2912) - Claude Code's approval card no longer mixes in the diff side panel's text, or goes missing, when
Claude draws that panel without its left edge (seen on 2.1.318 and 2.1.319).
(#3125) - On Windows, a Claude background command whose finish was rewritten in place in the transcript
no longer keeps the old result: two writes a millisecond apart could leave the file looking
unchanged.
(#2620) - A Claude conversation's images on slow storage, such as an SSHFS home, no longer block the server
while their transcript is read, and a page of them reads its transcript one picture at a time.
(#2610 by @duytbp) - Claude conversation image lookups now let other bridge requests run between transcript windows
and batches of records, while rejecting images hidden by a concurrent clear or rewind.
(#2604 by @duytbp) - Pictures in a long Claude conversation, a tool's screenshots most of all, load quickly: most no
longer search their whole transcript, twice for a tool's picture. A picture after a record too
long to read, or in a transcript rewritten in place since it was last read, is still searched as
before.
(#2627 by @duytbp) - Claude's plan card now shows in a narrow pane whose footer wraps inside the plan file's
.md, over
four or more lines, or under a plan folder holding a·, and an answered plan no longer stays live
when the next output line ends in.md.
(#2737) - A Claude Code question whose options carry a preview reads its options right when a box from
Claude's earlier answer is still on screen above it, instead of keeping the preview's borders in
the option names and replacing the card (and its edits) each time the cursor moves.
(#3091) - Closing the selected pane no longer jumps to another workspace: the selection moves as herdr's TUI
focus does, to the pane selected before it or the next pane in its tab, then to a neighbor tab, then
to a neighbor workspace, instead of to herdr's focused pane or the first pane of the first workspace.
(#2853 by @imurfutur3) - A Codex pane whose Codex was replaced, or wrapped by Kiro, right as Chat checked a sent command no
longer shows the conversation of the Codex it ran before.
(#2782) - Codex Chat can identify a completed conversation when its formatted answer is followed by
a weekly-limit notice or a model name containing spaces. Ambiguous conversations remain unbound.
(#2636 by @cheol-95) - A short Codex conversation stays readable beside another pane in the same folder when their
processes use different native session stores. Panes whose stores cannot be verified still
compete for ownership; their screens may distinguish a different conversation.
(#2719 by @christso) - Codex file citations in chat open their local files instead of showing the raw directive.
(#2612 by @cheol-95) - Codex Chat recognizes completed replies containing tables with ordered lists or bare URL links,
including wrapped weekly-limit notices at any integer percentage and background-terminal status.
Ambiguous or incomplete evidence still falls back to the terminal.
(#2636 by @cheol-95) - Codex Chat binds a pane again when another Codex conversation in the same folder asked the same
prompt only in an earlier turn and has finished a different one since. A conversation whose
latest turn may be the one shown still keeps the pane on the terminal.
(#2699) - On compact-height phones, where a workspace's only tab draws no row, the header's ⋯ menu now also
offers Move to workspace… (for a one-pane tab) and Close tab, which asks first as the row does.
(#2765) - Two tabs of one browser pressing Send on the same pane at the same moment no longer send the
message twice on HTTPS and localhost, where the browser offers a cross-tab lock. On plain HTTP
the send's lease alone guards it, as before, so a press at the very same moment can still send
twice there. A tab whose draft another tab already sent no longer sends it again.
(#2709) - Copilot Chat no longer stays on terminal output after Copilot rotates its process log: the
rotated copy carries the session ownership forward, as reading the whole log would.
(#2724 by @YuuuXie) - Chat diagnostics use current wall-clock timestamps while keeping monotonic failure intervals.
(#2724 by @YuuuXie) - Copilot Chat no longer falls back to the terminal for one refresh when herdr lists Copilot without
its command line for a moment (while it waits on the disk or is busy freeing memory).
(#3189) - On Linux, Copilot Chat can follow the live conversation through the TUI API of a Copilot you
started with--ui-serveryourself, rejecting stale history after session switches or
connection loss. Ovis never adds that flag: the API has no authentication.
(#2666 by @YuuuXie) - Copilot Chat no longer stays unavailable after a lookup lands while Copilot copies its log to
rotate it: the second descriptor Copilot opens on the same log counts as that log.
(#3110) - Copilot Chat no longer stays unavailable after a lookup lands while Copilot moves its log copies
up to rotate the log: that lookup alone falls back, and a later one follows the rotation once
the new copy is in place.
(#3122) - On herdr-core (macOS and Linux), Chat shows a Claude Code conversation started through a launcher
script, or viewed from a tab runninghc attach <t>, instead of "Conversation unavailable".
(#3023) - On herdr-core, the terminal's own answers (colours, focus) are no longer typed into the program
when they arrive while a key-bar key is still on its way.
(#2895) - On herdr-core, a shell that sets no terminal title is named by its folder in the phone header,
the window title and alerts, instead of its internal id (t1).
(#3234) - New workspace links open on their named PC even without a workspace or pane in the address.
A link to a removed PC no longer opens the creation dialog on another PC.
(#2718 by @christso) - Desktop app (AppImage): terminals no longer inherit the AppImage's own library and data folders,
which made programs in them load the app's libraries and, after the app quit, point at a folder
that no longer exists.
(#3138) - The desktop app's Windows installer no longer sits on a still progress bar for minutes: it
installs about 18,000 fewer files (the web page's packages, which its server never loads and the
page already carries built in), so it finishes in about a minute, and its bar keeps moving until
it is done. The installers for every system are smaller too.
(#2933) - Desktop app on Linux: menus and docks show the Ovis icon (the package now carries every size from
16 to 512 pixels), and removing the .deb with sudo stops the terminal server the app started
instead of leaving it running with nothing left to stop it.
(#3141) - Desktop app: the tray and menu bar follow the system language (Korean, Japanese, Chinese), and
Settings > About says in your language that updates come with the app.
(#3141) - Desktop app: update messages go to the app's log, a .deb built without updates says so plainly,
an AppImage run without FUSE no longer leaves about 400 MB in the temporary folder, and the
package description no longer points at a source file.
(#3141) - Desktop app on Windows: uninstalling stops the terminal server the app started instead of leaving
it running with nothing left to stop it, and removes the installer copy (about 170 MB) kept for
updates. Updating keeps both.
(#3144) - Desktop app: a workspace started without a folder opens in your home folder, not in the app's
install folder (on Windows), which an update replaces and uninstalling removes.
(#3236) - Settings > Phone & devices, opened through the relay right after entering the app, now shows
Disconnect from all PCs once this device joins the account, without reopening Settings.
(#3015) - A fresh Devin CLI session on Linux opens as structured chat without a reported session ID or a
resume argument: Ovis reads the session from the Devin process's own session lock. A resumed
pane whose lock names another session (after switching sessions inside Devin) now falls back to
the terminal instead of showing the old session.
(#2585 by @Haeminway1) - With two dialogs open, Escape closes the one in front: Files opened from the palette over
Settings, or Settings opened over New workspace, no longer leaves it open and closes the dialog
underneath.
(#3053) - Phone apps and pages from 0.4.x no longer warn that anyone on the network can type into every
pane when the PC only takes direct connections for devices paired through the relay.
(#3228) - On a phone, closing a file or a diff after a reload with the command palette (or another sheet)
open over it goes back to the pane, instead of showing the file or the diff again.
(#3115) - A long file opened at a line with Wrap on keeps that line in view when File text size changes
while it is open, instead of leaving it far below the view.
(#3021) - Escape closes Files every time, also right after a pane switch; before, the key was sometimes lost
when the page redrew in the same key press.
(#3026) - In Firefox, a Chinese, Japanese or Korean input method's candidate window opens beside the text
being typed in the terminal, instead of toward the start of the line once a few words were typed
on it.
(#2962) - A workspace or tab create request with a first message but no page connection (a script or CLI)
now says in its answer that the message is held (first_message.held), instead of reading as
queued while the agent sits idle.
(#2761) - A Claude background command that finished long ago in a long session stays finished after a
restart, instead of counting as running again; a command that is still running stays running.
(#2608 by @duytbp) - When libghostty draws a pane, Korean, Japanese and Chinese characters fill their two cells as
they do with xterm.js and keep their underline, a syllable being typed matches the ones beside
it, and Nerd Font icons stay inside their cell.
(#3012) - With Pictures in the terminal on, text printed after an iTerm2 or
sixel picture in a herdr-core pane no longer lands on a different row than the one you select and
type on: xterm.js draws the pane from such a picture on, since libghostty draws only Kitty pictures.
(#2981) - When libghostty draws a pane, a screen reader no longer reads the rows that scroll into view
when you scroll back through history, or the whole screen on the first line printed after a
font size change.
(#2989) - A skill sent from Chat to a gjc pane now shows its result once the turn it started ends, read from
gjc's own skill record and that turn's last answer, instead of staying "accepted" and then "no
result seen". A run of the same skill typed in the terminal meanwhile leaves the send unsettled.
(#3097) - Panes in a split tab on herdr-core keep their size instead of shrinking each other while they are
viewed: a tab is now laid out from its split tree, not from its terminals' sizes.
(#2830) - On herdr-core, a machine the core reaches no longer offers OmO or Gajae Code from this PC's own
install (they failed with "did not start"), and Settings > Agents there no longer shows this PC's
installs or offers Install: it says Ovis cannot tell which agents that machine has.
(#2986) - On herdr-core, a terminal on another machine the core reaches (
hc machine add) no longer
shows up as a workspace of this PC; those terminals stay out of its sidebar until machines show
as PCs of their own.
(#2795) - On the desktop app's own core, Split is no longer offered on a terminal in Other terminals or in a
helper's tab, Rename on Other terminals, or Move to Other terminals for a helper shown under the
terminal that started it: each was offered and then refused.
(#2893) - On herdr-core, a pi pane now shows its conversation in Chat when the web UI's pi extension is
installed: the session comes from the pane's pi itself, since herdr-core keeps no session reports.
Without the extension, the guide now says such a pane uses Terminal.
(#2950) - On the herdr-core runtime, a pane running Antigravity shows its conversation, along with
everything else Ovis does for Agy panes: herdr-core names itantigravity, and Ovis now reads
that asagy.
(#2613 by @grandprixgp) - On herdr-core, closing a tab or pane in the Herdr app (or in Ovis) no longer sends a "terminal
ended" notification, as closing one in herdr does not. A program that exits by itself, or is
ended by a signal from elsewhere, still sends one.
(#2619 by @nahwan-kim) - Closing a pane, on herdr or herdr-core, now clears what it held as an ended pane does: a message
still waiting for it is turned away instead of waiting for good, and a sign-in tab closed no
longer sends a "terminal ended" notification either.
(#2619 by @nahwan-kim) - herdr-core: an agent unpinned in Ovis while its label could not be written to the Herdr app no
longer comes back pinned after its terminal returned as a shell and an agent runs there again.
(#2785) - On a herdr-core PC, opening the same terminal in several browser tabs no longer floods it with
focus reports: every tab keeps its connection instead of being closed as overloaded, and a
seventh tab loads.
(#2826) - On herdr-core, Ovis no longer reads a full-screen program's history by having herdr-core scroll
it. That scroll reset every viewer's terminal and stopped a drag held at the edge of a Codex pane
from scrolling Codex.
(#3137) - With
OVIS_RUNTIME=herdr-core, the grey suggestion Claude Code shows in its empty input box is no
longer taken for typed text, so a Chat send no longer waits for Clear it and send.
(#2674) - On herdr-core, Ovis no longer stops when
hccannot be started, as while an update moves it: it
reports herdr-core as unreachable and connects again oncehcis found.
(#3045 by @photojupi) - On the herdr-core runtime, an OpenCode pane's Chat shows its conversation instead of "Conversation
unavailable": Ovis binds the pane to the session OpenCode's terminal title shows, among the sessions
the pane reported while they worked or waited, so a session busy in another OpenCode tab never takes
the pane's Chat. A pane shows its terminal while its session is untitled, OpenCode's terminal title
is turned off, or its session has not worked since Ovis started.
(#2983 by @cristianmiranda) - On herdr-core, restarting an agent in a terminal whose agent had quit while Ovis was stopped no
longer unpins it in the Herdr app.
(#2749) - With herdr-core, a pin or unpin made in Ovis and taken back before herdr-core answered the first
one is no longer undone when the terminal's agent quits and starts again.
(#2921) - With herdr-core, a pin or unpin made in the Herdr app is no longer overwritten when it comes
while Ovis is still writing its own pin, when Ovis could not save it, or whenpreferences.json
was lost and another pinned agent started the list again.
(#2753) - A pin removed in another browser, or in the Herdr app, no longer comes back when a browser that
held it opens Ovis again.
(#2694) - With
OVIS_RUNTIME=herdr-core, tapping key-bar keys no longer types the terminal's own colour,
focus and device answers (^[[I,]10;rgb:…) into the program when they arrive while a key is
still on its way.
(#2818) - On a herdr-core server, coming back to a pane while a read finish waits to be shared again after
a network or server error now marks it seen right away, instead of being lost or sent later as
if the pane had stayed on screen.
(#2914) - On a herdr-core server, coming back to a pane while its finish was still being shared as read
now marks it seen right away, and a finish already marked seen by a look is no longer marked
again on the next return after its answer arrives.
(#2786) - On herdr-core, coming back in Ovis to a finish another Herdr client marked unread marks it read
for every client again, and one marked unread while it stays on your Ovis screen stays unread
even when another client had read it first.
(#2779) - On herdr-core (
OVIS_RUNTIME=herdr-core), a pane's Terminal view scrolls back through its
history with the wheel, a swipe or the scrollbar: each attach starts with the terminal's last
2,000 lines, and the browser keeps what scrolls off the top.
(#2664 by @lutvzn) - On the herdr-core runtime, a workspace with no name of its own on a Windows PC is named after its
last folder (ovis-app) instead of showing its whole path (C:\repos\ovis-app).
(#3046 by @photojupi) - Large prompts finish sending when the herdr socket accepts only part of a request, instead of
timing out with a truncated frame. Failures after connecting no longer mark a prompt answer as
safe to retry.
(#2625 by @odfalik) - On the Herdr app runtime, Settings no longer shows herdr-core's version as herdr's or offers
Update herdr, and the header names herdr-core.
(#2667) - With
OVIS_RUNTIME=herdr-core, an hc an update moved is found again where the start looked,
the login shell'sPATHincluded, and only after its--versionchecks out.
(#2667) - The hosted app at app.ovis.sh offers sign-in with account.ovis.sh out of the box, as the desktop
app and a PC's own pages do; a copy of it served elsewhere (the regional app, a preview) offers
none, since the account service sends a browser back to app.ovis.sh alone.
(#3233) - The installer no longer takes a hung Rust PTY host for a working one when the host exits cleanly as
its timed-out check is stopped; it falls back to Node as intended.
(#2653) - Alerts no longer pile up on iPhone and iPad: a pane's new alert closes its earlier ones, as
the alert's tag already does elsewhere. iOS keeps an alert for 30 seconds before it can be
closed, so a quicker repeat stays until the pane's next alert.
(#2922) - On iPhone, Download in the chat's image viewer no longer replaces the iOS app or a home-screen
web app with the picture: it opens the share sheet, whose Save Image keeps it, and cancelling
leaves the viewer as it was.
(#3127) - Pictures in the terminal now draws what iTerm2's own
imgcatprints (its multipart form) and
whatchafa -f itermprints (a TIFF picture without a size). A TIFF of a kind the browser cannot
decode shows a striped placeholder where the picture goes instead of nothing.
(#3150) - A PC whose session snapshot is larger than 1 MiB now opens over the Ovis relay instead of closing as
stalled and reconnecting every time; the phone or browser and the PC both need this version.
(#2897) - A remote PC whose session snapshot is larger than 1 MiB opens in the browser instead of closing as
stalled, and a second large frame (a large mirrored screen) sent while that snapshot is still on
its way no longer closes the connection.
(#2740) - On a slow link, a pane opened while a large session snapshot is still arriving is no longer closed
as stalled, and a client that stops reading a large frame is now closed instead of holding it.
(#2740) - A Letta Code pane whose letta was seen outside the folder it started in keeps showing Terminal
after the PC's clock is corrected, instead of Chat showing a conversation it may have left.
(#3093) link --codetakes its code back when it is ended by SIGTERM or by its terminal closing, not
only by Ctrl+C, and takes back only the code it showed: a pairing started since in Settings or
on another device keeps working.
(#3191)linkkeeps this PC in the account's list when renewing the listing loses the answer to its
removal.
(#3191)- A managed start no longer fails when herdr's socket file is left over from a herdr that was
killed or lost power: a socket that refuses the connect counts as a stopped herdr, like no socket.
(#2767) - Multiple browser tabs no longer occupy the HTTP/1.1 connection pool with separate machine event
streams when the server supports machine notifications on the existing terminal WebSocket.
Older servers retain SSE, with a server-side transport rollback switch.
(#2672) - Keys typed right after New terminal (the + or the tab list) or the New tab dialog's Start for a
plain terminal now go to the new tab, in order, once it is ready. They used to be lost, and a Space
or Enter typed then pressed the + again and opened more tabs. A paste typed then is refused, and
keys left behind when the focus moves away are held for review instead of sent.
(#3121) - On a touch screen with a keyboard, when a tab from New terminal opens while you are still typing,
the rest of what you type now goes to that tab instead of being lost.
(#3145) - The app loads again on Safari and iOS 16.0 to 16.3, where it stayed on its loading spinner: its
text patterns no longer use a lookbehind, which those versions cannot read.
(#2714) - The full output of an OmO tool call is looked up in the latest 16 MiB of the transcript instead
of reading the whole file, and stops at a context clear; an older call's output can be
unavailable.
(#2701) - An omp pane's Chat no longer falls back to the terminal view on a busy PC: the helper that reads
which session store omp uses now has its one-second deadline for its read alone, not for its own
start as well.
(#2679) - A chat message naming an OpenCode skill, sent right away, no longer types the skill's keys, its
rest or its Enter into a masked password prompt on the terminal. Nothing typed, the send is
refused; with part already typed, the chat text stays and you are asked to check the terminal.
(#3174) - A terminal app's own Copy (OSC 52) now reaches the clipboard in iOS Safari: the tap that clicks
it starts the clipboard write, and the app's copy fills it in. Nothing arriving within a second
leaves the clipboard as it was.
(#2925) - Dropping a pane beside another pane of its tab now says the move was refused when herdr will not
move it (a zoomed tab, say), instead of retrying and reporting a pane left in a tab of its own.
When one of herdr's answers is lost on the way, the pane is found where herdr put it, the notice
says so, and herdr's focus goes back where it was.
(#3014) - Moving herdr's focused pane beside another pane of its tab no longer marks a neighbour's
finished agent as seen, and browsers that follow herdr's focus no longer jump to that neighbour
for a moment.
(#3135) - A pane moved to another workspace from outside this browser (herdr's own window, another browser)
is followed by every browser: the selection and either half of a split go to its new ID, and its
draft, held terminal input, lens, reply comments, pending messages, sidebar pin, place in the chat
and read finishes go with it. Nothing held is sent: it waits for its Send or Discard.
(#2784) - A pane moved to another workspace from outside this browser (herdr's own window, another browser)
no longer leaves its queued and held messages behind under its old ID: they follow the pane, held
for an explicit send. Its terminal also connects under the new ID at once, without waiting for an
attach still open under the old one, and the server tells browsers which pane moved where.
(#2780) - With
OVIS_PASTE_DIRset to a folder whose name holds a word ending in an image extension and a
space (/tmp/shots.png backup), a message with an attached file names its tab by the message's
words and shows the attached picture in Chat, not the wrong file.
(#3134) - A long draft in the chat's message box no longer pushes the Send button under a tall phone
keyboard: the text scrolls inside the box instead.
(#2597) - On a phone with a Dynamic Island, the search sheet's field and close button no longer sit under
the island, and no sheet's top reaches under the status bar while the keyboard is up.
(#3119) - On a phone held sideways, Settings and other dialogs keep clear of the notch on either side and
of the home indicator, and a tab's menu ends above the home indicator.
(#3119) - On a phone, the composer's mic, dictation's Cancel and Insert, and the drawer's Settings gear take
a finger's 44 px tap around them, drawn as before.
(#2607) - Ovis Chat no longer keeps a Pi send "waiting for transcript" when Pi runs it itself: a builtin
such as/modelor/compact, a prompt template or a!command. Pi never records these as the
text sent, so they get no transcript receipt, and the messages sent after them are confirmed again.
A/namePi takes as a message, such as an unknown one or/new please, keeps its receipt.
(#2659 by @hrudek) - A
/skill:namesent from Ovis Chat to Pi is confirmed by the record Pi writes for it (the whole
SKILL.md before the request). Its receipt waited for good before, and so did every message sent
to the pane after it.
(#2659 by @hrudek) - Show pi's
/model, thinking-level, questionnaire and extension select, confirm and input cards in
Chat when an extension adds a status line to pi's footer; they no longer disappear as if answered.
(#2639 by @hrudek) - Pi's Earlier sessions now fill in session names over later opens even when checking the session
files takes the whole listing time (a slow disk or many large files), instead of showing only IDs.
(#2763) - Pi Chat: a message sent with Windows line ends, a prompt template Pi has not listed in the
command menu, or an extension's command no longer leaves a "Sent to Pi · waiting for transcript"
bubble that holds every message after it.
(#2686) - Chat names the model and thinking level of a Pi pane as soon as it opens, from Pi's own footer,
instead of showing no model until Pi's first reply.
(#2711) - A browser opening Ovis again keeps its pins on a server that started over with a fresh state
folder, even after other devices saved there meanwhile.
(#2778) - A herdr plugin install started from a shell (
bun scripts/plugin.ts start, without herdr's
HERDR_PLUGIN_ROOT) runs the update it already installed again, instead of falling back to the
plugin's original checkout. Updates still wait for herdr's own start.
(#2775 by @jamesyang124) - On a Portal address with Portal's default sign-in (token or paired device only), the header and
Settings → Access now say the connection comes through Portal, not straight to the address or
through a proxy.
(#2902) - A chat drawn again for a pane that came back on another session no longer shows the previous
session's question card, also while reading the screen fails.
(#2712) - An answer typed into a question card is no longer lost when the question is answered in the
terminal meanwhile (for example while offline): it waits in the message box as a draft.
(#2712) - A question card now follows the agent's question within a moment when the agent is marked as
waiting before it draws the question, instead of after the next 2-second check.
(#2712) - An answer from a question card no longer presses Enter on another row when the terminal's cursor
moves at the same instant, and a Hermes multi-select answer stops instead of ticking another
question when the terminal switches questions after its first tick.
(#2736) - A queued next-turn message is no longer typed into another process that took the agent's PID, or
whose start can no longer be read, between its last check and the write, nor into a masked
password prompt that came up during that last check. Nothing typed, it stays queued; with the
paste already typed, it waits for your OK.
(#3172) - A phone that closes its relay connection is no longer left showing itself connected for about
17 seconds: the relay answers the close at once, and what is typed while the connection is closing
stays a draft instead of being lost.
(#2586) - Phone & devices now shows when a phone paired through the Ovis relay was last seen, instead of
never.
(#2758) - A pairing link without a code (pairing by comparing digits) now names the PC's regional relay, as
its QR code does, so the phone connects through the nearby relay from the start.
(#2882) - A PC paired through the relay is listed in the phone app under its name instead of its raw
app.ovis.sh address.
(#2759) - On a phone paired through the Ovis relay, opening a PC's file in a tab of its own or as a raw
file, following a link there, reloading, tapping Reconnect or tapping an alert no longer puts the
file's path, the workspace's name or the pane in a request to app.ovis.sh: the page keeps them in
its address's fragment, which the browser never sends. A link saved from an older version still
sends them with its first load; the page then moves them into the fragment, so later loads don't.
(#2605) - A PC added through the relay can no longer make this PC's server connect to link-local addresses or
to other ports on its network: only another PC's direct listener port (7319) is dialed, and a
connection that keeps dropping no longer tries the direct route again each time it comes back.
(#3219) - A PC added through the relay no longer shows a red "herdr offline" in the header while it is
connected: Ovis reads what runs its terminals from that PC, as it does for a PC over SSH.
(#2892) - In the desktop app, Settings → About no longer says to start Ovis with
bun run startor the
herdr plugin to get updates: it says updates come with the app.
(#2892) - The phone app away from home reaches a PC on Tailscale even when the PC also names two LAN
addresses: it keeps one of its two direct sockets for the Tailscale address instead of falling
back to the relay.
(#3222) - Opening a PC no longer closes one of the same device's other sessions for a connection attempt
the app then drops: a session counts as the device's only once it is used.
(#3222) - A phone on the Ovis relay that has a PC open now reconnects within about a second of that PC
coming back from a restart, instead of waiting up to half a minute between tries.
(#2807) - When a phone or PC drops off the network without closing its relay connection, the hosted relay
now ends that connection once. Before, it told the PC the phone had left again every two minutes
and kept the PC's relay room awake until the network gave up on the connection.
(#2844) - A returning browser can recover a remote follow-up's sent or discarded receipt after a lost
connection, without sending it again or exposing the receipt to another paired device.
(#2792 by @christso) - A device switched to watch while its connection to another PC was still opening is now
disconnected, instead of keeping control of that PC.
(#2792 by @christso) - Comments on a reply are no longer sent again with the next message when another tab of the
browser moved the pane to another workspace while the message carrying them was on its way.
(#2741) - Picking a Hermes conversation search result now opens it when the newest messages shown hold only
tool calls, instead of saying the message is no longer in the conversation.
(#3055) - A conversation search result for a Codex prompt with a picture opens again when Codex paired the
picture with its file after the search, instead of saying the message is no longer there.
(#3030) - Picking a conversation search result no longer says it is missing for a turn the chat shows:
two answers of one time that begin alike are told apart by their whole text, and a Hermes answer
is found even when the chat's page and the search's began at different rows of it.
(#3033) - A conversation search pick no longer opens a later answer that begins like the searched one when
the searched answer grew and sits on a page not loaded yet: it reads back far enough to tell them
apart.
(#3001) - Picking a Hermes conversation search result the chat has not shown yet reads the newest messages
first and opens that one, instead of an older message of the same time and words.
(#3042) - Picking a conversation search result opens the turn that was found, not another one: Kimi
prompts that begin with the same words are told apart by their whole text, and after a clock
went back (Hermes) the chat reads back far enough to tell the found answer from a later one.
(#3013) - A password or passphrase prompt wrapped over several rows of a narrow pane is recognized again
when a row starts with a space or holds Korean, Chinese or Japanese text, so a queued or typed
message is no longer sent into it.
(#3177) - A message sent right after the network came back (a phone moving from Wi-Fi to cellular, a
laptop waking on another network) no longer waits about 25 seconds before Ovis notices the old
connection is gone: when the PC has said nothing for 3 seconds after a send, the connection is
checked at once and replaced if it does not answer.
(#2838) - libghostty's terminal module downloads compressed (about 345 KB
instead of 1.1 MB) and asapplication/wasm; the app keeps it after the first time.
(#2953) - On a phone, Escape right after a device pairs closes Settings: the Connect a phone sheet that
just closed by itself no longer takes the key, or leaves Settings open on its list of pages.
(#2651) - A shared setting turned back while its save was on its way (a switch flipped on and off quickly)
no longer snaps back to the value it just left.
(#2747) - A setting changed just before a reload is kept even when the browser drops the save sent on the
way out: the reloaded tab sends it again, unless another browser saved that setting since.
(#2747) - The desktop app no longer shows "This device's push subscription is missing" on its first launch:
it has no push service, so its alerts come from the open window, as in a browser without push.
(#2801) - An agent started again in the same pane but another project or session shows that project's slash
commands and skills, not the list still loading for the previous one.
(#2710) - The slash command menu and skill chips no longer stay empty for good after a commands read that
never answered; the read now times out and is asked again.
(#2710) - A chat opened right after its first read failed asks again instead of showing that failure.
(#2710) - Agents can use the room a short or folded PCs list leaves above the footer. With both lists long,
the default stays at today's split until the divider is dragged.
(#2944 by @duytbp) - Show the sidebar on hover: the shown sidebar no longer hides while a row is dragged in it, or
while its filter has the keyboard focus, and Escape closes an open menu or popover before the
sidebar.
(#3074) - The sidebar stops asking every 30 seconds for the worktrees of a workspace whose folder is no
longer a Git checkout, which filled the server log with one error per poll.
(#2751) - The account approval card now says that a device's name and system are what it reports and the
place is where its network connects from, strips direction-changing characters from names, and
asks again when the device changes its details before you approve.
(#3221) ovis linkuses the sign-in the account service offers when it has no Ovis sign-in page, and a
refused sign-in on that page no longer names a provider you did not pick.
(#3221)- An SSH connection to a remote PC makes its private temporary folder only once it starts, so a
connection that never starts no longer leaves an empty/tmp/herdr-ssh-*folder behind. The
server also removes such leftover empty folders older than an hour when it starts; enough of
them could fill a tmpfs/tmpand make unrelated programs fail with "no space left".
(#2698) - A tab named from its first message no longer shows an attached file's path: the words after it
name the tab, and an agent's own title for the conversation (a Codex thread, a Claude Code topic)
comes before them.
(#2681) - A tab named from its first message keeps the user's words when they name a file shaped like an
upload, or when an attachment sits in a folder whose name holds " @" or " ~"; Chat shows that
attachment's picture too. A tab's name learned again in place of an attached file's path is no
longer lost when another browser saves its settings meanwhile.
(#2762) - A tab another browser took a pane from no longer shows herdr's "terminal attach taken over"
line when herdr's attach takes more than a tenth of a second to exit, as on a busy PC. The
line is held for up to 2 seconds; an exit later than that comes too late, so the line is shown
and stays.
(#2630) - A key typed into a terminal right after it opens, before it takes input, is no longer lost without
a word: text is held for review as before, and a key that cannot be held (Escape, Enter, an arrow)
now says it was not sent.
(#2689) - Shift+F3, Ctrl+F3, Alt+] and Alt+Shift+P typed into a terminal before it takes input now say they
were not sent, like other keys, instead of being dropped as if the terminal had sent them itself.
(#2752) - Gboard's double-space period shortcut in Direct typing no longer repeats the terminal input line.
(#2789 by @zs311521) - In Direct typing, a keyboard correction such as Gboard's no longer deletes terminal text you did
not edit after an arrow, Home, Tab, Esc or Ctrl key moved the cursor (on the key bar or a
hardware keyboard).
(#2900) - Typing that waited behind a message or key still on its way to a pane is no longer lost without a
word when the connection drops before its turn: the terminal now holds it for review, as it does
for typing the server never received.
(#2798) - The terminal's "Jump to bottom" button now also shows on a herdr-core server (the desktop app),
where the browser keeps the scrollback.
(#2859) - Terminal text in Latin letters no longer turns squashed over itself or spread apart after the
window or the pane changes width, such as going back from Chat to Terminal or changing the
terminal font size; Korean and Japanese were drawn right already.
(#3238) - On herdr-core, with Pictures in the terminal left at its default, a picture in a pane's first
output is drawn too, and Settings shows the switch on whenever the terminal draws pictures, even
while the PC's health cannot be read.
(#3195) - A terminal no longer stops drawing with "Cannot set properties of undefined (setting
'isWrapped')" after its pane is made narrower and then taller (a split, a closed neighbour, a
rotated phone), and erasing above the cursor from a row's last column no longer breaks a
herdr-core pane that keeps its history.
(#3140) - An emoji followed by the text-presentation selector (U+FE0E, as in
⚽︎) takes one cell in the
terminal, as herdr and herdr-core lay it out, so the text, cursor and selection after it no
longer sit one column to the right.
(#2972) - The file viewer's partial-file note (
256 KB of 1.3 MB) is readable again in Tokyo Night Day,
Gruvbox Light, One Light, Solarized (both), Kanagawa Lotus and Rosé Pine Dawn: its yellow keeps its
hue and reaches 4.5:1 on every surface it sits on, as DESIGN.md promises.
(#2676) - Typing sent just before a connection closes is no longer lost when it never reached the PC: until
the PC confirms it, it is kept, and a connection that ends first shows it as held input to send or
discard. A PC too old to answer pings keeps the earlier behaviour, where such typing is lost.
(#2673) - A browser sign-in to Claude Code or Codex now says how its own CLI ended: a failed Sign in
again no longer reads as finished because the expired account is still listed, a first Codex
sign-in in its default home no longer reads as failed, and a sign-in names the account it signed
in, not one another credential folder gained meanwhile.
(#2649 by @eddieparc) - Voice polish turns reasoning off for a GPT-5.1 or later model named after its vendor, such as
OpenRouter'sopenai/gpt-6-luna, so tidying no longer waits for the model to reason.
(#2866) - Chat drops a sent message's faded copy when its transcript turn arrives, even after another
pane disconnected and the browser clock is ahead of the PC.
(#2717 by @christso) - A sent message's faded waiting copy is no longer cleared by the same words another device or the
terminal sent just before it in a chat left idle for a while, for a queued message sent later,
or on a PC updated since the chat opened. A change of this device's clock no longer keeps the
copy beside its own message until it times out.
(#2973) - A sent message's faded waiting copy no longer disappears early when another device or the terminal
sent the same words a few seconds before it and this browser's clock runs ahead of the PC.
(#2898) - With Web links set to In the app, closing a file docked over pages stacked from the palette, or
Close page after a reload with the palette open over the page, no longer brings an earlier page
back.
(#3095) - On Windows, Chat shows a Claude Code conversation started in a desktop app terminal instead of
"Conversation unavailable".
(#2903) - On Windows, when a terminal's
claude.exeruns the session in a childclaude.exe, Chat shows
the conversation instead of "Conversation unavailable", and Earlier sessions lists and resumes it.
(#3047 by @photojupi)
Maintenance
- Contributors now sign a Contributor License Agreement (CLA.md) once, by a comment on their first
pull request; the CLA Assistant check asks for it.
(#2813) - Copilot Chat logs distinguish missing session evidence, lost log continuity, read races and
explicit session releases. Reader bookkeeping shares one process-lifetime record and preserves
the reason ownership was rejected without logging session IDs or conversation contents.
(#2724 by @YuuuXie) - The desktop app has end-to-end checks of a built app (
app/electron/scripts/e2e.ts): first
launch without herdr, terminals across quit and relaunch, the tray, a killed app and an update
from a local feed, each in a temporary HOME.
(#2809) - The desktop app installed from its .deb now updates itself: it downloads the new .deb and installs
it behind the system's password prompt when you choose Restart to Update in the tray.
(#2828) - A desktop app in
app/electron(Electron, Linux and macOS) carries the Ovis server, herdr-core
0.1.17 and Bun, and runs them itself with its own state folder and hc session. Not released yet.
(#2691) - herdr-core (
hc) calls are typed from hc's own OpenRPC schema, generated with
bun run generate:typeslike herdr's wire types. The schema is held to the hc version CI pins,
and the herdr-core live contract fails when that hc publishes a different one.
(#2671) - Releases now sign the build provenance of each Rust PTY host binary, so anyone can check with
gh attestation verify --repo devswha/ovisthat it was built by this repository's workflow.
(#2797) - A test holds every theme to WCAG AA contrast: 4.5:1 for interface text on each surface, on
primary buttons, for the notice and syntax colours and a light theme's terminal colours, and 3:1
for the working, blocked and done status colours.
(#2676)