<?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: Andrew Rozumny</title>
    <description>The latest articles on DEV Community by Andrew Rozumny (@andrewrozumny).</description>
    <link>https://dev.to/andrewrozumny</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%2F3837522%2F0e703c9b-e862-4950-8dc8-087dc43774bd.png</url>
      <title>DEV Community: Andrew Rozumny</title>
      <link>https://dev.to/andrewrozumny</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andrewrozumny"/>
    <language>en</language>
    <item>
      <title>You’re probably leaking sensitive data every time you use online dev tools</title>
      <dc:creator>Andrew Rozumny</dc:creator>
      <pubDate>Tue, 07 Apr 2026 10:46:31 +0000</pubDate>
      <link>https://dev.to/andrewrozumny/youre-probably-leaking-sensitive-data-every-time-you-use-online-dev-tools-47j8</link>
      <guid>https://dev.to/andrewrozumny/youre-probably-leaking-sensitive-data-every-time-you-use-online-dev-tools-47j8</guid>
      <description>&lt;p&gt;Most developers don’t think twice before pasting data into online tools.&lt;/p&gt;

&lt;p&gt;JSON formatters, JWT decoders, base64 converters, regex testers…&lt;/p&gt;

&lt;p&gt;You just open a site, paste your data, get the result, and move on.&lt;/p&gt;

&lt;p&gt;But here’s the problem:&lt;/p&gt;

&lt;p&gt;You’re often sending that data to someone else’s server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hidden risk
&lt;/h2&gt;

&lt;p&gt;That “quick utility” you’re using?&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;log your data&lt;/li&gt;
&lt;li&gt;store it temporarily&lt;/li&gt;
&lt;li&gt;or even keep it longer than you expect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And most of the time, you have no idea.&lt;/p&gt;

&lt;p&gt;No clear guarantees.&lt;br&gt;
No visibility.&lt;br&gt;
No control.&lt;/p&gt;

&lt;h2&gt;
  
  
  “It’s just a formatter” — is it?
&lt;/h2&gt;

&lt;p&gt;Even simple tools usually work like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You paste your data&lt;/li&gt;
&lt;li&gt;It gets sent to a backend&lt;/li&gt;
&lt;li&gt;The server processes it&lt;/li&gt;
&lt;li&gt;You get a response&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That means your data leaves your machine.&lt;/p&gt;

&lt;p&gt;Sometimes it’s harmless.&lt;/p&gt;

&lt;p&gt;Sometimes it’s not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this becomes a real problem
&lt;/h2&gt;

&lt;p&gt;Think about what developers actually paste into these tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys&lt;/li&gt;
&lt;li&gt;tokens&lt;/li&gt;
&lt;li&gt;internal JSON payloads&lt;/li&gt;
&lt;li&gt;logs with user data&lt;/li&gt;
&lt;li&gt;config files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stuff that was never meant to leave your environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  I caught myself doing this
&lt;/h2&gt;

&lt;p&gt;At some point I realized I was doing exactly this.&lt;/p&gt;

&lt;p&gt;Copy → paste → convert → done.&lt;/p&gt;

&lt;p&gt;Without even thinking about where that data goes.&lt;/p&gt;

&lt;p&gt;That’s when it started to feel… wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  A better approach
&lt;/h2&gt;

&lt;p&gt;I started looking for tools that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run entirely in the browser
&lt;/li&gt;
&lt;li&gt;don’t send data anywhere
&lt;/li&gt;
&lt;li&gt;don’t require accounts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just open → use → close.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;For small utilities, there’s no real reason to involve a server.&lt;/p&gt;

&lt;p&gt;Formatting, encoding, decoding — all of this can be done locally.&lt;/p&gt;

&lt;p&gt;Faster.&lt;br&gt;
Safer.&lt;br&gt;
Simpler.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I ended up doing
&lt;/h2&gt;

&lt;p&gt;I started putting together my own small set of browser-based tools.&lt;/p&gt;

&lt;p&gt;Mostly for myself at first.&lt;/p&gt;

&lt;p&gt;Just to avoid jumping between random sites and wondering what happens to my data.&lt;/p&gt;

&lt;p&gt;For small tools, local-first just makes more sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Curious how you handle this
&lt;/h2&gt;

&lt;p&gt;Do you trust online tools with sensitive data?&lt;/p&gt;

&lt;p&gt;Or do you prefer local-first alternatives?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>privacy</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Stop Pasting Sensitive Data Into Random Online Tools</title>
      <dc:creator>Andrew Rozumny</dc:creator>
      <pubDate>Fri, 03 Apr 2026 19:09:16 +0000</pubDate>
      <link>https://dev.to/andrewrozumny/stop-pasting-sensitive-data-into-random-online-tools-5cek</link>
      <guid>https://dev.to/andrewrozumny/stop-pasting-sensitive-data-into-random-online-tools-5cek</guid>
      <description>&lt;p&gt;If you've ever pasted sensitive data into an online tool…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pasted a JWT into a random decoder&lt;/li&gt;
&lt;li&gt;formatted JSON with API keys inside&lt;/li&gt;
&lt;li&gt;tested regex on production data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…you’ve probably thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“this is probably fine”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But is it?&lt;/p&gt;




&lt;h2&gt;
  
  
  The uncomfortable truth
&lt;/h2&gt;

&lt;p&gt;Most online tools still work like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You paste your data&lt;/li&gt;
&lt;li&gt;It gets sent to a server&lt;/li&gt;
&lt;li&gt;It gets processed there&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And you're just… trusting it.&lt;/p&gt;

&lt;p&gt;No idea where it goes.&lt;br&gt;
No idea if it’s logged.&lt;br&gt;
No idea who can access it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The moment it hit me
&lt;/h2&gt;

&lt;p&gt;I was debugging a JWT with user data inside.&lt;/p&gt;

&lt;p&gt;Pasted it into a tool.&lt;/p&gt;

&lt;p&gt;Then realized:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I have no idea where this just went.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  So I built my own tools
&lt;/h2&gt;

&lt;p&gt;I ended up building a set of dev tools that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run entirely in the browser&lt;/li&gt;
&lt;li&gt;don’t upload anything&lt;/li&gt;
&lt;li&gt;don’t track anything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;a href="https://tooldock.org/" rel="noopener noreferrer"&gt;https://tooldock.org/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this actually matters
&lt;/h2&gt;

&lt;p&gt;This isn’t paranoia.&lt;/p&gt;

&lt;p&gt;This is everyday dev stuff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tokens&lt;/li&gt;
&lt;li&gt;logs&lt;/li&gt;
&lt;li&gt;internal payloads&lt;/li&gt;
&lt;li&gt;user data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t always control what ends up in your clipboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Let’s say you’re:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;decoding a JWT&lt;/li&gt;
&lt;li&gt;formatting JSON&lt;/li&gt;
&lt;li&gt;testing regex&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With most tools:&lt;br&gt;
→ your data leaves your device&lt;/p&gt;

&lt;p&gt;With ToolDock:&lt;br&gt;
→ everything stays local&lt;/p&gt;




&lt;h2&gt;
  
  
  Unexpected benefit
&lt;/h2&gt;

&lt;p&gt;It’s not just privacy.&lt;/p&gt;

&lt;p&gt;It’s speed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no network&lt;/li&gt;
&lt;li&gt;no waiting&lt;/li&gt;
&lt;li&gt;instant feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you use client-side tools, everything else feels slow.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s inside
&lt;/h2&gt;

&lt;p&gt;Right now there are ~90 tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON Formatter&lt;/li&gt;
&lt;li&gt;Regex Tester (real-time)&lt;/li&gt;
&lt;li&gt;UUID Generator&lt;/li&gt;
&lt;li&gt;Base64 Encode / Decode&lt;/li&gt;
&lt;li&gt;JWT Decoder&lt;/li&gt;
&lt;li&gt;Timestamp Converter&lt;/li&gt;
&lt;li&gt;Hash Generator&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Curious
&lt;/h2&gt;

&lt;p&gt;Do you actually care if tools upload your data?&lt;/p&gt;

&lt;p&gt;Or is it “meh as long as it works”?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>security</category>
    </item>
    <item>
      <title>Every Stripe test card you'll ever need (plus fake checkout data for Shopify, WooCommerce &amp; Magento)</title>
      <dc:creator>Andrew Rozumny</dc:creator>
      <pubDate>Wed, 01 Apr 2026 23:14:29 +0000</pubDate>
      <link>https://dev.to/andrewrozumny/every-stripe-test-card-youll-ever-need-plus-fake-checkout-data-for-shopify-woocommerce-magento-3kl</link>
      <guid>https://dev.to/andrewrozumny/every-stripe-test-card-youll-ever-need-plus-fake-checkout-data-for-shopify-woocommerce-magento-3kl</guid>
      <description>&lt;p&gt;If you're building or testing an e-commerce checkout, you've been there: opening the Stripe docs, scrolling for the right test card, copying it, then hunting for a fake address that matches the right country format.&lt;/p&gt;

&lt;p&gt;I got tired of this. So I built a tool that generates everything at once.&lt;/p&gt;

&lt;p&gt;But first — here's the complete reference you came for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stripe test cards
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Success scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Card number&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4242 4242 4242 4242&lt;/td&gt;
&lt;td&gt;Visa&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5555 5555 5555 4444&lt;/td&gt;
&lt;td&gt;Mastercard&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3782 822463 10005&lt;/td&gt;
&lt;td&gt;Amex&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6011 1111 1111 1117&lt;/td&gt;
&lt;td&gt;Discover&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Failure scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Card number&lt;/th&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4000 0000 0000 0002&lt;/td&gt;
&lt;td&gt;Always declined&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000 0000 0000 9995&lt;/td&gt;
&lt;td&gt;Insufficient funds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000 0000 0000 0069&lt;/td&gt;
&lt;td&gt;Expired card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000 0000 0000 0127&lt;/td&gt;
&lt;td&gt;Incorrect CVC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000 0000 0000 0119&lt;/td&gt;
&lt;td&gt;Processing error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3DS scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Card number&lt;/th&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4000 0025 0000 3155&lt;/td&gt;
&lt;td&gt;3DS required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000 0027 6000 3184&lt;/td&gt;
&lt;td&gt;3DS recommended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000 0000 0000 3220&lt;/td&gt;
&lt;td&gt;3DS2 required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use any future expiry date and any 3-digit CVV (4 digits for Amex).&lt;/p&gt;




&lt;h2&gt;
  
  
  Shopify Bogus Gateway
&lt;/h2&gt;

&lt;p&gt;Shopify has a built-in test payment provider that doesn't need a real Stripe account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt; Settings → Payments → Add payment method → Search "Bogus Gateway"&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Card number&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Successful payment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Failed payment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Gateway exception&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use any name, any future expiry, any CVV.&lt;/p&gt;




&lt;h2&gt;
  
  
  WooCommerce test cards
&lt;/h2&gt;

&lt;p&gt;WooCommerce with Stripe plugin uses standard Stripe test cards above.&lt;/p&gt;

&lt;p&gt;Enable test mode: &lt;strong&gt;WooCommerce → Settings → Payments → WooCommerce Payments → Enable test mode.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Magento test cards
&lt;/h2&gt;

&lt;p&gt;Magento 2 with Braintree sandbox:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Card number&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4111 1111 1111 1111&lt;/td&gt;
&lt;td&gt;Visa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5500 0055 5555 5559&lt;/td&gt;
&lt;td&gt;Mastercard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3714 496353 98431&lt;/td&gt;
&lt;td&gt;Amex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CVV: 123, Expiry: any future date.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part nobody talks about: fake addresses
&lt;/h2&gt;

&lt;p&gt;Cards are easy. But you also need a realistic fake address that matches the country format — especially if your checkout validates postal codes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;US:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;123 Main Street, Chicago, IL 60601
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;UK:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;42 High Street, London, E1 2AB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Germany:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hauptstraße 15, 10115 Berlin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generating these manually every time is annoying.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick tips for checkout testing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Test the full flow, not just payment.&lt;/strong&gt;&lt;br&gt;
Most devs only test success. Your declined card handling is just as important — test that the error message is clear and the user can retry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always test 3DS separately.&lt;/strong&gt;&lt;br&gt;
3DS authentication adds a second step. Use card &lt;code&gt;4000 0025 0000 3155&lt;/code&gt; to trigger it and make sure your UI handles the redirect correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test with guest checkout AND logged-in user.&lt;/strong&gt;&lt;br&gt;
These often have different code paths and different bugs.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tool I built
&lt;/h2&gt;

&lt;p&gt;I put all of this into one place — a free browser-based generator that gives you fake customer name, email, phone, country-specific address, and the right test card for your platform in one click.&lt;/p&gt;

&lt;p&gt;Supports: Generic/Stripe, Shopify, WooCommerce, Magento, BigCommerce.&lt;br&gt;
Countries: US, GB, AU, CA, DE, UA, JP.&lt;br&gt;
Export as JSON or copy individual fields.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://tooldock.org/tools/ecommerce-test-data" rel="noopener noreferrer"&gt;tooldock.org/tools/ecommerce-test-data&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything runs in your browser — nothing is sent to any server.&lt;/p&gt;




&lt;p&gt;What's the most annoying part of checkout testing for you?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>ecommerce</category>
      <category>stripe</category>
    </item>
    <item>
      <title>Claude AI Usage by Country: Israel Leads at 4.90x, Tanzania at 0.03x</title>
      <dc:creator>Andrew Rozumny</dc:creator>
      <pubDate>Wed, 01 Apr 2026 21:47:53 +0000</pubDate>
      <link>https://dev.to/andrewrozumny/claude-ai-usage-by-country-israel-leads-at-490x-tanzania-at-003x-5655</link>
      <guid>https://dev.to/andrewrozumny/claude-ai-usage-by-country-israel-leads-at-490x-tanzania-at-003x-5655</guid>
      <description>&lt;p&gt;Anthropic just released the &lt;strong&gt;Claude AI Usage by Country&lt;/strong&gt; data via the &lt;br&gt;
Anthropic Economic Index (sample: Nov 13–20, 2025).&lt;/p&gt;

&lt;p&gt;The metric is simple: a score above &lt;strong&gt;1x&lt;/strong&gt; means a country's share of &lt;br&gt;
Claude usage exceeds its share of the global working-age population.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏆 Top performers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇮🇱 Israel&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.90x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇸🇬 Singapore&lt;/td&gt;
&lt;td&gt;4.19x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇨🇭 Switzerland&lt;/td&gt;
&lt;td&gt;3.21x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇰🇷 South Korea&lt;/td&gt;
&lt;td&gt;3.12x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇦🇺 Australia&lt;/td&gt;
&lt;td&gt;3.27x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇺🇸 USA&lt;/td&gt;
&lt;td&gt;3.69x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇨🇦 Canada&lt;/td&gt;
&lt;td&gt;3.15x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  📉 Lowest usage
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇹🇿 Tanzania&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.03x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇲🇬 Madagascar&lt;/td&gt;
&lt;td&gt;0.07x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇲🇿 Mozambique&lt;/td&gt;
&lt;td&gt;0.13x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What's interesting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Europe is surprisingly strong&lt;/strong&gt; — France (2.66x), UK (2.59x), 
Ireland (2.39x), Norway (2.43x). Even countries like Poland (1.41x) 
and Greece (1.21x) are above baseline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asia is split&lt;/strong&gt; — Singapore (4.19x) and South Korea (3.12x) are 
crushing it, while India (0.22x) and Indonesia (0.48x) are far below 1x.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Africa and Latin America&lt;/strong&gt; are mostly sub-1x — likely a mix of 
pricing, language support, and infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Japan at 1.59x&lt;/strong&gt; — higher than I expected given the strong local 
AI ecosystem (Claude competes with domestic models there).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My take
&lt;/h2&gt;

&lt;p&gt;The correlation seems to be: **English proficiency + tech sector density &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GDP per capita**. Israel's dominance makes sense — massive tech industry, 
high English fluency, small population (so the ratio amplifies easily).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The really interesting story is &lt;strong&gt;what happens as Claude adds more &lt;br&gt;
languages and local pricing&lt;/strong&gt; — countries like Brazil (0.70x) and Mexico &lt;br&gt;
(0.44x) feel like huge untapped markets.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Source: Anthropic Economic Index. Data as of Jan 15, 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What's your country's score? Did anything surprise you?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudeai</category>
      <category>anthropic</category>
      <category>data</category>
    </item>
    <item>
      <title>English is now a programming language and I have mixed feelings</title>
      <dc:creator>Andrew Rozumny</dc:creator>
      <pubDate>Sun, 29 Mar 2026 10:53:43 +0000</pubDate>
      <link>https://dev.to/andrewrozumny/english-is-now-a-programming-language-and-i-have-mixed-feelings-3355</link>
      <guid>https://dev.to/andrewrozumny/english-is-now-a-programming-language-and-i-have-mixed-feelings-3355</guid>
      <description>&lt;p&gt;A few years ago if you said "just describe what you want and the computer will do it" — that was science fiction. Now it's Tuesday.&lt;/p&gt;

&lt;p&gt;I spent last week building 40 browser-based developer tools. Half of them I described in plain English to Claude Code and it just... built them. Components, types, tests, the lot.&lt;/p&gt;

&lt;p&gt;The weird part isn't that it works. It's how it feels.&lt;/p&gt;

&lt;p&gt;There's this guilt developers know — the "am I even really coding?" feeling. Stack Overflow used to trigger it. AI just cranks it to 11.&lt;/p&gt;

&lt;p&gt;But here's what I actually noticed: the thinking didn't go away. It moved. Less time on "how do I type this correctly". More time on "is this the right thing to build at all".&lt;/p&gt;

&lt;p&gt;The English-as-code thing is real. But it's less like replacing programming and more like the abstractions keep going up. Assembly → C → Python → now this. Each step felt like cheating to someone.&lt;/p&gt;

&lt;p&gt;Where do you draw the line between "using tools" and "not really coding"? Or is that even the right question?&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.amazonaws.com%2Fuploads%2Farticles%2Fe2hxthop8j7crygp9wx1.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.amazonaws.com%2Fuploads%2Farticles%2Fe2hxthop8j7crygp9wx1.png" alt=" " width="749" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>humor</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I added 40 tools to my dev toolkit site in one week — here's what I learned</title>
      <dc:creator>Andrew Rozumny</dc:creator>
      <pubDate>Sat, 28 Mar 2026 19:42:40 +0000</pubDate>
      <link>https://dev.to/andrewrozumny/i-added-40-tools-to-my-dev-toolkit-site-in-one-week-heres-what-i-learned-1i92</link>
      <guid>https://dev.to/andrewrozumny/i-added-40-tools-to-my-dev-toolkit-site-in-one-week-heres-what-i-learned-1i92</guid>
      <description>&lt;p&gt;A week ago ToolDock had 20 tools. Today it has 60+.&lt;/p&gt;

&lt;p&gt;Here's what I shipped, what broke, and what actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;All tools run entirely in your browser. No sign-up, no server round-trips, no data leaves your device.&lt;/p&gt;

&lt;p&gt;This week I added:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI &amp;amp; LLM tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token Counter — count tokens before sending to GPT/Claude&lt;/li&gt;
&lt;li&gt;LLM Cost Calculator — compare API costs across providers&lt;/li&gt;
&lt;li&gt;MCP Config Generator — generate Claude Code config files&lt;/li&gt;
&lt;li&gt;Cursor Rules Generator — .cursorrules for your stack&lt;/li&gt;
&lt;li&gt;System Prompt Builder — templates for any LLM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CSS &amp;amp; Styling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS ↔ Tailwind converter&lt;/li&gt;
&lt;li&gt;SCSS/LESS compilers (browser-based, no Node needed)&lt;/li&gt;
&lt;li&gt;Tailwind CSS Cheatsheet with rem/px display&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer utilities&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.gitignore Generator&lt;/li&gt;
&lt;li&gt;.env File Validator&lt;/li&gt;
&lt;li&gt;Image Converter (PNG/WebP/JPEG, multi-upload)&lt;/li&gt;
&lt;li&gt;Word Counter with Flesch reading score&lt;/li&gt;
&lt;li&gt;chmod Calculator&lt;/li&gt;
&lt;li&gt;JSONPath Tester&lt;/li&gt;
&lt;li&gt;OpenAPI Spec Validator&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Browser APIs are more powerful than most developers realize&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SHA-256 hashing, image conversion, SCSS compilation — all running client-side with zero dependencies.&lt;br&gt;
Web Crypto API, Canvas API, and WebAssembly make things possible that seemed server-only two years ago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Default values matter more than features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tools with pre-filled examples get used immediately.&lt;br&gt;
Tools with empty inputs get closed immediately.&lt;br&gt;
Every single tool now has real, meaningful default data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Tool chaining changes how people work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Added a "Send to →" feature that pipes output from &lt;br&gt;
one tool directly into another. YAML → JSON Formatter &lt;br&gt;
→ JSON Validator in one click. &lt;br&gt;
People stay on the site 3x longer when they chain tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Smart Paste is underrated&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Paste anything — JWT, JSON, SQL, cURL command, &lt;br&gt;
Base64 string — and the site auto-detects the format &lt;br&gt;
and opens the right tool. Sounds simple, surprisingly &lt;br&gt;
useful in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Still broken: LESS → Tailwind mapping (partial output)&lt;br&gt;
Still ugly: Crontab Generator UI&lt;br&gt;
On the list: JSON Schema from TypeScript, &lt;br&gt;
             HTTP Headers Reference,&lt;br&gt;
             More AI-powered explanations&lt;/p&gt;

&lt;p&gt;Link: tooldock.org&lt;/p&gt;

&lt;p&gt;What tools do you reach for daily that aren't there yet?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your framework choice is now your biggest AI cost lever</title>
      <dc:creator>Andrew Rozumny</dc:creator>
      <pubDate>Fri, 27 Mar 2026 11:01:14 +0000</pubDate>
      <link>https://dev.to/andrewrozumny/your-framework-choice-is-now-your-biggest-ai-cost-lever-lml</link>
      <guid>https://dev.to/andrewrozumny/your-framework-choice-is-now-your-biggest-ai-cost-lever-lml</guid>
      <description>&lt;p&gt;The Wasp team published something worth reading today — they gave &lt;br&gt;
Claude Code the exact same feature prompt for two identical apps, one in Next.js and one in Wasp, and measured everything.&lt;/p&gt;

&lt;p&gt;The numbers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Wasp&lt;/th&gt;
&lt;th&gt;Next.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total cost&lt;/td&gt;
&lt;td&gt;$2.87&lt;/td&gt;
&lt;td&gt;$5.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total tokens&lt;/td&gt;
&lt;td&gt;2.5M&lt;/td&gt;
&lt;td&gt;4.0M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API calls&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output tokens (code written)&lt;/td&gt;
&lt;td&gt;5,416&lt;/td&gt;
&lt;td&gt;5,395&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is the interesting one. The AI wrote almost exactly &lt;br&gt;
the same amount of code. But it cost 80% more to do it in Next.js.&lt;/p&gt;

&lt;p&gt;The reason: cache creation and cache reads. Every LLM call re-reads the codebase context from scratch. A bigger codebase means every single turn costs more — not just for reading, but for loading into cache in the first place.&lt;/p&gt;

&lt;p&gt;Next.js cache creation was 113% more expensive. Not because the AI did more. Because it had more boilerplate to read before it could start.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this actually means
&lt;/h2&gt;

&lt;p&gt;We've been evaluating frameworks on DX, performance, and ecosystem.&lt;br&gt;
Add a new one: context efficiency.&lt;/p&gt;

&lt;p&gt;How much of an AI's context window goes to signal (your business logic) vs noise (framework boilerplate)?&lt;/p&gt;

&lt;p&gt;Wasp's declarative config means auth, routing, and jobs are defined in ~10 lines. Next.js equivalent is spread across middleware, route handlers, session files, and API directories. Same result, 4x the tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compounding problem
&lt;/h2&gt;

&lt;p&gt;This test was a single feature. Real apps accumulate features. Every new route, every new model, every new API handler adds to the context that gets re-read on every single LLM call.&lt;/p&gt;

&lt;p&gt;The performance degradation isn't linear either — &lt;a href="https://www.trychroma.com/research/context-rot" rel="noopener noreferrer"&gt;research shows&lt;/a&gt; that AI performance degrades well before the context window fills. &lt;br&gt;
You're not just paying more per call, you're getting worse output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do about it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Measure your codebase token count now.&lt;br&gt;
Run: &lt;code&gt;find . -name "*.ts" -o -name "*.tsx" | xargs wc -c&lt;/code&gt;&lt;br&gt;
That's roughly your AI cost baseline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Audit your boilerplate ratio.&lt;br&gt;
How much of that is business logic vs glue code?&lt;br&gt;
The higher the glue ratio, the worse your AI economics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consider framework choices through this lens.&lt;br&gt;
Wasp, Rails, Laravel — highly opinionated frameworks &lt;br&gt;
have a new advantage they didn't have 2 years ago.&lt;br&gt;
Less boilerplate = cheaper AI = faster iteration.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The irony
&lt;/h2&gt;

&lt;p&gt;The same properties that make a codebase easy for humans to navigate — explicit, verbose, self-documenting — are exactly what's expensive for AI. The abstractions we used to see as "magic" are now genuinely economical.&lt;/p&gt;

&lt;p&gt;I've been thinking about this for ToolDock — a browser-based &lt;br&gt;
dev tools platform I'm building. Every tool page is pure business logic with almost no framework boilerplate, because everything runs statically. The AI token efficiency on it is noticeably better than client projects I've worked on with heavier stacks.&lt;/p&gt;

&lt;p&gt;Worth checking the full Wasp post for the methodology details — they open-sourced both apps and the measurement scripts, which is the right way to publish a benchmark.&lt;/p&gt;

&lt;p&gt;What's your current codebase token count?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>I got tired of pasting sensitive strings into random websites, so I built a browser-based hash generator</title>
      <dc:creator>Andrew Rozumny</dc:creator>
      <pubDate>Tue, 24 Mar 2026 15:49:44 +0000</pubDate>
      <link>https://dev.to/andrewrozumny/i-got-tired-of-pasting-sensitive-strings-into-random-websites-so-i-built-a-browser-based-hash-2754</link>
      <guid>https://dev.to/andrewrozumny/i-got-tired-of-pasting-sensitive-strings-into-random-websites-so-i-built-a-browser-based-hash-2754</guid>
      <description>&lt;p&gt;I work on a few different projects and I hash things constantly — &lt;br&gt;
checking file integrity, debugging password logic, verifying API payloads. For a long time I just googled "md5 generator" or "sha256 online" and used whatever came up first.&lt;/p&gt;

&lt;p&gt;Then one day I actually looked at one of those tools in DevTools. The input was being sent to a server on every keystroke. For MD5 it probably doesn't matter. But I sometimes paste things that are closer to sensitive — partial tokens, config values, test passwords. &lt;br&gt;
That felt dumb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So I built my own.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The SHA family (SHA-1, SHA-256, SHA-512) is natively supported &lt;br&gt;
in the browser via the Web Crypto API:&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="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&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;msgBuffer&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="nx"&gt;message&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;hashBuffer&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;digest&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="nx"&gt;msgBuffer&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;hashArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="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;hashBuffer&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;hashArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;join&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No libraries, no server calls. Just built-in browser APIs.&lt;/p&gt;

&lt;p&gt;MD5 isn't part of Web Crypto (it's considered cryptographically broken, so intentionally excluded), so I inlined a pure-JS implementation — no npm package, no external requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually use it for
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;File checksums&lt;/strong&gt; — when I download something and the provider &lt;br&gt;
lists a SHA-256 hash, I drop the file in and verify it matches. Takes 2 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging auth logic&lt;/strong&gt; — when something in a login flow isn't working and I want to check what hash my backend is actually generating vs what I expect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparing API responses&lt;/strong&gt; — quick way to check if two payloads are identical without reading them character by character.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's part of a bigger thing
&lt;/h2&gt;

&lt;p&gt;I've been building ToolDock — a set of browser-based dev tools I keep open in a pinned tab. JWT decoder, JSON formatter, Base64, regex tester, UUID generator and now hash generator.&lt;/p&gt;

&lt;p&gt;Everything runs locally. No sign-up, no tracking, no server round-trips. I built it because I wanted tools I could actually trust with real data.&lt;/p&gt;

&lt;p&gt;The hash generator is at &lt;a href="https://tooldock.org/tools/hash-generator" rel="noopener noreferrer"&gt;https://tooldock.org/tools/hash-generator&lt;/a&gt; &lt;br&gt;
if it's useful to you. Feedback welcome — especially if there's an algorithm you need that's missing.&lt;/p&gt;

&lt;p&gt;What do you use for quick hashing during development?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tools</category>
      <category>security</category>
    </item>
    <item>
      <title>Why I built my own browser-based dev tools (and why privacy matters more than I thought)</title>
      <dc:creator>Andrew Rozumny</dc:creator>
      <pubDate>Sat, 21 Mar 2026 19:31:24 +0000</pubDate>
      <link>https://dev.to/andrewrozumny/why-i-built-my-own-browser-based-dev-tools-and-why-privacy-matters-more-than-i-thought-2025</link>
      <guid>https://dev.to/andrewrozumny/why-i-built-my-own-browser-based-dev-tools-and-why-privacy-matters-more-than-i-thought-2025</guid>
      <description>&lt;p&gt;I've been a developer for years. Like most people, I had a handful of online tools I used daily — JWT decoders, JSON formatters, Base64 encoders. Open a tab, paste, copy, close.&lt;/p&gt;

&lt;p&gt;Then one day I caught myself pasting a production API token into some random website I'd never heard of.&lt;/p&gt;

&lt;p&gt;I didn't know who built it. I didn't know where my data went. I just trusted it because it showed up in Google search results.&lt;/p&gt;

&lt;p&gt;That bothered me enough to build something better.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;ToolDock is a collection of developer tools that run entirely in your browser. No backend, no accounts, no data sent anywhere. You can verify this yourself — open DevTools Network tab while using any tool and you'll see zero outbound requests with your data.&lt;/p&gt;

&lt;p&gt;Current tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT Decoder&lt;/li&gt;
&lt;li&gt;Base64 Encode/Decode&lt;/li&gt;
&lt;li&gt;JSON Formatter + Validator&lt;/li&gt;
&lt;li&gt;Regex Tester&lt;/li&gt;
&lt;li&gt;CRON Expression Parser&lt;/li&gt;
&lt;li&gt;Color Converter (HEX ↔ RGB ↔ HSL ↔ HSB)&lt;/li&gt;
&lt;li&gt;UUID Generator, Text Diff, Timestamp Converter&lt;/li&gt;
&lt;li&gt;and more (19 total)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned building it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Browser APIs are powerful enough for almost everything.&lt;/strong&gt; JWT decoding, Base64, regex testing, color conversion — none of this needs a server. We just got used to sending data somewhere because it was easier to build that way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy as a feature actually resonates.&lt;/strong&gt; &lt;br&gt;
When I tell developers "your JWT never leaves your browser", I see immediate understanding. They've had the same paranoid moment I had.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SEO for tools is different from SEO for content.&lt;/strong&gt; &lt;br&gt;
Each tool is essentially a landing page for a specific search query. "JWT decode online", "Base64 encoder browser" — these have real search volume and your tool page is the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Adding 2-3 new tools every week. Hash generator, Markdown previewer, Number base converter are next.&lt;/p&gt;

&lt;p&gt;If you want to check it out: tooldock.org&lt;/p&gt;

&lt;p&gt;And if there's a tool you wish existed as a private browser-based version — I'd genuinely love to hear it in the comments.&lt;/p&gt;




&lt;p&gt;Built with Next.js + TypeScript + Tailwind, &lt;br&gt;
deployed on Vercel. Happy to answer any &lt;br&gt;
technical questions.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>privacy</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
