A local-first interface for browsing MRI series on the web and iOS. It provides a responsive study grid, full-screen image viewing, search, filters, annotations, and saved frames.
The viewer runs entirely on-device. It has no accounts, analytics, backend, or runtime network dependency.
Warning
This is an interface prototype—not a medical device or diagnostic tool. The repository does not include a DICOM archive or raw patient dataset.
The screenshots were expressly selected and supplied by the repository owner. They are the only clinical imagery included here and are covered by a separate screenshot notice.
- Responsive MRI series grid
- Anatomy and orientation filters
- Search across names, tags, protocols, and metadata
- Full-screen frame viewer with swipe, zoom, and scrub controls
- Freehand drawing, target markers, comments, and local bookmarks
- SwiftUI iOS wrapper using
WKWebView - Offline, local-only runtime
viewer/ Web viewer source and empty sample manifest
ios-app/ SwiftUI wrapper with a bundled copy of the viewer
docs/screenshots/ Owner-approved documentation screenshots
Requirements: Python 3 and a modern browser.
python3 -m http.server 5177 --directory viewerOpen http://localhost:5177.
No study is bundled, so the default archive is empty. Run the search smoke test with:
node viewer/scripts/check_search.jsRequirements: Xcode 16 or newer and an iOS 17+ simulator or device.
- Open
ios-app/MRIGridViewer.xcodeproj. - Select the
MRIGridViewertarget. - Choose your own development team and bundle identifier for device builds.
- Build and run.
After editing the web viewer, synchronize the iOS bundle:
python3 viewer/scripts/sync_web_bundle.pyInstall the optional generator dependencies:
python3 -m pip install numpy pillow pydicomGenerate local assets from a directory outside the repository:
MRI_DICOM_SOURCE=/path/to/private/dicom python3 viewer/scripts/generate_assets.pyThe generator writes to the ignored viewer/data/ directory. To load that output locally, change the manifest script in viewer/index.html from sample/manifest.js to data/manifest.js.
Never commit the generated directory. DICOM metadata removal alone does not guarantee anonymity: medical pixels can contain recognizable anatomy or burned-in identifiers. Review SECURITY.md before working with sensitive data.
- No DICOM files or machine-readable patient records are committed.
- Private inputs and generated output directories are ignored.
- Signing files, build products, and Xcode user data are ignored.
- The three documentation screenshots are the only intentionally included clinical images.
Copyright © 2026. All rights reserved.
The source is public for viewing and evaluation. Copying, modification, redistribution, deployment, commercial use, and derivative works require prior written permission. See LICENSE for the complete notice.


