<?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: tavi</title>
    <description>The latest articles on DEV Community by tavi (@tavigogogo).</description>
    <link>https://dev.to/tavigogogo</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%2F4101429%2F7577e70b-2395-42d8-b32e-2424f56d0735.jpeg</url>
      <title>DEV Community: tavi</title>
      <link>https://dev.to/tavigogogo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tavigogogo"/>
    <language>en</language>
    <item>
      <title>How to Use a Realistic Test Data Generator (Faker) in 5 Steps</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Wed, 16 Sep 2026 12:30:45 +0000</pubDate>
      <link>https://dev.to/tavigogogo/how-to-use-a-realistic-test-data-generator-faker-in-5-steps-49ab</link>
      <guid>https://dev.to/tavigogogo/how-to-use-a-realistic-test-data-generator-faker-in-5-steps-49ab</guid>
      <description>&lt;h2&gt;
  
  
  Why fake data that looks fake causes real bugs
&lt;/h2&gt;

&lt;p&gt;You've been there: you seed a dev database with &lt;code&gt;user1@test.com&lt;/code&gt;, &lt;code&gt;John Doe&lt;/code&gt;, and &lt;code&gt;123 Main St&lt;/code&gt;, then ship. QA signs off because the form accepts it. Two weeks later a real customer with a 47-character hyphenated surname and a &lt;code&gt;+&lt;/code&gt; in their email hits a validation regex you never stress-tested. The fake data was too polite.&lt;/p&gt;

&lt;p&gt;That's the gap a &lt;strong&gt;realistic test data generator&lt;/strong&gt; built on faker.js closes. Instead of typing placeholders by hand, you describe the shape of your data once, and the generator produces thousands of rows that actually look like the messy real world — accents, long names, edge-case punctuation, plausible dates. This walkthrough uses &lt;a href="https://toolkite.net/mock-data" rel="noopener noreferrer"&gt;Mock Data Generator&lt;/a&gt;, which runs faker.js entirely in your browser. Nothing is uploaded, nothing is sent to an external API, and there's no signup wall before you can generate a single row.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to generate realistic test data in 5 steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1 — Build your schema
&lt;/h3&gt;

&lt;p&gt;Open the &lt;a href="https://toolkite.net/mock-data" rel="noopener noreferrer"&gt;Mock Data Generator&lt;/a&gt; and add one field per column you need. For each field, pick a type — name, email, address, date, and the rest of the available set. The free tier gives you 15 field types, which covers the usual suspects for a users table, an orders table, or a product catalog.&lt;/p&gt;

&lt;p&gt;Name your fields exactly as your code expects them. If your API returns &lt;code&gt;created_at&lt;/code&gt; and not &lt;code&gt;createdAt&lt;/code&gt;, use &lt;code&gt;created_at&lt;/code&gt;. Renaming columns after the fact is the single most common source of "why doesn't this import" headaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Decide how many rows you actually need
&lt;/h3&gt;

&lt;p&gt;Set the row count. The free tier goes up to &lt;strong&gt;20,000 rows&lt;/strong&gt;, which is more than enough to expose pagination bugs, slow queries, and UI that breaks past page three. If you're testing a virtualized list or a bulk-import path, that ceiling is where you'll feel the limit.&lt;/p&gt;

&lt;p&gt;A practical tip: generate a small batch first (50–100 rows), eyeball it, then scale up. Catching a wrong field type at 100 rows takes seconds; catching it at 20,000 means regenerating everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Generate
&lt;/h3&gt;

&lt;p&gt;Hit generate. faker.js runs locally in your browser tab, so the whole thing is a client-side loop. That matters for two reasons. First, it's fast — no round trip per row. Second, and more importantly for anyone working under an NDA or with production-like schemas, &lt;strong&gt;your field names and structure never leave your machine&lt;/strong&gt;. There's no server logging your schema, because there's no server involved.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — Preview before you commit
&lt;/h3&gt;

&lt;p&gt;Look at the preview table. Check the obvious things: are dates in a sane range, are emails well-formed, did any field come back empty when it shouldn't? This is also where you spot the subtle stuff — a "name" field that only ever produces single-token values won't test your two-column layout.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5 — Export as JSON or CSV
&lt;/h3&gt;

&lt;p&gt;Download the result as &lt;strong&gt;JSON&lt;/strong&gt; or &lt;strong&gt;CSV&lt;/strong&gt;. JSON slots straight into a seed script or a mock API response; CSV drops into a spreadsheet or a &lt;code&gt;COPY&lt;/code&gt; command. Pick based on where the data is going, not on habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you need more than the free tier
&lt;/h2&gt;

&lt;p&gt;The free limits are honest ones: 20,000 rows and 15 field types. If your work regularly pushes past that, there's an optional one-time &lt;strong&gt;Pro&lt;/strong&gt; upgrade at $14.99. It removes the row cap, opens up &lt;strong&gt;30+ field types including locale data&lt;/strong&gt; (useful when you're testing internationalization and need names and addresses that aren't all US-shaped), lets you &lt;strong&gt;save up to 20 schemas in IndexedDB&lt;/strong&gt; so you're not rebuilding the same table every morning, and adds &lt;strong&gt;SQL INSERT and multi-format ZIP export&lt;/strong&gt;. It's also ad-free.&lt;/p&gt;

&lt;p&gt;If you only generate test data once a month, the free tier is genuinely enough. Don't upgrade out of habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The alternative: scripting faker.js yourself
&lt;/h2&gt;

&lt;p&gt;Before reaching for any tool, it's worth knowing what the DIY version looks like. faker.js is an npm package, so you can install it and write a seed script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @faker-js/faker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@faker-js/faker&lt;/span&gt;&lt;span class="dl"&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;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;internet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;past&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Trade-offs, honestly:&lt;/strong&gt; a script is reproducible and lives in your repo, which is great for CI. But it needs Node installed, a package.json, and a decision about whether to commit the generated output. Changing the schema means editing code, not clicking a field. And if a designer or PM wants 200 rows of sample data for a mockup, handing them a Node script is a worse experience than handing them a CSV.&lt;/p&gt;

&lt;p&gt;The browser tool wins when the schema is still in flux, when a non-developer needs the data, or when you don't want test fixtures sitting in version control. The script wins when generation is part of an automated pipeline you run repeatedly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical tips that save time later
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generate edge cases on purpose.&lt;/strong&gt; Realistic data is good, but deliberately weird data is better. If the generator lets you vary field types, mix in long strings and unusual characters so your validation actually gets exercised.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the schema, not just the output.&lt;/strong&gt; Regenerating from a saved schema beats hand-editing a CSV when requirements shift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match your real column names and types.&lt;/strong&gt; A &lt;code&gt;date&lt;/code&gt; field that exports as a string will break a strict database import. Know what your target expects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't paste real customer data into any generator.&lt;/strong&gt; The whole point of fake data is that it isn't real. If you're handling sensitive files elsewhere, the same instinct applies — see how &lt;a href="https://toolkite.net/privacy" rel="noopener noreferrer"&gt;our privacy page&lt;/a&gt; describes the browser-only approach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check row counts against your actual test.&lt;/strong&gt; 20,000 rows is plenty for most UI work but nothing for a load test. Know which one you're doing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're also wrangling structured data around your test fixtures, the &lt;a href="https://toolkite.net/json-csv" rel="noopener noreferrer"&gt;JSON to CSV converter&lt;/a&gt; handles the flattening side, and the &lt;a href="https://toolkite.net/meta-generator" rel="noopener noreferrer"&gt;Meta Generator&lt;/a&gt; is there when you need structured data for a page rather than a database.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is this a real faker.js implementation or just something that looks like it?
&lt;/h3&gt;

&lt;p&gt;It runs faker.js locally in your browser tab. The same library you'd install via npm is doing the generation, just without the Node setup. That means the data shapes — names, emails, addresses, dates — follow faker's own rules rather than a hand-rolled random string generator.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to create an account to generate test data?
&lt;/h3&gt;

&lt;p&gt;No. There's no signup step before you can build a schema and generate rows. You open the page, add fields, pick types, and generate. Accounts aren't part of the workflow at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the row limit on the free tier?
&lt;/h3&gt;

&lt;p&gt;Free generation goes up to 20,000 rows with a set of 15 field types. If you routinely need more rows, locale-specific data, or saved schemas, there's an optional one-time Pro upgrade at $14.99 that lifts the row cap and adds 30+ field types, IndexedDB schema saving, and SQL INSERT plus multi-format ZIP export.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I export directly to a SQL INSERT statement?
&lt;/h3&gt;

&lt;p&gt;SQL INSERT export is a Pro feature, alongside multi-format ZIP export. On the free tier you get JSON and CSV, which cover most seeding scripts and spreadsheet imports. If your workflow is database-first, that's the feature to weigh when deciding on Pro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it safe to use with schemas that mirror production tables?
&lt;/h3&gt;

&lt;p&gt;Yes, and that's a good reason to prefer it. Because faker.js runs client-side, your field names and structure aren't transmitted anywhere. There's no external API call carrying your schema. You still shouldn't paste real customer records in as a starting point — generate from a schema instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does this compare to Mockaroo or similar SaaS generators?
&lt;/h3&gt;

&lt;p&gt;The main practical differences are the signup requirement and where the data is processed. Browser-based generation means no account and no schema leaving your machine. SaaS generators often have richer collaboration and sharing features. If you're a solo developer or a small team generating fixtures locally, the browser route usually gets you there faster.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tools</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Stop Doing This Wrong: ExifTool Alternative Online Free</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Tue, 15 Sep 2026 12:30:06 +0000</pubDate>
      <link>https://dev.to/tavigogogo/stop-doing-this-wrong-exiftool-alternative-online-free-2j1m</link>
      <guid>https://dev.to/tavigogogo/stop-doing-this-wrong-exiftool-alternative-online-free-2j1m</guid>
      <description>&lt;p&gt;I keep seeing the same pattern in freelancer forums and group chats: someone strips metadata from a batch of photos, feels safe, then posts the same set on Instagram or sends a client a "cleaned" folder that still carries GPS coordinates in the original files. The tool wasn't the problem. The workflow was. Here are the mistakes that actually leak location and camera data, and how to fix each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 1: Assuming the browser tool uploaded your photo
&lt;/h2&gt;

&lt;p&gt;This is the big one, and it cuts both ways. Some people avoid online EXIF tools entirely because they assume every web app ships files to a server. Others use one and assume the opposite without checking. Both guesses are risky.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; look for a tool that states plainly that processing happens in the browser. &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt; reads files locally with &lt;code&gt;exifr&lt;/code&gt; and strips metadata by drawing the image to a Canvas and exporting a fresh blob. Nothing goes over the network. If you want the longer version of why that matters, the &lt;a href="https://toolkite.net/privacy" rel="noopener noreferrer"&gt;privacy page&lt;/a&gt; covers the site's stance.&lt;/p&gt;

&lt;p&gt;A quick sanity check you can run yourself: open DevTools, switch to the Network tab, drop a photo into a browser-based tool, and watch. If you see a multi-megabyte POST request, the file left your machine. If you only see your own page assets, it didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 2: Thinking a screenshot is the same as stripping metadata
&lt;/h2&gt;

&lt;p&gt;I've watched people "remove EXIF" by taking a screenshot of a photo and saving that. It works in a narrow sense — screenshots usually don't carry camera EXIF — but it also destroys resolution, strips color profiles, and often changes the aspect ratio. For client deliverables, that's a downgrade disguised as a privacy fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; re-encode the actual file instead of screenshotting it. In &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt;, the flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Drop a JPG, PNG, WebP, or HEIC file (HEIC only if your browser can decode it).&lt;/li&gt;
&lt;li&gt;Review the grouped table — GPS coordinates, camera model, lens, timestamp, ISO, software.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Strip EXIF&lt;/strong&gt; and download the cleaned image.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The output is re-encoded through Canvas at roughly JPEG quality 0.92. That's not bit-identical to the original, and nobody should claim it is. What it does give you is a clean image at full resolution with the metadata channels removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 3: Stripping the copy but shipping the original
&lt;/h2&gt;

&lt;p&gt;This one is quiet. You clean a photo, download &lt;code&gt;photo-clean.jpg&lt;/code&gt;, and then attach &lt;code&gt;photo.jpg&lt;/code&gt; from your camera roll because it's the one already in your recent files. The cleaned version sits in Downloads and never gets sent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; rename on download, or move originals into a separate folder before you start. The tool never touches your original file on disk — that's a feature, not a bug — which means the original is still sitting there with GPS intact until you deal with it.&lt;/p&gt;

&lt;p&gt;If you're handling a batch, this is where the free tier's 10-file limit per run becomes a real workflow constraint. The optional Pro license bumps that to 50 per run and adds a privacy risk report with a score, plus CSV/JSON export of the metadata. If you're auditing a folder of 200 photos, that report is the part that saves time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 4: Trusting the social app to strip it for you
&lt;/h2&gt;

&lt;p&gt;Instagram, Facebook, and most major platforms do strip EXIF on upload. That's true. What people miss is the gap between upload and the platforms that &lt;em&gt;don't&lt;/em&gt; strip it: email attachments, Slack, Discord, Google Drive shares, WeTransfer, and your own website's CMS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; treat stripping as a step you own, not a step you outsource to whichever app you're posting in. If you want a checklist that covers the common leak points, the &lt;a href="https://toolkite.net/blog" rel="noopener noreferrer"&gt;photo metadata privacy risks checklist&lt;/a&gt; on the blog walks through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 5: Believing "strip EXIF" means "strip everything"
&lt;/h2&gt;

&lt;p&gt;No browser tool removes every possible metadata channel. Some formats embed data in ways that survive re-encoding. Some tools only handle a subset of fields. Honest tools say so.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; know what you're getting. &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt; strips EXIF, GPS, and camera metadata by re-encoding. It does not offer selective field removal — you can't keep the lens info and drop only GPS. It also doesn't claim forensic-grade wiping of every metadata channel. If your threat model requires that level of assurance, use ExifTool locally with &lt;code&gt;-all=&lt;/code&gt; and verify with &lt;code&gt;exiftool -a -G1&lt;/code&gt; afterward. That's the honest trade-off: more control, more command-line work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 6: Forgetting that "free" and "no premium" aren't the same thing
&lt;/h2&gt;

&lt;p&gt;The keyword is "exiftool alternative online free," and that's accurate — the browser tool is free to use with an optional one-time Pro upgrade. People sometimes assume "free online tool" means there's no paid tier at all, then feel misled when they hit a limit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; read the limits before you start. Free covers up to 10 photos per run, which is plenty for a single client delivery or a few social posts. Pro is a one-time $12.99 and covers 50+ per run, the privacy risk report, CSV/JSON metadata export, and removal of Toolkite branding. If you're doing occasional personal use, free is genuinely enough. If you're running a photo workflow for clients, Pro pays for itself in one batch.&lt;/p&gt;

&lt;h2&gt;
  
  
  A power-user alternative worth knowing
&lt;/h2&gt;

&lt;p&gt;If you live in a terminal, ExifTool itself is still the gold standard for control. A one-liner like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-overwrite_original&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;strips metadata across a folder in place. The trade-offs are real: you need it installed, you need to be comfortable with the flags, and &lt;code&gt;-overwrite_original&lt;/code&gt; is unforgiving if you point it at the wrong directory. For a quick one-off — a single photo you want to post right now — a browser tool is faster and has no install step. For scripted pipelines, ExifTool wins. Pick based on the job, not on loyalty.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to actually do next
&lt;/h2&gt;

&lt;p&gt;If you found this because you're cleaning up a batch before sending it out, start with the &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt; and run your first photo through it. Check the grouped table before you strip — you'll probably be surprised what's in there. Camera model, lens, ISO, and often a timestamp accurate to the second. Then strip, download, and verify by re-dropping the cleaned file into the same tool. If the table comes back empty, you're done.&lt;/p&gt;

&lt;p&gt;If you also watermark client photos before delivery, the &lt;a href="https://toolkite.net/watermark/" rel="noopener noreferrer"&gt;watermark tool&lt;/a&gt; runs on the same browser-only model, so you can keep the whole prep pipeline local.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is a browser-based EXIF remover actually as private as ExifTool?
&lt;/h3&gt;

&lt;p&gt;For the specific job of stripping EXIF, GPS, and camera metadata, a browser tool that processes locally gives you the same practical privacy outcome as ExifTool — the file never leaves your machine. The difference is control: ExifTool lets you script, batch, and target specific fields, while a browser tool trades that control for zero install and a visual review table. Neither is universally better; it depends on whether you need scriptability or convenience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does stripping EXIF reduce image quality?
&lt;/h3&gt;

&lt;p&gt;Yes, slightly, because the image is re-encoded through Canvas rather than having metadata surgically removed from the original bytes. In EXIF Remover the JPEG export runs at roughly quality 0.92, which is visually lossless for most photos but not bit-identical. If you need pixel-perfect preservation of the original encoding, use ExifTool with &lt;code&gt;-all=&lt;/code&gt; on the original file instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I remove only the GPS data and keep the camera info?
&lt;/h3&gt;

&lt;p&gt;Not with EXIF Remover — it strips all metadata at once by re-encoding the image. There's no GPS-only or keep-lens mode. If selective removal matters to you, ExifTool supports field-level control with flags like &lt;code&gt;-gps:all=&lt;/code&gt;. For most people sharing photos publicly, removing everything is the simpler and safer default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does my photo still show a location after I stripped it?
&lt;/h3&gt;

&lt;p&gt;The most common cause is that you sent the original file instead of the cleaned download. The tool never modifies your original on disk, so both versions exist side by side. Another cause is that the receiving platform re-added location from a different source, like a check-in tag. Re-drop the cleaned file into the tool and check the table — if it's empty, the file itself is clean.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many photos can I process for free?
&lt;/h3&gt;

&lt;p&gt;The free tier handles up to 10 photos per run, which covers most single-delivery and social-posting use cases. The optional one-time Pro license raises that to 50+ per run and adds a privacy risk report with a score, CSV/JSON metadata export, and removal of Toolkite branding. There's no subscription — it's a single purchase if you decide you need the batch capacity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does HEIC from an iPhone work in a browser EXIF remover?
&lt;/h3&gt;

&lt;p&gt;It depends on your browser. EXIF Remover accepts HEIC files, but only if the browser itself can decode that format. Safari on macOS and iOS generally can; some Chrome and Firefox configurations cannot. If your HEIC file won't load, convert it to JPG first, then strip the metadata from the converted file.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>privacy</category>
      <category>tools</category>
    </item>
    <item>
      <title>JSON to Excel Converter Online: What Actually Works in 2026</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Mon, 14 Sep 2026 12:30:20 +0000</pubDate>
      <link>https://dev.to/tavigogogo/json-to-excel-converter-online-what-actually-works-in-2026-30l2</link>
      <guid>https://dev.to/tavigogogo/json-to-excel-converter-online-what-actually-works-in-2026-30l2</guid>
      <description>&lt;p&gt;You've got a JSON file that a developer handed you, or an API response you saved to disk, and someone upstairs wants it as a spreadsheet by Friday. The obvious move is to paste it into some random "convert" site and hope for the best. The less obvious move is to think for ten seconds about what you're actually pasting — because API responses are full of tokens, customer IDs, and internal field names you probably shouldn't be handing to a stranger's server.&lt;/p&gt;

&lt;p&gt;This is a walkthrough of how to get from JSON to a real Excel file (&lt;code&gt;.xlsx&lt;/code&gt;) without uploading anything, what breaks when your JSON is nested, and when you should skip the browser entirely and write a script.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "JSON to Excel" actually means
&lt;/h2&gt;

&lt;p&gt;People say "Excel" loosely. There are three different outputs hiding behind that word, and picking the wrong one is why your columns look like garbage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSV&lt;/strong&gt; — plain text, comma-separated. Opens in Excel fine. No formatting, no multiple sheets, no data types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XLSX&lt;/strong&gt; — the real Excel format. Preserves types better, handles larger row counts, and won't mangle long numbers the way CSV sometimes does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A flattened table&lt;/strong&gt; — this is the one that matters. If your JSON has objects inside objects, neither CSV nor XLSX will magically know what to do with them. You have to flatten first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your JSON looks like this, you're in the easy case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ada"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"plan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pro"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"plan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"free"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An array of flat objects converts cleanly to columns &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;plan&lt;/code&gt;. Done.&lt;/p&gt;

&lt;p&gt;If it looks like this, you have decisions to make:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"customer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ada"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"London"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vip"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"renewal"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you need to decide whether &lt;code&gt;customer.address.city&lt;/code&gt; becomes its own column, and what happens to the &lt;code&gt;tags&lt;/code&gt; array. That's the flattening problem, and it's where most online converters quietly fall over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use our online tool: JSON ↔ CSV Converter
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://toolkite.net/json-csv/" rel="noopener noreferrer"&gt;JSON ↔ CSV Converter&lt;/a&gt; runs entirely in your browser — PapaParse and SheetJS doing the work locally, no file ever leaving your machine. That matters if the JSON contains anything you wouldn't post publicly.&lt;/p&gt;

&lt;p&gt;Here's the actual flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Paste or upload.&lt;/strong&gt; Drop a &lt;code&gt;.json&lt;/code&gt; or &lt;code&gt;.csv&lt;/code&gt; file, or paste the text directly. Free tier handles files up to about 25MB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick your direction.&lt;/strong&gt; JSON→CSV, CSV→JSON, or JSON→Excel (&lt;code&gt;.xlsx&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convert and download.&lt;/strong&gt; Copy the result or download it immediately.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For nested JSON, the free tier flattens up to 10 levels deep, which covers the vast majority of API payloads I've seen. If you're dealing with something genuinely gnarly — deeply nested config dumps, multi-level event logs — the Pro tier goes deeper, raises the file ceiling to 50MB with a progress bar, and adds batch conversion up to 10 files at once. Pro is a one-time $9.99, not a subscription.&lt;/p&gt;

&lt;p&gt;There's also a custom delimiter option and an API URL fetch if you'd rather point the tool at an endpoint than save the response first. That fetch is the one operation that touches the network, and it goes through a CORS proxy — worth knowing if the endpoint is internal.&lt;/p&gt;

&lt;h2&gt;
  
  
  When flattening goes wrong (and how to spot it)
&lt;/h2&gt;

&lt;p&gt;Flattening is not lossless, and pretending otherwise causes real bugs. Three things to watch:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arrays inside objects.&lt;/strong&gt; A field like &lt;code&gt;tags: ["vip", "renewal"]&lt;/code&gt; has to become &lt;em&gt;something&lt;/em&gt;. Usually it gets joined into a single cell like &lt;code&gt;vip, renewal&lt;/code&gt;. That's fine for reading, terrible for filtering later — Excel will treat the whole thing as one string.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repeated keys across records.&lt;/strong&gt; If record A has &lt;code&gt;customer.address.city&lt;/code&gt; and record B doesn't, you'll get an empty cell. That's correct behavior, but it means your column list is the union of every key across every record. A single weird record can add twenty useless columns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type drift.&lt;/strong&gt; Numbers stored as strings in JSON stay strings. Excel will happily left-align them and refuse to sum them until you convert. Check a numeric column after import — if the values are left-aligned, they're text.&lt;/p&gt;

&lt;p&gt;A quick sanity check: count your source records, count your output rows, and confirm they match. If they don't, something got collapsed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The alternative: a script you control
&lt;/h2&gt;

&lt;p&gt;If you're converting the same shape of JSON every week, stop doing it by hand. A short Python script is more honest about what's happening:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_excel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.xlsx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;json_normalize&lt;/code&gt; handles the flattening, and you can control the separator (&lt;code&gt;sep="_"&lt;/code&gt; instead of the default &lt;code&gt;.&lt;/code&gt;) so your column names don't look like file paths.&lt;/p&gt;

&lt;p&gt;The trade-offs are real, though. You need Python and pandas installed, you need to remember the command, and you need to actually be at a machine where that's set up. For a one-off conversion on a laptop you don't control, that's a lot of ceremony. The browser tool wins on convenience; the script wins on repeatability and on shapes that need custom logic.&lt;/p&gt;

&lt;p&gt;If your data is sensitive and you don't want to install anything, browser-side conversion is the safer middle ground — nothing leaves the device, and you can verify that by watching your network tab. Same reasoning applies to other file-handling chores; it's why tools like the &lt;a href="https://toolkite.net/exif-remover" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt; exist for photos, and the same principle shows up in our &lt;a href="https://toolkite.net/privacy" rel="noopener noreferrer"&gt;privacy notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical tips before you hit convert
&lt;/h2&gt;

&lt;p&gt;A few things that save time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validate the JSON first.&lt;/strong&gt; A trailing comma or a stray comment will break the parse. Paste it into any JSON validator before converting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide your column names early.&lt;/strong&gt; &lt;code&gt;customer.address.city&lt;/code&gt; is readable; &lt;code&gt;customer_address_city&lt;/code&gt; is easier to work with in formulas. Pick one convention and stick to it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the row limit.&lt;/strong&gt; Excel tops out around 1,048,576 rows. If you're near that, you probably want a database, not a spreadsheet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the original.&lt;/strong&gt; Always retain the source JSON. Flattening is one-way, and you'll want to re-derive a different view later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check encoding on export.&lt;/strong&gt; If your data has accented characters or emoji, open the output once and confirm nothing turned into &lt;code&gt;?&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're generating test data to convert in the first place, the &lt;a href="https://toolkite.net/mock-data" rel="noopener noreferrer"&gt;mock data generator&lt;/a&gt; can produce JSON you can feed straight into the converter — useful for building a template before the real payload arrives.&lt;/p&gt;

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

&lt;p&gt;For an array of flat objects, any converter works. For nested JSON, you need something that flattens predictably and tells you what it did. For anything with customer data in it, you want that conversion happening on your machine, not someone else's. The &lt;a href="https://toolkite.net/json-csv/" rel="noopener noreferrer"&gt;JSON ↔ CSV Converter&lt;/a&gt; covers the first two and is honest about the third — which is more than most of the sites ranking for this keyword can say.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does converting JSON to Excel in the browser actually produce a real .xlsx file?
&lt;/h3&gt;

&lt;p&gt;Yes. The tool uses SheetJS locally in your browser to build a genuine .xlsx workbook, not a renamed CSV. You get a file Excel opens natively, with the data types it can infer from your JSON preserved as well as the format allows.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens to nested objects when I convert JSON to Excel?
&lt;/h3&gt;

&lt;p&gt;They get flattened into columns, typically using a separator like a dot or underscore, so &lt;code&gt;customer.address.city&lt;/code&gt; becomes its own column. The free tier handles nesting up to 10 levels deep, which covers most API responses. Arrays inside objects usually get joined into a single cell, so check those columns if you plan to filter on them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a file size limit for JSON to Excel conversion?
&lt;/h3&gt;

&lt;p&gt;On the free tier, files up to roughly 25MB work fine. If you regularly deal with larger payloads, the Pro option raises that to 50MB and shows a progress indicator during conversion. Pro is a one-time $9.99 purchase rather than a recurring subscription.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I convert JSON from an API URL directly instead of saving it first?
&lt;/h3&gt;

&lt;p&gt;Yes, that's one of the Pro features — you can point the tool at an API URL and fetch the response for conversion. Be aware this is the one operation that uses the network, routed through a CORS proxy, so avoid it for internal or authenticated endpoints you wouldn't want proxied.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do my numbers show up as text after converting to Excel?
&lt;/h3&gt;

&lt;p&gt;Because JSON stores them as strings, and the converter preserves that. Excel left-aligns text and won't sum it. Select the column, use Text to Columns or multiply by 1 in a helper column, or fix the source JSON to emit real numbers before converting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use a browser converter or a Python script for this?
&lt;/h3&gt;

&lt;p&gt;Use the browser tool for one-off conversions, files you don't want to upload, or machines where you can't install anything. Use a script when the same JSON shape arrives on a schedule, when you need custom flattening logic, or when the conversion is part of a larger pipeline.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tools</category>
    </item>
    <item>
      <title>Clean Image Metadata Before Client Delivery — Browser Tool vs ExifTool</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Sun, 13 Sep 2026 12:32:37 +0000</pubDate>
      <link>https://dev.to/tavigogogo/clean-image-metadata-before-client-delivery-browser-tool-vs-exiftool-l4d</link>
      <guid>https://dev.to/tavigogogo/clean-image-metadata-before-client-delivery-browser-tool-vs-exiftool-l4d</guid>
      <description>&lt;p&gt;You've got a folder of selects, the client approved the shots, and now you're about to send them out. Before that email leaves your outbox, think about what's riding along inside each JPEG: your camera body, your lens, the exact GPS coordinates of the shoot, and often your editing software and a timestamp. For a wedding photographer, that's a home address in a file that gets forwarded around. For a real estate shooter, it's a client's property pin. Cleaning that metadata before delivery isn't paranoia — it's basic client care.&lt;/p&gt;

&lt;p&gt;The question is how you do it. Two paths dominate: a browser-based tool like &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt;, or a command-line approach like ExifTool. Both remove metadata. They differ in where your files go, how much you can script, and how much control you get over individual fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Browser tool (EXIF Remover)&lt;/th&gt;
&lt;th&gt;ExifTool (CLI)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where files are processed&lt;/td&gt;
&lt;td&gt;In your browser, on your device&lt;/td&gt;
&lt;td&gt;On your machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload required&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install needed&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Selective field removal&lt;/td&gt;
&lt;td&gt;No — strips all metadata&lt;/td&gt;
&lt;td&gt;Yes — granular flags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch size&lt;/td&gt;
&lt;td&gt;10 free, 50+ with Pro&lt;/td&gt;
&lt;td&gt;Unlimited (your disk is the limit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metadata export&lt;/td&gt;
&lt;td&gt;CSV/JSON with Pro&lt;/td&gt;
&lt;td&gt;Yes, many formats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formats&lt;/td&gt;
&lt;td&gt;JPG, PNG, WebP, HEIC (if browser decodes)&lt;/td&gt;
&lt;td&gt;Very broad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Moderate to steep&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That table is the honest version. The browser tool is faster to start and keeps files off any server. ExifTool gives you surgical control and scriptability, but you have to install it and learn its flags.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the browser tool wins
&lt;/h2&gt;

&lt;p&gt;If you're a freelancer delivering a handful of images per client, the browser route is almost always the right call. You drag files in, you see the metadata laid out in a grouped table — GPS coordinates, camera model, lens, timestamp, ISO, software — and you click &lt;strong&gt;Strip EXIF&lt;/strong&gt;. Then you download the cleaned image.&lt;/p&gt;

&lt;p&gt;A few things worth knowing about how this actually works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tool reads metadata with &lt;code&gt;exifr&lt;/code&gt; running locally in your browser. Nothing is sent anywhere.&lt;/li&gt;
&lt;li&gt;Stripping happens by drawing the image to a Canvas and exporting a fresh blob, so the output is a new file. Your original on disk is untouched.&lt;/li&gt;
&lt;li&gt;Because it's a re-encode, JPEG output is recompressed at roughly quality 0.92. That's visually fine for client delivery, but don't expect a bit-identical file.&lt;/li&gt;
&lt;li&gt;HEIC works only if your browser can decode it. If it can't, you'll need to convert first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The workflow, step by step
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Drop your photo onto the page — JPG, PNG, WebP, or HEIC — or click to browse. Nothing uploads.&lt;/li&gt;
&lt;li&gt;Review the EXIF fields in the grouped table. This is your last chance to spot a GPS tag you didn't know was there.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Strip EXIF&lt;/strong&gt; and download the clean image.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're delivering to a client who cares about privacy (or you just don't want your home studio coordinates floating around), that's the whole job. Ten photos per run on the free tier; Pro bumps it to 50+ per run and adds a privacy risk report with a score, CSV/JSON metadata export, and removes Toolkite branding. It's a one-time $12.99 if you want it — the free tier is genuinely usable without it.&lt;/p&gt;

&lt;p&gt;One caveat: the tool strips all metadata. There's no GPS-only mode and no "keep the lens info" option. If you need that granularity, see the next section.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use alternatives
&lt;/h2&gt;

&lt;p&gt;ExifTool is the right tool when you need precision. Say you want to keep the copyright tag but kill the GPS block, or you're processing 400 images from a corporate shoot and want it scripted into your delivery pipeline. A typical command looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-overwrite_original&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That wipes everything. For selective removal you'd use flags like &lt;code&gt;-gps:all=&lt;/code&gt; to drop only GPS, or &lt;code&gt;-XMP:all=&lt;/code&gt; for a specific block. The trade-off is you need to know which tags matter and test on copies first — it's easy to nuke something you wanted to keep.&lt;/p&gt;

&lt;p&gt;Other alternatives worth mentioning honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OS-level export options.&lt;/strong&gt; Some photo apps strip metadata on export, but the behavior varies and isn't always obvious. Check before you trust it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop batch utilities.&lt;/strong&gt; They work, but you're installing software and often clicking through more UI than the browser tool requires.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Online upload-based strippers.&lt;/strong&gt; These exist, but you're handing your client's photos to someone else's server. For client work, that's usually a non-starter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're also watermarking before delivery, that's a separate step — &lt;a href="https://toolkite.net/watermark/" rel="noopener noreferrer"&gt;Watermark&lt;/a&gt; handles batch watermarking in the browser too, so you can strip metadata and brand images without either file leaving your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Edge cases that trip people up
&lt;/h2&gt;

&lt;p&gt;A few things I've run into that are worth flagging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Screenshots and PNGs.&lt;/strong&gt; These often carry less metadata than camera JPEGs, but they can still hold software tags. Strip them anyway if they're going to a client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-encoding artifacts.&lt;/strong&gt; If you're delivering a JPEG that's already been through several edits, another re-encode at 0.92 is usually invisible, but for print-critical work, keep a master copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HEIC from iPhones.&lt;/strong&gt; These are the ones most likely to carry GPS. If your browser can't decode HEIC, convert to JPEG first, then strip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata isn't only EXIF.&lt;/strong&gt; XMP and IPTC blocks can carry author names and edit history. The browser tool removes metadata by re-encoding, which handles the common channels — but if you need forensic-grade certainty across every possible channel, that's an ExifTool job, not a browser one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A practical delivery checklist
&lt;/h2&gt;

&lt;p&gt;Before you hit send on client files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Strip metadata on every image in the batch.&lt;/li&gt;
&lt;li&gt;Spot-check one file by re-opening it in the tool to confirm the GPS and camera fields are gone.&lt;/li&gt;
&lt;li&gt;Watermark if your contract requires it.&lt;/li&gt;
&lt;li&gt;Keep your originals — the stripped versions are new files, so your archive stays intact.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No uploads, no accounts, no server round-trip. If you want to see what's actually inside your photos before you decide, the tool shows you the full metadata table first — which is often the moment people realize how much their camera was recording.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does stripping metadata with a browser tool change the image quality?
&lt;/h3&gt;

&lt;p&gt;Slightly, yes. The browser tool removes metadata by drawing the image to a Canvas and exporting a new blob, which re-encodes JPEG at roughly quality 0.92. For client delivery and social media that's visually indistinguishable, but it's not a bit-identical copy of the original. Always keep your master files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I remove only the GPS data and keep the camera info?
&lt;/h3&gt;

&lt;p&gt;Not with the browser tool — it strips all metadata in one pass, so there's no GPS-only mode. If you need selective removal, ExifTool supports granular flags like &lt;code&gt;-gps:all=&lt;/code&gt; that target specific tag groups. The trade-off is a steeper learning curve and the need to test on copies first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it safe to strip metadata from client photos in a browser?
&lt;/h3&gt;

&lt;p&gt;Yes, because the processing happens locally on your device. The tool reads metadata with exifr in the browser and never uploads your files to a server. Your originals on disk stay unchanged, and the cleaned version downloads as a new file.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many photos can I clean at once before delivery?
&lt;/h3&gt;

&lt;p&gt;The free tier handles up to 10 photos per run. If you're delivering larger batches, the optional Pro license raises that to 50+ per run and adds a privacy risk report with a score, CSV/JSON metadata export, and removal of Toolkite branding. It's a one-time purchase, not a subscription.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about HEIC files from an iPhone?
&lt;/h3&gt;

&lt;p&gt;HEIC is supported only if your browser can decode it. If it can't, convert the HEIC to JPEG first and then strip the metadata. iPhone photos are among the most likely to carry GPS coordinates, so this step matters for client work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the browser tool wipe every possible metadata channel?
&lt;/h3&gt;

&lt;p&gt;No, and it doesn't claim to. Re-encoding through Canvas removes the common EXIF, GPS, and camera channels, but it isn't forensic-grade wiping of every possible metadata container. If you need certainty across XMP, IPTC, and obscure channels, use ExifTool and verify the output.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>privacy</category>
      <category>tools</category>
    </item>
    <item>
      <title>Why Is My Batch EXIF Removal Still Showing Location? (Fix Without Uploading)</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Fri, 11 Sep 2026 12:37:35 +0000</pubDate>
      <link>https://dev.to/tavigogogo/why-is-my-batch-exif-removal-still-showing-location-fix-without-uploading-4m7p</link>
      <guid>https://dev.to/tavigogogo/why-is-my-batch-exif-removal-still-showing-location-fix-without-uploading-4m7p</guid>
      <description>&lt;p&gt;You ran a batch strip, checked the file, and the GPS pin is still there. Or the photo opened fine on your laptop but Instagram still guessed your neighborhood. If that sounds familiar, the problem usually isn't the tool — it's which copy of the file you're inspecting, or which metadata channel survived the pass.&lt;/p&gt;

&lt;p&gt;This is a troubleshooting walkthrough for anyone cleaning a folder of photos before sending them to a client, posting them, or handing off a drive. The goal is simple: batch remove EXIF without uploading anything to a server, and actually confirm it worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why metadata survives a "successful" strip
&lt;/h2&gt;

&lt;p&gt;There are three common culprits, and they look identical from the outside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. You're checking the original, not the export.&lt;/strong&gt; Most browser tools — including &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt; — leave your source file untouched on disk. The cleaned version is a &lt;em&gt;new&lt;/em&gt; download. If you re-open the same file from your camera roll or Downloads folder, you're looking at the original. This is the single most common reason people think the strip failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The format didn't get re-encoded the way you assumed.&lt;/strong&gt; EXIF removal by re-encoding (drawing the pixels to a canvas and exporting a fresh blob) works reliably for JPG, PNG, and WebP. HEIC is conditional — it only works if your browser can decode HEIC in the first place. On browsers that can't, the file may not process at all, or may fail silently in a batch. That's not a bug in the strip logic; it's a decode limitation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Something downstream re-added metadata.&lt;/strong&gt; Some editors, cloud sync clients, and social upload flows write their own metadata fields. If you strip, then open the image in a photo editor and re-save, you may reintroduce software tags or a new timestamp. Strip last, or strip again after any re-save.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagnose before you strip: read the table first
&lt;/h2&gt;

&lt;p&gt;Don't strip blind. The fastest way to know whether you have a real problem is to look at what's actually in the file.&lt;/p&gt;

&lt;p&gt;Drop one representative photo into the &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt; and read the grouped table. You'll typically see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPS&lt;/strong&gt; — latitude/longitude, sometimes altitude and direction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camera&lt;/strong&gt; — make, model, lens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt; — timestamp, ISO, exposure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Software&lt;/strong&gt; — the app or OS that last wrote the file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If GPS is present here, it will be present in the file you share. If it's absent here, your earlier strip probably worked and you were inspecting the wrong copy.&lt;/p&gt;

&lt;p&gt;For a folder, spot-check two or three images rather than all of them. Cameras and phones write consistently, so if one has GPS, the batch almost certainly does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: batch strip without uploading
&lt;/h2&gt;

&lt;p&gt;Here's the workflow that avoids the confusion above.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Collect the originals in one folder&lt;/strong&gt; and don't touch them. Treat them as read-only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open the tool&lt;/strong&gt; at &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;toolkite.net/exif-remover&lt;/a&gt; and drag your files in — JPG, PNG, WebP, or HEIC (HEIC only if your browser can decode it). Nothing is uploaded; the reading and stripping happen in your browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review the table&lt;/strong&gt; on at least one file so you know what's being removed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hit Strip EXIF.&lt;/strong&gt; The tool re-encodes the image via Canvas and produces a clean blob.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download the cleaned files&lt;/strong&gt; into a &lt;em&gt;separate&lt;/em&gt; folder — name it something like &lt;code&gt;clean/&lt;/code&gt; so you never mix it up with the originals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify.&lt;/strong&gt; Re-open one cleaned file in the tool and confirm the GPS and camera rows are gone.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On the free tier you can process up to 10 photos per run. If you're cleaning a shoot, the optional Pro license raises that to 50+ per run and adds a privacy risk report with a score, plus CSV/JSON export of the metadata you found. That export is genuinely useful if you need to log what was in a batch before deleting it — for example, keeping a record of capture timestamps for a client while removing the location.&lt;/p&gt;

&lt;p&gt;One honest caveat: because JPEG is re-encoded (quality around 0.92), the output is not bit-identical to the input. Visually it's fine for social, web, and client previews, but if you need pixel-perfect archival copies, keep the originals and treat the cleaned files as derivatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prevention: stop the problem before it starts
&lt;/h2&gt;

&lt;p&gt;A few habits make batch EXIF removal boring, which is what you want.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strip at the end of your edit chain.&lt;/strong&gt; Any re-save after stripping can reintroduce software tags.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep originals and cleaned files in separate folders.&lt;/strong&gt; Most "it didn't work" reports are folder mix-ups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check HEIC before a big batch.&lt;/strong&gt; Test one HEIC file first; if your browser can't decode it, convert to JPG beforehand rather than discovering it mid-run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't assume selective removal.&lt;/strong&gt; The tool strips all metadata in one pass — there's no GPS-only or keep-the-lens-info mode. If you need to preserve some fields, that's a job for a different tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-check after any third-party app touches the file.&lt;/strong&gt; Editors and upload pipelines can write new metadata.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your batch is part of a broader publishing workflow, it's worth pairing this with a watermark pass so branding and metadata cleanup happen in the same sitting. &lt;a href="https://toolkite.net/watermark/" rel="noopener noreferrer"&gt;Watermark&lt;/a&gt; runs in the browser too, so the same no-upload rule applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a browser tool isn't the right fit
&lt;/h2&gt;

&lt;p&gt;Be honest about the limits. A browser-based stripper is excellent for social posts, client previews, and quick batches. It is not a forensic tool, and it doesn't claim to be.&lt;/p&gt;

&lt;p&gt;If you need to inspect or remove metadata at a deeper level — obscure formats, scripted pipelines, or field-by-field control — command-line tools like ExifTool are the right call. They're slower to set up and less friendly, but they give you granular control this tool deliberately doesn't offer. Use the browser tool for the 90% case and reach for the CLI when you genuinely need surgical precision.&lt;/p&gt;

&lt;p&gt;For anything involving sensitive files, remember the privacy angle: with a browser tool, the image never leaves your machine. That's the whole point. You can read more about how Toolkite handles data on the &lt;a href="https://toolkite.net/privacy" rel="noopener noreferrer"&gt;privacy page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does my photo still show GPS after I batch removed EXIF?
&lt;/h3&gt;

&lt;p&gt;In most cases you're inspecting the original file, not the cleaned export. Browser tools leave the source untouched and produce a new download, so re-opening the file from your camera roll or Downloads folder shows the original metadata. Open the cleaned copy from your separate output folder instead, and re-check it in the tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  How come some photos in my batch didn't get stripped at all?
&lt;/h3&gt;

&lt;p&gt;Format is the usual reason. JPG, PNG, and WebP re-encode reliably, but HEIC only works if your browser can decode it. If a HEIC file can't be decoded, it may fail or be skipped in the batch. Test one HEIC file before running a large set, and convert to JPG first if needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if I strip EXIF and then edit the photo again?
&lt;/h3&gt;

&lt;p&gt;Re-saving in an editor or syncing through certain apps can write new metadata fields, including software tags and fresh timestamps. Strip as the last step in your workflow, or strip again after any re-save. Keeping originals and cleaned files in separate folders makes this easy to manage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does batch EXIF removal without uploading mean nothing leaves my device?
&lt;/h3&gt;

&lt;p&gt;Yes — with a browser-based tool the file is read and re-encoded locally, and nothing is sent to a server. That's the core advantage over upload-based converters. You can read more about how data is handled on the Toolkite privacy page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the cleaned image identical to the original?
&lt;/h3&gt;

&lt;p&gt;Not bit-for-bit. JPEG output is re-encoded at roughly 0.92 quality, so there's slight recompression. It looks fine for social media, web, and client previews, but if you need pixel-perfect archival copies, keep the originals and treat the cleaned files as derivatives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I remove only GPS and keep the camera info?
&lt;/h3&gt;

&lt;p&gt;No — the tool strips all metadata in a single pass, so there's no GPS-only or keep-the-lens mode. If you need field-by-field control, a command-line tool like ExifTool is the better fit. The browser tool is built for quick, private, whole-file cleanup.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>privacy</category>
      <category>tools</category>
    </item>
    <item>
      <title>The Practical Way to a Browser Based Mock Data Generator No Upload</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Thu, 10 Sep 2026 12:30:50 +0000</pubDate>
      <link>https://dev.to/tavigogogo/the-practical-way-to-a-browser-based-mock-data-generator-no-upload-444h</link>
      <guid>https://dev.to/tavigogogo/the-practical-way-to-a-browser-based-mock-data-generator-no-upload-444h</guid>
      <description>&lt;p&gt;I was setting up a staging database last month and needed 5,000 realistic user records. Every generator I found wanted an email address, a workspace name, or a credit card before it would spit out a single row. One of them asked me to paste my schema into a form and hit "Generate" — which, as far as I could tell, shipped the whole thing to a server I'd never heard of.&lt;/p&gt;

&lt;p&gt;If you're generating test data for anything that resembles a real product, that's a bad trade. Customer names, emails, and address shapes are exactly the kind of thing you don't want sitting in someone else's logs. A &lt;strong&gt;browser based mock data generator with no upload&lt;/strong&gt; solves that by running the generation logic locally — the schema and the output never leave your machine.&lt;/p&gt;

&lt;p&gt;That's the angle here: how to get realistic fake data fast, without signing up or handing your schema to a third party.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "no upload" actually matters for test data
&lt;/h2&gt;

&lt;p&gt;It's easy to wave off privacy concerns when the data is fake. But the schema itself is often the sensitive part. If you're mocking a healthcare intake form, a fintech onboarding flow, or an internal HR tool, the field names alone tell a story about what your system does and what it stores.&lt;/p&gt;

&lt;p&gt;There's also the practical side. Server-based generators introduce latency, rate limits, and the occasional 502 right when you're mid-sprint. A local generator just runs. You pick 10,000 rows, you get 10,000 rows.&lt;/p&gt;

&lt;p&gt;A few things to keep in mind when you evaluate any generator:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Where does generation happen?&lt;/strong&gt; If the answer is "on our servers," your schema is going somewhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's the free ceiling?&lt;/strong&gt; Many tools cap you at a few hundred rows and push you to a paid plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What formats can you export?&lt;/strong&gt; JSON and CSV cover most workflows; SQL &lt;code&gt;INSERT&lt;/code&gt; statements save a step if you're seeding a database.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use our online tool: Mock Data Generator
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://toolkite.net/mock-data" rel="noopener noreferrer"&gt;Mock Data Generator&lt;/a&gt; at Toolkite runs &lt;a href="https://fakerjs.dev/" rel="noopener noreferrer"&gt;faker.js&lt;/a&gt; entirely in your browser. Nothing is uploaded, and there's no account to create. Here's the workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build a schema.&lt;/strong&gt; Add fields one at a time and pick a type for each — name, email, address, date, and so on. The field list is the contract your fake data has to satisfy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate.&lt;/strong&gt; Choose how many rows you want. The free tier goes up to &lt;strong&gt;20,000 rows&lt;/strong&gt; and includes a limited set of field types (15 of them).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export.&lt;/strong&gt; Preview the result, then download it as &lt;strong&gt;JSON or CSV&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's the whole loop. No signup wall, no "verify your email to continue." If you want to see how it compares to other browser-only tools on the site, the &lt;a href="https://toolkite.net/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt; has more walkthroughs.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the free tier covers
&lt;/h3&gt;

&lt;p&gt;For most day-to-day work — seeding a dev database, populating a UI mockup, testing a CSV import — the free tier is enough. You get up to 20,000 rows and 15 field types. That's a real ceiling, not a demo.&lt;/p&gt;

&lt;p&gt;If you need more, there's an optional &lt;strong&gt;Pro&lt;/strong&gt; tier at &lt;strong&gt;$14.99 one-time&lt;/strong&gt;. It unlocks unlimited rows, 30+ field types (including locale-specific data), the ability to save up to 20 schemas in IndexedDB, SQL &lt;code&gt;INSERT&lt;/code&gt; export, multi-format ZIP export, and an ad-free experience. It's a one-time purchase, not a subscription — worth noting if you've been burned by per-seat pricing on other generators.&lt;/p&gt;

&lt;h3&gt;
  
  
  A quick schema example
&lt;/h3&gt;

&lt;p&gt;Say you're mocking a user table. Your schema might look like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; → UUID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;first_name&lt;/code&gt; → first name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;last_name&lt;/code&gt; → last name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;email&lt;/code&gt; → email (derived from name, ideally)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;signup_date&lt;/code&gt; → date within the last two years&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;country&lt;/code&gt; → country&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generate 5,000 rows, export as CSV, and you've got a file you can drop straight into a seed script. If you're feeding a Postgres instance, the Pro SQL &lt;code&gt;INSERT&lt;/code&gt; export saves you a conversion step.&lt;/p&gt;

&lt;h2&gt;
  
  
  The alternative: SaaS generators and CLI scripts
&lt;/h2&gt;

&lt;p&gt;There are two other paths people usually take, and both have honest trade-offs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SaaS generators (Mockaroo and similar).&lt;/strong&gt; These are polished, support a lot of types, and let you share schemas across a team. The catch is that your schema lives on their servers, the free tiers are usually row-limited, and you may need an account to save anything. If your org already has a data processing agreement with the vendor, fine. If not, think about whether the schema is something you'd be comfortable emailing to a stranger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI scripts with faker.js or Faker.&lt;/strong&gt; This is the most flexible option and the one I reach for when I need something highly custom. A minimal Node script looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@faker-js/faker&lt;/span&gt;&lt;span class="dl"&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;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;internet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;faker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;country&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it, redirect to a file, done. The trade-offs: you need Node installed, you have to write and maintain the script, and you're responsible for your own locale handling. For a one-off, that's fine. For a quick mockup where you just want a CSV in thirty seconds, it's overkill.&lt;/p&gt;

&lt;p&gt;A browser tool sits in the middle: no install, no upload, no account. You lose the scripting flexibility, but you gain speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical tips before you generate
&lt;/h2&gt;

&lt;p&gt;A few things I've learned the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Match your real column names.&lt;/strong&gt; If your production schema uses &lt;code&gt;created_at&lt;/code&gt;, don't generate &lt;code&gt;signup_date&lt;/code&gt;. Renaming columns later is annoying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Think about referential integrity.&lt;/strong&gt; If you're mocking orders and customers, you need the customer IDs in the orders file to actually exist. Generate the parent table first, then reuse those IDs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch your date ranges.&lt;/strong&gt; A &lt;code&gt;signup_date&lt;/code&gt; that lands in 2047 will break any date filters in your app. Set sensible bounds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the schema file.&lt;/strong&gt; If you're on the free tier, you'll be rebuilding the schema each session. On Pro, schemas save to IndexedDB in your browser, so you can pick up where you left off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't generate more than you need.&lt;/strong&gt; 20,000 rows is plenty for most tests. If you're hitting performance issues, it's usually the app, not the data volume.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to pick which
&lt;/h2&gt;

&lt;p&gt;If you're on a team with a signed vendor agreement and you need shared schemas across people, a SaaS tool makes sense. If you're scripting a repeatable data pipeline and you're comfortable in Node, write the script. If you just need realistic fake data in your browser, right now, without creating an account or uploading anything — that's exactly what the &lt;a href="https://toolkite.net/mock-data" rel="noopener noreferrer"&gt;Mock Data Generator&lt;/a&gt; is for.&lt;/p&gt;

&lt;p&gt;One more note on privacy: because generation happens locally, there's no server-side copy of your schema or your output. That's a meaningful difference from tools that generate on the backend. You can read more about how Toolkite handles data on the &lt;a href="https://toolkite.net/privacy" rel="noopener noreferrer"&gt;privacy page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The short version: pick the tool that matches your workflow, but be honest with yourself about where your schema ends up.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does the Mock Data Generator send my schema to a server?
&lt;/h3&gt;

&lt;p&gt;No. The generator runs faker.js locally in your browser, so your schema and the generated rows stay on your device. Nothing is uploaded, and there's no backend processing step involved.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many rows can I generate for free?
&lt;/h3&gt;

&lt;p&gt;The free tier supports up to 20,000 rows per generation, with a limited set of 15 field types. If you need more rows or additional field types like locale-specific data, there's an optional one-time Pro upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  What export formats are available?
&lt;/h3&gt;

&lt;p&gt;You can preview and download your generated data as JSON or CSV on the free tier. Pro adds SQL INSERT statements and multi-format ZIP export, which is handy if you're seeding a database directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I save my schema and reuse it later?
&lt;/h3&gt;

&lt;p&gt;On the free tier, you'll rebuild the schema each session. Pro lets you save up to 20 schemas in IndexedDB, which is browser-local storage, so they persist between visits without any account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is this a good alternative to Mockaroo or a Node faker script?
&lt;/h3&gt;

&lt;p&gt;It depends on your workflow. Mockaroo is strong for team-shared schemas but keeps data on their servers. A Node script gives you maximum flexibility but requires setup. A browser tool is the middle ground: no install, no upload, no account, just fast generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to create an account to use it?
&lt;/h3&gt;

&lt;p&gt;No account is required. You can build a schema, generate rows, and export the result without signing up. The optional Pro upgrade is a one-time purchase if you want the higher limits and extra features.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tools</category>
    </item>
    <item>
      <title>The Practical Way to Deep Nested JSON to Flat CSV</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Wed, 09 Sep 2026 12:30:26 +0000</pubDate>
      <link>https://dev.to/tavigogogo/the-practical-way-to-deep-nested-json-to-flat-csv-hf9</link>
      <guid>https://dev.to/tavigogogo/the-practical-way-to-deep-nested-json-to-flat-csv-hf9</guid>
      <description>&lt;p&gt;If you've ever stared at a JSON file with objects nested three or four levels deep and thought, "I just need this in a spreadsheet," you know the pain. Manually flattening nested arrays and objects is tedious, error-prone, and a total time sink. But here's the thing: you don't need to write a custom script or upload your data to some random server. There's a way to flatten deep nested JSON to flat CSV right in your browser, without your file ever leaving your device.&lt;/p&gt;

&lt;p&gt;In this walkthrough, I'll show you how to use Toolkite's &lt;a href="https://toolkite.net/json-csv/" rel="noopener noreferrer"&gt;JSON ↔ CSV Converter&lt;/a&gt; to flatten nested JSON into a clean, flat CSV—step by step. We'll also look at a command-line alternative for when you need more control, and I'll point out the trade-offs so you can pick what fits your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Flatten Nested JSON Is a Headache
&lt;/h2&gt;

&lt;p&gt;Let's be honest: JSON is great for APIs, but it's not exactly spreadsheet-friendly. A typical API response might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"order_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jane Doe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jane@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Portland"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"zip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"97205"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"qty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"qty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To get that into a CSV, you need to decide how to represent &lt;code&gt;customer.address.city&lt;/code&gt; and the &lt;code&gt;items&lt;/code&gt; array. Most converters either choke on the nesting or just give you a mess of &lt;code&gt;[object Object]&lt;/code&gt;. That's why you need a tool that knows how to flatten nested structures into columns like &lt;code&gt;customer.name&lt;/code&gt;, &lt;code&gt;customer.address.city&lt;/code&gt;, and so on.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Flatten Deep Nested JSON to Flat CSV in 5 Steps
&lt;/h2&gt;

&lt;p&gt;Here's the exact workflow I use with Toolkite's converter. It's free for files up to 25MB and handles nesting up to 10 levels, which covers most real-world API payloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Open the Converter and Paste or Upload Your JSON
&lt;/h3&gt;

&lt;p&gt;Head over to the &lt;a href="https://toolkite.net/json-csv/" rel="noopener noreferrer"&gt;JSON ↔ CSV Converter&lt;/a&gt;. You'll see a text area where you can paste your JSON directly. If your JSON is in a file, just drag and drop it—no upload, no waiting. The tool processes everything locally in your browser, so your data never touches a server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Choose the Right Conversion Mode
&lt;/h3&gt;

&lt;p&gt;You'll want to select &lt;strong&gt;JSON → CSV&lt;/strong&gt;. If you're aiming for an Excel file instead, you can pick &lt;strong&gt;JSON → Excel&lt;/strong&gt; (which gives you an &lt;code&gt;.xlsx&lt;/code&gt;). For this guide, we'll stick with CSV.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Flatten the Nested JSON (Pro Feature)
&lt;/h3&gt;

&lt;p&gt;Here's the key: to flatten nested objects and arrays, you need the &lt;strong&gt;Flatten nested JSON&lt;/strong&gt; option, which is part of Toolkite Pro. With Pro, you get deep flattening that turns nested structures into column headers like &lt;code&gt;customer.address.city&lt;/code&gt;. The free version handles flattening up to 10 levels, but Pro removes that limit and gives you more control.&lt;/p&gt;

&lt;p&gt;If you're only dealing with a shallow structure (a couple of levels), the free version might be enough. But for deep nesting—say, an API response with three or four levels—Pro is worth the one-time $9.99.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Convert and Preview
&lt;/h3&gt;

&lt;p&gt;Hit the convert button. The tool will process the JSON and show you the resulting CSV. You'll see columns for each flattened path, and rows for each object. If your JSON has arrays, the tool will repeat the parent data for each array element—a common approach that keeps everything in a flat table.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Download or Copy the Result
&lt;/h3&gt;

&lt;p&gt;Once you're happy with the preview, click &lt;strong&gt;Download&lt;/strong&gt; to save the CSV file, or just copy the output to your clipboard. That's it. No sign-up, no upload, no server-side processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Arrays of Objects?
&lt;/h2&gt;

&lt;p&gt;If your JSON is an array of objects (like a list of users), the converter handles that fine. Each object becomes a row, and nested fields become columns. If you have arrays inside objects, the tool will “explode” them—meaning it creates multiple rows for each item in the array, duplicating the parent fields. That's the standard way to flatten nested JSON to CSV, and it works well for most use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative: Using jq and a Spreadsheet (CLI Approach)
&lt;/h2&gt;

&lt;p&gt;If you're comfortable with the command line, you can flatten nested JSON using &lt;code&gt;jq&lt;/code&gt; and then import the result into Excel or Google Sheets. For example, to flatten a simple object with one level of nesting, you might use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'. as $root | .items[] | [.sku, .qty, $root.order_id, $root.customer.name] | @csv'&lt;/span&gt; data.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gets messy fast with deeper nesting. You'd have to write complex &lt;code&gt;jq&lt;/code&gt; filters or switch to a tool like &lt;code&gt;pandas&lt;/code&gt; in Python. The trade-off is control: you can decide exactly how to flatten, rename columns, and handle edge cases. But it requires scripting knowledge and debugging time.&lt;/p&gt;

&lt;p&gt;The browser tool, on the other hand, is instant and doesn't require any setup. For a one-off conversion, it's usually faster. For a recurring pipeline, a script might be worth the investment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy: Your Data Stays in Your Browser
&lt;/h2&gt;

&lt;p&gt;One thing I really appreciate about Toolkite is that everything runs locally. When you use the &lt;a href="https://toolkite.net/json-csv/" rel="noopener noreferrer"&gt;JSON ↔ CSV Converter&lt;/a&gt;, your JSON is processed in your browser using libraries like PapaParse and SheetJS. There's no file upload, so sensitive data—customer info, internal API responses, whatever—never leaves your machine. That's a big deal if you're handling data under NDA or just prefer not to trust random online tools.&lt;/p&gt;

&lt;p&gt;If you're curious about the privacy details, you can read more on the &lt;a href="https://toolkite.net/privacy" rel="noopener noreferrer"&gt;privacy page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Go Pro
&lt;/h2&gt;

&lt;p&gt;The free tier is generous: files up to 25MB and flattening up to 10 levels. That covers a lot of cases. But if you're dealing with deeply nested JSON (more than 10 levels), files larger than 25MB, or you need to batch-convert multiple files, Pro is a one-time $9.99 purchase. It also removes ads and adds features like custom delimiters and API URL fetching. For a freelancer or developer who regularly wrestles with API data, it's a solid investment.&lt;/p&gt;

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

&lt;p&gt;Flattening deep nested JSON to CSV doesn't have to be a chore. With the right browser tool, you can do it in minutes, without uploading your data anywhere. Next time you're staring at a nested API response, give the &lt;a href="https://toolkite.net/json-csv/" rel="noopener noreferrer"&gt;JSON ↔ CSV Converter&lt;/a&gt; a try. Your future self will thank you.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does flatten nested JSON mean?
&lt;/h3&gt;

&lt;p&gt;Flattening nested JSON means converting a hierarchical structure (objects within objects, arrays) into a flat table where each column represents a path, like 'customer.address.city'. This makes it easy to view in a spreadsheet or import into a database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I flatten deeply nested JSON for free?
&lt;/h3&gt;

&lt;p&gt;Yes, Toolkite's JSON ↔ CSV Converter is free for files up to 25MB and supports flattening up to 10 levels of nesting. If your JSON is deeper than that, you'll need the Pro version, which costs a one-time $9.99.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Toolkite upload my JSON to a server?
&lt;/h3&gt;

&lt;p&gt;No. The conversion happens entirely in your browser using client-side libraries. Your data never leaves your device, which is great for privacy-sensitive information.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does the tool handle arrays inside nested objects?
&lt;/h3&gt;

&lt;p&gt;When flattening, arrays are typically 'exploded'—each array element becomes a separate row, with the parent object's fields repeated. This produces a flat CSV where every row is self-contained.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I convert nested JSON to Excel (.xlsx) instead of CSV?
&lt;/h3&gt;

&lt;p&gt;Yes. The Toolkite converter offers a JSON → Excel mode that produces an .xlsx file. The same flattening logic applies, so you can get a spreadsheet with nested fields as columns.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the limitations of the free version?
&lt;/h3&gt;

&lt;p&gt;The free version supports files up to 25MB and flattening up to 10 levels. It also shows ads. Pro removes ads, increases the file limit to 50MB, allows deeper flattening, and adds batch conversion and custom delimiters.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tools</category>
    </item>
    <item>
      <title>How to Check if a Photo Has GPS Data (Without Uploading It)</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Tue, 08 Sep 2026 12:30:27 +0000</pubDate>
      <link>https://dev.to/tavigogogo/how-to-check-if-a-photo-has-gps-data-without-uploading-it-1d5f</link>
      <guid>https://dev.to/tavigogogo/how-to-check-if-a-photo-has-gps-data-without-uploading-it-1d5f</guid>
      <description>&lt;p&gt;You've got a photo you're about to post or send, and a nagging thought: does this thing have my location baked in? Maybe it's a shot of your new apartment, a client's property, or a friend's backyard. The answer isn't always obvious from looking at the file. Here's how to check if a photo has GPS data — and do it without uploading it to some random server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why GPS Data Hides in Plain Sight
&lt;/h2&gt;

&lt;p&gt;Most phones and many cameras embed EXIF metadata when they snap a picture. That metadata can include the camera model, lens, shutter speed, ISO, and — if location services are on — GPS coordinates. You don't see any of it in the image itself. It's just there, quietly attached to the file.&lt;/p&gt;

&lt;p&gt;That's fine when you're the only one who sees the file. But if you share it on social media, send it to a client, or post it on a forum, those coordinates can travel with it. Some platforms strip metadata automatically; many don't. So before you share, it's worth knowing what's actually in the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Check if a Photo Has GPS Data in 5 Steps
&lt;/h2&gt;

&lt;p&gt;Here's a practical, private way to check — and then clean up if needed — using the &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover tool&lt;/a&gt; on Toolkite. Everything runs in your browser, so the photo never leaves your device.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Open the EXIF Remover tool
&lt;/h3&gt;

&lt;p&gt;Head to &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;https://toolkite.net/exif-remover/&lt;/a&gt;. You'll see a drop zone. No account, no sign-up, no upload.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Drop your photo
&lt;/h3&gt;

&lt;p&gt;Drag and drop a JPG, PNG, WebP, or HEIC file onto the page — or click to browse. The tool reads the metadata directly in your browser using a library called exifr. It doesn't send the file anywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Look for the GPS section
&lt;/h3&gt;

&lt;p&gt;The tool displays the EXIF data in a grouped table. Scroll through it and look for headings like &lt;strong&gt;GPS&lt;/strong&gt; or &lt;strong&gt;Location&lt;/strong&gt;. If you see latitude and longitude values, your photo has GPS data. You'll also see other useful fields like camera model, timestamp, and software.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Decide what to do
&lt;/h3&gt;

&lt;p&gt;If there's no GPS data, great — you can safely share the original. If there is, you have two choices: keep the original for yourself, or strip the metadata before sharing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Strip and download (if needed)
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;Strip EXIF&lt;/strong&gt; button. The tool re-encodes the image by drawing it to a Canvas and exporting a new file, removing the metadata in the process. Then download the cleaned image. The original file on your disk stays untouched — you get a fresh, clean copy.&lt;/p&gt;

&lt;p&gt;That's it. You've checked and, if necessary, removed the GPS data — all without uploading a single byte.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Checking on Your Phone or Desktop?
&lt;/h2&gt;

&lt;p&gt;Sometimes you're not near a browser, or you just want a quick check without opening a tool. Here are a few alternatives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: Right-click the file, select &lt;strong&gt;Properties&lt;/strong&gt;, then go to the &lt;strong&gt;Details&lt;/strong&gt; tab. Look for "GPS" or "Latitude/Longitude" fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS&lt;/strong&gt;: Open the photo in Preview, then go to &lt;strong&gt;Tools &amp;gt; Show Inspector&lt;/strong&gt; (or press Cmd+I). Click the &lt;strong&gt;Exif&lt;/strong&gt; tab and look for "GPS" or "Location".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iPhone/Android&lt;/strong&gt;: In the Photos app, swipe up or tap the info button. Some apps show location; others hide it unless you export the original.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These methods work, but they only tell you if GPS data exists — they don't clean it. And if you're dealing with HEIC files on a PC, the built-in tools often can't read the metadata at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Browser-Based Checking Beats Uploading to a Random Site
&lt;/h2&gt;

&lt;p&gt;You might be tempted to use one of those "EXIF viewer" websites that asks you to upload your photo. Think about what that means: you're sending your image — and its metadata — to a server you don't control. Even if the site claims to delete files after processing, you have no way to verify that. For sensitive photos, that's a privacy risk you don't need.&lt;/p&gt;

&lt;p&gt;Toolkite's approach is different: the tool runs entirely in your browser. The photo is read and processed locally. Nothing is uploaded. That's the same reason I use it for client work — I can check and strip metadata without worrying about where my files are going.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Word on What Stripping Does (and Doesn't Do)
&lt;/h2&gt;

&lt;p&gt;When you strip EXIF via the browser method, the tool re-encodes the image. That means the output is a new file with metadata removed. It's not a bit-for-bit copy of the original — JPEG re-encoding can slightly change the file, though quality is generally preserved. If you need pixel-perfect copies, you might want to keep the original and only share the cleaned version.&lt;/p&gt;

&lt;p&gt;Also, note that this method removes the standard EXIF, GPS, and camera metadata. It's not a forensic-grade wipe of every possible metadata channel — for that, you'd need specialized software. But for everyday sharing, it's more than enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to Check Your Photos?
&lt;/h2&gt;

&lt;p&gt;The next time you're about to share a photo and wonder if it's got GPS data, you don't need to guess. Open &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt;, drop the file, and look at the table. If you see coordinates, strip them in one click. It's free to use in the browser, with an optional Pro upgrade if you need to batch-process 50+ photos or export metadata as CSV/JSON.&lt;/p&gt;

&lt;p&gt;Your photos, your location — keep them under your control.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How can I tell if a photo has GPS data without uploading it?
&lt;/h3&gt;

&lt;p&gt;Use a browser-based tool like Toolkite's EXIF Remover. Drop the photo onto the page, and it reads the metadata locally, displaying GPS coordinates if present. Nothing is uploaded to a server.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does GPS data in a photo look like?
&lt;/h3&gt;

&lt;p&gt;GPS data appears as latitude and longitude coordinates, often along with altitude and timestamp. In EXIF viewers, it's usually under a 'GPS' or 'Location' section.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does stripping EXIF remove GPS data permanently?
&lt;/h3&gt;

&lt;p&gt;Yes, when you use the Strip EXIF button, the tool re-encodes the image and removes the metadata, including GPS. The original file on your device remains unchanged, so you have a clean copy to share.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I check GPS data on my phone without an app?
&lt;/h3&gt;

&lt;p&gt;On iPhone, open the photo and tap the info button or swipe up to see location if available. On Android, use the Gallery app's details or a file manager. These methods only show location if the app reads EXIF; they don't strip it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it safe to use online EXIF viewers?
&lt;/h3&gt;

&lt;p&gt;It depends. Many online viewers require uploading your photo to their server, which creates a privacy risk. Toolkite's EXIF Remover processes everything in your browser, so your photo never leaves your device.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>privacy</category>
      <category>tools</category>
    </item>
    <item>
      <title>Capitalize Text Online: The Practical Way to Fix Case Without Losing Privacy</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Mon, 07 Sep 2026 12:30:46 +0000</pubDate>
      <link>https://dev.to/tavigogogo/capitalize-text-online-the-practical-way-to-fix-case-without-losing-privacy-4e2l</link>
      <guid>https://dev.to/tavigogogo/capitalize-text-online-the-practical-way-to-fix-case-without-losing-privacy-4e2l</guid>
      <description>&lt;p&gt;We've all been there: you paste a block of text into some random website to capitalize it, and a tiny voice in your head asks, "Wait, is this thing sending my text to a server?" For most people, it doesn't matter—until it does. If you're a developer pasting API keys, a writer working on an unpublished draft, or a support agent dealing with customer data, that question matters a lot.&lt;/p&gt;

&lt;p&gt;The good news? You don't need to upload your text anywhere. With a browser-side tool like Toolkite's &lt;a href="https://toolkite.net/text-tools/" rel="noopener noreferrer"&gt;Text Toolbox&lt;/a&gt;, you can capitalize text online while your content never leaves your device. But before you jump in, let's talk about the common mistakes people make when they try to fix text case online—and how to avoid them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #1: Assuming Every Online Tool Processes Locally
&lt;/h2&gt;

&lt;p&gt;This is the big one. Many "online" text tools actually send your text to a remote server, process it there, and send it back. That's fine for a grocery list, but not for a client's private notes or a snippet of proprietary code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Look for tools that explicitly state they run in your browser. Toolkite's Text Toolbox processes everything client-side—your text stays in your browser's memory and never hits a network. You can paste sensitive content without worrying about where it's going.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #2: Using a Word Processor for Bulk Case Conversion
&lt;/h2&gt;

&lt;p&gt;Word processors like Microsoft Word or Google Docs can change case, but they're clunky for bulk operations. You have to select text, navigate menus, and often you're limited to sentence case or title case. If you have a list of 500 product names that need to be uppercase, doing that in a word processor is a recipe for repetitive-stress injury.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Use a dedicated text utility. The Text Toolbox includes case conversion options like uppercase, lowercase, title case, and sentence case. Paste your list, pick the case you need, and copy the result in one go. No menu hunting, no formatting surprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #3: Relying on Social Media or Messaging Apps
&lt;/h2&gt;

&lt;p&gt;Sometimes people type text in a chat app, use its built-in formatting, and then copy it elsewhere—only to find the case didn't stick. Or they paste text into a social media composer that auto-capitalizes the first letter of each sentence, mangling their intended formatting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Don't rely on apps that have their own case logic. Use a neutral text tool that does exactly what you ask. Copy from your source, run it through a case converter, and paste the clean result into any app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #4: Forgetting About Other Text Cleanup Tasks
&lt;/h2&gt;

&lt;p&gt;Capitalization is rarely the only thing wrong with a block of text. You might also have duplicate lines, extra spaces, or inconsistent line endings. If you fix the case first, you might have to redo it after you remove duplicates or sort lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Do all your text cleanup in one place. Text Toolbox offers 20+ utilities—dedupe lines, sort, case convert, slugify, Base64 encode/decode, and more. You can run multiple operations in sequence without losing your original text. For example, you can sort a list, then convert it to title case, all in the same session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #5: Ignoring the Privacy Implications of Your Text
&lt;/h2&gt;

&lt;p&gt;Even if you're not handling top-secret data, your text can reveal a lot. A draft article might contain personal anecdotes. A CSV export might have customer emails. A log file might include internal IP addresses. Uploading that to a random server is a privacy risk you don't need to take.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Make it a habit to use browser-side tools for any text you'd rather not share. Toolkite's privacy-first approach means you can capitalize text online without uploading it. Check their &lt;a href="https://toolkite.net/privacy" rel="noopener noreferrer"&gt;privacy policy&lt;/a&gt; if you want the details, but the short version is: your text stays with you.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Capitalize Text Online with Text Toolbox
&lt;/h2&gt;

&lt;p&gt;Ready to try it? Here's how to use Text Toolbox to change case, step by step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Paste your text&lt;/strong&gt; into the editor. You can drop it in or paste it directly. Everything stays local.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick a tool&lt;/strong&gt; from the categories: Format, Transform, Generate, or Analyze. For capitalization, you'll likely want the case conversion tool under Transform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the result&lt;/strong&gt; once you're happy. You can copy the transformed text or download it if you need to save it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No sign-up, no upload, no waiting. The free version handles up to 2 million characters—plenty for most tasks. If you regularly work with larger files, there's an optional Pro upgrade (one-time $9.99) that supports up to 5MB, keeps a history of your last 20 operations, and enables batch processing for multiple blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Note for Power Users
&lt;/h2&gt;

&lt;p&gt;If you're comfortable with the command line, tools like &lt;code&gt;sed&lt;/code&gt; or &lt;code&gt;awk&lt;/code&gt; can also change case. For example, &lt;code&gt;sed 's/.*/\U&amp;amp;/'&lt;/code&gt; will uppercase a line in Unix. But that requires you to have a terminal open, and it's not exactly beginner-friendly. A browser-based tool is faster for one-off tasks and doesn't require any setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Questions About Capitalizing Text Online
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I capitalize text online without uploading my data?
&lt;/h3&gt;

&lt;p&gt;Yes. Tools like Toolkite's Text Toolbox run entirely in your browser, so your text never leaves your device. You can paste sensitive content and process it locally.&lt;/p&gt;

&lt;h3&gt;
  
  
  What case options does Text Toolbox offer?
&lt;/h3&gt;

&lt;p&gt;The Text Toolbox includes case conversion utilities that let you switch between uppercase, lowercase, title case, and sentence case, among others. You can apply these to any text you paste into the editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Text Toolbox free to use?
&lt;/h3&gt;

&lt;p&gt;Yes, the basic version is free and supports up to 2 million characters per operation. There's also an optional one-time Pro upgrade for $9.99 that removes ads, increases the limit to 5MB, adds operation history, and enables batch processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Text Toolbox for other text cleanup tasks?
&lt;/h3&gt;

&lt;p&gt;Definitely. It includes over 20 utilities, such as removing duplicate lines, sorting lines, generating slugs, and encoding/decoding Base64. You can handle multiple tasks in one place.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Text Toolbox work on mobile devices?
&lt;/h3&gt;

&lt;p&gt;Since it's browser-based, it works on any device with a modern browser, including phones and tablets. The interface is responsive, so you can capitalize text on the go.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if I close the browser tab while using Text Toolbox?
&lt;/h3&gt;

&lt;p&gt;Your text is processed in the browser's memory, so if you close the tab, the processed result is gone. Make sure to copy or download your output before closing. The Pro version's history feature can help you recover past operations, but it's still a good idea to save important work.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I capitalize text online without uploading my data?
&lt;/h3&gt;

&lt;p&gt;Yes. Tools like Toolkite's Text Toolbox run entirely in your browser, so your text never leaves your device. You can paste sensitive content and process it locally.&lt;/p&gt;

&lt;h3&gt;
  
  
  What case options does Text Toolbox offer?
&lt;/h3&gt;

&lt;p&gt;The Text Toolbox includes case conversion utilities that let you switch between uppercase, lowercase, title case, and sentence case, among others. You can apply these to any text you paste into the editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Text Toolbox free to use?
&lt;/h3&gt;

&lt;p&gt;Yes, the basic version is free and supports up to 2 million characters per operation. There's also an optional one-time Pro upgrade for $9.99 that removes ads, increases the limit to 5MB, adds operation history, and enables batch processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Text Toolbox for other text cleanup tasks?
&lt;/h3&gt;

&lt;p&gt;Definitely. It includes over 20 utilities, such as removing duplicate lines, sorting lines, generating slugs, and encoding/decoding Base64. You can handle multiple tasks in one place.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Text Toolbox work on mobile devices?
&lt;/h3&gt;

&lt;p&gt;Since it's browser-based, it works on any device with a modern browser, including phones and tablets. The interface is responsive, so you can capitalize text on the go.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if I close the browser tab while using Text Toolbox?
&lt;/h3&gt;

&lt;p&gt;Your text is processed in the browser's memory, so if you close the tab, the processed result is gone. Make sure to copy or download your output before closing. The Pro version's history feature can help you recover past operations, but it's still a good idea to save important work.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>How to Batch Watermark Photos Online Free (Without Uploading Files)</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Sun, 06 Sep 2026 12:40:51 +0000</pubDate>
      <link>https://dev.to/tavigogogo/how-to-batch-watermark-photos-online-free-without-uploading-files-a9i</link>
      <guid>https://dev.to/tavigogogo/how-to-batch-watermark-photos-online-free-without-uploading-files-a9i</guid>
      <description>&lt;h2&gt;
  
  
  Why Batch Watermarking Without Uploading Matters
&lt;/h2&gt;

&lt;p&gt;If you're a photographer or a small business owner who shares product shots on social media, you've probably spent an evening adding the same text watermark to fifty photos one by one. It's tedious, and if you use a typical "free" online tool, you're also handing your original files to a stranger's server. That's not just a privacy risk — it can also be a legal headache if those photos are client work.&lt;/p&gt;

&lt;p&gt;Toolkite's &lt;a href="https://toolkite.net/watermark/" rel="noopener noreferrer"&gt;Image Watermark&lt;/a&gt; tool does the whole job in your browser. Your photos never leave your device. No upload, no waiting for a server queue, no risk of someone else's hands on your files. The free version handles one image at a time, but if you need true batch processing, there's an optional Pro mode that unlocks it along with a few other useful features. Here's how to get it done, step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Batch Watermark Photos Online Free: Step by Step
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Open the Image Watermark Tool
&lt;/h3&gt;

&lt;p&gt;Head to the &lt;a href="https://toolkite.net/watermark/" rel="noopener noreferrer"&gt;Image Watermark page&lt;/a&gt; in your browser. You don't need to create an account or sign in — just open the page and you're ready. Since everything runs locally, you can even use it offline if you've already loaded the page once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Upload Your Image (or Images)
&lt;/h3&gt;

&lt;p&gt;Drop a photo onto the page. The tool accepts common image formats like PNG, JPG, and WebP, and it processes the file using canvas compositing right on your device. If you're on the free tier, you'll work with one image at a time. That's fine for a quick watermark on a single hero shot, but if you have a folder full of images to protect, you'll want the Pro batch mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Style Your Watermark
&lt;/h3&gt;

&lt;p&gt;Here's where you get creative. You can add a &lt;strong&gt;text watermark&lt;/strong&gt; — type in your name, your brand, or a copyright notice — or upload a &lt;strong&gt;logo&lt;/strong&gt; to use as a graphic watermark. Then adjust the font, size, color, opacity, rotation, and position using the 9-grid placement. The live preview updates as you tweak, so you can see exactly how the watermark will look before you export. No more guessing and re-exporting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Export Your Watermarked Image
&lt;/h3&gt;

&lt;p&gt;Once you're happy with the preview, choose your export format: PNG, JPG, or WebP. You can also pick the quality level. The download happens instantly because the file never left your machine. For a single image, that's it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Upgrade to Pro for True Batch Watermarking
&lt;/h3&gt;

&lt;p&gt;If you need to watermark dozens or hundreds of photos in one go, the Pro version is a one-time purchase of $14.99 (no subscription). With Pro, you can batch watermark up to 100 images at once, use tiling mode to cover the whole image with a repeating watermark, export up to 4K resolution, and save up to 10 custom templates plus 15 presets for future jobs. That's a solid deal for a freelancer who watermarks client galleries regularly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative: Batch Watermarking with ImageMagick (Command Line)
&lt;/h2&gt;

&lt;p&gt;If you're comfortable with the command line, ImageMagick is a free, open-source alternative that runs locally. Here's a basic command to add a text watermark to every JPEG in a folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;img &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.jpg&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;convert &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-gravity&lt;/span&gt; southeast &lt;span class="nt"&gt;-pointsize&lt;/span&gt; 36 &lt;span class="nt"&gt;-fill&lt;/span&gt; &lt;span class="s2"&gt;"rgba(255,255,255,0.5)"&lt;/span&gt; &lt;span class="nt"&gt;-annotate&lt;/span&gt; +20+20 &lt;span class="s2"&gt;"© YourName"&lt;/span&gt; &lt;span class="s2"&gt;"wm_&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach is powerful and scriptable, but it has a steep learning curve. You need to install ImageMagick, learn its syntax, and handle edge cases like different image sizes or fonts. The Toolkite browser tool gives you a visual preview and doesn't require any setup — you just drag, drop, and download.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy and Practical Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No upload means no data breach risk.&lt;/strong&gt; When you use a web tool that uploads your photos, you're trusting that server to delete them afterward. With Toolkite, there's nothing to delete — the file stays in your browser's memory until you close the tab.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch mode saves hours.&lt;/strong&gt; If you're watermarking a wedding gallery or a product catalog, doing it manually is a huge time sink. The Pro batch mode is worth the one-time fee if you do this regularly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiling mode for extra protection.&lt;/strong&gt; If you're posting images that might be screenshotted or reused without credit, tiling the watermark across the entire image makes it much harder to crop out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your export format.&lt;/strong&gt; PNG is great for logos and graphics, but JPG is usually smaller for photos. WebP is a good middle ground for web use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What About Removing Watermarks?
&lt;/h2&gt;

&lt;p&gt;If you're looking to remove watermarks from someone else's photos, that's a different matter — and not something Toolkite offers. Watermark removal without permission is usually a copyright violation, so we won't go there. If you accidentally added a watermark to the wrong file, you can always re-export the original from your camera or backup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Batch watermarking photos online free doesn't have to mean sacrificing your privacy or your sanity. With Toolkite's &lt;a href="https://toolkite.net/watermark/" rel="noopener noreferrer"&gt;Image Watermark&lt;/a&gt;, you get a clean, visual workflow that runs entirely in your browser. Start with the free single-image mode to test it out, and if you need to process a whole batch, the Pro upgrade is a small one-time cost that pays for itself in saved time.&lt;/p&gt;

&lt;p&gt;While you're at it, if you share photos publicly, you might also want to strip sensitive metadata like GPS coordinates before posting. Toolkite's &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt; does that locally too, so your photos stay clean and private from start to finish.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is batch watermarking really free with Toolkite?
&lt;/h3&gt;

&lt;p&gt;The free version of Toolkite's Image Watermark tool lets you watermark one image at a time. True batch processing (up to 100 images at once) is a Pro feature that costs a one-time $14.99. So you can try the tool for free, but for batch work you'll need the Pro upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I watermark multiple images at once without uploading?
&lt;/h3&gt;

&lt;p&gt;Yes, with the Pro version of Toolkite's Image Watermark, you can batch watermark up to 100 images in one go. All processing happens in your browser — your photos are never uploaded to any server.&lt;/p&gt;

&lt;h3&gt;
  
  
  What file formats can I export after watermarking?
&lt;/h3&gt;

&lt;p&gt;Toolkite's Image Watermark lets you export your watermarked images as PNG, JPG, or WebP. You can also adjust the quality before downloading.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Toolkite store my photos on a server?
&lt;/h3&gt;

&lt;p&gt;No. Toolkite tools run entirely in your browser using canvas compositing. Your images never leave your device, so there's no server storage and no risk of data breach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use a logo as a watermark?
&lt;/h3&gt;

&lt;p&gt;Yes, the Image Watermark tool supports both text and logo watermarks. You can upload your logo and adjust its opacity, rotation, size, and position with a live preview.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is tiling mode in the Pro version?
&lt;/h3&gt;

&lt;p&gt;Tiling mode repeats your watermark across the entire image in a grid pattern. This is useful if you want to make it very difficult for someone to crop out your watermark. It's available in the Pro version of the tool.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>design</category>
      <category>tools</category>
    </item>
    <item>
      <title>Photo Metadata Privacy Risks: A Checklist Before You Share</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Sat, 05 Sep 2026 12:38:25 +0000</pubDate>
      <link>https://dev.to/tavigogogo/photo-metadata-privacy-risks-a-checklist-before-you-share-57m7</link>
      <guid>https://dev.to/tavigogogo/photo-metadata-privacy-risks-a-checklist-before-you-share-57m7</guid>
      <description>&lt;h2&gt;
  
  
  Why Photo Metadata Is a Privacy Risk
&lt;/h2&gt;

&lt;p&gt;Every time you snap a photo, your camera or phone quietly records a pile of extra information alongside the pixels. That's EXIF (Exchangeable Image File) data, and it can include the exact GPS coordinates, the date and time, the camera model, lens settings, and sometimes even your name or software used. Most people never think about it — until a photo they posted online reveals their home address or a client's private location.&lt;/p&gt;

&lt;p&gt;The scary part is how easy it is to leak. You might share a photo on social media, send it to a client, or upload it to a forum. Many platforms strip metadata automatically, but not all do. Some keep the EXIF intact, and even a single photo can expose more than you intended. That's why understanding photo metadata privacy risks is the first step to protecting yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Actually Inside Your Photo's Metadata?
&lt;/h2&gt;

&lt;p&gt;Before you can fix the problem, it helps to know what you're dealing with. Here's what typical EXIF data contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPS coordinates&lt;/strong&gt; – Latitude and longitude, often precise enough to point to your front door.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camera info&lt;/strong&gt; – Make, model, lens, focal length, aperture, shutter speed, ISO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date and time&lt;/strong&gt; – When the photo was taken, sometimes down to the second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Software&lt;/strong&gt; – The editing app or firmware used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thumbnail&lt;/strong&gt; – A small embedded preview that might contain its own metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copyright and author&lt;/strong&gt; – If you've set it, your name or handle could be embedded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if you think you've removed the visible location tag, the EXIF might still be lurking. That's why a proper metadata check is essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Photo Metadata Privacy Checklist
&lt;/h2&gt;

&lt;p&gt;Here's a practical checklist to run through before you share any photo, whether it's a personal snapshot or a client deliverable. Print it, bookmark it, or keep it in your head — just use it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Identify which photos contain sensitive metadata&lt;/strong&gt; – Start by checking a few images from each device or camera.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Check for GPS coordinates&lt;/strong&gt; – If you're at home, at a client site, or anywhere private, that's a red flag.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Look for camera and software info&lt;/strong&gt; – Not always a privacy risk, but it can reveal your workflow.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Decide if you need to strip all metadata&lt;/strong&gt; – For most sharing scenarios, the answer is yes.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Strip EXIF before uploading&lt;/strong&gt; – Use a tool that removes metadata without uploading your file to a server.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Verify the cleaned file&lt;/strong&gt; – After stripping, check that the metadata is really gone.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Keep the original file safe&lt;/strong&gt; – You might want the metadata later for your own records.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Be aware of platform behavior&lt;/strong&gt; – Some social sites strip metadata, others don't. Don't rely on them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How EXIF Remover Covers the Critical Items
&lt;/h2&gt;

&lt;p&gt;If you're looking for a way to handle this without sending your photos to some random server, &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt; on Toolkite does the job entirely in your browser. That's a big deal for privacy — your files never leave your device.&lt;/p&gt;

&lt;p&gt;Here's how it works in practice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Drop your photo&lt;/strong&gt; – Drag and drop a JPG, PNG, WebP, or HEIC file, or click to browse. Nothing is uploaded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review the EXIF fields&lt;/strong&gt; – You'll see GPS coordinates, camera model, lens, timestamp, ISO, and software in a grouped table. This is your chance to see exactly what's embedded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strip &amp;amp; download&lt;/strong&gt; – One click removes all metadata. The tool re-encodes the image (JPEG quality around 0.92) and gives you a clean file ready for sharing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The original file on your disk is untouched — you get a new, cleaned image. That's perfect for keeping your own records while sharing a safe version.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Doesn't Do (and Why That's Okay)
&lt;/h3&gt;

&lt;p&gt;EXIF Remover doesn't offer selective removal — you can't keep the lens info while dropping GPS. It strips everything, which is actually the safest approach for most people. It also doesn't claim forensic-grade wiping of every possible metadata channel, but for everyday sharing, it's more than enough.&lt;/p&gt;

&lt;p&gt;If you need to handle obscure formats or want finer control, you might look at command-line tools like ExifTool. But for a quick, private, browser-based solution, EXIF Remover covers the essentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Privacy Advantage of Browser-Based Tools
&lt;/h2&gt;

&lt;p&gt;When you use an online tool that uploads your photos to a server, you're adding another party to the equation. Even if they promise to delete files, you're trusting them with your data. Browser-based processing eliminates that risk entirely.&lt;/p&gt;

&lt;p&gt;Toolkite's whole approach is privacy-first — all tools run 100% in the browser with zero file upload. That means your photos, with all their sensitive metadata, never leave your computer. It's the difference between handing your photo to a stranger and keeping it in your own pocket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Tips for Different Scenarios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sharing on Social Media
&lt;/h3&gt;

&lt;p&gt;Before you post that picture of your new apartment or your weekend hike, strip the EXIF. Some platforms like Instagram and Facebook remove metadata, but others like Flickr or certain forums don't. Don't gamble with your location.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sending Photos to Clients
&lt;/h3&gt;

&lt;p&gt;If you're a freelancer or photographer, you might want to send a clean image without your camera settings or GPS data. EXIF Remover's free tier handles up to 10 photos per run, which is fine for a quick share. For larger batches, the optional Pro upgrade lets you process 50+ photos at once and even gives you a privacy risk report with a score.&lt;/p&gt;

&lt;h3&gt;
  
  
  Archiving Your Own Photos
&lt;/h3&gt;

&lt;p&gt;You might actually want to keep the original file with its metadata for your own records. That's why EXIF Remover creates a new file instead of overwriting the original. You get the best of both worlds.&lt;/p&gt;

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

&lt;p&gt;Photo metadata privacy risks are real, but they're also easy to mitigate. A quick check and a one-click strip can save you from awkward or even dangerous leaks. The key is to make it a habit before you hit share.&lt;/p&gt;

&lt;p&gt;Next time you're about to upload a photo, run through the checklist above. And if you need a fast, private way to clean your images, give &lt;a href="https://toolkite.net/exif-remover/" rel="noopener noreferrer"&gt;EXIF Remover&lt;/a&gt; a try. It's free to use in the browser, with optional Pro upgrades if you need more power. Your privacy is worth the few seconds it takes.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is photo metadata and why is it a privacy risk?
&lt;/h3&gt;

&lt;p&gt;Photo metadata, often called EXIF, includes details like GPS coordinates, camera model, timestamp, and software. It's a privacy risk because it can reveal your exact location, device, and habits when you share photos online, sometimes without you realizing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does social media strip photo metadata automatically?
&lt;/h3&gt;

&lt;p&gt;Some platforms like Facebook and Instagram remove EXIF data when you upload, but not all do. Sites like Flickr or certain forums may keep it intact. It's safer to strip metadata yourself before posting, rather than relying on the platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  How can I check if my photo has GPS data?
&lt;/h3&gt;

&lt;p&gt;You can use a browser-based tool like EXIF Remover on Toolkite to view all EXIF fields, including GPS coordinates. Just drop your photo in, and it will show you a grouped table of metadata without uploading your file anywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it safe to use an online EXIF remover?
&lt;/h3&gt;

&lt;p&gt;It depends on the tool. Many online services upload your photos to a server, which adds risk. Toolkite's EXIF Remover processes everything in your browser with zero upload, so your files never leave your device. That's the safest option.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I remove only GPS data and keep other metadata?
&lt;/h3&gt;

&lt;p&gt;EXIF Remover doesn't offer selective removal — it strips all metadata in one click. That's actually recommended for privacy, as it ensures nothing sensitive remains. If you need to keep certain fields, you'd need a more advanced tool like ExifTool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does stripping EXIF affect photo quality?
&lt;/h3&gt;

&lt;p&gt;Stripping metadata by re-encoding the image can cause a slight recompression, especially for JPEGs. EXIF Remover uses a quality setting around 0.92, so the visual difference is usually negligible. The original file is never altered, so you can always keep a high-quality version.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>tools</category>
    </item>
    <item>
      <title>How to Convert JSON to CSV with Headers (Without Uploading Your Files)</title>
      <dc:creator>tavi</dc:creator>
      <pubDate>Fri, 04 Sep 2026 12:30:20 +0000</pubDate>
      <link>https://dev.to/tavigogogo/how-to-convert-json-to-csv-with-headers-without-uploading-your-files-2ii9</link>
      <guid>https://dev.to/tavigogogo/how-to-convert-json-to-csv-with-headers-without-uploading-your-files-2ii9</guid>
      <description>&lt;p&gt;If you've ever stared at a JSON file and wished it looked like a spreadsheet, you're not alone. The good news: converting JSON to CSV with headers doesn't have to involve uploading your data to some random server or wrestling with command-line tools. You can do it right in your browser, and your file never leaves your device.&lt;/p&gt;

&lt;p&gt;I've spent way too many hours fighting with JSON-to-CSV converters that either choke on nested objects or ask for an email address before they'll let you download the result. That's why I switched to a browser-based approach. Let me show you how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Headers Matter in JSON to CSV Conversion
&lt;/h2&gt;

&lt;p&gt;CSV files need a header row to be useful. That's the first line with column names like &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;. Without headers, you're just dumping values into a file with no context — and that's a nightmare for anyone trying to import it into Excel, Google Sheets, or a database.&lt;/p&gt;

&lt;p&gt;When you convert JSON to CSV, the keys in your JSON objects become the headers. For example, this JSON array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;should become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name,age
Alice,30
Bob,25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seems simple, right? But things get tricky when you have nested objects or arrays inside your JSON — which is exactly where most online converters fall apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Nested JSON
&lt;/h2&gt;

&lt;p&gt;If you're working with data from an API, it's probably nested. Maybe you have something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"customer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alice@example.com"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A naive converter would probably just give you a single column with &lt;code&gt;[object Object]&lt;/code&gt; in it — useless. Or it might flatten only the top level, missing the customer's name and email entirely.&lt;/p&gt;

&lt;p&gt;That's where flattening comes in. You want the nested fields to become their own columns, like &lt;code&gt;customer.name&lt;/code&gt; and &lt;code&gt;customer.email&lt;/code&gt;. The Toolkite JSON↔CSV converter can do this automatically, and it's free for files up to 25MB with flattening up to 10 levels deep. That covers most real-world use cases I've seen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Our Online Tool: Convert JSON to CSV with Headers in 3 Steps
&lt;/h2&gt;

&lt;p&gt;I'm going to walk you through using the &lt;a href="https://toolkite.net/json-csv/" rel="noopener noreferrer"&gt;JSON ↔ CSV Converter&lt;/a&gt; on Toolkite. It's free, runs entirely in your browser, and doesn't require an account.&lt;/p&gt;

&lt;p&gt;Here's how to do it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Paste or upload your JSON.&lt;/strong&gt; You can copy-paste your JSON directly into the text area, or you can drag and drop a &lt;code&gt;.json&lt;/code&gt; file. The free tier handles files up to 25MB, which is plenty for most API responses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose the conversion direction.&lt;/strong&gt; Select &lt;strong&gt;JSON → CSV&lt;/strong&gt; (or &lt;strong&gt;JSON → Excel&lt;/strong&gt; if you want an &lt;code&gt;.xlsx&lt;/code&gt; file instead). If you have nested objects, the tool will flatten them by default — you can control the depth in the settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Download your CSV.&lt;/strong&gt; Once the conversion is done, you'll see the result, and you can either copy it or download the &lt;code&gt;.csv&lt;/code&gt; file. Your original JSON never leaves your browser.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No sign-up, no file upload to a server, no waiting for an email with a download link.&lt;/p&gt;

&lt;p&gt;If you need to convert multiple files at once or want to fetch JSON directly from an API URL, that's a Pro feature (one-time payment of $9.99). But for most one-off conversions, the free version is all you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative Method: Using Python's csv Module
&lt;/h2&gt;

&lt;p&gt;If you're comfortable with a bit of code, you can also convert JSON to CSV with headers using a Python script. Here's a simple example that handles flat JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;

&lt;span class="c1"&gt;# Load your JSON
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&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="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Write CSV
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;output.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works fine for flat data, but once you introduce nesting, you'll need to write a flattening function yourself — which is more code and more potential for bugs.&lt;/p&gt;

&lt;p&gt;The trade-off is clear: a script gives you full control, but it takes time to write and debug. A browser tool is instant and handles edge cases for you, but you're trusting the tool to do the flattening correctly. For most people, especially those who don't code every day, the browser approach is faster and less error-prone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Tips and Edge Cases
&lt;/h2&gt;

&lt;p&gt;When you're converting JSON to CSV, watch out for these gotchas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent keys.&lt;/strong&gt; If some objects have extra fields, the CSV will have empty cells for those missing values. That's fine, but make sure your tool doesn't crash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arrays of objects vs. a single object.&lt;/strong&gt; If your JSON is just one object, not an array, you might need to wrap it in brackets &lt;code&gt;[...]&lt;/code&gt; for proper conversion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Special characters.&lt;/strong&gt; Commas and quotes inside your data will be escaped automatically by good converters, so you don't have to worry about breaking the CSV format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large files.&lt;/strong&gt; If your file exceeds 25MB, you'll need the Pro version (up to 50MB) or you can split the file into smaller chunks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Converting JSON to CSV with headers doesn't have to be a headache. Whether you're dealing with a flat array or deeply nested API response, you have options. The browser-based approach from Toolkite is privacy-friendly, free for most use cases, and handles nesting without you writing a single line of code.&lt;/p&gt;

&lt;p&gt;Next time you need to turn JSON into a spreadsheet, give it a try — your data stays on your machine, and you'll have your CSV in seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does 'convert JSON to CSV with headers' mean?
&lt;/h3&gt;

&lt;p&gt;It means taking JSON data and turning it into a CSV file where the first row contains column names (headers) derived from the JSON keys. This makes the CSV readable by spreadsheet applications like Excel or Google Sheets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I convert nested JSON to CSV with headers?
&lt;/h3&gt;

&lt;p&gt;Yes, if you use a tool that flattens nested objects. The Toolkite JSON↔CSV converter flattens nested JSON up to 10 levels deep for free, turning nested fields like 'customer.name' into separate columns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the Toolkite JSON↔CSV converter upload my data to a server?
&lt;/h3&gt;

&lt;p&gt;No. All processing happens locally in your browser using JavaScript libraries. Your JSON file never leaves your device, which is why it's a privacy-friendly option.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a file size limit for the free JSON to CSV conversion?
&lt;/h3&gt;

&lt;p&gt;Yes, the free tier supports files up to 25MB. If you need to convert larger files (up to 50MB), you can upgrade to Pro for a one-time fee of $9.99.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I convert JSON to Excel (.xlsx) instead of CSV?
&lt;/h3&gt;

&lt;p&gt;Yes, the same tool lets you choose JSON to Excel, which gives you an .xlsx file. This is handy if you need formatting or multiple sheets, though CSV is simpler for plain data.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
