github devswha/ovis v0.5.0
Ovis v0.5.0

latest release: beta/v0.5.1-beta.1
one hour ago

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 beta in the state dir's update-channel file (or
    OVIS_UPDATE_CHANNEL=beta), a PC also updates to the beta/vX.Y.Z-beta.N builds 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-codex the
    Codex plan, OmO's anthropic-subscription the Claude plan. A plain anthropic (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 with copilot --ui-server --port=0 may 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 with copilot 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/create and POST /api/tab/create take an optional env object, 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 400 invalid_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/pair with
    Accept: application/json returns 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 own ovis-layout document 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 link signs in to your
    account with a device code and approves the device that adds the PC after comparing six digits,
    and link --code prints 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
    link needs 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 with hc run now 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-core on 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 .cmd file. Claude Code's Ultracode settings file sits in a folder named
    with a space, so a profile folder like R&D still 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. Without OVIS_RUNTIME and 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=herdr or herdr-core picks the runtime by hand. On Windows,
    install.ps1 keeps herdr and says why.
    (#2688)
  • OVIS_IPV6_LOOPBACK=1 adds an IPv6 loopback listener on ::1 beside HOST=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 /sessions or
    /resume is typed there; without that proof the pane keeps its terminal, never another session
    of the folder. Prompts /undo took back are left out of every page.
    herdr-core's kimi-code label maps to kimi.
    (#2615 by @daniel-marthaler)
  • Read Kiro CLI chat on Linux: prompts, answers, tool calls and their results, /clear and /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_PORT opens one on the
    PC's private addresses with a self-signed certificate (or your own via OVIS_LAN_HTTPS_CERT and
    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: type localhost: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 --approve shows 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-watch with detached: true, and a new prompt-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.ts again 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) against relay.ovis.sh and, 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 on relay.ovis.sh too, so phones paired before keep working,
    and a phone that cannot get through a regional relay tries relay.ovis.sh at 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
    into fonts/ 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
    tags role=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 own gh sign-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 finds hc the way the Herdr app does: OVIS_HC_BIN, the
    PATH, the login shell's PATH, then the usual install places such as ~/.local/bin, taking
    only one whose --version says hc, so an unrelated hc from 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 link on 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, and link --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 using app.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 for app.ovis.sh; the newer copy is fetched in the background for the next open.
    (#2845)
  • The Ovis relay at relay.ovis.sh now 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
    • show on hover or keyboard focus, and always on touch. A click on a PC's name folds it too.
      (#2999 by @duytbp)
  • 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 (herdr or herdr-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 /rewind in 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_URL still names another service, and
    OVIS_ACCOUNT_SERVICE_URL=off turns 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 /compact sent from Chat no longer says "Done" when Claude compacts the
    conversation on its own before that /compact runs.
    (#2734)
  • Command receipts stay with the right conversation around /clear and /resume: a /resume back
    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 /clear typed in the terminal
    no longer shows the commands sent since the last Chat /clear in 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)
  • /clear in 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-server yourself, 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 running hc 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 it antigravity, and Ovis now reads
    that as agy.
    (#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 hc cannot be started, as while an update moves it: it
    reports herdr-core as unreachable and connects again once hc is 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 when preferences.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's PATH included, and only after its --version checks 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 imgcat prints (its multipart form) and
    what chafa -f iterm prints (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 --code takes 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)
  • link keeps 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_DIR set 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 /model or /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 /name Pi takes as a message, such as an unknown one or /new please, keeps its receipt.
    (#2659 by @hrudek)
  • A /skill:name sent 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 start or 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 as application/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 link uses 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 /tmp and 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's openai/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.exe runs the session in a child claude.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:types like 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/ovis that 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)

Don't miss a new ovis release

NewReleases is sending notifications on new releases.