Photograph an eye. Read the pupil back as numbers.
PupilCheck measures pupil size, position and shape from still photographs, offline, on the phone in your pocket.
It behaves well on the handsets we own. Close-up focus, exposure and sensor noise vary enormously between phones, and we can only find out what happens on yours if you run it there.
Patient details, images and scan records are stored only on this device. Licence checks send no patient information.
- Reference circle a circle of the margin's own median radius
- Flattening 8:30 to 10:30, reading 4.5% inside that circle
- Protrusion 11:30 to 1:30, reading 7.1% outside it
- Version
- 16.0.1 (build 16)
- Download
- 111 MB
- Requires
- Android 7.0 or newer
- Architectures
- arm64-v8a
armeabi-v7a, x86_64
What it measures
PupilCheck measures the pupil in still photographs of the right eye (OD) and left eye (OS). Every result is a geometric measurement taken from the image.
- Pupil/iris ratio
- The pupil's diameter as a percentage of the iris diameter. Both are measured in the same image, so the ratio does not change with camera distance or magnification. It is compared with a size baseline for the patient's age group.
- Anisocoria
- The difference between the right and left ratios. Pupils react to light, so uneven lighting between the two captures can produce a difference on its own.
- Ellipseness and form
- The pupil's short axis as a percentage of its long axis, so a perfect circle scores the maximum. Because that describes the whole pupil and cannot see one flattened side, the form also looks at the border.
- Decentration
- The distance between the pupil centre and the iris centre. Past the limit, the card names the direction too — nasal, temporal, upward, downward, or a diagonal between them.
- Border deformation
- Flattenings and protrusions of the pupil margin, grouped by clock hour and graded by deviation. With two or more usable frames, a finding is confirmed only when it appears in a majority of them.
What it does not measure
PupilCheck analyses still images only. It does not record video and does not measure the pupillary light reflex — there is no latency, constriction velocity or habituation.
It has no scale reference, so it cannot measure millimetres: any millimetre figure on screen is a conversion from the ratio. It does not diagnose.
Where each number comes from
Border shape, ellipseness and decentration come only from the classical, pixel-based analysis. The on-device ML model contributes the pupil/iris ratio, and only when it agrees with the classical measurement — it never overwrites a measurement it contradicts.
The letter grade on a card (A–D) describes how confident the detection is, not how serious a finding is, and it falls to D when the two methods contradict each other. If no pupil boundary can be found, the card says so and lists the detector's reasons. PupilCheck never fills in a typical value for a measurement it could not make.
What you'll see
Captured on a Samsung Galaxy S9 with the rear camera. Your screens will differ in the numbers, not the layout.
Also in this build
18 languages
The interface, the clinical wording and the built-in manual, in 20 locales including Brazilian Portuguese and Traditional Chinese. Switchable without restarting a scan.
Four ways to export
PDF, plain text or JSON per scan, and the whole history as an Excel workbook. Observer notes you type before exporting are printed in the reports.
Scan history and a timeline
Every completed analysis is saved on the device. From a history record, a serial timeline plots ratio, ellipseness and confidence for each eye across all of a patient's scans.
USB iriscopes
Where the phone detects an external USB camera, PupilCheck can capture from it — including Dino-Lite iriscopes. Worth a try if you have one and an OTG cable.
Installing it on your phone
This build has never been through the Play Store, so Android will ask you to confirm twice. Both prompts are normal and neither means anything is wrong with the file.
Download the APK to the phone
Open this page on the phone and tap the download button, or copy the file across by cable and find it in Files → Downloads.
Let the app you downloaded with install it
On Android 8 and newer, tapping the file the first time offers a settings shortcut. Turn on Allow from this source for whichever app you used — Chrome, Files, or Drive. You can turn it back off afterwards.
On Android 7, it is one global switch instead: Settings → Security → Unknown sources.
Open the file and tap Install
Play Protect will say it does not recognise the developer, because the app did not come from the Play Store. Choose Install anyway. If the dialog offers only More details, tap that first and the option appears underneath.
Some phones also offer to send the app to Google for scanning. Either answer is fine.
Allow the camera on first launch
Capture needs it; nothing else does. PupilCheck asks for no contacts, no location and no accounts. Storage access is requested only on Android 9 and older, where saving a report needs it.
Or install it over adb
If you already have the platform tools on a computer:
adb install -r pupilcheck-16.0.1.apk
Reinstalling over the top with -r keeps the scans and the licence already on the device.
Check what you downloaded
Optional. The file is signed CN=PupilCheck, OU=CNRI, and its SHA-256 is:
86a1a6e486a3a8ff296cbb35137fc1936fad4028f1b012b0f5ae20c5293ce525
About the trial, before you start testing
The free trial is limited both by days and by number of analyses, and ends when either runs out: 14 days or 20 analyses, whichever comes first. The home screen shows what is left.
When it ends you can still open past analyses, export reports and browse scan history — only new analyses stop. Reinstalling does not restart the trial, so if you run out part-way through a test, ask us for a licence key rather than wiping the app.
Getting a measurable photograph
Light: soft and even, with reflections kept well away from the pupil border — inside the iris or beyond it.
Gaze: straight into the lens. A round pupil seen off axis is an ellipse, and the app cannot measure gaze angle.
Framing: the whole iris in frame, pupil as large in the image as focus allows. Photograph both eyes from the same distance so the two can be compared.
What we need back from you
The point of this build is the camera, not the arithmetic. A one-paragraph reply is genuinely useful; a reply with an exported report attached is better.
- Your phone's make, model and Android version Including the year, if you know it. Part of what we are mapping is how far back close-up capture still works.
- Whether the rear camera could focus at 10–12 cm This is the question we most need answered. Many phones will not focus that close, and some switch to a different lens when you try.
- Which capture mode you used, and whether it settled Auto-capture, manual shutter, mirror assist, mirror assist with auto-capture, selfie mode, or a gallery import.
- Whether the eye check refused good photographs Or passed bad ones. A capture that does not look like an eye is rejected, and we want to know where that judgement is wrong.
- Whether a reflection warning appeared And if a border finding repeated when you took the same eye two or three times with the light moved slightly between shots.
- Anything that crashed, froze, or came out untranslated The interface has 20 locales and no native speaker has reviewed the most recent additions.
Send it here
Attach a Save PDF or JSON export if you can — it carries the numbers, the grades and the warnings, so we can see what your phone saw.
Photographs of a real patient's eye are not wanted and not needed. Your own eye, a colleague's, or a printed iris photograph all exercise the same pipeline.
Limits worth reading before you draw conclusions
What this is
PupilCheck is a research and educational tool for documenting pupil geometry. It is not a medical device, has not been cleared or approved by any regulator, and does not diagnose. Its results are observations for a qualified professional to interpret alongside a full examination.
The zone descriptions are inherited, not tested
Flattening and protrusion findings carry a short zone description inherited from earlier iris-chart research, which links clock zones to regions of the body. PupilCheck has not tested that correspondence, and nothing in its measurement work supports or refutes it. An accurate measurement of a flattening is not evidence of what the flattening means, so keep the two apart.
Two things you should expect to see
Decentration reads high. So far most eyes tested come out at or above the limit, including eyes photographed looking straight ahead, and the iris centre can be misplaced when the iris outline looks oval. Confirm an offset with repeat captures before recording it.
Reflections imitate flattenings. A specular highlight on or beside the pupil border is read as a straightened edge. The app warns you when it spots one close to the margin, but the warning identifies frames at risk rather than every affected frame. A real deformation stays put when the light moves; a reflection travels with it.