2026 — Present
mldrills
There was a gap between watching a machine-learning course and sitting down to solve something. LeetCode covered algorithm practice, but there were fewer places for ML coding drills, math, and conceptual questions with feedback. A scratch notebook could hold the work, but it didn't track what a learner could actually do.
I built MLdrills around solving problems in the browser. There are individual drills, ordered tracks, interview sets, and larger projects. Submissions get graded, and solved work, previous attempts, and streaks stay attached to the learner's account.
The project IDE gives the larger exercises somewhere to live alongside the shorter drills. Both it and the learner app use React, TypeScript, and TanStack Start.
What stays outside the browser
The grading boundary shaped quite a bit of the product. I wanted quick feedback, but hidden tests couldn't live alongside the editor in the client.
I put grading behind a FastAPI API, which also handles Supabase auth and data. A submission goes through that API into an isolated Python run on Modal. The browser polls for the result; it doesn't run the hidden tests itself.
That means more orchestration and a separate deployment to look after. It also keeps the tests and grading logic off the client. The interaction looks like submitting code and getting feedback, but there's a boundary in between that I needed to preserve.
Later, I pulled the in-browser editor and Python trace tooling into separate packages to keep the IDE lean. Those pieces no longer have to sit inside the application itself.
MLdrills is live (opens in a new tab) and still under active development.