The four-dependency bet
I made a rule early on and wrote a test to enforce it: the core of BreezeML may only ever import scikit-learn, pandas, numpy, and joblib. If a pull request adds a fifth hard dependency, the build fails. Four. Always.
It felt almost petty at the time. Every other low-code ML library reaches for more: a plotting stack, a boosting backend, an experiment tracker, a dozen transitive things you did not ask for. I watched people fight PyCaret's dependency resolver for hours and decided BreezeML would simply never put anyone in that position.
What I did not expect was that the same rule would hand me the coolest feature I have ever shipped.
The accident
I was reading about Pyodide, the project that compiles CPython to WebAssembly so Python runs in a browser tab. Out of curiosity I checked which scientific packages have prebuilt wasm wheels. scikit-learn: yes. pandas: yes. numpy: yes. joblib: yes.
That is the entire dependency list of BreezeML.
Because I had spent a year saying no to everything else, the library was, without
my ever planning it, portable to the browser. micropip.install("breezeml") and
it just runs. No server, no backend, no install. A student on a Chromebook can
train a real model, get a real leaderboard, read a real model card, all computed
on their own machine, in a page.
The lesson I keep relearning
Constraints are not the opposite of creativity. They are where it comes from. The four-dependency contract was a discipline, and discipline compounded into a capability I could not have designed on purpose. The honest promise on the box, "four dependencies, always," turned out to be the technical reason the most playful thing on this site is even possible.
I am building the rest of this site around that idea: not a page that describes BreezeML, but an instrument that runs it. More experiments soon.