I build backend systems and developer tools, and prove they work.
Software engineering intern at Schweitzer Engineering Laboratories and Software
Engineering student at Washington State University, graduating December 2026.
The personal projects below all run live on this page.
Python libraries and extensions for the RTAC automation platform that ship to SEL
customers. Built a context manager that made library load and save up to 15× faster,
cut GridConnect save times by 14–77% by batching operations and caching Modbus
parsing, and implemented WebSocket routing and frame handling for EV-charging
integration.
Took technical ownership of validating two regulated laboratory systems backed by SQL
Server: T-SQL checks for data integrity and audit trails, and automated OQ/UAT suites
in pytest, pyodbc and pandas built to 21 CFR Part 11 and GDPR.
Expected Dec 2026
B.S. Software Engineering, Washington State University
Minor in Mathematics. Selected student representative for the ABET accreditation review.
Projects
These are my personal projects, and the source for each is on my GitHub. Every demo
runs the project's own code on this server and loads its result when you scroll to
it. Change the inputs and run it again.
FaultLine
Chaos experiments that state a hypothesis, inject a real fault, and return a pass or fail with the evidence.
Does the shop service keep orders under 60 ms when something breaks?
Loading saved run…
Eight CPU-burning processes compete with the service for 6 s.
POST /api/orders (graded)GET /health60 ms SLOFailed requestEvent log
About this demo
FaultLine spawns its bundled shop service, probes POST /api/orders and
GET /health every 0.4 s, injects the fault for 6 s, then grades three
hypotheses on the orders probe: steady state before the fault, behavior during it,
and recovery after. The last run of each choice is saved and shown on load; one
experiment runs at a time, so if someone else is running one you will watch theirs.
Python
asyncio
FastAPI
SLOs
Chaos engineering
API Contract Tester
Catches API changes that would break existing clients before a release, and checks live responses against the contract.
Would releasing Orders API v1.3.0 break clients built for v1.2.0?
Loading…
Select a change to see its line. Choose Edit v1.3.0 to change the spec; the diff updates as you type.
A v1.2.0 server still answers GET /orders/{order_id} like this. Does the response honor the v1.3.0 contract?
About this demo
The diff is direction-aware: a new required field breaks clients that send requests
but not clients that read responses, and a removed field is the reverse. Schemas used
both ways get the stricter verdict. Validation runs the project's own contract
enforcer, which converts the operation's response schema to JSON Schema and reports
field-level drift.
Python
OpenAPI
JSON Schema
FastAPI
SQLAlchemy
CodeRAG
Answers questions about a codebase with sentences quoted from the code they cite, and says so when it has no good answer.
Ask a question about the CodeRAG repository itself.
Loading…
About this demo
The demo server keeps no language model loaded, so it runs CodeRAG's offline mode:
BM25 retrieval over each function's name, docstring and code, then an extractive
answer built only from sentences in the retrieved code. When the best passage scores
below 0.20 it refuses instead of citing weak matches. With a local model, the same
pipeline embeds chunks with nomic-embed-text and writes the answer with an LLM.
Python
RAG
BM25
Embeddings
Ollama
Vulnerability Scanner
A fast static first pass for SQL injection, XSS, hardcoded secrets and outdated dependencies, graded on code with known answers.
On an app with planted flaws and safe look-alikes, what does it catch and what does it miss?
Loading…
About this demo
The rules are line-based regular expressions, each paired with a suppression for its
most common safe look-alike (parameterized queries, escaped templates, environment
lookups). Every line of the sample app that matters is labeled in
expected.json, so precision and recall are measured, not claimed. The one
miss is deliberate: SQL built across two lines needs taint analysis, which line rules
cannot do.
Python
Static analysis
Security
FastAPI
Performance Profiler
A decorator that records CPU time, wall time and memory per function, so you fix what the measurements say is slow.
An order report is slow. Which function should you fix first, and did the fix work?
Loading…
CPU timeWaiting (I/O)
About this demo
The report loads 1,000 orders, counts VIP customers and totals revenue for each day
of the year. Each step has a classic slowdown and its fix: N+1 queries versus one
JOIN, list versus set membership, and a scan per day versus one pass. SQLite runs in
the same process, so each query also sleeps 0.1 ms to model a database round trip;
that is why N+1 shows up as waiting, not CPU. Numbers are measured on this server
for each run.
Python
Profiling
tracemalloc
SQLite
FastAPI
CNC workflow
Three Python projects that form one pipeline: inspect a program, turn a drawing into a program, then shorten the route between cuts.
1G-code Visualizer
Parses CNC G-code into a toolpath you can step through move by move, including arcs, drilling cycles and units.
Supports G0/G1, XY arcs with I/J or R, G20/G21, G90/G91 and drilling cycles (G81–G89,
drawn as holes). Codes that do not change the XY path, such as tool changes and
spindle commands, are listed as notes; codes the preview cannot model, such as G28 and
cutter compensation, are listed as warnings. Distances include Z moves; the plot shows
XY. This previews geometry; it does not verify a program for a machine.
Python
G-code parsing
Matplotlib
2DXF to G-code
Reads a CAD drawing with ezdxf and generates the G-code that cuts each contour, with depth, safe height and an estimated cycle time.
Which lines of G-code cut which part of the drawing?
Loading…
Hover or tap a contour to highlight its G-code.
Generated G-code
About this demo
Accepts LINE, LWPOLYLINE (including bulges), ARC and CIRCLE on the XY plane in
millimetre or unitless drawings, up to 100 entities and 500 KB. Curves are cut as
chords of at most 2°. Cycle time assumes the programmed feed and 5,000 mm/min
rapids. The program has no tool changes or cutter compensation; check tooling and
controller setup before machining.
Python
ezdxf
Geometry
3G-code Optimizer
Reorders independent cuts to shorten rapid travel, comparing nearest neighbor, X sorting and 2-opt on the same layout.
How much travel does a better visiting order save, without changing a single cut?
Loading…
Original orderOptimized order
About this demo
Each contour keeps its direction and start vertex; only the visiting order changes.
2-opt starts from the nearest-neighbor route and reverses sub-sequences while travel
drops. Because a contour can end away from where it starts, each reversal is scored
on the whole route with prefix sums, O(n²) per pass. Savings are XY rapid distance
from the origin and exclude Z travel. The original order is kept if a heuristic would
make it worse.
Python
Heuristics
2-opt
Geometry
Skills
Python, asyncio, FastAPI, Pydantic
Personal projects: every demo backend on this page and FaultLine's experiment runner.
APIs and contracts: OpenAPI, JSON Schema, WebSocket
Personal project: API Contract Tester. SEL internship: WebSocket routing and frame handling.
Testing and quality: pytest, ruff, mypy, GitHub Actions
Personal projects: CI on every repository. Alturas internship: validation suites built to 21 CFR Part 11.
Performance: profiling, caching, query design
Personal project: Performance Profiler. SEL internship: 15× faster library load and save.