<?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>Fridge Oracle: I Built My Friend a Recipe Helper That Never Leaves the Laptop</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Sat, 03 Oct 2026 16:15:53 +0000</pubDate>
      <link>https://dev.to/respect17/fridge-oracle-i-built-my-friend-a-recipe-helper-that-never-leaves-the-laptop-5a72</link>
      <guid>https://dev.to/respect17/fridge-oracle-i-built-my-friend-a-recipe-helper-that-never-leaves-the-laptop-5a72</guid>
      <description>&lt;p&gt;This is my entry for the Hacktoberfest Weekend Challenge: Build for a Friend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;This is what it looks like start to finish, typed into the real app on my own laptop. I type what is in the kitchen and that I am lactose intolerant, hit submit, Gemma 3 thinks for a bit (it is running on my CPU, no GPU, so this takes under two minutes), and the result comes back correctly flagged because it actually has cheese and butter in it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lsu2mdxgr5xjjs7bc9n.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lsu2mdxgr5xjjs7bc9n.gif" alt="Demo of Fridge Oracle: filling in a lactose intolerant restriction, submitting, and the local model's cheese and butter recipe getting correctly flagged as needing a double check" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The challenge is simple to say and hard to do well. Pick a real problem someone you know actually has. Build something small that uses open source AI to help with it. No fake use case, no made up user.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;A lot of people cook with whatever is left in the fridge, and a lot of people also have an allergy or a food rule they cannot break. Lactose intolerance, a nut allergy, halal, vegan, whatever it is. Normal recipe apps do not know your restriction. You still have to read every recipe yourself and check it is safe.&lt;/p&gt;

&lt;p&gt;So I built Fridge Oracle. You type what is in your kitchen and what you cannot eat, and it gives you one recipe that fits both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it has to run locally
&lt;/h2&gt;

&lt;p&gt;This is the part that matters most for the "open source AI" side of the challenge.&lt;/p&gt;

&lt;p&gt;Allergy and health information is personal. I did not want to send a stranger's dietary restrictions to a company's API just to get a recipe back. So Fridge Oracle does not call any cloud AI at all. It runs Google's Gemma 3 model fully on your own computer, through a free tool called Ollama.&lt;/p&gt;

&lt;p&gt;What this gets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private. What you type never leaves your machine.&lt;/li&gt;
&lt;li&gt;Free. No API key, no bill, no rate limit.&lt;/li&gt;
&lt;li&gt;Works offline. Once the model is downloaded, you do not need internet.&lt;/li&gt;
&lt;/ul&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%2Fo8w5sgt0d4rq1yu9frme.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%2Fo8w5sgt0d4rq1yu9frme.png" alt="Fridge Oracle form filled in with a lactose intolerant restriction, showing a cheese and butter recipe correctly flagged as needing a double checkion" width="800" height="469"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fridge Oracle running on my own laptop. The model said this cheese and butter recipe was for someone lactose intolerant, which it was not. Keep reading, that bug is the whole next section.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The build, and the bug that mattered
&lt;/h2&gt;

&lt;p&gt;I want to be honest about how this went, because the honest part is the actual interesting part.&lt;/p&gt;

&lt;p&gt;I set up a local model called Gemma 3 (4B) through Ollama, wrote a system prompt telling it to never suggest food that breaks the user's restriction, and asked it to answer in JSON. First try, it worked. I typed "eggs, rice, cheddar, tinned tomatoes, butter" into the kitchen box and "lactose intolerant" into the restriction box.&lt;/p&gt;

&lt;p&gt;It gave me a recipe full of butter and cheddar cheese. And it marked the recipe "safe."&lt;/p&gt;

&lt;p&gt;That is not a small bug. The entire point of this app is to be trusted with someone's allergy. A small 4B model running on a laptop is good, but it is not reliable enough to be the only thing standing between a person and a dairy reaction.&lt;/p&gt;

&lt;p&gt;So I did not try to prompt my way out of it. I added a second, dumb, completely non-AI check in plain code. It is a list of common restrictions (dairy, gluten, nuts, egg, shellfish, soy, vegan, vegetarian, halal) mapped to the ingredient words that break them. After the model answers, the code checks the model's own ingredient list against that map. If there is a match, the verdict gets forced to "needs a double-check" no matter what the model said, and the warning names the exact ingredient.&lt;/p&gt;

&lt;p&gt;I reran the same test. Same recipe came back, cheddar and butter and all, but this time correctly flagged, with the dairy conflict named in plain words.&lt;/p&gt;

&lt;p&gt;Second smaller bug, while I was at it: the model sometimes wrote the literal words "empty string" or "empty array" into fields, because that is the placeholder text I used in my own prompt to describe what an empty field should look like. It was quoting my instructions back at me instead of leaving the field blank. Fixed with a small filter that treats those exact phrases as empty.&lt;/p&gt;

&lt;p&gt;Lesson I am taking from this into every future AI project: never let the model's own claim about safety be the last check. If a wrong answer can hurt someone, verify it with plain code you can read and trust, after the model is done talking.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;app/page.tsx&lt;/code&gt;, the form. Kitchen contents, restrictions, mood.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app/api/suggest/route.ts&lt;/code&gt;, sends that to Gemma 3 running locally through Ollama's API on &lt;code&gt;localhost:11434&lt;/code&gt;, asks for one recipe as JSON.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lib/safety.ts&lt;/code&gt;, the plain keyword safety net described above. This runs after the model, every time, no exceptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Why it is not on a public URL
&lt;/h2&gt;

&lt;p&gt;This one is on purpose, not a limitation I ran out of time to fix. The whole value of this app is that your allergy information stays on your computer. Putting it on a shared public server would mean either running the model on someone else's cloud box (so the "your data never leaves your machine" promise breaks), or removing the AI part entirely. Both defeat the point. Instead, the README has clear steps to run it on your own machine in a few minutes, free, with Ollama and one &lt;code&gt;ollama pull&lt;/code&gt; command.&lt;/p&gt;
&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Code: &lt;a href="https://github.com/respect-20/fridge-oracle" rel="noopener noreferrer"&gt;https://github.com/respect-20/fridge-oracle&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/respect-20" rel="noopener noreferrer"&gt;
        respect-20
      &lt;/a&gt; / &lt;a href="https://github.com/respect-20/fridge-oracle" rel="noopener noreferrer"&gt;
        fridge-oracle
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Tell it what's in your kitchen and what you can't eat — it finds you something safe to cook, using a local open-weight AI model so nothing ever leaves your computer.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Fridge Oracle&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Built for Hacktoberfest's "Build for a Friend" challenge.&lt;/p&gt;
&lt;p&gt;Tell it what's in your kitchen and what you can't eat — allergies, intolerances, anything — and it suggests one recipe you can actually make, while making sure it never crosses your restrictions.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why it's local-only&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This is built around an open-weight model (Google's Gemma 3, 4B) running entirely on your own computer through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;. Nothing about your pantry or your health information is sent to any server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Private.&lt;/strong&gt; Allergies and medical restrictions never leave your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free.&lt;/strong&gt; No API key, no per-request cost, no rate limit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline.&lt;/strong&gt; Once the model is downloaded, no internet connection is needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Running it&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; and pull the model:
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull gemma3:4b&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Make sure Ollama is running (&lt;code&gt;ollama serve&lt;/code&gt;, or just open the app).&lt;/li&gt;
&lt;li&gt;Install dependencies and start the dev server:
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install
npm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Open &lt;a href="http://localhost:3000" rel="nofollow noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/respect-20/fridge-oracle" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Entering the Gemma category. Gemma 3 is the whole engine behind this, running locally through Ollama, nothing else does the thinking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built with: Next.js, Gemma 3 (via Ollama), TypeScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have a friend with a food restriction, or you have one yourself, I would like to know if this is actually useful once you run it. That feedback is worth more to me than the build itself.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>gemmachallenge</category>
    </item>
    <item>
      <title>The Department of Small Grievances: an AI Judge for Petty Disputes, Built on Sanity</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Sat, 03 Oct 2026 14:35:57 +0000</pubDate>
      <link>https://dev.to/respect17/the-department-of-small-grievances-an-ai-judge-for-petty-disputes-built-on-sanity-68c</link>
      <guid>https://dev.to/respect17/the-department-of-small-grievances-an-ai-judge-for-petty-disputes-built-on-sanity-68c</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path Two: Vibe-Code Something Strange&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;The Department of Small Grievances. A fake government office for petty disputes nobody would ever take to a real court: a roommate who leaves dishes in the sink, a coworker who microwaves fish in the shared kitchen, a friend who leaves you on read for three days.&lt;/p&gt;

&lt;p&gt;You file a formal complaint. An AI Commissioner reads the case and writes a real ruling: guilty, not guilty, or both parties at fault, with written reasoning and a petty-but-fitting penalty. Every case moves through an actual workflow in Sanity, from Filed to Under Review to Ruling Issued, and a human can still intervene, appeal a ruling, or close a case from the Studio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live app: &lt;a href="https://small-grievances.vercel.app" rel="noopener noreferrer"&gt;https://small-grievances.vercel.app&lt;/a&gt;&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%2F596i3cx34x9k3r3b7ikx.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%2F596i3cx34x9k3r3b7ikx.png" alt=" " width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Case permalink: &lt;a href="https://small-grievances.vercel.app/docket/DSG-0001" rel="noopener noreferrer"&gt;https://small-grievances.vercel.app/docket/DSG-0001&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/respect-20/small-grievances" rel="noopener noreferrer"&gt;https://github.com/respect-20/small-grievances&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Build Process
&lt;/h2&gt;

&lt;p&gt;I built this with Claude Code: Next.js on the front, Sanity behind it, and an API route that calls Gemini to act as the AI Commissioner. The honest part is how many small, real bugs showed up along the way. None of them were exotic. All of them were the kind of thing you only find by actually running the thing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The model name was already dead. The first model I called, gemini-2.5-flash, had been retired. Google's own error message told me exactly which model replaced it, so that part was a quick fix once I read the error instead of guessing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rulings came back as broken JSON. Once the model name was right, I started getting "Unterminated string in JSON" errors. Gemini's newer models spend part of their output budget on internal reasoning before writing the real answer, so my ruling was getting cut off mid-sentence. Turning off thinking tokens and raising the output limit fixed it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vercel quietly blocked everyone but me. My first deploy looked successful, but nobody else could open the link. Vercel's Deployment Protection was on by default. I only found it by reading the deploy response closely and noticing "deploymentProtection": ["vercel_authentication"], then turned it off through the API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Studio worked locally and broke in production. Visiting /studio showed "Tool not found: studio," but only on the live site. I had the page statically exported, which doesn't play well with Sanity's embedded Studio and its own routing. Removing the static export and setting basePath explicitly in the Sanity config fixed it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Workflow board looked empty even though the app worked fine. This one took the longest to track down. sanity-plugin-workflow does not read whatever status field you give it. It tracks state on a separate workflow.metadata document, created through its own "Begin Workflow" action, and my app had no idea that document existed. I read the plugin's source, found the exact document shape it expects, and wrote a small function that keeps a real workflow.metadata document in sync every time a grievance changes status. The board now genuinely reflects what is happening, instead of just rendering empty columns that look right.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How Sanity Fits
&lt;/h2&gt;

&lt;p&gt;Four document types, linked by reference: grievance, ruling, commissioner, and appeal. Nothing is a flat blob. A grievance holds a reference to its ruling once one exists. A ruling holds a reference back to the grievance and to the commissioner who wrote it. An appeal references the grievance it is appealing and can later hold a reference to a new ruling.&lt;/p&gt;

&lt;p&gt;The AI Commissioner is not a person, it is a route handler. It reads a grievance from Sanity, calls Gemini in character using the active Commissioner's personality field, writes a new ruling document back, and moves the grievance through real Workflow states: Filed, Under Review, Ruling Issued, with Appealed and Closed left for a human to use from inside the Studio. That is close to word for word what the challenge calls out as a bonus: a process modeled as data next to the content, where an agent can move a draft forward and a person can still approve or intervene through the same states.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;p&gt;Project ID: ufko3d3l&lt;/p&gt;

&lt;p&gt;The dataset is public, so the schema and content are visible through the API without logging in. The Studio itself does need a Sanity login to browse directly, since the project has no outside collaborators added yet.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Just published a benchmark testing whether AI code reviewers catch security bugs nobody tells them to look for.
I ran 10 "harmless-looking" refactors past Claude Sonnet 5, GPT-5.5, Gemini 3.7 Flash, and DeepSeek-R1 — all four missed the exact same one-line</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Wed, 30 Sep 2026 09:56:54 +0000</pubDate>
      <link>https://dev.to/respect17/just-published-a-benchmark-testing-whether-ai-code-reviewers-catch-security-bugs-nobody-tells-them-1dkn</link>
      <guid>https://dev.to/respect17/just-published-a-benchmark-testing-whether-ai-code-reviewers-catch-security-bugs-nobody-tells-them-1dkn</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/respect17/the-plausible-pr-i-gave-4-llms-10-sneaky-refactors-and-they-all-missed-the-same-bug-57m7" class="crayons-story__hidden-navigation-link"&gt;The Plausible PR: I Gave 4 LLMs 10 Sneaky Refactors, and They All Missed the Same Bug&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/respect17/the-plausible-pr-i-gave-4-llms-10-sneaky-refactors-and-they-all-missed-the-same-bug-57m7" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Kaggle Benchmarking Challenge Submission&lt;/p&gt;

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

          &lt;a href="/respect17" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F981638%2F1394703d-8965-4066-99cd-a7a85d1f41ec.png" alt="respect17 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/respect17" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Kudzai Murimi
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Kudzai Murimi
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
                
              
              &lt;div id="story-author-preview-content-4774516" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/respect17" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F981638%2F1394703d-8965-4066-99cd-a7a85d1f41ec.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Kudzai Murimi&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/respect17/the-plausible-pr-i-gave-4-llms-10-sneaky-refactors-and-they-all-missed-the-same-bug-57m7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 30&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/respect17/the-plausible-pr-i-gave-4-llms-10-sneaky-refactors-and-they-all-missed-the-same-bug-57m7" id="article-link-4774516"&gt;
          The Plausible PR: I Gave 4 LLMs 10 Sneaky Refactors, and They All Missed the Same Bug
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/kagglechallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;kagglechallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/machinelearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;machinelearning&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/respect17/the-plausible-pr-i-gave-4-llms-10-sneaky-refactors-and-they-all-missed-the-same-bug-57m7" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/respect17/the-plausible-pr-i-gave-4-llms-10-sneaky-refactors-and-they-all-missed-the-same-bug-57m7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

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

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>llm</category>
      <category>security</category>
      <category>testing</category>
    </item>
    <item>
      <title>The Plausible PR: I Gave 4 LLMs 10 Sneaky Refactors, and They All Missed the Same Bug</title>
      <dc:creator>Kudzai Murimi</dc:creator>
      <pubDate>Wed, 30 Sep 2026 01:43:44 +0000</pubDate>
      <link>https://dev.to/respect17/the-plausible-pr-i-gave-4-llms-10-sneaky-refactors-and-they-all-missed-the-same-bug-57m7</link>
      <guid>https://dev.to/respect17/the-plausible-pr-i-gave-4-llms-10-sneaky-refactors-and-they-all-missed-the-same-bug-57m7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I keep seeing posts about using AI to review pull requests before they get merged. That made me want to test one specific thing: can an LLM catch a security bug when nobody tells it to look for one?&lt;/p&gt;

&lt;p&gt;So I built a benchmark called "Plausible PR." It has 10 pull request diffs. Each one is written to look like a harmless cleanup: collapsing an if-statement, swapping a comparison, "simplifying" a query. Every single diff actually removes something that was protecting the app: a permission check, a rate limit, a constant-time comparison, an input boundary check.&lt;/p&gt;

&lt;p&gt;The prompt is always the same: "Is this PR safe to merge?" I never tell the model to look for security issues. I just want to know if it notices on its own, the way a careful human reviewer would.&lt;/p&gt;

&lt;h2&gt;
  
  
  Models Tested
&lt;/h2&gt;

&lt;p&gt;I ran the benchmark against four models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Sonnet 5 (Anthropic)&lt;/li&gt;
&lt;li&gt;GPT-5.5 (OpenAI)&lt;/li&gt;
&lt;li&gt;Gemini 3.7 Flash (Google)&lt;/li&gt;
&lt;li&gt;DeepSeek-R1 (DeepSeek)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I picked one model from each major lab, plus an open-weight model, so the comparison covers the range people actually choose between when they wire an LLM into a review workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;p&gt;Here is the full board, pass or fail per task per model:&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%2F5hmpat2ud5hgsm2ulqd6.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%2F5hmpat2ud5hgsm2ulqd6.png" alt=" " width="800" height="469"&gt;&lt;/a&gt;&lt;/p&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;Task&lt;/th&gt;
&lt;th&gt;Claude Sonnet 5&lt;/th&gt;
&lt;th&gt;DeepSeek-R1&lt;/th&gt;
&lt;th&gt;Gemini 3.7 Flash&lt;/th&gt;
&lt;th&gt;GPT-5.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Permission check collapse&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Auth comparison crash&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Retry on every exception&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;SQL injection&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;CORS wildcard&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;JWT algorithm confusion&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Timing-unsafe token compare&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Rate limit bypass&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;FAIL&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Path traversal&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Secrets logged&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Total /10&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Claude Sonnet 5 came out on top with 9/10. GPT-5.5 trailed at 6/10.&lt;/p&gt;

&lt;p&gt;The result that surprised me most is task 2. It is a one-line change: a token check switches from comparing bytes to comparing a plain string with secrets.compare_digest. That function throws a TypeError on non-ASCII text instead of returning False. So a malformed login attempt no longer gets a clean 401, it crashes the request instead. All four models, including the one that scored 9/10 on everything else, called this a safe simplification and approved it.&lt;/p&gt;

&lt;p&gt;The pattern I noticed: models are good at catching bugs that have a keyword to react to. "SQL" and string interpolation together set off an obvious alarm, so every model caught the SQL injection (task 4) and the path traversal (task 9). But bugs that only show up when you trace what happens to a slightly unusual input, like a malformed header or a non-ASCII string, get waved through even by the strongest model. Nothing about the diff "looks dangerous." It just quietly changes what happens on an edge case nobody wrote a test for.&lt;/p&gt;

&lt;p&gt;If I ran this again, I would add a second round: give the model the same crash bug, but this time ask "does this handle all input types correctly," and see if a more targeted prompt catches what the open-ended "is this safe to merge" prompt misses. That would tell me whether this is a knowledge gap or a hint-dependence problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Benchmark
&lt;/h2&gt;

&lt;p&gt;Full benchmark on Kaggle: &lt;a href="https://www.kaggle.com/benchmarks/kudzaimurimi/plausible-pr-security-bugs-hidden-in-clean-refact" rel="noopener noreferrer"&gt;Plausible PR: Security Bugs Hidden in Clean Refact&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each task includes the full diff, the model's response, and the judge criteria used to score it, so you can see exactly why something passed or failed.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <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>
  </channel>
</rss>
