BreezeML
Back to field notes

/

The four-dependency bet

breezemldesignwasm

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.