<?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: Kaifi Azam</title>
    <description>The latest articles on DEV Community by Kaifi Azam (@kaifi_azam_21).</description>
    <link>https://dev.to/kaifi_azam_21</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%2F4052638%2F4a8c07e3-deb0-43f7-8b8f-8e8f1e59795d.png</url>
      <title>DEV Community: Kaifi Azam</title>
      <link>https://dev.to/kaifi_azam_21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kaifi_azam_21"/>
    <language>en</language>
    <item>
      <title>How to Calculate an IPv4 Subnet Range From Any IP Address</title>
      <dc:creator>Kaifi Azam</dc:creator>
      <pubDate>Fri, 31 Jul 2026 21:42:35 +0000</pubDate>
      <link>https://dev.to/kaifi_azam_21/how-to-calculate-an-ipv4-subnet-range-from-any-ip-address-1518</link>
      <guid>https://dev.to/kaifi_azam_21/how-to-calculate-an-ipv4-subnet-range-from-any-ip-address-1518</guid>
      <description>&lt;h1&gt;
  
  
  How to Calculate an IPv4 Subnet Range From Any IP Address
&lt;/h1&gt;

&lt;p&gt;A CIDR value such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.130/26
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;contains two pieces of information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;192.168.1.130&lt;/code&gt; is an address inside the subnet&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/26&lt;/code&gt; means the first 26 bits identify the network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entered address does not need to be the network address. You can calculate the containing network from any valid address inside the range.&lt;/p&gt;

&lt;p&gt;In this example, the result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Network:          192.168.1.128/26
Broadcast:        192.168.1.191
First usable:     192.168.1.129
Last usable:      192.168.1.190
Subnet mask:      255.255.255.192
Wildcard mask:    0.0.0.63
Total addresses:  64
Usable hosts:     62
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is how to calculate every value manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Convert the prefix into host bits
&lt;/h2&gt;

&lt;p&gt;IPv4 addresses contain 32 bits.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;/26&lt;/code&gt; prefix reserves 26 bits for the network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host bits = 32 - 26
Host bits = 6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The subnet therefore contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2⁶ = 64 addresses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a normal subnet, the lowest address identifies the network and the highest address is the broadcast address.&lt;/p&gt;

&lt;p&gt;That leaves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;64 - 2 = 62 usable host addresses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Find the subnet mask
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;/26&lt;/code&gt; mask contains 26 ones followed by 6 zeros:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Convert each octet to decimal:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;So the subnet mask is:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Calculate the block size
&lt;/h2&gt;

&lt;p&gt;The interesting octet is the first mask octet that is not &lt;code&gt;255&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;/26&lt;/code&gt;, that octet is &lt;code&gt;192&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Calculate the block size:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Block size = 256 - 192
Block size = 64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The possible subnet boundaries in the final octet are therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0
64
128
192
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each range contains 64 addresses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0–63
64–127
128–191
192–255
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entered address ends in &lt;code&gt;130&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Since &lt;code&gt;130&lt;/code&gt; falls between &lt;code&gt;128&lt;/code&gt; and &lt;code&gt;191&lt;/code&gt;, its network is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.128/26
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Find the broadcast address
&lt;/h2&gt;

&lt;p&gt;The broadcast address is the final address in the subnet.&lt;/p&gt;

&lt;p&gt;The selected block runs from:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Broadcast address = 192.168.1.191
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another way to calculate it is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Broadcast = Network + Total addresses - 1
Broadcast = 128 + 64 - 1
Broadcast = 191
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Find the usable host range
&lt;/h2&gt;

&lt;p&gt;For a traditional IPv4 subnet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First usable = Network + 1
Last usable  = Broadcast - 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First usable: 192.168.1.129
Last usable:  192.168.1.190
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The same calculation in binary
&lt;/h2&gt;

&lt;p&gt;The final octet of the entered IP is &lt;code&gt;130&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;130 = 10000010
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final octet of the &lt;code&gt;/26&lt;/code&gt; mask is &lt;code&gt;192&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192 = 11000000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the mask to the address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IP:       10000010
Mask:     11000000
Network:  10000000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;10000000&lt;/code&gt; is &lt;code&gt;128&lt;/code&gt;, giving:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Set all six host bits to &lt;code&gt;1&lt;/code&gt; to find the broadcast address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Network:    10000000
Broadcast:  10111111
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;10111111&lt;/code&gt; is &lt;code&gt;191&lt;/code&gt;, giving:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quick CIDR reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Subnet mask&lt;/th&gt;
&lt;th&gt;Total addresses&lt;/th&gt;
&lt;th&gt;Traditional usable hosts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;254&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/25&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.128&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.192&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/27&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.224&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/28&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.240&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/29&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.248&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/30&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.252&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/31&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.254&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Special case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.255&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Single address&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same block-size method works across octet boundaries.&lt;/p&gt;

&lt;p&gt;For example, with a &lt;code&gt;/20&lt;/code&gt; mask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Subnet mask = 255.255.240.0
Block size  = 256 - 240
Block size  = 16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The third-octet boundaries are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0, 16, 32, 48, 64, 80...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An address such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;172.16.37.10/20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;falls inside the &lt;code&gt;32–47&lt;/code&gt; block.&lt;/p&gt;

&lt;p&gt;Its containing network is therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;172.16.32.0/20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and its broadcast address is:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  The &lt;code&gt;/31&lt;/code&gt; exception
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;/31&lt;/code&gt; contains two addresses.&lt;/p&gt;

&lt;p&gt;Under the traditional subnet rule, subtracting a network and broadcast address would leave no usable hosts. However, &lt;code&gt;/31&lt;/code&gt; networks can use both addresses as endpoints on a point-to-point link.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.0.0.4/31
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.0.0.4
10.0.0.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On an appropriately configured point-to-point link, both can be used as endpoint addresses.&lt;/p&gt;

&lt;p&gt;Do not automatically treat &lt;code&gt;/31&lt;/code&gt; like a regular LAN subnet.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does &lt;code&gt;/32&lt;/code&gt; mean?
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;/32&lt;/code&gt; identifies one exact IPv4 address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;203.0.113.25/32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It contains no additional addresses and is commonly used when a route, rule, or configuration must match a single host.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculate and verify it automatically
&lt;/h2&gt;

&lt;p&gt;For quick checks, I built the &lt;a href="https://olivez.in/tool/subnet-calculator" rel="noopener noreferrer"&gt;Olivez IPv4 Subnet Calculator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can enter any IPv4 address with a prefix from &lt;code&gt;/0&lt;/code&gt; through &lt;code&gt;/32&lt;/code&gt;, including an address that is not already the network boundary.&lt;/p&gt;

&lt;p&gt;It calculates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Containing CIDR network&lt;/li&gt;
&lt;li&gt;Subnet mask&lt;/li&gt;
&lt;li&gt;Wildcard mask&lt;/li&gt;
&lt;li&gt;Broadcast address&lt;/li&gt;
&lt;li&gt;First and last usable addresses&lt;/li&gt;
&lt;li&gt;Total and usable address counts&lt;/li&gt;
&lt;li&gt;Address classification&lt;/li&gt;
&lt;li&gt;Binary network and host split&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, entering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.130/26
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returns the normalized network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.128/26
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The calculator is useful for verifying manual work, but understanding the block-size method makes it much easier to spot incorrect CIDR ranges in routing tables, firewall rules, cloud networks, and infrastructure configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reusable calculation process
&lt;/h2&gt;

&lt;p&gt;For any IPv4 address and prefix:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Subtract the prefix from 32 to find the number of host bits.&lt;/li&gt;
&lt;li&gt;Calculate &lt;code&gt;2^host bits&lt;/code&gt; to find the total number of addresses.&lt;/li&gt;
&lt;li&gt;Convert the prefix to a subnet mask.&lt;/li&gt;
&lt;li&gt;Find the first mask octet that is not &lt;code&gt;255&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Calculate its block size using &lt;code&gt;256 - mask octet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Find which block contains the entered address.&lt;/li&gt;
&lt;li&gt;Use the first address as the network boundary.&lt;/li&gt;
&lt;li&gt;Use the final address as the broadcast boundary.&lt;/li&gt;
&lt;li&gt;Exclude those two addresses for the traditional usable range.&lt;/li&gt;
&lt;li&gt;Handle &lt;code&gt;/31&lt;/code&gt; and &lt;code&gt;/32&lt;/code&gt; as special cases.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once you can identify the block boundary, the rest of the subnet becomes straightforward.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>tutorial</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Verify a SHA-256 Checksum on Windows, macOS, and Linux</title>
      <dc:creator>Kaifi Azam</dc:creator>
      <pubDate>Fri, 31 Jul 2026 21:34:52 +0000</pubDate>
      <link>https://dev.to/kaifi_azam_21/how-to-verify-a-sha-256-checksum-on-windows-macos-and-linux-347i</link>
      <guid>https://dev.to/kaifi_azam_21/how-to-verify-a-sha-256-checksum-on-windows-macos-and-linux-347i</guid>
      <description>&lt;h1&gt;
  
  
  How to Verify a SHA-256 Checksum on Windows, macOS, and Linux
&lt;/h1&gt;

&lt;p&gt;You download an ISO, installer, archive, or release binary. The publisher provides a long value such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;9f86d081884c7d659a2feaa0c55ad015
a3bf4f1b2b0b822cd15d6c15b0f00a08
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That value is a checksum, usually generated with SHA-256.&lt;/p&gt;

&lt;p&gt;Verifying it answers one practical question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the file you downloaded have exactly the same contents as the file the publisher hashed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A checksum mismatch can indicate a damaged download, an incomplete transfer, the wrong file version, or modified contents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before verifying anything
&lt;/h2&gt;

&lt;p&gt;Get the expected checksum from a source you trust.&lt;/p&gt;

&lt;p&gt;Ideally, use the software publisher’s official website, release page, package repository, or signed checksum file.&lt;/p&gt;

&lt;p&gt;A matching checksum confirms that your file matches the data represented by the expected hash. It does not prove that the original publisher or website was trustworthy. If an attacker can replace both the download and the displayed checksum, they can make the two values match.&lt;/p&gt;

&lt;p&gt;For stronger authenticity verification, use a signed release when the publisher provides one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify SHA-256 on Windows
&lt;/h2&gt;

&lt;p&gt;Open PowerShell in the folder containing the downloaded file.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-FileHash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".\filename.iso"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Algorithm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA256&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-FileHash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".\ubuntu.iso"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Algorithm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA256&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PowerShell returns something similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Algorithm : SHA256
Hash      : 4A1F...
Path      : C:\Users\You\Downloads\ubuntu.iso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare the value beside &lt;code&gt;Hash&lt;/code&gt; with the checksum published by the download provider.&lt;/p&gt;

&lt;p&gt;Uppercase and lowercase letters do not matter in hexadecimal hashes. The characters themselves must otherwise match exactly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compare automatically in PowerShell
&lt;/h3&gt;

&lt;p&gt;Instead of comparing two 64-character values manually, store the expected checksum and let PowerShell compare them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$expected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PASTE_EXPECTED_SHA256_HERE"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$actual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-FileHash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".\filename.iso"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Algorithm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Hash&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$actual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$expected&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="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Checksum matches"&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="kr"&gt;else&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="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Checksum does not match"&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;h2&gt;
  
  
  Verify SHA-256 on macOS
&lt;/h2&gt;

&lt;p&gt;Open Terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shasum &lt;span class="nt"&gt;-a&lt;/span&gt; 256 filename.dmg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shasum &lt;span class="nt"&gt;-a&lt;/span&gt; 256 application.dmg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result contains the calculated checksum followed by the filename:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4a1f...  application.dmg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare the calculated value with the publisher’s expected SHA-256 checksum.&lt;/p&gt;

&lt;p&gt;Quotes are useful when a filename contains spaces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shasum &lt;span class="nt"&gt;-a&lt;/span&gt; 256 &lt;span class="s2"&gt;"Application Installer.dmg"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verify SHA-256 on Linux
&lt;/h2&gt;

&lt;p&gt;Most Linux distributions provide &lt;code&gt;sha256sum&lt;/code&gt; through GNU core utilities.&lt;/p&gt;

&lt;p&gt;Run:&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="nb"&gt;sha256sum &lt;/span&gt;filename.iso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&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="nb"&gt;sha256sum &lt;/span&gt;linux-distribution.iso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4a1f...  linux-distribution.iso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare the first value with the checksum from the publisher.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify a SHA256SUMS file on Linux
&lt;/h2&gt;

&lt;p&gt;Some projects provide a file named &lt;code&gt;SHA256SUMS&lt;/code&gt;, &lt;code&gt;checksums.txt&lt;/code&gt;, or something similar.&lt;/p&gt;

&lt;p&gt;A GNU checksum line normally looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4a1f...  linux-distribution.iso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the checksum file and downloaded file are in the same directory, run:&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="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;--check&lt;/span&gt; SHA256SUMS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The short form also works:&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="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; SHA256SUMS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful result looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;linux-distribution.iso: OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A failure may look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;linux-distribution.iso: FAILED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method is safer than visually comparing long values because the command performs the comparison directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify a checksum without using the command line
&lt;/h2&gt;

&lt;p&gt;For occasional checks, I built the &lt;a href="https://olivez.in/tool/hash-generator-checker" rel="noopener noreferrer"&gt;Olivez Hash Generator &amp;amp; Checksum Checker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It supports SHA-256, SHA-384, and SHA-512 for files and exact text.&lt;/p&gt;

&lt;p&gt;The verification field accepts several common formats:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4a1f...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4a1f...  filename.iso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHA256 (filename.iso) = 4a1f...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHA-256: 4a1f...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can also read multiline checksum lists and select the entry matching the chosen filename.&lt;/p&gt;

&lt;p&gt;Files and text are processed locally and are not uploaded. The current file limit is 100 MB, so command-line tools remain the better option for large ISO images and multi-gigabyte archives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why did my checksum fail?
&lt;/h2&gt;

&lt;p&gt;A mismatch does not automatically mean malware. Common causes include:&lt;/p&gt;

&lt;h3&gt;
  
  
  You downloaded a different version
&lt;/h3&gt;

&lt;p&gt;Checksums change whenever file contents change. Version 2.1 and version 2.1.1 will normally have completely different hashes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The download was incomplete or corrupted
&lt;/h3&gt;

&lt;p&gt;Delete the file, download it again, and recalculate the checksum.&lt;/p&gt;

&lt;h3&gt;
  
  
  You selected the wrong algorithm
&lt;/h3&gt;

&lt;p&gt;A SHA-256 value contains 64 hexadecimal characters.&lt;/p&gt;

&lt;p&gt;Common digest lengths are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Algorithm&lt;/th&gt;
&lt;th&gt;Hexadecimal characters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MD5&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA-1&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA-256&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA-384&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA-512&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Calculating SHA-512 will never match a published SHA-256 value, even when both were generated from the same file.&lt;/p&gt;

&lt;h3&gt;
  
  
  The checksum belongs to another filename
&lt;/h3&gt;

&lt;p&gt;Checksum lists often contain values for several operating systems, architectures, or package formats. Confirm that you are comparing the entry for the exact file you downloaded.&lt;/p&gt;

&lt;h3&gt;
  
  
  The expected value contains extra text
&lt;/h3&gt;

&lt;p&gt;Publishers may use GNU, BSD, labelled, or custom checksum formats. Make sure you are comparing the digest itself rather than copying punctuation, a filename, or the algorithm label into a field that expects only hexadecimal characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  SHA-256 is not password hashing
&lt;/h2&gt;

&lt;p&gt;SHA-256 is useful for file integrity, release verification, content identification, and similar tasks.&lt;/p&gt;

&lt;p&gt;Do not store passwords as plain SHA-256 hashes.&lt;/p&gt;

&lt;p&gt;Password storage requires a dedicated password-hashing function such as Argon2id, scrypt, bcrypt, or PBKDF2 with appropriate parameters and unique salts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical rule
&lt;/h2&gt;

&lt;p&gt;Use the operating system command when you regularly verify files or work with large downloads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Windows: Get-FileHash
macOS:   shasum -a 256
Linux:   sha256sum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a local-processing interface when you need to check a smaller file, compare text, parse a complete checksum line, or inspect a multiline checksum list without manually extracting the correct digest.&lt;/p&gt;

&lt;p&gt;Whichever method you use, obtain the expected checksum from a trusted source and make sure the algorithm, filename, and file version all match.&lt;/p&gt;

</description>
      <category>security</category>
      <category>tutorial</category>
      <category>linux</category>
      <category>android</category>
    </item>
    <item>
      <title>How to Convert Nested JSON to CSV Without Losing Fields</title>
      <dc:creator>Kaifi Azam</dc:creator>
      <pubDate>Fri, 31 Jul 2026 20:22:35 +0000</pubDate>
      <link>https://dev.to/kaifi_azam_21/how-to-convert-nested-json-to-csv-without-losing-fields-1ac1</link>
      <guid>https://dev.to/kaifi_azam_21/how-to-convert-nested-json-to-csv-without-losing-fields-1ac1</guid>
      <description>&lt;p&gt;Converting a flat JSON array to CSV is straightforward. Real datasets are rarely flat.&lt;/p&gt;

&lt;p&gt;API responses often contain nested objects, arrays, optional fields, large numeric identifiers, and properties that appear only in later records. A basic conversion can silently drop data, misalign columns, or change values when the CSV is opened in spreadsheet software.&lt;/p&gt;

&lt;p&gt;This guide covers the main problems and how to handle them safely.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq3mq9j7ruhv2xt1r749i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq3mq9j7ruhv2xt1r749i.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The converted table can be reviewed and adjusted before exporting CSV or XLSX.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple JSON to CSV conversion
&lt;/h2&gt;

&lt;p&gt;This JSON is already tabular:&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;"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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Engineer"&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;"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;"Linus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Developer"&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;It maps cleanly to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name,role
Ada,Engineer
Linus,Developer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each object becomes a row, and each property becomes a column.&lt;/p&gt;

&lt;p&gt;The problems begin when the structure becomes more complex.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Flatten nested objects
&lt;/h2&gt;

&lt;p&gt;Consider this dataset:&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;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;"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;"company"&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;"Analytical Systems"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UK"&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;CSV does not support nested objects directly. One practical solution is to flatten nested fields using dot notation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id,name,company.name,company.country
101,Ada,Analytical Systems,UK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This preserves the original field relationships without storing the complete object as an unreadable JSON string.&lt;/p&gt;

&lt;p&gt;For deeper structures:&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;"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;"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="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;The resulting column can be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;customer.address.city
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The flattening rule should remain predictable throughout the dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Handle arrays consistently
&lt;/h2&gt;

&lt;p&gt;Arrays may contain primitive values, objects, different numbers of items, or mixed structures.&lt;/p&gt;

&lt;p&gt;Example:&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;"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;"skills"&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;"JavaScript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Python"&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;"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;"Linus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"skills"&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;"C"&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;One approach is to expand array positions into numbered columns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name,skills__001,skills__002
Ada,JavaScript,Python
Linus,C,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second row keeps an empty &lt;code&gt;skills__002&lt;/code&gt; cell instead of shifting data into the wrong column.&lt;/p&gt;

&lt;p&gt;Arrays of objects can follow the same pattern:&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;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;"total"&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="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;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&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;Possible columns include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;orders__001.id
orders__001.total
orders__002.id
orders__002.total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may not be the ideal structure for every analysis workflow, but it creates stable columns without discarding values.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Scan every record for columns
&lt;/h2&gt;

&lt;p&gt;A common conversion mistake is using only the first object to determine the CSV headers.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight 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="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;"Linus"&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;"linus@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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using only the first object would produce:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id,name
1,Ada
2,Linus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;email&lt;/code&gt; field disappears.&lt;/p&gt;

&lt;p&gt;A safer converter scans the complete dataset and creates a union of every discovered field:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id,name,email
1,Ada,
2,Linus,linus@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Missing values become empty cells while every row remains correctly aligned.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Preserve large numeric identifiers
&lt;/h2&gt;

&lt;p&gt;JavaScript cannot safely represent every large integer as a normal number.&lt;/p&gt;

&lt;p&gt;For example:&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;"accountId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9223372036854775807&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;That value exceeds JavaScript's safe integer range. Parsing it normally may change the final digits.&lt;/p&gt;

&lt;p&gt;This matters for values such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database IDs&lt;/li&gt;
&lt;li&gt;Order numbers&lt;/li&gt;
&lt;li&gt;Social media identifiers&lt;/li&gt;
&lt;li&gt;Financial reference numbers&lt;/li&gt;
&lt;li&gt;Snowflake-style IDs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Large identifiers should be preserved as text rather than silently rounded.&lt;/p&gt;

&lt;p&gt;Spreadsheet software may also display long identifiers using scientific notation, so treating them as strings is often safer.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Support JSONL and NDJSON
&lt;/h2&gt;

&lt;p&gt;Not every dataset is stored as one JSON array.&lt;/p&gt;

&lt;p&gt;JSON Lines and NDJSON store one complete JSON object on each line:&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="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&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="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="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&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;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Linus"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&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="s2"&gt;"Grace"&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;This format is common in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log exports&lt;/li&gt;
&lt;li&gt;Streaming systems&lt;/li&gt;
&lt;li&gt;Data pipelines&lt;/li&gt;
&lt;li&gt;Large datasets&lt;/li&gt;
&lt;li&gt;Command-line workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful converter should recognize both standard JSON arrays and line-delimited JSON.&lt;/p&gt;

&lt;p&gt;Each valid line becomes one table row.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Escape CSV values correctly
&lt;/h2&gt;

&lt;p&gt;CSV values need escaping when they contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commas&lt;/li&gt;
&lt;li&gt;Quotation marks&lt;/li&gt;
&lt;li&gt;New lines&lt;/li&gt;
&lt;li&gt;The selected delimiter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A value such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;London, United Kingdom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Must be exported as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"London, United Kingdom"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quotation marks inside a quoted value must be doubled.&lt;/p&gt;

&lt;p&gt;This value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;She said "hello"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"She said ""hello"""
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without correct escaping, columns may become misaligned when the file is opened.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Protect against spreadsheet formulas
&lt;/h2&gt;

&lt;p&gt;Spreadsheet software may interpret cells beginning with certain characters as formulas.&lt;/p&gt;

&lt;p&gt;Potential examples include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=SUM(A1:A5)
+CMD
-10+20
@IMPORTXML(...)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is commonly called CSV or spreadsheet formula injection.&lt;/p&gt;

&lt;p&gt;A safer CSV export can prefix suspicious values so the spreadsheet treats them as text instead of executing them as formulas.&lt;/p&gt;

&lt;p&gt;This is especially important when the original JSON contains values from users, forms, APIs, or external systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Preview the table before exporting
&lt;/h2&gt;

&lt;p&gt;A table preview helps reveal structural problems before creating the final file.&lt;/p&gt;

&lt;p&gt;Useful checks include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Were nested fields flattened correctly?&lt;/li&gt;
&lt;li&gt;Did later records introduce additional columns?&lt;/li&gt;
&lt;li&gt;Are arrays expanding consistently?&lt;/li&gt;
&lt;li&gt;Are large identifiers unchanged?&lt;/li&gt;
&lt;li&gt;Are unexpected fields present?&lt;/li&gt;
&lt;li&gt;Are some columns mostly empty?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Column selection is also useful when an API response contains dozens of fields but only a few are needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Choose CSV or XLSX based on the workflow
&lt;/h2&gt;

&lt;p&gt;CSV is usually better when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The file will be imported into another system&lt;/li&gt;
&lt;li&gt;Portability matters&lt;/li&gt;
&lt;li&gt;A simple text format is preferred&lt;/li&gt;
&lt;li&gt;The dataset will be processed by code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;XLSX can be more convenient when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The file will be opened directly in spreadsheet software&lt;/li&gt;
&lt;li&gt;Users expect a native spreadsheet file&lt;/li&gt;
&lt;li&gt;Long identifiers need more controlled handling&lt;/li&gt;
&lt;li&gt;A structured workbook is preferred&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The correct format depends on what will happen after conversion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical checklist
&lt;/h2&gt;

&lt;p&gt;Before exporting JSON data, confirm that the converter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scans every record for fields&lt;/li&gt;
&lt;li&gt;Flattens nested objects predictably&lt;/li&gt;
&lt;li&gt;Handles arrays without shifting columns&lt;/li&gt;
&lt;li&gt;Keeps missing values aligned&lt;/li&gt;
&lt;li&gt;Preserves large integer identifiers&lt;/li&gt;
&lt;li&gt;Escapes delimiters, quotation marks, and new lines&lt;/li&gt;
&lt;li&gt;Protects against spreadsheet formulas&lt;/li&gt;
&lt;li&gt;Supports JSONL and NDJSON when needed&lt;/li&gt;
&lt;li&gt;Provides a preview before downloading&lt;/li&gt;
&lt;li&gt;Lets users remove unnecessary columns&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A converter built for these cases
&lt;/h2&gt;

&lt;p&gt;I built Olivez JSON to CSV Converter while working through these problems.&lt;/p&gt;

&lt;p&gt;It supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON, JSONL, and NDJSON&lt;/li&gt;
&lt;li&gt;Pasted data&lt;/li&gt;
&lt;li&gt;Local files up to 100 MB&lt;/li&gt;
&lt;li&gt;Public JSON URLs&lt;/li&gt;
&lt;li&gt;Nested object flattening&lt;/li&gt;
&lt;li&gt;Stable numbered array columns&lt;/li&gt;
&lt;li&gt;Full-dataset column discovery&lt;/li&gt;
&lt;li&gt;Large integer preservation&lt;/li&gt;
&lt;li&gt;Table preview and column selection&lt;/li&gt;
&lt;li&gt;CSV and XLSX export&lt;/li&gt;
&lt;li&gt;Custom CSV delimiters&lt;/li&gt;
&lt;li&gt;Spreadsheet formula protection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local files and pasted data are processed on your device, and no account is required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://olivez.in/tool/json-to-csv-converter" rel="noopener noreferrer"&gt;https://olivez.in/tool/json-to-csv-converter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal was not only to replace braces with commas. It was to make the conversion predictable enough that you can inspect the result and trust the exported file.&lt;/p&gt;

</description>
      <category>json</category>
      <category>webdev</category>
      <category>data</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>This is my fav design for a web!</title>
      <dc:creator>Kaifi Azam</dc:creator>
      <pubDate>Fri, 31 Jul 2026 16:23:16 +0000</pubDate>
      <link>https://dev.to/kaifi_azam_21/this-is-my-fav-design-for-a-web-3dlm</link>
      <guid>https://dev.to/kaifi_azam_21/this-is-my-fav-design-for-a-web-3dlm</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/kaifi_azam_21/i-built-a-browser-color-picker-that-replaces-five-separate-color-tools-106l" class="crayons-story__hidden-navigation-link"&gt;I built a browser color picker that replaces five separate color tools&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/kaifi_azam_21" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4052638%2F4a8c07e3-deb0-43f7-8b8f-8e8f1e59795d.png" alt="kaifi_azam_21 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/kaifi_azam_21" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Kaifi Azam
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Kaifi Azam
                
              
              &lt;div id="story-author-preview-content-4282190" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/kaifi_azam_21" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4052638%2F4a8c07e3-deb0-43f7-8b8f-8e8f1e59795d.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Kaifi Azam&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/kaifi_azam_21/i-built-a-browser-color-picker-that-replaces-five-separate-color-tools-106l" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 31&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/kaifi_azam_21/i-built-a-browser-color-picker-that-replaces-five-separate-color-tools-106l" id="article-link-4282190"&gt;
          I built a browser color picker that replaces five separate color tools
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/nextjs"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;nextjs&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/design"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;design&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/kaifi_azam_21/i-built-a-browser-color-picker-that-replaces-five-separate-color-tools-106l" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/kaifi_azam_21/i-built-a-browser-color-picker-that-replaces-five-separate-color-tools-106l#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>I built a browser color picker that replaces five separate color tools</title>
      <dc:creator>Kaifi Azam</dc:creator>
      <pubDate>Fri, 31 Jul 2026 16:21:50 +0000</pubDate>
      <link>https://dev.to/kaifi_azam_21/i-built-a-browser-color-picker-that-replaces-five-separate-color-tools-106l</link>
      <guid>https://dev.to/kaifi_azam_21/i-built-a-browser-color-picker-that-replaces-five-separate-color-tools-106l</guid>
      <description>&lt;p&gt;I kept switching between separate tools for picking a color, sampling an image, converting formats, generating a palette, and checking contrast.&lt;/p&gt;

&lt;p&gt;So I built one browser-based workspace that combines them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it includes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Visual saturation, brightness, and hue controls&lt;/li&gt;
&lt;li&gt;Screen eyedropper where the browser supports it&lt;/li&gt;
&lt;li&gt;Pixel sampling from a locally uploaded image&lt;/li&gt;
&lt;li&gt;Synchronized HEX, RGB, HSL, HSV, and CMYK values&lt;/li&gt;
&lt;li&gt;Complementary, analogous, triadic, and split-complementary palettes&lt;/li&gt;
&lt;li&gt;WCAG contrast checks for normal and large text&lt;/li&gt;
&lt;li&gt;CSS custom property and JSON palette exports&lt;/li&gt;
&lt;li&gt;Recent colors stored during the current session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs in the browser. Image files are processed locally, and no account is required.&lt;/p&gt;

&lt;p&gt;Live tool: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftznae59pv193bn7zobs4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftznae59pv193bn7zobs4.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;a href="https://olivez.in/tool/color-picker" rel="noopener noreferrer"&gt;Color Picker Olivez&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The interface was also an important part of the project. I wanted it to feel like a proper design workspace rather than another form inside a generic calculator card.&lt;/p&gt;

&lt;p&gt;I would especially appreciate feedback on two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does the transition from the hero into the color workbench feel natural?&lt;/li&gt;
&lt;li&gt;Does the tool expose too many controls at once, or is the layout still easy to understand?&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>design</category>
    </item>
  </channel>
</rss>
