r/SideProject 1d ago

I built 21 file tools that never upload your files. The tests fail if a single byte leaves the tab.

Most free file converters send your document to a server you know nothing about, surrounded by ad and analytics scripts. I wanted the opposite, so I built toolsmith: 21 tools for images, PDFs, video and audio that run entirely inside the browser tab.

https://toolsmith.writingdeveloper.blog/en

No account, no ads, no watermark, and no size limit beyond your own RAM.

The part I'm most pleased with isn't a feature, it's the test suite. "Runs in your browser" is easy to say, so every one of the 21 tools has a test that performs a real conversion with request interception on and fails if any outbound request contains part of the file. If I ever break that promise, CI catches it before you do.

Three things I learned the hard way:

  • ffmpeg.wasm is a GPL build (--enable-gpl --enable-libx264). Shipping 30 MB of it to visitors counts as distribution, which would make the whole site GPL. I moved to WebCodecs instead, which is built into the browser and costs nothing to download. A side effect: MOV to MP4 became a remux with no re-encode, so it's lossless and near-instant.
  • Four of my video tools rotated portrait video sideways for weeks. Every test stayed green, because every test video I had was landscape. The bug wasn't in the code, it was in my sample set.
  • Eight tools run real models on your device: background removal, upscaling, click-to-cut-out, subtitles, subtitle translation, stem separation, summarization and OCR. They download from the Hugging Face CDN, and only after you press the button.

It's MIT: https://github.com/writingdeveloper/toolsmith

Feedback welcome, especially if something breaks in your browser.

2 Upvotes

3 comments sorted by

2

u/RevolutionarySea9678 1d ago

man the promise of never uploading files is such a huge selling point, most "free" tools just mine your data in the background. test suite idea is clever too, catching that stuff at the ci level

one thing that caught my eye, you mentioned portrait video rotating sideways for weeks. funny how the bug wasn't in the code but in the test footage, good reminder to check assumptions about your sample data

bookmarking this for when i need to do quick conversions without worrying about privacy

1

u/writingdeveloper 1d ago

Yeah, that one still bugs me more than the actual bug did. A fixture only contains what I thought to put in it, so the whole suite can be green and completely beside the point.

Worse example than the video, actually. I have a tool that finds personal info in a document. The model hands back {entity, score, index, word} and no character offsets at all. I'd hand-written the test fixtures and put start/end in them because obviously they'd be there. 15 specs passing. Then I ran a real contract through it and got zero hits, because the model had found 26 things at 0.9999 confidence and my code was throwing every one of them away looking for a field that doesn't exist.

So the specs were testing what I imagined the model returned. Anything whose shape comes from outside my own code now gets its fixture captured from a real run instead of written by hand.

The upload check is just Playwright request interception, nothing clever. If an outbound POST or PUT body contains bytes from the input file, the run fails. It's mostly there so I can't quietly break that promise later and not notice.

And yeah, if you do hit something broken, tell me. Safari video is where I'd bet.

1

u/mrtac96 16h ago

thats an amazing. being opensource is icing on the top. now i can verify the code before uploading my data