<?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: Widodo Purnomosidi</title>
    <description>The latest articles on DEV Community by Widodo Purnomosidi (@purnomosidi).</description>
    <link>https://dev.to/purnomosidi</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%2F4031469%2F6492a67b-9ff5-4d22-9bdb-f600c386b9ed.jpg</url>
      <title>DEV Community: Widodo Purnomosidi</title>
      <link>https://dev.to/purnomosidi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/purnomosidi"/>
    <language>en</language>
    <item>
      <title>I got tired of uploading private files to random servers, so I built a 100% client-side tool suite 🛠️</title>
      <dc:creator>Widodo Purnomosidi</dc:creator>
      <pubDate>Thu, 16 Jul 2026 06:32:21 +0000</pubDate>
      <link>https://dev.to/purnomosidi/i-got-tired-of-uploading-private-files-to-random-servers-so-i-built-a-100-client-side-tool-suite-4dan</link>
      <guid>https://dev.to/purnomosidi/i-got-tired-of-uploading-private-files-to-random-servers-so-i-built-a-100-client-side-tool-suite-4dan</guid>
      <description>&lt;p&gt;Hi DEV community! 👋 I'm Widodo, an independent web and mobile app developer.&lt;/p&gt;

&lt;p&gt;In my day-to-day workflow—whether I am developing mobile apps, structuring databases, or setting up serverless continuous integration pipelines—I constantly rely on quick online utilities. Things like formatting code, generating QR codes, or stripping metadata from images.&lt;/p&gt;

&lt;p&gt;But I realized a massive flaw in the current ecosystem of free online tools: Privacy and Performance.&lt;/p&gt;

&lt;p&gt;If you search for a "Free EXIF Data Remover" or "JSON Formatter," 90% of the top results force you to upload your sensitive files to their remote servers just to perform a basic operation. Not only is this a massive privacy risk, but it also introduces unnecessary latency.&lt;/p&gt;

&lt;p&gt;Since my core development philosophy has always leaned towards offline-first architectures and minimal server dependencies, I decided to build my own solution.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="https://ic2share.com" rel="noopener noreferrer"&gt;Ic2Share.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is a growing directory of web utilities built on a strict zero-server-upload architecture. Everything executes instantly within the user's browser.&lt;/p&gt;

&lt;p&gt;Here is a breakdown of how I built some of the tools and the client-side APIs powering them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Secure EXIF &amp;amp; Metadata Stripper (Canvas API)
Most EXIF strippers use backend libraries (like PHP's exif_read_data or Python's Pillow). I wanted this to happen entirely offline so users wouldn't have to upload their personal photos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The solution? HTML5 Canvas Re-rendering.&lt;br&gt;
When a user drops an image, the browser reads it via the FileReader API. I then draw that image onto a hidden  element. When you export the canvas back to a Blob using canvas.toBlob(), the browser automatically discards all original EXIF headers (including the exact GPS coordinates and camera models).&lt;/p&gt;

&lt;p&gt;It is fast, secure, and costs $0 in server compute.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Online Teleprompter (requestAnimationFrame)&lt;br&gt;
I built an auto-scrolling teleprompter for video creators. Initially, I thought about using CSS transitions or setInterval for the scrolling text. However, CSS can cause jittering on large blocks of text, and setInterval drops frames.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SRT/VTT Subtitle Time Shifter (Regex Engine)&lt;br&gt;
Have you ever downloaded a movie subtitle that is delayed by 2 seconds? I built a tool to fix that. Instead of uploading the .srt file, the user pastes the text, enters the millisecond offset, and Vanilla JS handles the rest using Regular Expressions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It parses the HH:MM:SS,mmm format, converts it to total milliseconds, applies the shift (forward or backward), calculates the time rollovers, and spits out the synced text instantly.&lt;/p&gt;

&lt;p&gt;The Architecture &amp;amp; Infrastructure&lt;br&gt;
To keep operational costs practically non-existent while ensuring high speed, the entire suite is served statically. I utilize Cloudflare Workers to handle traffic routing and programmatic SEO setups, ensuring the application stays lightweight and highly available globally.&lt;/p&gt;

&lt;p&gt;Other tools currently live on the site include:&lt;/p&gt;

&lt;p&gt;Direct QR Code Generator (Bypasses URL masking)&lt;/p&gt;

&lt;p&gt;Live Markdown Editor (With secure syntax highlighting)&lt;/p&gt;

&lt;p&gt;Invisible Character &amp;amp; Blank Space Generator&lt;/p&gt;

&lt;p&gt;and more..&lt;/p&gt;

&lt;p&gt;I would love your feedback!&lt;br&gt;
Building this has been a fun exercise in maximizing browser capabilities.&lt;/p&gt;

&lt;p&gt;If you have a minute, check out &lt;a href="https://ic2share.com" rel="noopener noreferrer"&gt;https://ic2share.com&lt;/a&gt;.&lt;br&gt;
I would love to hear your thoughts on the UI/UX. Also, as fellow developers, what specific client-side tool do you often wish existed (or was faster) that I can build next?&lt;/p&gt;

&lt;p&gt;Let me know in the comments! 👇&lt;/p&gt;

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