EitanX Labs
Norwood mark

Norwood

Live

Know if your hair-loss treatment is actually working.

  • iOS
  • Android
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.

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

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

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

Norwood Privacy Policy