<?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: Mert Topal</title>
    <description>The latest articles on DEV Community by Mert Topal (@merrt).</description>
    <link>https://dev.to/merrt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3048324%2Fef70199f-7857-4c04-b2a1-4b505d803dee.png</url>
      <title>DEV Community: Mert Topal</title>
      <link>https://dev.to/merrt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/merrt"/>
    <language>en</language>
    <item>
      <title>20+ dev tools that run entirely in the browser</title>
      <dc:creator>Mert Topal</dc:creator>
      <pubDate>Fri, 31 Jul 2026 19:57:46 +0000</pubDate>
      <link>https://dev.to/merrt/20-dev-tools-that-run-entirely-in-the-browser-7bi</link>
      <guid>https://dev.to/merrt/20-dev-tools-that-run-entirely-in-the-browser-7bi</guid>
      <description>&lt;p&gt;You paste a JWT into some online decoder to check a claim, and a second later it hits you: that token just went to a server you know nothing about. Is it logged? No idea. Same story with pasting JSON, an API response, whatever, into a random tool site covered in trackers and cookie banners. You never really know what happens to what you typed.&lt;/p&gt;

&lt;p&gt;So I put the tools I actually use into one page where that isn't a question: &lt;a href="https://tools.merrt.com.tr" rel="noopener noreferrer"&gt;tools.merrt.com.tr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything runs in your browser. Nothing you paste leaves the page, there's no backend, no cookies following you around, and it works offline (it's a PWA).&lt;/p&gt;

&lt;p&gt;What's in there so far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON formatter that actually tells you the line and column when your JSON is broken&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tools.merrt.com.tr/jwt" rel="noopener noreferrer"&gt;JWT decoder&lt;/a&gt; with signature verification (HS/RS/ES/PS, using Web Crypto)&lt;/li&gt;
&lt;li&gt;Diff checker for text, JSON or XML, split or unified view&lt;/li&gt;
&lt;li&gt;Hash generator (MD5 + SHA family), works on files too&lt;/li&gt;
&lt;li&gt;JSON &amp;lt;-&amp;gt; XML, YAML &amp;lt;-&amp;gt; JSON, CSV -&amp;gt; JSON converters&lt;/li&gt;
&lt;li&gt;the usual base64 / url encode / regex tester / cron / uuid / color stuff&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The annoying part was SEO. It's a React SPA, and SPAs are bad for search because every route serves the same empty HTML shell. So I wrote a little prerender step that outputs a real static HTML file per route at build time (each with its own title, meta and content), and the app just takes over once it loads. That way every tool is its own crawlable page but it still behaves like an SPA.&lt;/p&gt;

&lt;p&gt;Deployed on Cloudflare Pages. Code is here if you want to poke at it: &lt;a href="https://github.com/merrttopal/open-tools" rel="noopener noreferrer"&gt;https://github.com/merrttopal/open-tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Curious what people would add or what breaks for you.&lt;/p&gt;

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