<?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: 4min</title>
    <description>The latest articles on DEV Community by 4min (@4min).</description>
    <link>https://dev.to/4min</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%2F4144672%2F4c0fd54c-1e00-4bc6-bd9c-2aec68474129.png</url>
      <title>DEV Community: 4min</title>
      <link>https://dev.to/4min</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/4min"/>
    <language>en</language>
    <item>
      <title>160 browser-only tools later: the engineering decisions that actually mattered</title>
      <dc:creator>4min</dc:creator>
      <pubDate>Sun, 27 Sep 2026 19:14:29 +0000</pubDate>
      <link>https://dev.to/4min/160-browser-only-tools-later-the-engineering-decisions-that-actually-mattered-34k6</link>
      <guid>https://dev.to/4min/160-browser-only-tools-later-the-engineering-decisions-that-actually-mattered-34k6</guid>
      <description>&lt;p&gt;My last post was the tour — the tools, the categories, why everything runs in your browser. This one is the sticky stuff: the decisions that cost me the most time, so you can skip them.&lt;/p&gt;

&lt;p&gt;Stack in one sentence. Next.js 14 App Router, TypeScript, Tailwind. Every tool is a client component, there is no backend, and the whole site is pre-rendered at build time — 399 static pages today (160 tools in EN + TR, 24 guides per locale, categories, static pages).&lt;/p&gt;

&lt;p&gt;Bilingual without duplicating routes. One [locale] segment serves both languages from the same code. The trap: hand-writing URLs. I keep every path builder in one paths.ts module — a tool page lives at /tools/slug in EN and /tr/tools/slug in TR, and nothing else in the codebase ever constructs a URL string. Changing a convention changes one file, not one hundred.&lt;/p&gt;

&lt;p&gt;hreflang + canonical on every page. Both variants of each page declare their alternate, and canonical points at the same-locale version. It sounds obvious; shipping it uniformly across dynamic routes is where it takes discipline.&lt;/p&gt;

&lt;p&gt;The sitemap is code, not a file. app/sitemap.ts walks the same tools/guides data as the routes, so a new tool or guide is in the sitemap the moment it's merged — no generator step to forget, no stale 118-URL file. I set revalidate = 86400 so crawlers see fresh lastModified. It's at 392 URLs now and always matches what's deployed. That alone removed an entire class of "forgot to regenerate" bugs.&lt;/p&gt;

&lt;p&gt;The interchange gotcha nobody talks about. The deployment target forced an old TypeScript output setting, and it made 2026 libraries squeal: no \u{...} regex (TS1501), no spread on matchAll tuples, no BigInt literals, and crypto.subtle.importKey wants a different buffer type than you'd expect. Two tools badly needed \u — for emoji stripping and reading-time estimation — so I replaced them with explicit code-point range loops. It's more verbose and more correct; honestly, I stopped noticing.&lt;/p&gt;

&lt;p&gt;The consistency check that saves the build. With 160 tools there are three registries that must agree: the tool list, the component map, and the icon map. One forgotten import used to fail the build halfway through. Now a check-tools script runs before every build and fails in two seconds with the exact name — build passes, or it tells you exactly what to fix first.&lt;/p&gt;

&lt;p&gt;Why "no backend" is the feature, not the limitation. No server logs to audit, no retention policy to write, no "we'll store that for analytics" conversation. It also means the tools work on a bad connection or an air-gapped machine, because the logic is plain JavaScript in the front end.&lt;/p&gt;

&lt;p&gt;If you're building a similar collection, the three things I'd copy: dynamic sitemap from route data, a single path module, and a registry consistency check. Everything else is ordinary React.&lt;/p&gt;

&lt;p&gt;The whole thing: &lt;a href="https://www.freetoolsy.com" rel="noopener noreferrer"&gt;https://www.freetoolsy.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dev-focused picks: &lt;a href="https://www.freetoolsy.com/tools/json-formatter" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt;, &lt;a href="https://www.freetoolsy.com/tools/jwt-decoder" rel="noopener noreferrer"&gt;JWT Decoder&lt;/a&gt;, &lt;a href="https://www.freetoolsy.com/tools/cron-tester" rel="noopener noreferrer"&gt;Cron Tester&lt;/a&gt;, &lt;a href="https://www.freetoolsy.com/tools/sitemap-url-extractor" rel="noopener noreferrer"&gt;Sitemap URL Extractor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you ever wondered about &lt;a href="https://www.freetoolsy.com/rehber/what-is-hreflang-multilingual-seo" rel="noopener noreferrer"&gt;hreflang&lt;/a&gt; or &lt;a href="https://www.freetoolsy.com/rehber/how-to-write-robots-txt" rel="noopener noreferrer"&gt;robots.txt&lt;/a&gt;, the guides cover them in depth.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Free dev tools that run entirely in your browser (no uploads, no signup)</title>
      <dc:creator>4min</dc:creator>
      <pubDate>Sat, 26 Sep 2026 17:41:41 +0000</pubDate>
      <link>https://dev.to/4min/free-dev-tools-that-run-entirely-in-your-browser-no-uploads-no-signup-2n6n</link>
      <guid>https://dev.to/4min/free-dev-tools-that-run-entirely-in-your-browser-no-uploads-no-signup-2n6n</guid>
      <description>&lt;p&gt;I have a bad habit of opening the same five browser tabs every time I work with JSON, want a strong password, or need to compress a screenshot before a PR. For the longest time those tabs were a mix of different sites — some behind signup walls, some that upload whatever you paste, a few with more ads than actual functionality.&lt;/p&gt;

&lt;p&gt;So I built a small collection of my own. It started with a JSON formatter and a character counter, and slowly grew into &lt;a href="https://www.freetoolsy.com" rel="noopener noreferrer"&gt;FreeToolsy&lt;/a&gt; — 90+ free tools for text, security, developer work, images and calculations.&lt;/p&gt;

&lt;p&gt;The one rule that matters: &lt;strong&gt;everything runs in your browser&lt;/strong&gt;. Nothing you paste or upload ever leaves your device, and there's no account to create.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ones I actually use daily
&lt;/h2&gt;

&lt;h3&gt;
  
  
  JSON &amp;amp; data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/json-formatter" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt; — validates and prettifies JSON, points at the exact line of a syntax error. This is the tab that never closes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/json-csv-converter" rel="noopener noreferrer"&gt;JSON to CSV&lt;/a&gt; — when someone puts 10k rows of API response in a ticket and asks for "an Excel file".&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/jwt-decoder" rel="noopener noreferrer"&gt;JWT Decoder&lt;/a&gt; — decode the token, eyeball the claims, no need to trust a third-party site with your token. Perfect for local dev.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/unix-timestamp-converter" rel="noopener noreferrer"&gt;Unix Timestamp Converter&lt;/a&gt; — the "what the heck is 1982880000" tool.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/base64" rel="noopener noreferrer"&gt;Base64&lt;/a&gt; — encode/decode with the whole format table, handy for data URIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/password-generator" rel="noopener noreferrer"&gt;Password Generator&lt;/a&gt; — customizable length and character sets, generated locally.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/password-strength-checker" rel="noopener noreferrer"&gt;Strength Checker&lt;/a&gt; — the "nope, don't use that" second opinion before you reuse a password.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/sha-hash-generator" rel="noopener noreferrer"&gt;SHA Hash Generator&lt;/a&gt; — MD5/SHA-1/SHA-256/SHA-512, hashed client-side.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Text &amp;amp; clean-up
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/duplicate-line-remover" rel="noopener noreferrer"&gt;Duplicate Line Remover&lt;/a&gt; — sorting a messy list of IDs or package names.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/text-diff" rel="noopener noreferrer"&gt;Text Diff&lt;/a&gt; — quick "what changed between these two configs" check without spin up a diff tool.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/slug-generator" rel="noopener noreferrer"&gt;Slug Generator&lt;/a&gt; — before writing a new route or blog post.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/regex-tester" rel="noopener noreferrer"&gt;Regex Tester&lt;/a&gt; — match, explain and test against a sample live.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Scheduling &amp;amp; config
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/cron-tester" rel="noopener noreferrer"&gt;Cron Tester&lt;/a&gt; — the one I reach for most when a background job "runs sometimes": expands the schedule into human-readable timestamps.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/ai-token-counter" rel="noopener noreferrer"&gt;AI Token Counter&lt;/a&gt; — quick estimate of prompt cost before you hit the API.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/wcag-contrast-checker" rel="noopener noreferrer"&gt;WCAG Contrast Checker&lt;/a&gt; — because "it looks fine" is not an arbitrary standard.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Images
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/image-compressor" rel="noopener noreferrer"&gt;Image Compressor&lt;/a&gt; — shrink a JPEG/PNG/WebP before pushing it into a PR. Nothing gets uploaded.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/image-resizer" rel="noopener noreferrer"&gt;Image Resizer&lt;/a&gt; — resize to exact px or by percentage.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freetoolsy.com/tools/image-to-base64" rel="noopener noreferrer"&gt;Image to Base64&lt;/a&gt; — for inlining small assets directly into code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why "runs in your browser" is the whole point
&lt;/h2&gt;

&lt;p&gt;A paste-anything-anywhere site is fine for throwaway data, but not for tokens, API keys, private configs or employee data. For a dev workflow, client-side execution changes the trust equation: no server logs, no retention policy to think about, no "we'll store this for analytics". It also means the thing still works on a flaky connection or an air-gapped machine — offline-friendly since most logic is plain JS.&lt;/p&gt;

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

&lt;p&gt;I keep adding tools as I run into boring repetitive jobs, and each one includes a short guide. If you have a tool you use every single day or a gripe about the collection, I'd genuinely appreciate a suggestion — I'd rather build what people actually miss than a hundred tools nobody opens.&lt;/p&gt;

&lt;p&gt;The whole thing is free and open to use: &lt;a href="https://www.freetoolsy.com" rel="noopener noreferrer"&gt;FreeToolsy&lt;/a&gt;. And if you want the reasoning behind one of the tools, the guides section covers things like &lt;a href="https://www.freetoolsy.com/rehber/what-is-a-qr-code" rel="noopener noreferrer"&gt;what a QR code actually is&lt;/a&gt; and &lt;a href="https://www.freetoolsy.com/rehber/what-is-json-formatter" rel="noopener noreferrer"&gt;how JSON formatters structure data&lt;/a&gt;.&lt;/p&gt;

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