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 haven't tested a real Citrix session yet.

Updated 2026-10-14

The options, in order

  1. An API or import from the vendor. Ask first; it skips the screen entirely.
  2. A database or file interface the vendor supports, such as a scheduled import.
  3. UI Automation on the desktop itself, where the app exposes its controls: more stable than pixels.
  4. 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. In our tests on screens read only as pixels, the right-patient check stopped the right patient 44 to 49 times in 100 when the record number had look-alike characters, such as O and 0. Those are extra stops, not wrong entries.

What we've tested, and what we haven't

SetupStatus
Our own Windows app, through UI AutomationTested: 3 of 3 confirmed by a database read
Our scheduling app over a real remote-desktop connection (FreeRDP)Tested: 3 of 3 confirmed; wrong-patient and changed-screen runs stopped
A stand-in that imitates Citrix conditionsLab only
A real Citrix sessionNot tested yet
A commercial desktop EMR or claims systemNot tested yet

Check every save

In our fault test, 72 of 90 runs left the record wrong. A check that trusted the success banner passed 54 of those 72. One separate read of the record passed 9 of the 72, all of one kind: a write to a table the read didn't cover. These were faults we injected on a test system.

Related: OpenAdapt vs Power Automate · API or screen automation? · the right-record check

Sources

  1. 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.
  2. 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.
  3. OpenAdapt look-alike test set (synthetic rows), 2026: 5 of 5 look-alike patients stopped, 2 of 2 matching patients let through. On screens read only as pixels, 43.6 to 49.3% false stops when the right patient's record number has look-alike characters (O and 0, l and 1).
  4. 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 that trusted the success banner passed 54 of those 72; one separate read of the record passed 9 of the 72. These were faults we injected on a test system.

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.