<?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: Praveen Maurya</title>
    <description>The latest articles on DEV Community by Praveen Maurya (@iprvn).</description>
    <link>https://dev.to/iprvn</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%2F4002861%2F4206c8ce-672e-4cc3-abef-e260a4680750.jpeg</url>
      <title>DEV Community: Praveen Maurya</title>
      <link>https://dev.to/iprvn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iprvn"/>
    <language>en</language>
    <item>
      <title>UUID Versions Explained: Which One Should You Actually Use?</title>
      <dc:creator>Praveen Maurya</dc:creator>
      <pubDate>Thu, 17 Sep 2026 18:19:37 +0000</pubDate>
      <link>https://dev.to/iprvn/uuid-versions-explained-which-one-should-you-actually-use-2k8g</link>
      <guid>https://dev.to/iprvn/uuid-versions-explained-which-one-should-you-actually-use-2k8g</guid>
      <description>&lt;p&gt;Whether you're building APIs, databases, or distributed systems, UUIDs are everywhere. They usually look something like this::&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f47ac10b-58cc-4372-a567-0e02b2c3d479
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everyone knows what they look like, but almost nobody can confidently answer the question: &lt;strong&gt;which UUID version should I use?&lt;/strong&gt; UUID v1? v4? v7? What happened to v2, v3, v5, and the brand new v6, v7, v8?&lt;/p&gt;

&lt;p&gt;The confusion is completely justified. RFC 4122 standardized the widely used UUID versions (v1, v3, v4, and v5), while v2 came from the older DCE specification. RFC 9562 (2024) later added v6, v7, and v8. Each version exists for a reason, and picking the wrong one has real consequences — especially when your UUID is going to be a &lt;strong&gt;primary key in a database&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post breaks down every version, when to use it, when to avoid it, and — most importantly for database folks — which ones play nicely with indexes and which ones will silently wreck your query performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  First: What Is a UUID, Exactly?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;UUID&lt;/strong&gt; (Universally Unique Identifier) is a &lt;strong&gt;128-bit&lt;/strong&gt; identifier. It is usually written as &lt;strong&gt;32 hexadecimal digits&lt;/strong&gt; grouped into five sections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xxxxxxxx-xxxx-Axxx-Bxxx-xxxxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two of those digits are special:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt; (the first digit of the third group) is the &lt;strong&gt;version&lt;/strong&gt; — it tells you which algorithm produced the UUID. &lt;code&gt;1&lt;/code&gt; = v1, &lt;code&gt;4&lt;/code&gt; = v4, &lt;code&gt;7&lt;/code&gt; = v7, and so on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B&lt;/strong&gt; (the first digit of the fourth group) is the &lt;strong&gt;variant&lt;/strong&gt; — almost always &lt;code&gt;8&lt;/code&gt;, &lt;code&gt;9&lt;/code&gt;, &lt;code&gt;a&lt;/code&gt;, or &lt;code&gt;b&lt;/code&gt;. You rarely need to think about this one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you can identify any UUID's version at a glance. Look at that third group:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f47ac10b-58cc-1e2b-9e96-0800200c9a66&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;79ee8720-8ff9-21f1-80f6-d73a18d6a4c2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f47ac10b-58cc-3e2b-9e96-0800200c9a66&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f47ac10b-58cc-4e2b-8b6d-0e02b2c3d479&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f47ac10b-58cc-5e2b-8b6d-0e02b2c3d479&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f47ac10b-58cc-6e2b-9e96-0800200c9a66&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;01890f3a-2a7a-7e2b-9e96-0e02b2c3d479&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v8&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f47ac10b-58cc-8e2b-9e96-0e02b2c3d479&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Those are illustrative examples so you can see the version digit clearly.)&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Version by Version
&lt;/h2&gt;

&lt;p&gt;You can use this tool to generate any uuid version from here &lt;a href="https://safedevtools.com/uuid-generator/" rel="noopener noreferrer"&gt;https://safedevtools.com/uuid-generator/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  UUID v1 — Time-Based + MAC Address
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; v1 combines a 60-bit &lt;strong&gt;timestamp&lt;/strong&gt; (100-nanosecond intervals since 1582), a &lt;strong&gt;clock sequence&lt;/strong&gt;, and the generating machine's &lt;strong&gt;MAC address&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;f47ac10b-58cc-1e2b-9e96-0800200c9a66
        timestamp        MAC address
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Roughly sortable in generation order — newer UUIDs tend to be bigger than older ones.&lt;/li&gt;
&lt;li&gt;Unique without any randomness guessing game (per machine).&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;
&lt;strong&gt;Leaks information.&lt;/strong&gt; Anyone who sees the UUID learns the machine's MAC address and an approximate creation time. That's a genuine security concern.&lt;/li&gt;
&lt;li&gt;Only &lt;em&gt;roughly&lt;/em&gt; sequential; the timestamp doesn't strictly increase between UUIDs from different machines.&lt;/li&gt;
&lt;li&gt;Traditionally uses the machine's MAC address, although modern implementations often substitute a randomly generated node identifier to avoid leaking hardware information.
&lt;strong&gt;Best for:&lt;/strong&gt; Legacy systems that already use v1, or cases where you genuinely need time ordering &lt;em&gt;and&lt;/em&gt; don't care about leaking machine identity. For almost everything else, prefer v7.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Database verdict:&lt;/strong&gt; Better than v4 for indexes (values trend upward), but the information leak and imperfect ordering make it a poor default.&lt;/p&gt;




&lt;h3&gt;
  
  
  UUID v2 — DCE Security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; This is v1 plus a &lt;strong&gt;POSIX UID/GID&lt;/strong&gt; of the local user, intended for DCE (Distributed Computing Environment) security contexts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Essentially none for general use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; It is &lt;strong&gt;rarely implemented&lt;/strong&gt; — most libraries don't even ship it, and RFC 4122 itself barely covers it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Almost nothing. If you reach for v2, stop and pick v7 instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database verdict:&lt;/strong&gt; Treat as unavailable. You'll struggle to even find a library that generates it.&lt;/p&gt;




&lt;h3&gt;
  
  
  UUID v3 — Name-Based, MD5
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; v3 derives the UUID deterministically from a &lt;strong&gt;namespace&lt;/strong&gt; plus a &lt;strong&gt;name&lt;/strong&gt;, hashed with &lt;strong&gt;MD5&lt;/strong&gt;. Same namespace + same name = same UUID, every single time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace: DNS  →  6ba7b810-9dad-11d1-80b4-00c04fd430c8
name:      "example.com"
result:    v3 UUID (always the same value)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic&lt;/strong&gt; — no randomness, no storage needed to look up an existing ID.&lt;/li&gt;
&lt;li&gt;Great for generating a stable identifier from something you already have (a URL, an email, a username).&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;MD5 is weak by modern standards.&lt;/li&gt;
&lt;li&gt;Not unique per row by itself — if two rows map to the same name, they get the same UUID.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Situations where you want the same entity to always resolve to the same ID across systems without a lookup table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database verdict:&lt;/strong&gt; Fine as a stable foreign key if your "name" is genuinely unique, but it does not help with ordering or index performance.&lt;/p&gt;




&lt;h3&gt;
  
  
  UUID v4 — Random
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; v4 just generates &lt;strong&gt;122 random bits&lt;/strong&gt; (the other 6 are fixed version/variant bits). That's it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f47ac10b-58cc-4e2b-8b6d-0e02b2c3d479
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Secure&lt;/strong&gt; — cryptographically strong randomness means nothing about your machine, time, or user is exposed.&lt;/li&gt;
&lt;li&gt;Trivially simple to generate; it's the default in nearly every language and library.&lt;/li&gt;
&lt;li&gt;Collision probability is effectively zero (122 random bits).&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;
&lt;strong&gt;Completely random order.&lt;/strong&gt; This is the big one for databases (see below).&lt;/li&gt;
&lt;li&gt;Not sortable, not predictable, not compressible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Public-facing identifiers, security tokens, event IDs, and any case where you want an opaque identifier with zero information leakage. It is the classic "default" for a reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database verdict:&lt;/strong&gt; ⚠️ &lt;strong&gt;The worst choice for large table indexes.&lt;/strong&gt; Random values inserted into a B-tree index cause &lt;strong&gt;page splits&lt;/strong&gt; — every insert lands at a random position, forcing the database to reorder pages. With millions of rows this can cause dramatic index fragmentation, slower writes, and poor cache locality.&lt;/p&gt;




&lt;h3&gt;
  
  
  UUID v5 — Name-Based, SHA-1
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Identical concept to v3, but uses the stronger &lt;strong&gt;SHA-1&lt;/strong&gt; hash instead of MD5.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace: URL  →  6ba7b811-9dad-11d1-80b4-00c04fd430c8
name:      "https://example.com/posts/42"
result:    v5 UUID (always the same value)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Deterministic, like v3, but with a better hash.&lt;/li&gt;
&lt;li&gt;Stable across systems.&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;Same determinism caveat: identical inputs → identical UUID.&lt;/li&gt;
&lt;li&gt;SHA-1 is also showing its age, though it's fine for this non-security use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Exactly the same use cases as v3 — stable IDs derived from names. Prefer v5 over v3 when your library supports both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database verdict:&lt;/strong&gt; Same as v3 — acceptable for stable keys, useless for ordering.&lt;/p&gt;




&lt;h3&gt;
  
  
  UUID v6 — Time-Ordered (Reordered v1)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; v6 takes the v1 timestamp bits and &lt;strong&gt;reorders them so the most significant bits come first&lt;/strong&gt;. This makes the UUIDs &lt;em&gt;actually&lt;/em&gt; sortable in time order, fixing v1's biggest weakness.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Truly sortable&lt;/strong&gt; — lexicographic order matches time order.&lt;/li&gt;
&lt;li&gt;Keeps the information content of v1.&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;Like v1, it can reveal timestamp information and may expose the node identifier if a real MAC address is used.&lt;/li&gt;
&lt;li&gt;Much newer and less widely supported than v7.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Systems that want time-ordered IDs but can't move to v7 yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database verdict:&lt;/strong&gt; Good for indexes — values insert in near-sequential order, minimizing page splits. But v7 is generally the better modern pick.&lt;/p&gt;




&lt;h3&gt;
  
  
  UUID v7 — Time-Ordered, Unix Timestamp (Recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; v7 puts a 48-bit &lt;strong&gt;Unix timestamp (milliseconds)&lt;/strong&gt; in the high bits and fills the rest with random data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01890f3a-2a7a-7e2b-9e96-0e02b2c3d479
↑ millisecond timestamp ↑  ↑ random bits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sortable by creation time&lt;/strong&gt; → plays beautifully with database indexes.&lt;/li&gt;
&lt;li&gt;Random tail bits → high entropy, low collision risk.&lt;/li&gt;
&lt;li&gt;Does not expose machine identity, though it does reveal the approximate creation time.&lt;/li&gt;
&lt;li&gt;Standardized in 2024 (RFC 9562) and now the recommended choice for new systems.&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;Newer; some older libraries and databases don't support it yet (though support is spreading fast).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; &lt;strong&gt;Primary keys, database rows, and anything that lives in an indexed column.&lt;/strong&gt; This is the modern default for new applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database verdict:&lt;/strong&gt; ✅ &lt;strong&gt;Excellent.&lt;/strong&gt; Sequential inserts mean B-tree indexes stay compact, writes are fast, and range queries by time become trivial.&lt;/p&gt;




&lt;h3&gt;
  
  
  UUID v8 — Custom / Experimental
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; v8 is the "bring your own" version. It reserves the version digit for &lt;strong&gt;custom, vendor-defined layouts&lt;/strong&gt; — you decide what the bits mean.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Maximum flexibility for proprietary schemes.&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;Zero portability — only your system understands the format.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Internal, single-vendor systems with very specific needs. Not something most projects should touch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database verdict:&lt;/strong&gt; Entirely depends on how you design the layout. If you design it to be sortable, it can index well; otherwise, it's a coin flip.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Database / Indexing Cheat Sheet
&lt;/h2&gt;

&lt;p&gt;If you're choosing a UUID for a &lt;strong&gt;primary key or an indexed column&lt;/strong&gt;, this is the table that matters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Sortable / Index-friendly&lt;/th&gt;
&lt;th&gt;Information leak&lt;/th&gt;
&lt;th&gt;Typical use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;Roughly&lt;/td&gt;
&lt;td&gt;Yes (time + MAC)&lt;/td&gt;
&lt;td&gt;Legacy time-based systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v2&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Rarely used (DCE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v3&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No (deterministic)&lt;/td&gt;
&lt;td&gt;Stable ID from a name (MD5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Opaque IDs, tokens, default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v5&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No (deterministic)&lt;/td&gt;
&lt;td&gt;Stable ID from a name (SHA-1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (time + MAC)&lt;/td&gt;
&lt;td&gt;Sortable legacy replacement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Timestamp only&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;New databases / primary keys&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v8&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Vendor-specific schemes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The short rules of thumb
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;New system with a database?&lt;/strong&gt; → &lt;strong&gt;v7.&lt;/strong&gt; Sequential inserts, great indexes, no privacy leak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opaque, non-database identifier&lt;/strong&gt; (API key, event ID, public token)? → &lt;strong&gt;v4.&lt;/strong&gt; Random and private.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same entity must map to the same ID everywhere&lt;/strong&gt; (e.g., a user's ID derived from their email across services)? → &lt;strong&gt;v5&lt;/strong&gt; (or v3 if you're stuck on old libraries).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You already have v1 in production?&lt;/strong&gt; → &lt;strong&gt;v6&lt;/strong&gt; is the drop-in sortable upgrade.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why random UUIDs (v4) hurt database performance
&lt;/h3&gt;

&lt;p&gt;A typical B-tree index stores keys in sorted order. When you insert a &lt;strong&gt;random&lt;/strong&gt; value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The database has to find the &lt;em&gt;middle&lt;/em&gt; of the tree, split pages, and shuffle data.&lt;/li&gt;
&lt;li&gt;Repeated random inserts cause &lt;strong&gt;index fragmentation&lt;/strong&gt; and bloated pages.&lt;/li&gt;
&lt;li&gt;Write throughput degrades, and the index becomes much bigger than it needs to be.&lt;/li&gt;
&lt;li&gt;Cached index pages are used inefficiently because consecutive inserts touch random pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the single most common UUID mistake in production. It doesn't matter at 1,000 rows — it absolutely matters at 10 million.&lt;/p&gt;

&lt;p&gt;If you need a UUID that &lt;em&gt;also&lt;/em&gt; tells you when it was created, &lt;strong&gt;v7 gives you time ordering and database friendliness without the security downsides of v1/v6&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Note on Alternatives
&lt;/h2&gt;

&lt;p&gt;UUIDs aren't the only option. You'll also hear about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ULID&lt;/strong&gt; — a v7-style "sortable, readable ID" with a timestamp prefix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake / Twitter Snowflake IDs&lt;/strong&gt; — 64-bit time+worker IDs, great for high-scale distributed systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NanoID&lt;/strong&gt; — smaller URL-safe strings; friendly but not natively sorted or native to most databases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequential integers / IDENTITY columns&lt;/strong&gt; — simplest, best index performance, but globally guessable and hard to merge across systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The great thing about UUID &lt;strong&gt;v7&lt;/strong&gt; is that it gives you most of the benefits of ULID/Snowflake (time ordering + compactness + index-friendliness) while staying within the standard, universally supported UUID format.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v4&lt;/strong&gt; — random, private, the classic default; &lt;strong&gt;bad for database indexes at scale&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v1 / v6&lt;/strong&gt; — time-based; sortable-ish, but &lt;strong&gt;leak MAC address + time&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v3 / v5&lt;/strong&gt; — deterministic from a name; use for stable IDs, not for ordering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v7&lt;/strong&gt; — timestamp + random; &lt;strong&gt;the modern choice for primary keys and indexed columns&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v8&lt;/strong&gt; — custom; only for vendor-specific schemes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When in doubt, reach for &lt;strong&gt;v7&lt;/strong&gt; if it will live in a database, and &lt;strong&gt;v4&lt;/strong&gt; if it will live in the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  You can generate uuid from V1 to V8 from here:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://safedevtools.com/uuid-generator/" rel="noopener noreferrer"&gt;https://safedevtools.com/uuid-generator/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy identifying. 🆔&lt;/p&gt;

</description>
      <category>uuid</category>
      <category>uuidv4</category>
      <category>uuidv7</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building with Local LLMs: An Engineer's Approach to AI-Assisted Development</title>
      <dc:creator>Praveen Maurya</dc:creator>
      <pubDate>Sat, 18 Jul 2026 20:04:50 +0000</pubDate>
      <link>https://dev.to/iprvn/building-with-local-llms-an-engineers-approach-to-ai-assisted-development-28po</link>
      <guid>https://dev.to/iprvn/building-with-local-llms-an-engineers-approach-to-ai-assisted-development-28po</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I didn't build SafeDevTools by asking AI to "build me a website." I built it by treating a local LLM like a junior engineer who never gets tired of writing boilerplate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few weeks ago, I challenged myself with a simple experiment:&lt;br&gt;
&lt;strong&gt;Could I build a production-ready product using nothing but a local LLM?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  No Claude Code.&lt;/li&gt;
&lt;li&gt;  No Cursor.&lt;/li&gt;
&lt;li&gt;  No API credits.&lt;/li&gt;
&lt;li&gt;  No cloud AI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just: &lt;strong&gt;VS Code, Ollama (Gemma 4:12B), my MacBook M4 Pro, and a lot of software engineering experience.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The result was &lt;strong&gt;SafeDevTools&lt;/strong&gt; — a collection of privacy-first developer utilities that run entirely in the browser.&lt;br&gt;
👉 &lt;a href="https://safedevtools.com" rel="noopener noreferrer"&gt;https://safedevtools.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wrote about the technical "How-To" in my previous article:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://dev.to/iprvn/how-i-built-a-premium-developer-tools-website-using-only-a-local-llm-gemma-412b-ollama-vs-40ni"&gt;How I Built a Premium Developer Tools Website Using Only a Local LLM (Gemma 4:12B + Ollama + VS Code)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This article is about the mental shift.&lt;/strong&gt; It’s about how I changed the way I think about software development after building this product.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Biggest Misconception About AI Coding
&lt;/h1&gt;

&lt;p&gt;Every week, social media is flooded with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"AI built an entire SaaS in 24 hours."&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"AI replaces software engineers."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These videos are entertaining, but they miss the point. After spending weeks building a real product with a local model, I realized that the value of AI isn't replacing the engineer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The value of AI is replacing repetitive engineering work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is a massive distinction. One is about &lt;em&gt;replacement&lt;/em&gt;; the other is about &lt;em&gt;leverage&lt;/em&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Evolution of a Software Engineer
&lt;/h1&gt;

&lt;p&gt;Think about your first few years as a developer. Most of your day was spent asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;"How do I write this loop?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;"Why is my CSS broken?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;"How do I call this API?"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back then, &lt;strong&gt;writing code &lt;em&gt;was&lt;/em&gt; the job.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast forward a few years. Your role has shifted. You spend your time thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Architecture &amp;amp; Scalability&lt;/li&gt;
&lt;li&gt;  Security &amp;amp; Maintainability&lt;/li&gt;
&lt;li&gt;  Developer Experience (DX)&lt;/li&gt;
&lt;li&gt;  Deployment Strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The irony?&lt;/strong&gt; Despite becoming responsible for high-level system design, you are still often tasked with writing hundreds of lines of repetitive "grunt work."&lt;/p&gt;

&lt;p&gt;The CRUD endpoints. The validation logic. The DTOs. The unit tests. The accessibility attributes. &lt;/p&gt;

&lt;p&gt;The code isn't always difficult—it’s just &lt;strong&gt;repetitive.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  The Realization: Repeating Yourself
&lt;/h1&gt;

&lt;p&gt;SafeDevTools consists of multiple utilities. Every tool follows the same design language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Responsive layout &amp;amp; Dark mode&lt;/li&gt;
&lt;li&gt;  Accessibility (A11y) standards&lt;/li&gt;
&lt;li&gt;  SEO Metadata&lt;/li&gt;
&lt;li&gt;  JavaScript validation&lt;/li&gt;
&lt;li&gt;  Consistent styling &amp;amp; Copy buttons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I could have written every page manually. But by the third or fourth tool, I realized something: &lt;strong&gt;I wasn't solving engineering problems anymore; I was repeating myself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is where the local LLM became my superpower. Not because it "invented" the tools, but because it &lt;strong&gt;executed the repetition&lt;/strong&gt; with perfect consistency.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Architect vs. The Builder
&lt;/h1&gt;

&lt;p&gt;A key takeaway from this project was learning to separate &lt;strong&gt;Intent&lt;/strong&gt; from &lt;strong&gt;Execution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I found that the most effective workflow is for the human to remain the &lt;strong&gt;Architect&lt;/strong&gt; (Vision, Design, and Standards) while the AI serves as the &lt;strong&gt;Builder&lt;/strong&gt; (Repetitive Tasks, Boilerplate, and Testing).&lt;/p&gt;

&lt;h3&gt;
  
  
  🏗️ My Responsibilities (The Architect)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Product Vision &amp;amp; UX Decisions&lt;/li&gt;
&lt;li&gt;  System Architecture &amp;amp; Folder Structure&lt;/li&gt;
&lt;li&gt;  Coding Standards &amp;amp; Design Systems&lt;/li&gt;
&lt;li&gt;  Security &amp;amp; Performance Review&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ The Model's Responsibilities (The Builder)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Generating implementation details&lt;/li&gt;
&lt;li&gt;  Writing boilerplate and repetitive logic&lt;/li&gt;
&lt;li&gt;  Drafting documentation&lt;/li&gt;
&lt;li&gt;  Refactoring for readability&lt;/li&gt;
&lt;li&gt;  Generating unit tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The mindset shift:&lt;/strong&gt; The model isn't making product decisions. It is implementing &lt;em&gt;my&lt;/em&gt; decisions.&lt;/p&gt;




&lt;h1&gt;
  
  
  How to Stop Asking AI to "Build Products"
&lt;/h1&gt;

&lt;p&gt;If you want better results, stop using "God-mode" prompts like: &lt;br&gt;
&lt;em&gt;"Build me a dashboard."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Instead, treat the LLM as an &lt;strong&gt;implementation engine&lt;/strong&gt;. Use specific, measurable engineering tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;"Generate this Go repository implementation based on these interfaces."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;"Build this HTML page following our existing design system."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;"Add accessibility improvements without changing the layout."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;"Refactor this function while keeping the public API identical."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; These are smaller, discrete tasks. They are exactly where smaller local models perform surprisingly well.&lt;/p&gt;




&lt;h1&gt;
  
  
  The "Small Context" Secret
&lt;/h1&gt;

&lt;p&gt;Early on, I made the mistake of feeding the model my entire project folder. The results were messy and hallucinatory. &lt;/p&gt;

&lt;p&gt;I learned that instead of &lt;strong&gt;increasing&lt;/strong&gt; the prompt size, I needed to &lt;strong&gt;reduce&lt;/strong&gt; the problem scope. Give the model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; One component.&lt;/li&gt;
&lt;li&gt; One interface.&lt;/li&gt;
&lt;li&gt; One objective.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The smaller the context, the higher the quality of the output. This forced me to be a better architect because I had to define the boundaries more clearly before asking for code.&lt;/p&gt;




&lt;h1&gt;
  
  
  Your Documentation IS Your Superpower
&lt;/h1&gt;

&lt;p&gt;This was my most unexpected "Aha!" moment. The secret wasn't a complex prompt; it was &lt;strong&gt;Standard Operating Procedures (SOPs).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started documenting everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Project structure rules&lt;/li&gt;
&lt;li&gt;  UI/Naming conventions&lt;/li&gt;
&lt;li&gt;  Accessibility requirements&lt;/li&gt;
&lt;li&gt;  JavaScript patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually, this evolved into a reusable set of instructions that acted as the "Source of Truth." Once the model understood my project's &lt;strong&gt;rules&lt;/strong&gt;, every new tool became easier to generate. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The documentation became more valuable than any prompt.&lt;/strong&gt; The AI stopped guessing and started following orders.&lt;/p&gt;




&lt;h1&gt;
  
  
  Treat Your Local LLM Like a Junior Engineer
&lt;/h1&gt;

&lt;p&gt;This is the ultimate mental model. &lt;/p&gt;

&lt;p&gt;Imagine a talented junior developer joins your team today. You wouldn't tell them: &lt;em&gt;"Build our entire platform."&lt;/em&gt; They would be overwhelmed and fail.&lt;/p&gt;

&lt;p&gt;Instead, you would give them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Context on how the project works.&lt;/li&gt;
&lt;li&gt; The coding standards.&lt;/li&gt;
&lt;li&gt; The architectural roadmap.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, you review their work. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That is exactly how I use a local LLM.&lt;/strong&gt; It doesn't replace me; it extends my capacity to build.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Local? (The Workflow)
&lt;/h1&gt;

&lt;p&gt;People ask why I don't just use GPT-4 or Claude for this. It’s not about replacing those models; it’s about &lt;strong&gt;Workflow.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Privacy:&lt;/strong&gt; My source code never leaves my machine.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Zero Friction:&lt;/strong&gt; No API keys, no usage limits, no "Thinking..." delays.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Iteration:&lt;/strong&gt; I can experiment 100 times without worrying about token costs.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Offline Power:&lt;/strong&gt; It works anywhere.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The local model is simply another tool in my stack, sitting alongside Docker, Git, and PostgreSQL.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts: AI Didn't Build SafeDevTools.
&lt;/h1&gt;

&lt;p&gt;I need to be clear: &lt;strong&gt;AI did not build SafeDevTools.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Human&lt;/strong&gt; designed the architecture.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Human&lt;/strong&gt; defined the UX.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Human&lt;/strong&gt; established the privacy-first philosophy.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Human&lt;/strong&gt; chose the browser-only execution model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implementation simply became &lt;strong&gt;dramatically faster&lt;/strong&gt; because I had an assistant that never complains about writing repetitive code.&lt;/p&gt;

&lt;p&gt;The future isn't about "Autonomous Agents" replacing engineers. It’s about experienced developers who know how to combine their &lt;strong&gt;Engineering Intuition&lt;/strong&gt; with &lt;strong&gt;AI-Assisted Implementation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Experience tells you &lt;em&gt;what&lt;/em&gt; should be built. AI helps you build it faster. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop asking AI to replace you. Start using it to unburden you.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;🌐 &lt;strong&gt;SafeDevTools&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://safedevtools.com" rel="noopener noreferrer"&gt;https://safedevtools.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📝 &lt;strong&gt;The Technical Deep Dive&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://dev.to/iprvn/how-i-built-a-premium-developer-tools-website-using-only-a-local-llm-gemma-412b-ollama-vs-40ni"&gt;How I Built SafeDevTools Using a Local LLM&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>showdev</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>How I Built a Premium Developer Tools Website Using Only a Local LLM (Gemma 4:12B + Ollama + VS Code)</title>
      <dc:creator>Praveen Maurya</dc:creator>
      <pubDate>Thu, 25 Jun 2026 19:19:16 +0000</pubDate>
      <link>https://dev.to/iprvn/how-i-built-a-premium-developer-tools-website-using-only-a-local-llm-gemma-412b-ollama-vs-40ni</link>
      <guid>https://dev.to/iprvn/how-i-built-a-premium-developer-tools-website-using-only-a-local-llm-gemma-412b-ollama-vs-40ni</guid>
      <description>&lt;p&gt;Over the past few weeks, I’ve been experimenting with local language models. Like a lot of developers, I’ve used cloud AI assistants quite a bit, but I kept asking myself one simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can a local LLM actually help me build a real, production-ready project?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I decided to find out for myself.&lt;/p&gt;

&lt;p&gt;I challenged myself to build an entire developer tools website using only a local AI model running on my own machine. No cloud assistant. No external API. Just my laptop, VS Code, Ollama, and Gemma 4:12B.&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;SafeDevTools&lt;/strong&gt; — a collection of browser-based developer utilities with a modern glassmorphic interface, strong SEO foundations, and a privacy-first architecture. You can check it out here: &lt;a href="https://safedevtools.com" rel="noopener noreferrer"&gt;https://safedevtools.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The site includes tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON formatter&lt;/li&gt;
&lt;li&gt;JWT parser&lt;/li&gt;
&lt;li&gt;Base64 encoder/decoder&lt;/li&gt;
&lt;li&gt;Hash generator&lt;/li&gt;
&lt;li&gt;CSV to JSON Converter&lt;/li&gt;
&lt;li&gt;URL encoder/decoder&lt;/li&gt;
&lt;li&gt;Timestamp converter&lt;/li&gt;
&lt;li&gt;JSON &amp;lt;-&amp;gt; YAML converter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly, the biggest surprise wasn’t the model itself.&lt;/p&gt;

&lt;p&gt;It was how much of a difference a well-written &lt;strong&gt;Copilot Skill&lt;/strong&gt; made.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;I kept the stack intentionally simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code Copilot Agent&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;Gemma 4:12B&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;Vanilla JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything running on Macbook M4 Pro 24GB RAM&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;No React.&lt;/p&gt;

&lt;p&gt;No Angular.&lt;/p&gt;

&lt;p&gt;No backend.&lt;/p&gt;

&lt;p&gt;No build tools.&lt;/p&gt;

&lt;p&gt;No server-side rendering.&lt;/p&gt;

&lt;p&gt;And that simplicity mattered more than I expected. It meant the local model could focus on generating clean frontend code instead of getting distracted by framework complexity or project scaffolding.&lt;/p&gt;

&lt;p&gt;Running everything on a MacBook M4 Pro with 24GB RAM was also a big advantage. It gave me enough headroom to work comfortably with a local model while keeping the entire workflow fast, private, and fully under my control.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Biggest Problem
&lt;/h2&gt;

&lt;p&gt;At the beginning, Gemma’s output was a bit all over the place.&lt;/p&gt;

&lt;p&gt;Sometimes the layout looked great.&lt;/p&gt;

&lt;p&gt;Sometimes the HTML structure changed for no obvious reason.&lt;/p&gt;

&lt;p&gt;Some tools used different colors.&lt;/p&gt;

&lt;p&gt;Some pages forgot SEO metadata.&lt;/p&gt;

&lt;p&gt;Others skipped accessibility or responsive behavior.&lt;/p&gt;

&lt;p&gt;The code worked, but it didn’t feel like one project. It felt like a bunch of separate pages written by different people.&lt;/p&gt;

&lt;p&gt;That’s fine for a quick prototype, but it doesn’t really work when you’re trying to build something bigger and more consistent.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Turning Point: Writing a Copilot Skill
&lt;/h2&gt;

&lt;p&gt;Instead of writing longer prompts every time, I created a detailed &lt;strong&gt;VS Code Copilot Skill&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That changed everything.&lt;/p&gt;

&lt;p&gt;Rather than telling the model what to build each time, I taught it &lt;strong&gt;how every tool should be built&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The skill defines things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project architecture&lt;/li&gt;
&lt;li&gt;Folder structure&lt;/li&gt;
&lt;li&gt;UI design system&lt;/li&gt;
&lt;li&gt;Color palette&lt;/li&gt;
&lt;li&gt;Glassmorphism styling&lt;/li&gt;
&lt;li&gt;SEO requirements&lt;/li&gt;
&lt;li&gt;Accessibility standards&lt;/li&gt;
&lt;li&gt;Performance expectations&lt;/li&gt;
&lt;li&gt;JavaScript architecture&lt;/li&gt;
&lt;li&gt;Privacy messaging&lt;/li&gt;
&lt;li&gt;Advertisement placeholders&lt;/li&gt;
&lt;li&gt;Responsive layouts&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So every new tool starts from the same standards.&lt;/p&gt;

&lt;p&gt;Once that skill was in place, the consistency improved a lot. The pages started to feel like they belonged to the same product instead of being stitched together from random outputs.&lt;/p&gt;

&lt;p&gt;That was the real breakthrough.&lt;/p&gt;

&lt;p&gt;Instead of constantly correcting the model, I was giving it a reusable engineering blueprint.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Local AI Worked Surprisingly Well
&lt;/h2&gt;

&lt;p&gt;Gemma 4:12B isn’t the biggest model out there.&lt;/p&gt;

&lt;p&gt;But once the skill encoded the project’s standards, the model didn’t have to invent everything from scratch anymore. It just followed the blueprint.&lt;/p&gt;

&lt;p&gt;That made a huge difference.&lt;/p&gt;

&lt;p&gt;It reduced weird output, improved consistency, and produced much cleaner code than I was getting from loose, ad-hoc prompts.&lt;/p&gt;

&lt;p&gt;If I had to sum up what I learned in one sentence, it would be this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Smaller models become much more useful when you give them better instructions instead of just bigger prompts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That really stuck with me.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Privacy-First Website
&lt;/h2&gt;

&lt;p&gt;One of the main goals for SafeDevTools was making sure every tool runs entirely inside the browser.&lt;/p&gt;

&lt;p&gt;Whether 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;generating Hash&lt;/li&gt;
&lt;li&gt;encoding Base64&lt;/li&gt;
&lt;li&gt;converting csv to json&lt;/li&gt;
&lt;li&gt;converting timestamps&lt;/li&gt;
&lt;li&gt;converting json &amp;lt;-&amp;gt; yaml&lt;/li&gt;
&lt;li&gt;encoding or decoding URLs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;your input data never leaves your computer.&lt;/p&gt;

&lt;p&gt;There are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no API calls&lt;/li&gt;
&lt;li&gt;no uploads&lt;/li&gt;
&lt;li&gt;no server-side processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything happens locally using browser APIs and JavaScript.&lt;/p&gt;

&lt;p&gt;That was important to me because a lot of developer tools deal with sensitive data. Sometimes you’re pasting tokens, logs, config files, or snippets you really don’t want sent anywhere. With SafeDevTools, that concern just goes away.&lt;/p&gt;

&lt;p&gt;It also makes the site feel fast and lightweight, which is always a nice bonus.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Chose Glassmorphism
&lt;/h2&gt;

&lt;p&gt;I didn’t want another plain developer tools website.&lt;/p&gt;

&lt;p&gt;A lot of utility sites are useful, but they look a little dated or too functional. I wanted SafeDevTools to feel more like a premium desktop app than a basic web page.&lt;/p&gt;

&lt;p&gt;So I leaned into a glassmorphic design style with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dark slate backgrounds&lt;/li&gt;
&lt;li&gt;layered glass surfaces&lt;/li&gt;
&lt;li&gt;subtle blur effects&lt;/li&gt;
&lt;li&gt;smooth hover animations&lt;/li&gt;
&lt;li&gt;modern typography&lt;/li&gt;
&lt;li&gt;carefully chosen accent colors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was to make the site feel polished without making it flashy for the sake of it.&lt;/p&gt;

&lt;p&gt;And I think that matters more than people admit. Good developer experience isn’t only about whether a tool works. It’s also about whether you actually enjoy using it.&lt;/p&gt;

&lt;p&gt;When a tool looks and feels premium, it changes the whole experience.&lt;/p&gt;




&lt;h1&gt;
  
  
  Simplicity Wins
&lt;/h1&gt;

&lt;p&gt;Every tool is completely self-contained.&lt;/p&gt;

&lt;p&gt;Each one lives in its own folder with only three files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tool-name/

├── index.html
├── style.css
└── script.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That structure keeps things clean and easy to maintain.&lt;/p&gt;

&lt;p&gt;The root project stays minimal too, with just the homepage and the global project files. Nothing feels bloated, and adding a new tool doesn’t turn into a messy refactor every time.&lt;/p&gt;

&lt;p&gt;That simplicity ended up being one of the best decisions I made. It makes the project easier to scale, easier to debug, and easier to hand off to the model without confusing it.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I Learned
&lt;/h1&gt;

&lt;p&gt;The biggest lesson from this project wasn’t really about AI.&lt;/p&gt;

&lt;p&gt;It was about software engineering.&lt;/p&gt;

&lt;p&gt;AI gives much better results when you give it clear architecture, coding standards, and reusable constraints. That sounds obvious, but I think a lot of people still treat prompts like magic spells instead of treating them like part of the engineering process.&lt;/p&gt;

&lt;p&gt;The Copilot Skill became more valuable than any single prompt because it captured the project’s decisions in one place.&lt;/p&gt;

&lt;p&gt;Instead of repeating myself over and over, I encoded my preferences once and reused them across every new feature.&lt;/p&gt;

&lt;p&gt;That made the whole workflow feel calmer, faster, and much more predictable.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Local LLMs are often compared to much larger cloud models, and I get why. But after building this project, I think that comparison misses the point.&lt;/p&gt;

&lt;p&gt;A well-instructed local model can be a really solid development partner for structured engineering work.&lt;/p&gt;

&lt;p&gt;With the right architecture, reusable skills, and clear project standards, even a 12B parameter model can help build polished, production-ready applications.&lt;/p&gt;

&lt;p&gt;For me, this experiment was never about replacing cloud AI.&lt;/p&gt;

&lt;p&gt;It was about proving that thoughtful software engineering, combined with local AI, can produce something genuinely useful.&lt;/p&gt;

&lt;p&gt;And honestly, seeing SafeDevTools come together — fully offline, privacy-first, and polished enough to feel premium — was more satisfying than I expected.&lt;/p&gt;

&lt;p&gt;If you want to see the result, here it is again: &lt;a href="https://safedevtools.com" rel="noopener noreferrer"&gt;https://safedevtools.com&lt;/a&gt;&lt;/p&gt;

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