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.

Skills
Python · SQL · Structured LLM outputs · Prompt engineering · RAG · LLM evaluation · Cross-validation · Vue.js · Django · AWS · Firebase · NoSQL · Scrum / Agile
Stack
JavaScript · TypeScript · Python · React · Next.js · Tailwind · CSS3 · HTML5 · scikit-learn · pandas · NumPy · Neo4j

Work experience

Software Engineer B-Line Express · Remote May - Aug 2023
  • 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.
Software Engineer, Enterprise Data Management Moody's Analytics · Remote Jun - Aug 2022
  • 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.
Graduate Research Assistant Georgia Institute of Technology · Atlanta, GA Jan 2021 - May 2022
  • 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.
Additional experience
Sales AssociateLA FitnessMar 2025 - Jul 2026
Sales AssociateT-Mobile (GP Mobile)Jun 2024 - Aug 2024

Education

M.S. Computer Engineering Georgia Institute of Technology 2021 - 2022
B.S. Computer Science ESIH, Port-au-Prince, Haiti 2015 - 2019

Latest work

tracepath

Python · Neo4j · Claude API · RAG

A 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.

8/9
questions answered right, 1 partly · expected answers written before the run, judged by me, 4 held out
10/10
unanswerable questions declined, 0 invented answers · questions written and marked by me
18
logged experiments · several with predictions or decision rules committed before results
1,229
tests passing · integration against real Neo4j

JobHunt

Next.js · TypeScript · Postgres (Supabase) · Row-Level Security

A 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.

15/16
eval pairs in the expected band · measures rubric consistency, not real-world accuracy
1,840
tests passing in CI · 1,580 unit, 260 integration against a local database stack
Every table
row-level security enforced · multi-tenant from day one
5 of 15
accounts admitted when 15 hit a cap of 5 at once · none slipped past

decision-memory

Python · RAG · Clean Architecture · LLM

A 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.

713
unit tests, passing
264
conformance checks · 2 adapters · 0 failures
4
layers · no external imports in domain · mypy + Ruff

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.

Earlier work
Heart Disease Risk Predictor app

Heart Disease Risk Predictor

Python · scikit-learn · Streamlit

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 app

Bulldozer Sale Price Predictor

Python · scikit-learn · regression · Streamlit

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.