Getting started
- Pick a task: Extract (pull structured values) or Label (classify).
- Choose a model and enter your API key.
- Describe what you want — the AI writes a tailored prompt for you.
- Review & confirm the prompt.
- Upload one or more PDFs.
- Review results next to the original paper, edit any value, and download as JSON or CSV.
Using a self-hosted model (vLLM, Ollama, LM Studio)
Anything that exposes an OpenAI-compatible API works. On the setup screen, choose Custom (vLLM / OpenAI-compatible), then:
- vLLM — Server URL:
http://your-host:8000 · Model: HuggingFace ID (e.g. meta-llama/Llama-3.3-70B-Instruct) · API key: any string.
- Ollama — Server URL:
http://localhost:11434 · Model: e.g. llama3.2-vision or llama3.2:3b · API key: any string (Ollama ignores it).
- LM Studio — Server URL:
http://localhost:1234 · Model: whatever you loaded · API key: any string.
The /v1 path is appended automatically. If your server runs on another machine, make sure it's reachable from wherever this app is hosted.
Vision vs text: if your model doesn't support image inputs, switch the Parsing method on the upload screen to Text extraction — the PDF text layer is sent instead of page images.
Evidence highlighting & how it works
Every extracted value should be backed by a quoted snippet from the paper. The AI returns an evidence array on each result with this shape:
"evidence": [
{"snippet": "TABLE 1. Parameter estimates...",
"page": 3,
"source": "Table 1",
"field": "samples[0].factor_loadings"}
]
The field property is a JSON path that mirrors the structure of the extracted output, so each evidence entry points at exactly which value it supports (e.g. samples[0].factor_loadings._table[0] = the first row of the loadings table).
For every _table the model emits, the prompt requires at least one evidence entry whose snippet is the verbatim table caption ("TABLE 1. ..."). The viewer uses that caption to find and highlight the entire table region — not just the sentence that references it.
If you wrote a custom prompt that doesn't ask for evidence, the review screen shows a warning with a one-click Adapt prompt button that adds the requirement using your selected model.
Editing & download
Click any value in the results to edit it in place. Changes are tracked as human overrides.
- JSON — full export including the original model response, your edits, prompt, model, and timestamp.
- CSV — flattened table (one row per entry, dot-notation columns). Evidence arrays are stored as JSON in a single cell. Use All (CSV) to combine entries from every paper into one file with a
_filename column.
Reviewing previously exported results
From the start screen, click Review existing results. Drop in the JSON file you previously downloaded, and optionally drop the original PDFs alongside it — the viewer will show page images with the same yellow highlights as before. No API key needed.
Privacy & data handling
- Your API key is sent only to the provider you selected (OpenAI / Google / DeepSeek / your own server).
- API keys are never stored on the server. They live only in your browser tab.
- Uploaded PDFs are processed in memory and not persisted. Page images for the viewer are sent back to the browser as base64.
Keyboard shortcuts
| ? | Open / close this help drawer |
| Esc | Close help / download menu |
| On the results page |
| n / → | Next paper |
| p / ← | Previous paper |
| j / ↓ | Next entry |
| k / ↑ | Previous entry |
| ] | Next evidence page |
| [ | Previous evidence page |
| e | Start editing the first cell |
FAQ
Why are some papers refused / missing data? OpenAI vision models have a per-minute token budget that's shared across requests. The app waits 30s between papers and retries once after a 60s pause, but heavy back-to-back loads can still hit the limit.
What's the page limit? 40 pages per PDF. Pages beyond that are ignored.
Why are no highlights showing? Either the prompt didn't request evidence (a banner appears in that case), or the model's quoted snippets don't appear verbatim in the PDF text layer (common for scanned PDFs).
Can I extract from a scanned PDF? Yes via vision (page images), but the text-extraction mode (and DeepSeek) requires a real text layer.
Can I display nested data as a table? Yes — wrap tabular data with the explicit _table marker:
"factor_loadings": {
"_table": [
{"item": 1, "F1": 0.83, "F2": 0.12},
{"item": 2, "F1": 0.45, "F2": 0.71}
]
}
The viewer renders any object containing a _table array as a real HTML table — no shape guessing.