<?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: Derek Kahre</title>
    <description>The latest articles on DEV Community by Derek Kahre (@derek_kahre).</description>
    <link>https://dev.to/derek_kahre</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%2F4009606%2Fe4840361-ef94-4a95-ab28-215765c97684.jpg</url>
      <title>DEV Community: Derek Kahre</title>
      <link>https://dev.to/derek_kahre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/derek_kahre"/>
    <language>en</language>
    <item>
      <title>Making the Web Accessible: Fixing an Open-Source Nav Bar</title>
      <dc:creator>Derek Kahre</dc:creator>
      <pubDate>Thu, 23 Jul 2026 13:19:12 +0000</pubDate>
      <link>https://dev.to/derek_kahre/making-the-web-accessible-fixing-an-open-source-nav-bar-45pc</link>
      <guid>https://dev.to/derek_kahre/making-the-web-accessible-fixing-an-open-source-nav-bar-45pc</guid>
      <description>&lt;p&gt;Keeping the internet accessible is a huge passion of mine. Whenever I can, I love jumping into open-source projects to help teams who share that same mission!&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the Issue
&lt;/h2&gt;

&lt;p&gt;Recently, I came across an open-source repo where the maintainers were asking for help—their navigation bar was giving screen-reader users a rough time. I cloned the project to my local machine, fired up a dev server on localhost:3000 using npm run dev, and got to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing &amp;amp; Implementing the Fix
&lt;/h2&gt;

&lt;p&gt;With a little help from AI to brainstorm the best semantic structure, I added aria-label tags and updated the markup to give screen readers proper context. I re-tested the live local build using the WAVE Chrome extension, and sure enough, all the navbar accessibility alerts vanished—without breaking the site's layout!&lt;/p&gt;

&lt;p&gt;It brings my heart genuine joy knowing I'm helping make the web a little more accessible for everyone. Onward!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>a11y</category>
      <category>beginners</category>
      <category>html</category>
    </item>
    <item>
      <title>Checking My Work: How I Audited My Chatbot's Database Security</title>
      <dc:creator>Derek Kahre</dc:creator>
      <pubDate>Mon, 20 Jul 2026 14:27:49 +0000</pubDate>
      <link>https://dev.to/derek_kahre/checking-my-work-how-i-audited-my-chatbots-database-security-pb1</link>
      <guid>https://dev.to/derek_kahre/checking-my-work-how-i-audited-my-chatbots-database-security-pb1</guid>
      <description>&lt;p&gt;I’ve been working on an exciting &lt;a href="https://derekkahre-ux.github.io/church-chat-bot/" rel="noopener noreferrer"&gt;new chatbot project lately&lt;/a&gt;. While looking over my notes from last week, I noticed a reminder I left myself to check for security bugs and vulnerabilities.&lt;/p&gt;

&lt;p&gt;I teamed up with AI to dig into the project and evaluate my setup. Here is how I double-checked my work to get some peace of mind:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Hunting for Leaked Keys
&lt;/h2&gt;

&lt;p&gt;First, I wanted to make sure my secret database keys hadn't accidentally leaked into my public GitHub code. I used a handy trick by pressing the "." key on GitHub to open the web editor. From there, I ran a global project search for any restricted service strings or secret prefixes.&lt;/p&gt;

&lt;p&gt;The Result: The repository was completely clean. Only the safe, public-facing anonymous keys were in the frontend code.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Checking the Supabase RLS Policy
&lt;/h2&gt;

&lt;p&gt;Next, I jumped into my Supabase dashboard to look at my Row-Level Security (RLS) settings. When you are prototyping quickly, it is easy to accidentally give a table open access just to get it working.&lt;/p&gt;

&lt;p&gt;The Fix: I verified that my chat logging table was set to a strict "Insert-Only" public policy. This means users can submit their chat text to the database, but they cannot read, update, or delete anyone else's data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;It is a great feeling to check off that security item and know the database is handled responsibly. Building with AI lets you move incredibly fast, but taking the time to audit the backend is where the real learning happens.&lt;/p&gt;

&lt;p&gt;How do you guys like to double-check your work or audit your database settings when you're building? Let me know in the comments!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>beginners</category>
      <category>supabase</category>
    </item>
    <item>
      <title>From Legos to Referees: A Brief History of How Online Games Actually Work</title>
      <dc:creator>Derek Kahre</dc:creator>
      <pubDate>Fri, 17 Jul 2026 19:02:48 +0000</pubDate>
      <link>https://dev.to/derek_kahre/from-legos-to-referees-a-brief-history-of-how-online-games-actually-work-1e6o</link>
      <guid>https://dev.to/derek_kahre/from-legos-to-referees-a-brief-history-of-how-online-games-actually-work-1e6o</guid>
      <description>&lt;p&gt;Have you ever wondered what’s actually happening behind the scenes when you're staring at a mobile loading screen, or why players suddenly "teleport" backward when your Wi-Fi hiccups?&lt;/p&gt;

&lt;p&gt;Making a game talk to players all over the world is a massive puzzle. Over the last 25 years, developers and hackers have played a high-stakes chess match to figure out the best way to build digital worlds. Here is the secret history of how online gaming evolved from simple web pages to massive multiplayer universes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 1: The "Wooden Block" Era (The Early 2000s)
&lt;/h2&gt;

&lt;p&gt;Back in the early days of the internet, games like Neopets' NeoQuest didn't have smooth graphics or fancy apps. They were built using standard web server tools.&lt;/p&gt;

&lt;p&gt;Every single time you took a step or swung a sword, your web browser had to completely reload a brand-new page. The game's "brain" lived on a server far away, which would take your move, update a giant digital spreadsheet (a database) tracking your stats, and send a whole new webpage back to your screen. It was clunky, but it meant your game automatically saved exactly where you left off, even if you shut down your computer for months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 2: The All-In-One Box (The Flash Era)
&lt;/h2&gt;

&lt;p&gt;Soon, players wanted faster, smoother gameplay. Enter Adobe Flash. Instead of waiting for a server to load a new page every second, websites started sending your computer a single, self-contained file.&lt;/p&gt;

&lt;p&gt;Inside this file was everything: the graphics, the sound, and the programming brain. Because it ran entirely inside your computer's local memory, the games were lightning-fast. The only time the game talked to the internet was at the very end to say, "Hey, this player just scored 1,500 points, go save it to their profile!"&lt;/p&gt;

&lt;p&gt;The catch? Because the game's brain lived entirely on the player's computer, clever hackers figured out they could manipulate their computer's memory to instantly change their score to 999,999. Game developers fought back with "sanity checks" (code that auto-banned impossible scores) and encryption codes, starting a decade-long game of cat-and-mouse with cheaters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 3: The Ultimate Referee (Modern Mobile &amp;amp; Multiplayer)
&lt;/h2&gt;

&lt;p&gt;To finally achieve checkmate against hackers, modern gaming moved the entire game board away from the player's device. Today, games use two main architectures to connect players:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Client-Server Model&lt;br&gt;
Used by massive games like Hearthstone or Fortnite, your phone acts as a basic screen and controller, but a powerful cloud server acts as the Ultimate Referee. When you tap "Attack," your phone asks the server for permission. The server calculates the math, decides if the hit was legal, and commands everyone's phones to show the result. It completely stops cheating, but renting these massive server computers globally costs millions of dollars.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Peer-to-Peer (P2P) Model&lt;br&gt;
To save money, some games—even fast-paced ones like Mario Kart—skip the expensive gameplay servers. Instead, they use a lightweight Matchmaking Server just to act as a digital dating agency, dropping players into a lobby together. Once the match starts, the server leaves, and the players' devices talk directly to each other.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because there is no official referee, the devices have to constantly guess and predict where other players are moving. When the connection stutters, the illusion breaks, causing "phantom hits" or characters magically teleporting across the screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Modern App Blueprint
&lt;/h2&gt;

&lt;p&gt;Today, whether an app is built for iOS or Android, developers use standard building blocks to manage this chaos. They weave together UI components (the graphics you see), programming brains (like Swift or Kotlin), and APIs (the tools that let apps talk to your phone's hardware, like its GPS or pedometer).&lt;/p&gt;

&lt;p&gt;From hand-carving text-based web pages to orchestrating millions of devices talking to each other in milliseconds, online gaming has turned into an incredible feat of engineering—all so you can slay dragons with your friends from the comfort of your couch.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>watercooler</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Role of Calibration When Deploying AI in Faith Spaces</title>
      <dc:creator>Derek Kahre</dc:creator>
      <pubDate>Mon, 13 Jul 2026 16:11:17 +0000</pubDate>
      <link>https://dev.to/derek_kahre/the-role-of-calibration-when-deploying-ai-in-faith-spaces-3hhi</link>
      <guid>https://dev.to/derek_kahre/the-role-of-calibration-when-deploying-ai-in-faith-spaces-3hhi</guid>
      <description>&lt;h2&gt;
  
  
  The Role of Calibration When Deploying AI in Faith Spaces
&lt;/h2&gt;

&lt;p&gt;I’ve been spending a lot of time lately building with AI—specifically wrestling with cloud databases and chatbot integration. But a recent engineering report caught my eye that made me step back and think about what we are actually building.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Findings: Benchmarking Human Flourishing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gloo.com/gloo-news/fai-insights-report-june-2026" rel="noopener noreferrer"&gt;Gloo recently released their second Flourishing AI Initiative (FAI) Insights Report&lt;/a&gt;. Instead of testing how fast or smart an AI is, they analyzed how well 36 major AI models align with a Christian worldview when answering deep questions about character, relationships, meaning, and faith.&lt;/p&gt;

&lt;p&gt;The core takeaway really stuck with me: AI models show a massive gap in performance when moving from general human topics to a Christian worldview lens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Challenge: Procedural Secularism
&lt;/h2&gt;

&lt;p&gt;As leading AI models strive to be "neutral and unbiased," they naturally default to a secular perspective. They handle daily logistics like health and finances incredibly well, but they consistently drift or flatten out when asked to engage with value-laden, theological, or spiritually sensitive questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Considerations for Tech Builders
&lt;/h2&gt;

&lt;p&gt;For developers and organizations building tools for faith-based spaces, this highlights an important design consideration. Within the church, conversations around AI can easily lean toward fear or outright rejection of the technology. But this data gives us a practical, objective look at what is actually happening: the models aren't necessarily malicious, but they are calibrated toward secular defaults.&lt;/p&gt;

&lt;p&gt;The goal isn't to force Big Tech to adopt a specific religious framework. The goal is for those of us building tools for faith communities to understand these defaults so we can evaluate, safeguard, and build responsibly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Discuss
&lt;/h2&gt;

&lt;p&gt;Have you noticed worldview drift in the AI models you use? How is your team handling values-alignment?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>ethics</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Building with AI, Engineering the Fix: Shipping a Chatbot to GitHub Pages</title>
      <dc:creator>Derek Kahre</dc:creator>
      <pubDate>Sat, 11 Jul 2026 17:07:10 +0000</pubDate>
      <link>https://dev.to/derek_kahre/building-with-ai-engineering-the-fix-shipping-a-chatbot-to-github-pages-idk</link>
      <guid>https://dev.to/derek_kahre/building-with-ai-engineering-the-fix-shipping-a-chatbot-to-github-pages-idk</guid>
      <description>&lt;p&gt;"I’ve been getting back into flexing my developer muscles after an extended break, and I thought what better way to start than building something with today’s AI tools? The landscape has changed so much since I last coded—I'm so glad I don't have to scour dozens of search results just to find a simple fix anymore.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 20-Minute Sandbox Build
&lt;/h2&gt;

&lt;p&gt;To kick things off, I decided to build a basic chatbot. Using Bolt.new, I prompted what I wanted, and it compiled the initial code in about 20 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Moving to Production: Where the Real Engineering Began
&lt;/h2&gt;

&lt;p&gt;Of course, getting it working in Bolt’s local sandbox was the easy part. The real work started when I tried to deploy it to my GitHub repository. Because GitHub Pages handles paths differently, the build broke immediately.&lt;/p&gt;

&lt;p&gt;That's where the modern AI workflow really shines. Instead of slogging through endless forums for "why is my path breaking," I was able to use AI to help diagnose the configuration issues, fix the relative paths in my JSON objects, and securely wire up my Supabase backend token.&lt;/p&gt;




&lt;h2&gt;
  
  
  Check Out the Project
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://derekkahre-ux.github.io/church-chat-bot/" rel="noopener noreferrer"&gt;You can check out the project here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For those of you who have been in the game for a while, what has it been like adapting your workflow to AI development versus the old way of doing things?"&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>ai</category>
      <category>career</category>
    </item>
    <item>
      <title>Fixing the "Invisible" Accessibility Bug: Cumulative Layout Shift (CLS)</title>
      <dc:creator>Derek Kahre</dc:creator>
      <pubDate>Mon, 06 Jul 2026 23:11:00 +0000</pubDate>
      <link>https://dev.to/derek_kahre/fixing-the-invisible-accessibility-bug-cumulative-layout-shift-cls-538p</link>
      <guid>https://dev.to/derek_kahre/fixing-the-invisible-accessibility-bug-cumulative-layout-shift-cls-538p</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgzng1nwfxdjl9dteyozk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgzng1nwfxdjl9dteyozk.jpg" alt="A person looking at and using a Computer" width="640" height="960"&gt;&lt;/a&gt;&lt;br&gt;
When we think about web accessibility, we usually think about adding alt text to images or ensuring color contrast is high enough. But this week, while building out the skeleton for a responsive, accessible toy store project, a strict scanner taught me about an "invisible" accessibility bug that completely changes how a page feels to a user.&lt;/p&gt;

&lt;p&gt;I deployed my initial HTML structure to GitHub Pages and ran it through Powermapper (SortSite). While basic checkers gave me a pass, Powermapper flagged a warning about missing image width and height dimensions.&lt;/p&gt;

&lt;p&gt;At first glance, it feels like a minor layout issue, but it's actually an accessibility hurdle known as Cumulative Layout Shift (CLS).&lt;/p&gt;

&lt;p&gt;The Problem: Jumping Layouts&lt;br&gt;
When you omit image dimensions, the browser assumes the image takes up 0 pixels of space until the file completely downloads. The moment the image pops in, it violently pushes all the content below it down the screen.&lt;/p&gt;

&lt;p&gt;For a user utilizing screen magnification software, or someone with motor-control challenges trying to click a button, that sudden "jump" can make them completely lose their place or accidentally click the wrong element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "A-Ha" Fix&lt;/strong&gt;&lt;br&gt;
To fix this without breaking your responsive design on mobile, you have to let the browser pre-calculate the aspect ratio box before the image loads. You do this by combining native HTML attributes with a tiny splash of CSS.&lt;/p&gt;

&lt;p&gt;Here is the exact pattern that cleared the error:&lt;/p&gt;

&lt;p&gt;HTML&lt;br&gt;
&lt;br&gt;
  &amp;lt;br&amp;gt;
    /* This ensures the image stays fluid and shrinks on mobile screens */&amp;lt;br&amp;gt;
    img { &amp;lt;br&amp;gt;
      max-width: 100%; &amp;lt;br&amp;gt;
      height: auto; &amp;lt;br&amp;gt;
    }&amp;lt;br&amp;gt;
  &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
  &amp;lt;!-- Hardcoding the native dimensions lets the browser reserve the exact space --&amp;gt;&lt;br&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fky239ttzju2vw9ik7s67.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fky239ttzju2vw9ik7s67.JPG" width="800" height="1067"&gt;&lt;/a&gt;
       alt="Set of rocks with distinct tactile textures." &lt;br&gt;
       width="300" &lt;br&gt;
       height="300"&amp;gt;&lt;br&gt;
&lt;br&gt;
By putting the dimensions back in the HTML, the browser leaves a perfect placeholder box open while the image downloads. No shifting, no jumping, and a completely stable reading experience.&lt;/p&gt;

&lt;p&gt;If you are auditing your own junior projects, I highly recommend throwing them into a stricter scanner like Powermapper to see what layout vulnerabilities might be hiding in plain sight.&lt;/p&gt;

&lt;p&gt;Hopefully, this saves someone else a few hours of head-scratching today! What's an "invisible" bug a compiler or scanner has caught for you recently?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>a11y</category>
    </item>
  </channel>
</rss>
