<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mukesh Maddheshiya</title>
    <description>The latest articles on DEV Community by Mukesh Maddheshiya (@mukeshmaddheshiya).</description>
    <link>https://dev.to/mukeshmaddheshiya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3824208%2F63c9388f-5967-409e-98aa-325d1c5a42be.jpg</url>
      <title>DEV Community: Mukesh Maddheshiya</title>
      <link>https://dev.to/mukeshmaddheshiya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mukeshmaddheshiya"/>
    <language>en</language>
    <item>
      <title>How I Built 200+ Free Browser-Based Tools with Next.js 16 — No Backend Needed</title>
      <dc:creator>Mukesh Maddheshiya</dc:creator>
      <pubDate>Sat, 14 Mar 2026 16:13:26 +0000</pubDate>
      <link>https://dev.to/mukeshmaddheshiya/how-i-built-200-free-browser-based-tools-with-nextjs-16-no-backend-needed-235j</link>
      <guid>https://dev.to/mukeshmaddheshiya/how-i-built-200-free-browser-based-tools-with-nextjs-16-no-backend-needed-235j</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexgtm8lt4a56xag5zq0m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexgtm8lt4a56xag5zq0m.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time I needed to merge a PDF or compress an image, I'd land on some website that wanted me to sign up, upload my files to their server, and then pay for "premium." &lt;/p&gt;

&lt;p&gt;I thought — most of these operations can run entirely in the browser. Why does my PDF need to touch someone else's server?&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://toolsarena.in" rel="noopener noreferrer"&gt;ToolsArena&lt;/a&gt; — a collection of 200+ free tools that process everything client-side. No uploads, no signups, no backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Inside
&lt;/h2&gt;

&lt;p&gt;The site covers 6 categories with 200+ tools:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PDF Tools&lt;/strong&gt; — Merge, split, compress, Word to PDF, PDF to Excel, JPG to PDF. All using &lt;a href="https://pdf-lib.js.org/" rel="noopener noreferrer"&gt;pdf-lib&lt;/a&gt; running in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Tools&lt;/strong&gt; — Background remover, compressor, resizer, format converter, flip/rotate, photo effects. Canvas API does the heavy lifting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text Tools&lt;/strong&gt; — Word counter, case converter, Lorem Ipsum generator, text-to-speech, reading time calculator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Tools&lt;/strong&gt; — JSON formatter, CSS gradient generator, Base64 encoder/decoder, regex tester, color picker, URL encoder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Calculators&lt;/strong&gt; — EMI, compound interest, GST (India), EPF, percentage, age, BMI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SEO Tools&lt;/strong&gt; — Meta tag generator, Open Graph preview, reading time estimator.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (App Router)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;**pdf-lib for PDF operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas API&lt;/strong&gt; for image processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;i18n&lt;/strong&gt; via &lt;code&gt;[locale]&lt;/code&gt; route segment (English, Hindi, Nepali)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture: How 200+ Tools Share One Pattern
&lt;/h2&gt;

&lt;p&gt;The key insight: almost every tool follows the same flow:&lt;/p&gt;

&lt;p&gt;Instead of building 200 unique pages, I created a &lt;strong&gt;registry pattern&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tools-registry.ts&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdf-merge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PDF Merge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Merge multiple PDFs into one&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PdfMergeTool&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;relatedTools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdf-split&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdf-compress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="c1"&gt;// SEO metadata...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each tool gets its own directory under &lt;code&gt;src/app/[locale]/tools/[tool-slug]/&lt;/code&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;page.tsx&lt;/code&gt; — static metadata + dynamic import&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ToolComponent.tsx&lt;/code&gt; — the actual tool UI and logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern means adding a new tool takes about 1-2 hours:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add registry entry (metadata, SEO, related tools)&lt;/li&gt;
&lt;li&gt;Create the tool component&lt;/li&gt;
&lt;li&gt;Done — routing, SEO, sitemap, related tools all handled automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Client-Side PDF Processing — It Actually Works
&lt;/h2&gt;

&lt;p&gt;The biggest surprise was how capable &lt;code&gt;pdf-lib&lt;/code&gt; is for browser-side PDF operations:&lt;/p&gt;

&lt;p&gt;// Merge PDFs — entirely in the browser&lt;br&gt;
&lt;code&gt;import { PDFDocument } from 'pdf-lib';&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mergePDFs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;File&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copyPages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPageIndices&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Uint8Array — download directly&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No server. No API. No upload. The PDF never leaves the user's device.&lt;/p&gt;

&lt;p&gt;This works for merge, split, compress, add watermark, rotate pages, and extract text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multilingual SEO — The Hidden Goldmine
&lt;/h2&gt;

&lt;p&gt;The site supports 3 languages: English, Hindi (हिन्दी), and Nepali (नेपाली).&lt;/p&gt;

&lt;p&gt;Here's what I discovered: &lt;strong&gt;Nepali keywords have near-zero competition.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For English, "pdf merge online free" has thousands of competing pages. But "PDF मर्ज गर्ने" (PDF merge in Nepali) has almost nobody competing. Same for Hindi — significantly less competition than English equivalents.&lt;/p&gt;

&lt;p&gt;The implementation uses Next.js &lt;code&gt;[locale]&lt;/code&gt; segments:&lt;/p&gt;

&lt;p&gt;/en/tools/pdf-merge     → English&lt;br&gt;
/hi/tools/pdf-merge     → Hindi&lt;br&gt;&lt;br&gt;
/ne/tools/pdf-merge     → Nepali&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;hreflang&lt;/code&gt; tags connecting all three versions. Each language has its own guides registry with culturally relevant content — not just Google Translate output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 878 statically generated pages across 3 languages, all pre-rendered at build time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content + Tools = SEO Compound Effect
&lt;/h2&gt;

&lt;p&gt;Tools alone don't rank well on Google — users come, use the tool, and leave. Low dwell time, high bounce rate.&lt;/p&gt;

&lt;p&gt;So I added &lt;strong&gt;detailed guides&lt;/strong&gt; for each tool category:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"How to Merge PDFs — Complete Guide"&lt;/li&gt;
&lt;li&gt;"Image Compression: When to Use JPEG vs PNG vs WebP"&lt;/li&gt;
&lt;li&gt;"Understanding GST Calculation in India"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;37 guides × 3 languages = &lt;strong&gt;111 content-rich pages&lt;/strong&gt; that keep users on the site longer and give Google more text to index.&lt;/p&gt;

&lt;p&gt;Each guide links to the relevant tool, and each tool links back to its guide. This internal linking structure helps both rank better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static Generation at Scale
&lt;/h2&gt;

&lt;p&gt;With 878 pages, build times started getting long. Some things that helped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic imports&lt;/strong&gt; for heavy libraries (pdf-lib is 300KB+ — only load it on PDF tool pages)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremental Static Regeneration&lt;/strong&gt; for pages that don't change often&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared layouts&lt;/strong&gt; — the tool wrapper, navigation, and footer are shared across all 200+ tool pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Current build: &lt;strong&gt;878 static pages generated successfully&lt;/strong&gt; including all locale variants.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with 20 tools, not 200&lt;/strong&gt; — I spent months building tools before focusing on SEO. Should have launched earlier with fewer tools and built traffic alongside development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write guides first, build tools second&lt;/strong&gt; — The guides bring in search traffic. The tools convert that traffic into returning users. I did it backwards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Focus on one language first&lt;/strong&gt; — Maintaining content in 3 languages is a multiplier on every change. Starting with English-only and adding languages after establishing traffic would have been more efficient.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Numbers (Honest)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;200+ tools&lt;/strong&gt; live&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;37 guides × 3 languages&lt;/strong&gt; = 111 content pages
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;878 total static pages&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Traffic: still early, just starting to appear in Google results&lt;/li&gt;
&lt;li&gt;Revenue: $0 (not monetized yet)&lt;/li&gt;
&lt;li&gt;Total dev time: several months of side-project work&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://toolsarena.in" rel="noopener noreferrer"&gt;toolsarena.in&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything is free. No signup. No file uploads. Your data stays in your browser.&lt;/p&gt;

&lt;p&gt;I'd love feedback — what tools are missing? What would make you use this over iLovePDF or Smallpdf?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're building something similar, happy to share more details about the architecture, SEO strategy, or specific tool implementations in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>nextjs</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
