TOOL 04 · SHIPPED · FREE · MIT · WINDOWS

glance — the window, as text, as it changes.

Point it at a window. glance reads what is on the screen the way a person does — from the application's own accessibility tree when there is one, from pixels when that is all there is — and turns every change into one line of text with a time on it. It never types, never clicks, never sends a byte anywhere.

Download glance WINDOWS Source
10:26 uia Times / Referral received = 09/03/2026 14:00 10:26 uia Times / Authorization signed = 09/03/2026 17:40 10:26 uia Times / Pronouncement = 09/03/2026 19:05 10:26 pixels Ischemia clock "04:12" (0.90) 10:26 uia Labs / Serology drawn = 09/03/2026 23:50 fact serology_drawn −10 min ← uia:Labs/Serology drawn → caseclock
THE CHANGE LIST, VERBATIMSYNTHETIC CASE · NO PHI
glance iTransplant — TR-4118 · UIA · 3 changes/min · 0 frames kept · 0 bytes sent · Ctrl+L target · Space pause · Ctrl+T pin THE STATUS BAR, VERBATIM
01 — WHY IT EXISTS

The screen is the one integration everyone already has.

On a transplant floor the donor record is a cloud application the OPO does not control and cannot integrate with, often reached through Citrix or RDP where the workstation sees only pixels. Every tool that wants to help a coordinator has to read what the coordinator reads.

On a developer's machine the same is true of every native window an agent cannot see: the build panel, the console, the dialog that is blocking. glance is the honest way to read either — the accessibility tree first, because it is text with names on it; pixels second, only where they changed, with the operating system's own OCR.

WHAT IT NEVER DOES
no handsNo SendInput, no clicks, no keys, no SetForegroundWindow. The build greps the import table and fails if any of them appears.
no networkThe exe links neither Winsock nor WinHTTP nor WinINet. glance --about prints the receipt, read from its own import table.
no framesCaptured pixels live in memory for one hash and one OCR call and are zeroed. Nothing is ever written to disk but text.
no modelA rules file you own turns a label into an event. There is no model in the tool and none is needed.
no verdictglance reports what changed on a screen. The coordinator, the clock and the resident decide.
02 — HOW IT READS

Two readers, one list of changes.

A window that does not change produces nothing: no line, no OCR, no CPU. That residual is the whole trick, and it is what makes glance livable on a machine that is already busy.

READER ONE · THE TREE

UI Automation, the same interface a screen reader uses. glance walks the window once for every control with a name and a value, then watches for property and structure events. Changes arrive as events, not polling, so an idle window costs nothing at all.

Chromium and Electron expose their DOM this way once a client asks; WPF, WinUI and most Win32 controls expose names and values natively. Median 18 ms from a value changing to a line, and 32 ms at worst on a fully loaded machine.

READER TWO · THE PIXELS

Where the tree is empty — Citrix, RDP, a canvas, a custom-drawn grid — glance duplicates the desktop, cuts the window into tiles, keeps a difference hash of each, and runs the OS's OCR only on the bands that moved.

A change is read twice before it becomes a line, so a window caught mid-repaint never prints half-drawn text. Recognition runs on its own worker, so a slow read never blocks the next frame. Median 44–183 ms.

ON A REAL REMOTE SESSION

Asked to read a live Remote Desktop window, glance finds this in the accessibility tree:

Window "localhost — Remote Desktop" Pane "Input Capture Window" Pane "Output Painter Window" ← 0 fields

Every value on the far side lives inside one painter window. That is exactly the case pixels exist for, and it is why the second reader is not optional.

03 — THE SEAM

A change on a screen becomes a deadline on a clock.

A line becomes a fact by rule, not by model. A file you own maps a label on the screen to an event name and a time parser; glance emits whole minutes from a reference both tools agree on, and the fact carries the screen path as its citation.

Piped into caseclock, an evening reads like the transcript beside this. Three times fill in while the clock counts a deadline nobody entered and nothing on the screen mentions. Then the serology is drawn at 23:50, and the plan is short by 95 minutes: the morning OR window is gone, and the tool says by how much and which constraints cannot all hold.

Not one character of it was typed by a person. Every value is synthetic.

$ glance --window "iTransplant*" --rules rules/tr4118.yml --facts \ | caseclock --facts - TR-4118.json fact referral_received at 14:00 (-1d) (glance uia:Times/Referral received) TR-4118 · serology_drawn by 22:15 (-1d) · BREACHED 85 min · chain 7 fact authorization at 17:40 (-1d) (glance uia:Times/Authorization signed) fact pronouncement at 19:05 (-1d) (glance uia:Times/Pronouncement) fact serology_drawn at 23:50 (-1d) (glance uia:Labs/Serology drawn) withdrawn cross_clamp was by 10:00 · incision was by 09:15 · … INFEASIBLE · short by 95 min T0 → cross_clamp → incision → or_scheduled → primary_acceptance → match_run → serology_resulted → serology_drawn → T0
SCREEN → FACT → CLOCK, VERBATIMSYNTHETIC CASE · EVERY DURATION ILLUSTRATIVE
RULES ARE DATA — THE ENGINE KNOWS NO VOCABULARY
# rules/tr4118.yml — the site edits this file, not the tool fields: - label: "Serology drawn" event: serology_drawn parse: datetime_iso - label: "OR scheduled" event: or_scheduled parse: datetime_iso ignore: [ "Last saved *" ] redact: [ "Patient name", "MRN *", "DOB *" ]
A redact rule drops a value before a change record exists — before the tape, before the strip, before any output. On the pixel path it pins the row the label sits on, so the value beside a redacted label cannot be exposed by the engine failing to read the label on one pass.
04 — MEASURED, ON ONE BOX

Every number here was measured, and the ones that failed are here too.

An i9-9900K with an RTX 4070 Ti SUPER at 225 % DPI, with the machine's own model stack resident. No number appears on this page that was not measured on that machine; where a target was missed, it says so.

WHAT HOLDS
tree, idlemedian 18 ms from change to line, worst 22 ms; 54 of 54 scripted changes seen
tree, loadedmedian 9.5 ms, worst 32 ms with every core busy — inside a 50 ms budget
pixelsmedian 44–183 ms, every change inside one second
idle cost0.06 s of CPU and 18 MB over fifteen seconds on a still window
the oracle142 checks, including two fixture windows glance creates itself and one case's whole evening asserted fact by fact
the receipt0 frames kept, 0 bytes sent, and no network or input API in the import table — checked at build and printable at run time
WHAT DOES NOT, YET
pixels, saturatedOn a machine with every core pegged the pixel reader misses changes and runs past its one-second budget. The tree reader does not. The cause is named in the devlog, and the fix that halved the latency shipped; the saturated case has not been re-measured since.
remote contentglance reads a live RDP session's pixels correctly, but change-to-line on remote content is not yet measured. The number is missing, not assumed.
the stripHas no automated test yet. It is driven by hand and by --shot.
OCR slipsThe OS engine reads 06:00 (+ ld) for 06:00 (+1d). The time parser corrects one letter-for-digit read at a cost in confidence and rejects two rather than guessing a wrong minute.
05 — FOR THE AGENT

"What does the screen say now" is one line, not a screenshot.

An agent beside a coordinator cannot see the record. An agent beside a developer cannot see the dialog that is blocking the build. glance hands both the window as text — and after the first read, only what changed.

Every surface reads one change stream, so a human and an agent get the same answer: the line on the strip, --json, --spool, --facts, and a read-only MCP server with five verbs. None of them can click anything, because the binary has nothing to click with.

THE VERBS
glance_windowsthe windows glance can see
glance_reada window as text, now
glance_changesonly what changed since a sequence number; blocks up to a timeout
glance_factsfacts by rule, in whole minutes with their citations
glance_statusthe readers, the counters, the tape
claude mcp add glance -- glance.exe --mcp

Free, MIT, one exe, no installer.

Windows 10 1809 or later, x64. The binary is unsigned, so Windows will warn on first run; the source builds with one batch file and Visual Studio 2022 if you would rather compile it yourself.

Download the latest release ← the rest of the shop