<?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: ToolsMatic</title>
    <description>The latest articles on DEV Community by ToolsMatic (@toolsmatic).</description>
    <link>https://dev.to/toolsmatic</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908449%2F94f592fb-7e8f-4fdf-a75f-7305c833538c.png</url>
      <title>DEV Community: ToolsMatic</title>
      <link>https://dev.to/toolsmatic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toolsmatic"/>
    <language>en</language>
    <item>
      <title>I got tired of "free" tools that hold your file hostage, so I built my own.</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Sat, 16 May 2026 14:55:15 +0000</pubDate>
      <link>https://dev.to/toolsmatic/i-got-tired-of-free-tools-that-hold-your-file-hostage-so-i-built-my-own-13li</link>
      <guid>https://dev.to/toolsmatic/i-got-tired-of-free-tools-that-hold-your-file-hostage-so-i-built-my-own-13li</guid>
      <description>&lt;p&gt;You know the trap.&lt;/p&gt;

&lt;p&gt;You need one tiny thing done.&lt;/p&gt;

&lt;p&gt;Compress a PDF. Format JSON. Generate a QR code. Resize an image. Convert CSV. Check a color contrast ratio.&lt;/p&gt;

&lt;p&gt;So you Google it, open the first clean-looking site, do the work - and then:&lt;/p&gt;

&lt;p&gt;"Create an account to download."&lt;br&gt;
"You've used your free limit."&lt;br&gt;
"Upgrade to remove the watermark."&lt;br&gt;
"Your file is being processed on our servers."&lt;br&gt;
"Start your free trial."&lt;/p&gt;

&lt;p&gt;For a task your browser could have done in 3 seconds.&lt;/p&gt;

&lt;p&gt;That annoyed me enough that I built ToolsMatic - now at 150 free browser tools covering PDF work, writing, developer tasks, design, images, data, SEO, text utilities, timers, and everyday conversions.&lt;/p&gt;

&lt;p&gt;The rules are simple:&lt;/p&gt;

&lt;p&gt;-&amp;gt; No account&lt;br&gt;
-&amp;gt; No fake "free" button that becomes a paywall&lt;br&gt;
-&amp;gt; No daily limits&lt;br&gt;
-&amp;gt; No watermark traps&lt;br&gt;
-&amp;gt; No uploading your files to mystery servers&lt;br&gt;
-&amp;gt; No bloated dashboard for a 10-second task&lt;/p&gt;

&lt;p&gt;Just open the tool. Use it. Get the result.&lt;/p&gt;

&lt;p&gt;Some of what's in there:&lt;/p&gt;

&lt;p&gt;Word counter * Character counter * JSON formatter * Regex tester * QR code generator * PDF compressor * Merge PDF * Split PDF * Image compressor * Browser image editor * Gradient generator * Color picker * Contrast checker * CSV &amp;lt;-&amp;gt; JSON * Password generator * UUID maker * Timezone converter * Pomodoro timer * Typing speed test * Robots.txt generator * Sitemap generator * Meta tag generator&lt;/p&gt;

&lt;p&gt;(150 tools total - I added search and categories because scrolling through them like a medieval punishment is not the goal.)&lt;/p&gt;

&lt;p&gt;Is it perfect? No.&lt;br&gt;
Is every tool better than every competitor? Not yet.&lt;br&gt;
Am I improving it constantly? Yes.&lt;/p&gt;

&lt;p&gt;But the promise holds:&lt;/p&gt;

&lt;p&gt;If a task can run in your browser, it shouldn't need your email, your credit card, or your patience.&lt;/p&gt;

&lt;p&gt;-&amp;gt; &lt;a href="https://toolsmatic.me" rel="noopener noreferrer"&gt;https://toolsmatic.me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tell me what's missing or what sucks. If it makes sense, I'll build it.&lt;/p&gt;

</description>
      <category>tools</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I was a broke student who couldn't afford software subscriptions so I spent 4 months building free alternatives to all of them.</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Tue, 12 May 2026 07:03:56 +0000</pubDate>
      <link>https://dev.to/toolsmatic/i-was-a-broke-student-who-couldnt-afford-software-subscriptions-so-i-spent-4-months-building-free-1k91</link>
      <guid>https://dev.to/toolsmatic/i-was-a-broke-student-who-couldnt-afford-software-subscriptions-so-i-spent-4-months-building-free-1k91</guid>
      <description>&lt;p&gt;Smallpdf wants $12/month. Adobe Acrobat wants $20/month. Password managers want subscriptions. Color tools, dev utilities, file converters - everything has a paywall now.&lt;/p&gt;

&lt;p&gt;I'm a student. I couldn't afford any of it.&lt;/p&gt;

&lt;p&gt;So I started building my own. One tool at a time, every weekend, for 4 months straight.&lt;/p&gt;

&lt;p&gt;Today ToolsMatic has 76 free browser tools:&lt;/p&gt;

&lt;p&gt;36 PDF tools - merge, split, compress, sign, protect, annotate, convert&lt;br&gt;
Writing - word counter, text diff, case converter, lorem ipsum generator&lt;br&gt;
Developer - JSON formatter, JWT decoder, regex tester, UUID generator&lt;br&gt;
Design - color picker, gradient generator, contrast checker, image compressor&lt;br&gt;
Data - CSV to JSON, Base64 encoder, markdown previewer&lt;br&gt;
Utilities - QR code maker, unit converter, pomodoro timer, timezone converter&lt;/p&gt;

&lt;p&gt;Everything runs in your browser. No account. No uploads. No subscriptions. Your files never touch a server.&lt;/p&gt;

&lt;p&gt;Is it as polished as the paid tools? Not yet. But it's free. Actually free.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://toolsmatic.me" rel="noopener noreferrer"&gt;https://toolsmatic.me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're a student or just someone tired of paywalls - this one's for you.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a free browser toolkit with 76 tools - PDF, writing, dev, design &amp; more. No login, no uploads.</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Mon, 11 May 2026 07:22:32 +0000</pubDate>
      <link>https://dev.to/toolsmatic/i-built-a-free-browser-toolkit-with-76-tools-pdf-writing-dev-design-more-no-login-no-4f5a</link>
      <guid>https://dev.to/toolsmatic/i-built-a-free-browser-toolkit-with-76-tools-pdf-writing-dev-design-more-no-login-no-4f5a</guid>
      <description>&lt;p&gt;For the past few months I've been building &lt;a href="https://toolsmatic.me" rel="noopener noreferrer"&gt;ToolsMatic&lt;/a&gt; - a collection of free browser-based utilities that run entirely client-side. Your files and text never leave your device.&lt;/p&gt;

&lt;p&gt;It started with basic writing and developer tools. Then I added design utilities, data formatters, SEO helpers, and recently a full PDF toolkit with 36 tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's inside:
&lt;/h2&gt;

&lt;p&gt;Writing - word counter, case converter, text diff, lorem ipsum&lt;/p&gt;

&lt;p&gt;Developer - JSON formatter, regex tester, JWT inspector, UUID maker&lt;/p&gt;

&lt;p&gt;Design - gradient generator, contrast checker, color picker, image compressor&lt;/p&gt;

&lt;p&gt;PDF - merge, split, sign, compress, protect, convert, annotate &amp;amp; more&lt;/p&gt;

&lt;p&gt;Data - CSV to JSON, JSON to CSV, Base64 encoder&lt;/p&gt;

&lt;p&gt;Utilities - unit converter, timezone converter, QR code maker, pomodoro timer&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;76 tools total. All free. No account. No installs. Works on mobile too.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built this as a solo indie maker. Still growing it - would love honest feedback from this community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://toolsmatic.me" rel="noopener noreferrer"&gt;https://toolsmatic.me&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Ultimate WCAG &amp; APCA Contrast Checker for Modern Web Development</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Fri, 08 May 2026 07:31:02 +0000</pubDate>
      <link>https://dev.to/toolsmatic/the-ultimate-wcag-apca-contrast-checker-for-modern-web-development-2k98</link>
      <guid>https://dev.to/toolsmatic/the-ultimate-wcag-apca-contrast-checker-for-modern-web-development-2k98</guid>
      <description>&lt;p&gt;Building accessible web interfaces shouldn't be a guessing game. When you are picking a color palette, you need to know immediately if your text will be readable for all users, regardless of their visual capabilities or the screen they are using.&lt;/p&gt;

&lt;p&gt;That's why I built the &lt;strong&gt;&lt;a href="https://toolsmatic.me/tools/contrast-checker.html" rel="noopener noreferrer"&gt;ToolsMatic Contrast Checker Pro&lt;/a&gt;&lt;/strong&gt;--a 100% offline, privacy-first accessibility workspace designed specifically for frontend developers and UI designers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It's Built Differently
&lt;/h3&gt;

&lt;p&gt;Most contrast checkers just give you a pass/fail grade based on basic hex codes. I wanted a tool that actually understands modern design workflows. Here is what makes the ToolsMatic checker incredibly powerful:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Future-Proof: WCAG 2.1 &amp;amp; WCAG 3.0 APCA
&lt;/h4&gt;

&lt;p&gt;The tool doesn't just calculate standard WCAG 2.1 AA and AAA compliance. It simultaneously calculates the &lt;strong&gt;WCAG 3.0 APCA (Advanced Perceptual Contrast Algorithm)&lt;/strong&gt; score. APCA uses modern color science to measure contrast based on how humans actually perceive lightness, giving you a much more accurate reading for modern UIs.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Live Colorblindness Simulation
&lt;/h4&gt;

&lt;p&gt;Accessibility isn't just about contrast ratios. You need to know how your palette looks to someone with color vision deficiencies. The checker includes instant, live simulation for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Protanopia (Red-blindness)&lt;/li&gt;
&lt;li&gt;  Deuteranopia (Green-blindness)&lt;/li&gt;
&lt;li&gt;  Tritanopia (Blue-blindness)&lt;/li&gt;
&lt;li&gt;  Achromatopsia (Complete color blindness)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. AI-Powered Palette Suggestions
&lt;/h4&gt;

&lt;p&gt;Failing a contrast check is frustrating. Instead of forcing you to blindly drag color sliders until you pass, the tool uses AI-powered algorithms to instantly suggest the closest accessible color pairs. Click once, and your palette is fixed.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Font-Aware Testing
&lt;/h4&gt;

&lt;p&gt;A 4.5:1 ratio might pass for bold 24px text, but fail miserably for regular 12px text. The tool includes live font-size and font-weight selectors, instantly recalculating your compliance based on the exact typography you plan to use in production.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Developer-Ready Exports
&lt;/h4&gt;

&lt;p&gt;Once you lock in the perfect, highly-accessible color pair, you can export it instantly. The tool generates ready-to-copy snippets for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  CSS Variables (:root)&lt;/li&gt;
&lt;li&gt;  Tailwind Configs&lt;/li&gt;
&lt;li&gt;  SCSS Maps&lt;/li&gt;
&lt;li&gt;  JSON&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  100% Local &amp;amp; Private
&lt;/h3&gt;

&lt;p&gt;Like all 76 tools on ToolsMatic, the Contrast Checker processes everything locally in your browser. You can test unreleased brand colors and confidential client designs without ever sending a single hex code to a remote server. &lt;/p&gt;

&lt;p&gt;If you care about building inclusive, beautiful interfaces, try the &lt;strong&gt;&lt;a href="https://toolsmatic.me/tools/contrast-checker.html" rel="noopener noreferrer"&gt;ToolsMatic Contrast Checker&lt;/a&gt;&lt;/strong&gt; and let me know what you think!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>frontend</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Been working on an icon search website recently and I genuinely want some honest opinions before I launch it publicly.</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Thu, 07 May 2026 05:55:09 +0000</pubDate>
      <link>https://dev.to/toolsmatic/been-working-on-an-icon-search-website-recently-and-i-genuinely-want-some-honest-opinions-before-i-2o7o</link>
      <guid>https://dev.to/toolsmatic/been-working-on-an-icon-search-website-recently-and-i-genuinely-want-some-honest-opinions-before-i-2o7o</guid>
      <description>&lt;p&gt;The idea is simple:&lt;br&gt;
Search 100k+ icons from multiple icon packs/libraries in one place instead of opening 10 different sites.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;search icons instantly&lt;/li&gt;
&lt;li&gt;customize stroke/color/size&lt;/li&gt;
&lt;li&gt;copy SVG with one click&lt;/li&gt;
&lt;li&gt;download instantly&lt;/li&gt;
&lt;li&gt;paste directly into Figma/code&lt;/li&gt;
&lt;li&gt;no login&lt;/li&gt;
&lt;li&gt;no paywalls&lt;/li&gt;
&lt;li&gt;no "sign up to continue"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I got the idea because I was wasting so much time jumping between different icon libraries trying to find one specific icon.&lt;br&gt;
Most sites either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;have terrible search&lt;/li&gt;
&lt;li&gt;feel bloated&lt;/li&gt;
&lt;li&gt;push premium constantly&lt;/li&gt;
&lt;li&gt;or make simple things weirdly difficult&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I wanted to build something that feels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;insanely fast&lt;/li&gt;
&lt;li&gt;minimal&lt;/li&gt;
&lt;li&gt;frictionless&lt;/li&gt;
&lt;li&gt;almost "Google-like" for icons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting part is the SEO strategy behind it.&lt;br&gt;
Instead of only having a homepage, I'm building thousands of highly targeted pages around searches people actually make, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"calendar icon svg"&lt;/li&gt;
&lt;li&gt;"arrow right icon"&lt;/li&gt;
&lt;li&gt;"heart icon transparent"&lt;/li&gt;
&lt;li&gt;"settings icon for figma"&lt;/li&gt;
&lt;li&gt;"user icon react svg"&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically programmatic SEO at scale.&lt;br&gt;
The site is mostly statically generated/pre-rendered because I wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;near instant load times&lt;/li&gt;
&lt;li&gt;good indexing&lt;/li&gt;
&lt;li&gt;low server costs&lt;/li&gt;
&lt;li&gt;scalability without needing a huge backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few things I'm wondering:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Would you actually use a site like this over individual icon libraries?&lt;/li&gt;
&lt;li&gt;What would make you bookmark it permanently?&lt;/li&gt;
&lt;li&gt;What's the MOST annoying thing about current icon websites?&lt;/li&gt;
&lt;li&gt;Do developers/designers actually care about:&lt;/li&gt;
&lt;li&gt;one-click copy SVG&lt;/li&gt;
&lt;li&gt;Figma integration&lt;/li&gt;
&lt;li&gt;React/Vue exports&lt;/li&gt;
&lt;li&gt;icon customization&lt;/li&gt;
&lt;li&gt;Do you think programmatic SEO for resource sites still works today or is Google killing it?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm trying to make this feel less like a "startup product" and more like a genuinely useful utility people naturally share around.&lt;/p&gt;

&lt;p&gt;Would love brutally honest feedback before I launch.&lt;/p&gt;

</description>
      <category>design</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Top 5 URL Encoders &amp; Decoders for Developers in 2026</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Thu, 07 May 2026 05:07:03 +0000</pubDate>
      <link>https://dev.to/toolsmatic/top-5-url-encoders-decoders-for-developers-in-2026-5ace</link>
      <guid>https://dev.to/toolsmatic/top-5-url-encoders-decoders-for-developers-in-2026-5ace</guid>
      <description>&lt;p&gt;Encoding a URL parameter seems simple until it breaks your API request, ruins your analytics tracking, or causes a redirect loop in production. &lt;/p&gt;

&lt;p&gt;The problem with most online URL encoders is that they treat the entire URL as a single string of text, ignoring the complex anatomy of query parameters, hash fragments, and nested callback URLs.&lt;/p&gt;

&lt;p&gt;If you are tired of pasting sensitive data into generic, ad-heavy formatters, here are the top 5 URL encoding suites available for developers in 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. ToolsMatic URL Encoder &amp;amp; Decoder Pro (Best Overall)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://toolsmatic.me/tools/url-encode-online.html" rel="noopener noreferrer"&gt;ToolsMatic.me&lt;/a&gt; is not just a text box; it is a full URL debugging workspace built as an offline Progressive Web App (PWA).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it ranks #1:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Ultimate Workspace:&lt;/strong&gt; It doesn't just encode. It features a &lt;strong&gt;Query String Lab&lt;/strong&gt; (to visually build parameters), a &lt;strong&gt;URL Inspector&lt;/strong&gt; (breaking down host/path/query/hash), and a &lt;strong&gt;Batch Converter&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;100% Client-Side Privacy:&lt;/strong&gt; Your URLs might contain sensitive API keys or session tokens. ToolsMatic processes everything locally in your browser. No data ever leaves your machine.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Recursive Decoding:&lt;/strong&gt; Ever had a URL nested inside another URL? ToolsMatic can recursively decode it until you find the actual payload.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;UTM Builder &amp;amp; Security Audit:&lt;/strong&gt; Built-in tools to construct marketing links and audit URLs for open-redirect vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are a web developer, QA engineer, or technical SEO analyst, &lt;a href="https://toolsmatic.me/tools/url-encode-online.html" rel="noopener noreferrer"&gt;ToolsMatic&lt;/a&gt; is the undisputed king of URL manipulation.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. CyberChef (Best for Cryptography)
&lt;/h2&gt;

&lt;p&gt;CyberChef is the "Swiss Army Knife" of data formatting, maintained by the GCHQ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Incredibly powerful "bake" workflows for chaining operations.&lt;/li&gt;
&lt;li&gt;  Runs entirely client-side.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The UI is extremely complex. It is built for cryptography, not simple web development URL debugging.&lt;/li&gt;
&lt;li&gt;  Lacks specific URL inspection tools like query parameter splitting.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. URL-Encode-Decode.com (Best for Quick Conversions)
&lt;/h2&gt;

&lt;p&gt;This is one of the oldest and most trafficked utilities on the web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Does exactly one thing: encodes or decodes text.&lt;/li&gt;
&lt;li&gt;  Very fast load time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  No advanced features. Cannot separate &lt;code&gt;encodeURI&lt;/code&gt; from &lt;code&gt;encodeURIComponent&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Heavily cluttered with display ads.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Postman (Best for API Testing)
&lt;/h2&gt;

&lt;p&gt;While Postman is a massive API platform, developers often use it just to auto-encode query parameters before making requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Automatically handles parameter encoding in the "Params" tab.&lt;/li&gt;
&lt;li&gt;  Great for saving API states.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It's a heavy desktop app.&lt;/li&gt;
&lt;li&gt;  Overkill if you just need to quickly decode a callback URL from a log file.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Browserling Web Tools (Good Alternative)
&lt;/h2&gt;

&lt;p&gt;Browserling provides a suite of web developer tools, including URL encoding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Clean UI with a simple input/output box.&lt;/li&gt;
&lt;li&gt;  Part of a larger ecosystem of basic tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Server-side processing. You are sending your URLs to their backend.&lt;/li&gt;
&lt;li&gt;  Lacks batch processing or nested decoding.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;If you just need to encode the space character to &lt;code&gt;%20&lt;/code&gt;, any of these will work. But if you are building complex API queries, debugging tracking links, or working with sensitive tokens, the offline nature and advanced feature set of &lt;strong&gt;&lt;a href="https://toolsmatic.me/tools/url-encode-online.html" rel="noopener noreferrer"&gt;ToolsMatic&lt;/a&gt;&lt;/strong&gt; makes it the clear winner.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Top 5 Secure Password Generators for Developers in 2026</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Wed, 06 May 2026 16:54:50 +0000</pubDate>
      <link>https://dev.to/toolsmatic/top-5-secure-password-generators-for-developers-in-2026-12n5</link>
      <guid>https://dev.to/toolsmatic/top-5-secure-password-generators-for-developers-in-2026-12n5</guid>
      <description>&lt;p&gt;With data breaches happening on a weekly basis, hardcoding "Password123!" into your local .env files or using easily guessable strings for database credentials is no longer an option. As developers, we need passwords that are mathematically resistant to brute-force attacks.&lt;/p&gt;

&lt;p&gt;But with so many password generators on the market, which ones actually offer the best entropy, developer experience, and privacy? &lt;/p&gt;

&lt;p&gt;Here are the top 5 password generators available in 2026, compared by features, speed, and security.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. ToolsMatic Password Generator (Best Overall for Developers)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://toolsmatic.me/tools/password-generator.html" rel="noopener noreferrer"&gt;ToolsMatic.me&lt;/a&gt; is a comprehensive utility suite that features one of the most advanced password generators we've seen. It's built entirely as a Progressive Web App (PWA), meaning everything happens locally in your browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it ranks #1:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;100% Client-Side Processing:&lt;/strong&gt; When generating a password, no data ever touches a remote server. It uses &lt;code&gt;crypto.getRandomValues()&lt;/code&gt; directly in your browser.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Entropy Calculation:&lt;/strong&gt; Unlike basic generators, ToolsMatic calculates the mathematical entropy of your password in real-time, letting you know exactly how many centuries it would take to crack.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Diceware &amp;amp; Leet-Speak:&lt;/strong&gt; It goes beyond random characters. You can generate memorable "Diceware" passphrases (e.g., &lt;code&gt;horse-battery-staple&lt;/code&gt;) or use smart leet-speak transformations.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Works Offline:&lt;/strong&gt; Because it's a PWA, you can disconnect from Wi-Fi and still generate cryptographically secure passwords.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want complete control over your password generation without relying on a third-party server, &lt;a href="https://toolsmatic.me/tools/password-generator.html" rel="noopener noreferrer"&gt;ToolsMatic&lt;/a&gt; is the undisputed king.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. 1Password Generator (Best UI)
&lt;/h2&gt;

&lt;p&gt;1Password is famously known for its password manager, but they also offer a fantastic free web-based generator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Incredibly beautiful, fluid user interface.&lt;/li&gt;
&lt;li&gt;  Offers options for "Smart Password", "Random Password", and "Memorable Password".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Lacks deep developer metrics like exact entropy bits.&lt;/li&gt;
&lt;li&gt;  Not an offline-first tool unless you use their paid desktop app.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Bitwarden Generator (Best Open Source)
&lt;/h2&gt;

&lt;p&gt;Bitwarden is the darling of the open-source community, and their web-based generator is a solid, no-nonsense tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  100% open source and trusted by the security community.&lt;/li&gt;
&lt;li&gt;  Clean, ad-free interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Very basic. It generates the string but doesn't provide visual strength feedback or time-to-crack estimates.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. LastPass Password Generator
&lt;/h2&gt;

&lt;p&gt;LastPass has had a rough few years with security breaches, but their standalone web generator remains one of the most trafficked on Google.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Simple checkboxes for uppercase, lowercase, numbers, and symbols.&lt;/li&gt;
&lt;li&gt;  Easy "Copy" button integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Given their recent massive data breaches, many developers are hesitant to trust their infrastructure.&lt;/li&gt;
&lt;li&gt;  The web interface is heavily cluttered with ads for their paid tiers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Norton Password Generator
&lt;/h2&gt;

&lt;p&gt;Norton is a legacy antivirus company that offers a free password generator as a lead magnet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Backed by a massive, recognized cybersecurity brand.&lt;/li&gt;
&lt;li&gt;  Generates up to 64 characters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The page is very heavy to load due to marketing trackers.&lt;/li&gt;
&lt;li&gt;  No advanced features like Diceware or Leet-speak.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;If you just need a quick string of text, any of these will do. However, if you are generating master database passwords, root credentials, or need to guarantee your passwords aren't being logged by a server, the completely offline nature and advanced entropy calculations of &lt;strong&gt;&lt;a href="https://toolsmatic.me/tools/password-generator.html" rel="noopener noreferrer"&gt;ToolsMatic&lt;/a&gt;&lt;/strong&gt; make it the clear winner.&lt;/p&gt;

&lt;p&gt;What password manager or generator are you using to secure your local dev environments? Let me know below!&lt;/p&gt;

</description>
      <category>top</category>
      <category>5</category>
      <category>secure</category>
      <category>password</category>
    </item>
    <item>
      <title>Top 5 JSON Formatters for Web Developers in 2026</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Sun, 03 May 2026 15:07:22 +0000</pubDate>
      <link>https://dev.to/toolsmatic/top-5-json-formatters-for-web-developers-in-2026-5g2o</link>
      <guid>https://dev.to/toolsmatic/top-5-json-formatters-for-web-developers-in-2026-5g2o</guid>
      <description>&lt;p&gt;As web developers, we deal with JSON every single day. Whether we are debugging a massive API response, inspecting a webhook payload, or writing configuration files, a reliable JSON formatter is a critical part of our workflow. &lt;/p&gt;

&lt;p&gt;However, not all JSON tools are created equal. Many popular formatters are incredibly slow, lack advanced syntax highlighting, or worst of all--send your sensitive payload data to a remote server to be processed.&lt;/p&gt;

&lt;p&gt;In this list, we are breaking down the top 5 JSON formatters available in 2026, comparing their speed, features, and overall developer experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. ToolsMatic JSON Formatter (Best Overall Features)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://toolsmatic.me/tools/json-pretty-print.html" rel="noopener noreferrer"&gt;ToolsMatic.me&lt;/a&gt; is a relatively new but incredibly powerful utility suite that is quickly becoming a favorite among developers. While it isn't completely ad-free, its feature set absolutely blows the competition out of the water.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it ranks #1:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;100% Client-Side Processing:&lt;/strong&gt; This is the biggest selling point. ToolsMatic processes all of your JSON directly in the browser. It never sends your sensitive API keys or user data to a server.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Real-Time Validation:&lt;/strong&gt; As you paste or type, it instantly highlights syntax errors and points out exactly which line is broken.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Offline Capable:&lt;/strong&gt; Because it's built as a Progressive Web App (PWA), you can load it once and use it offline on an airplane or when your internet drops.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Clean UI:&lt;/strong&gt; Unlike older tools that look like they were built in 2010, ToolsMatic features a sleek, modern dark mode interface built for developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are dealing with large, complex, or sensitive JSON payloads, &lt;a href="https://toolsmatic.me/tools/json-validator-tool.html" rel="noopener noreferrer"&gt;ToolsMatic&lt;/a&gt; is currently the best tool on the market.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. JSONFormatter.org (The Old Reliable)
&lt;/h2&gt;

&lt;p&gt;JSONFormatter.org has been around forever and is likely the tool you've clicked on from Google hundreds of times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It gets the job done quickly for simple copy-paste tasks.&lt;/li&gt;
&lt;li&gt;  Includes basic tree-view structures for collapsing nested objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The UI is incredibly cluttered.&lt;/li&gt;
&lt;li&gt;  It struggles heavily with massive JSON payloads (50MB+), often crashing the browser tab.&lt;/li&gt;
&lt;li&gt;  Lacks the advanced, real-time error pointing found in newer tools.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. JSONLint (Best for Strict Validation)
&lt;/h2&gt;

&lt;p&gt;If your only goal is to find out &lt;em&gt;why&lt;/em&gt; your JSON is failing to parse, JSONLint is a classic tool designed specifically for strict validation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Extremely strict adherence to JSON standards.&lt;/li&gt;
&lt;li&gt;  Simple, no-nonsense interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It is strictly a validator. It lacks advanced formatting, minifying, or tree-view features. &lt;/li&gt;
&lt;li&gt;  Not ideal if you actually need to explore or read a large dataset.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. CodeBeautify JSON Viewer
&lt;/h2&gt;

&lt;p&gt;CodeBeautify offers a massive suite of tools, and their JSON Viewer is quite popular for converting JSON to other formats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Allows you to quickly convert JSON to XML or CSV.&lt;/li&gt;
&lt;li&gt;  Supports loading JSON directly from a URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The page load is very heavy due to a massive amount of scripts and trackers.&lt;/li&gt;
&lt;li&gt;  The actual editor feels laggy when typing or editing large files manually.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Browserling JSON Prettifier
&lt;/h2&gt;

&lt;p&gt;Browserling is a company known for cross-browser testing, but their suite of developer tools is loved by many for its simplicity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  As simple as it gets: one text box, one button.&lt;/li&gt;
&lt;li&gt;  Command-line aesthetic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Lacks almost all advanced features (no tree view, no syntax error highlighting).&lt;/li&gt;
&lt;li&gt;  Strictly a prettifier, not an editor or validator.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;If you just need to quickly format a 10-line JSON string, any of these tools will work. However, if you are working professionally with sensitive data, massive payloads, and need advanced real-time validation, &lt;strong&gt;&lt;a href="https://toolsmatic.me/tools/json-pretty-print.html" rel="noopener noreferrer"&gt;ToolsMatic&lt;/a&gt;&lt;/strong&gt; is the clear winner for 2026. &lt;/p&gt;

&lt;p&gt;What JSON tools are you currently using in your workflow? Let me know in the comments!&lt;/p&gt;

</description>
      <category>api</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Stop using basic JSON formatters. I built one that actually fixes your errors.</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Sat, 02 May 2026 05:29:19 +0000</pubDate>
      <link>https://dev.to/toolsmatic/stop-using-basic-json-formatters-i-built-one-that-actually-fixes-your-errors-567i</link>
      <guid>https://dev.to/toolsmatic/stop-using-basic-json-formatters-i-built-one-that-actually-fixes-your-errors-567i</guid>
      <description>&lt;p&gt;If you are a developer, you probably deal with JSON every single day. And if you are like me, you probably have a bookmark to some random "JSON Formatter Online" site from 2014.&lt;/p&gt;

&lt;p&gt;You paste your payload, click "Format", and... &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Error: Parse error on line 42: ... "status": "active", } ... Expecting 'STRING', got '}'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Because of one tiny &lt;strong&gt;trailing comma&lt;/strong&gt;, the tool refuses to work. Now you have to manually hunt down the error, fix it, and try again. Oh, and you just pasted a production API response containing user data into a random website that probably logged it.&lt;/p&gt;

&lt;p&gt;I got so frustrated with this workflow that I decided to build &lt;strong&gt;&lt;a href="https://toolsmatic.me/tools/json-formatter.html" rel="noopener noreferrer"&gt;ToolsMatic JSON Formatter Pro&lt;/a&gt;&lt;/strong&gt;--a 100% free, client-side tool that actually solves developer pain points.&lt;/p&gt;

&lt;p&gt;Here are 8 features I built into it that make it the last JSON tool you'll ever need.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Auto-Repair Invalid JSON
&lt;/h3&gt;

&lt;p&gt;Instead of throwing a useless error when your JSON is slightly malformed, ToolsMatic includes an &lt;strong&gt;Auto-Repair&lt;/strong&gt; button. &lt;br&gt;
If your payload has trailing commas, single quotes instead of double quotes, or unquoted keys ({ name: "John" }), clicking Auto-Repair will automatically normalize and fix the syntax for you, saving you from hunting down typos in a 5,000-line payload.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Handling Massive 100MB Files Without Crashing
&lt;/h3&gt;

&lt;p&gt;Most browser-based JSON tools completely freeze if you paste anything larger than 5MB. I built ToolsMatic to handle massive database dumps and logging exports. It supports &lt;strong&gt;streaming uploads and downloads up to 100MB&lt;/strong&gt;, so you can format and analyze massive payloads without crashing your browser tab.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The JSON Path Finder
&lt;/h3&gt;

&lt;p&gt;Have you ever stared at a massive API response in your browser, found the exact value you need, and then spent 2 minutes trying to figure out the exact dot-notation path to extract it in your code?&lt;/p&gt;

&lt;p&gt;In ToolsMatic, you can switch to &lt;strong&gt;Tree View&lt;/strong&gt;. When you find the value you want, simply &lt;strong&gt;click it&lt;/strong&gt;. &lt;br&gt;
The tool will automatically copy the exact path to your clipboard (e.g., data.users[3].profile.avatar_url). It's a massive time-saver when writing frontend data-fetching logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Native JSON Schema Validation
&lt;/h3&gt;

&lt;p&gt;If you are working with strict APIs, you can switch to the "Schema" mode, paste your JSON Schema, and instantly validate your payload against it. It gives you detailed error messages with exact field locations, making it incredibly easy to ensure your payloads match your OpenAPI/Swagger specs.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Real-Time Regex Search
&lt;/h3&gt;

&lt;p&gt;When you are looking for specific values in a 20,000-line JSON file, standard Ctrl+F doesn't always cut it. ToolsMatic includes a built-in search bar that supports &lt;strong&gt;Regex patterns&lt;/strong&gt;, highlighting matches in real-time as you type through massive nested structures.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Side-by-Side Compare Mode
&lt;/h3&gt;

&lt;p&gt;Trying to figure out what changed between two API responses or config files? Instead of dropping them into a generic text diff tool, ToolsMatic has a built-in JSON Compare Mode. It formats both payloads and highlights the exact structural differences, added keys, and changed values. &lt;/p&gt;

&lt;h3&gt;
  
  
  7. Sort Keys Alphabetically
&lt;/h3&gt;

&lt;p&gt;Sometimes you just need to normalize data before diffing it or saving a configuration file. With one click, you can sort every single key in the entire JSON tree alphabetically, at every depth level. &lt;/p&gt;

&lt;h3&gt;
  
  
  8. 100% Privacy (Zero Server Uploads)
&lt;/h3&gt;

&lt;p&gt;This is the most important part. When we debug API responses, they often contain sensitive PII, Bearer Tokens, or proprietary config structures. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ToolsMatic does not have a backend.&lt;/strong&gt; The formatting, minification, schema validation, and tree generation all happen entirely inside your browser using Vanilla JavaScript. Once the page loads, you can turn off your Wi-Fi and the tool will still work perfectly. Your data never leaves your machine.&lt;/p&gt;




&lt;h3&gt;
  
  
  Try it out!
&lt;/h3&gt;

&lt;p&gt;It's completely free, has no ads covering the editor, requires no login, and is packed with keyboard shortcuts (Ctrl+Enter to format, Ctrl+M to minify). &lt;/p&gt;

&lt;p&gt;You can try it here: &lt;strong&gt;&lt;a href="https://toolsmatic.me/tools/json-formatter.html" rel="noopener noreferrer"&gt;ToolsMatic JSON Formatter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built this to scratch my own itch, but I'd love to hear what features you think are missing! What is the most annoying thing about working with JSON for you? Let me know in the comments!&lt;/p&gt;

</description>
      <category>json</category>
      <category>webdev</category>
      <category>tools</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How I built a zero-dependency, 100% client-side JWT Verifier using the Web Crypto API</title>
      <dc:creator>ToolsMatic</dc:creator>
      <pubDate>Sat, 02 May 2026 05:16:37 +0000</pubDate>
      <link>https://dev.to/toolsmatic/how-i-built-a-zero-dependency-100-client-side-jwt-verifier-using-the-web-crypto-api-477a</link>
      <guid>https://dev.to/toolsmatic/how-i-built-a-zero-dependency-100-client-side-jwt-verifier-using-the-web-crypto-api-477a</guid>
      <description>&lt;p&gt;JSON Web Tokens (JWTs) are everywhere. Whether you're debugging an OAuth flow, a rogue microservice, or a broken single-page application, inspecting a JWT is a daily task for most developers. &lt;/p&gt;

&lt;p&gt;But there's a massive, glaring problem with how we usually do it: &lt;strong&gt;We paste production tokens into random third-party websites.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many online JWT decoders send your token to their backend to parse or verify it. If that token contains sensitive claims, PII, or internal routing data - and if it hasn't expired - you've just leaked it. &lt;/p&gt;

&lt;p&gt;I was tired of wondering if a random tool was logging my tokens, so I decided to build a &lt;strong&gt;&lt;a href="https://toolsmatic.me/tools/jwt-inspector.html" rel="noopener noreferrer"&gt;privacy-first JWT Inspector&lt;/a&gt;&lt;/strong&gt; for my tool hub, ToolsMatic. &lt;/p&gt;

&lt;p&gt;The goal? &lt;strong&gt;Zero backend. Zero dependencies. 100% client-side processing.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Here's how I built it using nothing but Vanilla JavaScript and the native Web Crypto API.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Safely Decoding Base64URL in the Browser
&lt;/h3&gt;

&lt;p&gt;A JWT is just three strings separated by dots (&lt;code&gt;header.payload.signature&lt;/code&gt;), encoded in Base64URL. &lt;/p&gt;

&lt;p&gt;The first challenge is that the browser's native &lt;code&gt;atob()&lt;/code&gt; function only understands standard Base64, not Base64URL (which swaps &lt;code&gt;+&lt;/code&gt; and &lt;code&gt;/&lt;/code&gt; for &lt;code&gt;-&lt;/code&gt; and &lt;code&gt;_&lt;/code&gt;, and removes the &lt;code&gt;=&lt;/code&gt; padding). &lt;/p&gt;

&lt;p&gt;To decode the token without a library, we have to normalize the string back to standard Base64 first:&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="nx"&gt;b64urlDecodeToString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&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="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. Swap characters back to standard Base64&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;norm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/-/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/_/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Add back the missing '=' padding&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Decode to binary, then convert to a string&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;norm&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;pad&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;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charCodeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextDecoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Malformed padding or characters&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this, decoding the &lt;code&gt;header&lt;/code&gt; and &lt;code&gt;payload&lt;/code&gt; is as simple as splitting the token by &lt;code&gt;.&lt;/code&gt; and running &lt;code&gt;JSON.parse()&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: The Hard Part - Cryptographic Verification
&lt;/h3&gt;

&lt;p&gt;Decoding the JSON is easy, but a JWT is useless if you can't verify its cryptographic signature. &lt;/p&gt;

&lt;p&gt;Most people reach for the &lt;code&gt;jsonwebtoken&lt;/code&gt; npm package for this, but that requires a Node.js backend. Instead, we can use the browser's native &lt;code&gt;window.crypto.subtle&lt;/code&gt; API.&lt;/p&gt;

&lt;h4&gt;
  
  
  Verifying HMAC (HS256)
&lt;/h4&gt;

&lt;p&gt;HMAC algorithms (like &lt;code&gt;HS256&lt;/code&gt;) use a shared secret. We need to import the secret key as raw bytes, and then calculate the signature over the &lt;code&gt;header.payload&lt;/code&gt; string to see if it matches the token's signature.&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="c1"&gt;// The data we are verifying is the first two parts of the token&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;parts&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="s2"&gt;.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;parts&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="s2"&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;secretMaterial&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my-super-secret-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Import the raw secret into the Web Crypto API&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;importKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;raw&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;secretMaterial&lt;/span&gt;&lt;span class="p"&gt;),&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HMAC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;:&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SHA-256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; 
  &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sign&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Generate a signature for our data using the secret&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HMAC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Encode our generated signature and compare it!&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;b64urlEncode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sig&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;isValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;calc&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;parts&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;h4&gt;
  
  
  Verifying RSA (RS256)
&lt;/h4&gt;

&lt;p&gt;RSA algorithms (like &lt;code&gt;RS256&lt;/code&gt;) are more complex because they use a public/private key pair. You verify the token using a PEM-formatted Public Key.&lt;/p&gt;

&lt;p&gt;The Web Crypto API requires us to strip out the &lt;code&gt;-----BEGIN PUBLIC KEY-----&lt;/code&gt; headers, convert the base64 payload into an &lt;code&gt;ArrayBuffer&lt;/code&gt;, and import it as an &lt;code&gt;spki&lt;/code&gt; key.&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="c1"&gt;// 1. Clean the PEM string and convert to ArrayBuffer&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/-----BEGIN PUBLIC KEY-----|-----END PUBLIC KEY-----|&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+/g&lt;/span&gt;&lt;span class="p"&gt;,&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;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clean&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;keyBuffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;keyBuffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charCodeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Import the Public Key&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publicKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;importKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;spki&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;keyBuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RSASSA-PKCS1-v1_5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;:&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SHA-256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; 
  &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verify&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Verify the signature against the data&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sigBytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;b64urlDecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parts&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RSASSA-PKCS1-v1_5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;sigBytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Accounting for Clock Skew
&lt;/h3&gt;

&lt;p&gt;One of the most frustrating JWT bugs happens when your authorization server and your API server's clocks are out of sync by a few seconds. A token might be rejected as "expired" (&lt;code&gt;exp&lt;/code&gt;) or "not valid yet" (&lt;code&gt;nbf&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;To make this a &lt;em&gt;professional&lt;/em&gt; debugging tool, I added a manual Clock Skew slider. When validating claims, the tool simply offsets the current time:&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="nx"&gt;nowSec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&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;skew&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Allow 60 seconds of drift&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exp&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;skew&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;nowSec&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Expired &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nowSec&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;s ago`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;By combining basic base64url parsing with the native &lt;code&gt;crypto.subtle&lt;/code&gt; API, I was able to build a robust JWT inspector that supports &lt;code&gt;HS256/384/512&lt;/code&gt;, &lt;code&gt;RS256/384/512&lt;/code&gt;, and claim validation - all without sending a single byte over the network. &lt;/p&gt;

&lt;p&gt;If you're debugging tokens and want to make sure your data stays on your machine, you can use the live tool here: &lt;strong&gt;&lt;a href="https://toolsmatic.me/tools/jwt-inspector.html" rel="noopener noreferrer"&gt;ToolsMatic JWT Inspector&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you ever accidentally leaked a token to a debugging tool? Let me know in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>security</category>
    </item>
  </channel>
</rss>
