<?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: Mia Keller</title>
    <description>The latest articles on DEV Community by Mia Keller (@mia_keller_ffd2584c046ecb).</description>
    <link>https://dev.to/mia_keller_ffd2584c046ecb</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%2F4008633%2Fbe4e1f06-5ae2-4b3c-95e1-446ae32be7df.png</url>
      <title>DEV Community: Mia Keller</title>
      <link>https://dev.to/mia_keller_ffd2584c046ecb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mia_keller_ffd2584c046ecb"/>
    <language>en</language>
    <item>
      <title>Midnight Ramen Lab 🍜 — Interactive Comfort Food Landing Page</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Wed, 05 Aug 2026 15:22:13 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/midnight-ramen-lab-interactive-comfort-food-landing-page-25fp</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/midnight-ramen-lab-interactive-comfort-food-landing-page-25fp</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge - Comfort Food Edition, Perfect Landing&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;For this challenge, I wanted to capture the ultimate late-night comfort food vibe: a warm, neon-drenched ramen bar landing page called &lt;strong&gt;Midnight Ramen Lab&lt;/strong&gt;, complete with an &lt;strong&gt;interactive noodle bowl builder&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Instead of just a static landing page, I wanted users to experience the joy of customizing their own comfort food right in the browser. Users can mix and match rich broths, artisan noodles, and gourmet toppings (like soft-boiled ajitsuke tamago, crispy nori, and tender chashu pork) to build their dream bowl with real-time visual updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Moody Neon Aesthetics:&lt;/strong&gt; Designed with a dark-mode color palette, glowing neon accents, and cozy typography to evoke a late-night street food stall feeling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Bowl Customization:&lt;/strong&gt; Powered by lightweight JavaScript state management to let users toggle ingredients dynamically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fully Responsive:&lt;/strong&gt; Optimized for seamless viewing across mobile, tablet, and desktop screens.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Journey &amp;amp; Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Conceptualization &amp;amp; Vibe
&lt;/h3&gt;

&lt;p&gt;I started by defining the emotional goal of the landing page: &lt;strong&gt;comfort and warmth&lt;/strong&gt;. I chose a dark, atmospheric color scheme accented with warm amber, fiery red, and neon teal to mimic a cyberpunk-meets-traditional ramen shop.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Crafting the Layout
&lt;/h3&gt;

&lt;p&gt;Using Tailwind CSS via CDN, I quickly laid out a high-impact hero section featuring bold typography, a mouth-watering call-to-action, and the core interactive workspace. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Implementing Interactivity
&lt;/h3&gt;

&lt;p&gt;The biggest challenge—and the most fun part—was building the interactive noodle builder. I used vanilla JavaScript to listen to user clicks on the topping selections, updating the UI elements instantly to reflect their custom ramen bowl configuration.&lt;/p&gt;

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

&lt;p&gt;This challenge was a fantastic reminder of how micro-interactions and thematic design can completely transform a standard landing page into an engaging user experience. Balancing clean layout design with playful frontend state management was both challenging and rewarding!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for checking out my project! Drop your feedback or questions in the comments below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Stop Writing Cover Letters From Scratch: How I Automated the Most Annoying Part of Job Hunting</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Sat, 01 Aug 2026 18:27:16 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/stop-writing-cover-letters-from-scratch-how-i-automated-the-most-annoying-part-of-job-hunting-p4e</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/stop-writing-cover-letters-from-scratch-how-i-automated-the-most-annoying-part-of-job-hunting-p4e</guid>
      <description>&lt;p&gt;Job hunting is exhausting. Between tweaking resumes, updating portfolios, and filling out endless application forms, the absolute worst part has always been &lt;strong&gt;writing a custom cover letter for every single role&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Let's be honest: &lt;strong&gt;nobody wants to write them&lt;/strong&gt;, and recruiters rarely want to read generic templates. &lt;/p&gt;

&lt;p&gt;A few weeks ago, I finally snapped after spending an entire evening staring at a blank document trying to sound "professionally passionate" about a company I barely knew. I decided to build a quick utility tool for myself called &lt;strong&gt;&lt;a href="https://coverforge.io" rel="noopener noreferrer"&gt;CoverForge&lt;/a&gt;&lt;/strong&gt; just to pipe my resume and a job description into an LLM and get a &lt;strong&gt;tailored draft instantly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It turned out to be a &lt;strong&gt;massive time-saver&lt;/strong&gt;. Instead of wasting hours tailoring buzzwords, it structures a clean, compelling draft in seconds that actually sounds human. &lt;/p&gt;

&lt;p&gt;If you are currently applying for roles and drowning in boilerplate text, here is my advice: &lt;strong&gt;stop doing it manually&lt;/strong&gt;. You can check out &lt;strong&gt;&lt;a href="https://coverforge.io" rel="noopener noreferrer"&gt;CoverForge&lt;/a&gt;&lt;/strong&gt; to handle the heavy lifting of tailoring cover letters so you can &lt;strong&gt;focus on actual interview prep&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;How do you usually handle cover letters? Let me know your workflow in the comments below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>beginners</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The Junior Developer Pipeline Is Broken... And AI Broke It</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Wed, 29 Jul 2026 18:20:33 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/the-junior-developer-pipeline-is-broken-and-ai-broke-it-4i19</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/the-junior-developer-pipeline-is-broken-and-ai-broke-it-4i19</guid>
      <description>&lt;p&gt;Every senior developer, engineering manager, and tech recruiter I’ve talked to recently is echoing the exact same sentiment: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"We just don't have the bandwidth to onboard entry-level developers right now when AI can write boilerplate code, draft unit tests, and refactor functions in seconds."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On paper, it sounds like peak efficiency. Companies save budgets, mid/senior devs move faster, and code gets shipped. But if you look just two inches past your nose, there is a massive, terrifying crisis looming over our industry:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If we stop hiring and training junior developers today, where do senior engineers come from five years from now?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We are actively sawing off the bottom rongs of the software engineering career ladderBilkul! Aapse seedha optimized aur full-length draft share kar raha hoon. &lt;/p&gt;

&lt;p&gt;Iss expanded draft mein &lt;strong&gt;~1,200+ words&lt;/strong&gt; hain, clean structure hai, aur &lt;strong&gt;Point 3 aur 4 ke beech ek dedicated section&lt;/strong&gt; bana diya hai jahan aap dev.to ki kisi purani post, project, ya related topic ka internal link insert kar sakte hain.&lt;/p&gt;




&lt;h3&gt;
  
  
  📄 Complete Markdown Body
&lt;/h3&gt;

&lt;p&gt;markdown&lt;br&gt;
Every senior software engineer, tech lead, and hiring manager I’ve spoken with over the last few months seems to be coming to the exact same conclusion: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"We simply don't have the bandwidth, time, or budget to onboard entry-level developers right now—not when modern AI tools can generate boilerplate code, draft suite tests, and refactor functions in a fraction of a second."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On paper, this shift looks like the ultimate win for software business efficiency. Engineering budgets are trimmed, senior teams report faster sprint cycles, and software gets pushed to production faster than ever. But if you step back and look at the larger trajectory of our industry, a critical problem emerges:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If tech companies stop hiring, mentoring, and retaining junior engineers today, where will the next generation of senior engineers come from five years down the line?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We are actively dismantling the foundational steps of the software engineering career ladder while falsely assuming that everyone can simply remain at the top forever.&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 Table of Contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1. The Extinction of Traditional "Junior" Tasks&lt;/li&gt;
&lt;li&gt;2. The Unrealistic Velocity Expectation Gap&lt;/li&gt;
&lt;li&gt;3. The Illusion of Competence &amp;amp; Synthetic Debugging Debt&lt;/li&gt;
&lt;li&gt;🔗 Deep Dive: Related Reading &amp;amp; Architecture Case Studies&lt;/li&gt;
&lt;li&gt;4. Rebuilding the Pipeline: What Needs to Change&lt;/li&gt;
&lt;li&gt;💬 Join the Discussion&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  1. The Extinction of Traditional "Junior" Tasks
&lt;/h3&gt;

&lt;p&gt;Historically, software engineers did not master system design by reading books or watching lectures—they built their mental models by tackling grunt work. Junior developers steadily gained confidence and mapped out complex codebases by handling essential, repetitive tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing basic unit tests and increasing test coverage&lt;/li&gt;
&lt;li&gt;Squashing minor CSS alignment bugs and front-end quirks&lt;/li&gt;
&lt;li&gt;Migrating legacy code patterns to updated syntax&lt;/li&gt;
&lt;li&gt;Updating outdated internal API documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today, AI coding assistants and autonomous agents process these exact tasks in moments. Because these introductory assignments have been fully automated, the barrier to entering the industry has skyrocketed overnight. The safe runway where new developers once learned, made mistakes, and matured as engineers has largely vanished.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. The Unrealistic Velocity Expectation Gap
&lt;/h3&gt;

&lt;p&gt;Because generative tools make code output nearly instantaneous, project leaders and executives now expect fresh graduates to deliver with the output velocity of mid-level engineers right from their first week.&lt;/p&gt;

&lt;p&gt;We are placing developers who are still building their technical fundamentals into complex environments and expecting them to navigate distributed systems without support. When a beginner is dropped into a massive microservices setup, AI won't save them from fundamental mistakes—it will merely supply plausible-sounding solutions that the engineer doesn't yet know how to evaluate or test.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. The Illusion of Competence &amp;amp; Synthetic Debugging Debt
&lt;/h3&gt;

&lt;p&gt;This dynamic gives rise to one of the most dangerous hidden threats in modern software development: &lt;strong&gt;The Illusion of Competence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Early-career engineers are increasingly relying on AI models to generate code blocks that they don't fully comprehend. The generated code might look clean, pass surface-level linters, and get approved during quick reviews. However, when those modules hit unexpected edge cases in live production, the developer lacks the underlying mental framework needed to diagnose the failure.&lt;/p&gt;

&lt;p&gt;True debugging skills aren't built on syntax memorization; they require a deep mental model of memory behavior, network calls, state execution, and logic flow. Prompting an AI assistant cannot substitute for hands-on experience when diagnosing a core architectural failure.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Deep Dive: Martin Fowler’s classic guide on Refactoring and System Design
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 Related Reading: If you want to understand how developer roles evolve with automation, I highly recommend reading Martin Fowler’s classic guide on &lt;a href="https://martinfowler.com/architecture/" rel="noopener noreferrer"&gt;Refactoring and System Design&lt;/a&gt;, which breaks down why fundamental architectural design matters more than fast code generation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  4. Rebuilding the Pipeline: What Needs to Change
&lt;/h3&gt;

&lt;p&gt;We cannot eliminate AI from developer workflows, nor should we try—it remains an extraordinary force multiplier when applied correctly. However, engineering culture must evolve to accommodate this new reality:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Shift Mentorship Toward Code Auditing:&lt;/strong&gt; Senior developers should shift their focus from teaching juniors &lt;em&gt;how to write syntax&lt;/em&gt; to guiding them on &lt;em&gt;how to review, audit, and evaluate AI-generated architectures&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat Onboarding as Talent Sustainability:&lt;/strong&gt; Companies must recognize that hiring junior engineers was never meant to yield immediate financial returns; it is an essential investment in long-term engineering sustainability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overhaul Computer Science &amp;amp; Bootcamp Curricula:&lt;/strong&gt; Educational programs need to move away from teaching basic CRUD app generation and prioritize real-world debugging, system architecture, and AI output validation.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  💬 Join the Discussion
&lt;/h3&gt;

&lt;p&gt;I would love to hear how your engineering organization is approaching this shift:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For Senior Devs &amp;amp; Engineering Managers:&lt;/strong&gt; How is your team adapting its hiring and mentorship strategies? Are you still opening entry-level positions?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For Juniors &amp;amp; Career Switchers:&lt;/strong&gt; How are you navigating the current market? What steps are you taking to demonstrate value beyond code generation?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Leave your thoughts in the comments below—I’ll be active and replying to every perspective!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Tool definitions as untrusted input makes total sense! Metadata/schema injections are real risk as MCP ecosystems grow. Are you implementing signature verification or cryptographically signed manifests to enforce provenance?</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Wed, 29 Jul 2026 17:37:33 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/tool-definitions-as-untrusted-input-makes-total-sense-metadataschema-injections-are-real-risk-as-12g7</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/tool-definitions-as-untrusted-input-makes-total-sense-metadataschema-injections-are-real-risk-as-12g7</guid>
      <description></description>
      <category>programming</category>
      <category>coding</category>
      <category>softwareengineering</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The point about AI deleting the curriculum rather than just the work is spot on. Essential read for engineering leads trying to figure out where future senior devs will come from.</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Wed, 29 Jul 2026 17:16:24 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/the-point-about-ai-deleting-the-curriculum-rather-than-just-the-work-is-spot-on-essential-read-for-2567</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/the-point-about-ai-deleting-the-curriculum-rather-than-just-the-work-is-spot-on-essential-read-for-2567</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" class="crayons-story__hidden-navigation-link"&gt;The Junior Developer Pipeline Is Broken... And AI Broke It&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Deletes the career ladder&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/nazar-boyko" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F1875383%2F1b3f5dc9-df1c-4551-9f6e-e3b6234b3d6c.gif" alt="nazar-boyko profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/nazar-boyko" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nazar Boyko
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nazar Boyko
                
              
              &lt;div id="story-author-preview-content-4240237" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/nazar-boyko" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F1875383%2F1b3f5dc9-df1c-4551-9f6e-e3b6234b3d6c.gif" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nazar Boyko&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 27&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" id="article-link-4240237"&gt;
          The Junior Developer Pipeline Is Broken... And AI Broke It
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;267&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/nazar-boyko/the-junior-developer-pipeline-is-broken-and-ai-broke-it-1aai#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              213&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How an Unindexed Column Silently Killed Our Database under Load (and the 5-Minute Fix)</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Wed, 29 Jul 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/how-an-unindexed-column-silently-killed-our-database-under-load-and-the-5-minute-fix-m32</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/how-an-unindexed-column-silently-killed-our-database-under-load-and-the-5-minute-fix-m32</guid>
      <description>&lt;h2&gt;
  
  
  How a Missing Database Index Turned an 8ms API into an 8-Second Nightmare
&lt;/h2&gt;

&lt;p&gt;Every developer has a fear of the silent killer: a bug that doesn’t throw a &lt;strong&gt;500 error&lt;/strong&gt; or crash your server immediately, but slowly chokes your application until your database connections completely freeze under heavy traffic.&lt;/p&gt;

&lt;p&gt;This is the story of how a single missing index on a foreign key brought down our staging API during a load test—and how a simple &lt;strong&gt;5-minute fix&lt;/strong&gt; brought response times down from &lt;strong&gt;8 seconds to 12ms&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  😱 The Incident: Connection Timeout &amp;amp; 100% DB CPU
&lt;/h2&gt;

&lt;p&gt;It all started during a routine load test prior to a major feature release. Everything ran smoothly in local development with &lt;strong&gt;100 sample records&lt;/strong&gt;, but as soon as we simulated &lt;strong&gt;500 concurrent users&lt;/strong&gt; against production-sized data (around &lt;strong&gt;1.5 million rows&lt;/strong&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Response Times&lt;/strong&gt; exploded from &lt;strong&gt;45ms&lt;/strong&gt; to over &lt;strong&gt;8,000ms&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database CPU&lt;/strong&gt; hit &lt;strong&gt;100%&lt;/strong&gt; and stayed pinned there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Pool Exhaustion:&lt;/strong&gt; Requests started timing out with &lt;strong&gt;ETIMEDOUT&lt;/strong&gt; errors because every database connection was stuck waiting on open queries.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔍 The Investigation: Uncovering the Full Table Scan
&lt;/h2&gt;

&lt;p&gt;We pulled up query performance metrics and looked at the slow query log. The offending endpoint was &lt;strong&gt;&lt;code&gt;/api/v1/orders/history&lt;/code&gt;&lt;/strong&gt;, which fetches recent orders for a user filtered by status.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Express.js Route
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Express.js route handling user order history&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/v1/orders/history&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&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;orders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;`SELECT * FROM orders
       WHERE user_id = $1
         AND status = $2
       ORDER BY created_at DESC
       LIMIT 20`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Database query timed out&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we ran &lt;strong&gt;&lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt;&lt;/strong&gt; on PostgreSQL for that query, the diagnosis was brutal.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Query Plan (Before Index)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QUERY PLAN
----------------------------------------------------------------------------------
Seq Scan on orders  (cost=0.00..38420.00 rows=15 width=128)
(actual time=412.304..8150.120 rows=20 loops=1)

Filter: ((user_id = 10482)
      AND ((status)::text = 'completed'::text))

Rows Removed by Filter: 1499980

Planning Time: 0.182 ms
Execution Time: 8150.210 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because there was &lt;strong&gt;no index on &lt;code&gt;user_id&lt;/code&gt;&lt;/strong&gt;, PostgreSQL had to perform a &lt;strong&gt;Sequential Scan&lt;/strong&gt;, reading through all &lt;strong&gt;1.5 million rows&lt;/strong&gt; for every single API request.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;100 concurrent requests&lt;/strong&gt;, the database engine was effectively scanning &lt;strong&gt;150 million rows&lt;/strong&gt; simultaneously.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Fix: Compound Indexing
&lt;/h2&gt;

&lt;p&gt;The fix was deceptively simple, but choosing the right index mattered.&lt;/p&gt;

&lt;p&gt;Adding an index on only &lt;strong&gt;&lt;code&gt;user_id&lt;/code&gt;&lt;/strong&gt; would improve filtering, but a &lt;strong&gt;composite index&lt;/strong&gt; on &lt;strong&gt;&lt;code&gt;(user_id, status, created_at DESC)&lt;/code&gt;&lt;/strong&gt; allows PostgreSQL to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filter by &lt;strong&gt;user_id&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Filter by &lt;strong&gt;status&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Return the newest rows immediately&lt;/li&gt;
&lt;li&gt;Avoid an extra sorting step&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📦 Migration Script
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Database Migration Script (Knex.js)&lt;/span&gt;
&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;up&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;knex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Build the index without blocking writes&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;knex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
    CREATE INDEX CONCURRENTLY IF NOT EXISTS
    idx_orders_user_status_created
    ON orders (user_id, status, created_at DESC);
  `&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; In production, build indexes using &lt;strong&gt;&lt;code&gt;CONCURRENTLY&lt;/code&gt;&lt;/strong&gt; whenever possible so PostgreSQL doesn't lock the table for incoming writes while creating the index.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📊 The Results
&lt;/h2&gt;

&lt;p&gt;Running &lt;strong&gt;&lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt;&lt;/strong&gt; after the index was created:&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Query Plan (After Index)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QUERY PLAN
----------------------------------------------------------------------------------
Index Scan using idx_orders_user_status_created on orders
(cost=0.43..8.45 rows=20 width=128)
(actual time=0.042..0.118 rows=20 loops=1)

Planning Time: 0.085 ms
Execution Time: 0.142 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🚀 Performance Improvements
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Query Execution Time:&lt;/strong&gt; &lt;strong&gt;8,150ms ➜ 0.14ms&lt;/strong&gt; (&lt;strong&gt;99.9% faster&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Latency:&lt;/strong&gt; &lt;strong&gt;8 seconds ➜ 12ms&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database CPU Usage:&lt;/strong&gt; &lt;strong&gt;100% ➜ under 8%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Pool:&lt;/strong&gt; No more timeout errors under load&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local development can be misleading.&lt;/strong&gt; Queries that perform perfectly on &lt;strong&gt;100 rows&lt;/strong&gt; may completely fall apart with &lt;strong&gt;1,000,000+ rows&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index your foreign keys.&lt;/strong&gt; Many ORMs don't automatically create indexes for columns like &lt;code&gt;user_id&lt;/code&gt;, &lt;code&gt;tenant_id&lt;/code&gt;, or &lt;code&gt;organization_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always use &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt;.&lt;/strong&gt; Before upgrading hardware or increasing database resources, inspect the execution plan. The database usually tells you exactly what's wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design indexes around your queries&lt;/strong&gt;, not just your schema.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Performance problems don't always come from bad code.&lt;/p&gt;

&lt;p&gt;Sometimes, a &lt;strong&gt;single missing database index&lt;/strong&gt; is enough to turn a fast API into an unusable one under real traffic.&lt;/p&gt;

&lt;p&gt;Before scaling your infrastructure, make sure you've optimized your queries.&lt;/p&gt;

&lt;p&gt;Your database—and your future self—will thank you.&lt;/p&gt;




&lt;p&gt;If this post helped you, consider dropping a ❤️ and sharing your own database performance horror story in the comments.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't scale your servers...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scale your queries first.&lt;/strong&gt; 🚀&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Happy coding! 💙&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
    <item>
      <title>How a Silent N+1 Query Almost Melted Our Production Database (and How We Smashed It)</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:22:48 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/how-a-silent-n1-query-almost-melted-our-production-database-and-how-we-smashed-it-49no</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/how-a-silent-n1-query-almost-melted-our-production-database-and-how-we-smashed-it-49no</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every developer fears the silent killer: a bug that doesn’t throw a 500 Internal Server Error, doesn't crash the server instantly, but quietly turns your API into a slow, memory-choking nightmare.&lt;/p&gt;

&lt;p&gt;This is the story of how a seemingly harmless 3-line code change triggered an N+1 query monster, and how we used Sentry performance monitoring to track it down and smash it before a major launch.&lt;/p&gt;




&lt;h2&gt;
  
  
  😱 The Incident: High Latency &amp;amp; Spiking CPU
&lt;/h2&gt;

&lt;p&gt;It started on a Tuesday afternoon. Users began reporting that our dashboard's "Recent Activity" feed was taking 6–8 seconds to load. &lt;/p&gt;

&lt;p&gt;Looking at our metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API response times&lt;/strong&gt; shot up from &lt;strong&gt;120ms&lt;/strong&gt; to &lt;strong&gt;6,500ms&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database CPU utilization&lt;/strong&gt; spiked to 92%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero exceptions&lt;/strong&gt; were being thrown. Everything technically "worked"—it was just painfully slow.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔍 The Investigation: Following the Traces
&lt;/h2&gt;

&lt;p&gt;We pulled up Sentry Performance Tracing to inspect the API endpoint &lt;code&gt;/api/v1/user/activity&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;When we looked at the waterfall span breakdown, the problem jumped out immediately:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt; &lt;code&gt;&lt;br&gt;
[GET] /api/v1/user/activity&lt;br&gt;
  └── SELECT * FROM activities LIMIT 50           ( 15ms )&lt;br&gt;
  └── SELECT * FROM users WHERE id = 12           ( 12ms )&lt;br&gt;
  └── SELECT * FROM users WHERE id = 18           ( 14ms )&lt;br&gt;
  └── SELECT * FROM users WHERE id = 42           ( 11ms )&lt;br&gt;
  ... (47 identical individual queries later) ...&lt;br&gt;
&lt;/code&gt; &lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Instead of fetching all user profiles in a single query, the application was executing &lt;strong&gt;one query for the activity feed, plus 50 additional database queries&lt;/strong&gt;—one for every single user row!&lt;/p&gt;




&lt;h2&gt;
  
  
  🐛 The Root Cause
&lt;/h2&gt;

&lt;p&gt;A quick &lt;code&gt;git blame&lt;/code&gt; revealed a pull request merged earlier that day. A well-intentioned cleanup in our serializer removed eager loading:&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Before (Broken Code):
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt; `javascript&lt;br&gt;
// Missing eager loading of the user relation!&lt;br&gt;
const activities = await Activity.findAll({&lt;br&gt;
  limit: 50,&lt;br&gt;
  order: [['createdAt', 'DESC']]&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;const response = await Promise.all(&lt;br&gt;
  activities.map(async (activity) =&amp;gt; ({&lt;br&gt;
    id: activity.id,&lt;br&gt;
    action: activity.action,&lt;br&gt;
    user: await activity.getUser() // 💥 50 separate DB calls in a loop!&lt;br&gt;
  }))&lt;br&gt;
);&lt;br&gt;
&lt;code&gt; &lt;/code&gt; `&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Smash: Fixing the Leak
&lt;/h2&gt;

&lt;p&gt;To fix this, we updated the query to use &lt;strong&gt;eager loading&lt;/strong&gt; (JOIN), fetching all related user data in &lt;strong&gt;a single SQL query&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ After (Fixed Code):
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt; `javascript&lt;br&gt;
const activities = await Activity.findAll({&lt;br&gt;
  limit: 50,&lt;br&gt;
  order: [['createdAt', 'DESC']],&lt;br&gt;
  include: [{ model: User, attributes: ['id', 'username', 'avatar'] }] // 🚀 Single JOIN query&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;const response = activities.map((activity) =&amp;gt; ({&lt;br&gt;
  id: activity.id,&lt;br&gt;
  action: activity.action,&lt;br&gt;
  user: activity.User&lt;br&gt;
}));&lt;br&gt;
&lt;code&gt; &lt;/code&gt; `&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 The Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database Queries:&lt;/strong&gt; Reduced from &lt;strong&gt;51 queries&lt;/strong&gt; down to &lt;strong&gt;1 single query&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response Time:&lt;/strong&gt; Dropped from &lt;strong&gt;6,500ms ➡️ 85ms&lt;/strong&gt; (a &lt;strong&gt;98.6% speedup!&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DB CPU Load:&lt;/strong&gt; Plummeted back down to normal levels (&amp;lt; 15%).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Beware of async operations inside loops/maps:&lt;/strong&gt; Whenever you see &lt;code&gt;await&lt;/code&gt; inside a &lt;code&gt;.map()&lt;/code&gt;, double-check if you're causing an N+1 problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor transaction spans:&lt;/strong&gt; Errors aren't the only metric that matters. Sentry’s performance spans and transaction traces saved us hours of blind guessing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up query thresholds:&lt;/strong&gt; Catching query bloat in staging before it hits production is the ultimate flex!&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Struggling to manage workload boundaries? Here are 4 easy templates to turn down extra tasks professionally!</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:07:30 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/struggling-to-manage-workload-boundaries-here-are-4-easy-templates-to-turn-down-extra-tasks-12ld</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/struggling-to-manage-workload-boundaries-here-are-4-easy-templates-to-turn-down-extra-tasks-12ld</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/how-to-say-no-at-work-without-looking-lazy-or-unhelpful-1jhb" class="crayons-story__hidden-navigation-link"&gt;How to Say "No" at Work Without Looking Lazy or Unhelpful&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/mia_keller_ffd2584c046ecb" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4008633%2Fbe4e1f06-5ae2-4b3c-95e1-446ae32be7df.png" alt="mia_keller_ffd2584c046ecb profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/mia_keller_ffd2584c046ecb" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Mia Keller
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Mia Keller
                
              
              &lt;div id="story-author-preview-content-4252851" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/mia_keller_ffd2584c046ecb" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4008633%2Fbe4e1f06-5ae2-4b3c-95e1-446ae32be7df.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Mia Keller&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/how-to-say-no-at-work-without-looking-lazy-or-unhelpful-1jhb" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 28&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/how-to-say-no-at-work-without-looking-lazy-or-unhelpful-1jhb" id="article-link-4252851"&gt;
          How to Say "No" at Work Without Looking Lazy or Unhelpful
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/workplace"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;workplace&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softskills"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softskills&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/how-to-say-no-at-work-without-looking-lazy-or-unhelpful-1jhb" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/how-to-say-no-at-work-without-looking-lazy-or-unhelpful-1jhb#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How to Say "No" at Work Without Looking Lazy or Unhelpful</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:07:02 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/how-to-say-no-at-work-without-looking-lazy-or-unhelpful-1jhb</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/how-to-say-no-at-work-without-looking-lazy-or-unhelpful-1jhb</guid>
      <description>&lt;p&gt;We’ve all been there. You’re already buried under a mountain of tasks, deadline looming, and a notification pops up: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Hey! Do you have a quick sec to take a look at this extra project?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your gut says &lt;strong&gt;"I physically don't have time,"&lt;/strong&gt; but your mouth (or keyboard) says &lt;strong&gt;"Sure, happy to help!"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Saying "yes" to everything feels like being a great team player, but in reality, it’s a fast track to burnout, missed deadlines, and low-quality work. The secret isn’t learning to say &lt;em&gt;no&lt;/em&gt; aggressively—it’s learning how to say &lt;em&gt;no&lt;/em&gt; strategically.&lt;/p&gt;

&lt;p&gt;Here are 4 clear, professional ways to turn down extra work while keeping your reputation intact.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Priority Trade-Off
&lt;/h2&gt;

&lt;p&gt;Instead of a flat rejection, put the burden of prioritization back on the person asking (or your manager).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What to say:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"I’d love to help with this! Right now, my main focus is finishing Project X by Thursday. If I take this on, Project X will likely be delayed to next week. Should I shift priorities, or keep focusing on Project X first?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; You aren’t refusing the work; you’re asking them to help manage your bandwidth transparently.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The "Not Now, But Later"
&lt;/h2&gt;

&lt;p&gt;If the request isn't an emergency, defer it to a time when your schedule actually has room.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What to say:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"I’m completely at capacity with [Current Task] for the rest of this week. I can take a look at this next Tuesday once that wraps up. Does that timeline work for you?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; It sets a firm boundary for your immediate schedule while showing that you're still willing to collaborate.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Resource Redirect
&lt;/h2&gt;

&lt;p&gt;If you aren't the right person—or simply don't have the room—point them toward a better solution.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What to say:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"I won't be able to take this on right now due to current commitments, but [Colleague's Name] recently worked on something similar, or you might find what you need in [Documentation/Link]."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; You provide value and help solve their problem without taking on any of the actual labor.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Soft Boundary for "Quick Asks"
&lt;/h2&gt;

&lt;p&gt;"Quick favors" are the biggest productivity killers because they interrupt deep focus.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What to say:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"I'm in the middle of a deep focus block right now. Feel free to send over the details via email/message, and I'll review it during my catch-up time late this afternoon."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; It stops people from pulling you into unexpected meetings or distracting chats while teaching them to respect your focus time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Saying "no" isn't about being unhelpful—it's about protecting the quality of the work you've already committed to. When you protect your time, you deliver better results on the things that actually matter.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>workplace</category>
      <category>softskills</category>
    </item>
    <item>
      <title>🔒 Just published a quick guide on 5 essential cybersecurity practices every developer should implement to protect their apps and user data. Check it out and let me know your top security tips!</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Thu, 23 Jul 2026 16:26:30 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/just-published-a-quick-guide-on-5-essential-cybersecurity-practices-every-developer-should-33dc</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/just-published-a-quick-guide-on-5-essential-cybersecurity-practices-every-developer-should-33dc</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/5-modern-cybersecurity-best-practices-every-developer-should-follow-2ol9" class="crayons-story__hidden-navigation-link"&gt;5 Modern Cybersecurity Best Practices Every Developer Should Follow&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/mia_keller_ffd2584c046ecb" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4008633%2Fbe4e1f06-5ae2-4b3c-95e1-446ae32be7df.png" alt="mia_keller_ffd2584c046ecb profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/mia_keller_ffd2584c046ecb" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Mia Keller
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Mia Keller
                
              
              &lt;div id="story-author-preview-content-4216648" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/mia_keller_ffd2584c046ecb" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4008633%2Fbe4e1f06-5ae2-4b3c-95e1-446ae32be7df.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Mia Keller&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/5-modern-cybersecurity-best-practices-every-developer-should-follow-2ol9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 23&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/5-modern-cybersecurity-best-practices-every-developer-should-follow-2ol9" id="article-link-4216648"&gt;
          5 Modern Cybersecurity Best Practices Every Developer Should Follow
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cybersecurity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cybersecurity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/5-modern-cybersecurity-best-practices-every-developer-should-follow-2ol9" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/5-modern-cybersecurity-best-practices-every-developer-should-follow-2ol9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>5 Modern Cybersecurity Best Practices Every Developer Should Follow</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Thu, 23 Jul 2026 16:25:33 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/5-modern-cybersecurity-best-practices-every-developer-should-follow-2ol9</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/5-modern-cybersecurity-best-practices-every-developer-should-follow-2ol9</guid>
      <description>&lt;p&gt;As developers, we often focus heavily on features, UI/UX, and performance. However, with web applications facing automated bot attacks, API vulnerabilities, and data breaches every single day, security can no longer be an afterthought. &lt;/p&gt;

&lt;p&gt;Whether you are building a full-stack SaaS app or a simple side project, here are &lt;strong&gt;5 essential cybersecurity practices&lt;/strong&gt; every developer should implement to protect their applications and user data.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Implement Strong Authentication &amp;amp; OAuth Standards
&lt;/h2&gt;

&lt;p&gt;Passwords remain a weak link in application security. Moving away from custom authentication systems toward battle-tested OAuth 2.0 / OpenID Connect flows or multi-factor authentication (MFA) dramatically reduces risk.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Never store plain text passwords:&lt;/strong&gt; Always hash passwords using secure algorithms like &lt;code&gt;bcrypt&lt;/code&gt; or &lt;code&gt;Argon2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforce Multi-Factor Authentication (MFA):&lt;/strong&gt; Offer TOTP-based (Time-based One-Time Password) authentication via apps like Google Authenticator or hardware keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure JWT Management:&lt;/strong&gt; Store JSON Web Tokens (JWTs) in &lt;code&gt;HttpOnly&lt;/code&gt; and &lt;code&gt;Secure&lt;/code&gt; cookies rather than &lt;code&gt;localStorage&lt;/code&gt; to mitigate Cross-Site Scripting (XSS) attacks.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Guard Against OWASP Top 10 Vulnerabilities
&lt;/h2&gt;

&lt;p&gt;The OWASP Top 10 provides a clear blueprint of the most critical security risks facing web applications today.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQL Injection (SQLi):&lt;/strong&gt; Always use parameterized queries or trusted Object-Relational Mappers (ORMs) like Prisma, TypeORM, or SQLAlchemy instead of concatenating raw strings into SQL queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Site Scripting (XSS):&lt;/strong&gt; Sanitize all user inputs before rendering them on the frontend. Use frameworks like React or Angular that auto-escape output by default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Site Request Forgery (CSRF):&lt;/strong&gt; Use anti-CSRF tokens or set proper &lt;code&gt;SameSite&lt;/code&gt; flags on cookies (&lt;code&gt;SameSite=Strict&lt;/code&gt; or &lt;code&gt;SameSite=Lax&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Practice the Principle of Least Privilege
&lt;/h2&gt;

&lt;p&gt;Granting excessive permissions is one of the most common configuration errors in modern cloud setups.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Principle of Least Privilege:&lt;/strong&gt; Every user, API key, service account, and application component should have access &lt;em&gt;only&lt;/em&gt; to the specific resources necessary to perform its intended task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Limit database user permissions so your application cannot drop tables or access admin routes if compromised.&lt;/li&gt;
&lt;li&gt;Scope cloud IAM roles (AWS, GCP, Azure) narrowly instead of granting wildcard (&lt;code&gt;*&lt;/code&gt;) access.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Keep Dependencies Updated &amp;amp; Audit Regularly
&lt;/h2&gt;

&lt;p&gt;Modern apps rely heavily on open-source packages. A single compromised NPM or PyPI package can expose your entire backend.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run regular vulnerability scans:&lt;/strong&gt; Use built-in tools like &lt;code&gt;npm audit&lt;/code&gt; or third-party solutions like Snyk and Dependabot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pin dependency versions:&lt;/strong&gt; Lock down exact versions in &lt;code&gt;package-lock.json&lt;/code&gt; or &lt;code&gt;Pipfile.lock&lt;/code&gt; to avoid automatically pulling malicious updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate patching:&lt;/strong&gt; Set up CI/CD pipelines to alert or auto-create pull requests when dependencies have security patches.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Never Hardcode API Keys or Secrets
&lt;/h2&gt;

&lt;p&gt;Accidentally pushing API keys, database URLs, or private keys to public Git repositories happens far too often.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Environment Variables (&lt;code&gt;.env&lt;/code&gt;)&lt;/strong&gt; to store runtime secrets.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;.env&lt;/code&gt; and secret files to your &lt;code&gt;.gitignore&lt;/code&gt; before making your initial commit.&lt;/li&gt;
&lt;li&gt;Use secret scanners like &lt;strong&gt;Gitleaks&lt;/strong&gt; or GitHub’s secret scanning feature to detect accidental leaks in commits.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Building secure software isn't about making an application 100% unhackable—it's about building layers of defense to make exploitation as difficult as possible. By integrating security checks directly into your everyday development workflow, you protect both your users and your infrastructure.&lt;/p&gt;

&lt;p&gt;What cybersecurity practices or tools do you rely on in your tech stack? Let me know in the comments below!&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Are you strictly team manual, or do you leverage AI when applying to dev roles? 🛠️ Broke down what actually works (and what gets ignored) for developer cover letters in 2026. Give it a read and share your process!</title>
      <dc:creator>Mia Keller</dc:creator>
      <pubDate>Thu, 23 Jul 2026 11:42:46 +0000</pubDate>
      <link>https://dev.to/mia_keller_ffd2584c046ecb/are-you-strictly-team-manual-or-do-you-leverage-ai-when-applying-to-dev-roles-broke-down-what-3kfi</link>
      <guid>https://dev.to/mia_keller_ffd2584c046ecb/are-you-strictly-team-manual-or-do-you-leverage-ai-when-applying-to-dev-roles-broke-down-what-3kfi</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/ai-vs-manual-cover-letters-what-actually-works-for-developers-in-2026-5acf" class="crayons-story__hidden-navigation-link"&gt;AI vs Manual Cover Letters: What Actually Works for Developers in 2026&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/mia_keller_ffd2584c046ecb" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4008633%2Fbe4e1f06-5ae2-4b3c-95e1-446ae32be7df.png" alt="mia_keller_ffd2584c046ecb profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/mia_keller_ffd2584c046ecb" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Mia Keller
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Mia Keller
                
              
              &lt;div id="story-author-preview-content-4024522" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/mia_keller_ffd2584c046ecb" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4008633%2Fbe4e1f06-5ae2-4b3c-95e1-446ae32be7df.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Mia Keller&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/ai-vs-manual-cover-letters-what-actually-works-for-developers-in-2026-5acf" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 29&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/ai-vs-manual-cover-letters-what-actually-works-for-developers-in-2026-5acf" id="article-link-4024522"&gt;
          AI vs Manual Cover Letters: What Actually Works for Developers in 2026
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/ai-vs-manual-cover-letters-what-actually-works-for-developers-in-2026-5acf" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;13&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/mia_keller_ffd2584c046ecb/ai-vs-manual-cover-letters-what-actually-works-for-developers-in-2026-5acf#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              4&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
