All work
Selected work first, starting with paid engineering. Everything else follows, newest first. 30 entries in all. Use the filters to narrow the list.
Work entries
Healthcare data software at metricHEALTH
Two years as a software developer at a Barrie health-tech company. I built the integrations that move clinical data between systems, automated the testing that kept releases safe, and replaced a weekly spreadsheet export with live dashboards.
Reading handwritten forms with AI (proof of concept)
A proof of concept I built at metricHEALTH. It reads scanned, handwritten enrollment forms and turns them into structured health records. When it is unsure about a field, it sends that field to a stronger model. 85% of fields cleared the confidence bar on the first pass.
Clinical Note Summarizer
A personal project. I fine-tuned a language model to turn doctor and patient conversations into short clinical notes, put it behind an API with a web front end, and set up automated deployment to Google Cloud. Built on public data as a demo, not for real patient records.
How should an AI read patient records?
A study on 13,800 questions about 200 synthetic patients. Records rewritten as plain text answered questions best (40.6%, against 33 to 35% for structured data). Structured data was far better for training a prediction model. Code and data are public.
A province-wide staff survey for Ontario public libraries
Volunteer work with the Ontario Public Library Association. I helped design, run and analyse a survey on workplace psychological safety: 1,236 responses from more than 60 library systems, presented at the OLA Super Conference.
Is a star classifier looking at the right physics?
A model sorted stars into three types with a macro-F1 score of 0.926. I removed the spectral lines astronomers use for each type and measured what broke. Two types relied on the right lines. The third had learned a shortcut.
FHIR for AI/ML engineers
A field guide to the healthcare data standard for engineers meeting it for the first time: what it solves, and where it leaves the hard part to you.
Tech Titans: teaching kids Python and robotics
A 24-session coding and robotics program for ages 9 to 14 that I designed and taught at Barrie Public Library, funded by a City of Barrie grant.
rocky_mini: A Robot's Brain, Built Sim-First, Now Running on the Reachy Mini
An embodied AI character (Rocky, the Eridian engineer from Andy Weir's Project Hail Mary) on a Reachy Mini Wireless, running on a fully local, zero-cost stack. Every model, audio and camera service sits behind a Protocol with a Fake, so the brain was built with no robot, GPU, or local LLM, and its 241 tests still run that way. Since then: a Qwen2.5-7B LoRA trained and gated on a local RTX 4080, three voice fixes on the physical robot, and Rocky tested there and working.
Will I Hit My Target? A Monte Carlo Planner with ML Inputs
I built a portfolio planner that feeds four machine-learning models into one Monte Carlo wealth simulation, then asks a concrete question. Given a target and a contribution, what are the odds, and how much more would move them? On the synthetic dataset the median lands just short, and the interesting part is what the simulation is made of.
The QSVM Coin Flip Was an Encoding Artifact: Quantum Kernels on Synthetic ICU Data
In July I blamed chance-level quantum SVM scores on the experiment's small size. A later ablation traced them to an unscaled angle encoding: rescaled on the same 200 rows, the QSVMs reach 0.70 to 0.80 ROC-AUC, and a post-hoc RBF SVM tuned the same way scores 0.810, above each on point estimate. All numbers are from synthetic data.
Raising an Alien in Simulation: Building a Robot's Brain Without the Robot
In July 2026 I built and tested Rocky's software brain in simulation, with no robot, no GPU and no local LLM in the loop, by putting every external dependency behind a Protocol with a Fake. Rocky has since been tested on the physical Reachy Mini and works; this corrected essay keeps the sim-first argument and records what changed.
Decoding the Surface Code: MWPM vs BP+OSD in Simulation
A self-study quantum error correction curriculum whose capstone is a Stim benchmark of two decoders. The fitted thresholds overlap within fit error, the accuracy edge is significant over part of the grid in the committed sweep, and the most useful lessons came from the numbers that later checks took back.
An Anxious Nomad Collective: A Weekly Substack of Book Reviews, Essays, and Long Looks at the Sky
A personal newsletter in the voice a day job does not allow. Book reviews are the entry point. The rest is poetry, personal essay, and slow science writing.
Stellar Spectra with Gradient Origin Networks
The cross-survey data-engineering layer for a Gradient Origin Network project on stellar spectra: survey-specific FITS readers, a ~30,000-star cross-match across APOGEE DR17, GALAH DR3, and Gaia-ESO DR4, and a DVC-tracked HDF5/Parquet store. The generative model itself is upstream; this is the pipeline that feeds it.
From Physics PDEs to PyTorch: What Experimental Physics Taught Me About Debugging ML
A physics undergrad spends a year staring at noisy oscilloscope traces and mis-zeroed polarizers. Years later, the same habits keep ML models honest. Characterize the instrument, plot the residuals, check the dimensions, flip the magnet.
QML-Essentials: a quantum machine learning curriculum, with classical baselines where they apply
Twenty-seven PennyLane and Qiskit scripts, one per curriculum week and all run on simulators, from a Bell pair to a quantum autoencoder. The tier 2 ledger holds no clear quantum win in its seven rows, and the results that taught me the most were the ones that fell apart under a control.
Firebird Community Cycle: Board Service for a Two-Location Bike Co-op
Volunteer board member and digital strategy lead for a Barrie not-for-profit (September 2022 to March 2026). Grant writing, POS procurement, and a city-partnered bike diversion program that keeps hundreds of bikes a year out of the landfill.
Dismantled by Design: The Truth Behind Modern Book Censorship
Investigative analysis of coordinated book banning campaigns, debunking myths with ALA data and PEN America reports.
Roots of Reality: Volunteer Researcher and Long-Form Writer for a Big History Podcast
Source-vetted research, social-media briefs, and full-length investigative articles for a Big History podcast that ListenNotes ranks in the top 2.5 percent globally. Volunteer role, since September 2025.
Debunking Denialism About Canada's Sixties Scoop Policy
Historical analysis confronting revisionist narratives about the systematic removal of Indigenous children in Canada.
Summoner: A Plan-Execute-Reflect Agent Framework on GCP
An extensible multi-agent scaffold built on Vertex AI, Cloud Storage, Pub/Sub, and Firestore, structured around a plan-execute-reflect loop you can unit test one phase at a time.
Quantum Kernels on Synthetic ICU Data: Tracing a Chance-Level Result to the Encoding
A seeded Qiskit benchmark on synthetic ICU data. Every quantum model sat at chance; rescaling the angle encoding lifted the quantum SVMs to 0.70 to 0.80 ROC-AUC, level at best with logistic regression.
Star-Type Classification: A Pipeline I Trust
A six-class stellar classifier in scikit-learn, wrapped in a ColumnTransformer pipeline and a two-script CLI that a teammate can retrain on a new CSV without reading the code.
CarePal: AI Wellness Companion for Seniors
Proactive AI companion for senior wellness checks and medication adherence. Built with the Cohere API and a retrieval-augmented LLM in 20 hours. 2nd place at the Georgian College GenAI Hackathon.
AutoML vs LSTM: Forecasting Iowa Liquor Sales
What three percentage points of forecast accuracy actually cost, on 19.4 million Iowa liquor transactions.
Divvy Bikes: A Year in 4.3 Million Trips
Behavioral and operational analysis of the full 2023 Divvy bike-share dataset, separating member from casual riders and recommending where the operational levers are.
A Century of Natural Disasters: Trends, Impact, and Response
Analysis of global disaster records from 1900 to 2021. Droughts and epidemics are far less frequent than floods and storms, and killed more people in total.
Real-Time Salary Stream: Scala, Spark Structured Streaming, Kafka, MySQL
Coursework streaming pipeline that ingests employee records over Kafka, classifies them by salary band in Spark Structured Streaming, and sinks the splits to dedicated MySQL tables and downstream Kafka topics. The whole thing runs in Docker Compose.
Neural Networks from First Principles
Backprop with a pencil before backprop in NumPy. A two-layer network for MNIST-shaped inputs, derived from the chain rule and implemented from scratch. The artifact is the math, not the accuracy.