All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.4.1 - 2026-07-15
- Targeted
get_app_statescreenshots now crop to the resolved target window, and refuse the full-desktop fallback when a target was requested but window bounds cannot be resolved or the window is entirely off-screen. (#48) - Hyprland window bounds are normalized against each window's monitor origin and fractional scale so portal screenshot coordinates align on multi-monitor and scaled (e.g. 1.8x/2.0x) setups. (#48)
- Wayland sessions are recognized via
WAYLAND_DISPLAYwhenXDG_SESSION_TYPEis unavailable, so the portal input fallback engages in environments that don't export the session type. (#48) - Window focus verification now allows up to one second for compositor workspace/focus transitions before reporting activation failure. (#48)
0.4.0 - 2026-07-15
- Generic X11/EWMH window backend so
list_windows,focused_window,activate_window,move_window, andresize_windowwork on X11 window managers without a dedicated backend (Cinnamon/Muffin, MATE/Marco, Xfce/xfwm4, Openbox, and others). (#41) - Pi coding agent extension package:
pi install npm:@agent-sh/computer-use-linuxnow provides Linux desktop control tools throughpi-mcp-adapter's MCP proxy without a separate pi-specific skill. (#42)
- Hyprland 0.55 exact window focus:
activate_windownow tries the 0.55 Lua focus dispatcher (hl.dsp.focus) first and falls back to the legacyfocuswindowdispatcher on older releases. (#45) - Exported MCP tool schemas no longer carry the non-standard
uint/uint8/uint16/uint32/uint64/usizeformatannotations emitted byschemars, which produced repeated warnings in MCP clients; integer types and numeric constraints are preserved. (#45) - GNOME extension package bootstrap on Ubuntu no longer tries to install the
nonexistent
gnome-shell-extension-toolapt package;gnome-shellis installed only whengnome-extensionsis missing and apt can provide it. (#40)
0.3.1 - 2026-07-03
- A scroll with a window target but no x/y/element_index focused the window and then scrolled whatever sat under the cursor while reporting success. Window-targeted scroll now defaults its point to the centre of the resolved window (and errors with a pass-x/y hint when bounds are unavailable). Scroll results also gain the same off-screen coordinate warning click already had.
0.3.0 - 2026-07-03
- Exposed a focused Rust library surface for downstream diagnostics, accessibility snapshots, screenshots, and server integration while preserving the existing CLI binaries and standalone naming. (#35)
- Input-landing feedback: targeted keyboard input results append focused-element feedback from AT-SPI and warn when no editable element holds focus.
- Off-screen detection: screenshot, click, and input results warn when the target window or coordinate is partially or fully off-screen.
- Window geometry tools:
move_windowandresize_windowvia the GNOME Shell extension backend.
0.2.9 - 2026-06-22
- GTK4 applications (Nautilus, Text Editor, baobab, and others) now return their
full accessibility tree instead of a single
role: "unknown"root withchild_count: 0. Reads were routed through theatspiP2Ptrait'sobject_as_accessible, whose no-peer fallback builds a proxy with a path but no destination; on the shared a11y bus that fails withServiceUnknownfor any app that does not advertise a peer-to-peer bus address. Modern GTK4 apps do not implement the legacyGetApplicationBusAddress, so they hit the broken fallback while GTK3/Chromium/Electron apps kept working. Reads now useObjectRefExt::as_accessible_proxy, which always pins the destination to the object's bus name. (#31)
0.2.8 - 2026-06-17
- Published a metadata-only patch release so local and downstream consumers can
pin the already-validated
computer-use-linuxpackage state.
0.2.7 - 2026-06-16
- Window-relative clicks now require a verified target window and resolved bounds before coordinates are translated, preventing clicks from silently landing against stale or originless window data.
- Long
ydotool type --file -input now gets a bounded timeout with both a fixed process budget and a text-length budget while stdout/stderr are drained asynchronously. - KDE clipboard text input now uses the session DBus API directly and waits long enough for large paste payloads before restoring the previous clipboard; Klipper proxy creation and method calls share the same bounded DBus timeout.
- Failed accessibility tree extraction clears cached nodes so later element-targeted actions cannot use stale coordinates.
- The COSMIC helper source path and runtime override surface now use standalone
computer-use-linuxnaming only.
0.2.6 - 2026-06-06
- Screenshots now work from background processes (systemd user services,
non-interactive parent shells) on GNOME Wayland. The GNOME Shell DBus method
rejects callers that do not own an allowlisted bus name, and the XDG portal
cancels non-interactive requests when there is no foreground window, so both
prior backends failed in that context.
gnome-screenshotis now a third capture fallback that works regardless of session context, bounded by a 20s timeout so a hung capture degrades to a clear error instead of blocking.
COMPUTER_USE_LINUX_SCREENSHOT_BACKENDto force a single screenshot backend (gnome-shell,portal, orgnome-screenshot), skipping the fallback chain for pinned/background deployments and debugging.doctornow probesgnome-screenshotand lists it undercapabilities.screenshotwhen present.
0.2.5 - 2026-06-05
- Added build-time GNOME extension / DBus identity overrides (
CUL_*) so thecodex-desktop-linuxembedded copy can share this source while keeping its Codex extension identity, plus runtimeCODEX_COMPUTER_USE_*aliases for the embedded input/backend knobs.
- Cross-referenced the sibling
agent-workspace-linuxproject in the README.
- Bounded screenshot payloads by default before returning them to MCP hosts, while exposing opt-in screenshot sizing controls and coordinate metadata for downscaled captures.
- Added opt-in JPEG screenshot output with a caller-selected quality so agents can choose compression before the byte cap forces additional resizing.
- Ported downstream Linux readiness fixes:
doctornow treats direct/dev/uinputand the XDG RemoteDesktop portal as valid development-input backends instead of requiringydotooldin every ready setup. - Ported downstream session hydration fixes for X11 launches by carrying
XAUTHORITYthrough environment hydration and checking the same-user namespace init process when it owns the graphical session environment.
- Pinned the release upload GitHub Action to a commit SHA in CI.
0.2.4 - 2026-05-25
Primarily a documentation release that refreshes the crates.io and npm README pages; also bumps the MCP server's advertised version string to match.
- Documented the
screenshotMCP tool and thedoctorcapability map, which were missing from the README tool list and the MCP safety-contract table. - A new "Environment variables" section covering runtime overrides
(
CU_DISABLE_ABS_POINTER, theCOMPUTER_USE_LINUX_FORCE_PORTAL/FORCE_YDOTOOLpointer and keyboard knobs) and the npm wrapper install knobs (COMPUTER_USE_LINUX_BIN,DOWNLOAD_BASE,SKIP_DOWNLOAD,LOCAL_*).
- Stopped pinning explicit versions throughout the docs (README, npm README,
Hermes skill). Install commands are now bare and download links use GitHub's
/releases/latestredirect, so the docs no longer drift on every release. - Dropped the
versionfield from the Hermes skill frontmatter (optional per the agentskills.io standard) so it no longer mirrors the tool version. - Friendlier README opening: warmer tagline and a verb-driven summary, with no sections removed.
install.shnow reads the currentdoctorreadiness schema (.readiness.blockers, empty array means ready) instead of the removed.ready/.checksfields, so a fully provisioned system reports ready instead of always failing the doctor step. Restored theinstall.shexecutable bit. (#9)
0.2.3 - 2026-05-22
- A
sync reminderCI workflow (.github/workflows/sync-reminder.yml) that opens (or updates) acodex-sync-labeled issue when a merge tomaintouches the crate sources (src/**,Cargo.toml,gnome-shell-extension/**), so the change can be propagated into thecodex-desktop-linuxembedded copy with its codex naming re-applied.
- Bumped to establish version-enumeration parity with the
codex-desktop-linuxembedded copy (0.2.3-linux-alpha1). The two crates are kept on the same enumeration on purpose: a mismatch signals that a sync between them is pending.
0.2.2 - 2026-05-21
- Added a uinput absolute pointer (
abs_pointer.rs) that creates a privateABS_X/ABS_Ydevice mapped to the portal screenshot coordinate space, so clicks land at the requested pixel on multi-monitor / HiDPI setups instead of being distorted by pointer acceleration and fractional scaling. Wired intoclick()withydotoolfallback; opt out viaCU_DISABLE_ABS_POINTER. - Added a Hermes-compatible skill tap at
skills/computer-use-linux/SKILL.mdand anagnixCI gate for agent-sh skill/config hygiene. - Added agent-sh project-health files:
CONTRIBUTING.md,SECURITY.md,CODE_OF_CONDUCT.md, andCODEOWNERS. - Synced upstream Linux Computer Use text-input improvements: Wayland remote
desktop portal keyboard sessions, KDE/Plasma clipboard paste fallback for
layout-safe
type_text, and literal keysym typing on non-KDE Wayland sessions before falling back toydotool. - Synced upstream Hyprland/session hydration fixes, including systemd user
environment discovery, common command path hydration,
HYPRLAND_INSTANCE_SIGNATUREinference, and rounded window-id disambiguation.
- Omitted the debug-only
receivedecho field from the generated MCPoutputSchemaforActionOutputandActivateWindowOutput.schemarsserializedOption<serde_json::Value>as the boolean schematrue, which strict MCP clients (mcphub, Claude Desktop,@modelcontextprotocol/sdk'sAssertObjectSchema) reject, failing the wholetools/listresponse. Affectedclick,drag,perform_action,press_key,scroll,set_value,type_text, andactivate_window. (#1)
- Updated repository, release, package, and CI links from
avifeneshto theagent-sh/computer-use-linuxorg repo. setup_accessibilityanddoctornow understand the AT-SPIorg.a11y.Status IsEnabledpath in addition to GNOME toolkit accessibility.
0.2.1 - 2026-05-14
- npm wrapper package (
@agent-sh/computer-use-linux) for Node.js users. It downloads and verifies the matching GitHub release binaries at install time. - Tag-driven GitHub Actions publishing for crates.io and npm using repository secrets.
- CI release gates for locked Rust checks, clippy, tests, private rustdoc, cargo publish dry-run, cargo audit, npm wrapper smoke tests, and an MCP protocol/safety contract check.
- MCP
ToolAnnotationsthat mark read-only observation tools separately from mutating desktop-control tools.
- Switch the COSMIC protocol dependency from a pinned Git revision to the
published
cosmic-protocols0.2.0crate socomputer-use-linuxcan be published on crates.io. - Ship the
computer-use-linux-cosmichelper alongside prebuilt release binaries and install it frominstall.shso COSMIC window targeting works outsidecargo install. - Keep the MCP
serverInfo.versionaligned with the Cargo package version. - Remove unused direct
libcandpngdependencies from the crate manifest.
- Add Hermes Agent CLI setup commands and clarify the registered MCP tool names / toolset.
- Add npm install instructions and fix the prebuilt binary install example to
match the release assets, which are raw binaries with
.sha256files rather than tar archives. - Document the mutating-tool safety contract for MCP hosts and npm users.
- Pin README and npm README install examples to the released
0.2.1packages andv0.2.1GitHub release assets.
0.2.0 - 2026-05-14
- Multi-compositor window targeting: native backends for KWin (KDE Plasma), Hyprland, i3, and COSMIC Wayland alongside the existing GNOME Shell backend. Window listing, focus tracking, and activation now work across all five compositors with automatic backend selection at runtime.
- COSMIC Wayland helper (
computer-use-linux-cosmicbinary) that speaks thezcosmic_toplevel_info_v1andzcosmic_toplevel_manager_v1protocols, used by the main server when running under COSMIC. windowing/crate-internal module consolidating all backends behind a uniformWindowBackendtrait, with a registry that picks the right backend per session.- Datagram ydotool socket support in addition to the existing stream
sockets. Aligns with
ydotoold's newer default and avoids a reconnection penalty per input event. - Raw-keycode keyboard input path for ydotool, fixing keystroke delivery on layouts where the symbolic keysym path was unreliable.
- Compact Linux accessibility trees in
get_app_state— deduplicated redundant container nodes for smaller, more focused snapshots. - Enriched AT-SPI state readback — element states (
focused,selected,expanded,checked, …) now flow through to the response schema forget_app_state.
- Server-side rejection of empty window-backend results (returns a structured "no backend available" error instead of an empty list).
- Stale-client eviction in the chrome-extension host path on backend side (host binary itself not shipped here — see Removed).
codex-chrome-extension-hostbinary is intentionally not shipped in this fork — it is a Chrome native messaging host scoped to Codex browser automation (com.openai.codexextension), unrelated to the computer-use MCP. The cosmic helper binary is renamed tocomputer-use-linux-cosmicto match the project naming.
- This release tracks
ilysenko/codex-desktop-linuxthrough commit4d6fd96(May 2026), then re-applies the rebrand (DBus names, env vars, GNOME extension UUID, cache-file prefixes). Upstream credit goes to ilysenko, mosesmrima, PinguuSS, and the original Codex contributors.
0.1.0 - 2026-05-13
- Initial public release as a standalone repository, extracted from
codex-desktop-linux-local-stack. - Linux Computer Use MCP server (
computer-use-linuxbinary) speaking rmcp over stdio. - 15 MCP tools:
doctor,setup_accessibility,setup_window_targeting,list_apps,get_app_state,list_windows,focused_window,activate_window,click,drag,scroll,press_key,type_text,perform_action,set_value. - AT-SPI accessibility tree with semantic element selectors (role / name /
text / states) for
click,perform_action, andset_value. - GNOME Shell window targeting via the bundled
computer-use-linux@avifenesh.devShell extension (DBus servicedev.avifenesh.ComputerUseLinux.WindowControl), with automatic fallback toorg.gnome.Shell.Introspectwhen the extension is not installed. - Screenshot capture through GNOME Shell DBus (preferred) and
org.freedesktop.portal.Screenshot(fallback). Supports full-screen, per-app, per-window, region, and per-element scopes. - Input synthesis through the Wayland remote-desktop portal when available,
falling back to
ydotool/ydotooldfor keystrokes and pointer events. - Best-effort terminal-window enrichment: maps each terminal window to its
active TTY and foreground process for targeted
type_text/press_key. doctorsubcommand reporting AT-SPI bus health, GNOME Shell introspection status, extension status, ydotool socket readiness, and portal coverage in a single JSON document.
- Wayland-first; X11 best-effort through AT-SPI + ydotool.
- Validated against GNOME 50.1 on Wayland (Ubuntu 25.10).
- KDE / Sway / Hyprland untested — see README support matrix.