Engineering

Build journal

This page is a dated record of decisions I can show, not invented setbacks. Why the sign on someone’s hands mattered, what I refused to let the software do, and the choices that still shape how it is built.

Build timeline

I started LungLens after a family friend's constant colds led to a conversation about digital clubbing, a small sign that can change someone's next steps. The full origin is on About. Two careful people can still disagree on a look. The numbers that stayed with me are on the overview.

This was a summer 2026 engineering project, from June through August. The dates mark that arc of the work. No person co-designed or co-coded it with me.

  1. 2026-06-09

    Measurement literature

    I read how digital clubbing is still judged by a look, and which profile angles and depth ratios the papers actually use.

  2. 2026-06-23

    Capture before analysis

    I decided a retake is cheaper than analyzing a blurry or poorly framed finger.

  3. 2026-07-08

    Split app from analysis

    I kept the interface in the web app and the measurements in an analysis API, so geometry could be tested on its own.

  4. 2026-07-22

    Repository foundation

    I started the monorepo so the app and the analysis code could grow together, with secrets kept out of the repo.

  5. 2026-07-23

    Role-based portals

    I built patient, clinician, and admin portals, with login routing by assigned role.

  6. 2026-07-24

    Guided capture

    I wired capture upload and server quality checks so a bad photo stops before analysis.

  7. 2026-07-28

    Geometry as authority

    I kept landmark finding experimental and made the angle math deterministic, so a stub could not pretend it had found the anatomy.

  8. 2026-08-12

    Research-only labels

    I kept stub results off the clinical path so a successful run could not look like a finding.

  9. 2026-08-26

    Engineering tests

    I locked geometry, quality, and abstention tests so the software can refuse a number when it should.

Portal, capture, and validation work continued after August. The summer is the build I am showing here.

Two things I had to learn by breaking them

A successful run is not found anatomy

The default keypoint path can return fixed DEFAULT_POINTS, such as nail_matrix at (10, 40). Geometry still computes an angle, about 165.2° for those stubs. I treated a green run as proof I had found the nail fold. I had not. Demo captions now say when placeholders are active, and a stub must not look clinical.

The literature cutoff is not my function

Myers-style bands in code mention angles above 180°. My function is unsigned acos, so it cannot produce them. A unit test even injects 181° to check the label map. I did not change the formula so the visual would agree with the papers. I documented the limit instead.

A result must not skip a person

I required that a research-only or stub path cannot be released as if a clinician had already written a summary. If software morphology is withheld, the release path must refuse until a locked clinician summary exists. That is a rule in the software, not a claim that the system is clinically ready.

Engineering decisions

Separate geometry from landmark estimation

I could have used one combined model that outputs angles. I did not. I can unit-test the math even while landmark finding stays experimental.

Abstain at low confidence

I could always return a measurement. I do not. I do not want uncertainty to become a reassuring shape label.

Keep stub results research-only

I could show morphology labels from stub paths. I do not. I do not want experimental output to look clinical.

Quality check before analysis

I could analyze every capture. I do not. Bad framing and blur make landmark error worse. A retake is cheaper than a false number.

Related pages