The thing nobody else does
A desktop app’s most interesting failures happen at the IPC boundary. The renderer asks the main process for something, and the main process quietly fails. The renderer cannot see that. A screenshot certainly cannot. Reticle records it as a request:
The window on the left is an illustration. The JSON on the right is real output from the desktop
battery, which starts a real Electron main process and a packaged Tauri binary and drives them
headless on every change.
What works, and what is proven
Bold rows are re-proven by
pnpm test:e2e:desktop on every change. The rest were measured by hand.
That distinction is deliberate. This table used to report a hand-run score with nothing in the repo reproducing it, so it could go stale without anything failing.
Three things that are genuinely different
It works occluded
Minimized, app-hidden, behind a fullscreen app on another Space. The agent keeps driving.
Screenshots cannot lie
Captured from the window’s own backing store, never the screen.
Missing wiring is declared
Electron without the preload reports
coverage: partial, not a clean pass.Why screenshots read the backing store
webContents.capturePage() reads the window’s own pixels. Capturing a screen region was tried and deliberately rejected.
A region capture photographs whatever is on top. An app window behind your editor yields a picture of the editor, saved as a visual baseline that a later diff would trust.
A screenshot tool that can silently return another window’s pixels manufactures exactly the false green Reticle exists to eliminate.
Why a missing preload is not a silent pass
Without@reticlehq/electron/preload, every IPC call is invisible to Reticle.
A tool that just reported clean there would be telling you the IPC layer is fine when it never looked. Instead verdicts carry coverage: partial and name the missing line.
Getting started
The workflow has no browser step in it at all.-
Start the daemon once.
-
Start your app exactly as you always do.
-
Confirm it connected.
Your window appears as a session, and the agent can drive it.
Electron
Screenshots are one line in the main process:file:// renderer.
Tauri
The frontend is identical to any web app. The CSP is not optional:invoke('load_todos') already reaches Reticle as ipc://load_todos.
Screenshots and headless mode need the crate, which is versioned independently of the npm packages:
Keep reading
Full desktop guide
Every capability in detail, what IPC looks like to an agent, and desktop troubleshooting.
Manual install
The wiring for both runtimes, step by step.