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.9 - 2026-08-12
- Bounded AT-SPI traversals now use concurrent indexed child reads, count both queued references and failed child lookups against their work budgets, and enforce a snapshot deadline so wide, malformed, or stalled accessibility trees cannot allocate or retain unbounded work.
0.4.8 - 2026-08-12
- AT-SPI state capture now reaches deeply nested GTK4 controls such as Nautilus file cells by using a 1,000-node default budget and depth-32 traversal, with bounded 2,000-node and depth-64 limits shared by the MCP and CLI paths.
install.shnow treats unavailable window-targeting or exact-focus support as a degraded platform capability when MCP registration, accessibility trees, and development input are ready, while missing core prerequisites remain hard failures. The same classification applies whenjqis unavailable.
0.4.7 - 2026-08-09
install.shnow recognizes Artix as pacman-based, chooses an explicitly requested or unambiguous package manager for unknown distros, treats ydotool as an optional fallback, installs the required xdotool keyboard backend on X11, distinguishes pointer-only direct uinput from keyboard-ready input indoctor, reports Wayland RemoteDesktop pointer availability separately from its required keyboard contract, and skips automatic ydotoold setup when a systemd user manager is unavailable.
0.4.6 - 2026-08-05
- Native X11 coordinate clicks now use one supervised
xdotool mousemove -- X Y click --repeat N BUTTONcommand after the absolute pointer and eligible portal paths, withydotoolfallback only whenxdotoolcannot be spawned. Standard left, middle, and right buttons are supported; extended buttons retain the existing fallback path. SetCOMPUTER_USE_LINUX_FORCE_YDOTOOL_POINTER=1to skip xdotool.
0.4.5 - 2026-08-01
- Stateful ydotool operations now complete while retaining the serialized input lock after caller cancellation, preventing paired button or key events from being interrupted. Drag also attempts button release after intermediate failures.
- Scaled KWin sessions now map logical window geometry through the compositor's virtual screen geometry while preserving logical portal input coordinates.
- Hyprland window bounds now map against grim's complete global output union, including negative origins and mixed or fractional scales, and are omitted when monitor metadata is unavailable or invalid.
- Mirrored KScreen outputs are excluded from the portal monitor layout.
0.4.4 - 2026-07-31
- KWin window listing and activation now support both Plasma 6
(
windowList/activeWindow) and Plasma 5 (clientList/activeClient). - ydotool is now used only when its CLI, daemon, and socket support the raw
event semantics Computer Use emits. Compatibility probing works without
XDG_RUNTIME_DIR, uses an isolated private socket, and rejects CLI errors that are returned with a successful exit status. - X11
xdotool typenow disables per-character delay, and a command that starts but fails is no longer replayed through ydotool. The ydotool fallback is limited to failures to launch xdotool, avoiding duplicate partial input.
0.4.3 - 2026-07-31
- Hyprland window activation now checks
hyprctl dispatchstdout instead of trusting its exit status, so an exit-zeroInvalid dispatcherresponse falls through to the compatible focus dispatcher. (#62) - Modifier chords sent through the ydotool fallback now include a 100 ms inter-event delay so applications such as Firefox do not drop simultaneous modifier and key events. (#63)
0.4.2 - 2026-07-25
- X11 keyboard input now goes through
xdotool(XTEST) instead of ydotool. ydotool injects raw evdev scancodes into a virtual uinput device, which X11 re-interprets through the active XKB layout — sopress_key "Return"and chords likectrl+alanded as stray characters, andtype_textmangled symbols and digits (_→%,1→+) even on a plain US layout. XTEST resolves keysyms against the live layout. Wayland behaviour is unchanged, and the ydotool path remains the fallback whenxdotoolis missing or fails.doctornow reports anxdotoolinput backend on X11. Override withCOMPUTER_USE_LINUX_FORCE_YDOTOOL_KEYBOARD=1(opt out) orCOMPUTER_USE_LINUX_FORCE_XDOTOOL_KEYBOARD=1(force on). (#58) - Portal
scrolldirection on KDE Plasma Wayland: vertical discrete axis steps are inverted for the xdg-desktop-portal-kde discrete path sodirection: "up"|"down"matches viewport motion. ydotool / REL_WHEEL polarity is unchanged. Override withCOMPUTER_USE_LINUX_PORTAL_SCROLL_INVERT=0|1. (#56)
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.