Computer-use agents built on LLMs mostly interact with desktop apps the way a person would: they look at a screenshot, figure out where a button is, and click it. Do that a hundred times and you can automate a workflow. But it’s slow, brittle, and expensive. Every click is a round trip to the model. Every misread pixel is a chance for the whole chain to fall apart.
Computer-use agents built on LLMs mostly interact with desktop apps the way a person would: they look at a screenshot, figure out where a button is, and click it. Do that a hundred times and you can automate a workflow. But it’s slow, brittle, and expensive. Every click is a round trip to the model. Every misread pixel is a chance for the whole chain to fall apart.
Some recent work tries to shortcut this by using OS accessibility APIs instead of raw screen coordinates, letting the model say “set this checkbox” instead of “click at (412, 88).” That helps, but it only works as well as the app’s accessibility metadata, which is often incomplete, and it still routes every action through a layer that sits outside the app’s own logic.
That got us asking a more basic question: if the point is to let an LLM trigger application functionality directly, why go through the accessibility layer at all? Under the hood, most GUI controls and accessibility elements are just wrappers around ordinary internal function calls. What if we could recover and call those functions directly?
We use Frida, a dynamic instrumentation toolkit, to hook into a running application, trace what happens when a person performs an action, and recover the actual internal functions responsible, bypassing the GUI and the accessibility tree entirely.
Concretely: attach Frida to a running app, use its Stalker component to record the execution trace while a human performs some action, then map the executed code back to symbols to find candidate functions. Once we’ve identified the right function and understand its calling convention, we can invoke it directly, no clicking required.
We tested this on GIMP, hooking cropping, flipping, and rotating operations. A couple of things stood out:
We gave a computer-use agent (built on trycua/cua, running Claude Code) access to our recovered hooks as an additional tool, alongside its normal GUI-based capabilities, and compared it against a GUI-only baseline on a simple crop-and-save task.
With the hook available, the agent used roughly a third of the tokens and completed the task about 2.7x faster than the GUI-only baseline, averaged over 10 runs.
That’s a small result on a single app and a handful of operations, but it’s a real signal that skipping the GUI/accessibility layers entirely, when possible, is worth pursuing further.
The obvious limitation: we did this by hand, for one application. A useful version of this idea needs some way to automatically discover internal command interfaces rather than a person manually tracing and hooking each function. We see two directions worth exploring:
This started as a comment from Professor Alex Snoeren during a SysNet seminar talk, and turned into a poster that’s now been accepted to SOSP 2026 in Prague. It’s early-stage work, not a finished system, but it’s been a fun rabbit hole to go down, and we’re looking forward to hearing what people think in September.