
Wheelbase
2024–PresentAuction intelligence, inventory, and recon for used-car dealers. Hybrid vector search ranks every auction car against real inventory gaps; a governed AI assistant runs the rest.
TypeScript · React · TanStack Start · tRPC · Go
02Projects
Three products in production, a handful of ML and systems experiments, and a fix merged into pandas.
I — In production

Auction intelligence, inventory, and recon for used-car dealers. Hybrid vector search ranks every auction car against real inventory gaps; a governed AI assistant runs the rest.
TypeScript · React · TanStack Start · tRPC · Go

Graded readers where A2 is actually A2. Every passage is checked by a morphological analyzer before you read it.
Next.js · FastAPI · Sudachi · CAMeL Tools · spaCy

Click a sentence. See the structure. Universal Dependencies first, AI explanation second.
spaCy · Stanza · FastAPI · Next.js · Supabase
II — Experiments
2026
A read-only GitHub App that turns each merged pull request into a reviewed changelog draft: dependency bumps and CI-only diffs are filtered out before any model call, then one Claude call writes a customer-facing note, a technical note, a category, and a confidence score. Approved entries push to Slack and an in-app launcher widget, with Stripe plans and Upstash QStash jobs so it runs serverless on Vercel.
Next.js · Supabase · GitHub Apps · Upstash QStash
Completed
Interactive WebGL globe over 177,000+ records from the Global Terrorism Database (1970–2017), plus a seven-view analytics dashboard covering trends, regions, attack types, targets, weapons, and hotspots.
React · Globe.gl · FastAPI · Pandas
Completed
Random forest regressor predicting adolescent phone-addiction risk from behavioral survey data, tracked with MLflow and served through a FastAPI endpoint that always loads the latest registered model, with a Streamlit dashboard for exploration and live prediction.
Python · scikit-learn · MLflow · FastAPI
Completed
Binary skin-lesion classifier (benign vs. malignant) trained on 10,015 HAM10000 dermatoscopic images, with four training pipelines across TensorFlow and PyTorch and export to Apple Core ML for on-device iOS/macOS inference.
TensorFlow · PyTorch · coremltools · MLflow
Completed
A minimal, htop-inspired process monitor in C++17 with an ncurses UI, reading live process data straight from the Linux /proc filesystem and refreshing every second.
C++17 · ncurses · POSIX · procfs
contributions in 532 contributions in the last year
III — Open source
Plotting a frame with duplicate column names told you there was no numeric data, even when every column was numeric. The real cause was in MPLPlot.__init__: with non-unique labels, data[col] returns a DataFrame instead of a Series, is_numeric_dtype says False, and every column is silently filtered out.
Real duplicate-column support would mean reworking label-based indexing across the plotting pipeline, which the issue itself flagged as a much larger job. So I scoped it: a guard clause before any filtering, and a parametrized regression test for both plot kinds. It merged as submitted.
df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
df.columns = ["a", "a"]
df.plot.hist()
# TypeError: no numeric data to plotif isinstance(data, ABCDataFrame):
if self._kind in ("hist", "box") and not data.columns.is_unique:
raise ValueError("plotting requires unique column names")df.plot.hist()
# ValueError: plotting requires unique column names