<?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: FindUtils</title>
    <description>The latest articles on DEV Community by FindUtils (@findutils).</description>
    <link>https://dev.to/findutils</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%2F4181270%2F97019dc9-d51e-4b73-8b3f-897638a36f69.png</url>
      <title>DEV Community: FindUtils</title>
      <link>https://dev.to/findutils</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/findutils"/>
    <language>en</language>
    <item>
      <title>JSON, PDF and Image Chores in the Browser: A No-Upload Workflow Guide</title>
      <dc:creator>FindUtils</dc:creator>
      <pubDate>Tue, 13 Oct 2026 06:40:24 +0000</pubDate>
      <link>https://dev.to/findutils/json-pdf-and-image-chores-in-the-browser-a-no-upload-workflow-guide-4k4i</link>
      <guid>https://dev.to/findutils/json-pdf-and-image-chores-in-the-browser-a-no-upload-workflow-guide-4k4i</guid>
      <description>&lt;p&gt;Most of my "five-minute tasks" are not coding. They are chores: an API response that won't parse, a contract that has to go out as one PDF, a batch of iPhone photos a client can't open. The usual fix is to search for "json formatter online", click the first result, and paste in something you shouldn't.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://findutils.com" rel="noopener noreferrer"&gt;FindUtils&lt;/a&gt; partly because of that habit. It is a free toolbox of single-purpose browser tools: 463 at the time of writing. The core tools need no account and no install. This post is less about the site and more about a workflow: how to get through common JSON, PDF and image chores without handing your files to a stranger's server, and how to check that claim for any tool, including mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, how do you know a tool doesn't upload?
&lt;/h2&gt;

&lt;p&gt;"Runs in your browser" is a claim, so test it before you trust it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open DevTools → Network&lt;/strong&gt; before you drop the file in. Clear the log, run the tool, and look for a request whose size matches your file. A client-side tool may still load scripts, fonts, analytics or ads, but none of those requests should carry your data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the page's own data note.&lt;/strong&gt; A good tool says what leaves the device. On FindUtils, file tools that run locally say so on the page. Lookup tools (DNS, WHOIS, SSL) send the domain you type to the service named on the page, because there's no other way to do a lookup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember what local processing doesn't cover.&lt;/strong&gt; You still have to trust the page's code, your browser extensions and your device. Client-side is a smaller trust surface, not zero trust.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With that settled, here's the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  JSON: from "invalid" to typed code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Fix and read it: &lt;a href="https://findutils.com/developers/json-formatter/" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Paste the payload. The error message gives you the line and column. &lt;strong&gt;Auto-Fix&lt;/strong&gt; makes a conservative repair of the three usual suspects: trailing commas, single quotes and unquoted keys. &lt;strong&gt;Format&lt;/strong&gt; pretty-prints with 2, 4 or 8 spaces, &lt;strong&gt;Minify&lt;/strong&gt; compacts it, and &lt;strong&gt;Tree&lt;/strong&gt; gives you a collapsible view for deeply nested responses. On the page, the JSON is processed in your browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Compare two versions: &lt;a href="https://findutils.com/developers/json-diff/" rel="noopener noreferrer"&gt;JSON Diff&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
When staging and production return "the same" response but something breaks, a line diff of pretty-printed JSON is noisy. The default view lists semantic paths (added, removed, modified), so &lt;code&gt;user.address.zip&lt;/code&gt; showing as &lt;em&gt;modified&lt;/em&gt; tells you more than 40 red and green lines. You can switch to a unified, git-style view when you need it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Turn it into types: &lt;a href="https://findutils.com/developers/json-to-typescript/" rel="noopener noreferrer"&gt;JSON to TypeScript&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Paste a real response and get interfaces or type aliases. It's a better starting point than typing the shape by hand, but review optional fields. A sample can't tell you which keys are sometimes missing. There are siblings for &lt;a href="https://findutils.com/developers/json-to-zod-schema/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://findutils.com/developers/json-to-go-struct/" rel="noopener noreferrer"&gt;Go structs&lt;/a&gt; and &lt;a href="https://findutils.com/developers/json-to-python-class/" rel="noopener noreferrer"&gt;Python classes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Hand it to a spreadsheet person: &lt;a href="https://findutils.com/convert/json-to-csv/" rel="noopener noreferrer"&gt;JSON ↔ CSV&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Both directions work on one page, with nested objects, quoted commas and custom delimiters handled. One caution: CSV has no types. &lt;code&gt;"00123"&lt;/code&gt; and &lt;code&gt;123&lt;/code&gt; look the same once they're in a cell, so don't round-trip JSON through CSV and expect the original back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus: &lt;a href="https://findutils.com/developers/jwt-decoder/" rel="noopener noreferrer"&gt;JWT Decoder&lt;/a&gt;.&lt;/strong&gt; A JWT is often a live credential, so pasting one into a random decoder is a real risk. This one decodes and verifies HS256/384/512 and RS256 (with a PEM key) in the browser, and the page states that secrets stay on the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  PDF: merge, number, clean, in that order
&lt;/h2&gt;

&lt;p&gt;The order matters more than the tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;a href="https://findutils.com/pdf/pdf-merger/" rel="noopener noreferrer"&gt;Merge&lt;/a&gt;&lt;/strong&gt; the files and drag them into sequence. The merge runs in the browser with the open-source pdf-lib library. If you only need part of a document, run &lt;a href="https://findutils.com/pdf/pdf-split/" rel="noopener noreferrer"&gt;Split&lt;/a&gt; first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;a href="https://findutils.com/pdf/pdf-page-numbers/" rel="noopener noreferrer"&gt;Add page numbers&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;after&lt;/em&gt; merging. If you number each file first, you get "1, 2, 3, 1, 2" in the final document. One numbering pass on the merged file gives one sequence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;a href="https://findutils.com/pdf/pdf-compress/" rel="noopener noreferrer"&gt;Compress&lt;/a&gt;&lt;/strong&gt; if the file is too big for email. &lt;em&gt;Low&lt;/em&gt; rewrites the structure, &lt;em&gt;Medium&lt;/em&gt; re-encodes embedded JPEGs, and &lt;em&gt;High&lt;/em&gt; also scales them down, so photos may look softer. Text stays the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. &lt;a href="https://findutils.com/pdf/pdf-metadata-remover/" rel="noopener noreferrer"&gt;Remove metadata&lt;/a&gt;&lt;/strong&gt; as the very last step. A PDF can carry the author's account name, the program that made it and timestamps. The tool shows the Info fields and XMP data and gives you a copy without the ones you tick. Two honest caveats from the tool's own docs: it is a metadata remover, not a forensic scrub (annotation author names and EXIF inside embedded photos stay), and if you open and re-save the cleaned file in another program, that program writes its own Producer and dates back in. So clean last, then send.&lt;/p&gt;

&lt;p&gt;If the file must be locked, &lt;a href="https://findutils.com/pdf/pdf-protect/" rel="noopener noreferrer"&gt;PDF Protect&lt;/a&gt; adds a password with AES-256 encryption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Images: convert, resize, then compress
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;a href="https://findutils.com/convert/heic-to-jpg/" rel="noopener noreferrer"&gt;HEIC to JPG&lt;/a&gt;&lt;/strong&gt;: iPhone photos often show up as blank thumbnails on Windows or get rejected by upload forms. This tool decodes HEIC with libheif compiled to WebAssembly, right in the tab, and outputs JPG, PNG or WebP. Drop a batch and download a zip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;a href="https://findutils.com/convert/image-resizer/" rel="noopener noreferrer"&gt;Image Resizer&lt;/a&gt;&lt;/strong&gt;: resize &lt;em&gt;before&lt;/em&gt; you compress. A 4000×3000 photo shown at 800×600 wastes bytes no matter how well you compress it. You can resize by percentage or exact pixels, or use social presets (X, LinkedIn, Instagram, YouTube and more).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;a href="https://findutils.com/convert/image-compressor/" rel="noopener noreferrer"&gt;Image Compressor&lt;/a&gt;&lt;/strong&gt;: takes JPEG, PNG, WebP and AVIF in, and outputs MozJPEG, WebP, AVIF, or lossless PNG optimized with OxiPNG. One detail people miss: JPEG, WebP and AVIF are lossy at &lt;em&gt;every&lt;/em&gt; quality setting, including 100%. If pixels must not change, choose PNG.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you publish a photo:&lt;/strong&gt; open it in &lt;a href="https://findutils.com/media/media-info-viewer/" rel="noopener noreferrer"&gt;Media Info Viewer&lt;/a&gt; to see what EXIF data it carries (camera, timestamps, sometimes location).&lt;/p&gt;

&lt;h2&gt;
  
  
  When you need it in a script instead
&lt;/h2&gt;

&lt;p&gt;Browser pages are right for one-off jobs, and anything that needs a local file, the camera or a canvas only works there. For repeatable transforms, FindUtils also has a REST API (387 tools) and an MCP server (388 tools) for AI clients. The catalog is described in an &lt;a href="https://findutils.com/api/openapi.json" rel="noopener noreferrer"&gt;OpenAPI 3.1 spec&lt;/a&gt; and indexed in &lt;a href="https://findutils.com/llms.txt" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt;. Every page also has a Markdown twin: add &lt;code&gt;markdown.md&lt;/code&gt; to the path.&lt;/p&gt;

&lt;p&gt;To set expectations: running a tool through the API or MCP needs an API key. Keys aren't for sale yet, and early access goes through the contact page. The catalog and schemas are open to read, and the browser tools need no key.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test the "no upload" claim&lt;/strong&gt; with the Network tab instead of trusting a badge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON:&lt;/strong&gt; format → diff → generate types. Don't expect CSV to keep your types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF:&lt;/strong&gt; merge → number → compress → strip metadata &lt;em&gt;last&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images:&lt;/strong&gt; convert → resize → compress, and check EXIF before you publish.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything above is free at &lt;a href="https://findutils.com" rel="noopener noreferrer"&gt;findutils.com&lt;/a&gt;. If a tool is missing from your workflow, there's a &lt;a href="https://findutils.com/request-tool/" rel="noopener noreferrer"&gt;request page&lt;/a&gt;. I read those.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Olgun Özoktaş builds and reviews the tools on FindUtils.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>json</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
