Skip to main content
The difference between a reliable agent and a flaky one is grounding: acting on structured targets instead of guessed coordinates. VNC only sees pixels; Glasswarp surfaces real UI structure when the app exposes it.

UIA targets

When a Windows app exposes its UI through UI Automation, the host returns sparse click targets with roles, names, and bounds. Host v0.2.14+ also includes popup menus and combo dropdown lists (not just the focused window chrome).
Target ids are valid for the observe / targets response that produced them. Do not persist them across sessions, and re-observe (or call list_targets again) before acting when the screen may have changed — especially lists, file browsers, and tables. Scripts should re-resolve targets each loop, not hardcode ids.

Set-of-Mark (SoM)

Draw numbered marks on a frame so a vision model can pick a target by id instead of estimating pixels.
som_annotate and the grid helpers need the grounding extra (pip install "glasswarp[grounding]", which pulls in Pillow).

The grounding ladder

1

Prefer host UIA targets

Most reliable — real controls with names and bounds.
2

Fall back to CV / grid targets

For canvases and games that expose no UIA, build targets client-side.
3

Use raw coordinates last

click(x, y) still works, but avoid guessing when a target exists.
Continue to Safety and consent and Safe agent sessions.