git-qaHUMAN-IN-THE-LOOP QA

The AI drives. You watch, and sign off each case with one key. git-qa is an open-source human-in-the-loop QA runner. It works through a test sheet (TSV) on Android devices, web pages and desktop apps — and iPhone / iPad.

The AI never passes anything. The most it can give is AUTO_PASS — nobody looked. "A person verified this" appears only when a person presses the key.

Loading version… Beta MIT / OSS 日本語
The git-qa window: the cases on the left, the live screen of the target in the middle, the AI verdict and the verdict keys on the right
The real app. Left: the cases in your test sheet. Middle: the target, live (the red marker is where the AI found the expected text). Right: the AI's verdict and the keys you press. Finished cases show "VERIFIED / who looked". The UI is shown in Japanese; it also speaks English.

Download

Builds are published on GitHub Releases.

macOS (Apple Silicon) Open the .dmg and drag it into Applications. Drives devices, web pages and desktop apps. Get the .dmg
Windows (x64 · Intel / AMD) Install with the .msi. Drives web pages, Android devices and desktop apps (recording and some input fields are not on Windows yet). Get the .msi
Windows (ARM64) For Windows on ARM, such as Snapdragon. Installs and works the same as x64. Get the .msi
Windows builds are not signed. You will see "Windows protected your PC". Check where the file came from, then choose [More info] → [Run anyway]. If you are not sure, do not install it.
macOS builds are signed and notarized, so they open as they are.

What you need first

Node is required. The app starts a runner process; without Node it stops on start and says why.

Node 22 or newer Required. Without it the app stops after launch
adb (Android SDK Platform Tools) Only for Android devices
Chrome / Edge / Firefox / Safari Only for web pages. Pick any one that is installed (its version goes into the evidence)
ffmpeg / cwebp Optional. Nothing stops without them, but evidence images and video stay in the format they were captured in (.jpg / .mov)

First three steps

  1. Enter a handle It goes into the evidence as "who looked". Use a handle, not your real name — evidence is designed to be committed to public repositories.
  2. Pick what to look at An Android device, a web page URL, or a desktop app by name (the owner of the window).
  3. Pick a test sheet (TSV) and start The AI runs one case at a time and stops when it is your turn. D pass / F fail / A cannot decide / S skip. Moving on with Space without a verdict leaves AUTO_PASS (it is never promoted to a pass).

Watch mode

It moves on without you. You only watch; the AI runs to the end.

If you press a key That becomes the verdict (recorded as the verdict of the person watching)
If you do not AUTO_PASS. Never promoted
To stop Esc, or [Stop watching] on screen. Cases that have not run are not written into the evidence (you can continue from there next time)

One test, one folder

The test sheet, the evidence, the screens and the video pile up in one place. Put the whole folder under git.

$ pnpm ws:init ./contacts-check "Contacts check"

contacts-check/
  git-qa.json     … marks this folder as one test
  sheet.tsv       … the test sheet (you put it here)
  runs/           … created when you run
    20260912-100000/
      run.json
      case-001/screen.webp · screen.webm

Without the marker, nothing changes (runs go to runs/ where you ran it).

Stop today, continue tomorrow

Stopped runs are listed on the start screen. Pick one and git-qa adds to that run — you do not place yesterday's verdicts again.

Cases that never ran Not written into the evidence. Writing "stopped, so cannot decide" would make them indistinguishable from cases that ran and ended undecided
Is it unfinished? If run.json has no end time, it is unfinished. That is the marker
If the sheet changed It does not continue. Yesterday's verdicts were placed against a different text

What is kept

runs/<date-time>/
  run.json        … verdicts, steps, who placed them and when (written after every case)
  case-001/
    screen.webp   … the screen at the moment the verdict was placed
    screen.webm   … video while the AI drives (in watch mode)

Nothing about your machine goes in. The sheet's path is kept relative to the workspace, so the same run reads the same way on anyone's machine (no personal names in the evidence).

You can check later what each verdict was placed against. If the sheet has been rewritten, pnpm check:run exits with 1.

$ pnpm check:run runs/<date-time>/run.json

What it can do today

Android devices Real devices and emulators over USB. Tap, swipe, type
Web pages Chrome-family / Firefox / Safari. Same viewport every run, so you can compare layouts
Desktop apps macOS and Windows. On macOS it presses without bringing the app to the front and reads text in two stages (Accessibility, then OCR). On Windows it reads and presses through UI Automation (no recording)
iPhone / iPad Watch, read and record over USB. Tapping, typing and launching apps only with WebDriverAgent installed on the device (signing and installing it is a person's job). Not yet confirmed from Windows
From an AI agent Over MCP (take screenshots, read the screen, tap)

Not there yet

Recording on Windows Desktop testing itself works (find the window, capture, read text, press, type, keys). Only recording is missing — a screen is kept per case
Some input fields on Windows Typing works, but the contents of password fields are not read (even where they could be — that is a decision)
Signing on Windows Not signed (the certificate needs a physical token or an HSM), so you will see the warning above. macOS is signed and notarized
Auto-update None. Download new builds from this page again
Detecting that the target was swapped Desktop apps only. Web and Android are recorded as "could not measure" (never as "unchanged")

Read the source, run it locally

You can also clone and run it instead of downloading (development happens here).

git clone https://github.com/meta-taro/git-qa.git
cd git-qa
pnpm install
pnpm app