<?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: Samuel Mutemi</title>
    <description>The latest articles on DEV Community by Samuel Mutemi (@mtsammy40).</description>
    <link>https://dev.to/mtsammy40</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%2F1368344%2Fdc35f5bb-1ed9-4b80-a7e4-e76041372894.jpg</url>
      <title>DEV Community: Samuel Mutemi</title>
      <link>https://dev.to/mtsammy40</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mtsammy40"/>
    <language>en</language>
    <item>
      <title>Microservices or Micro-progress? The Perils of Pre-Scaling Too Soon</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Fri, 15 Aug 2025 21:28:09 +0000</pubDate>
      <link>https://dev.to/mtsammy40/microservices-or-micro-progress-the-perils-of-pre-scaling-too-soon-1049</link>
      <guid>https://dev.to/mtsammy40/microservices-or-micro-progress-the-perils-of-pre-scaling-too-soon-1049</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;The Grand Illusion of "Future-Proof" Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ah, the siren song of scalability. It whispers sweet nothings into our ears: &lt;em&gt;"Build it right the first time," "You’ll thank yourself later," "What if you get 10 million users tomorrow?"&lt;/em&gt; And before you know it, you’ve spent three months architecting a dazzling microservices masterpiece, only to realize your "scalable" app has exactly one user: &lt;strong&gt;you&lt;/strong&gt;, refreshing the page in incognito mode.&lt;/p&gt;

&lt;p&gt;This was me. I was &lt;em&gt;that&lt;/em&gt; developer. Convinced that my side project needed a Kubernetes cluster, a distributed notification system, and a payment service that could handle Stripe-level traffic, despite the fact that my MVP was still just a glorified to-do list.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Hard Truth: Scale Doesn’t Matter If Nobody Cares&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here’s the uncomfortable reality: &lt;strong&gt;You cannot optimize for problems you don’t have yet.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Are you drowning in user traffic?&lt;/strong&gt; → No? Then why are you building a CDN?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do you have 10,000 concurrent payment requests?&lt;/strong&gt; → No? Then why are you overengineering Stripe?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are your notifications crashing under load?&lt;/strong&gt; → No? Then why did you build a pub-sub system when Novu’s free tier exists?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had to face the music: I wasn’t building for scale, I was &lt;strong&gt;procrasti-scaling&lt;/strong&gt;. Avoiding the real work (making something people actually wanted) by obsessing over infrastructure that &lt;em&gt;might&lt;/em&gt; matter someday.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Pivot: From Over-Engineered to "Good Enough"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;So I did the unthinkable: I &lt;strong&gt;deleted months of work&lt;/strong&gt; and replaced it with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; (Auth + DB) → Free tier. Works. Done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novu&lt;/strong&gt; (Notifications) → Free tier. Works. Done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; (Payments) → Basic integration. Works. Done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suddenly, I was making &lt;strong&gt;real progress -&lt;/strong&gt; not on infrastructure, but on &lt;strong&gt;the actual product&lt;/strong&gt;. And guess what? If (big &lt;em&gt;if&lt;/em&gt;) my app ever outgrows these tools, I’ll &lt;strong&gt;cross that bridge when I get there&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Lesson: Build Stupid First&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your first version should be &lt;strong&gt;embarrassingly simple&lt;/strong&gt;. Not because you’re lazy, but because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You don’t yet know what needs scaling.&lt;/strong&gt; (Most things won’t.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premature optimization is the root of all evil.&lt;/strong&gt; (Or at least wasted time.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your biggest risk isn’t scale, it’s building something nobody wants.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So next time you catch yourself designing a Kafka pipeline for your cat blog, ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is this solving a real problem, or just my fear of hypothetical ones?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because in the end, &lt;strong&gt;a working app with limits beats an unfinished "scalable" one every time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now go build something stupid. You can always make it smart later. 🚀&lt;/p&gt;

</description>
      <category>programming</category>
      <category>distributedsystems</category>
      <category>mvp</category>
    </item>
    <item>
      <title>Setting Up Keycloak for Passwordless Authentication</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Wed, 28 May 2025 09:57:59 +0000</pubDate>
      <link>https://dev.to/mtsammy40/setting-up-keycloak-for-passwordless-authentication-2fg1</link>
      <guid>https://dev.to/mtsammy40/setting-up-keycloak-for-passwordless-authentication-2fg1</guid>
      <description>&lt;p&gt;Passwordless authentication is becoming a must-have for modern applications, no more forgotten passwords, just seamless access via magic links, biometrics, or security keys. &lt;strong&gt;&lt;a href="https://www.keycloak.org/" rel="noopener noreferrer"&gt;Keycloak&lt;/a&gt;&lt;/strong&gt;, the popular open-source identity and access management solution, makes implementing passwordless auth surprisingly straightforward.  &lt;/p&gt;

&lt;p&gt;In this guide, we’ll walk through configuring Keycloak to support &lt;strong&gt;email-based magic links&lt;/strong&gt; (a common passwordless approach). Let’s dive in!  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A running Keycloak instance (v20+)
&lt;/li&gt;
&lt;li&gt;SMTP server access (for sending magic links)
&lt;/li&gt;
&lt;li&gt;Basic familiarity with Keycloak admin console
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 1: Enable Email Verification&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since passwordless auth relies on email links, we first need to ensure Keycloak can send emails.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Configure SMTP settings&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Realm Settings → Email&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Fill in your SMTP server details (e.g., Gmail, SendGrid, Postmark)
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   Host: smtp.example.com  
   Port: 587  
   From: no-reply@yourdomain.com  
   Enable SSL/TLS: Yes  
   Authentication: Enabled (provide credentials)  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test email delivery&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Test connection&lt;/strong&gt; to verify everything works.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: Set Up Passwordless Authentication Flow&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak uses &lt;strong&gt;authentication flows&lt;/strong&gt; to define login steps. We’ll customize the default flow.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a new authentication flow&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Authentication → Flows&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;New flow&lt;/strong&gt;, name it (e.g., "Passwordless Email")
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add required steps&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under your new flow, add these &lt;strong&gt;executions&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Username Form&lt;/strong&gt; (for email input)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send Email Verification Link&lt;/strong&gt; (replaces password check)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional User Role&lt;/strong&gt; (optional, for additional security)
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Disable password requirement&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Realm Settings → Login&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Disable &lt;strong&gt;"Password"&lt;/strong&gt; as a required credential
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 3: Customize the Magic Link Email&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak sends a verification email, let’s make it user-friendly.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Edit the email template&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Realm Settings → Email → Templates&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Modify &lt;strong&gt;"Verify Email"&lt;/strong&gt; to include a clear call-to-action:
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Click below to log in:&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;  
   &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"${url}"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background: #2563eb; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sign In Instantly&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set link expiration&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Under &lt;strong&gt;Realm Settings → Tokens&lt;/strong&gt;, adjust &lt;strong&gt;"Email Verification Link Lifespan"&lt;/strong&gt; (e.g., 15 minutes).
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 4: Test the Flow&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Try logging in as a test user.
&lt;/li&gt;
&lt;li&gt;Instead of a password field, you’ll see an email input.
&lt;/li&gt;
&lt;li&gt;After submitting, check your inbox for the magic link.
&lt;/li&gt;
&lt;li&gt;Clicking it should log you in directly!
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Bonus: Adding WebAuthn (Biometric Auth)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For a more advanced passwordless experience, enable &lt;strong&gt;WebAuthn&lt;/strong&gt; (for security keys/biometrics):  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Authentication → Flows&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;"WebAuthn Authenticator"&lt;/strong&gt; as an alternative.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak makes passwordless auth surprisingly simple. With just a few tweaks, you can replace clunky passwords with secure, user-friendly magic links or biometric logins.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Need help?&lt;/strong&gt; Check out the &lt;a href="https://www.keycloak.org/docs/latest/server_admin/" rel="noopener noreferrer"&gt;official Keycloak docs&lt;/a&gt; or drop a question below!  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>authentication</category>
      <category>keycloak</category>
    </item>
    <item>
      <title>AI in Corporate: The Coming Wave of Disastrous Blunders</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Wed, 14 May 2025 18:50:38 +0000</pubDate>
      <link>https://dev.to/mtsammy40/ai-in-corporate-the-coming-wave-of-disastrous-blunders-367h</link>
      <guid>https://dev.to/mtsammy40/ai-in-corporate-the-coming-wave-of-disastrous-blunders-367h</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;How AI-Powered Tools Will Accidentally Wreck Prod (And Maybe Some Companies)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We’re in the early days of AI integration in corporate environments, and I’m willing to bet &lt;strong&gt;we’re about to see an avalanche of catastrophic mistakes&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Picture this:  &lt;/p&gt;

&lt;p&gt;A well-meaning infrastructure engineer, eager to speed up their workflow, starts using an AI-powered IDE like &lt;strong&gt;Cursor&lt;/strong&gt; with the &lt;em&gt;"auto-perform commands"&lt;/em&gt; feature enabled. They explain a problem—maybe not perfectly, maybe missing some key context—and the AI, confident as ever, starts running terminal commands &lt;strong&gt;the engineer has never even seen before&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Before they know it:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database tables are dropped.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configs are overwritten.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prod is a smoking crater.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the worst part? &lt;strong&gt;No one fully understands what happened&lt;/strong&gt; because the AI made decisions based on incomplete or misinterpreted context.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why This Will Happen Over and Over&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Over-Trust in AI’s “Understanding”&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI doesn’t &lt;em&gt;reason&lt;/em&gt;—it predicts. If your prompt is ambiguous, it will still generate &lt;em&gt;something&lt;/em&gt;, and that something might be &lt;code&gt;rm -rf&lt;/code&gt; in the wrong directory.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Illusion of Control&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tools that auto-execute commands (like GitHub Copilot with shell gen, Cursor’s AI agent, etc.) &lt;strong&gt;remove the human review step&lt;/strong&gt;. Engineers might assume the AI "gets it" until it very clearly doesn’t.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Silent Failures&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlike a human who might say &lt;em&gt;"Wait, this looks dangerous,"&lt;/em&gt; AI will happily run destructive commands &lt;strong&gt;with confidence&lt;/strong&gt;. By the time logs are checked, it’s too late.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Fallout: AI Will Kill Some Companies&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We’ve already seen AI blunders:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Legal briefs citing fake cases&lt;/strong&gt; (because the AI hallucinated precedents).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer service bots going rogue&lt;/strong&gt; (see: Air Canada’s chatbot inventing refund policies).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now imagine:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A fintech AI misinterprets a deployment script and wipes transaction records.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A cloud AI "optimizes" costs by deleting "unused" resources… like prod databases.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some companies &lt;strong&gt;won’t recover&lt;/strong&gt; from these mistakes—especially if they happen at scale.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How to Survive the AI Wild West&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Treat AI Like a Junior Dev Who Lies Sometimes&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always review generated code/commands before execution.
&lt;/li&gt;
&lt;li&gt;Sandbox &lt;strong&gt;everything&lt;/strong&gt; before it touches prod.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Disable Auto-Execute (For Now)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tools that let AI run commands directly are &lt;strong&gt;dangerous&lt;/strong&gt;. Keep it in "suggestion mode" until guardrails improve.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assume It Will Fail&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log every AI-generated action.
&lt;/li&gt;
&lt;li&gt;Build rollback plans for when (not if) AI breaks something.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Bottom Line&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;AI is powerful, but &lt;strong&gt;we’re in the "move fast and break things" phase&lt;/strong&gt;—except now, the "things" might be entire companies.  &lt;/p&gt;

&lt;p&gt;Brace for the chaos. &lt;strong&gt;The first wave of AI-induced disasters is coming.&lt;/strong&gt;  &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What’s the worst AI blunder you’ve seen (or caused)?&lt;/strong&gt; Drop your horror stories below. 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>data</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI Won’t Replace Developers Anytime Soon—Here’s Why</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Wed, 07 May 2025 18:15:53 +0000</pubDate>
      <link>https://dev.to/mtsammy40/ai-wont-replace-developers-anytime-soon-heres-why-2166</link>
      <guid>https://dev.to/mtsammy40/ai-wont-replace-developers-anytime-soon-heres-why-2166</guid>
      <description>&lt;p&gt;(Critiques of the distant future, please consider the date of publication 😅) &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Promise (and Pitfalls) of AI-Generated Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;AI coding assistants like &lt;a href="https://cursor.sh" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt; and &lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;Claude&lt;/a&gt; have been game-changers for developer productivity. They can scaffold entire applications, debug tricky issues, and even explain complex concepts in seconds. But can they &lt;em&gt;fully&lt;/em&gt; replace software engineers?  &lt;/p&gt;

&lt;p&gt;Not yet—and here’s a funny (and frustrating) example of why.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Case of the Broken Countdown Timer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I recently asked Cursor to generate a Next.js landing page with a countdown timer to my product launch. It did &lt;strong&gt;most&lt;/strong&gt; of the work well—the UI looked great, the logic seemed sound, but when I tested it… the timer was &lt;strong&gt;stuck&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;I alerted the AI, but instead of fixing the issue, it just:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeated the same code
&lt;/li&gt;
&lt;li&gt;Gave me a generic checklist (e.g., "Check if the date is correct")
&lt;/li&gt;
&lt;li&gt;Missed the glaring problem
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, I pasted the code into Claude. It &lt;strong&gt;thought&lt;/strong&gt; it was a hydration issue (a reasonable guess in Next.js) and tweaked the code—but the timer &lt;strong&gt;still didn’t work&lt;/strong&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Obvious Bug AI Missed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;After some manual debugging (thankfully, I know JavaScript), I spotted the issue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getTimeLeft&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;launchDate&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;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 🚨 Problem: This resets EVERY render!&lt;/span&gt;
  &lt;span class="nx"&gt;launchDate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;launchDate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 5 weeks from today&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;now&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;Date&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;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;launchDate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="c1"&gt;// ... rest of the logic&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bug? &lt;strong&gt;&lt;code&gt;launchDate&lt;/code&gt; was being recalculated on every render&lt;/strong&gt;, meaning the countdown always showed &lt;code&gt;0&lt;/code&gt; (since &lt;code&gt;now&lt;/code&gt; and &lt;code&gt;launchDate&lt;/code&gt; were effectively the same time).  &lt;/p&gt;

&lt;p&gt;The fix? **Make &lt;code&gt;launchDate&lt;/code&gt; a static field (From what future date are we counting down?):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LAUNCH_DATE&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;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025-06-01&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getTimeLeft&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;now&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;Date&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;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;LAUNCH_DATE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="c1"&gt;// ... rest of the logic&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Why AI Still Needs Human Oversight&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI Lacks Deep Context&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It didn’t realize &lt;code&gt;launchDate&lt;/code&gt; should be static.
&lt;/li&gt;
&lt;li&gt;It followed patterns but didn’t &lt;em&gt;understand&lt;/em&gt; the intent.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Debugging Requires Reasoning, Not Just Repetition&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both assistants gave &lt;em&gt;plausible&lt;/em&gt; suggestions but didn’t &lt;em&gt;diagnose&lt;/em&gt; the root cause.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trivial Mistakes Are Hard for AI to Spot&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Humans recognize "obvious" errors faster because we think in terms of goals, not just syntax.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Verdict: AI is a Powerful Assistant, Not a Replacement&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;AI has made &lt;strong&gt;incredible progress&lt;/strong&gt;, but it still:&lt;br&gt;&lt;br&gt;
✔ Struggles with nuanced logic&lt;br&gt;&lt;br&gt;
✔ Misses simple but critical bugs&lt;br&gt;&lt;br&gt;
✔ Needs human guidance for real-world scenarios  &lt;/p&gt;

&lt;p&gt;So, developers, rest easy, your job is safe (for now). AI is a &lt;strong&gt;tool&lt;/strong&gt;, not a replacement. And honestly? That’s a good thing.  &lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>programming</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Mistakes Are Part of the Dev Environment: It's How You Handle Them That Counts</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Wed, 07 May 2025 08:26:35 +0000</pubDate>
      <link>https://dev.to/mtsammy40/mistakes-are-part-of-the-dev-environment-its-how-you-handle-them-that-counts-2m1p</link>
      <guid>https://dev.to/mtsammy40/mistakes-are-part-of-the-dev-environment-its-how-you-handle-them-that-counts-2m1p</guid>
      <description>&lt;p&gt;“To err is human, to debug divine.”&lt;/p&gt;

&lt;p&gt;If you’ve been writing code for any stretch of time, you’ve probably stared at your screen wondering how something so small could break so much. Whether it’s a misplaced semicolon, an off-by-one error, or deploying to production with test credentials (guilty 😅), every developer—junior or senior—has stories of mistakes they’ve made.&lt;/p&gt;

&lt;p&gt;Let’s face it: mistakes are not just part of the development process—they are the development process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Illusion of Perfection&lt;/strong&gt;&lt;br&gt;
There's a common myth, especially among beginners, that good developers don't make mistakes. That once you’re “senior,” you write perfect code the first time.&lt;/p&gt;

&lt;p&gt;Spoiler: Nobody does.&lt;/p&gt;

&lt;p&gt;In fact, senior developers often make bigger mistakes—but they catch and fix them faster because they’ve learned how to deal with them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Mistakes Matter&lt;/strong&gt;&lt;br&gt;
Mistakes aren’t just inevitable—they’re useful. They reveal assumptions, force you to dig deeper into how systems work, and often lead to better solutions than you would have considered otherwise. Here’s what mistakes teach us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Clarity: They expose where our understanding is shallow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resilience: They teach us how to handle failure calmly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Humility: They remind us that there’s always more to learn.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A Culture of Blame vs. a Culture of Learning&lt;/strong&gt;&lt;br&gt;
One of the worst things a dev team can do is foster a culture where mistakes are punished. This leads to fear, cover-ups, and stagnation.&lt;/p&gt;

&lt;p&gt;Great teams treat mistakes as data points. When something breaks, the question isn't “Who messed up?”—it’s “How can we make this less likely to happen again?”&lt;/p&gt;

&lt;p&gt;That might mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Improving test coverage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setting up guardrails (like staging environments or automated linting).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Writing clearer documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Doing post-mortems without finger-pointing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Your Mistake Recovery Toolbox&lt;/strong&gt;&lt;br&gt;
Here are a few practical things every developer should keep in their mental toolkit when mistakes happen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Stay Calm&lt;br&gt;
Panicking never helps. Take a breath, grab a coffee, and remember: you are not your bug.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reproduce It&lt;br&gt;
If you can reproduce the bug, you can fix the bug. Step-by-step isolation is often the fastest way forward.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use Version Control&lt;br&gt;
If you’re not using Git (or similar), start now. Version control is the ultimate undo button.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write Tests Around It&lt;br&gt;
Write a test that fails because of the bug. Then fix it. This not only confirms the fix—it prevents regressions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn and Share&lt;br&gt;
Write about it, tweet it, blog it, bring it up in retros. Your mistake could prevent someone else’s.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Some Famous Dev Mistakes&lt;/strong&gt;&lt;br&gt;
GitHub once deleted part of their production database.&lt;/p&gt;

&lt;p&gt;AWS once took down a major part of the internet with a typo.&lt;/p&gt;

&lt;p&gt;Google once lost an entire day of email due to a bad config.&lt;/p&gt;

&lt;p&gt;These are massive companies with brilliant engineers. Mistakes still happen. What sets them apart is how they respond.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;br&gt;
Programming is a constant process of learning, breaking, fixing, and improving. Mistakes are not bugs in you—they’re features of the process.&lt;/p&gt;

&lt;p&gt;So next time you bork the deployment or introduce a hard-to-find bug, don’t beat yourself up. Reflect, fix, learn—and maybe even laugh about it later.&lt;/p&gt;

&lt;p&gt;Because at the end of the day, real growth in software engineering happens not in the absence of mistakes, but in how we respond to them.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>Quantum Computing is About to Pwn Your Encryption – Time to Wake Up!</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Mon, 05 May 2025 11:37:27 +0000</pubDate>
      <link>https://dev.to/mtsammy40/quantum-computing-is-about-to-pwn-your-encryption-time-to-wake-up-4c5i</link>
      <guid>https://dev.to/mtsammy40/quantum-computing-is-about-to-pwn-your-encryption-time-to-wake-up-4c5i</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;"Harvest Now, Decrypt Later" – The World’s Slowest Heist&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Imagine a burglar breaking into your house, but instead of stealing your TV, they take a &lt;strong&gt;photocopy of your safe’s lock&lt;/strong&gt; and say:&lt;br&gt;&lt;br&gt;
&lt;em&gt;"I’ll crack this later when I invent lock-picking lasers."&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;That’s essentially what hackers are doing right now with &lt;strong&gt;"Harvest Now, Decrypt Later" (HNDL) attacks&lt;/strong&gt;. They’re hoarding encrypted data (your emails, bank details, even those embarrassing selfies) and waiting for quantum computers to crack them open like a cheap piñata.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; &lt;em&gt;"But quantum computing isn’t ready yet!"&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Hackers:&lt;/strong&gt; &lt;em&gt;"We can wait. Your data isn’t going anywhere."&lt;/em&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Shor’s Algorithm: The Math Bully That Eats RSA for Breakfast&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Current encryption relies on math problems so hard that even supercomputers cry trying to solve them. &lt;strong&gt;But quantum computers? They cheat.&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RSA Encryption:&lt;/strong&gt; &lt;em&gt;"It’ll take a billion years to factor this large prime!"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shor’s Algorithm:&lt;/strong&gt; &lt;em&gt;"Hold my qubit."&lt;/em&gt; 💥
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What’s at risk?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✔ Your &lt;strong&gt;HTTPS connections&lt;/strong&gt; (bye-bye, secure banking).&lt;br&gt;&lt;br&gt;
✔ Your &lt;strong&gt;SSH keys&lt;/strong&gt; (hope you like unexpected server guests).&lt;br&gt;&lt;br&gt;
✔ &lt;strong&gt;Bitcoin &amp;amp; blockchain&lt;/strong&gt; (unless they upgrade fast, quantum miners will be the new crypto whales).  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Grover’s Algorithm: The Unwanted Gym Bro of Encryption&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;While Shor’s algorithm &lt;strong&gt;destroys&lt;/strong&gt; RSA &amp;amp; ECC, Grover’s algorithm is more of a &lt;strong&gt;persistent annoyance&lt;/strong&gt; to symmetric encryption like AES:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AES-256?&lt;/strong&gt; Still strong, but now with &lt;strong&gt;only AES-128-level security&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SHA-256?&lt;/strong&gt; Collision attacks just got &lt;strong&gt;way easier&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Translation:&lt;/strong&gt; Your encryption just lost half its gains. Time to hit the &lt;strong&gt;quantum-resistant crypto gym&lt;/strong&gt;. 💪  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Post-Quantum Cryptography: The Superhero We Need (But Don’t Deserve)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;NIST has been working on &lt;strong&gt;quantum-proof algorithms&lt;/strong&gt;, because apparently, we can’t just &lt;strong&gt;unplug the quantum computers&lt;/strong&gt; and call it a day. Here’s the new lineup:  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. CRYSTALS-Kyber – The New RSA (But Fancier)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Good for:&lt;/strong&gt; Key exchanges (so quantum hackers can’t eavesdrop).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bad for:&lt;/strong&gt; People who miss the good ol’ days of RSA (which, let’s be honest, were never that good).
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. CRYSTALS-Dilithium – Like ECDSA, But Won’t Die in 5 Years&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Replaces:&lt;/strong&gt; Digital signatures (so your GitHub commits stay legit).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bonus:&lt;/strong&gt; Sounds like a &lt;strong&gt;Power Rangers weapon&lt;/strong&gt;. &lt;em&gt;"Go go Dilithium Signatures!"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. SPHINCS+ – The Backup That Nobody Wants to Use&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; Hash-based, so even if quantum breaks everything else, this still stands.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downside:&lt;/strong&gt; Bigger, slower, like that one relative who still uses a &lt;strong&gt;flip phone&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What You Should Do Before Quantum Hackers Ruin Your Day&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stop pretending this isn’t happening.&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"Quantum computing is decades away!"&lt;/em&gt; – People who will be hacked in 5 years.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check if your crypto is already obsolete.&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Still using &lt;strong&gt;RSA-2048?&lt;/strong&gt; Start planning your migration &lt;strong&gt;yesterday&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Demand quantum-safe encryption in your tools.&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask your cloud provider: &lt;em&gt;"Hey, when are you adding Kyber support?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;If they say &lt;em&gt;"What’s Kyber?"&lt;/em&gt; – &lt;strong&gt;panic&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prepare for the inevitable "Oh crap" moment.&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Because someday, a headline will say: &lt;em&gt;"Quantum computer just broke Bitcoin"&lt;/em&gt;, and you don’t want to be scrambling then.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thought: Don’t Be the Last One Using Broken Crypto&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Quantum computing is coming, and it &lt;strong&gt;doesn’t care&lt;/strong&gt; if your security team is ready. The good news? &lt;strong&gt;We have solutions now.&lt;/strong&gt; The bad news? &lt;strong&gt;Most people won’t act until it’s too late.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Will you be the &lt;strong&gt;early adopter&lt;/strong&gt; sipping coffee while others panic? Or the one &lt;strong&gt;rewriting your entire auth system at 3 AM&lt;/strong&gt; after the quantum apocalypse hits?  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The choice is yours.&lt;/strong&gt;  &lt;/p&gt;




&lt;p&gt;&lt;em&gt;"But I don’t even understand quantum mechanics!"&lt;/em&gt; – Don’t worry, neither do most quantum physicists. Just start learning &lt;strong&gt;post-quantum crypto&lt;/strong&gt; today.* 😉  &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Passwords Are a Ticking Timebomb—And These Breaches Prove It</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Mon, 05 May 2025 11:27:16 +0000</pubDate>
      <link>https://dev.to/mtsammy40/passwords-are-a-ticking-timebomb-and-these-breaches-prove-it-25h1</link>
      <guid>https://dev.to/mtsammy40/passwords-are-a-ticking-timebomb-and-these-breaches-prove-it-25h1</guid>
      <description>&lt;p&gt;Passwords have been the default authentication method for decades, but their flaws are more dangerous than ever. High-profile breaches and cyberattacks consistently expose how fragile password-based security really is. Below, we’ll examine two major case studies that highlight why passwords are failing us—and what we should use instead.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Case Study 1: The LinkedIn Breach (2012, 2016, and Beyond)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Happened?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;2012&lt;/strong&gt;, LinkedIn suffered a breach that exposed &lt;strong&gt;164 million email and password combinations&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Hackers didn’t just steal passwords—they cracked weak hashes (SHA-1 without salting), revealing plaintext credentials.
&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;2016&lt;/strong&gt;, another batch of &lt;strong&gt;117 million passwords&lt;/strong&gt; from the same breach resurfaced on the dark web.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Passwords Failed&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Weak Hashing:&lt;/strong&gt; LinkedIn stored passwords with weak encryption, making them easy to crack.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password Reuse:&lt;/strong&gt; Many users reused the same passwords across multiple sites, leading to &lt;strong&gt;credential stuffing attacks&lt;/strong&gt; on other platforms.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delayed Impact:&lt;/strong&gt; Even years later, these passwords were still being used in attacks.
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Aftermath&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;LinkedIn forced password resets, but the damage was done.
&lt;/li&gt;
&lt;li&gt;Many users who reused passwords saw their other accounts (email, banking, social media) compromised.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How It Could Have Been Prevented&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Passwordless Auth:&lt;/strong&gt; Passkeys or biometric logins would have made stolen credentials useless.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Better Hashing:&lt;/strong&gt; Modern algorithms (bcrypt, Argon2) could have slowed down cracking.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;MFA Enforcement:&lt;/strong&gt; Even with leaked passwords, MFA would have blocked unauthorized access.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Case Study 2: The Colonial Pipeline Ransomware Attack (2021)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Happened?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hackers breached &lt;strong&gt;Colonial Pipeline&lt;/strong&gt;, a major U.S. fuel supplier, causing a &lt;strong&gt;six-day shutdown&lt;/strong&gt; and fuel shortages across the East Coast.
&lt;/li&gt;
&lt;li&gt;The attack started with &lt;strong&gt;a single compromised password&lt;/strong&gt; to an old VPN account that &lt;strong&gt;lacked multi-factor authentication (MFA).&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Passwords Failed&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No MFA:&lt;/strong&gt; A single weak password was all hackers needed to infiltrate the network.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legacy Account Exposure:&lt;/strong&gt; The VPN account was no longer in use but wasn’t deactivated.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password Reuse:&lt;/strong&gt; The password may have been reused or easily guessed (though exact details weren’t disclosed).
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Aftermath&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Colonial Pipeline paid &lt;strong&gt;$4.4 million in Bitcoin&lt;/strong&gt; as ransom.
&lt;/li&gt;
&lt;li&gt;The U.S. government recovered some funds, but the incident highlighted how &lt;strong&gt;passwords alone are insufficient for critical infrastructure.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How It Could Have Been Prevented&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Passwordless VPN Access:&lt;/strong&gt; A hardware security key (YubiKey) or certificate-based auth would have prevented the breach.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Strict MFA Policies:&lt;/strong&gt; Even a simple TOTP (Google Authenticator) check would have stopped the attack.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Automated Account Deactivation:&lt;/strong&gt; Unused accounts should be disabled automatically.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Way Forward: Killing the Password for Good&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;These cases prove that &lt;strong&gt;passwords alone are a security liability.&lt;/strong&gt; Here’s what we should adopt instead:  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Passkeys (FIDO2 / WebAuthn)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No passwords, just biometrics or hardware keys.
&lt;/li&gt;
&lt;li&gt;Immune to phishing &amp;amp; credential stuffing.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Universal MFA Adoption&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mandate MFA everywhere&lt;/strong&gt;, especially for remote access and admin accounts.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Better Credential Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Password managers&lt;/strong&gt; for generating and storing strong passwords (if still needed).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regular audits&lt;/strong&gt; to deactivate unused accounts.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Passwords are outdated, insecure, and costly. The LinkedIn and Colonial Pipeline breaches show just how dangerous reliance on passwords can be. The sooner we move to &lt;strong&gt;passwordless authentication&lt;/strong&gt;, the safer we’ll all be.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you still using passwords, or have you switched to passkeys/MFA? Share your experience below!&lt;/strong&gt; 🔐  &lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Stop Using Keycloak Like a Basic Auth Server—Try These Features</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Tue, 29 Apr 2025 14:20:02 +0000</pubDate>
      <link>https://dev.to/mtsammy40/stop-using-keycloak-like-a-basic-auth-server-try-these-features-5dkm</link>
      <guid>https://dev.to/mtsammy40/stop-using-keycloak-like-a-basic-auth-server-try-these-features-5dkm</guid>
      <description>&lt;p&gt;Keycloak is widely recognized as a powerful open-source Identity and Access Management (IAM) solution, offering SSO, OAuth, and user federation out of the box. But beyond the basics, Keycloak has several underrated features that can significantly enhance security, customization, and usability.  &lt;/p&gt;

&lt;p&gt;In this post, we’ll explore some of these &lt;strong&gt;lesser-known Keycloak features&lt;/strong&gt; that can save you time, improve security, and unlock new capabilities.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. Fine-Grained Admin Permissions (Client Policies &amp;amp; Admin Fine-Grained AuthZ)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Most Keycloak admins know about realm roles, but did you know you can &lt;strong&gt;delegate admin permissions with surgical precision&lt;/strong&gt;?  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client Policies&lt;/strong&gt;: Define rules for client registrations (e.g., enforce HTTPS redirect URIs).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-Grained Admin Permissions&lt;/strong&gt;: Restrict admin console access (e.g., allow a user to manage only specific clients).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: Securely delegate administration without giving full realm access.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Dynamic Client Registration (DCR) &amp;amp; Initial Access Tokens&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of manually configuring every client, Keycloak supports &lt;strong&gt;dynamic client registration&lt;/strong&gt; via REST API.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial Access Tokens&lt;/strong&gt;: Generate short-lived tokens to allow self-service client registration.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Registration Policies&lt;/strong&gt;: Enforce constraints (e.g., allowed redirect URIs).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: SaaS platforms where tenants need to onboard their own apps securely.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. WebAuthn &amp;amp; Passwordless Authentication&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;While OTP is common, Keycloak supports &lt;strong&gt;FIDO2/WebAuthn&lt;/strong&gt; for phishing-resistant logins.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Biometric &amp;amp; Security Key Auth&lt;/strong&gt;: Users can log in via Face ID, Touch ID, or YubiKey.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional Policies&lt;/strong&gt;: Require WebAuthn only for high-risk actions.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: Financial apps or internal systems needing stronger MFA.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Token Exchange (Impersonation &amp;amp; Delegation)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak allows &lt;strong&gt;token exchange&lt;/strong&gt;, letting one token be swapped for another under controlled conditions.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Impersonation&lt;/strong&gt;: Admins can act on behalf of users (for debugging).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delegation&lt;/strong&gt;: A service can obtain a token for another service securely.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: Microservices architectures where services need to call each other.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. Custom User Attributes &amp;amp; Declarative User Profiles&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak supports &lt;strong&gt;custom user metadata&lt;/strong&gt;, but with &lt;strong&gt;Declarative User Profiles (DUP)&lt;/strong&gt;, you can enforce validation.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Define Required Fields&lt;/strong&gt;: Mandate certain attributes at registration.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation Rules&lt;/strong&gt;: Enforce email formats, phone numbers, etc.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: Compliance-heavy industries needing structured user data.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;6. Event Listeners &amp;amp; Webhooks&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak emits &lt;strong&gt;real-time events&lt;/strong&gt; (logins, token exchanges, failures). You can:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Forward Events to Kafka/RabbitMQ&lt;/strong&gt;: For SIEM integration.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger Webhooks&lt;/strong&gt;: Notify external systems on user actions.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: Fraud detection, audit logging, or real-time analytics.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;7. Script-Based Authentication Flows&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of hardcoding auth logic, Keycloak supports &lt;strong&gt;JavaScript/Python scripts&lt;/strong&gt; in auth flows.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom Validation&lt;/strong&gt;: Check user attributes before login.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional Steps&lt;/strong&gt;: Skip MFA for trusted IPs.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: Adaptive authentication without custom code.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;8. Lightweight Directory Services (LDAP) with Write-Back&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak can sync with LDAP/Active Directory &lt;strong&gt;bidirectionally&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User Write-Back&lt;/strong&gt;: Changes in Keycloak (e.g., password updates) sync back to LDAP.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-Demand Sync&lt;/strong&gt;: Avoid full syncs with lazy loading.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: Enterprises migrating from legacy LDAP systems.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;9. Built-In Token Revocation &amp;amp; Offline Sessions&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Revoking tokens is usually manual, but Keycloak offers:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not-Before Policy&lt;/strong&gt;: Invalidate all tokens issued before a certain time.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Session Limits&lt;/strong&gt;: Control how long refresh tokens last.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: Responding to breaches or employee offboarding.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;10. Themeable Emails &amp;amp; Localization&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Most Keycloak emails look generic, but you can:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Customize Templates&lt;/strong&gt;: Branded password reset emails.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Language Support&lt;/strong&gt;: Auto-send emails in the user’s language.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;Use Case&lt;/strong&gt;: Improving UX for global user bases.  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Keycloak is far more than just an OAuth server—it’s a &lt;strong&gt;swiss-army knife for IAM&lt;/strong&gt;. By leveraging these lesser-known features, you can:&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Enhance security&lt;/strong&gt; (WebAuthn, token exchange)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Automate workflows&lt;/strong&gt; (dynamic client registration)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Improve UX&lt;/strong&gt; (custom emails, declarative profiles)  &lt;/p&gt;

&lt;p&gt;Have you used any of these features? Any hidden gems I missed? Let me know in the comments! 🚀  &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.keycloak.org/documentation" rel="noopener noreferrer"&gt;Keycloak Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/keycloak/keycloak" rel="noopener noreferrer"&gt;Keycloak GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Would you like a deep dive into any of these features? Let me know!&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>microservices</category>
      <category>oauth</category>
    </item>
    <item>
      <title>The Fast Lane to Software Failures: Why We Need a New Approach</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Mon, 28 Apr 2025 12:00:48 +0000</pubDate>
      <link>https://dev.to/mtsammy40/the-fast-lane-to-software-failures-why-we-need-a-new-approach-59cl</link>
      <guid>https://dev.to/mtsammy40/the-fast-lane-to-software-failures-why-we-need-a-new-approach-59cl</guid>
      <description>&lt;p&gt;In today’s tech world, the phrase "move fast and break things" is practically a badge of honor. It's like the Silicon Valley equivalent of "hold my beer"—and yet, much like that famous phrase, it often ends with something broken (and possibly on fire). The problem is, when you prioritize speed over quality, you end up with software that’s more “oops” than “awesome.”&lt;/p&gt;

&lt;p&gt;At first, it seems tempting—ship quickly, get feedback fast, and iterate even faster. But here's the thing: just because you're sprinting doesn’t mean you’re not running straight into a wall. In fact, you're probably tripping over bugs, creating tech debt, and making a mess of your codebase that even your future self will regret. It’s like trying to build a house in a day: it might stand for a few hours, but good luck if a strong wind blows through.&lt;/p&gt;

&lt;p&gt;What's worse? This mindset encourages a "fire-fighting" culture. Developers spend more time putting out bugs than actually building cool features. It's like being a chef who spends all day cleaning up spilled soup instead of cooking dinner—at some point, you just want to throw the ladle out the window.&lt;/p&gt;

&lt;p&gt;The solution? Slow down a little. It’s not about being in a hurry, it’s about making sure you actually have something worth hurrying for. Let’s start building software that’s well-tested, well-architected, and doesn’t fall apart the second someone touches it. After all, if you keep speeding through the software lifecycle, you’ll eventually crash—and no one wants their product to be the tech equivalent of a fender bender.&lt;/p&gt;

&lt;p&gt;So here’s a new mantra: "Build well, ship smart." Because the only thing worse than slow progress is having to redo everything later. Let’s not race to failure.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>programming</category>
      <category>testing</category>
      <category>learning</category>
    </item>
    <item>
      <title>Why Keycloak is the Best Choice for Authentication in Modern Applications</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Wed, 23 Apr 2025 14:51:44 +0000</pubDate>
      <link>https://dev.to/mtsammy40/why-keycloak-is-the-best-choice-for-authentication-in-modern-applications-2b86</link>
      <guid>https://dev.to/mtsammy40/why-keycloak-is-the-best-choice-for-authentication-in-modern-applications-2b86</guid>
      <description>&lt;p&gt;Authentication is a critical component of any application, but building a secure, scalable, and flexible auth system from scratch is complex and time-consuming. That’s where &lt;strong&gt;Keycloak&lt;/strong&gt; comes in—an open-source Identity and Access Management (IAM) solution that simplifies authentication while providing enterprise-grade security.  &lt;/p&gt;

&lt;p&gt;In this article, we’ll explore why Keycloak should be your go-to solution for handling authentication in your services.  &lt;/p&gt;

&lt;h2&gt;
  
  
  🔑 1. &lt;strong&gt;Out-of-the-Box Authentication Features&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak provides a rich set of built-in authentication mechanisms, including:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OAuth 2.0 &amp;amp; OpenID Connect (OIDC)&lt;/strong&gt; – Industry-standard protocols for secure authentication.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social Logins&lt;/strong&gt; – Easily integrate with Google, GitHub, Facebook, and more.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SAML 2.0 Support&lt;/strong&gt; – Ideal for enterprise single sign-on (SSO).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Factor Authentication (MFA)&lt;/strong&gt; – Supports TOTP, WebAuthn, and SMS-based 2FA.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of reinventing the wheel, Keycloak lets you enable these features with minimal configuration.  &lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 2. &lt;strong&gt;Single Sign-On (SSO) Made Easy&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak acts as a centralised identity provider, allowing users to log in once and access multiple applications seamlessly. This is particularly useful for:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microservices architectures (where each service shouldn’t handle auth individually).
&lt;/li&gt;
&lt;li&gt;Internal company portals (employees access multiple tools with one login).
&lt;/li&gt;
&lt;li&gt;Customer-facing SaaS platforms (users move between apps without re-authenticating).
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛡️ 3. &lt;strong&gt;Security Best Practices by Default&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Security is hard, and mistakes in auth implementations can lead to breaches. Keycloak enforces security best practices, including:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brute-force protection&lt;/strong&gt; – Automatically throttles repeated login attempts.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password policies&lt;/strong&gt; – Enforces complexity rules and expiration.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure token management&lt;/strong&gt; – JWTs with proper signing &amp;amp; encryption.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session management&lt;/strong&gt; – Detects and handles idle/inactive sessions.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By using Keycloak, you inherit these protections without extra effort.  &lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ 4. &lt;strong&gt;Extensible &amp;amp; Developer-Friendly&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak is highly customizable:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Themes&lt;/strong&gt; – Brand your login pages to match your application.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom user attributes &amp;amp; roles&lt;/strong&gt; – Fine-grained access control.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REST API &amp;amp; Admin CLI&lt;/strong&gt; – Automate user management and configuration.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SPI (Service Provider Interface)&lt;/strong&gt; – Extend Keycloak with custom authentication flows.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers can integrate Keycloak with almost any stack—Node.js, Spring Boot, Python, React, Angular, and more.  &lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 5. &lt;strong&gt;Self-Hosted or Cloud-Native&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak gives you deployment flexibility:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run it on-premises&lt;/strong&gt; – Full control over your identity data.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy in Kubernetes&lt;/strong&gt; – Scalable and resilient in cloud environments.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a managed service&lt;/strong&gt; – Providers like &lt;strong&gt;Red Hat SSO&lt;/strong&gt; offer hosted Keycloak.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike proprietary SaaS auth solutions (Auth0, Okta), Keycloak avoids vendor lock-in and can be self-managed for cost efficiency.  &lt;/p&gt;

&lt;h2&gt;
  
  
  📊 6. &lt;strong&gt;Cost-Effective (Open Source &amp;amp; Free)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak is &lt;strong&gt;100% free and open-source&lt;/strong&gt; (Apache License 2.0). While paid alternatives charge per user or feature, Keycloak provides enterprise-grade IAM at no cost.  &lt;/p&gt;

&lt;p&gt;For businesses with budget constraints, this is a huge advantage.  &lt;/p&gt;

&lt;h2&gt;
  
  
  � 7. &lt;strong&gt;Active Community &amp;amp; Enterprise Support&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak is backed by a strong open-source community and commercial support from &lt;strong&gt;Red Hat&lt;/strong&gt;. Regular updates, security patches, and a wealth of documentation make it a reliable choice.  &lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Getting Started with Keycloak
&lt;/h2&gt;

&lt;p&gt;Deploying Keycloak is straightforward:  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Option 1: Docker Quickstart&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;KEYCLOAK_ADMIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin quay.io/keycloak/keycloak:24.0.2 start-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Option 2: Kubernetes (Helm)&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add bitnami https://charts.bitnami.com/bitnami  
helm &lt;span class="nb"&gt;install &lt;/span&gt;keycloak bitnami/keycloak  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once deployed, configure realms, clients, and identity providers via the &lt;strong&gt;Admin Console&lt;/strong&gt; (&lt;code&gt;http://localhost:8080/admin&lt;/code&gt;).  &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Keycloak eliminates the complexity of authentication while providing &lt;strong&gt;security, scalability, and flexibility&lt;/strong&gt;. Whether you're building a small app or a large enterprise system, Keycloak is a robust, cost-effective solution that saves development time and reduces risk.  &lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Learn more&lt;/strong&gt;: &lt;a href="https://www.keycloak.org/documentation" rel="noopener noreferrer"&gt;Keycloak Official Documentation&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Have you used Keycloak in your projects? Share your experiences in the comments! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>microservices</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Setting Up Keycloak as an OAuth Server</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Wed, 28 Aug 2024 08:38:45 +0000</pubDate>
      <link>https://dev.to/mtsammy40/setting-up-keycloak-as-an-oauth-server-1acn</link>
      <guid>https://dev.to/mtsammy40/setting-up-keycloak-as-an-oauth-server-1acn</guid>
      <description>&lt;p&gt;Keycloak is an open-source identity and access management solution designed for modern applications and services. It provides a robust platform for user authentication, authorization, and SSO (Single Sign-On) with support for various identity providers. Keycloak can be easily configured as an OAuth 2.0 server, enabling applications to securely delegate authentication to a centralized identity provider. This article walks you through setting up Keycloak as an OAuth server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keycloak Installed&lt;/strong&gt;: Ensure that Keycloak is installed on your server or locally on your machine. You can download the latest version from the Keycloak website.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Java and Database Setup&lt;/strong&gt;: Keycloak requires a Java runtime environment and a database to store user data. Ensure both are properly configured.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic Understanding of OAuth 2.0&lt;/strong&gt;: Familiarity with OAuth 2.0 concepts will help you understand the setup process better.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Install and Start Keycloak
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Download Keycloak&lt;/strong&gt;: If you haven’t installed Keycloak, download the latest version from the official website.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract and Configure&lt;/strong&gt;: Extract the downloaded archive and configure Keycloak by setting up the database and other environment-specific settings.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start Keycloak&lt;/strong&gt;: Start Keycloak using the command below:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./bin/standalone.sh
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;By default, Keycloak will start on &lt;code&gt;http://localhost:8080&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Access the Keycloak Admin Console
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Login&lt;/strong&gt;: Access the Keycloak Admin Console by navigating to &lt;code&gt;http://localhost:8080/auth&lt;/code&gt; in your browser. You will be prompted to create an initial admin user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a Realm&lt;/strong&gt;: Realms in Keycloak are isolated environments that allow you to manage a set of users, credentials, roles, and groups. Create a new realm by clicking on the “Add Realm” button.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Configure OAuth Clients
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Client&lt;/strong&gt;: In the realm settings, navigate to the &lt;strong&gt;Clients&lt;/strong&gt; section and click on &lt;strong&gt;Create&lt;/strong&gt;. Enter a unique &lt;strong&gt;Client ID&lt;/strong&gt; (e.g., &lt;code&gt;my-app&lt;/code&gt;) and choose &lt;strong&gt;OpenID Connect&lt;/strong&gt; as the protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure Redirect URIs&lt;/strong&gt;: Enter valid redirect URIs where Keycloak can redirect after successful authentication. These URIs must match the redirect URIs configured in your application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set Client Settings&lt;/strong&gt;: Configure additional settings such as &lt;strong&gt;Access Type&lt;/strong&gt; (choose &lt;code&gt;confidential&lt;/code&gt; for server-side apps), &lt;strong&gt;Client Authentication&lt;/strong&gt;, and &lt;strong&gt;Authorization Settings&lt;/strong&gt; as per your application's requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate Credentials&lt;/strong&gt;: After saving the client, Keycloak will generate a &lt;strong&gt;Client Secret&lt;/strong&gt; or allow you to create client certificates if using mutual TLS. Save this secret, as it will be needed for your application to communicate with Keycloak.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Set Up User Authentication
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create Users&lt;/strong&gt;: Navigate to the &lt;strong&gt;Users&lt;/strong&gt; section in the Admin Console and create users that will be authenticating via OAuth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set Password Policies&lt;/strong&gt;: Configure password policies, MFA (Multi-Factor Authentication), and other security settings in the &lt;strong&gt;Authentication&lt;/strong&gt; tab.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 5: Integrate with Your Application
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install OAuth Libraries&lt;/strong&gt;: Depending on the technology stack of your application (e.g., Java, Node.js, Python), install the appropriate OAuth libraries (e.g., &lt;code&gt;spring-security-oauth2&lt;/code&gt; for Spring Boot).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure OAuth in Your App&lt;/strong&gt;: In your application, configure the OAuth client with the following details:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client ID&lt;/strong&gt; and &lt;strong&gt;Client Secret&lt;/strong&gt; generated in Keycloak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization Endpoint&lt;/strong&gt;: Typically &lt;code&gt;http://localhost:8080/auth/realms/{realm-name}/protocol/openid-connect/auth&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token Endpoint&lt;/strong&gt;: &lt;code&gt;http://localhost:8080/auth/realms/{realm-name}/protocol/openid-connect/token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Info Endpoint&lt;/strong&gt;: &lt;code&gt;http://localhost:8080/auth/realms/{realm-name}/protocol/openid-connect/userinfo&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle Tokens&lt;/strong&gt;: Implement logic to handle OAuth tokens (Access Token, Refresh Token) securely in your application.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 6: Test the Integration
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initiate OAuth Flow&lt;/strong&gt;: Trigger the OAuth flow from your application (e.g., by clicking on a login button) and ensure that Keycloak's login page is displayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authenticate and Authorize&lt;/strong&gt;: Log in with a Keycloak user and authorize the application to access the requested scopes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receive Tokens&lt;/strong&gt;: Upon successful authentication, your application should receive the OAuth tokens, which can be used for securing API calls or accessing user information.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Setting up Keycloak as an OAuth server involves a series of steps, from configuring realms and clients to integrating with your application. Keycloak’s flexibility allows it to support various use cases, from simple SSO setups to complex identity federation scenarios. With OAuth, your applications can securely delegate authentication, ensuring that user credentials are managed centrally and securely.&lt;/p&gt;

&lt;p&gt;Keycloak’s rich feature set and support for standards like OAuth 2.0 make it an excellent choice for modern applications requiring secure identity management.&lt;/p&gt;

</description>
      <category>keycloak</category>
      <category>authorization</category>
      <category>oauth</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Running Keycloak on Docker for the First Time</title>
      <dc:creator>Samuel Mutemi</dc:creator>
      <pubDate>Mon, 19 Aug 2024 17:26:52 +0000</pubDate>
      <link>https://dev.to/mtsammy40/running-keycloak-on-docker-for-the-first-time-5fja</link>
      <guid>https://dev.to/mtsammy40/running-keycloak-on-docker-for-the-first-time-5fja</guid>
      <description>&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Keycloak is an open-source identity and access management solution designed for modern applications and services. It offers features like single sign-on (SSO), social login, and user federation, making it a powerful tool for managing user identities across various platforms. Running Keycloak on Docker allows you to easily deploy and manage your identity management solution in a containerized environment, ensuring portability and scalability.&lt;/p&gt;

&lt;p&gt;I came across Keycloak when I was working on a personal project and wondered how many times I had written authentication logic over the years. I concluded there had to be a solution that I could use that cross-cuts all basic authentication needs I might have(because looking back, the difference between all the auth services I've written for different apps was small). This would allow me to get started quicker with new projects as I wouldn't have to think authentication as much. Also, an added advantage I realised was better security - keycloak is written with best practices in mind, and since it is maintained by the community, all I have to do is pull new updates as required.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll walk you through the steps to run Keycloak on Docker for the first time.&lt;/p&gt;

&lt;p&gt;Prerequisites&lt;/p&gt;

&lt;p&gt;Before you begin, ensure that you have the following installed on your machine:&lt;/p&gt;

&lt;p&gt;Docker: Install Docker from the official Docker website.&lt;br&gt;
Docker Compose (optional): While not strictly necessary, Docker Compose simplifies managing multi-container Docker applications.&lt;br&gt;
Step 1: Pull the Keycloak Docker Image&lt;/p&gt;

&lt;p&gt;The first step is to pull the official Keycloak Docker image from the Docker Hub. This image contains everything you need to run Keycloak.&lt;/p&gt;

&lt;p&gt;Open your terminal and run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull quay.io/keycloak/keycloak:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command pulls the latest Keycloak image from the Quay.io repository.&lt;/p&gt;

&lt;p&gt;Step 2: Running Keycloak as a Standalone Container&lt;/p&gt;

&lt;p&gt;To run Keycloak as a standalone container, execute the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d -p 8080:8080 --name keycloak \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin_password \
quay.io/keycloak/keycloak:latest start-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s break down the command:&lt;/p&gt;

&lt;p&gt;-d: Runs the container in detached mode (in the background).&lt;br&gt;
-p 8080:8080: Maps port 8080 of the container to port 8080 on your host machine.&lt;br&gt;
--name keycloak: Names the container "keycloak".&lt;br&gt;
-e KEYCLOAK_ADMIN=admin: Sets the Keycloak admin username.&lt;br&gt;
-e KEYCLOAK_ADMIN_PASSWORD=admin_password: Sets the Keycloak admin password.&lt;br&gt;
quay.io/keycloak/keycloak:latest start-dev: Specifies the image and starts Keycloak in development mode.&lt;br&gt;
Once the container starts, you can access Keycloak by navigating to &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt; in your web browser. You’ll be prompted to log in using the admin credentials you specified in the command.&lt;/p&gt;

&lt;p&gt;Step 3: Running Keycloak with Docker Compose (Optional)&lt;/p&gt;

&lt;p&gt;If you prefer using Docker Compose to manage your containers, you can create a docker-compose.yml file for Keycloak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yaml
version: '3'

services:
  keycloak:
    image: quay.io/keycloak/keycloak:latest
    ports:
      - "8080:8080"
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin_password
    command:
      - start-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this file and run the following command to start Keycloak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will start Keycloak as a background service, making it easier to manage along with other services.&lt;/p&gt;

&lt;p&gt;Step 4: Accessing the Keycloak Admin Console&lt;/p&gt;

&lt;p&gt;With Keycloak up and running, you can now access the admin console. Open your web browser and navigate to &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;. Log in using the admin credentials you set earlier.&lt;/p&gt;

&lt;p&gt;Once logged in, you can start configuring realms, clients, users, and other Keycloak settings according to your needs.&lt;/p&gt;

&lt;p&gt;Step 5: Stopping and Removing the Keycloak Container&lt;/p&gt;

&lt;p&gt;To stop the Keycloak container, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker stop keycloak
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To remove the container, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker rm keycloak
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you used Docker Compose, you can stop and remove the containers with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Running Keycloak on Docker is a straightforward process that allows you to quickly set up a robust identity and access management solution. With Docker's containerization, you can easily manage, scale, and deploy Keycloak across different environments. Whether you're running it as a standalone container or using Docker Compose for a more complex setup, Keycloak on Docker offers a flexible and powerful solution for your identity management needs.&lt;/p&gt;

</description>
      <category>authentication</category>
      <category>authorization</category>
      <category>docker</category>
      <category>microservices</category>
    </item>
  </channel>
</rss>
