<?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>Forem: PotatoDev</title>
    <description>The latest articles on Forem by PotatoDev (@potatodev).</description>
    <link>https://forem.com/potatodev</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%2F3810675%2Fa506b721-155f-450a-aa3f-1dd738b426d8.png</url>
      <title>Forem: PotatoDev</title>
      <link>https://forem.com/potatodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/potatodev"/>
    <language>en</language>
    <item>
      <title>I Built a Free Browser-Based Image Tool as a Side Project</title>
      <dc:creator>PotatoDev</dc:creator>
      <pubDate>Fri, 06 Mar 2026 22:53:13 +0000</pubDate>
      <link>https://forem.com/potatodev/i-built-a-free-browser-based-image-tool-as-a-side-project-1c12</link>
      <guid>https://forem.com/potatodev/i-built-a-free-browser-based-image-tool-as-a-side-project-1c12</guid>
      <description>&lt;h2&gt;
  
  
  I Built a Free Browser-Based Image Tool as a Side Project — Here's What I Learned
&lt;/h2&gt;

&lt;p&gt;I've been working a side project for the past few weeks after work. It's called &lt;strong&gt;&lt;a href="https://www.toolpad.net" rel="noopener noreferrer"&gt;ToolPad&lt;/a&gt;&lt;/strong&gt; — a collection of free image tools that run entirely in your browser.&lt;/p&gt;

&lt;p&gt;Background removal, image compression, resizing, cropping, and format conversion. Nothing fancy, but I wanted to build something real and actually ship it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;I kept running into the same frustration. Whenever I needed to quickly compress an image or remove a background I'd end up on some site that either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uploaded my files to their servers&lt;/li&gt;
&lt;li&gt;Slapped a watermark on the output&lt;/li&gt;
&lt;li&gt;Asked me to sign up before doing anything&lt;/li&gt;
&lt;li&gt;Felt slow and cluttered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I figured the browser is powerful enough to handle most of these operations locally. So I decided to build something that just works, with no friction.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 14&lt;/strong&gt; with App Router&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; for styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas API&lt;/strong&gt; for resize, crop, and conversion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;browser-image-compression&lt;/strong&gt; library for compression&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;react-easy-crop&lt;/strong&gt; for the visual crop editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare&lt;/strong&gt; for background removal API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I chose Next.js specifically because SEO matters for a tool like this. Each tool needed its own URL and proper metadata so Google can index them individually. Plain React with Vite would have made that harder.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture Decision That Mattered Most
&lt;/h2&gt;

&lt;p&gt;Everything runs client-side. No backend, no file uploads, no storage.&lt;/p&gt;

&lt;p&gt;When a user compresses or resizes an image it never leaves their device. The Canvas API handles drawing, transforming, and exporting the result as a data URL which the user downloads directly.&lt;/p&gt;

&lt;p&gt;This was a deliberate choice. Privacy is a real differentiator when most competitors upload your files silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Was Surprisingly Hard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Background removal&lt;/strong&gt; was the trickiest part. Getting clean edges around hair and complex subjects is genuinely difficult. I went through a few different approaches before settling on the current solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The crop tool&lt;/strong&gt; was more work than I expected. react-easy-crop handles the visual interaction well but extracting the correct pixel area and redrawing it on a canvas with the right dimensions took a few iterations to get right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Format conversion&lt;/strong&gt; has a subtle gotcha — when converting PNG with transparency to JPG you need to fill the canvas with a white background first. Otherwise you get a black background on the output. Spent longer than I'd like to admit debugging that one.&lt;/p&gt;

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

&lt;p&gt;I'd add automated tests earlier. Right now I'm doing manual testing before every deploy which works but doesn't scale. Playwright would be perfect for this kind of app — upload a file, click a button, verify the output changed. Something to add soon.&lt;/p&gt;

&lt;p&gt;I'd also think about the target audience earlier. Halfway through building I realized there's a very specific use case this tool serves well — small photo printing shops that need to process passport photos quickly. That insight would have shaped some of the UX decisions earlier.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Photo formatter — auto-layout 6 photos on an A4 sheet ready to print&lt;/li&gt;
&lt;li&gt;Better mobile experience&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;If you work with images at all give it a try and let me know what's broken or missing. Brutal feedback welcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.toolpad.net" rel="noopener noreferrer"&gt;ToolPad&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The whole thing is built and maintained by one person in spare time so manage expectations accordingly — but it works, it's fast, and your files stay on your device.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What image tools do you find yourself reaching for most often? Curious if there are obvious gaps I'm missing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
