Desktop, RDP, and Citrix
How do I automate a desktop or Citrix app that has no API?
OpenAdapt compiles a demonstration into a program. The program reports VERIFIED only if an independent check agrees. You record the desktop or Citrix task on a machine you control. The compiled program clicks and types through the same window an operator uses. Nothing has to be installed inside the remote session.
pip install openadapt
openadapt quickstart
If an API exists, use the API. Keep Playwright for a browser you can script. Keep a computer-use agent for a novel task you have not demonstrated. OpenAdapt is the remaining case: a repeating write trapped in a native window, an RDP session, or Citrix Workspace.
Record beside the window, not inside it
The shipped --backend citrix path binds the exact Citrix Workspace window and runs the same identity, effect, and halt contracts as a local desktop app. OpenAdapt sits on the customer-controlled machine next to Workspace. It sees pixels, keyboard, and mouse. The independent check still reads whatever channel the target system exposes: a read-only API, a database, a file, or a second session.
Qualification is narrower than the capability. The accepted Citrix artifact records ica_hdx_accepted=false. It qualifies the Workspace-window backend over a no-DOM canvas stand-in, not a counted real ICA/HDX batch. Qualify the exact client, application, display, and workflow before you treat a run as consequential. status.json carries the current evidence URLs.
A halt on a look-alike window
Two Workspace windows can look the same. If the program cannot bind the exact window it recorded, it stops. Same for a live record that doesn't match the demonstrated identity. The screen can still say Saved. VERIFIED waits for the independent check. See the wrong-patient defense
Try the local program first
The quickstart compiles a synthetic browser workflow and checks the saved record out of band. Desktop and Citrix use the same program contract after you record your own app.