<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ToolOnTap articles</title>
    <link>https://toolontap.com/articles</link>
    <atom:link href="https://toolontap.com/articles/feed.xml" rel="self" type="application/rss+xml" />
    <description>Notes on how the tools work: file formats, algorithms and browser APIs.</description>
    <language>en</language>
    <item>
      <title>How I Built a QR Code Encoder From the Standard, With No Library</title>
      <link>https://toolontap.com/articles/qr-code-encoder-from-scratch</link>
      <guid isPermaLink="true">https://toolontap.com/articles/qr-code-encoder-from-scratch</guid>
      <pubDate>Sun, 18 Oct 2026 09:00:00 GMT</pubDate>
      <description>Bits, Reed–Solomon error correction, interleaving, zigzag placement and masks, step by step, with the TypeScript behind ToolOnTap's QR code generator.</description>
    </item>
    <item>
      <title>Reading an iPhone HEIC Photo's Hidden Location by Hand</title>
      <link>https://toolontap.com/articles/reading-heic-exif-by-hand</link>
      <guid isPermaLink="true">https://toolontap.com/articles/reading-heic-exif-by-hand</guid>
      <pubDate>Sat, 17 Oct 2026 09:00:00 GMT</pubDate>
      <description>How a HEIC file is built from boxes, how to find its Exif item through iinf and iloc, and how ToolOnTap's EXIF viewer reads it in about 75 lines.</description>
    </item>
    <item>
      <title>How My Regex Tester Survives Catastrophic Backtracking</title>
      <link>https://toolontap.com/articles/regex-tester-catastrophic-backtracking</link>
      <guid isPermaLink="true">https://toolontap.com/articles/regex-tester-catastrophic-backtracking</guid>
      <pubDate>Fri, 16 Oct 2026 09:00:00 GMT</pubDate>
      <description>Why one bad regular expression can freeze a browser tab for minutes, and how ToolOnTap's regex tester runs patterns in a worker it can stop after 1.5 seconds.</description>
    </item>
    <item>
      <title>Why My JSON Formatter Has Its Own Parser Instead of JSON.parse</title>
      <link>https://toolontap.com/articles/writing-a-json-parser-for-exact-errors</link>
      <guid isPermaLink="true">https://toolontap.com/articles/writing-a-json-parser-for-exact-errors</guid>
      <pubDate>Thu, 15 Oct 2026 09:00:00 GMT</pubDate>
      <description>Big numbers that JSON.parse rounds, errors with a line and column, and duplicate keys: how ToolOnTap's JSON formatter parses JSON itself in about 200 lines.</description>
    </item>
    <item>
      <title>Counting Arabic Words and Characters Correctly in JavaScript</title>
      <link>https://toolontap.com/articles/counting-arabic-words-correctly</link>
      <guid isPermaLink="true">https://toolontap.com/articles/counting-arabic-words-correctly</guid>
      <pubDate>Wed, 14 Oct 2026 09:00:00 GMT</pubDate>
      <description>Why &quot;مَرْحَبًا&quot;.length is 9, how ToolOnTap's word counter counts harakat, tatweel, emoji and links, and how SMS and X limits really work for Arabic text.</description>
    </item>
    <item>
      <title>How to Get an Image Under an Exact KB Limit, and When You Can't</title>
      <link>https://toolontap.com/articles/compress-image-to-exact-kb</link>
      <guid isPermaLink="true">https://toolontap.com/articles/compress-image-to-exact-kb</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <description>What &quot;20 KB&quot; means to a form, how ToolOnTap lowers quality and then pixel size to reach it, why PNG behaves differently, and what happens when it can't.</description>
    </item>
    <item>
      <title>Verifying JWT Signatures in the Browser With Web Crypto</title>
      <link>https://toolontap.com/articles/verifying-jwt-signatures-in-the-browser</link>
      <guid isPermaLink="true">https://toolontap.com/articles/verifying-jwt-signatures-in-the-browser</guid>
      <pubDate>Mon, 12 Oct 2026 09:00:00 GMT</pubDate>
      <description>Why decoding a JWT proves nothing, and how ToolOnTap's JWT decoder checks HS, RS, PS and ES signatures with the browser's own crypto, keys and all.</description>
    </item>
    <item>
      <title>Exact Age Is Harder Than It Looks, in Gregorian and Hijri Years</title>
      <link>https://toolontap.com/articles/exact-age-and-hijri-age</link>
      <guid isPermaLink="true">https://toolontap.com/articles/exact-age-and-hijri-age</guid>
      <pubDate>Sun, 11 Oct 2026 09:00:00 GMT</pubDate>
      <description>Month ends, 29 February birthdays and Hijri years of 354 or 355 days, with the TypeScript rules behind ToolOnTap's age calculator.</description>
    </item>
    <item>
      <title>Converting iPhone HEIC Photos to JPG Inside the Browser</title>
      <link>https://toolontap.com/articles/heic-to-jpg-in-the-browser</link>
      <guid isPermaLink="true">https://toolontap.com/articles/heic-to-jpg-in-the-browser</guid>
      <pubDate>Sat, 10 Oct 2026 09:00:00 GMT</pubDate>
      <description>Why HEIC photos get stuck on Windows and upload forms, and how ToolOnTap turns them into JPGs on your device without loading 1.3 MB of decoder on every page.</description>
    </item>
    <item>
      <title>How GPA Is Calculated, on the 4.0 and the Saudi 5.0 Scale</title>
      <link>https://toolontap.com/articles/how-gpa-is-calculated</link>
      <guid isPermaLink="true">https://toolontap.com/articles/how-gpa-is-calculated</guid>
      <pubDate>Fri, 09 Oct 2026 09:00:00 GMT</pubDate>
      <description>Credit-weighted averages, term versus cumulative GPA, why averaging your term GPAs gives the wrong answer, and how a failed course counts on each scale.</description>
    </item>
    <item>
      <title>UUID v4 vs v7, and Why Time-Ordered IDs Make Better Database Keys</title>
      <link>https://toolontap.com/articles/uuid-v4-vs-v7</link>
      <guid isPermaLink="true">https://toolontap.com/articles/uuid-v4-vs-v7</guid>
      <pubDate>Thu, 08 Oct 2026 09:00:00 GMT</pubDate>
      <description>What sits in each of a UUID's 128 bits, how v7 puts a millisecond timestamp first, and how ToolOnTap's generator keeps a batch in order within one millisecond.</description>
    </item>
    <item>
      <title>How I Remove EXIF Data From Photos Without Re-Compressing Them</title>
      <link>https://toolontap.com/articles/removing-exif-without-recompressing</link>
      <guid isPermaLink="true">https://toolontap.com/articles/removing-exif-without-recompressing</guid>
      <pubDate>Wed, 07 Oct 2026 09:00:00 GMT</pubDate>
      <description>Cutting metadata out of JPEG segments, PNG chunks and WebP chunks byte by byte, and why ToolOnTap's Remove EXIF tool keeps the orientation and color profile.</description>
    </item>
    <item>
      <title>MD5 and SHA Hashes in the Browser, and Why I Wrote MD5 by Hand</title>
      <link>https://toolontap.com/articles/md5-and-sha-hashes-in-the-browser</link>
      <guid isPermaLink="true">https://toolontap.com/articles/md5-and-sha-hashes-in-the-browser</guid>
      <pubDate>Tue, 06 Oct 2026 09:00:00 GMT</pubDate>
      <description>Web Crypto has SHA but no MD5. How ToolOnTap's hash generator implements RFC 1321 itself, checks downloads against a checksum, and where MD5 still belongs.</description>
    </item>
    <item>
      <title>How Merging PDFs Works in the Browser, and What Gets Lost</title>
      <link>https://toolontap.com/articles/merging-pdfs-in-the-browser</link>
      <guid isPermaLink="true">https://toolontap.com/articles/merging-pdfs-in-the-browser</guid>
      <pubDate>Mon, 05 Oct 2026 09:00:00 GMT</pubDate>
      <description>How ToolOnTap merges PDFs with pdf-lib's copyPages, previews them with pdf.js, refuses protected files, and why bookmarks and form fields don't survive.</description>
    </item>
    <item>
      <title>Base64 and URL Encoding Explained, and Why btoa() Fails on Arabic</title>
      <link>https://toolontap.com/articles/base64-and-url-encoding-explained</link>
      <guid isPermaLink="true">https://toolontap.com/articles/base64-and-url-encoding-explained</guid>
      <pubDate>Sun, 04 Oct 2026 09:00:00 GMT</pubDate>
      <description>What Base64, Base64URL and percent-encoding really do to your bytes, why btoa() breaks on Arabic and accents, and when a + means a space.</description>
    </item>
    <item>
      <title>Why Photos Show Up Sideways, and How EXIF Orientation Works</title>
      <link>https://toolontap.com/articles/rotating-photos-and-exif-orientation</link>
      <guid isPermaLink="true">https://toolontap.com/articles/rotating-photos-and-exif-orientation</guid>
      <pubDate>Sat, 03 Oct 2026 09:00:00 GMT</pubDate>
      <description>The eight EXIF orientation values, why a photo that looks fine on your phone turns sideways online, and how ToolOnTap rotates and flips images on a canvas.</description>
    </item>
    <item>
      <title>How Split PDF Reads &quot;1-3, 5, 8-&quot; and Turns It Into Files</title>
      <link>https://toolontap.com/articles/splitting-pdf-pages</link>
      <guid isPermaLink="true">https://toolontap.com/articles/splitting-pdf-pages</guid>
      <pubDate>Fri, 02 Oct 2026 09:00:00 GMT</pubDate>
      <description>The page-range parser, the four split modes, the file names and the ZIP behind ToolOnTap's Split PDF, with the TypeScript that runs in your browser.</description>
    </item>
    <item>
      <title>From Millimeters to Pixels: How a Passport Photo Sheet Is Laid Out</title>
      <link>https://toolontap.com/articles/passport-photo-sizes-and-print-sheets</link>
      <guid isPermaLink="true">https://toolontap.com/articles/passport-photo-sizes-and-print-sheets</guid>
      <pubDate>Thu, 01 Oct 2026 09:00:00 GMT</pubDate>
      <description>Turning official passport sizes into pixels at 300 DPI, fitting the most copies on a 4×6 print, and why ToolOnTap only publishes sizes it has checked.</description>
    </item>
    <item>
      <title>Turning PDF Pages Into JPG and PNG in the Browser With pdf.js</title>
      <link>https://toolontap.com/articles/rendering-pdf-pages-to-images</link>
      <guid isPermaLink="true">https://toolontap.com/articles/rendering-pdf-pages-to-images</guid>
      <pubDate>Wed, 30 Sep 2026 09:00:00 GMT</pubDate>
      <description>What 72, 150 and 300 DPI mean in pixels, why scanned pages can come out blank, and how ToolOnTap ships pdf.js with one shared worker.</description>
    </item>
    <item>
      <title>PNG, JPG and WebP Conversions, and the Browser Quirks Behind Them</title>
      <link>https://toolontap.com/articles/converting-png-jpg-webp</link>
      <guid isPermaLink="true">https://toolontap.com/articles/converting-png-jpg-webp</guid>
      <pubDate>Tue, 29 Sep 2026 09:00:00 GMT</pubDate>
      <description>Why transparency turns white in a JPG, why JPG to PNG makes files bigger, and why Safari quietly hands back a PNG when you ask it for a WebP.</description>
    </item>
    <item>
      <title>Six Percentage Questions and the Formula Behind Each One</title>
      <link>https://toolontap.com/articles/percentage-questions-explained</link>
      <guid isPermaLink="true">https://toolontap.com/articles/percentage-questions-explained</guid>
      <pubDate>Mon, 28 Sep 2026 09:00:00 GMT</pubDate>
      <description>Percent of, what percent, change, the whole from a part, adding VAT and taking it back out, plus how the calculator reads 1,250, 12,5 and Arabic digits.</description>
    </item>
    <item>
      <title>One Small Edit Model Behind Rotate, Delete and Rearrange PDF Pages</title>
      <link>https://toolontap.com/articles/reordering-rotating-deleting-pdf-pages</link>
      <guid isPermaLink="true">https://toolontap.com/articles/reordering-rotating-deleting-pdf-pages</guid>
      <pubDate>Sun, 27 Sep 2026 09:00:00 GMT</pubDate>
      <description>How ToolOnTap's PDF organizer stores each change as plain data, keeps 50 steps of undo, and saves rotation as a page setting instead of redrawing the page.</description>
    </item>
    <item>
      <title>Resizing Images Without Blur or Stretching, Inside the Browser</title>
      <link>https://toolontap.com/articles/resizing-images-without-blur</link>
      <guid isPermaLink="true">https://toolontap.com/articles/resizing-images-without-blur</guid>
      <pubDate>Sat, 26 Sep 2026 09:00:00 GMT</pubDate>
      <description>Pixels or percentage, fitting inside a box, the 16.7-megapixel canvas cap and how the browser resamples, with the TypeScript behind ToolOnTap's image resizer.</description>
    </item>
    <item>
      <title>What Do I Need on My Final? Deriving the Formula Step by Step</title>
      <link>https://toolontap.com/articles/final-grade-formula</link>
      <guid isPermaLink="true">https://toolontap.com/articles/final-grade-formula</guid>
      <pubDate>Fri, 25 Sep 2026 09:00:00 GMT</pubDate>
      <description>The one-line equation behind every final grade calculator, solved for the final score, with what a result above 100% or below 0% really means.</description>
    </item>
    <item>
      <title>Putting Photos Into a PDF Without Re-Compressing Them</title>
      <link>https://toolontap.com/articles/putting-images-into-a-pdf</link>
      <guid isPermaLink="true">https://toolontap.com/articles/putting-images-into-a-pdf</guid>
      <pubDate>Thu, 24 Sep 2026 09:00:00 GMT</pubDate>
      <description>How ToolOnTap's Image to PDF tool sizes pages in points, turns pages for wide scans, keeps JPGs untouched with pdf-lib, and fixes sideways phone photos.</description>
    </item>
    <item>
      <title>The Rules Behind Title Case, Sentence Case and camelCase</title>
      <link>https://toolontap.com/articles/title-case-and-code-cases</link>
      <guid isPermaLink="true">https://toolontap.com/articles/title-case-and-code-cases</guid>
      <pubDate>Wed, 23 Sep 2026 09:00:00 GMT</pubDate>
      <description>How ToolOnTap's case converter decides which words get capitals, keeps iPhone and NASA intact, rescues caps-lock text and splits XMLHttpRequest for code.</description>
    </item>
    <item>
      <title>Why a Circle Crop Is Really a Square: Building an Image Cropper</title>
      <link>https://toolontap.com/articles/cropping-and-circle-profile-photos</link>
      <guid isPermaLink="true">https://toolontap.com/articles/cropping-and-circle-profile-photos</guid>
      <pubDate>Tue, 22 Sep 2026 09:00:00 GMT</pubDate>
      <description>How ToolOnTap's crop tool does free, square and circle crops with cropperjs and a canvas, and why every round avatar is saved as a square PNG.</description>
    </item>
    <item>
      <title>Why Two Identical Lines Aren't Always Duplicates, and How I Fixed It</title>
      <link>https://toolontap.com/articles/removing-duplicate-lines</link>
      <guid isPermaLink="true">https://toolontap.com/articles/removing-duplicate-lines</guid>
      <pubDate>Mon, 21 Sep 2026 09:00:00 GMT</pubDate>
      <description>Unicode normalization, invisible spaces, keep first or last, and natural sorting, explained through the code behind ToolOnTap's remove duplicate lines tool.</description>
    </item>
    <item>
      <title>Instagram, YouTube and LinkedIn Image Sizes, Checked at the Source</title>
      <link>https://toolontap.com/articles/social-media-image-sizes</link>
      <guid isPermaLink="true">https://toolontap.com/articles/social-media-image-sizes</guid>
      <pubDate>Sun, 20 Sep 2026 09:00:00 GMT</pubDate>
      <description>The output sizes behind ToolOnTap's Instagram, YouTube and LinkedIn resizers, why they crop to fill instead of fitting, and how the file size warning works.</description>
    </item>
    <item>
      <title>Images as Base64 Data URIs, and When Inlining Helps or Hurts</title>
      <link>https://toolontap.com/articles/images-as-base64-data-uris</link>
      <guid isPermaLink="true">https://toolontap.com/articles/images-as-base64-data-uris</guid>
      <pubDate>Sat, 19 Sep 2026 09:00:00 GMT</pubDate>
      <description>Why Base64 makes an image a third bigger, when a data URI saves a request and when it slows a page down, and how ToolOnTap's Image to Base64 tool is built.</description>
    </item>
  </channel>
</rss>
