- Integrated Google PaLM into a production email platform so non-profit clients could auto-draft campaign content.
- Built and maintained core features of a mass-emailing SaaS product in Vue.js, JavaScript, and ColdFusion, including a customizable template system that let clients launch branded campaigns without engineering help.
I build AI applications, and I spend most of my effort on the part that looks correct and isn't.
Most recently: tracepath, a RAG command-line tool that answers questions about a project's decisions from its specs and decision records, with every citation checked in code. Before that I built JobHunt, a multi-user job search platform where 15 of 16 authored ground-truth pairs landed in their expected band, and decision-memory, a cited RAG system that publishes its own wrong-answer rate. I work across React, Next.js, Vue, and Django.
About
I have a Master's in Computer Engineering from Georgia Tech and have built full-stack web applications with Vue.js, React, JavaScript, and Django across internship, contract, and research roles. Over the past year I've put that into AI applications, and into classical ML in classification and regression.
A check that passes is a claim, not a proof. A validation split can score beautifully, a webhook can succeed twice, a model can answer confidently on no evidence, and nothing flags any of it. Those are the bugs I care about.
Work experience
- Worked in a Scrum environment with designers and backend developers to translate client requirements into technical specifications.
- Queried and analyzed large-scale datasets in AWS Athena to design QA dashboards that checked data integrity before client delivery.
- Authored technical documentation and process-flow diagrams for a suite of Python scripts, giving business users a self-service reference.
- Took over frontend development on a Bluetooth Low Energy IoT platform (GAMMA Research Group / Center for Distributed Energy) that monitors grid equipment: voltage, temperature and power. Built the React features for live device data and dataset export.
- Integrated the React frontend with a Firebase (NoSQL) backend on Google Cloud so device telemetry reached the application.
Education
Latest work
tracepath
Python · Neo4j · Claude API · RAGA RAG command-line tool that answers questions about a project's decisions from its specs and decision records. An LLM extracts each spec into typed, cited items in a Neo4j graph. Every answer cites those items, with each citation checked in code against the items the model was sent. Every paid call is checked against a cost ceiling before it is made.
My first design walked links between documents and answered 1 of 5 eval questions, so I measured why, rebuilt it around retrieval plus one checked model call, and froze the prompt before running questions it had never seen. On all nine questions, the five eval ones plus four held out, my earlier tool, decision-memory, abstained on every one; tracepath gave an answer on all nine. That compares two whole systems on different models and different inputs (decision-memory reads only each spec's index.md and rationale.md), so it is not a verdict on graphs versus vector search.
JobHunt
Next.js · TypeScript · Postgres (Supabase) · Row-Level SecurityA multi-user job search platform, built from the stack decision onward. OAuth sign-in through Google and GitHub, real-time search against the Adzuna API, and application tracking, backed by a Postgres schema with row-level security enforced on every table. Every account's usage is metered by an atomic gate that holds exactly at its limit under real concurrent load: with 15 accounts against a cap of 5, it let exactly 5 through and none slipped past. GitHub Actions runs lint, type checks, and unit and integration tests against a real local database stack on every pull request, and applies schema migrations on merge.
I tested the failure handling by breaking things on purpose. In development, a forced-failure chain confirmed a Sentry alert reaches a delivered email. A rollback drill, run early on the scaffold homepage, broke the live production site and restored it by promoting the previous build.
It scores real listings against a user's profile through GPT-5.6 Luna in production, with a deterministic filter that drops any skill the model invents but the caller doesn't actually have. I built an eval harness and measured whether the scoring holds up instead of assuming it: of 16 authored ground-truth pairs, 15 landed in their expected band. The ground truth was authored from the same rubric the scorer reads, so this measures consistency with that written definition, not independently validated real-world accuracy. That is the honest scope of what a first-version internal eval can prove. One of the sixteen was corrected after review, a wrong expected answer in the test data itself, not a change to how the model scores. The 15 of 16 is from the run before that correction; I haven't rerun the full set since. The remaining miss traced back to a specific, repeatable gap in the rubric's calibration, and I flagged it for the next revision rather than writing it off as noise.
decision-memory
Python · RAG · Clean Architecture · LLMA locally indexed, cited RAG system that makes software decision history queryable. When the evidence doesn't support an answer it says so instead of inventing one, and the README documents the rate at which it still answers wrong. A per-sub-claim verification layer runs exact containment checks and LLM verification, then drops any sentence its cited evidence doesn't support. I've paused development.
The conformance suite fails any adapter that emits a confident record from malformed, empty, or invalid-UTF-8 files. A live evaluation harness runs the system against a real corpus, checks whether it answers or abstains as expected and cites the required records, and reports its failures openly.
Heart Disease Risk Predictor
Compared Logistic Regression, KNN, and Random Forest on clinical patient data, then picked the model that trades overall accuracy (~85%) for higher recall (~91%). In a screening context, missing a high-risk patient costs more than a false alarm, so recall was the metric worth optimizing.
Bulldozer Sale Price Predictor
Predicts used heavy-equipment auction prices from over 400,000 historical sales. A RandomForestRegressor reached 0.244 validation RMSLE after two-stage tuning, with time-series feature engineering and error analysis broken out by equipment category.
Contact
I'm looking for a role. The work above is my case for it. Here's how to reach me.
I'm actively looking for full-time AI Engineer and Software Engineer roles. Whether you've got an opportunity, a question about one of my projects, or just want to talk shop, I'd love to hear from you.
Every cyan mark on this page points at something you can open and check. The yellow ones are my judgment calls, labelled as such so you can tell the two apart.