How do you automate a desktop or Citrix app that has no API?
First ask the vendor for an API, an import or an export. If there isn't one, automate through the screen and check each save with a second read of the record. Over Citrix or remote desktop the tool sees only pixels, so expect more stops on look-alike values. We qualify each workflow on your own setup first.
Updated 2026-10-18
The options, in order
- An API or import from the vendor. Ask first; it skips the screen entirely.
- A database or file interface the vendor supports, such as a scheduled import.
- UI Automation on the desktop itself, where the app exposes its controls: more stable than pixels.
- Screen automation over Citrix or remote desktop, reading pixels, with a second read of the record to check each save.
What changes when the screen is only pixels
Inside Citrix or remote desktop, an automation can't read field names; it sees an image. It has to find fields and values by how they look, which is harder on look-alike characters. On pixel-only screens the right-patient check stops whenever the right patient's own record number has look-alike characters, such as O and 0: on our test corpora, 47 to 61 in 100 correct-patient checks (re-measured 17 Oct 2026). Those are extra stops, not wrong entries.
A confirmed list of the system's record numbers removes most of those stops. On a rendered record list, they fell from 176 to 3 in 280 clicks whose neighboring row wasn't a look-alike twin (synthetic data).
What we've tested
| Setup | Result |
|---|---|
| Our own Windows app, through UI Automation | 3 of 3 confirmed by a database read |
| Our scheduling app over a real remote-desktop connection (FreeRDP) | 3 of 3 confirmed; wrong-patient and changed-screen runs stopped |
| A real Windows 11 computer over remote desktop (RDP) | 3 of 3 |
| A macOS app, through the macOS accessibility interface | 3 of 3 on a synthetic test app |
| A stand-in that imitates Citrix conditions | 3 normal runs checked; 3 changed-screen runs stopped |
All on synthetic records. We qualify each workflow on your own system before it touches a real record.
Check every save
In our fault test, a screen-only check passed 54 of 72 wrong records, and a full database read caught all 72. How the test worked.
Related: OpenAdapt vs Power Automate · API or screen automation? · the right-record check
Sources
- OpenAdapt on our own Windows test app (UI Automation), 17 Jul 2026: 3 of 3 runs with saves confirmed by a database read; missing and ambiguous targets refused 3 of 3.
- OpenAdapt remote-desktop test, 30 Jul 2026: a fictional clinic scheduling app over a real remote-desktop connection (FreeRDP, not Citrix), synthetic patients. 3 of 3 bookings confirmed by a read-only database query; 3 of 3 wrong-patient runs stopped with 0 rows written; 3 of 3 runs on a changed screen stopped. 0 AI model calls.
- OpenAdapt surfaces, openadapt-flow 2.2.0: remote desktop (pixels only) into a real Windows 11 computer, 3 of 3 trials; a native macOS app through the Accessibility interface (TextEdit, synthetic), 3 of 3 trials.
- OpenAdapt look-alike test set (synthetic rows), 2026: 5 of 5 look-alike patients stopped; of the 2 control cases, the right patient was let through and a plainly different patient was stopped. On pixel-only screens the check stops whenever the right patient's own record number has look-alike characters (O and 0, l and 1); on our test corpora that was 47 to 61 in 100 correct-patient checks, re-measured 17 Oct 2026 (IDENTITY_EVIDENCE.md). With a confirmed list of the system's record numbers (openadapt-flow 2.2.0), those stops on a rendered record list fell from 176 to 3 in 280 clicks whose neighboring row wasn't a look-alike twin (KNOWN_IDS.md).
- OpenAdapt fault test, openadapt-flow benchmark/effect_e2e, 2026: faults injected into our own engine on a test record system, 90 runs; 72 left the record wrong. A check of the screen alone passed 54 of those 72; a read-back over the app's REST API passed 9 of them; the full database read caught all 72. A coverage test over a fixed fault list, not a real-world error rate.
See it on your process
Bring one task your team types every day. We'll tell you whether it fits, and what a test on your own system would cover.