You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
New features
Update a PC's own older Ovis right from its card in this app.
Antigravity chat works on Windows.
Chat shows pictures from omp sessions and Codex tools.
OpenCode subagents show as background tasks, as Claude Code's do.
Settings can revoke every paired device at once.
Improvements
Korean in the terminal uses a coding font that matches the Latin.
With only the Host shown, the sidebar starts with its workspaces.
The phone key bar can show or hide the keyboard in the terminal.
Queued or held messages can be edited back in the message box.
A device whose push alerts stopped is told why and can fix it.
Bug fixes
Chat shows an agent's words and tools in the order it wrote them.
A PC whose own Ovis restarts reconnects to it by itself.
Updates stay installed when your home folder is a symlink.
Connecting a remote PC from Windows no longer hangs.
Voice input in the Android and iOS apps can use the microphone.
Full changelog
Added
Antigravity (Agy) chat on Windows: the pane's held conversation lock is found through the
Restart Manager, so Chat reads the native conversation instead of falling back to terminal text.
A process without a conversation, an unreadable creation time, or an ambiguous hold keeps
Terminal.
(#2016 by @kyop21)
A device whose push alerts stopped is told why: when the push service retired its subscription,
the server no longer knows it or it was made for another server key, one line over the pane and
the Test notification row of Settings → Alerts say so and offer Turn alerts on again, which
subscribes the device anew; a refusal is told and opens Alerts, where Send test answers it. The
server keeps the outcome of the last push to each subscription (push-delivery.json, owner-only,
bounded like the retired list) and answers POST /api/push/status to the subscription's owner
holding its keys alone. A failure older than the last success, no answer, throttling or a server
error never raises the line, and no probe push is sent to find out.
(#1995)
Settings → Phone & devices lists what protects the server, read-only: whether an access token is
set, whether the pairing gate is closed, the kind of address it listens on and how this browser
reached it. Whether it can be reached from the internet stays "Unknown" unless the request came
through Tailscale Funnel, and no token value is ever shown.
(#1975)
Chat shows the pictures in an omp session: one sent with a prompt, a prompt that is only a
picture (as a turn of its own), and one a tool such as read returned. omp keeps their bytes in
its blob store; Chat reads them from there and serves only bytes that match the name omp gave
them. A picture omp keeps in its blob store shows when the PC runs Linux; on macOS and Windows
only pictures omp keeps in the session itself show for now (#2004).
(#1998)
Chat shows a picture a Codex tool returned (view_image, an image generation, a screenshot a
command read) in that tool's row, loaded when the row is opened.
(#1998)
An OpenCode 2 pane's subagents are background tasks, as a Claude Code pane's are: the message
box's button and the sidebar badge count those running, the list shows them with the newest ten
that ended in the last day, a turn that ends while they run reads BG with its finish alerted
once, and one whose pane no longer runs that session reads as lost. A subagent run in the
background leaves a card in the chat with its answer, and a foreground one's answer no longer
shows OpenCode's <subagent> tag.
(#1987)
Edit queued or held messages back into the composer without replacing its existing draft.
(#2041 by @odfalik)
A PC whose own Ovis is older than this app can now be updated from here. When that Ovis can update
itself, the PC's card offers "Update this PC's Ovis to vX", and with automatic PC bridge updates
on it runs unasked. The app asks that server over SSH to install the release its own updater offers,
shows its progress and reconnects once it is back on the new version. When it cannot update itself,
the card says why and shows where that Ovis answers.
(#2048)
Rename tab is a command palette action and a shortcut with no default key (bind one in
Settings → Shortcuts): it opens the inline name field of the open tab, as the tab menu's Rename
does.
(#1981)
Settings → Phone & devices can revoke every paired device at once, the current one included, in
one durable step that also voids any pairing code or unconfirmed pairing still out; the access
token, the PC itself and its Tailscale login keep getting in, and the gate stays closed to
strangers. Every open window is told when a device pairs, with a line that opens Phone & devices,
and devices with alerts on get a notification of it.
(#1977)
Settings → Appearance → Sidebar filter turns off the Filter field above the sidebar's lists on
this device. With it off, Filter workspaces and agents in the command palette opens the field,
focused, for as long as you filter.
(#2073)
The terminal's key bar on a phone has a Show keyboard / Hide keyboard key after the Input line
switch and Paste: it raises the keyboard for the current input mode or puts it away without
sending a key, changing the mode or resizing the pane, and shows whether the keyboard is really up.
(#1973)
Changed
When the sidebar shows one PC and it is the Host (the only PC, or the others hidden on this
device), its PC header row is gone and its workspaces start the list. Its state, notices and
errors still show, and its + is a New workspace row under the workspaces. A remote PC
shown alone keeps its header, with its name and its manage menu.
(#2073)
Fixed
Escape on an open agent list in the New session, Earlier sessions and New worktree dialogs closes
only the list in Safari too, where a list opened with the mouse leaves the focus off its button;
before, that Escape closed the whole dialog. An overlay opened over the dialog, such as Add PC,
still takes its own Escape.
(#1972)
A message queued in Chat for an agent started through a launcher that stays in front of it (an
npm claude wrapper, a shell script) is held when the agent behind the launcher restarts, as it
is for an agent started directly, instead of going to the new agent.
(#1986)
On macOS, checking which agent a queued or first message goes to no longer stops the server
while ps answers.
(#1986)
Antigravity chat on macOS no longer falls back to Terminal for the whole of every turn: the
catalog snapshot is opened through its real path instead of the /var symlink.
(#2030 by @phlips5437)
Voice input in the Android and iOS apps can use the microphone: the Android app now asks for it
instead of refusing it without a prompt, and the iOS app carries the microphone usage text that
iOS requires before an app records.
(#2035 by @nahwan-kim)
Chat keeps a turn's words and tool calls in the order the agent wrote them, as the terminal
does: text written before a tool call no longer drops below every command of the turn.
(#2060)
A Claude Code question asked while the fullscreen layout shows its diff panel beside the session
now gets its question card instead of the generic input screen.
(#1984 by @bonecool999)
Chat greets a Codex started by typing codex in a terminal, before its first message, as it
does one started from the app, instead of saying the conversation is unavailable. It does so only
when the screen shows Codex's start screen with nothing said, no resume or fork started
it, and no conversation of that folder was begun or written since it started.
(#1967)
Command Code suggestions show one row per command name, matching what Command Code runs.
(#1970)
When a Command Code commands folder is too large to list in full, suggestions no longer offer a
command Command Code would not run, and skills are offered as /skill:<name>.
(#1970)
An unreadable Command Code commands folder no longer empties the whole command menu.
(#1970)
Command Code completion stays open after /mode:.
(#1970)
Very large or hostile repositories no longer hide your personal skills.
(#1970)
Skill names are recognized in files with BOM-prefixed frontmatter headers.
(#1970)
Copilot conversation history stays bound to the same session during a verified foreground
parent-to-child process handoff, without accepting unrelated processes or stale reports.
(#1955 by @YuuuXie)
Copilot Chat keeps conversations readable when recorded tool arguments are strings, including
non-JSON input, while preserving bounded input display and verified tool output.
(#2024 by @YuuuXie)
Copilot Chat can recover after a temporary log read failure or an append during its first read,
without restarting the bridge or trusting a lost session binding.
(#2061 by @YuuuXie)
Copilot Chat retains verified session continuity across safe partial log lines and retries
concurrent log writes without permanently discarding the last verified checkpoint.
(#2025 by @YuuuXie)
Earlier sessions now lists Hermes conversations made by /branch or a gateway reset, each
resumed by its own id; Hermes's delegated runs, tool sessions and compression continuations
stay hidden.
(#2001)
With Settings → Terminal → Use alongside herdr's own window on, a tab you are in now also lets go
of its pane after 10 seconds without typing, a click or a paste in its terminal. herdr's own window
then has the pane at its own size again, instead of drawing it cut off with typing and clicks
landing in the wrong place for as long as the tab stayed open. The next key, click, paste or
composition in the tab takes the pane back, and what you typed goes in once, the first key
included. If the pane cannot be taken back within 5 seconds, what you typed waits for you to send
or discard it. With the setting off nothing changes.
(#2002)
On an iPad whose Safari page zoom for Ovis is below 100%, the message box follows the on-screen
keyboard again: a page zoom is no longer taken for a pinch zoom
(#1957 by @Noobear).
Ovis for Mac keeps an unsent draft when the window follows the server to a new port: the chat's
draft, the terminal's held input and held messages typed on the old port show on the new one,
still waiting for Send or Discard.
(#1996)
A crash or power loss no longer leaves the app unable to start because its saved remote PCs
cannot be read. The damaged file is kept beside it under a new name, the app starts without
those PCs, and Settings > Remote PCs names the file so you can add them again. The saved PCs
and herdr's machine approvals are now written so that a crash cannot leave them unreadable,
and only when they changed instead of on every refresh.
(#2045 by @mattmarcin)
On macOS the server no longer pauses every connection while ps tells when an agent's process
started or which terminal it runs in: it reads both from the kernel instead.
(#1980)
Opening a file an agent named without its folder no longer pauses the server while git lists a
large repository.
(#1980)
Muse chat reads a session that /fork started in Muse 1.4.13, instead of falling back to
Terminal.
(#2052 by @jpcarranza94)
Muse chat reads the last 16 MiB of a growing session log once per append to check it for a
rewrite, instead of hashing it twice with SHA-256.
(#2027 by @jpcarranza94)
OpenCode: an @skill sent from Chat that did attach is no longer reported as not attached when
the agent row redraws, a bordered line is on screen or the theme has no bold, and the message
recorded for a send matches what was typed. If OpenCode shows that Tab switched its agent or
attached another skill, nothing more is typed and the message stays in Chat.
(#1991)
OpenCode: sending an @skill before the pane's skill list has loaded no longer pauses the server
to scan the disk; the mention goes as plain text unless the skill is already known.
(#1991)
A PC whose own Ovis restarts while this app is connected (its update, a crash, a reboot) now
shows Reconnecting… and comes back by itself once that Ovis is back, instead of asking for setup
approval; nothing of this app's is started on that PC in its place.
(#2071)
A failed update of a PC's own Ovis now says so on the PC's card, with why, and in the line under
the header, and one that ends on another version keeps the address to update it on that PC.
(#2071)
A draft in the message box no longer stops ⌘⇧↑ / ⌘⇧↓ (Ctrl+Shift on Windows and Linux) from
moving to the previous or next pane: the box keeps the keys only while they still select text
that way, and the next press switches panes.
(#2034 by @jpcarranza94)
A pane's unsent message, terminal line, held input, held chat messages and lens no longer show
up in another pane after herdr restarts and gives its pane IDs out again. The earlier text waits
in Recover unsent text in the pane's menu, where it can be put back in a message box (never
sent), copied or discarded. A server restart alone keeps everything in place. Text kept before
this update waits there too on the first load, since nothing says which herdr it was written for.
(#1997)
A first message held because the agent started for it has ended now says so, apart from a pane
whose terminal or agent session changed, and both notes read in Korean, Japanese and Chinese
instead of the bridge's English.
(#1969)
A PC whose SSH address is changed in its dialog now moves there only once that setup connects. A
setup cancelled at its approval, or one that fails, leaves the PC at its own address, so a later
reconnect or bridge update no longer starts this app's bridge at an address that was never approved.
Until it connects there, the PC's card keeps its own panes, herdr version and update offer.
(#2078)
A PC's own Ovis that updated itself but still answers an older version than this app's keeps its
address and link on the PC's card, with why it cannot be updated from here.
(#2078)
Pi's installed questionnaire tool now uses the web prompt card for options, free-text answers,
and multi-question review, including narrow panes. Answers are bound to the pending tool call
and checked against the current widget before input is sent; incomplete reviews cannot submit.
(#2003 by @philipprass-prog)
Queued-message Edit requires ownership on the bridge and shares its withdrawal outcome with
other tabs' held-copy resends, so a delivery that already won or could not be confirmed cannot
also restore the draft. Dismissing uncertain text does not claim it was withdrawn.
(#2041 by @odfalik)
Pi transcript confirmation reads bounded history tails and new entries instead of re-reading
the whole conversation, and tolerates ongoing appends without accepting partial records.
(#2041 by @odfalik)
Exact Pi delivery receipts reconcile after browser reconnection or reload on the local machine
without clearing unrelated messages that happen to have the same text. Remote-machine receipt
resumption is disabled until relays can identify the originating paired device securely.
(#2041 by @odfalik)
Adding a PC whose own Ovis listens on another address than 127.0.0.1 (its HOST set to, say, its
Tailscale address) connects instead of failing with "ECONNRESET": that Ovis now also answers the
app's SSH tunnel on the PC's 127.0.0.1. An older Ovis set up that way, or one whose HOST is a host
name, gets an error saying to update it or set HOST=127.0.0.1 there.
(#1983)
A pane that comes back after herdr could not restore it, or whose terminal herdr replaced, shows
its screen as current again when its attachment recovered meanwhile, instead of keeping its DONE
dot until new output arrives.
(#1990)
Settings opened right after it was closed, or right after the command palette closed on a phone, no
longer closes by itself on a slow device: the late step back off the closed one's history entry is
no longer taken for a Back.
(#2023)
The terminal draws Korean in a coding face that matches its Latin text, in Ovis for Mac's window
and in every browser: the app now carries the Hangul of D2Coding, fetched only once a pane prints
Korean. Before, Korean fell back to the system's proportional font (Apple SD Gothic Neo on a Mac,
Malgun Gothic on Windows) beside Menlo or Consolas. An installed Korean coding font still comes
first where the browser can use it.
(#2062)
In Safari and Ovis for Mac's window, the terminal measures Nerd Font icons again once their font
arrives, so a late icon font no longer leaves icons sized for the stand-in font.
(#2062)
The terminal sizes icons and Korean from the faces that draw them however their fonts arrive.
Before, two faces arriving together (both Korean weights from the cache in Ovis for Mac's window,
or an icon with Korean) could leave icons drawn across the next cell and Korean enlarged past its
two cells, and one font chunk that failed to load could keep the others at the stand-in's size.
(#2074)
The bundled Korean face is no longer fetched when a Korean font installed ahead of it draws the
text, nor while a terminal font typed in Settings loads, and that font is applied without
waiting for it.
(#2074)
A long IME composition in Direct typing keeps its newest characters in view again: one too long
for the room right of the cursor moves left, and one wider than the terminal shows its end,
instead of being cut off at the right edge.
(#2031 by @yaaayaaa)
The words the bridge writes on an agent's prompt card itself, such as the /goal card's Close, the
omp /handoff card's Cancel, a Hermes result's Dismiss, a fallback card's title and its Yes and No,
and the model pickers' questions, now read in Korean, Japanese and Chinese. What the agent drew
stays as the agent wrote it.
(#1979)
Update and restart keeps the new version when $HOME, or the folder Ovis keeps its state in, is
reached through a symlink (such as /home/<user> linked to another volume). Before, the updated
server went back to the old version after its restart and offered the same update again.
(#2070)
Skills and prompts are found on native Windows when HOME is unset: discovery falls back to USERPROFILE, then the user's home as Windows reports it.
(#2057 by @kyop21)
Connecting a remote PC from Windows no longer hangs at "Checking the remote environment…": the
server now runs Git for Windows' OpenSSH, because the one that ships with Windows never exits
after a remote command prints something when the server starts it. OVIS_SSH picks another ssh. Git's ssh does not read Windows' ssh-agent service: setup asks for a password or a
key file's passphrase instead, once, and the app key makes later reconnects unattended.
(#1989)
Maintenance
The check slot tests take their lock ports below 32768, under the ports Linux, macOS and Windows
hand out on their own by default, so a neighbouring test's server can no longer take a ticket
port and shift the queue; the ticket desk wait is measured on a clock of the test's own instead
of the host's speed.
(#1978)
The Grok exact store lookup tests wait until their fixture process runs its own script before
reading its open files, so a loaded CI runner no longer fails them at random.
(#2011)
The terminal insert contract test reads its recorder's log again until a deadline instead of
waiting for a file watch event, which Bun could miss for the last write, and a timeout now names
what the wait was for and how much text arrived.
(#1988)
The Settings pages demo regression waits for a phone's sheets (Settings, the command palette) to
finish rising before it clicks in them, so a loaded runner no longer clicks beside Settings' close
button and times out.
(#2032)
The status hub's OpenCode subagent tests give their stand-in device store the pairing listener
the hub now subscribes to, so they run again on main.
(#2040)
The Windows plugin tests remove their scratch folder again while Windows still holds a file in
it for a moment after the processes they started are gone, instead of failing a passed test on EPERM.
(#1982)