Releases: giuliastro/harness-remote
Release list
Harness Remote v3.0.1
Release
Stable release of Harness Remote 3.0.1: the Android APK below, plus unsigned Windows, macOS and Linux desktop builds attached by the desktop workflow.
Harness Remote 3.0.1 is a focused stability patch for the 3.0 Session-first release.
Highlights:
- Fixed the Electron/Desktop connection path so WorkspaceMachine profiles, machine discovery, authorization and agent routing work reliably after restart and on localhost/LAN.
- Fixed OpenCode transient provider interruptions so automatic retries do not create false terminal banners or leave stale lifecycle state.
- Fixed OpenCode terminal provider/model failures that could leave Activity and the Session list stuck on Working until the user navigated away and back.
- Kept the routed Harness and Model controls compact and visually grouped.
- Bounded ACP per-Session auxiliary state alongside transcript eviction, preventing long-running daemon memory growth as more Sessions are opened.
- Hardened ACP snapshot persistence and Session deletion cleanup, including filesystem timeout and orphan temporary-file handling.
- Updated hosted web-app/CORS guidance and hardened the automated release builder dispatch.
Validation:
- Full web type-check and regression suite.
- Bridge suite on Linux, macOS and Windows.
- Chromium product smoke, including the OpenCode transient-retry and terminal-provider-error scenarios.
This patch contains no intentional compatibility break from Harness Remote 3.0.0.
Notes
- Built from
296a24f76f9c9ec6c3d40c44d98dcd3775addca9 - Version code
30001
Full changelog: v3.0.0...v3.0.1
Harness Remote v3.0.0
Release
Stable release of Harness Remote 3.0.0: the Android APK below, plus unsigned Windows, macOS and Linux desktop builds attached by the desktop workflow.
Harness Remote 3.0 is the official Session-first release.
Highlights:
- Native Session-first architecture: Machine → Project → Native Session.
- Control Codex CLI, Claude Code, OpenCode, Oh My Pi and PI from one local-first surface while preserving each harness's native transcript and behavior.
- Discover and continue Sessions created outside Harness Remote.
- Same-machine cross-harness continuation with durable lineage and explicit transferred context.
- Desktop, web and Android Session UX with live status, model selection, Stop, rename and deletion.
- Hardened PI live/journal reconciliation so failed-model errors appear immediately and recovery does not duplicate the next response.
- Hardened OMP live/replay reconciliation so refreshes do not duplicate assistant replies while reasoning/tool activity remains intact.
- Session deletion now shows an in-row transition without blocking or spinning the whole machine.
- Bounded transcript caching and Session-first discovery keep large histories from turning navigation into a memory problem.
- Harness Remote remains local-first: source code, credentials, subscriptions and native Session persistence stay on your machines.
This release promotes the validated v3 checkpoint to main. README.md and repository documentation are the checkpoint versions.
Notes
- Built from
e2fa3d43bcec91216b2462f5d133e947fba667f8 - Version code
30000
Full changelog: v2.11.1...v3.0.0
Desktop repair
Desktop repair build: `9b0cb620f28e36806798253d7b2ee36389e13a07`
The Windows, macOS and Linux assets were rebuilt after fixing Session-first WorkspaceMachine → Electron registry synchronization and machine-scoped harness routing. The Android APK is unchanged.
Desktop repair
Desktop repair build: `6ba9e41813d5d3d0ff4bd7a2d9b86c305eb31de9`
The Windows, macOS and Linux assets were rebuilt after fixing Session-first WorkspaceMachine → Electron registry synchronization and machine-scoped harness routing. The Android APK is unchanged.
Harness Remote v2.11.1
Harness Remote 2.11.1
Harness Remote 2.11.1 is a bug-fix release for the 2.11 line. It repairs three ways a session could look emptier than it was, and restores per-agent routing in the Desktop application.
Highlights
- Show the full conversation when opening a task session after a daemon restart, instead of the single prompt recorded at launch.
- Route every Desktop server profile to the agent it selected, instead of sending them all to the machine's primary agent.
- Report the provider's own reason when a turn fails, instead of leaving the prompt followed by nothing.
- Recover a task session's transcript on harnesses that keep no journal of their own, which previously had no path back to it at all.
- Collapse repeated identical failures from a retried turn into one.
Task session history after a daemon restart
Opening a task session after restarting the daemon showed the one prompt recorded when the task was launched, and nothing else, until a new message streamed in and filled the rest of the conversation.
The daemon adopts every known task session at startup so a thread another client holds open can still be prompted without session/load. That adoption also marked the session's in-memory transcript complete, which meant the harness's own rollout or journal was never read. Adoption is now tracked separately: it grants the right to prompt, and history still comes from the harness until the bridge runs a turn of its own on the session.
Codex was the harness this was reported against, because every Codex task session behaved this way. PI was unaffected only because its loader is already marked authoritative and bypasses the affected path. Claude Code, which keeps no journal for the bridge to read, now replays an adopted session over ACP — a recovery path adoption previously prevented outright.
This release also stops two loads of the same session from overlapping. A transcript-only load and a config-options load both rebuild the session's message list, and the client asks for both every time a session is opened, so a caller that wanted only the transcript could read a half-rebuilt one.
Desktop agent routing
In the packaged Desktop application every saved server listed the same sessions: those of the machine daemon's primary agent.
A profile's agent id is what scopes its requests to one agent behind the shared machine endpoint. The Desktop main process was discarding that field when it validated a profile, leaving it with a machine-root target for every server, and the daemon routes an unscoped request to its primary agent. The Web client was unaffected because it builds its own URLs and never lost the field.
The main process now keeps and validates the agent id, and treats a change of agent as a real change so the event stream follows it. The compatibility header the daemon uses to correct a wrongly-scoped request is now shared by the browser, Desktop and Android request paths rather than being sent by the browser alone, which is what allowed the two clients to disagree in the first place.
Existing Desktop profiles repair themselves on the next launch; no reconfiguration is needed.
Failed turns
A turn that fails carries the provider's message on the envelope rather than in the reply, and nothing displayed it. The prompt was followed by nothing at all — the same thing a session with a broken transcript looks like, which is why two unrelated causes were reported as one problem.
- The Oh My Pi and PI journal readers keep a failed turn instead of discarding it for having no content, and carry the provider's sentence with it.
- A live ACP turn failure is recorded on the transcript rather than only announced once, so it is still there when the session is reopened.
- The client renders the reason inside the bubble, and folds consecutive identical failures together, since a harness that retries a failing turn records one failed message per attempt.
Also fixed
- A duplicate React key in the session sidebar, where one project directory legitimately produces several groups.
Validation
- web type-check and production build
- web regression tests
- desktop transport and profile registry tests
- bridge test suite
- runtime validation against a live machine daemon with Codex CLI, Claude Code, Oh My Pi, PI and OpenCode: per-agent session lists verified distinct from both the Web and Desktop clients, task session transcripts verified complete before and after a daemon restart, and a live turn verified not to duplicate or lose history
Harness Remote v2.11.0
Release
Stable release of Harness Remote 2.11.0: the Android APK below, plus unsigned Windows, macOS and Linux desktop builds attached by the desktop workflow.
What's Changed
- One server per machine, instead of one public server per harness. A machine daemon discovers the supported agents installed on the host — OpenCode, Codex CLI, Claude Code, Oh My Pi and PI — and exposes all of them behind a single Harness Remote endpoint. The client picks the harness and the model it wants. Remote setup stops multiplying with the number of harnesses you use.
- Managed OpenCode no longer leaks its plumbing into the settings. It runs on an internal loopback server, and its internal host and port are no longer something you configure: the public daemon port, normally
4097, is the only one you enter. - Model discovery is scoped to the selected agent and travels through the same machine endpoint as everything else, so the catalog you see belongs to the harness you are actually talking to.
- The same server profiles work from Desktop and Android. Browser clients still need their exact origin allowed with
--cors, because credentialed CORS cannot use a wildcard; native clients need no CORS configuration at all. - Attach images to a prompt on the Oh My Pi bridge, from both the desktop and mobile composers.
- The app ships in Simplified Chinese, alongside English, Italian and Traditional Chinese.
- PI is a much better citizen. Sessions carry their native titles and rename metadata instead of a shared placeholder, history is read from the journal PI already keeps, streamed Markdown and replayed text fragments render as one message, and a failed or retried provider call no longer leaves the transcript disagreeing with the journal. Windows behaviour is steadier throughout.
- Provider errors say what went wrong. An ACP backend's actionable detail used to be swallowed and reported as a generic internal error; the message now reaches the screen.
- Session replay and history merging are faster, by trimming the common prefix before the expensive merge rather than running it over material that already matches.
- A new app icon, across the launcher, the browser tab, the installed web app, the desktop packages and the splash screens. The previous one was a wordmark that lost its detail at the sizes an icon is actually seen at.
- The task structure that 3.0 will run on is built and shipping in this release. Harness Remote 2.11.0 carries a working task layer under the hood: tasks are persisted per machine with a real lifecycle — draft, starting, running, completed, failed — enforced by the store rather than assumed by the caller, so a task cannot silently skip a state or enter a terminal one twice. Each task owns a run, and a run owns its agent session, which gives the explicit task/run/session relationship the next generation needs. A task can execute in its own isolated Git worktree, and what the run changed can be inspected afterwards — branch state, commits ahead and behind the source. Runs are reconciled when the daemon restarts: a task that was mid-run is adopted back together with its agent session, or marked failed with a reason, instead of hanging as permanently running. New tasks remember the model you last used, per machine and per agent. Malformed task state is set aside and preserved rather than discarded.
- What that means for 3.0, TaskDesk. The next generation grows the project from a remote session controller into a task manager for coding agents — a machine-centric home, projects as first-class entities, per-task harness and model selection, and finish, review, cleanup and reopen flows. The interface that drives all of the above is deliberately not wired into the shipped app yet: it stays behind a development-only flag, so 2.11.0 changes nothing about how you work today while the foundation it will stand on is already in place and under test.
- A lot of bugs are gone. 45 of the 193 commits in this release are fixes, most of them found while stabilising the multi-agent architecture against real harnesses on Windows, macOS and Android. The ones worth naming are below.
Fixes
- Saved server profiles survive an upgrade. Legacy profiles are preserved and migrated on reload rather than quietly rewritten, and the setup wizard no longer saves PI and Oh My Pi as Codex.
- Sessions go to the harness you chose. OMP and PI route to their own harness, the selected harness travels with the request, and the speculative fallback that could silently land a session on Codex is gone. Session state is isolated per machine and harness, so two servers no longer share one another's sessions.
- The first-run wizard works from a clean install again, and a manually entered server name is kept instead of being overwritten by discovery.
- The connection test reports the real backend when it is talking to a machine daemon, rather than a mismatched one.
- The model catalog answers in bounded time. Its refresh has an authoritative timeout, cold startup is allowed to finish, the catalog's own bookkeeping session no longer appears in your session list, and a persisted catalog session is hidden until it has been refreshed.
- The completion sound waits for the session to actually finish instead of firing at the first quiet moment.
- Android opens OpenCode sessions again, with session folders scoped to the right server.
- Settings stays open while PI replays its history, and the replay completes instead of stopping short.
- Message and session action menus draw above the composer rather than behind it.
- An HTML response during task discovery is explained instead of surfacing as an opaque parse failure.
Contributors
- A big thank you to @luccapinto (Lucca Pinto) for image attachments on the Oh My Pi bridge — the protocol plumbing, the composer work, and the test coverage behind both.
- A big thank you to @joyfish666 (Wang Huanyu) for the Simplified Chinese translation, for making Enter insert a new line on touch devices where it used to send, and for lifting the message and session action menus clear of the composer.
- A big thank you to @Baylar55 (Baylar Sadigov) for making history merge replay faster by trimming the common prefix before the merge runs.
- A big thank you to @giuliastro (Giulio Ardoino) for the unified multi-agent architecture and the machine daemon, the task layer behind TaskDesk 3.0, the harness routing and profile migration work, the PI integration, the model catalog bounds, the app icon, the long tail of fixes, the documentation, testing, and release integration.
Notes
- Built from
ffac6c7118b3bfa2dd4150ed8696c924f36c154a - Version code
21100
Full changelog: v2.10.3...v2.11.0
Harness Remote v2.10.3
Release
Stable release of Harness Remote 2.10.3: the Android APK below, plus unsigned Windows, macOS and Linux desktop builds attached by the desktop workflow.
What's Changed
- A new app icon, on white, in the launcher, the browser tab, the installed web app, the desktop packaging and the splash screen.
- The mobile interface holds up under a keyboard and a poll. Five things reported from a phone, which came down to three causes — a test button the keyboard could take away, a summary row that could not wrap, and an app too busy to answer a tap.
Fixes
- The connection test is reachable with the keyboard open. It sat at the end of a panel that scrolls, so the keyboard pushed it out of sight and up against the save button. It now has a strip of its own that the keyboard cannot take, the wizard gives up its own padding before it gives up either button, and the step markers are buttons — a failed test is usually the address, not the password.
- A long "thought for…" summary no longer escapes its row. It could not wrap, so it pushed the row wider than the screen and took the page with it: the jump-to-top and jump-to-bottom buttons went off the right edge and the composer was cut off, recoverable only by pinch-zooming. Four other rows that list a name or a path now end in an ellipsis rather than running past their edge.
- Opening a chat no longer freezes the app. A refresh was asking for sessions and statuses once per project directory when one request covers them all, and asking repeatedly for endpoints the bridge does not implement — well over a hundred requests every eight seconds. Each refresh also rebuilt the whole transcript for data that had not changed. Same session, same window: 126 requests down to 45, and nine stalls totalling nearly a second down to one.
- Controls answer the first tap. Most of that was the app being busy, and the rest was every tap being held back until the browser had ruled out a second one.
- A chat that fails to open says so, and recovers. It used to spin with no explanation. It now reports the reason and offers a retry, retries once quietly before reporting anything at all, clears itself when a later refresh succeeds, re-fetches the model list it lost, and no longer leaves the sessions list with nothing selected.
Contributors
- A big thank you to @giuliastro (Giulio Ardoino) for the new icon, the mobile fixes, the measurements behind them, and the release.
Notes
- Built from
62ed05a76c45a5d3f82d7a3e6ad648ec8d024f81 - Version code
21003
Full changelog: v2.10.0...v2.10.3
Harness Remote v2.10.0
Release
Stable release of Harness Remote 2.10.0: the Android APK below, plus unsigned Windows, macOS and Linux desktop builds attached by the desktop workflow.
What's Changed
- Codex CLI is now a supported harness. It connects through the same bridge as the other ACP backends, using the official
@agentclientprotocol/codex-acpadapter. The adapter embeds@openai/codex, so nothing else needs installing, and the bridge signs in with the ChatGPT method — acodex loginon the host machine is all it wants. Sessions, streaming, cancellation, queued follow-up prompts, plan updates, model selection and slash commands all work; the README section covers setup and the per-backend limits. - Conversations open in the Codex desktop app are readable here. Codex allows one writer per conversation and holds the lock for as long as a client keeps it open, so those sessions cannot be joined over the protocol — which is most of the ones worth reading from a phone. The bridge shows them anyway, from the transcript Codex already keeps on disk, and they carry on updating as Codex works. They stay read-only, and the app labels them as started by another client.
- A redesigned interface on desktop and mobile. A grouped sidebar, a command palette, a server switcher in the header, and a connect wizard that hands you the exact command to paste on the machine running the agent, filled in with the address and credentials you just typed.
- A real application menu on macOS, drawn by the system rather than the page, with the shortcuts where a Mac user expects them.
- The browser keeps its own keyboard shortcuts.
Ctrl+RandCtrl+Fused to be taken by the app in a browser tab, costing you reload and find-in-page — the two keys people reach for when something looks stuck. They now bind only in the packaged desktop app.
Fixes
- A session whose history failed to load left the transcript spinning with no explanation. It now says what went wrong and offers a retry, and clears itself as soon as a later refresh succeeds.
- Loading a session's transcript and its model list at the same time — which the app does on every open — could make one failure sink both, so a session the harness would not fully open could not be opened at all.
- Bridge errors reached the screen as raw JSON. They read as sentences now, including the detail Codex hides behind a bare "Internal error".
- The model picker vanished when its list could not be fetched, hiding a control every other session has instead of saying why.
- Sheets kept their phone styling on desktop and opened flat against the bottom of the window; they are centred dialogs there now, and unchanged on a phone.
Contributors
- A big thank you to @giuliastro (Giulio Ardoino) for the Codex backend and its disk-backed history, the interface redesign, the macOS application menu, the keyboard-shortcut and session-loading fixes, the documentation, and the release.
Notes
- Built from
9919e02b058c2880817787cb146dd688da15c94d - Version code
21000
Full changelog: v2.9.0...v2.10.0
Harness Remote v2.9.0
Release
Stable release of Harness Remote 2.9.0: the Android APK below, plus unsigned Windows, macOS and Linux desktop builds attached by the desktop workflow.
What's Changed
- Harness Remote is now an installable desktop app, for Windows, macOS and Linux. It packages the same UI the web app uses inside an Electron shell that keeps every network target in its main process: the renderer can name a saved server profile but never a URL or a header, profiles are validated and stored outside it, and navigation, popups, downloads and permission requests are all denied. Because the main process owns the HTTP and SSE traffic, the installed app needs no CORS configuration on your OpenCode server or bridge. A session that finishes while you are working elsewhere raises a native notification.
- The desktop layout fills the window. It used to sit in a fixed column in the middle of a wide screen, with dead space either side and no way to use it but dragging the panel borders out by hand. The chat pane now takes all the room the sidebar leaves, and the conversation stays in a readable column at its centre rather than running prose the whole width of a large display.
- Every release now carries all three desktop builds. A Windows installer, macOS disk images for Apple Silicon and Intel, and a Linux AppImage and deb, attached to the release next to the Android APK. None of them are signed, so the first launch needs a deliberate override — the README explains how per platform.
- OMP undo and redo are documented for non-Git workspaces, where
@baylarsadigov/omp-undo-redo1.2.0 restores supported file changes as well as the conversation.
Contributors
- A big thank you to @Baylar55 (Baylar Sadigov) for building the desktop app: the main and preload processes, the main-process HTTP and SSE transports, the validated profile registry and its persistence, the regression suites covering all of it, and the packaging setup — and for documenting non-Git undo and redo support for OMP.
- A big thank you to @giuliastro (Giulio Ardoino) for the window-teardown and cross-platform main-process fixes, the full-window desktop layout, the macOS and Linux release builds, documentation, testing, and release integration.
Notes
- Built from
e3257ccec595393f6f8e23b581d047b70915509f - Version code
20900
Full changelog: v2.8.0...v2.9.0
Harness Remote v2.8.0
Release
Stable Android release APK for Harness Remote 2.8.0.
What's Changed
- OMP slash commands and skills are now available in the app. The bridge exposes the harness command catalog, routes selected commands back to the active session, and refreshes the catalog after a session loads so commands are also available after a cold start.
- Live mobile conversations stay pinned to the latest message. When the reader is already at the bottom, incoming messages remain visible automatically without requiring a manual scroll after every update.
- Mobile chat spacing and session navigation are more reliable. The transient empty area above the composer is gone, and returning to the sessions list restores and centers the session that was just open.
Contributors
- A big thank you to @noamsiegel (Noam Siegel) for bringing the OMP command and skill catalog into the app and making it refresh reliably after session loading.
- A big thank you to @giuliastro (Giulio Ardoino) for the mobile scrolling, composer spacing, session-return fixes, testing, and release integration.
Notes
- Built from
d55d4d9e332606d18114638dee1f80fcc9aea968 - Version code
20800
Full changelog: v2.7.0...v2.8.0
Harness Remote v2.7.0
Release
Stable Android release APK for Harness Remote 2.7.0.
What's Changed
- Undo and Redo are always within reach. The actions now have a native place in the conversation
header, including after an Undo has left the transcript empty. OpenCode and OMP report their
availability from the source of truth, so a disabled action is not presented as usable. - OpenCode permission prompts reach the app. A session that asks for permission no longer waits
indefinitely with no way to answer. The app shows the request and its paths, with Allow once,
Allow always when supported, and Deny. Updates arrive immediately from the event stream. - OMP actions work outside a Git worktree. The bridge reads the extension's authoritative action
state, preserving Undo and Redo where the older Git-derived guess could not. - The mobile conversation header takes less space. The session action menu shares the back row,
and an editable session title no longer inserts an empty line before the directory. - Message actions are more reliable on touch devices, and the bridge's history/replay handling keeps
the session timeline and action state in sync.
Contributors
- @Baylar55 (Baylar Sadigov) — OMP extension-backed actions and the
bridge state that makes them reliable outside Git. - @gervaso-assistant (Gervaso) — mobile message-action
reliability and the OpenCode permission-prompt flow. - @giuliastro (Giulio Ardoino) — native history actions, OpenCode
action integration, the mobile header refinements, and release integration.
Notes
- Built from
519d9b8b99f456ac76e554fd51e2f03ae0c40135 - Version code
20700
Full changelog: v2.6.0...v2.7.0
Harness Remote v2.6.0
Release
Stable Android release APK for Harness Remote 2.6.0.
What's Changed
- Several servers, saved under names of your own. Settings keeps a list instead of one host per
harness: add a server, name it, and switch between them from the picker in the header. Deleting one
asks first, since a host, a username and a password go with it. - Thinking and tool calls arrive as their own steps. The bridge used to flatten an agent's turn
into a single block of text, so what it thought and what it ran reached you as prose. Both now come
through as parts of their own, and the transcript groups them the way OpenCode sessions already
looked. - Copy a message. Right-click it, or long-press on a phone, and take its text or its markdown. On
a run made of several messages you get the whole run, the way it reads on screen. - A session waiting on something reads as working. A harness that reports a session as waiting —
on a subagent, for instance — no longer leaves it in the list looking idle: it carries its own pill,
and on a wide screen a marker of its own, so it is not mistaken for a session running its own turn. - A tool that has been called but has not received its arguments yet says which tool is preparing,
instead of presenting an empty call as one that already ran. - The port field in Settings can be cleared and pasted into, instead of snapping back to a zero you
have to type over. - A bridge error that is not JSON reaches the screen as its own text. It used to be swallowed and
shown as the bare HTTP status, because the response body was read twice. - The bridge answers Chromium's private-network preflight, for the origins it was started with under
--cors, which is what the hosted app needs to reach a bridge onlocalhost. - Settings no longer warns that a browser will refuse a plain
http://server unless it runs on the
same device. It claimed more than browsers actually do, and it was in the way of setups that work.
Contributors
- @gervaso-assistant (Gervaso) — special thanks: saved
servers, the waiting state, the message copy menu, the preparing-tool state, and the bridge work
that keeps thinking and tool calls intact. Nearly everything this release adds.
Notes
- Built from
18a31f30086fdc53eadcad070b3f03c7d852df22 - Version code
20600
Full changelog: v2.5.0...v2.6.0