- iOS & Android
- one codebase
- 0
- servers - fully local-first
- 6
- scalp zones mapped
- 100%
- on-device data
AI ahead
AI progress analysis is designed in, not bolted on. The groundwork already exists: a classical computer-vision engine written from scratch in TypeScript, and a data model built so the on-device neural network can drop straight in.
01
Classical vision first
Adaptive thresholding, skeleton thinning, and distance transforms measure hair density and thickness from microscope frames - pure TypeScript, tested on synthetic images.
02
A schema ready for the swap
Every measurement is stored per engine, so the neural model can land beside the classical one with zero migrations.
03
Then the neural network
v2 fine-tunes an on-device segmentation model that reads your aligned photo series to answer the only question that matters: is it working?
AI where it earns its place - the standard every EitanX Labs product is held to.
A local-first progress tracker for people treating hair loss - and proof that a serious product doesn't need a backend. Records live in SQLite on the phone, photos stay on the filesystem, and capture, compare, reminders, and analysis all run on-device. No account, no cloud: your photos never leave your device.
Under the hood
Local-first, down to the last byte.
Three layers of local storage
SQLite through a typed ORM for records, a fast key-value store for settings, and the filesystem for photo binaries - with versioned migrations that run before the first screen renders.
A microscope client from scratch
Norwood streams live video from a WiFi scalp microscope with no native media libraries: a pure-TypeScript RTSP/RTP client rebuilds every JPEG frame byte by byte, and a UDP channel drives the light and shutter.
A hand-drawn 2.5D scalp map
The bird's-eye head map is built from scratch in Skia - gradients, blur masks, and a triangle mesh - with gesture-driven zone selection and per-zone recency dots.
Ghost-aligned capture
The previous photo overlays the live camera half-transparent, so every new shot lines up with the last. The opacity slider even has a physical detent that latches at 70%.
Lockstep compare
The wipe slider and dual-pane zoom run on shared animation values, so both photos pan and zoom in perfect sync - written by hand, because no library does this.
Backups you can hold
One tap zips every record and photo into a single archive you own. The manifest layer is pure and unit-tested, round-tripped with the real compressor.
Privacy by architecture
No backend, no account, no cloud - the only thing the app ever connects to is your microscope on your own WiFi. Photos and health data never leave the phone.
Boundaries the linter enforces
Screens can't touch the database or filesystem directly - an ESLint rule walls them off behind typed service contracts, so storage can change without touching the UI.
The stack
- TypeScript
- React Native
- Expo
- Skia
- Reanimated
- Gesture Handler
- SQLite
- Drizzle ORM
- MMKV
- Zustand
- Zod
- NativeWind
- RTSP / RTP
- TCP & UDP sockets
- fflate
- Victory Native
- EAS Build
- Next.js
Get Norwood
Norwood is live on iOS and Android.
This app is not a medical device and does not diagnose, treat, or prevent any condition.