Enable Programatic iOS App Control for Human and AI Alike
README
ButtonHeist lets agents and tests drive iOS apps by accessibility intent instead of screen coordinates, then returns receipts that say what changed.
It turns the app's accessibility contract into a live world model: ButtonHeist's current settled view of controls, roles, values, actions, and evidence after each move.
The goal is not "I tapped something." The goal is "the app accepted the intent, and here is the evidence."
When an iOS app exposes accessibility well, it already explains itself. Labels name things. Traits describe controls. Values and state say what changed. Actions and rotors say what can happen next. VoiceOver renders that contract through speech and gesture; ButtonHeist renders it as structured text, typed intent, and receipts.
The core trick is small:
capture settled accessibility state
-> perform typed intent
-> capture settled accessibility state
-> compute evidence
-> return receipt
Everything else in ButtonHeist is built from this core unit. A direct command is one loop. A heist is a reusable set of ButtonHeist instructions: do these actions, wait for these facts, and keep the receipt. The DSL gives heists