Database
Why I Built An Open Source Alternative To WeTransfer
Obakeng Mosadi (Baki) DEV Community
2 views
During university I was sending photo sets to clients most weeks. I'd zip them up, upload them to Google Drive and send a link.
It worked for me for the most part. But my client files sat in the same drive as everything personal I owned, and the link I sent looked like nothing that had to do with my work.
Then I found WeTransfer (I think I might've stumbled on it on social media at the time). Upload, enter an email, send and that was it. It felt like handing someone the work rather than filing it somewhere, and that difference turned out to matter more to me than any feature either product had.
Nine years later I built Campsend, an open-source, self-hostable version of that. Rails 8 and SQLite.
What Changed My Mind About Ownership
In 2025 WeTransfer updated its Terms of Service. The new wording covered what they could do with uploaded content, including machine learning use, and enough people read it the same way that WeTransfer changed it back within a week. And for me, that raised a bunch of questions.
Who controls the files I send? What happens when the pricing changes, or the business model does? And what happens when I already have a bucket and want the files to land in it?
I wanted that delightful sending experience that WeTransfer gave me without handing over the storage layer.
Why the Existing Options Didn't Fit
I looked at what was already out there. MASV is hosted, so it has the same problem. Erugo self-hosts, but it feels like a super file sharing app that still didn't feel like a nice file sharing experience.
They're solving real problems.
Mine is smaller and more opinionated: Send work to a client, make the delivery look like mine, keep the files where I put them.
That's all.
What Campsend Does
You send files, brand the delivery page, see whether the recipient opened or downloaded it and choose where the files are stored. You can also run the whole thing yourself and point it at your own object storage.
Self-hosting was the part I cared about most, which meant the app had to be simple to operate.
Why Rails 8 and SQLite
Rails 8 went in the direction I needed: fewer moving parts to stand up before the app runs. I didn't want self-hosting Campsend to mean provisioning a queue, a cache, a session store and a Postgres cluster first. I wanted one application, one database, object storage and a deploy.
SQLite fits that need. Campsend is built around a single writable host.
I've load tested it on a laptop: 200 concurrent users, 72 requests a second, 3.3 deliveries created a second, and a p95 of 36ms measured at the server. SQLite never hit lock contention once. What I ran out of first was Puma threads, not database. (I could end being proven wrong here but I think for most use cases, it will work).
Two Things I Didn't Expect
The first was the storage bill. Cloudflare R2 charges $0.015 per GB per month with no egress fee; S3 charges $0.023 plus $0.09 per GB out. Sending 100GB to clients in a month costs $2.30/month on S3 and $1.35/month after R2’s free 10 GB. Almost none of what you pay a file-sharing service is storage. It's the product around it.
The second was how little I had to build. Authentication, email, background jobs, database access and file storage were already there, so most of my time went into the delivery experience instead of the plumbing.
Which turned out to be the interesting part. File sharing and file management are different jobs, and only one of them needs a folder structure.
What's Next
I'm writing up how to self-host Campsend, and the SQLite post above. Try it at Campsend or read the source on GitHub. Issues and pull requests welcome.
Everyone's building storage platforms. I want a beautiful file sharing experience.
Read original: https://dev.to/bakimosadi/why-i-built-an-open-source-25f4
← Previous
EU Commits €200 Million to Greenland Connectivity, Satellites and Data Infrastructure
Next →
Temperature 0 Isn't Deterministic: Why Your LLM Still Drifts
Related
My AI audit tool was merging Claude and Cursor sessions. The bug was one UNIQUE constraint.
Database
0
DEV Community
Ten NocoBase workflows, one increment: measuring lost updates
Database
5
DEV Community
Building a Vector Similarity Detector: How One SQL Query Over 2.9M Charity Pairs Reveals the Gap Between Meaning and Spelling
Database
4
DEV Community
Where Need Meets Nothing: finding Florida's aid deserts with Snowflake
Database
4
Dev.to (EN Zone)
Comments0
No comments yet — be the first