<?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: Kudzai Murimi</title>
    <description>The latest articles on DEV Community by Kudzai Murimi (@respect17).</description>
    <link>https://dev.to/respect17</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%2F981638%2F1394703d-8965-4066-99cd-a7a85d1f41ec.png</url>
      <title>DEV Community: Kudzai Murimi</title>
      <link>https://dev.to/respect17</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/respect17"/>
    <language>en</language>
    <item>
      <title>🚀 Check out my CoderLegion profile &amp; latest post!

🏆 Points: 760 | 🎱 Badges: 5 | 👥 Followers: 3 | 📄 Posts: 2

Latest post: "New to Bitrise CodePush? Here's What I Wish I Knew Before Setting It Up"
Read it here: https://coderlegion.com/28183/new-to-bit</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Tue, 22 Sep 2026 15:41:20 +0000</pubDate>
      <link>https://dev.to/respect17/check-out-my-coderlegion-profile-latest-post-points-760-badges-5-followers-3--3cc9</link>
      <guid>https://dev.to/respect17/check-out-my-coderlegion-profile-latest-post-points-760-badges-5-followers-3--3cc9</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://coderlegion.com/28183/new-to-bitrise-codepush-heres-what-i-wish-i-knew-before-setting-it-up" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcoderlegion.com%2Fbgcover-meta-img%3Fblobid%3D4936264372432363657" height="554" class="m-0" width="600"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://coderlegion.com/28183/new-to-bitrise-codepush-heres-what-i-wish-i-knew-before-setting-it-up" rel="noopener noreferrer" class="c-link"&gt;
            New to Bitrise CodePush? Here's What I Wish I Knew Before Setting It Up - Coder Legion
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            # New to Bitrise CodePush? Here's What I Wish I Knew Before Setting It Up If you've never used CodePush before, the idea sounds almost too convenient. You find a bug in a React Native app, fix the JavaScript, and instead of waiting for another App...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcoderlegion.com%2Ffavicon-32x32.png" width="32" height="32"&gt;
          coderlegion.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>New to Bitrise CodePush? Here's What I Wish I Knew Before Setting It Up</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Tue, 22 Sep 2026 15:19:58 +0000</pubDate>
      <link>https://dev.to/respect17/new-to-bitrise-codepush-heres-what-i-wish-i-knew-before-setting-it-up-fj1</link>
      <guid>https://dev.to/respect17/new-to-bitrise-codepush-heres-what-i-wish-i-knew-before-setting-it-up-fj1</guid>
      <description>&lt;h1&gt;
  
  
  New to Bitrise CodePush? Here's What I Wish I Knew Before Setting It Up
&lt;/h1&gt;

&lt;p&gt;If you've never used CodePush before, the idea sounds almost too convenient.&lt;/p&gt;

&lt;p&gt;You find a bug in a React Native app, fix the JavaScript, and instead of waiting for another App Store or Google Play release, you can push the update directly to users.&lt;/p&gt;

&lt;p&gt;That's the part that got my attention.&lt;/p&gt;

&lt;p&gt;But once I actually started setting it up, I realized there are quite a few things that aren't obvious from that one-line explanation.&lt;/p&gt;

&lt;p&gt;So if you're new to Bitrise CodePush, here's what I learned while going through the setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  First: What Does CodePush Actually Update?
&lt;/h2&gt;

&lt;p&gt;The easiest way to think about CodePush is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;It updates the JavaScript and assets in your React Native app without requiring a new store release.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So if you've fixed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A JavaScript bug&lt;/li&gt;
&lt;li&gt;Some text or copy&lt;/li&gt;
&lt;li&gt;A small UI issue&lt;/li&gt;
&lt;li&gt;Another change that doesn't require native code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can potentially deliver that fix without submitting a new binary to the App Store or Google Play.&lt;/p&gt;

&lt;p&gt;But there's an important boundary.&lt;/p&gt;

&lt;p&gt;If you change native code, CodePush doesn't magically bypass the app stores.&lt;/p&gt;

&lt;p&gt;You'll still need a normal app release.&lt;/p&gt;

&lt;p&gt;That's probably the first thing I'd make sure the team understands before using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Bitrise Actually Gives You
&lt;/h2&gt;

&lt;p&gt;There are two main parts to the setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. CodePush inside Bitrise Release Management
&lt;/h3&gt;

&lt;p&gt;This is where you manage deployments, upload releases, and control things like rollout percentages.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The SDK inside your application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;@bitrise/code-push-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SDK is responsible for checking whether an update is available and applying it.&lt;/p&gt;

&lt;p&gt;So the basic idea is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bitrise handles the release side → your app handles the update side.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once I understood that split, the rest of the setup made a lot more sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before You Touch the Code
&lt;/h2&gt;

&lt;p&gt;You'll need a Bitrise account and a Release Management app.&lt;/p&gt;

&lt;p&gt;One thing that caught my attention here is that Release Management and your normal Bitrise CI app aren't necessarily the same thing.&lt;/p&gt;

&lt;p&gt;If you're already using Bitrise CI to build your React Native app, Release Management is something you add alongside it.&lt;/p&gt;

&lt;p&gt;And if you're releasing for both iOS and Android, you'll need to account for both platforms in your setup.&lt;/p&gt;

&lt;p&gt;I'd recommend getting the basic Release Management setup working before touching the React Native project.&lt;/p&gt;

&lt;p&gt;It makes troubleshooting much easier.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 1: Create a Deployment
&lt;/h1&gt;

&lt;p&gt;Inside the Release Management app, go to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration → Deployments → New deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a real project, I'd probably start with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Staging&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Production&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That separation is useful.&lt;/p&gt;

&lt;p&gt;You don't want to be testing an update and accidentally send it to everyone using the production app.&lt;/p&gt;

&lt;p&gt;You can either provide an existing deployment key or let Bitrise generate one.&lt;/p&gt;

&lt;p&gt;One thing about deployment keys&lt;/p&gt;

&lt;p&gt;This initially confused me.&lt;/p&gt;

&lt;p&gt;The deployment key looks like something you'd normally hide in a secret.&lt;/p&gt;

&lt;p&gt;But it isn't really a password.&lt;/p&gt;

&lt;p&gt;The key eventually gets included in the application, which means someone with access to the built app could potentially extract it.&lt;/p&gt;

&lt;p&gt;It's better to think of it as an identifier for the deployment rather than a secret credential.&lt;/p&gt;

&lt;p&gt;Your API token is the thing you actually need to protect.&lt;/p&gt;

&lt;p&gt;Step 2: Install the SDK&lt;/p&gt;

&lt;p&gt;The first command is simple:&lt;/p&gt;

&lt;p&gt;npm install @bitrise/code-push-sdk&lt;/p&gt;

&lt;p&gt;After that, things depend on how your React Native app was created.&lt;/p&gt;

&lt;p&gt;And this is one place where I wouldn't recommend blindly copying configuration from a random tutorial.&lt;/p&gt;

&lt;p&gt;Expo and bare React Native aren't configured in exactly the same way.&lt;/p&gt;

&lt;p&gt;If You're Using Expo&lt;/p&gt;

&lt;p&gt;With Expo, you add the CodePush plugin to your app.json.&lt;/p&gt;

&lt;p&gt;You'll need your deployment key and the CodePush server URL.&lt;/p&gt;

&lt;p&gt;The URL follows this pattern:&lt;/p&gt;

&lt;p&gt;https://.codepush.bitrise.io&lt;/p&gt;

&lt;p&gt;Then run:&lt;/p&gt;

&lt;p&gt;npx expo prebuild&lt;/p&gt;

&lt;p&gt;I like doing this step because it lets you check whether the configuration actually made its way into the generated native project.&lt;/p&gt;

&lt;p&gt;If You're Using Bare React Native&lt;/p&gt;

&lt;p&gt;This takes a little more work.&lt;/p&gt;

&lt;p&gt;On iOS, you'll need to make a change in AppDelegate.swift so CodePush can resolve the active release bundle instead of always using the default bundled JavaScript.&lt;/p&gt;

&lt;p&gt;You'll also configure the deployment key and server URL in Info.plist.&lt;/p&gt;

&lt;p&gt;On Android, the configuration goes into strings.xml, along with some Gradle configuration and a change to how MainApplication.kt resolves the JavaScript bundle.&lt;/p&gt;

&lt;p&gt;None of these changes are particularly complicated.&lt;/p&gt;

&lt;p&gt;They're just easy places to make a small mistake.&lt;/p&gt;

&lt;p&gt;That's why I found it better to follow the Bitrise documentation closely rather than trying to recreate the setup from memory.&lt;/p&gt;

&lt;p&gt;Step 3: Think About the User Experience&lt;/p&gt;

&lt;p&gt;This was probably the part I didn't think about enough at first.&lt;/p&gt;

&lt;p&gt;It's easy to look at CodePush as:&lt;/p&gt;

&lt;p&gt;"There's an update, download it."&lt;/p&gt;

&lt;p&gt;But you actually have choices about how that update reaches the user.&lt;/p&gt;

&lt;p&gt;For example, with:&lt;/p&gt;

&lt;p&gt;codePush.sync()&lt;/p&gt;

&lt;p&gt;you can use different behaviours.&lt;/p&gt;

&lt;p&gt;Silent update&lt;/p&gt;

&lt;p&gt;The update downloads in the background and is applied when the app restarts.&lt;/p&gt;

&lt;p&gt;For the user, the whole thing can be almost invisible.&lt;/p&gt;

&lt;p&gt;Update when the app resumes&lt;/p&gt;

&lt;p&gt;Instead of checking only when the app starts, the app can check when it comes back into the foreground.&lt;/p&gt;

&lt;p&gt;Interactive update&lt;/p&gt;

&lt;p&gt;The user gets feedback that an update is available and can be shown the download process.&lt;/p&gt;

&lt;p&gt;For mandatory updates, you can also prevent the user from simply dismissing them.&lt;/p&gt;

&lt;p&gt;You can even use progress callbacks if you want to show download progress.&lt;/p&gt;

&lt;p&gt;I think this is worth deciding before you ship your first update.&lt;/p&gt;

&lt;p&gt;The technically easiest option isn't necessarily the best experience for your users.&lt;/p&gt;

&lt;p&gt;Step 4: Build and Release&lt;/p&gt;

&lt;p&gt;Once the application is configured, you need to create the JavaScript bundle.&lt;/p&gt;

&lt;p&gt;For a bare React Native project:&lt;/p&gt;

&lt;p&gt;npx react-native bundle \&lt;br&gt;
  --platform ios \&lt;br&gt;
  --dev false \&lt;br&gt;
  --entry-file index.js \&lt;br&gt;
  --bundle-output ./build/main.jsbundle \&lt;br&gt;
  --assets-dest ./build&lt;/p&gt;

&lt;p&gt;For Expo:&lt;/p&gt;

&lt;p&gt;expo export:embed&lt;/p&gt;

&lt;p&gt;You then package the generated files and upload them to Release Management.&lt;/p&gt;

&lt;p&gt;You can do this manually from the dashboard, which is probably the easiest way to test your first release.&lt;/p&gt;

&lt;p&gt;Once you've confirmed everything works, that's when I'd start thinking about automation.&lt;/p&gt;

&lt;p&gt;Don't Immediately Send It to Everyone&lt;/p&gt;

&lt;p&gt;This is one feature I'd definitely use in production.&lt;/p&gt;

&lt;p&gt;When you create the release, you can control the rollout.&lt;/p&gt;

&lt;p&gt;You can target specific app versions and use version ranges such as:&lt;/p&gt;

&lt;p&gt;1.2.x&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;=1.2.3 &amp;lt;1.2.7&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can also mark an update as mandatory and control the percentage of users who receive it.&lt;/p&gt;

&lt;p&gt;That last part is important.&lt;/p&gt;

&lt;p&gt;Imagine you've made a JavaScript change that you think is completely safe.&lt;/p&gt;

&lt;p&gt;Instead of immediately sending it to 100% of your users, you can start with a smaller percentage.&lt;/p&gt;

&lt;p&gt;If everything looks good, increase the rollout.&lt;/p&gt;

&lt;p&gt;That gives you a little more room to catch problems before they become everyone's problem.&lt;/p&gt;

&lt;p&gt;What About Automation?&lt;/p&gt;

&lt;p&gt;Once you've manually released a couple of updates, you'll probably notice the repetitive part:&lt;/p&gt;

&lt;p&gt;Build the bundle.&lt;br&gt;
Zip it.&lt;br&gt;
Upload it.&lt;br&gt;
Do it again for the other platform.&lt;/p&gt;

&lt;p&gt;It works.&lt;/p&gt;

&lt;p&gt;But I wouldn't want to do that every week.&lt;/p&gt;

&lt;p&gt;That's where Bitrise CI comes in.&lt;/p&gt;

&lt;p&gt;You can automate the build and upload process so that a workflow handles it for you.&lt;/p&gt;

&lt;p&gt;One approach I like is connecting the release to an approved and labelled pull request rather than automatically releasing every merge.&lt;/p&gt;

&lt;p&gt;That gives you a deliberate point where someone says:&lt;/p&gt;

&lt;p&gt;"This is ready to ship."&lt;/p&gt;

&lt;p&gt;The CI system then takes care of the repetitive work.&lt;/p&gt;

&lt;p&gt;I wrote separately about that automation process because there are a few more details around credentials, versioning, and workflow configuration.&lt;/p&gt;

&lt;p&gt;My Checklist Before the First Release&lt;/p&gt;

&lt;p&gt;If I were setting this up on another project, this is the checklist I'd keep nearby:&lt;/p&gt;

&lt;p&gt;Bitrise Release Management is configured&lt;/p&gt;

&lt;p&gt;iOS and Android are accounted for&lt;/p&gt;

&lt;p&gt;Staging and Production deployments are created&lt;/p&gt;

&lt;p&gt;@bitrise/code-push-sdk is installed&lt;/p&gt;

&lt;p&gt;Expo or native React Native configuration is complete&lt;/p&gt;

&lt;p&gt;The app can successfully check for updates&lt;/p&gt;

&lt;p&gt;The sync behaviour has been chosen&lt;/p&gt;

&lt;p&gt;The first release is tested with a small rollout&lt;/p&gt;

&lt;p&gt;Production releases have an automation plan&lt;/p&gt;

&lt;p&gt;So, Is CodePush Worth It?&lt;/p&gt;

&lt;p&gt;I think it makes the most sense when you regularly have small JavaScript-level fixes that don't justify going through another full app-store release.&lt;/p&gt;

&lt;p&gt;It's not a replacement for your normal mobile release pipeline.&lt;/p&gt;

&lt;p&gt;Native changes still need a normal build and store submission.&lt;/p&gt;

&lt;p&gt;But if your team has ever had to submit a new mobile build because of something that could have been fixed entirely in JavaScript, that's the gap CodePush is trying to close.&lt;/p&gt;

&lt;p&gt;For me, the biggest takeaway wasn't just:&lt;/p&gt;

&lt;p&gt;"I can push an update without the App Store."&lt;/p&gt;

&lt;p&gt;It was realizing that there are several decisions around how that update gets delivered, who receives it, and what the user experiences when it arrives.&lt;/p&gt;

&lt;p&gt;That's the part I'd pay attention to before putting CodePush into a production app.&lt;/p&gt;

&lt;p&gt;Have You Used CodePush?&lt;/p&gt;

&lt;p&gt;Have you used CodePush or another OTA update solution with React Native?&lt;/p&gt;

&lt;p&gt;I'd love to hear how you handled it, especially if you ran into problems during setup.&lt;/p&gt;

&lt;p&gt;What would you add to this checklist?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>reactnative</category>
      <category>productivity</category>
      <category>cicd</category>
    </item>
    <item>
      <title>What Can You Bring to the Table? 👨🏾‍💻</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Sun, 13 Sep 2026 16:27:24 +0000</pubDate>
      <link>https://dev.to/respect17/what-can-you-bring-to-the-table-ab7</link>
      <guid>https://dev.to/respect17/what-can-you-bring-to-the-table-ab7</guid>
      <description>&lt;p&gt;Okay, quick thought experiment before we get into it.&lt;/p&gt;

&lt;p&gt;Someone hires you tomorrow. Not "in theory", like, you start Monday. What do you actually bring with you?&lt;/p&gt;

&lt;p&gt;Not your job title. Not the framework list sitting in your LinkedIn headline. I mean the real stuff, the thing a team gets when they get &lt;em&gt;you&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I've been chewing on this question for a while now, so let's talk it through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Okay but why does this even matter?
&lt;/h2&gt;

&lt;p&gt;Here's the thing, anyone can slap "React, Node.js, PostgreSQL" on a CV. That's the easy part. It tells someone what you've &lt;em&gt;touched&lt;/em&gt;, but it says nothing about how you think, what you notice first when something's broken, or what kind of problems actually get you excited to open your laptop.&lt;/p&gt;

&lt;p&gt;The much more interesting question is quieter than a skills list: &lt;strong&gt;what do people come to you for?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Are you the one who gets handed the tangled legacy codebase nobody else wants to touch? The person who writes the docs nobody asked for, and then three weeks later it turns out that doc saved the whole team a day of confusion? The one who can take "make it feel more premium" from a client and actually turn that into a real list of changes?&lt;/p&gt;

&lt;p&gt;None of that fits neatly into a skills matrix. But honestly? It's usually the real reason someone wants you on their team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alright, here's my honest answer
&lt;/h2&gt;

&lt;p&gt;I'm not going to ask this and then dodge it myself, so here goes — this is what I'd bring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚛️ &lt;strong&gt;Frontend development&lt;/strong&gt;:   React, Angular, TypeScript, modern JS. Not just turning a design into pixels, but actually thinking about state, performance, and what happens the moment the data doesn't behave like the happy path did in the demo.&lt;/li&gt;
&lt;li&gt;🐘 &lt;strong&gt;Backend development&lt;/strong&gt;:   PHP and Laravel. The logic and data layer the frontend is quietly leaning on the whole time.&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;API development &amp;amp; integration&lt;/strong&gt;:  building REST APIs, and just as often, wrestling a third-party API into behaving the way its docs promised (it never quite does, does it?).&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;WordPress development&lt;/strong&gt;:  custom sites, plugins, e-commerce builds. Not glamorous, but a huge chunk of the actual web runs on this, and doing it well is a real skill, not a fallback.&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;Problem solving&lt;/strong&gt;:  taking a vague ask or a half-formed idea and turning it into something that actually works. Honestly, this might just be the whole job.&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Performance optimisation&lt;/strong&gt;:  caring not just about "does it work" but "does it feel good to use."&lt;/li&gt;
&lt;li&gt;🧪 &lt;strong&gt;Testing&lt;/strong&gt;:  writing frontend tests people actually keep maintaining, instead of ones written once to hit a coverage number and never touched again.&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Technical writing&lt;/strong&gt;: tutorials and docs that developers actually want to read. Explaining something clearly is quietly one of the most valuable things you can do for a team.&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI-assisted development&lt;/strong&gt;:  using tools like Claude, ChatGPT, and Codex to research, build, debug, and review faster. Not a replacement for understanding the code, but a real boost on top of it.&lt;/li&gt;
&lt;li&gt;🤝 &lt;strong&gt;Collaboration&lt;/strong&gt;:  working well with other devs, product folks, and clients to actually ship the thing, not just produce code in a vacuum.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  And honestly, the biggest one: I'm still learning
&lt;/h2&gt;

&lt;p&gt;None of the above means I've got it all figured out, far from it. The longer I do this, the more I realize how much I still don't know. And weirdly, that's one of my favorite parts of this whole field. There's always someone out there who's already solved the exact thing you're stuck on, in a way you never would've thought of.&lt;/p&gt;

&lt;p&gt;That's really what this post is about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Okay, your turn 👇
&lt;/h2&gt;

&lt;p&gt;If you got hired tomorrow, what would &lt;em&gt;you&lt;/em&gt; bring?&lt;/p&gt;

&lt;p&gt;Not your job title. Not the tech list on your CV. The real stuff.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are you actually good at?&lt;/li&gt;
&lt;li&gt;What kind of problems do you enjoy untangling?&lt;/li&gt;
&lt;li&gt;What's something you've learned that might genuinely help someone else on a team?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop it in the comments. And hey, if you're comfortable, throw your profile link in there too, maybe someone reading this is looking for exactly what you do. Maybe we end up collaborating, or trading advice, or just having a good conversation.&lt;/p&gt;

&lt;p&gt;Let's make the comments an actual place to connect, not just a list of stacks. 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>softwaredevelopment</category>
      <category>react</category>
      <category>discuss</category>
    </item>
    <item>
      <title>GitHub Copilot vs Cursor vs Claude Code</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Fri, 04 Sep 2026 19:06:00 +0000</pubDate>
      <link>https://dev.to/respect17/github-copilot-vs-cursor-vs-claude-code-3hk</link>
      <guid>https://dev.to/respect17/github-copilot-vs-cursor-vs-claude-code-3hk</guid>
      <description>&lt;p&gt;These three get lumped together as "AI coding tools," but they're solving genuinely different problems in your workflow, inline completion, full-editor AI integration, and autonomous multi-file agentic work. Here's how they actually differ, and which combination makes sense depending on what you're building.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Copilot: the widest net
&lt;/h3&gt;

&lt;p&gt;Copilot's real advantage isn't raw capability,  it's reach. Native support across VS Code, JetBrains, Neovim, Visual Studio, and Xcode makes it the easiest entry point regardless of what editor your team already uses, and it holds the largest market share of any tool in this category. The free tier (around 2,000 completions a month) makes it close to a no-brainer starting point, especially for teams already living inside the GitHub ecosystem for issues, PRs, and CI.&lt;/p&gt;

&lt;p&gt;Where it's the clear pick: you want inline, low-friction autocomplete everywhere you already work, without changing editors or workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cursor: AI woven into the entire editor, not just autocomplete
&lt;/h3&gt;

&lt;p&gt;Cursor is a fork of VS Code with AI integrated at every layer, not bolted on as a plugin. Its Composer interface handles complex multi-file refactors directly inside the editor, and it's become the most commercially successful tool in this category by a wide margin, reportedly over a million users and reviewers reporting meaningfully fewer PR review comments after adopting it. For developers who live in their editor all day, having AI that understands the whole open project (not just the current file) is a genuinely different experience from inline suggestions.&lt;/p&gt;

&lt;p&gt;Where it's the clear pick: you want AI-assisted editing as your default way of working, not an occasional autocomplete assist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code: the one for autonomous, repo-wide work
&lt;/h3&gt;

&lt;p&gt;Claude Code operates more like an agent than an editor plugin,  it reads files, runs commands, manages git, executes tests, and edits across multiple files in your actual local environment, currently leading autonomous coding benchmarks (around 80% on SWE-bench Verified). This is the tool for handing off a genuinely complex, multi-step task and getting back a coherent, well-reasoned result,  not for inline suggestions while you type.&lt;/p&gt;

&lt;p&gt;Where it's the clear pick: large refactors, unfamiliar codebases you need to understand quickly, or any task better described as "do this whole thing" rather than "suggest the next few lines."&lt;/p&gt;

&lt;h3&gt;
  
  
  What most working developers actually do
&lt;/h3&gt;

&lt;p&gt;The realistic setup isn't picking one, it's layering them by task size. A common, cost-effective combination is Copilot for everyday autocomplete plus Claude Code for the occasional complex refactor or architecture task. A more editor-centric setup swaps in Cursor as the daily driver, with Claude Code still handling anything that spans the whole codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to actually choose
&lt;/h3&gt;

&lt;p&gt;Don't start from "which is best",  start from where your current friction actually is. If you're constantly context-switching between editors, Copilot's reach solves that. If your bottleneck is slow, disjointed multi-file edits, Cursor's integrated approach solves that. If you're regularly facing tasks too large or unfamiliar to comfortably do by hand, Claude Code's autonomous, repo-aware approach is the one built for exactly that job.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>coding</category>
      <category>github</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Write a Developer CV That Survives ATS and Still Reads Like a Human Wrote It</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Tue, 25 Aug 2026 06:18:03 +0000</pubDate>
      <link>https://dev.to/respect17/how-to-write-a-developer-cv-that-survives-ats-and-still-reads-like-a-human-wrote-it-4ilb</link>
      <guid>https://dev.to/respect17/how-to-write-a-developer-cv-that-survives-ats-and-still-reads-like-a-human-wrote-it-4ilb</guid>
      <description>&lt;p&gt;Most CV advice picks one side. Either you optimize for the applicant tracking system. Or you write for a human. You need both. A bot filters your CV first. A human decides later whether to call you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the ATS Actually Does
&lt;/h2&gt;

&lt;p&gt;It is not smart AI. It mostly parses your document into fields. Name. Contact info. Work history. Skills. Then it matches keywords against the job description. Here is what that means for you.&lt;/p&gt;

&lt;p&gt;Use standard section headers. Call them "Professional Experience" and "Education" and "Skills." Do not get creative with names like "My Journey." That can break the parser.&lt;/p&gt;

&lt;p&gt;Avoid tables. Avoid text boxes. Avoid multi column layouts. Many parsers read left to right and top to bottom. A two column layout can scramble your work history into nonsense.&lt;/p&gt;

&lt;p&gt;Match the language in the job posting. Do not just use your own words. If they say "Node.js" and you wrote "backend JavaScript," you might not match. Even if you clearly qualify.&lt;/p&gt;

&lt;p&gt;Save your CV as a .docx file or a text based PDF. Do not use an image based or heavily designed PDF. If you cannot select and copy the text yourself, the parser probably cannot either.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes a Human Want to Talk to You
&lt;/h2&gt;

&lt;p&gt;Once you pass the filter, the CV has a new job. It needs to convince a person you are worth thirty minutes of their day.&lt;/p&gt;

&lt;p&gt;Quantify your impact when you can. "Reduced page load time by 40 percent" beats "improved performance." No number to use? Describe the before and after instead.&lt;/p&gt;

&lt;p&gt;Start each bullet with what changed. Not what you were assigned. "Migrated the checkout flow to a queued job to eliminate timeout errors" tells a real story. "Responsible for checkout flow" does not.&lt;/p&gt;

&lt;p&gt;Cut anything you cannot back up. Skip vague lines like "great communicator" or "team player." Show it instead. Let your accomplishments prove it.&lt;/p&gt;

&lt;p&gt;Keep the length matched to your experience. Early career means one page. Deep into your career means two pages. Keep it tight. Do not write a full chronological diary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trap
&lt;/h2&gt;

&lt;p&gt;Do not over optimize for one reader at the other's expense. A CV stuffed with keywords reads like noise to a human. A CV written only for flow can get filtered before anyone sees it. The fix is not a trick. Write the true version of your experience. Use the words the industry uses. Use the words this job posting uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do This Before Every Application
&lt;/h2&gt;

&lt;p&gt;Read the job posting slowly. Underline the specific technologies and responsibilities they name. Then check your CV against that list. Do not fabricate experience you don't have. Just make sure your real experience uses their words, not only your own. This one step fixes more rejections than any template swap.&lt;/p&gt;

</description>
      <category>cv</category>
      <category>remote</category>
      <category>career</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Remote Job Search Playbook for Developers Outside the US/EU</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Tue, 25 Aug 2026 06:15:57 +0000</pubDate>
      <link>https://dev.to/respect17/the-remote-job-search-playbook-for-developers-outside-the-useu-3njb</link>
      <guid>https://dev.to/respect17/the-remote-job-search-playbook-for-developers-outside-the-useu-3njb</guid>
      <description>&lt;h2&gt;
  
  
  The Remote Job Search Playbook for Developers Outside the US/EU
&lt;/h2&gt;

&lt;p&gt;Remote work opened the door for developers outside major tech hubs to compete for roles that used to be geographically gated. It also created a much bigger applicant pool for every posting. If you're searching from outside the US/EU, here's what actually affects your odds — beyond "just apply to more jobs."&lt;/p&gt;

&lt;h3&gt;
  
  
  Timezone overlap is a real filter, not a footnote
&lt;/h3&gt;

&lt;p&gt;A lot of "remote, worldwide" postings quietly mean "remote, but we need 4+ hours of overlap with our core team." Before you apply, check what timezone the company or their existing team is in. If you can genuinely offer a workable overlap, say so explicitly in your application — don't make a recruiter guess whether a 7-9 hour time difference is going to be a problem later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sourcing channels that actually produce interviews
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recruiting-as-a-service platforms&lt;/strong&gt; (Rightfit-style agencies, Toptal, Turing) — they pre-filter for companies actively hiring remote and internationally, which saves you from applying into a black hole on a generic job board.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Company engineering blogs and changelogs&lt;/strong&gt; — companies that write publicly about their engineering tend to also be more remote-mature and less nervous about hiring outside their home country.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Referrals inside communities you're already part of&lt;/strong&gt; — dev.to, Discord servers for your stack, open-source project maintainers. A referral skips the "will this person actually work out remotely" anxiety that a cold application can't answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct outreach to smaller, funded startups&lt;/strong&gt; — they often can't afford local senior talent and are more open to global hiring than enterprise companies with rigid HR policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What to lead with in your application
&lt;/h3&gt;

&lt;p&gt;Recruiters hiring internationally are quietly screening for risk: will this person disappear, will communication be a problem, will payment/compliance be a headache. Address these before they have to ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State your availability and overlap hours plainly.&lt;/li&gt;
&lt;li&gt;Link to async-friendly proof of work — a deployed project, a GitHub history with real commit activity, a technical article. This substitutes for the "vibe check" an in-person interview would normally give them.&lt;/li&gt;
&lt;li&gt;If you've done contract/freelance work with international clients already, say so explicitly — it signals you already know how to work across time zones and payment rails.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The payment/compliance reality
&lt;/h3&gt;

&lt;p&gt;Get familiar with how you'll actually get paid before it becomes a blocker mid-negotiation — platforms like Deel, Payoneer, or Wise exist specifically because cross-border payroll is messy. Knowing your own answer to "how do you want to be paid" makes you look more prepared, not more high-maintenance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compensation framing
&lt;/h3&gt;

&lt;p&gt;Salary ranges posted for a specific country's cost of living don't always translate cleanly, and currency conversion can make a number look smaller or larger than it actually is locally. Do the math in your own currency and cost of living before deciding a range is or isn't worth pursuing — a number that looks modest in USD can be very solid depending on where you live, and vice versa.&lt;/p&gt;

&lt;h3&gt;
  
  
  The uncomfortable truth
&lt;/h3&gt;

&lt;p&gt;You are competing against a genuinely global pool now, which means portfolio and communication quality matter more than they used to, because there's no in-person interview softening a rough resume. The upside is that a strong deployed project and a clear, well-written application travel just as far as being physically local ever did — this is the first time in tech history where that's fully true.&lt;/p&gt;

</description>
      <category>career</category>
      <category>developers</category>
      <category>remote</category>
      <category>ai</category>
    </item>
    <item>
      <title>Breaking Into Full-Stack Development Without a CS Degree: What Actually Worked for Me</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Tue, 25 Aug 2026 06:14:22 +0000</pubDate>
      <link>https://dev.to/respect17/breaking-into-full-stack-development-without-a-cs-degree-what-actually-worked-for-me-59g7</link>
      <guid>https://dev.to/respect17/breaking-into-full-stack-development-without-a-cs-degree-what-actually-worked-for-me-59g7</guid>
      <description>&lt;h1&gt;
  
  
  Breaking Into Full Stack Development Without a CS Degree: What Actually Worked for Me
&lt;/h1&gt;

&lt;p&gt;I didn't go through a computer science program. What I have instead is about seven years of shipping production code. I learned almost all of it from official documentation, open source repos, developer communities, and a lot of trial and error on real client work. If you're on that same path and wondering if it's enough, here's what actually moved the needle for me. And what turned out to be a waste of time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Worked
&lt;/h2&gt;

&lt;p&gt;Building things that had to work, not things that looked good on a syllabus. Tutorial projects teach syntax. Client work teaches you what happens when a payment webhook fires twice. Or when your "simple" CRUD app suddenly needs to survive ten times the traffic you designed for. The fastest learning happened on real, slightly terrifying production systems. Not curated coursework.&lt;/p&gt;

&lt;p&gt;Reading source code and official docs before reaching for a course. Anyone can follow a video tutorial. Fewer people will sit with Laravel's own documentation. Or actually read through a library's source when the docs run out. That habit compounds. You stop depending on someone else pre chewing the material for you. And you get faster at picking up whatever stack a client happens to be using.&lt;/p&gt;

&lt;p&gt;Writing about what I learned. Technical writing forced me to actually understand things well enough to explain them. Not just well enough to copy paste them into working code. If you can't write a clear paragraph about why you chose NgRx over plain component state, you probably don't understand it as well as you think.&lt;/p&gt;

&lt;p&gt;Taking freelance and agency work early, even underpriced. Nobody hands a self taught developer a senior role on day one. What they will do is pay you to fix their bug. Or build their MVP. Or maintain their legacy app. That's your CS degree. It's just spread across a dozen small, real engagements instead of four years in one building.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Didn't Work
&lt;/h2&gt;

&lt;p&gt;Collecting certificates. They're fine as a signal that you sat through material. But nobody has ever hired me because of a certificate. Every real opportunity came from a portfolio piece, a referral, or a conversation where I could clearly explain a decision I made on a past project.&lt;/p&gt;

&lt;p&gt;Waiting to feel ready. I never felt ready. The gap between self taught and professional isn't a knowledge threshold you cross. It's a body of shipped work you accumulate. Start billable work earlier than feels comfortable.&lt;/p&gt;

&lt;p&gt;Studying algorithms in isolation, disconnected from anything I was building. Data structures and algorithms matter. But grinding them with no applied context is one of the slowest ways to learn them. They stuck a lot better once I hit an actual performance problem that a better data structure solved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Difference Maker
&lt;/h2&gt;

&lt;p&gt;Nobody on a hiring panel has ever asked me where I studied. They've asked me to walk through a decision on a real project. Why Laravel over a plain PHP framework. Why I chose to denormalize a specific table. How I debugged a flaky third party API integration. A CS degree can hand you vocabulary for those conversations. Shipped, explainable work hands you the actual substance.&lt;/p&gt;

&lt;p&gt;If you're self taught and stuck comparing yourself to a traditional path, stop comparing credentials. Start counting shipped, working systems you can talk through in detail. That's the real currency in this field.&lt;/p&gt;

</description>
      <category>career</category>
      <category>learning</category>
      <category>softwaredevelopment</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Using AI in Your Job Search: What Actually Helps vs What Looks Lazy to Recruiters</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Tue, 25 Aug 2026 06:12:49 +0000</pubDate>
      <link>https://dev.to/respect17/using-ai-in-your-job-search-what-actually-helps-vs-what-looks-lazy-to-recruiters-lna</link>
      <guid>https://dev.to/respect17/using-ai-in-your-job-search-what-actually-helps-vs-what-looks-lazy-to-recruiters-lna</guid>
      <description>&lt;p&gt;Almost everyone uses AI in their job search now. Whether they admit it or not. The real gap is not between people who use AI and people who don't. It is between people who use it to sharpen their real experience, and people who let it generate a generic version of them. A recruiter can spot that fake version in the first paragraph.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Helps
&lt;/h2&gt;

&lt;p&gt;Tailoring your CV language to a specific posting. Feed a job description and your real experience to an AI tool. Ask it to flag mismatched terms. Maybe they say "Node.js" and you wrote "backend JavaScript." This is a fast and useful pass. Just make sure you are only adjusting words for experience you already have. Do not invent experience you don't have.&lt;/p&gt;

&lt;p&gt;Rehearsing interview answers out loud. Ask an AI tool to play a skeptical interviewer. Let it push back on your answers. This surfaces the gaps in how you explain your own work. Better to find those gaps now than in front of a real interviewer.&lt;/p&gt;

&lt;p&gt;Summarizing and organizing your own scattered notes. Maybe you have a messy pile of past projects and metrics and accomplishments. AI is good at helping you turn that into clear, quantified bullet points. The substance is still yours. It just helps you find the clearest way to say it.&lt;/p&gt;

&lt;p&gt;Researching a company or role fast. Get a quick organized summary of a company's product, recent news, and likely tech stack before an interview. This saves real time over digging through their blog and LinkedIn by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Looks Lazy, and Often Is
&lt;/h2&gt;

&lt;p&gt;Sending an unedited generic AI written cover letter. Recruiters read hundreds of these. A cover letter with no specific detail about the company or the role or your actual experience reads as exactly what it is. Usually within the first two sentences. It signals you didn't care enough to personalize it.&lt;/p&gt;

&lt;p&gt;Fabricating experience or skills you don't have. AI will happily write confident sentences about a technology you've never touched. The interview will find that gap fast. It damages trust far more than an honest answer would. Something like "I haven't used that specifically, but here's an adjacent thing I have done."&lt;/p&gt;

&lt;p&gt;Using AI generated answers word for word in a live interview. Some candidates try to have AI generate answers in real time during interviews. This is against most companies' policies. It also produces answers that don't sound like a real person who did the work. Interviewers notice the gap between a polished answer and someone who can't naturally follow up on it.&lt;/p&gt;

&lt;p&gt;Mass applying without reading the posting. AI makes it easy to blast out fifty near identical applications an hour. That is not a strategy. That is noise. It usually gets a worse response rate than fewer, genuinely tailored applications. Generic submissions are the easiest ones for a human or an ATS to filter out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actual Line
&lt;/h2&gt;

&lt;p&gt;AI is genuinely useful anywhere it helps you present your real experience more clearly and faster. It becomes a liability the moment it starts generating experience or opinions or answers that aren't actually yours. Interviews are built to find that gap. Finding it costs you a lot more trust than skipping AI ever would.&lt;/p&gt;

&lt;p&gt;The best use of these tools in a job search is not writing your story for you. It is helping you tell your own story faster and more clearly than you could alone.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>resume</category>
    </item>
    <item>
      <title>TrendHub: I Was Tired of Checking Six Sites a Day, So I Built One Feed Instead</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Mon, 24 Aug 2026 13:13:23 +0000</pubDate>
      <link>https://dev.to/respect17/trendhub-i-was-tired-of-checking-six-sites-a-day-so-i-built-one-feed-instead-3n71</link>
      <guid>https://dev.to/respect17/trendhub-i-was-tired-of-checking-six-sites-a-day-so-i-built-one-feed-instead-3n71</guid>
      <description>&lt;p&gt;Every morning looked the same for me. dev.to, then Hacker News, then Stack Overflow's hot questions, then Product Hunt, then Lobsters, then Mastodon if I had the energy left. Six tabs. Six different ranking systems. Six different "what's hot right now" signals. No way to tell if the same story was blowing up on more than one of them at once.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;TrendHub&lt;/strong&gt;. It is a single unified feed that pulls what's trending across &lt;strong&gt;dev.to, Hacker News, Stack Overflow, Product Hunt, Lobsters, and Mastodon&lt;/strong&gt;. It ranks everything on one comparable scale. I can read it like one site instead of six.&lt;/p&gt;

&lt;p&gt;The problem was never that any one platform was bad. The problem is that trend checking had become a tax on my attention. This is my attempt to get that time back. And to make it something other developers could use too.&lt;/p&gt;

&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%2Fk3yts1ve8dblgvhtl95k.png" 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%2Fk3yts1ve8dblgvhtl95k.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What TrendHub Actually Does
&lt;/h2&gt;

&lt;p&gt;At its core, TrendHub is a fetch and rank pipeline. Background jobs pull the latest posts from each source on their own schedule. They normalize each post's engagement signal, reactions, points, votes, favourites, whatever that platform measures, onto a common 0 to 100 trending score. Then everything drops into one feed you can scan in a few minutes.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Unified, ranked feed.&lt;/strong&gt; Every post from every source lands in one timeline. Sorted by a trending score, not by which tab you happened to open first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per platform toggles.&lt;/strong&gt; Don't care about Product Hunt today? Flip it off in the sidebar. Preferences save per user. Your feed stays exactly the way you like it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search, tags, and time range filters.&lt;/strong&gt; Search matches both post titles and tags. You can restrict the feed to the last day, the last week, or all time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross platform duplicate detection.&lt;/strong&gt; Sometimes the same story trends on both Hacker News and Lobsters at once. It happens more than you'd think. TrendHub tags it "also trending on" instead of showing it to you twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trending velocity, the rising fire icon.&lt;/strong&gt; Posts don't just get a static score. They get a velocity indicator based on how their score moved since the last fetch. You can spot what's accelerating, not just what's already popular.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bookmarks and hide or dismiss.&lt;/strong&gt; Save something to read later. Hide a post you're not interested in. Hidden posts stay hidden until you choose to bring them back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Daily digest email.&lt;/strong&gt; Opt in and get a daily rollup of what's trending sent to your inbox. No login required to stay in the loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personal RSS feed export.&lt;/strong&gt; Every user gets their own token based RSS URL. Your filtered, ranked feed can slot into whatever feed reader you already use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keyboard shortcuts.&lt;/strong&gt; j and k to navigate. o to open. b to bookmark. x to hide. Built for people who'd rather not touch the mouse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dark mode.&lt;/strong&gt; Because it's a developer tool. Developer tools ship in dark mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per post share menu.&lt;/strong&gt; Share to X, Facebook, LinkedIn, Reddit, WhatsApp, email, or just copy the link. Straight from the feed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source health panel.&lt;/strong&gt; A small sidebar panel shows the last fetch time and status per platform. You always know how fresh the data is. And if a source's API is having a bad day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood
&lt;/h2&gt;

&lt;p&gt;TrendHub is built on &lt;strong&gt;Laravel 10, Inertia.js, Vue 3, and Tailwind CSS&lt;/strong&gt;. Postgres runs in production. SQLite runs for local development. Each source has its own dedicated fetcher class. A scoring service normalizes engagement metrics across wildly different scales. A Hacker News point is not a Mastodon favourite. A grouping service handles the cross platform duplicate matching.&lt;/p&gt;

&lt;p&gt;It's deployed on Render, running as a single web service with a managed Postgres database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://trend-hub-204c.onrender.com" rel="noopener noreferrer"&gt;trend-hub-204c.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It runs on a free tier. If it's been quiet for a while, the first load might take 30 to 50 seconds to wake back up. That's not a bug. Just a cold start. Register an account. It's instant, no email verification loop. Toggle platforms on and off to make it yours.&lt;/p&gt;

&lt;p&gt;What's the trend checking equivalent of "context switching fatigue" in your own workflow? Do you have a tool for it, or are you still juggling tabs like I was? I'd love to hear what I'm missing.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>laravel</category>
      <category>vue</category>
    </item>
    <item>
      <title>RTK Query Made Easy for Beginners 🎓 (With Real-Life Analogies)</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Sun, 12 Jul 2026 12:09:21 +0000</pubDate>
      <link>https://dev.to/respect17/rtk-query-made-easy-for-beginners-with-real-life-analogies-2kl6</link>
      <guid>https://dev.to/respect17/rtk-query-made-easy-for-beginners-with-real-life-analogies-2kl6</guid>
      <description>&lt;p&gt;If you've ever felt intimidated by Redux Toolkit Query (RTK Query), you're not alone. The docs &lt;a href="https://redux-toolkit.js.org/tutorials/rtk-query" rel="noopener noreferrer"&gt;https://redux-toolkit.js.org/tutorials/rtk-query&lt;/a&gt; assume you already know what a "reducer" or "middleware" is — but what if you're brand new to this?&lt;/p&gt;

&lt;p&gt;This article explains RTK Query using everyday analogies, so by the end you'll actually &lt;em&gt;understand&lt;/em&gt; what's happening instead of just copy-pasting code.&lt;/p&gt;

&lt;p&gt;Let's build a tiny app that shows a list of students from a server. 🧑‍🎓&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Picture
&lt;/h2&gt;

&lt;p&gt;Imagine our school website asks a server:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can I have the list of students?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the server replies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mary"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RTK Query is the tool that handles that entire conversation for you — asking, waiting, and remembering the answer — so you don't have to write &lt;code&gt;fetch()&lt;/code&gt; calls by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Project Structure
&lt;/h2&gt;

&lt;p&gt;Here's what our project will look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
    App.jsx
    main.jsx
    store.js
    services/
        studentApi.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it like a school: the &lt;strong&gt;School&lt;/strong&gt; is your app, the &lt;strong&gt;Classroom&lt;/strong&gt; is your store, and the &lt;strong&gt;Students&lt;/strong&gt; are your data. Everything has its own place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Install Redux Toolkit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @reduxjs/toolkit react-redux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you RTK Query for free — it's built right into &lt;code&gt;@reduxjs/toolkit&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Create the API Service
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;src/services/studentApi.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fetchBaseQuery&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@reduxjs/toolkit/query/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;studentApi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createApi&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;reducerPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;studentApi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="na"&gt;baseQuery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;fetchBaseQuery&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://jsonplaceholder.typicode.com/&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="na"&gt;endpoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;builder&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="na"&gt;getStudents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;builder&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="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&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;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&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;useGetStudentsQuery&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;studentApi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break down every part of this, piece by piece.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;createApi&lt;/code&gt; and &lt;code&gt;fetchBaseQuery&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Think of building a toy car — first you need your tools: a hammer, a screwdriver, a spanner. &lt;code&gt;createApi&lt;/code&gt; and &lt;code&gt;fetchBaseQuery&lt;/code&gt; are your tools for building an API layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;reducerPath&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Think of a cupboard with labelled shelves — one for books, one for toys, one for shoes. &lt;code&gt;reducerPath: "studentApi"&lt;/code&gt; tells Redux: &lt;em&gt;store all the student information on the "studentApi" shelf.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;baseQuery&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Imagine your friend lives at &lt;strong&gt;12 Green Street&lt;/strong&gt;. Every time you visit, you start from that same address. &lt;code&gt;baseQuery&lt;/code&gt; works the same way — it's the address every request starts from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;https://jsonplaceholder.typicode.com/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;endpoints&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Think of a restaurant menu: Pizza, Burger, Chicken, Juice — each dish is a menu item. In our app, each &lt;em&gt;endpoint&lt;/em&gt; is one thing we can ask the server for: Get Students, Get Teachers, Delete Student, and so on.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;builder.query()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This means &lt;strong&gt;"I only want to READ."&lt;/strong&gt; It's like asking your teacher, "Can I see today's attendance list?" — you're not changing anything, just looking.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;query: () =&amp;gt; "users"&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This tells RTK Query which path to visit. It joins the base URL and this path together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://jsonplaceholder.typicode.com/  +  users
=  https://jsonplaceholder.typicode.com/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the actual address it fetches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Add the API to Your Store
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;store.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;configureStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;studentApi&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./services/studentApi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;configureStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;reducer&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;span class="nx"&gt;studentApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reducerPath&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;studentApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="na"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getDefaultMiddleware&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;getDefaultMiddleware&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;studentApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;middleware&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;Imagine your teacher asks, "Where should I keep the student register?" You say, "Put it in this cupboard." That's the &lt;strong&gt;reducer&lt;/strong&gt; — it decides where the data lives.&lt;/p&gt;

&lt;p&gt;Now imagine a school messenger: the teacher says, "Take this letter to Class 4," and the messenger delivers it. That messenger is the &lt;strong&gt;middleware&lt;/strong&gt; — it carries requests to the server and brings the response back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Wrap Your App with Provider
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt; &lt;span class="na"&gt;store&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of electricity. Without it, your TV, fridge, and computer don't work. &lt;code&gt;Provider&lt;/code&gt; supplies the Redux store to your entire app — without it, nothing connects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Use the Hook
&lt;/h2&gt;

&lt;p&gt;Inside &lt;code&gt;App.jsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useGetStudentsQuery&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./services/studentApi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useGetStudentsQuery&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The moment &lt;code&gt;useGetStudentsQuery()&lt;/code&gt; runs, RTK Query automatically says "Hello server, can I have the students?" — no &lt;code&gt;fetch()&lt;/code&gt;, no &lt;code&gt;axios()&lt;/code&gt;. It's all handled for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Understanding &lt;code&gt;data&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Imagine asking your mom, "Can I have some apples?" and she hands you a bag of 🍎🍎🍎. That bag is your &lt;code&gt;data&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For our app, &lt;code&gt;console.log(data)&lt;/code&gt; might print:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Leanne Graham"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ervin Howell"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 8: Understanding &lt;code&gt;isLoading&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Imagine ordering pizza. Before it arrives, you're waiting — that's &lt;code&gt;isLoading&lt;/code&gt;. While it's on the way, &lt;code&gt;isLoading&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;. The moment it arrives, &lt;code&gt;isLoading&lt;/code&gt; becomes &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Showing a Loading State
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Loading...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users see "Loading..." until the server responds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 10: Understanding &lt;code&gt;error&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If the internet drops or the server fails to respond, &lt;code&gt;error&lt;/code&gt; will contain details about what went wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Something went wrong.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 11: Rendering the Students
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;student&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the server returns John and Mary, the screen shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;John
Mary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Actually Happening Behind the Scenes?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;👦 React: I need students.
      ↓
📞 RTK Query: I'll ask the server.
      ↓
🌐 Server: Here are the students.
      ↓
📦 RTK Query: I'll save them.
      ↓
👦 React: Thank you! I'll show them.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You never wrote &lt;code&gt;fetch()&lt;/code&gt;. You never managed a loading flag by hand. You never stored the response yourself. RTK Query handled all of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  One More Superpower: Caching
&lt;/h2&gt;

&lt;p&gt;Imagine your teacher asks, "What's 2 + 2?" You answer "4." A minute later she asks again — you already know the answer, so you don't need to think about it again.&lt;/p&gt;

&lt;p&gt;RTK Query behaves the same way:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First time:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React → Server → Data → Saved in cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Second time:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React → Cache ✅ (no new server request)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes your app noticeably faster and cuts down on unnecessary network traffic.&lt;/p&gt;

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

&lt;p&gt;That's the entire mental model of RTK Query:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define&lt;/strong&gt; your API with &lt;code&gt;createApi&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Register&lt;/strong&gt; it in your store (reducer + middleware)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide&lt;/strong&gt; the store to your app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consume&lt;/strong&gt; it with an auto-generated hook&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let it cache&lt;/strong&gt; so repeat requests are instant&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once this clicks, learning mutations (adding, updating, deleting data) is easy — they follow the exact same pattern, just with &lt;code&gt;builder.mutation()&lt;/code&gt; instead of &lt;code&gt;builder.query()&lt;/code&gt;.&lt;/p&gt;

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

</description>
      <category>react</category>
      <category>redux</category>
      <category>javascript</category>
      <category>web</category>
    </item>
    <item>
      <title>REST vs GraphQL vs tRPC in 2026</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Wed, 17 Jun 2026 20:24:20 +0000</pubDate>
      <link>https://dev.to/respect17/rest-vs-graphql-vs-trpc-in-2026-52dm</link>
      <guid>https://dev.to/respect17/rest-vs-graphql-vs-trpc-in-2026-52dm</guid>
      <description>&lt;p&gt;Every new project. Same argument.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Let's use REST, everyone knows REST."&lt;br&gt;
"Actually, GraphQL would be cleaner here."&lt;br&gt;
"Have you looked at tRPC? It's basically magic if you're on TypeScript."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This debate has been happening in Slack channels and architecture meetings for years. In 2026, we finally have enough real-world data to end it.&lt;/p&gt;

&lt;p&gt;Spoiler: there's no winner. But there is a right answer for &lt;em&gt;your&lt;/em&gt; project — and it takes about 60 seconds to figure out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-Second Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;REST&lt;/th&gt;
&lt;th&gt;GraphQL&lt;/th&gt;
&lt;th&gt;tRPC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Public APIs&lt;/td&gt;
&lt;td&gt;Complex data, many clients&lt;/td&gt;
&lt;td&gt;TypeScript full-stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learning curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type safety&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Generated&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CDN caching&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Excellent&lt;/td&gt;
&lt;td&gt;❌ Painful&lt;/td&gt;
&lt;td&gt;✅ Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Non-TS support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Any language&lt;/td&gt;
&lt;td&gt;✅ Any language&lt;/td&gt;
&lt;td&gt;❌ TypeScript only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hidden cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Versioning debt&lt;/td&gt;
&lt;td&gt;Query complexity tooling&lt;/td&gt;
&lt;td&gt;TS monorepo required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  REST: Old But Not Dead
&lt;/h2&gt;

&lt;p&gt;REST still powers over 80% of public APIs and that's not changing anytime soon. Here's why it's still the default for most teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every language has an HTTP client. Your Python service, your mobile app, your third-party partner — they all speak REST without any special setup.&lt;/li&gt;
&lt;li&gt;CDN caching works out of the box. &lt;code&gt;GET /products/123&lt;/code&gt; can be cached at the edge. That's free performance most teams leave on the table with other approaches.&lt;/li&gt;
&lt;li&gt;It's debuggable in a browser tab. That matters more than people admit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The real cost no one talks about:&lt;/strong&gt; versioning. Every breaking change means a new endpoint, a deprecation timeline, and years of maintaining &lt;code&gt;/v1&lt;/code&gt; alongside &lt;code&gt;/v2&lt;/code&gt;. REST's hidden cost is API versioning maintenance — and it compounds over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use REST when:&lt;/strong&gt; you're building a public API, third-party integrations, webhooks, or anything consumed by clients you don't control.&lt;/p&gt;

&lt;h2&gt;
  
  
  GraphQL: Powerful, But You're Going to Pay For It
&lt;/h2&gt;

&lt;p&gt;GraphQL solves a real problem. When your frontend needs exactly 7 fields from a user object, 3 fields from their orders, and 2 fields from their subscription — REST makes you do 3 round trips or build a bespoke endpoint. GraphQL lets the client ask for exactly what it needs in one request.&lt;/p&gt;

&lt;p&gt;GraphQL achieves 28% lower latency for complex queries that would otherwise require multiple REST calls. For mobile apps and data-heavy dashboards, that's meaningful.&lt;/p&gt;

&lt;p&gt;But here's what the tutorials leave out: at scale, GraphQL requires query complexity analysis, persisted queries, depth limiting, and specialized monitoring tools — an infrastructure tax that's real and often overlooked.&lt;/p&gt;

&lt;p&gt;GraphQL adoption has surged 340% since 2023, yet 93% of development teams still rely on REST. The growth is real. So is the operational overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use GraphQL when:&lt;/strong&gt; you have a complex data graph, multiple client types (web, mobile, third-party) with very different data needs, and a team willing to invest in the tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  tRPC: The Quiet Game-Changer For TypeScript Teams
&lt;/h2&gt;

&lt;p&gt;tRPC is the youngest of the three and the least understood outside TypeScript circles. Here's the pitch: you define your API procedures on the server, and the client calls them with full type inference — no schemas, no code generation, no extra build steps.&lt;/p&gt;

&lt;p&gt;tRPC appears in 15% of full-stack job listings and climbing fast, almost exclusively in listings that also mention TypeScript and Next.js. That's a telling pattern.&lt;/p&gt;

&lt;p&gt;The developer experience is genuinely different. Rename a server function and your IDE instantly tells you every place the client calls it. Change a return type and TypeScript catches every consumer that breaks. No GraphQL complexity, no OpenAPI code generation — just pure TypeScript type inference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hard limit:&lt;/strong&gt; tRPC only works when client and server share a TypeScript codebase. The moment you need a mobile app, a third-party integration, or a Python service calling your API — you need REST or a separate layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use tRPC when:&lt;/strong&gt; your entire stack is TypeScript, you're in a monorepo, and all your clients are your own frontend.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Answer: Most Production Apps Use All Three
&lt;/h2&gt;

&lt;p&gt;Here's the truth nobody puts in their REST vs GraphQL blog posts: most production systems use more than one.&lt;/p&gt;

&lt;p&gt;The typical 2026 SaaS stack looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public API&lt;/strong&gt; (for partners, webhooks, SDKs) → &lt;strong&gt;REST&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your own frontend&lt;/strong&gt; (Next.js, React) → &lt;strong&gt;tRPC or GraphQL&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service-to-service&lt;/strong&gt; (internal microservices) → &lt;strong&gt;REST or gRPC&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't over-engineering. It's matching the right tool to the right consumer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 60-Second Decision Framework
&lt;/h2&gt;

&lt;p&gt;Answer these three questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Who consumes this API?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;External developers or partners → REST&lt;/li&gt;
&lt;li&gt;Only your own TypeScript frontend → tRPC&lt;/li&gt;
&lt;li&gt;Multiple client types with wildly different data needs → GraphQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Do you control all the clients?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yes, and they're all TypeScript → tRPC&lt;/li&gt;
&lt;li&gt;No → REST or GraphQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. How complex is your data?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple CRUD → REST or tRPC&lt;/li&gt;
&lt;li&gt;Deeply relational, clients need flexible queries → GraphQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop picking based on what's trending. Pick based on who's consuming your API and what they actually need.&lt;/p&gt;

&lt;p&gt;The teams that ship fast in 2026 aren't the ones who picked the right framework. They're the ones who stopped arguing about it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Which are you currently using — and would you pick the same if you started over today? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;`&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>discuss</category>
    </item>
    <item>
      <title># 10 VS Code Extensions Every Developer Needs in 2026</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Wed, 17 Jun 2026 19:13:52 +0000</pubDate>
      <link>https://dev.to/respect17/-10-vs-code-extensions-every-developer-needs-in-2026-and-some-unpopular-opinions-fmn</link>
      <guid>https://dev.to/respect17/-10-vs-code-extensions-every-developer-needs-in-2026-and-some-unpopular-opinions-fmn</guid>
      <description>&lt;p&gt;Before we start — a warning.&lt;/p&gt;

&lt;p&gt;This isn't one of those lists where I throw 25 extension logos at you and call it a day. There are over 50,000 extensions in the VS Code marketplace. Most of them are garbage. Some duplicate features that are already built in. Some haven't been updated since 2021 and are silently slowing your editor down right now.&lt;/p&gt;

&lt;p&gt;This list is 10. Intentionally. Because a bloated extension setup is its own kind of technical debt.&lt;/p&gt;

&lt;p&gt;Let's get into it — opinions included.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. ESLint — Non-Negotiable
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; If you're writing JavaScript or TypeScript without ESLint running in your editor, you're just sending bugs to code review instead of catching them yourself.&lt;/p&gt;

&lt;p&gt;ESLint enforces your project's coding rules in real-time, flags problems as you type, and saves your team hours of review comments on things a machine should be catching. It's been around forever and it's still irreplaceable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; Most developers have ESLint installed but misconfigured. Default rules are nearly useless. The value comes from setting up rules that match your actual project. If you haven't touched your &lt;code&gt;.eslintrc&lt;/code&gt; in six months, you're not really using ESLint.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Prettier — Just Let It Format Your Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; Code formatting debates are a waste of everyone's time. Tabs vs spaces, semicolons or not, single quotes or double — none of it matters as long as the whole team is consistent. Prettier enforces consistency automatically on save. End of discussion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; If your team is still arguing about formatting in 2026, that's a culture problem, not a tooling problem. Install Prettier, set &lt;code&gt;"editor.formatOnSave": true&lt;/code&gt;, and move on to actual work.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. GitLens — Git Blame That Doesn't Make You Leave the Editor
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; GitLens is the most downloaded Git extension for VS Code for a reason. Inline blame annotations showing who changed each line and when, interactive commit graphs, file history — all without leaving your editor. The free tier covers everything most developers will ever need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; If your first reaction to a bug is "whose fault is this?" rather than "how do we fix this?", GitLens will make you a better developer or a more toxic teammate. Depends entirely on you.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Error Lens — Errors Where You Actually Look
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; By default, VS Code shows errors in the Problems panel at the bottom of the screen. Nobody is looking at the bottom of the screen. Error Lens moves error messages inline, right next to the line that caused them. It sounds minor. It's not. Once you use it, going back feels broken.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; This should be VS Code's default behavior. The fact that it's an extension in 2026 is a minor embarrassment for Microsoft.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. GitHub Copilot — But Not For the Reason You Think
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; GitHub Copilot is the most widely adopted AI coding assistant in VS Code. It does more than autocomplete now — it writes full functions, generates tests, and handles natural language to code. For repetitive code, boilerplate, and "I know what I want but don't want to type it" moments, it's genuinely fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; Copilot is making junior developers worse at problem-solving and senior developers lazier about documentation. The productivity gain is real. The skill atrophy is also real. Use it intentionally, not reflexively. And always read what it generates before you ship it — 45% of AI-generated code contains at least one security vulnerability.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Thunder Client — Because Postman Got Too Big for Its Own Good
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; Thunder Client is a lightweight REST API client built directly into VS Code. Test your endpoints without leaving your editor, without opening another app, without waiting for Postman to load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; Postman in 2026 is bloatware. What started as a simple API testing tool is now a platform with workspaces, teams, flows, and a pricing page with four tiers. Thunder Client does 90% of what most developers actually need in a fraction of the weight. If you're still defaulting to Postman out of habit, try Thunder Client for a week.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Tailwind CSS IntelliSense — If You're Using Tailwind, This Is Mandatory
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; Autocomplete, syntax highlighting, and linting for Tailwind classes directly in your editor. Hovering over a class shows you the exact CSS it generates. This extension makes Tailwind actually pleasant to write.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; Tailwind itself is still controversial and that's fine. But if your team has decided to use it, not having this extension is just self-inflicted pain. Arguments about whether Tailwind is good belong in a different article.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Path Intellisense — The Smallest Extension With the Highest Return
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; Autocompletes file paths as you type import statements. That's it. It's tiny, it's fast, and it eliminates an entire category of annoying errors — the ones where you typed &lt;code&gt;../components/Button&lt;/code&gt; when you meant &lt;code&gt;../../components/Button&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; This is the most underrated extension on this list. Nobody talks about it. Everyone who installs it wonders how they lived without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Docker — If Containers Are Part of Your Workflow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; The official Docker extension for VS Code lets you manage containers, images, volumes, and networks directly from the editor. Build, run, inspect logs, and exec into containers without touching the terminal for Docker commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; If you're running Docker in 2026 without this extension, you're memorizing commands you don't need to memorize. That mental space could go toward something more interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. VS Code Icons — Last On The List, Not Least
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The take:&lt;/strong&gt; Replaces VS Code's default file icons with a comprehensive set that makes different file types visually distinct at a glance. Python files look different from JavaScript files. Config files are obvious. It sounds cosmetic. It's actually a real time saver when navigating large projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpopular opinion:&lt;/strong&gt; Developers who dismiss visual organization as "unimportant" are the same ones who spend 10 seconds finding a file they've opened before. Your environment shapes how you work. Make it work for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Extensions That Didn't Make the List (And Why)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bracket Pair Colorizer&lt;/strong&gt; — VS Code has had built-in bracket pair colorization since 2021. You don't need the extension anymore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto Close Tag / Auto Rename Tag&lt;/strong&gt; — Built into VS Code for HTML and JSX. Check your settings before installing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Share&lt;/strong&gt; — Great concept, unstable in practice. If you're pair programming regularly, a purpose-built tool handles it better.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;indent-rainbow&lt;/strong&gt; — Pretty. Doesn't solve a real problem. Skip it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Rule Behind This List
&lt;/h2&gt;

&lt;p&gt;Before you install any extension, ask yourself three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does VS Code already do this natively?&lt;/li&gt;
&lt;li&gt;When was the last update? (Anything not updated in 12+ months is a risk)&lt;/li&gt;
&lt;li&gt;Will I actually use this daily, or is it just satisfying to install?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A tight extension setup makes VS Code fast, focused, and actually pleasant to work in. Every extension you add is a trade-off. Make them deliberately.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Which extensions am I wrong about? Drop it in the comments — I want the pushback.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
