PupilCheck

Android test build 16.0.1

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.

How PupilCheck reads the pupil border A pupil margin drawn against a dashed reference circle of its own median radius. One arc at the 8:30 to 10:30 clock zone lies inside the circle and is marked as a flattening of 4.5 per cent; another at 11:30 to 1:30 bulges outside it and is marked as a protrusion of 7.1 per cent. Twelve clock-hour ticks ring the diagram. 12 3 6 9 −4.5% +7.1%
  • 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
An arc lying inside the circle is a flattening: a straighter edge where there should be a curve. An arc bulging outside it is a protrusion. Each is reported by clock zone and graded by its deviation as a percentage of the median radius. With two or more usable frames, a finding is confirmed only when it appears in a majority of them.
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.
% of iris diameter
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.
percentage points
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.
% short / long axis
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.
% of iris radius
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.
% of median radius

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.

Pick how to capture
Pick how to captureMirror assist points the rear camera at your own eye while you read the screen in a mirror; the hands-free version lets the quality gate press the shutter for you.
Both eyes, then the difference
Both eyes, then the differenceEach eye carries a detection-confidence grade. Here the two ratios differ by 4.4 points, which the app reports as a research observation rather than a finding.
The ratio against an age baseline
The ratio against an age baselineAn estimated diameter in millimetres is shown too, but it is a conversion from the ratio using an assumed iris size. The ratio is the measurement.
Warnings come before numbers
Warnings come before numbersA reflection near the pupil border is read as a flattening, so the card says so up front. Everything below that warning has to be read in its light.
Findings by clock zone
Findings by clock zoneFlattenings and protrusions are reported per clock zone with their deviation. Zones overlap by design, so one broad flattening can appear in several neighbours.
Compare, annotate, export
Compare, annotate, exportObserver notes typed here are printed in the reports. Exports are PDF, plain text and JSON; the scan itself is saved to history automatically.
The manual travels with the app
The manual travels with the appSix tabs, offline, in every supported language: what it measures, how to capture, how to read a result, deformation, reports, and limits.

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 FilesDownloads.

Download the APK 111 MB

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: SettingsSecurityUnknown 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.

support@cnri.edu

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.