<?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: Tan Indie</title>
    <description>The latest articles on DEV Community by Tan Indie (@tanindie).</description>
    <link>https://dev.to/tanindie</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4156933%2F141ae652-ee26-4111-91e4-564a52466031.jpg</url>
      <title>DEV Community: Tan Indie</title>
      <link>https://dev.to/tanindie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanindie"/>
    <language>en</language>
    <item>
      <title>Not Every File Needs a Server: Building File Tools with a Local-First Approach</title>
      <dc:creator>Tan Indie</dc:creator>
      <pubDate>Fri, 02 Oct 2026 09:40:17 +0000</pubDate>
      <link>https://dev.to/tanindie/not-every-file-needs-a-server-building-file-tools-with-a-local-first-approach-3dhf</link>
      <guid>https://dev.to/tanindie/not-every-file-needs-a-server-building-file-tools-with-a-local-first-approach-3dhf</guid>
      <description>&lt;h1&gt;
  
  
  Not Every File Needs a Server: Building File Tools with a Local-First Approach
&lt;/h1&gt;

&lt;p&gt;When we think about online file tools, the architecture often looks&lt;br&gt;
something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Choose a file
     ↓
Upload it to a server
     ↓
Process it
     ↓
Download the result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works.&lt;/p&gt;

&lt;p&gt;But while building file utilities, I kept coming back to a simple&lt;br&gt;
question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does every file really need to leave the user's device?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For many common operations, the answer is no.&lt;/p&gt;

&lt;p&gt;Modern browsers are capable of doing much more than simply uploading&lt;br&gt;
files. Images can be resized, converted, cropped, and stripped of&lt;br&gt;
metadata locally. Many PDF operations can also happen without sending&lt;br&gt;
the original document to a remote server.&lt;/p&gt;

&lt;p&gt;At the same time, trying to make &lt;em&gt;everything&lt;/em&gt; client-side introduces its&lt;br&gt;
own problems.&lt;/p&gt;

&lt;p&gt;That led me toward a fairly simple principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Process locally when possible. Use the cloud when necessary. Be&lt;br&gt;
transparent about the difference.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's what I've learned from applying that idea while building file&lt;br&gt;
tools for the web.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Uploading Everything Is Convenient --- for the Developer
&lt;/h2&gt;

&lt;p&gt;Server-side processing is attractive because it gives you a controlled&lt;br&gt;
environment.&lt;/p&gt;

&lt;p&gt;The browser sends a file, the backend processes it with whatever&lt;br&gt;
libraries or services you choose, and the result comes back.&lt;/p&gt;

&lt;p&gt;From an engineering perspective, that's straightforward.&lt;/p&gt;

&lt;p&gt;But consider a simple task such as converting a PNG to JPG.&lt;/p&gt;

&lt;p&gt;The user may have a 10 MB image sitting on their laptop. With the&lt;br&gt;
traditional approach, they need to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 MB local file
      ↓
10 MB upload
      ↓
Server processes it
      ↓
Result downloaded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a lot of movement for a transformation the browser may already be&lt;br&gt;
capable of performing.&lt;/p&gt;

&lt;p&gt;It also creates additional questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Where is the uploaded file stored?&lt;/li&gt;
&lt;li&gt;  How long is it retained?&lt;/li&gt;
&lt;li&gt;  Who has access to it?&lt;/li&gt;
&lt;li&gt;  What happens if the upload fails halfway through?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For some transformations, introducing a server creates more complexity&lt;br&gt;
than it removes.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. The Browser Is a Surprisingly Capable File-Processing Environment
&lt;/h2&gt;

&lt;p&gt;The web platform has evolved significantly.&lt;/p&gt;

&lt;p&gt;For image-related tools in particular, browsers provide enough&lt;br&gt;
functionality to handle many useful operations locally.&lt;/p&gt;

&lt;p&gt;Think about tasks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  resizing an image&lt;/li&gt;
&lt;li&gt;  cropping an image&lt;/li&gt;
&lt;li&gt;  converting between common image formats&lt;/li&gt;
&lt;li&gt;  compressing an image&lt;/li&gt;
&lt;li&gt;  removing metadata&lt;/li&gt;
&lt;li&gt;  inspecting basic file information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The basic interaction can become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;File
  ↓
Browser
  ↓
Transformation
  ↓
Download
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No upload step is required.&lt;/p&gt;

&lt;p&gt;This is one of the ideas behind &lt;a href="https://anyfiletool.com/" rel="noopener noreferrer"&gt;AnyFileTool&lt;/a&gt;.&lt;br&gt;
For operations that can reasonably be performed locally, the goal is to&lt;br&gt;
keep the file on the user's device.&lt;/p&gt;

&lt;p&gt;The same idea applies beyond images.&lt;/p&gt;

&lt;p&gt;Some PDF operations --- such as rearranging, rotating, splitting, or&lt;br&gt;
merging pages --- are also good candidates for local processing.&lt;/p&gt;

&lt;p&gt;This changes how I think about online file tools.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I upload this file and process it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I now prefer to start with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Do I need to upload this file at all?"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  3. Local Processing Has Benefits Beyond Privacy
&lt;/h2&gt;

&lt;p&gt;Privacy is probably the most obvious reason to keep processing local.&lt;/p&gt;

&lt;p&gt;If the file never reaches your infrastructure, you don't need to store&lt;br&gt;
it, protect it, or delete it later.&lt;/p&gt;

&lt;p&gt;But there are other benefits.&lt;/p&gt;
&lt;h3&gt;
  
  
  Less waiting
&lt;/h3&gt;

&lt;p&gt;Uploading a large image just to resize it can take longer than the&lt;br&gt;
transformation itself.&lt;/p&gt;

&lt;p&gt;With local processing, the operation can begin as soon as the browser&lt;br&gt;
has access to the file.&lt;/p&gt;
&lt;h3&gt;
  
  
  Less infrastructure
&lt;/h3&gt;

&lt;p&gt;Every server-side file transformation consumes resources.&lt;/p&gt;

&lt;p&gt;At scale, that can mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  storage&lt;/li&gt;
&lt;li&gt;  bandwidth&lt;/li&gt;
&lt;li&gt;  processing time&lt;/li&gt;
&lt;li&gt;  queues&lt;/li&gt;
&lt;li&gt;  cleanup jobs&lt;/li&gt;
&lt;li&gt;  monitoring&lt;/li&gt;
&lt;li&gt;  abuse prevention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moving appropriate operations to the client can eliminate some of those&lt;br&gt;
requirements entirely.&lt;/p&gt;
&lt;h3&gt;
  
  
  Fewer failure points
&lt;/h3&gt;

&lt;p&gt;A traditional file conversion might involve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser → Network → API → Storage → Processor → Storage → Network → Browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A local transformation can be much simpler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser → Browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, that doesn't automatically make client-side processing easy.&lt;/p&gt;

&lt;p&gt;Large files can consume significant memory, browser support varies, and&lt;br&gt;
heavy processing can affect UI responsiveness.&lt;/p&gt;

&lt;p&gt;But for the right operation, the trade-off can be worth it.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. "Everything Must Be Client-Side" Isn't a Great Rule Either
&lt;/h2&gt;

&lt;p&gt;Once you start thinking local-first, it's tempting to go too far.&lt;/p&gt;

&lt;p&gt;If processing files in the browser is good, shouldn't &lt;em&gt;every&lt;/em&gt; tool work&lt;br&gt;
that way?&lt;/p&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;Some file formats and transformations are significantly more&lt;br&gt;
complicated.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DOCX → PDF
PPTX → PDF
XLSX → PDF
PDF → DOCX
Scanned PDF → searchable PDF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These aren't always comparable to resizing an image.&lt;/p&gt;

&lt;p&gt;Office documents can contain fonts, tables, charts, page layouts,&lt;br&gt;
embedded objects, and other features where conversion fidelity matters.&lt;/p&gt;

&lt;p&gt;Reimplementing a mature document rendering engine in the browser just to&lt;br&gt;
claim "100% client-side" may not produce the best result.&lt;/p&gt;

&lt;p&gt;For these cases, a cloud service can be the more practical choice.&lt;/p&gt;

&lt;p&gt;That's why I don't think &lt;strong&gt;local vs.&amp;nbsp;cloud&lt;/strong&gt; should be treated as an&lt;br&gt;
ideological decision.&lt;/p&gt;

&lt;p&gt;It's an engineering decision.&lt;/p&gt;

&lt;p&gt;A better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Which processing environment makes the most sense for this&lt;br&gt;
particular operation?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For AnyFileTool, that means some operations stay entirely in the&lt;br&gt;
browser, while others rely on established cloud processing services when&lt;br&gt;
necessary.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Transparency Matters as Much as Architecture
&lt;/h2&gt;

&lt;p&gt;There's another lesson here that I think file-tool developers sometimes&lt;br&gt;
overlook.&lt;/p&gt;

&lt;p&gt;Users shouldn't have to reverse-engineer your application to figure out&lt;br&gt;
what happens to their files.&lt;/p&gt;

&lt;p&gt;If an operation happens locally, say so.&lt;/p&gt;

&lt;p&gt;If a file needs to be uploaded, say so.&lt;/p&gt;

&lt;p&gt;If a third-party service processes it, identify that service.&lt;/p&gt;

&lt;p&gt;If uploaded files are deleted after processing, explain the retention&lt;br&gt;
period.&lt;/p&gt;

&lt;p&gt;A simple distinction such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔒 Local processing
File stays on your device.

☁️ Cloud processing
File is securely uploaded for conversion.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can make the behavior much easier to understand.&lt;/p&gt;

&lt;p&gt;This is particularly important because the phrase "online file&lt;br&gt;
converter" can describe completely different architectures.&lt;/p&gt;

&lt;p&gt;Two websites may look almost identical from the outside while handling&lt;br&gt;
user files in very different ways.&lt;/p&gt;

&lt;p&gt;Clear communication should therefore be part of the architecture, not&lt;br&gt;
something added to the privacy policy as an afterthought.&lt;/p&gt;
&lt;h2&gt;
  
  
  6. The Simplest UX Often Requires the Most Thought
&lt;/h2&gt;

&lt;p&gt;Most people don't care how a file converter works internally.&lt;/p&gt;

&lt;p&gt;They want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Choose file → Convert → Download
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;But underneath those three steps, there can be dozens of decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Is this format supported?&lt;/li&gt;
&lt;li&gt;  Can it be processed locally?&lt;/li&gt;
&lt;li&gt;  How large is the file?&lt;/li&gt;
&lt;li&gt;  Does the operation require a cloud provider?&lt;/li&gt;
&lt;li&gt;  What happens if conversion fails?&lt;/li&gt;
&lt;li&gt;  Should processing happen on the main thread?&lt;/li&gt;
&lt;li&gt;  How should progress be communicated?&lt;/li&gt;
&lt;li&gt;  When can temporary resources be released?&lt;/li&gt;
&lt;li&gt;  What happens when the user selects the wrong file type?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The challenge is hiding that complexity without hiding important&lt;br&gt;
information.&lt;/p&gt;

&lt;p&gt;That's something I've been thinking about a lot while working on&lt;br&gt;
&lt;a href="https://anyfiletool.com/" rel="noopener noreferrer"&gt;AnyFileTool&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The site now covers different categories of file operations, from image&lt;br&gt;
and PDF utilities to document conversions.&lt;/p&gt;

&lt;p&gt;As the number of tools grows, keeping the user experience consistent&lt;br&gt;
becomes just as important as implementing the conversions themselves.&lt;/p&gt;
&lt;h2&gt;
  
  
  7. Local-First Is a Useful Default, Not a Requirement
&lt;/h2&gt;

&lt;p&gt;The biggest takeaway for me has been that &lt;strong&gt;local-first works best as a&lt;br&gt;
default question rather than an absolute rule&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When adding a new file operation, I like to think about it in this&lt;br&gt;
order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can the browser handle it well?
        │
    ┌───┴───┐
   Yes      No
    │        │
 Process   Does a trusted
 locally   cloud service make
           sense here?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That small change in thinking can influence everything from privacy and&lt;br&gt;
performance to infrastructure costs.&lt;/p&gt;

&lt;p&gt;For simple transformations, client-side processing can be remarkably&lt;br&gt;
effective.&lt;/p&gt;

&lt;p&gt;For complex document conversions, cloud processing may still be the&lt;br&gt;
better engineering solution.&lt;/p&gt;

&lt;p&gt;And when the cloud is required, users should know exactly what's&lt;br&gt;
happening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Browsers have become powerful application platforms.&lt;/p&gt;

&lt;p&gt;We're no longer limited to using them as thin clients that send every&lt;br&gt;
interesting task to a server.&lt;/p&gt;

&lt;p&gt;File processing is a good example of where hybrid architecture can make&lt;br&gt;
sense:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;local when possible, cloud when necessary, transparent either way.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm still experimenting with this approach as I add more utilities to&lt;br&gt;
AnyFileTool, and I'm sure there are plenty of edge cases left to&lt;br&gt;
discover.&lt;/p&gt;

&lt;p&gt;If you've built file-processing functionality for the browser, I'd be&lt;br&gt;
curious to hear:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where do you draw the line between client-side and server-side&lt;br&gt;
processing?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
