Selected work in three areas: equipment designs
running in a power plant, software I built for school and business,
and machine learning models for the ERCOT grid. Each entry has a
short write-up and screenshots.
01Engineering
Flame Scanner for DLN1 Turbines
Invented a new style of flame scanner to overcome the
poor line of sight that plagues secondary flame scanners on gas
turbines with DLN1 combustion systems. The newly designed units are
currently in use on running turbines and are being manufactured by
BFI Automation. I presented the design at the NAES O&M
Conference in March 2026.
TODO: photos
External Lube Oil Cooling Unit for the GE Frame 7B
Designed an external lube oil cooling unit to keep oil
and bearing temperatures within specification during hot weather
runs. Applied heat transfer and fluid dynamics to calculate the
required heat removal in BTU/hr, then worked within a hard
constraint: no new penetrations into the lube oil tank, so flow was
limited to the tank's existing openings. Calculated the maximum flow
the piping could carry without cavitation and used it to size the
pump, then the fin fan and heat exchanger. An engineering company
produced drawings from the design, and the unit was installed on six
GE Frame 7B units. On a 90°F day, lube oil temperatures dropped
20 to 25°F, varying slightly between units.
TODO: photos
02Programming
MBA Finance Calculator
Fig 1. Accounting break-even screen. The revenue field is left blank and the app solves for it.
While working through corporate finance and managerial
accounting in my MBA, I kept rebuilding the same formulas in Excel
for each problem set. In an effort to stop repeating that work, I
built a desktop app that holds about 230 corporate finance formulas
in one place: time value of money, NPV and IRR, capital budgeting,
cost of capital, DuPont, EVA, and free cash flow, along with the
costing, CVP, and variance formulas from managerial accounting.
The feature that makes it useful is that every formula
solves for any unknown. Enter the variables you have, leave one
blank, and it solves for that one. It also produces full
amortization schedules. I designed and specified the app and
directed its AI-assisted development with Claude Code, then tested
every formula against the textbook examples from Brealey, Myers,
and Marcus. It builds for both Windows and Mac.
Python · Tkinter · Windows and Mac builds
03AI Builds
ERCOT Grid Intelligence
Fig 1. Dashboard home: live grid snapshot for the plant's node and the four tools.
This started as a price spike predictor proposal for an
MBA course and grew into a full dashboard. It runs XGBoost models on
a year of real ERCOT data pulled from the gridstatus and ERCOT APIs,
EIA natural gas prices, and Open-Meteo weather.
The models answer two questions a peaking plant cares
about. The first is whether real-time prices will spike above
$500/MWh one to four hours ahead, which it predicts with an AUC of
0.76. The second is whether the grid will enter an emergency
condition one to six hours ahead, which it predicts with an AUC of
about 0.99 and recall between 0.79 and 0.94. I backtested the
emergency model against Winter Storm Uri. The dashboard also tracks
wind and solar forecast error and uses SHAP to show which inputs
drove each prediction, so an operator can see why the model thinks
what it thinks instead of taking a number on faith.
Fig 1. Unit overview: nine units mapped to TEKS standards with auto-checked progress.
I built a complete high school chemistry course as an
interactive web app aligned to the Texas standards, TEKS
§112.43. Each unit has a lesson, worked examples, and
auto-graded practice problems, so a student gets immediate feedback
instead of waiting on a graded worksheet.
The AI work is in the content pipeline. I specified the
standards coverage and the problem formats, then used Claude to
generate the lessons and problem banks unit by unit and checked each
one against the standard before it went in. This is the same
approach I use on the plant simulator at work: define the structure
and the acceptance criteria, let the model fill it in, and verify
the output.