Test page

Open this page with pdf to json installed — the button shows up wherever a pdf can be read.

Invoice

One-page invoice (invoice.pdf)

One click and the run finishes: every line item, the vat and the total due land in the popup.

Bank statement

One-page account statement (statement.pdf)

Another shape of paper: dates and a running balance. Let the ai build a schema for it and keep it.

Invoice inside the page

A floating button in the bottom right corner — an embedded pdf is captured like one opened in a tab.

Plain link

Three-page contract (plain-3p.pdf)

The button appears and the run starts exactly as it would from the popup. It cannot reach a result: all three pages are empty — not a single /Contents object — so recognition answers ocr_empty. For an end-to-end run take invoice.pdf above.

Link without a suffix

The same file, address without .pdf

The button is still there. An address cannot decide this — a pdf announces itself with a Content-Type header, not with its last four letters.

Link with query and fragment

Address carrying both

The button is there, and the whole address travels to the worker — query kept, fragment dropped.

Not a pdf

Image (receipt.png) · Text (notes.txt)

No button on either, even after you hover them. The popup accepts an image by hand, but capture on a page is about pdfs.

Broken pdf

broken.pdf

The button is there and the file reaches the backend, where POST /api/v1/jobs answers 422 with pdf_unreadable and the extension translates it. No job is created and no attempt is spent: the structure is read before an attempt is reserved.

File over the limit

big.pdf — one byte above MAX_FILE_SIZE_MB

Refused by size before any byte is sent to the backend. The limit comes from GET /health, it is not hardcoded.

Another origin

The same file through localhost

The button is there like everywhere else. Site access is asked once for all sites, not per origin, so this case differs from its neighbours only by address.

Pdf at the top level

Open in a new tab

The same floating button in the bottom right corner, over chrome's built-in viewer.