Crosscheck
A second opinion for AI photo descriptions. Several vision models, running on your own computer, describe the same photo. Crosscheck tells you what they all agree on, and, first and most clearly, where they disagree.
Built for blind and low-vision people, who use AI descriptions for labels, medicine, mail and screens but have no easy way to tell when a description is wrong.
Why
A single AI description sounds equally confident when it is right and when it is wrong. A study at ASSETS 2025, Surfacing Variations to Calibrate Perceived Reliability of MLLM-generated Image Descriptions (Meng Chen, Akhil Iyer, Amy Pavel), found that when blind and low-vision participants were shown where several models' descriptions varied, they spotted 4.9 times as many unreliable claims as with a single description (2.62 against 0.53 per image). 11 of 15 participants ranked that presentation as their favourite, and all of them wanted to use it in the future.
Crosscheck brings that idea to models that run locally through Ollama: free, offline, and the photo never leaves your computer.
How it works
-
Each model lists what it sees as short, separate facts, and quotes any text it can read.
-
Facts that say the same thing are merged. Facts that differ in a number or quoted text ("Ibuprofen 200 mg" against "400 mg") are kept apart, because that is where errors hide.
-
Every model looks at the photo again and judges each fact the others stated: yes, no, or unsure.
-
You hear a short summary first, for example:
A pill bottle on a wooden table. The 3 models agree on 6 of 9 details. They disagree about: The label says "Ibuprofen 200 mg"; The label says "Ibuprofen 400 mg".
Then, on demand: what every model agrees on, where they disagree (and which model said what), and details not every model could judge.
Agreement is not proof. Models can make the same mistake. For medicine, money or safety, confirm with a person or another trusted source. Crosscheck never says "verified".
Install
-
Install Ollama and pull three vision models from different families (different families make different mistakes):
ollama pull qwen3-vl:4b-instruct ollama pull gemma4:e4b ollama pull granite3.2-vision:2b
-
Install and start Crosscheck (Python 3.10+, no other dependencies):
uv tool install crosscheck-vision # or: pipx install crosscheck-vision crosscheck serve
It opens http://127.0.0.1:8765 in your browser.
Choose other models with --models a,b,c (or CROSSCHECK_MODELS). With a 12–16 GB GPU, expect
about 30–90 seconds per photo while Ollama swaps the models in and out; a CPU works, slowly.
Using it
- Web app: choose a photo, optionally ask a question ("What does the label say?"), press Check photo. Progress is announced; when the result is ready, focus moves to it. Everything works with the keyboard and a screen reader. A checkbox can also read the result aloud with the browser's own voice.
- Terminal:
crosscheck describe photo.jpg --question "What does the label say?", or--jsonfor the full result.
The web app shrinks the photo in your browser before sending it, which also removes metadata such as GPS location.
Privacy and security
- Runs on 127.0.0.1 only. Photos stay in memory and go only to your Ollama. Nothing is logged.
- Requests must come from the app itself: a non-local
Host(DNS rebinding) or a foreignOrigin(another website) is refused. A strict Content-Security-Policy blocks outside content. - Model output is shown as text, never as HTML.
Status and limits
- v0.1, for desktop browsers on the same computer. Using a phone camera over Wi-Fi needs HTTPS and is planned for v0.2.
- Merging facts across models uses word overlap, so two phrasings of one fact are sometimes listed separately; each still gets judged.
- Small local models are weaker than the cloud models in the study. We are measuring how well their disagreement predicts real errors on photos taken by blind people (VizWiz), and will publish the results and timings here.
Feedback from blind and low-vision users matters most: please open an issue or email admin@rushlabs.ai.
Development
python -m unittest discover -s tests -v
Tests run against a fake Ollama: merging and judging, a failing model, the web app's security checks, the job queue and the CLI.
Licence
Apache-2.0. Built by Rush Labs, an applied AI lab. The models keep their own licences (all three defaults are Apache-2.0).
Metadata
Release files for crosscheck-vision 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| crosscheck_vision-0.1.0.tar.gz | 20.8 kB | With provenance | Details for crosscheck_vision-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| crosscheck_vision-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for crosscheck_vision-0.1.0-py3-none-any.whl |
Total release size: 44.8 kB
Release files / crosscheck_vision-0.1.0.tar.gz
| Download URL | crosscheck_vision-0.1.0.tar.gz |
|---|---|
| Size | 20.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4c90ef10b9f3bb4a8835d4b567dba72fa211e0828de5ca8266be55340fd82f95
|
|
BLAKE2b-256 checksum How to use checksums |
61b81602894489a6149ccf064ac01e0158bf30862a3f208655ff801de086263c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logRelease files / crosscheck_vision-0.1.0-py3-none-any.whl
| Download URL | crosscheck_vision-0.1.0-py3-none-any.whl |
|---|---|
| Size | 23.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5f24b945a0ade198e1642993cf20cc5e84aec03d7ca5778fb570227d1e856ad7
|
|
BLAKE2b-256 checksum How to use checksums |
fccbb367ee276b81fa8bd788114b5b78810007c1a5b97e3716b08b60fc0af2c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logSecurity for crosscheck-vision 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for crosscheck_vision-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.