Three resolutions
Quarter, half and full. On a skull at bone threshold those take roughly 0.6 s, 2.8 s and 19.5 s, producing STL files of about 24 MB, 110 MB and 476 MB. Start at quarter.
DICOM viewer · iPadOS
Open the studies you already have, on your own iPad. Scroll a stack, reformat it in any plane including oblique, lift a surface out of it in three dimensions, and measure what you find.
Nothing is uploaded. The app has no account, no analytics and no cloud. Images stay on the device they were opened on.
Title sequence · tracer dispersal
Multiplanar reformats
A stack of axial images is a volume, so it can be cut any way you like. Scanners are often tilted to clear the orbits or follow a disc space, and a tilted acquisition resliced as though it stood upright is subtly wrong everywhere. voXel reslices along the direction cosines the file actually carries.
Below is the sample study itself, at 64 × 64 × 60, resliced in your browser by the same arithmetic the app uses.
Why the spacing matters. These voxels are 2.4 mm across and 1.5 mm deep, so a coronal cut of this volume is not square. Drawing it as though it were would stretch the patient. Each reformat here is scaled by the real spacing, which is the whole reason geometry is read from the file rather than assumed.
Three dimensions
Pick a tissue by threshold and the surface is extracted with marching tetrahedra, then exported as binary STL or Wavefront OBJ through the share sheet.
Quarter, half and full. On a skull at bone threshold those take roughly 0.6 s, 2.8 s and 19.5 s, producing STL files of about 24 MB, 110 MB and 476 MB. Start at quarter.
Cropping keeps the model closed, because the box is applied to the field before the surface is found. A freehand lasso cuts an arbitrary curve and leaves an open edge, deliberately, and the app says so rather than pretending otherwise.
The extractor was written in Python first and proved there, then mirrored into Swift. Both are held to the same triangle counts, the same winding, and a closed surface's Euler characteristic.
Extraction is plain Swift on the CPU, not a Metal kernel. That is why full resolution takes twenty seconds rather than being instant, and why the timings above are worth printing instead of a claim about speed.
The first thing you do to a CT
A CT slice holds far more range than any screen can show, so you choose which part of it to look at. Take a preset, drag the controls, and probe the image for the attenuation underneath. This is the phantom the app ships to App Review, windowed here with the same linear transform the viewer uses on device.
Why it matters. A CT stores about 4,000 distinguishable values and a screen shows 256 grey levels, so roughly fifteen values collapse into every shade you can see. Choosing the window is choosing which fifteen you care about, which is why one image can never show lung and bone properly at the same time.
Everything it does
No asterisks and nothing marked coming soon. If it is on this page it is in the build, and every number here is the one the code actually uses.
Scope
A viewer is only worth trusting if it is honest about what it is not, so that comes first rather than in a footnote.
On the network, precisely. The voXel app has no account, no analytics and no cloud service behind it. It does contain one piece of networking, and it is worth naming rather than hiding: a small web server that runs only while the import sheet is open, listens on a port the system picks, answers nothing without the pairing code shown on screen, and exists so a study can be sent from a desktop browser with no cable and nothing installed at the other end. It receives. There is no path that sends an image anywhere.
Engineering method
voXel is built in Swift Playgrounds, on an iPad, with no compiler on the machine the code is written on. That constraint shaped everything: each non-trivial algorithm is written twice, once in Python as a reference and once in Swift, and the two are held to the same numbers. The suite runs on the device, because that is the only place the code has ever been compiled.
A harness runs the reference parser over thousands of real studies and reports exactly what would fail and why, naming no file and no patient. One run found a fifth of a public archive failing on a single wrong assumption about sequence lengths. Another turned fourteen apparent decoder crashes into one reassembly bug.
A palette read as intensity still looks like a plausible study. A colour space converted wrongly still fills the screen. Those are the failures worth testing hardest, so the checks pin actual colours and exact pixel values rather than shapes. An encoding it cannot read is refused by name.