I set myself one rule for a side project: every tool has to run entirely in the user's browser. No file ever gets uploaded to a server. If I couldn't do something client-side, it didn't ship.

That rule turned out to be a great filter for what to build, and a brutal filter for how. Here's what actually broke along the way — a broken model file caught by physically-impossible output, an upstream ONNX Runtime bug, and a memory ceiling that only shows up on long files. If you're building AI features that run on-device, some of this will save you a week.

The site is WeConvertIt — image, PDF and audio tools that all run locally. Three of them use real models in the browser: background removal, music/vocal stem separation, and speech-to-text.

1. The model file was broken, and it took a physics violation to prove it

The stem splitter (split a song into vocals and instrumental) uses Meta's HTDemucs, which is MIT-licensed and genuinely state of the art. I grabbed a third-party ONNX export of it, wired it up with onnxruntime-web, and the output was garbage — robotic artifacts, vocals still sitting in the "instrumental" track at nearly full volume.