Work

Production data science, research, and the tooling I build for myself. Open a highlight for the full write-up.

Highlights

RushReady at Ecolab

Primary model developer of a quick-service restaurant analytics product, from first prototype through multimillion-dollar commercialization.

RushReady is an operations analytics product for quick-service restaurant brands. I have been its primary model developer since inception, and I own both halves of the problem: the platform that gets the data there and the models that make sense of it.

  • Platform. A near-real-time data platform built on Delta Live Tables, with an automated MLOps lifecycle spanning multiple QSR brands.
  • Models. Explainable anomaly detection with XGBoost and SHAP attribution, so every flag arrives with the features that caused it, plus brand-configurable recommendations built on top of them.
  • Result. A 20% increase in speed of service, and a product that went from prototype to a multimillion-dollar commercial offering.

I also represented Ecolab as liaison in Microsoft's 100-member AI accelerator program. Product details are proprietary; I'm happy to talk through the approach.

Built with Azure Databricks, Delta Live Tables, Apache Spark, XGBoost, SHAP, Data Factory, SQL

AI Homelab and Self-Hosted Web Tooling

A self-hosted cluster serving Mixture-of-Experts models beyond their rated VRAM, alongside the web services it hosts.

FreeToken cache configuration for Qwen3.6-35B-A3B on one RTX 5070 node.
FreeToken cache configuration for Qwen3.6-35B-A3B on one RTX 5070 node.

I pool GPUs from different vendors and generations into a single inference backend of roughly 20 GB over Vulkan. FreeToken, a bleeding-edge MoE inference server, fronts the cluster and handles the elastic part: only the experts a token actually routes to need to be resident, so models with far more total parameters than the cluster's VRAM can still be served. My own scripts handle KV caching and system-prompt compaction, which is what makes the setup usable as a backend for coding agents.

The screenshot is a single node: a 35B-parameter hybrid MoE/Mamba model at NVFP4, running in 12 GB of VRAM with an 89K-token KV cache, the MoE expert cache and the SSM state slots all sized live against the memory budget.

The same rig trains as well as it serves: I've fine-tuned Qwen small language models with PEFT/TRL and trained diffusion image models. It also hosts my personal web assets, including this site and the services on the status page. I voluntarily maintain production-grade systems at every level of the stack so I'll survive the Big Tech apocalypse.

Built with FreeToken, Vulkan, PEFT / TRL, ComfyUI, Docker, Cloudflare, Reverse Proxy

Human vs AI Code Smell Study

AI-generated code carries 3–4x more structural debt than human code, and reviewers don't see it.

Code-smell feature space (PCA) with KDE contours per author: human vs. five coding agents.
Code-smell feature space (PCA) with KDE contours per author: human vs. five coding agents.

I compared the maintainability of human-written code against code from five AI coding agents (Claude Code, Copilot, Cursor, Devin, and OpenAI Codex) across more than 85,000 code definitions, scoring each with mature code-smell detection algorithms and comparing the populations with non-parametric statistics.

The finding: AI code carries 3–4x more structural debt, and it is the kind of debt reviewers don't see. The paper recommends automated quality gates on AI-generated pull requests rather than relying on human review alone.

Built with Python, Static Analysis, Non-parametric Statistics

Reactive Chemistry Analysis at Dow

A reactive-chemistry analysis app that replaced four legacy VBA tools and became Dow's interdepartmental data standard.

Pressure vs. temperature trace, automatically segmented into heat-wait-search, exotherm, and cooling phases.
Pressure vs. temperature trace, automatically segmented into heat-wait-search, exotherm, and cooling phases.

During a co-op with Dow Chemical's Global Reactive Chemicals team, I independently built a Flask application that automates calorimetry analysis. It encodes adiabatic correction and exotherm-detection logic across 9 test types, and alerts on unusual or dangerous results from a wide range of testing environments and equipment.

The core design decision was an object-model abstraction that decouples each test type's parser from report generation. Adding a new instrument means writing a parser, not a new tool, which is how one app replaced 4 legacy VBA tools. It became the interdepartmental data standard, saving more than 1,020 hours (about 0.65 FTE) a year.

Built with Python, Flask, Azure, Posit Connect, Docker

Stereo Particle-Track Classification in a Cloud Chamber

My M.S. capstone: a three-camera diffusion cloud chamber that reconstructs particle tracks in 3D and classifies them with calibrated uncertainty.

Planned apparatus, top-down: three calibrated cameras around the chamber, with a fixed spike-in source port and an optional magnet for later charge discrimination.
Planned apparatus, top-down: three calibrated cameras around the chamber, with a fixed spike-in source port and an optional magnet for later charge discrimination.

For a century, cloud chamber tracks have been classified by eye: alphas are short and thick, betas long and wandering, muons long and straight. A single camera makes that worse. A track angled away from the lens is foreshortened, which biases any length-based rule, and the rule returns a hard label with no confidence exactly where it is least reliable.

  • Apparatus. A diffusion cloud chamber imaged by three hardware-synchronized Raspberry Pi cameras, calibrated with Zhang's method in OpenCV and validated by triangulating an object of known length before any particle data is trusted.
  • Data. A spike-in protocol: background-only sessions (cosmic muons, radon-daughter alphas), then sessions with unlicensed alpha and beta sources at fixed positions, which gives weak ground-truth labels without breaking the bank or breaking into the IAEA.
  • Models. Three tiers on the same features: classical length/width thresholds, a supervised ML baseline, and a Bayesian classifier that propagates calibration and triangulation error into a calibrated posterior over particle type. Each tier runs on both single-camera 2D and triangulated 3D features to measure how much 3D reconstruction actually corrects the bias.
  • Monitoring. Shewhart and CUSUM control charts on session-level statistics flag anomalous chamber conditions; the deliberate spike-in shifts double as a validation of the monitor itself.

The proposal is approved and construction starts this fall. Results will be posted here.

Built with Python, OpenCV, Raspberry Pi, Bayesian Inference, Statistical Process Control

More projects

11 entries

  1. Why Gold Is Gold

    complete research, programming

    Derives the colour of gold from the Dirac equation, with atomic number, lattice constant, and resistivity as the only inputs: a relativistic Kohn–Sham atom, a fully relativistic LMTO band structure, and interband optics through to a CIE colour, all recomputed live in your browser. Relativity drags gold's absorption edge into the visible; set c → ∞ in the same code and gold turns silver-white. Validated against NIST atomic data and full-potential band structures (the edge sits about 0.2 eV low, so this gold comes out rose).

  2. PhysCom - Physical Combinatorics

    WIP programming

    An innovation discovery engine that takes the Cartesian product of real, proven physical entities (platforms, power sources, energy storage) and pushes every combination through a 5-pass pipeline: constraint resolution over typed requires/provides/excludes dependencies, a deterministic physics estimator that sizes each combination from its own declared attributes, domain-weighted scoring by geometric mean over log-normalized metrics, batched LLM plausibility review of the top candidates, and a final human review pass. It separates the hydrogen bike from the solar-sail train.

  3. Generalized Trust Review

    complete research, statistics

    Trust in the press and trust in science move together (r = 0.624, p < 0.001 across 128 countries), but the link attenuates 5.7x in low press-freedom regimes. Cross-national correlation analysis with subgroup OLS regression.

  4. Slate

    complete programming

    Finds the best meeting windows for a group by vectorizing participants' iCalendar data into discrete-time signals and scoring them against weighted constraints. Periodic fold analysis surfaces recurring availability patterns across an 80-member organization. Integrated with Computer Science House accounts.

  5. Antietam-Conococheague Watershed Monitoring

    complete geospatial

    ArcGIS choropleth dashboard tracking stream temperatures and biotic indices across Maryland's Antietam and Conococheague sub-watersheds of the Upper Potomac through the summer months, flagging exceedances of healthy stream conditions for state environmental review.

  6. Geography of Alternative Energy

    complete geospatial

    An ArcGIS geospatial analysis comparing how effective wind, solar, and geothermal energy are across the contiguous 48 United States.

  7. Automotive Brand Valuation Analysis

    complete statistics

    Brand valuation analysis of the used car market, measuring value decay by mileage to infer qualities such as perceived reliability and how well luxury features hold their value.

  8. RIT Hotspots

    incomplete geospatial, programming

    Live crowd migration map built on RIT's building occupancy data. RIT changed the service's response schema several times while I kept the map working, then shut the service down entirely.

  9. OccupyRIT

    complete programming

    Collects RIT gym occupancy data over time to find the busiest and quietest workout hours.

  10. Monte Carlo Engine for NationsGame

    complete programming, statistics

    A Monte Carlo simulator for the browser game NationsGame that analyzes unit composition to predict battle victors and unit statistics. NationsGame is now defunct, so only limited screenshots remain.

  11. Portfolio Website

    complete programming

    This site: a self-hosted Flask app with no front-end framework. Pages swap in client-side through a small JSON API, static assets are content-hashed for immutable caching, a background monitor records uptime for my services in PostgreSQL for the status page, and the background is a marching-squares contour field drawn over drifting value noise.