Work

I'm a Senior Scientific Solutions Engineer at Flywheel, where I turn imaging research into software that runs reliably across sites. Most of that code is private; the projects below are the parts I can share.

At Flywheel

Full résumé

Imaging workflows at scale

Containerized, validated pipelines for curation, quality control and quantitative analysis across MRI, CT, PET and ophthalmic data, run across multi-institution studies.

Classification grounded in physics

Rule-based and learned classifiers for MR, CT and PET, including fine-tuning the MedSigLIP foundation model to recognize MRI contrast weighting from pixel data.

LLM tooling for engineers

A retrieval-augmented chatbot over internal documentation and automated release notes generated in CI/CD.

Projects

Open-source library · OSIPI

osipy

An OSIPI-standard Python library for perfusion MRI analysis across DCE, DSC, ASL and IVIM, with multi-vendor DICOM support and optional GPU acceleration. I am its most active contributor.

  • Python
  • Perfusion MRI
  • GPU

Reconstruction · JMRI 2026

imoco

Python implementation of the retrospective motion compensation methods compared in our 2026 JMRI paper, from soft gating and XD-GRASP to iMoCo, for free-breathing UTE lung MRI.

  • Python
  • UTE MRI
  • uv

Open-source package · ISMRM 2024

fw-classification

An open-source package for classifying MRI scans, so large imaging datasets can be sorted and curated automatically.

  • Python
  • MRI
  • Flywheel

Community library · ISMRM 2025

OSIPI ASL library

A composite Python library for arterial spin labelling image processing, built with the ISMRM Open Science Initiative for Perfusion Imaging.

  • Python
  • Perfusion
  • Open science

Registration · GitHub

sigpy_demons

The demons image registration algorithm implemented with the SigPy toolbox, so it can run on the GPU.

  • Python
  • SigPy
  • GPU

Container · GitHub

pcviprDocker

A Docker image that installs Orchestra and PC VIPR, so the reconstruction toolchain can be set up reproducibly.

  • Docker
  • Reconstruction
1,913 contributions in the last year181 active daysGitLab 1,555GitHub 358
NovDecJanFebMarAprMayJunJulAugSepOctMonWedFriOct 14, 2025: 3 contributions (GitLab 2, GitHub 1)Oct 16, 2025: 1 contribution (GitLab 1)Oct 17, 2025: 12 contributions (GitLab 12)Oct 20, 2025: 5 contributions (GitLab 5)Oct 21, 2025: 19 contributions (GitLab 19)Oct 23, 2025: 17 contributions (GitLab 17)Oct 27, 2025: 8 contributions (GitLab 8)Oct 28, 2025: 33 contributions (GitLab 33)Oct 30, 2025: 3 contributions (GitLab 1, GitHub 2)Nov 3, 2025: 4 contributions (GitLab 4)Nov 4, 2025: 12 contributions (GitLab 12)Nov 6, 2025: 10 contributions (GitLab 10)Nov 7, 2025: 26 contributions (GitLab 26)Nov 9, 2025: 2 contributions (GitHub 2)Nov 10, 2025: 10 contributions (GitLab 9, GitHub 1)Nov 12, 2025: 7 contributions (GitLab 7)Nov 19, 2025: 3 contributions (GitLab 2, GitHub 1)Nov 24, 2025: 2 contributions (GitHub 2)Dec 9, 2025: 4 contributions (GitLab 4)Dec 16, 2025: 10 contributions (GitLab 10)Jan 6, 2026: 3 contributions (GitLab 3)Jan 7, 2026: 6 contributions (GitLab 6)Jan 8, 2026: 4 contributions (GitLab 4)Jan 9, 2026: 7 contributions (GitLab 7)Jan 12, 2026: 17 contributions (GitLab 17)Jan 14, 2026: 12 contributions (GitLab 11, GitHub 1)Jan 15, 2026: 5 contributions (GitLab 5)Jan 16, 2026: 7 contributions (GitLab 7)Jan 20, 2026: 8 contributions (GitLab 8)Jan 21, 2026: 22 contributions (GitLab 21, GitHub 1)Jan 22, 2026: 1 contribution (GitHub 1)Jan 26, 2026: 2 contributions (GitLab 2)Jan 27, 2026: 7 contributions (GitLab 7)Jan 28, 2026: 45 contributions (GitLab 45)Jan 29, 2026: 58 contributions (GitLab 58)Jan 30, 2026: 15 contributions (GitLab 15)Jan 31, 2026: 10 contributions (GitLab 10)Feb 2, 2026: 14 contributions (GitLab 14)Feb 3, 2026: 77 contributions (GitLab 65, GitHub 12)Feb 4, 2026: 4 contributions (GitHub 4)Feb 5, 2026: 12 contributions (GitLab 12)Feb 6, 2026: 21 contributions (GitLab 21)Feb 7, 2026: 18 contributions (GitLab 18)Feb 9, 2026: 10 contributions (GitLab 10)Feb 10, 2026: 21 contributions (GitLab 21)Feb 11, 2026: 29 contributions (GitLab 28, GitHub 1)Feb 12, 2026: 15 contributions (GitLab 15)Feb 13, 2026: 66 contributions (GitLab 66)Feb 14, 2026: 4 contributions (GitHub 4)Feb 15, 2026: 5 contributions (GitHub 5)Feb 16, 2026: 3 contributions (GitLab 2, GitHub 1)Feb 17, 2026: 59 contributions (GitLab 59)Feb 18, 2026: 14 contributions (GitLab 10, GitHub 4)Feb 20, 2026: 1 contribution (GitLab 1)Feb 21, 2026: 3 contributions (GitHub 3)Feb 24, 2026: 3 contributions (GitLab 2, GitHub 1)Feb 26, 2026: 10 contributions (GitLab 10)Feb 27, 2026: 6 contributions (GitLab 4, GitHub 2)Mar 1, 2026: 14 contributions (GitHub 14)Mar 2, 2026: 35 contributions (GitLab 3, GitHub 32)Mar 3, 2026: 13 contributions (GitLab 13)Mar 4, 2026: 7 contributions (GitHub 7)Mar 5, 2026: 2 contributions (GitHub 2)Mar 6, 2026: 1 contribution (GitLab 1)Mar 9, 2026: 3 contributions (GitLab 3)Mar 10, 2026: 12 contributions (GitLab 12)Mar 11, 2026: 19 contributions (GitLab 17, GitHub 2)Mar 23, 2026: 2 contributions (GitLab 2)Mar 24, 2026: 3 contributions (GitLab 3)Mar 27, 2026: 1 contribution (GitLab 1)Mar 30, 2026: 2 contributions (GitHub 2)Apr 1, 2026: 2 contributions (GitLab 2)Apr 2, 2026: 3 contributions (GitLab 3)Apr 3, 2026: 2 contributions (GitLab 2)Apr 6, 2026: 4 contributions (GitLab 4)Apr 7, 2026: 1 contribution (GitLab 1)Apr 8, 2026: 5 contributions (GitLab 5)Apr 9, 2026: 35 contributions (GitLab 35)Apr 10, 2026: 6 contributions (GitLab 6)Apr 15, 2026: 3 contributions (GitLab 3)Apr 16, 2026: 12 contributions (GitHub 12)Apr 20, 2026: 2 contributions (GitLab 2)Apr 21, 2026: 1 contribution (GitLab 1)Apr 22, 2026: 9 contributions (GitLab 1, GitHub 8)Apr 30, 2026: 6 contributions (GitLab 6)May 1, 2026: 5 contributions (GitLab 5)May 2, 2026: 1 contribution (GitLab 1)May 4, 2026: 5 contributions (GitLab 5)May 6, 2026: 14 contributions (GitLab 14)May 7, 2026: 2 contributions (GitLab 2)May 8, 2026: 4 contributions (GitLab 4)May 9, 2026: 6 contributions (GitHub 6)May 11, 2026: 3 contributions (GitLab 3)May 14, 2026: 31 contributions (GitLab 31)May 18, 2026: 4 contributions (GitLab 4)May 19, 2026: 18 contributions (GitLab 18)May 20, 2026: 7 contributions (GitLab 7)May 27, 2026: 5 contributions (GitLab 5)May 28, 2026: 2 contributions (GitHub 2)Jun 4, 2026: 7 contributions (GitLab 7)Jun 5, 2026: 32 contributions (GitLab 32)Jun 6, 2026: 23 contributions (GitLab 14, GitHub 9)Jun 7, 2026: 5 contributions (GitHub 5)Jun 8, 2026: 16 contributions (GitHub 16)Jun 9, 2026: 20 contributions (GitLab 18, GitHub 2)Jun 10, 2026: 16 contributions (GitLab 16)Jun 11, 2026: 16 contributions (GitLab 16)Jun 12, 2026: 4 contributions (GitLab 2, GitHub 2)Jun 15, 2026: 1 contribution (GitLab 1)Jun 16, 2026: 4 contributions (GitLab 4)Jun 17, 2026: 8 contributions (GitLab 8)Jun 18, 2026: 1 contribution (GitLab 1)Jun 22, 2026: 21 contributions (GitLab 21)Jun 23, 2026: 2 contributions (GitLab 2)Jun 24, 2026: 7 contributions (GitLab 7)Jun 26, 2026: 4 contributions (GitLab 4)Jun 30, 2026: 5 contributions (GitLab 5)Jul 6, 2026: 6 contributions (GitLab 1, GitHub 5)Jul 7, 2026: 3 contributions (GitLab 1, GitHub 2)Jul 8, 2026: 3 contributions (GitLab 3)Jul 10, 2026: 8 contributions (GitLab 8)Jul 13, 2026: 9 contributions (GitLab 9)Jul 14, 2026: 7 contributions (GitLab 7)Jul 15, 2026: 7 contributions (GitHub 7)Jul 16, 2026: 1 contribution (GitLab 1)Jul 17, 2026: 1 contribution (GitLab 1)Jul 18, 2026: 2 contributions (GitHub 2)Jul 20, 2026: 8 contributions (GitLab 8)Jul 21, 2026: 9 contributions (GitLab 9)Jul 22, 2026: 12 contributions (GitLab 12)Jul 23, 2026: 2 contributions (GitHub 2)Jul 24, 2026: 22 contributions (GitLab 22)Jul 26, 2026: 1 contribution (GitHub 1)Jul 27, 2026: 1 contribution (GitHub 1)Jul 28, 2026: 12 contributions (GitLab 12)Jul 29, 2026: 6 contributions (GitLab 6)Jul 30, 2026: 3 contributions (GitLab 3)Aug 3, 2026: 13 contributions (GitLab 11, GitHub 2)Aug 4, 2026: 1 contribution (GitLab 1)Aug 5, 2026: 15 contributions (GitLab 9, GitHub 6)Aug 6, 2026: 24 contributions (GitLab 3, GitHub 21)Aug 7, 2026: 12 contributions (GitHub 12)Aug 10, 2026: 1 contribution (GitLab 1)Aug 14, 2026: 1 contribution (GitLab 1)Aug 15, 2026: 1 contribution (GitHub 1)Aug 16, 2026: 1 contribution (GitHub 1)Aug 17, 2026: 15 contributions (GitLab 1, GitHub 14)Aug 18, 2026: 31 contributions (GitLab 3, GitHub 28)Aug 19, 2026: 1 contribution (GitLab 1)Aug 21, 2026: 1 contribution (GitLab 1)Aug 22, 2026: 1 contribution (GitLab 1)Aug 24, 2026: 3 contributions (GitLab 3)Aug 25, 2026: 6 contributions (GitLab 6)Aug 26, 2026: 3 contributions (GitLab 3)Aug 30, 2026: 4 contributions (GitHub 4)Aug 31, 2026: 8 contributions (GitLab 4, GitHub 4)Sep 2, 2026: 3 contributions (GitLab 3)Sep 3, 2026: 24 contributions (GitLab 20, GitHub 4)Sep 4, 2026: 12 contributions (GitLab 9, GitHub 3)Sep 5, 2026: 1 contribution (GitHub 1)Sep 7, 2026: 4 contributions (GitHub 4)Sep 8, 2026: 3 contributions (GitHub 3)Sep 10, 2026: 4 contributions (GitLab 3, GitHub 1)Sep 11, 2026: 11 contributions (GitLab 11)Sep 14, 2026: 3 contributions (GitLab 2, GitHub 1)Sep 15, 2026: 10 contributions (GitLab 4, GitHub 6)Sep 21, 2026: 7 contributions (GitLab 7)Sep 22, 2026: 2 contributions (GitHub 2)Sep 23, 2026: 15 contributions (GitLab 11, GitHub 4)Sep 24, 2026: 19 contributions (GitLab 16, GitHub 3)Sep 28, 2026: 30 contributions (GitLab 28, GitHub 2)Sep 29, 2026: 23 contributions (GitLab 23)Sep 30, 2026: 61 contributions (GitLab 61)Oct 1, 2026: 9 contributions (GitHub 9)Oct 4, 2026: 9 contributions (GitHub 9)Oct 5, 2026: 9 contributions (GitLab 5, GitHub 4)Oct 6, 2026: 30 contributions (GitLab 14, GitHub 16)Oct 7, 2026: 24 contributions (GitLab 21, GitHub 3)Oct 8, 2026: 1 contribution (GitLab 1)Oct 9, 2026: 8 contributions (GitLab 8)Oct 12, 2026: 7 contributions (GitLab 7)