DEV Community

Cover image for I built 16 free PDF tools in a month — here's what surprised me
Nitesh
Nitesh

Posted on

I built 16 free PDF tools in a month — here's what surprised me

I built PDF One — a free online PDF studio... (compress, merge, split, PDF↔Word/Excel, protect, rotate, delete pages, and more). No signup, no watermark, no file size limit under 50 MB.

I'm a solo developer. This wasn't a startup — it was a side project to learn production Flask deployment and get better at shipping. Here are the things that genuinely surprised me.

  1. The tools were the easy part I expected the PDF manipulation to be the hard part. It wasn't. pypdf, pdfplumber, openpyxl, and reportlab handle 90% of the cases. Each tool took a few hours to build and test.

The hard part was everything around the tools: Google OAuth, Razorpay signature verification, Postgres migrations, rate limiting, keeping the deploy pipeline from breaking every time I pushed. That's the 80%.

  1. Client-side processing changes everything Rotate Pages and Delete Pages run entirely in the browser using pdf.js and pdf-lib. The file never leaves the user's device.

Benefits:

Zero server cost — no processing, no storage

Instant — no upload time

Honest privacy claim — the file literally cannot be leaked

Downside: browsers block programmatic file pickers. You can't open the picker with input.click() unless it's triggered by a real user gesture. So my /rotate-pages landing page links to the homepage where the user clicks one more time.

Three extra lines of code, one extra click for the user, huge win in bandwidth and trust.

  1. Office document conversion on Linux is a trap Excel to PDF works — I use openpyxl + reportlab, both pure Python.

Word to PDF and PowerPoint to PDF do not work on Linux unless you install LibreOffice headless (adds ~200 MB to your Docker image). I tried it. It works, but it's slow on a free tier and eats memory.

For those two tools, I now return a friendly message: "This tool requires Microsoft Word. Please use File → Save As → PDF instead." Users don't complain when the message is clear.

  1. Rate limiting is not optional I put flask-limiter on every sensitive route:

python
@limiter.limit("5 per minute")
def login(): ...

@limiter.limit("10 per minute")
def word_to_pdf(): ...
Without this, one script can DoS you. flask-limiter is 3 lines of setup. Just do it.

  1. Payment verification is where you lose money I originally had this:

python
@app.route('/activate-vip', methods=['POST'])
def activate_vip():
cursor.execute("UPDATE users SET is_vip = 1 WHERE id = ?", (current_user.id,))
Any logged-in user could open DevTools and grant themselves VIP for free:

js
fetch('/activate-vip', {method: 'POST'})
The fix is one Razorpay call:

python
razorpay_client.utility.verify_payment_signature({
'razorpay_order_id': order_id,
'razorpay_payment_id': payment_id,
'razorpay_signature': signature,
})
Verify first, then activate. Never the other way around.

  1. SQLite on Render will betray you Render's filesystem is ephemeral. Every deploy wipes the disk. My first 3 deploys reset the user database without warning.

If your app has any user state, use a managed Postgres from day one. Neon's free tier is generous and reliable.

  1. SEO is not a code problem I have 16 tool pages, each targeting a specific search term ("compress pdf under 200kb", "pdf to excel converter", "merge pdf files"). Each page has:

Unique title and meta description

Real 300+ word content

FAQ schema in JSON-LD

Internal links to related tools

I submitted the sitemap to Google. Now I wait. The technical work is done. Everything from here is patience and backlinks.

What I'd do differently
Start with Postgres. Skip the SQLite phase entirely.

Verify payments before writing the frontend. Retrofitting this was annoying.

Build the SEO landing pages as you build each tool. Not at the end.

Don't fight Notepad. Use Python scripts to edit Python files. Sounds silly, saves hours.

The stack
Flask + Gunicorn

Neon Postgres

Cloudflare for DNS

Render for hosting

pypdf, pdfplumber, openpyxl, reportlab for the tools

If you've built something similar, I'd love to hear what surprised you. And if you need a free PDF tool, PDF One is live — no signup required.

Top comments (1)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.