<?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: Naji Louis</title>
    <description>The latest articles on DEV Community by Naji Louis (@najilouis).</description>
    <link>https://dev.to/najilouis</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F379140%2F8e435760-6f7d-4e8c-bed7-c06d9b82eaa1.jpeg</url>
      <title>DEV Community: Naji Louis</title>
      <link>https://dev.to/najilouis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/najilouis"/>
    <language>en</language>
    <item>
      <title>Building a Local RAG AI Agent for Airline Reviews with Ollama</title>
      <dc:creator>Naji Louis</dc:creator>
      <pubDate>Fri, 16 Jan 2026 16:51:24 +0000</pubDate>
      <link>https://dev.to/najilouis/building-a-local-rag-ai-agent-for-airline-reviews-with-ollama-2ik5</link>
      <guid>https://dev.to/najilouis/building-a-local-rag-ai-agent-for-airline-reviews-with-ollama-2ik5</guid>
      <description>&lt;p&gt;I wanted to explore how far I could go with a fully &lt;strong&gt;local AI agent&lt;/strong&gt; using Retrieval-Augmented Generation (&lt;strong&gt;RAG&lt;/strong&gt;). As a small curiosity-driven evening project, I decided to build an agent that can answer questions about airline reviews — entirely offline, fast, and inexpensive.&lt;/p&gt;

&lt;p&gt;This article walks through the idea, tools, and architecture behind the project, with minimal but practical Python code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack Overview
&lt;/h2&gt;

&lt;p&gt;Here’s what I used:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language&lt;/strong&gt;: Python&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLM runtime&lt;/strong&gt;: Ollama&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;llama3.2&lt;/strong&gt; for question answering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;mxbai-embed-large&lt;/strong&gt; for embeddings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vector store&lt;/strong&gt;: Chroma&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;langchain&lt;/li&gt;
&lt;li&gt;langchain-ollama&lt;/li&gt;
&lt;li&gt;langchain-chroma&lt;/li&gt;
&lt;li&gt;pandas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dataset&lt;/strong&gt;: Airline Reviews (CSV) from Kaggle&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Ollama?
&lt;/h2&gt;

&lt;p&gt;I installed &lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; on a Linux cloud server, but one of the nicest things about it is that it also runs smoothly on &lt;strong&gt;most modern PC and Laptops&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ollama made this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to run locally&lt;/li&gt;
&lt;li&gt;Cheap (no API costs)&lt;/li&gt;
&lt;li&gt;Fast enough for experimentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for side projects and learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dataset Preparation
&lt;/h2&gt;

&lt;p&gt;The dataset comes from Kaggle and contains airline reviews in CSV format.&lt;/p&gt;

&lt;p&gt;To make vector ingestion faster and lighter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I created a &lt;strong&gt;&lt;u&gt;reduced CSV version&lt;/u&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Kept only the columns relevant for semantic search (review text, airline name, rating, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This significantly improved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embedding generation time&lt;/li&gt;
&lt;li&gt;Vector store loading speed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  High-Level Architecture
&lt;/h2&gt;

&lt;p&gt;The flow is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Load airline reviews from CSV using &lt;strong&gt;pandas&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Generate embeddings using &lt;strong&gt;mxbai-embed-large&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Store vectors in &lt;strong&gt;Chroma&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Retrieve relevant reviews for a user question&lt;/li&gt;
&lt;li&gt;Pass retrieved reviews + question to &lt;strong&gt;llama3.2&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Generate an answer &lt;strong&gt;strictly based on retrieved content&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is classic RAG but fully local.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt Design
&lt;/h2&gt;

&lt;p&gt;I kept the prompt explicit and restrictive to avoid incorrect information:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are an expert in answering questions about airline reviews.
Use the provided reviews to answer the question as accurately as possible.

Here are some relevant reviews: {reviews}

Here is the question to answer: {question}

IMPORTANT: Base your answer ONLY on the reviews provided above. If no reviews are provided, say "No reviews were found."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single instruction already improved answer reliability a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal Python Setup (Conceptual)
&lt;/h2&gt;

&lt;p&gt;The code is intentionally basic and readable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load CSV with &lt;strong&gt;Pandas&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Create embeddings with &lt;strong&gt;Ollama&lt;/strong&gt; embeddings&lt;/li&gt;
&lt;li&gt;Store &amp;amp; query vectors with &lt;strong&gt;Chroma&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Chain retrieval + LLM with &lt;strong&gt;LangChain&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I avoided over-engineering — the goal was clarity, not abstraction layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example Results
&lt;/h2&gt;

&lt;p&gt;I tested the agent with different types of questions.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Example 1: Valid Question&lt;/strong&gt;&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;How do passengers generally feel about Emirates ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; The agent retrieved multiple relevant reviews and summarized them correctly.&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.amazonaws.com%2Fuploads%2Farticles%2Flywwg80wcrpo3ge8i7il.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.amazonaws.com%2Fuploads%2Farticles%2Flywwg80wcrpo3ge8i7il.png" alt="Valid Answer" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Example 2: No Relevant Data&lt;/strong&gt;&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Is Honda CRA a good SUV car ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Since no relevant reviews were retrieved, the agent responded:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No reviews were found...&lt;/p&gt;
&lt;/blockquote&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.amazonaws.com%2Fuploads%2Farticles%2Fujys34yebplj36aesaoj.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.amazonaws.com%2Fuploads%2Farticles%2Fujys34yebplj36aesaoj.png" alt="No Relevant Data" width="800" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Correct fallback when no data exists&lt;br&gt;
This behavior is exactly what I wanted — no incorrect information.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Repository
&lt;/h2&gt;

&lt;p&gt;The full source code is available here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/najilouis/local-AI-agent-RAG/" rel="noopener noreferrer"&gt;local-AI-agent-RAG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also check it out and run it on your own machine by following the instructions provided in the README file.&lt;/p&gt;

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

&lt;p&gt;This project was mainly built out of curiosity and for fun — a way to experiment with local RAG systems without overcomplicating things.&lt;/p&gt;

&lt;p&gt;That said, the same approach can scale much further. With a &lt;strong&gt;larger dataset&lt;/strong&gt; and &lt;strong&gt;more performant hardware&lt;/strong&gt;, you can build something significantly faster, more accurate, and production-ready.&lt;/p&gt;

&lt;p&gt;For now, it serves as a solid proof of concept and a reminder that meaningful AI projects don’t always need massive infrastructure to get started 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>llm</category>
      <category>learning</category>
    </item>
    <item>
      <title>Why Prompts Matter: How AI Answers Change Based on What You Ask</title>
      <dc:creator>Naji Louis</dc:creator>
      <pubDate>Thu, 13 Nov 2025 15:38:54 +0000</pubDate>
      <link>https://dev.to/najilouis/why-prompts-matter-how-ai-answers-change-based-on-what-you-ask-5778</link>
      <guid>https://dev.to/najilouis/why-prompts-matter-how-ai-answers-change-based-on-what-you-ask-5778</guid>
      <description>&lt;p&gt;In today’s world of AI tools like ChatGPT, Gemini, and Microsoft Copilot, one thing stands out:&lt;br&gt;
👉 &lt;strong&gt;The way you ask a question completely changes the answer you get.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s what we call &lt;strong&gt;prompting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Even when asking the same thing, tiny changes in how you phrase it can shift the tone, depth, or even the accuracy of the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Prompting?
&lt;/h2&gt;

&lt;p&gt;Prompting is how you communicate with an AI tool — basically, the instructions you give.&lt;/p&gt;

&lt;p&gt;If you think of AI as a new teammate, your &lt;strong&gt;prompt is your task description&lt;/strong&gt;. The clearer you are, the better the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example 1 – ChatGPT
&lt;/h2&gt;

&lt;p&gt;Let’s say you ask ChatGPT about JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 1:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Explain JavaScript.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;JavaScript is a programming language used to add interactivity to websites.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, let’s make it more specific.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 2:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Explain JavaScript in a fun, beginner-friendly way.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Think of a website as a body. HTML is the skeleton, CSS is the style, and JavaScript is the brain that makes it move and respond.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Just adding a few words (“fun” and “beginner-friendly”) completely changes the tone and structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example 2 – Gemini
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Prompt 1:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;What is React?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Gemini might respond:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;React is a JavaScript library developed by Meta for building user interfaces.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Prompt 2:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is React? Explain it as if I’m new to web development.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;React helps developers build reusable pieces of a web page called components — like small blocks you can combine to build modern, fast websites.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Again, the difference is in the prompt clarity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example 3 – Microsoft Copilot
&lt;/h2&gt;

&lt;p&gt;Microsoft Copilot also shows how the way you ask a question affects the quality of the response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 1:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Explain the benefits of TypeScript.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Copilot might respond:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;TypeScript adds static typing to JavaScript, helping developers find errors earlier and write more reliable code.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Prompt 2:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Explain the benefits of TypeScript for a junior web developer who is learning JavaScript.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;TypeScript helps you write cleaner JavaScript by catching mistakes before you run the code. It’s great for beginners because it provides hints and suggestions that make learning easier and projects more manageable.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The difference is clear, adding context (“for a junior web developer”) completely changes how Copilot frames the explanation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Whether you’re coding, writing, or brainstorming, &lt;strong&gt;prompting is the key to getting better results.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Good prompts save time, reduce back-and-forth, and help you get answers that fit your exact needs.&lt;/p&gt;

&lt;p&gt;Here are a few things I’ve learned:&lt;br&gt;
✅ Be clear about your goal.&lt;br&gt;
✅ Add context or examples.&lt;br&gt;
✅ Define the tone (formal, friendly, technical, etc.).&lt;br&gt;
✅ Tell the AI who it should act as (“You are a senior developer reviewing code…”).&lt;/p&gt;

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

&lt;p&gt;AI isn’t magic — it’s responsive to how you talk to it.&lt;br&gt;
When you write better prompts, you train yourself to think clearly and communicate effectively.&lt;/p&gt;

&lt;p&gt;So next time you use ChatGPT, Gemini, or Microsoft Copilot, remember:&lt;br&gt;
🗣️ The better your prompt, the smarter your result.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>gemini</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>AI is changing the way we review code, it's faster, smarter, and more consistent. Here’s how tools like Copilot and CodeRabbit are shaping the future of code reviews.</title>
      <dc:creator>Naji Louis</dc:creator>
      <pubDate>Fri, 31 Oct 2025 16:45:02 +0000</pubDate>
      <link>https://dev.to/najilouis/ai-is-changing-the-way-we-review-code-its-faster-smarter-and-more-consistent-heres-how-tools-3j3i</link>
      <guid>https://dev.to/najilouis/ai-is-changing-the-way-we-review-code-its-faster-smarter-and-more-consistent-heres-how-tools-3j3i</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/najilouis/how-ai-tools-are-changing-code-reviews-3d6m" class="crayons-story__hidden-navigation-link"&gt;How AI Tools Are Changing Code Reviews&lt;/a&gt;


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

          &lt;a href="/najilouis" 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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F379140%2F8e435760-6f7d-4e8c-bed7-c06d9b82eaa1.jpeg" alt="najilouis profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/najilouis" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Naji Louis
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Naji Louis
                
              
              &lt;div id="story-author-preview-content-2979450" 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="/najilouis" 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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F379140%2F8e435760-6f7d-4e8c-bed7-c06d9b82eaa1.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Naji Louis&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/najilouis/how-ai-tools-are-changing-code-reviews-3d6m" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 31 '25&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/najilouis/how-ai-tools-are-changing-code-reviews-3d6m" id="article-link-2979450"&gt;
          How AI Tools Are Changing Code Reviews
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/codereview"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;codereview&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/githubcopilot"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubcopilot&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwaredevelopment"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwaredevelopment&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/najilouis/how-ai-tools-are-changing-code-reviews-3d6m" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/najilouis/how-ai-tools-are-changing-code-reviews-3d6m#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


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

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

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

&lt;/div&gt;




</description>
      <category>codereview</category>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>How AI Tools Are Changing Code Reviews</title>
      <dc:creator>Naji Louis</dc:creator>
      <pubDate>Fri, 31 Oct 2025 16:34:00 +0000</pubDate>
      <link>https://dev.to/najilouis/how-ai-tools-are-changing-code-reviews-3d6m</link>
      <guid>https://dev.to/najilouis/how-ai-tools-are-changing-code-reviews-3d6m</guid>
      <description>&lt;p&gt;Code review has always been one of the most important parts of software development.&lt;br&gt;
It’s where bugs are caught, quality improves, and developers learn from each other.&lt;/p&gt;

&lt;p&gt;But let’s be honest — code reviews can also be time-consuming and repetitive.&lt;br&gt;
Sometimes, reviewers spend hours pointing out the same small issues: missing semicolons, unclear variable names, or unused imports.&lt;br&gt;
That’s where AI-powered tools like GitHub Copilot and CodeRabbit start to shine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Old Way of Reviewing Code
&lt;/h2&gt;

&lt;p&gt;Traditionally, a developer submits a pull request (PR), and another developer manually reviews it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check for syntax or formatting issues&lt;/li&gt;
&lt;li&gt;Ensure naming and structure are consistent&lt;/li&gt;
&lt;li&gt;Verify logic and potential edge cases&lt;/li&gt;
&lt;li&gt;Suggest improvements or simplifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s an important process, but it often slows things down — especially in teams where everyone is busy coding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter AI Code Review Assistants
&lt;/h2&gt;

&lt;p&gt;AI tools like Copilot (by GitHub) and CodeRabbit are helping automate parts of this process.&lt;br&gt;
They don’t replace humans — but they make the review smarter and faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;&lt;br&gt;
Most developers know Copilot as a coding assistant that helps write code.&lt;br&gt;
But GitHub introduced Copilot for Pull Requests, which adds AI to your review process.&lt;/p&gt;

&lt;p&gt;It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate summaries of code changes&lt;/li&gt;
&lt;li&gt;Suggest possible issues or improvements&lt;/li&gt;
&lt;li&gt;Even write comments automatically on pull requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of spending time writing “You forgot to handle null values here,” you can focus on higher-level discussions — like architecture or performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CodeRabbit&lt;/strong&gt;&lt;br&gt;
CodeRabbit takes AI reviews one step further.&lt;br&gt;
It acts as a virtual reviewer that analyzes your pull requests automatically and leaves comments just like a human reviewer would.&lt;/p&gt;

&lt;p&gt;What’s nice about it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It integrates with GitHub, GitLab, and Bitbucket&lt;/li&gt;
&lt;li&gt;It highlights potential bugs, smells, or style issues&lt;/li&gt;
&lt;li&gt;It learns over time from your codebase and review patterns&lt;/li&gt;
&lt;li&gt;It can be customized to match your team’s coding standards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, it’s like having another experienced teammate who never gets tired of reviewing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How These Tools Help in Real Projects
&lt;/h2&gt;

&lt;p&gt;Here’s what I personally found useful when trying them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster feedback — small issues get caught immediately.&lt;/li&gt;
&lt;li&gt;Cleaner PRs — reviewers see the important stuff, not style fixes.&lt;/li&gt;
&lt;li&gt;Consistent quality — AI follows the same rules every time.&lt;/li&gt;
&lt;li&gt;Knowledge sharing — less experienced developers learn good practices through AI suggestions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And since tools like CodeRabbit or Copilot integrate directly into GitHub workflows, they fit naturally into existing pipelines.&lt;/p&gt;

&lt;h2&gt;
  
  
  What AI Can’t Replace
&lt;/h2&gt;

&lt;p&gt;AI tools are great at identifying surface-level issues and patterns, but they can’t replace human judgment.&lt;/p&gt;

&lt;p&gt;You still need humans to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand business logic&lt;/li&gt;
&lt;li&gt;Evaluate performance trade-offs&lt;/li&gt;
&lt;li&gt;Discuss naming and readability in context&lt;/li&gt;
&lt;li&gt;Make final merge decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, think of AI as a helper — not a reviewer that replaces you, but one that frees you up for deeper discussions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of Code Reviews
&lt;/h2&gt;

&lt;p&gt;The combination of human expertise + AI assistance is where the real power lies.&lt;br&gt;
Developers will spend less time on repetitive tasks and more on meaningful feedback, architecture, and learning.&lt;/p&gt;

&lt;p&gt;In the near future, we might see AI that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suggests unit tests automatically for new code&lt;/li&gt;
&lt;li&gt;Detects security risks in real-time&lt;/li&gt;
&lt;li&gt;Explains complex logic in natural language during review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not about removing humans from the process — it’s about making humans more effective reviewers.&lt;/p&gt;

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

&lt;p&gt;Since trying these tools, I’ve noticed my code reviews are faster, and my pull requests are cleaner before anyone even looks at them.&lt;br&gt;
AI doesn’t replace communication or collaboration — it just removes friction.&lt;/p&gt;

&lt;p&gt;If your team hasn’t tried tools like Copilot for PRs or CodeRabbit, give them a shot.&lt;br&gt;
You’ll still need human insight, but you’ll spend less time chasing small issues and more time building better software&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Why I Stopped Using ngIf and ngFor in Angular</title>
      <dc:creator>Naji Louis</dc:creator>
      <pubDate>Mon, 27 Oct 2025 00:28:56 +0000</pubDate>
      <link>https://dev.to/najilouis/why-i-stopped-using-ngif-and-ngfor-in-angular-3m9m</link>
      <guid>https://dev.to/najilouis/why-i-stopped-using-ngif-and-ngfor-in-angular-3m9m</guid>
      <description>&lt;p&gt;I’ve been using Angular for quite some time, and like many developers, I got used to writing &lt;code&gt;*ngIf&lt;/code&gt;, &lt;code&gt;*ngFor&lt;/code&gt;, and &lt;code&gt;ngSwitch&lt;/code&gt; in almost every component. They worked fine until Angular introduced a new syntax that completely changed how I write templates.&lt;/p&gt;

&lt;p&gt;I’m talking about the new control flow syntax:&lt;br&gt;
&lt;code&gt;@if&lt;/code&gt;, &lt;code&gt;@else&lt;/code&gt;, &lt;code&gt;@for&lt;/code&gt;, &lt;code&gt;@let&lt;/code&gt;, &lt;code&gt;@switch&lt;/code&gt;, &lt;code&gt;@case&lt;/code&gt;, and &lt;code&gt;@default&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At first, I didn’t pay much attention. But after giving them a try, I quickly realized how much cleaner, simpler, and more natural my templates became.&lt;br&gt;
Here’s why I stopped using the old syntax and why you might want to as well.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem with the Old Syntax
&lt;/h2&gt;

&lt;p&gt;The old &lt;code&gt;*ngIf&lt;/code&gt;, &lt;code&gt;*ngFor&lt;/code&gt;, and &lt;code&gt;ngSwitch&lt;/code&gt; directives worked well, but they had a few downsides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The asterisks &lt;code&gt;*&lt;/code&gt; looked strange to new developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You often needed extra &lt;code&gt;&amp;lt;ng-container&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;ng-template&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nested conditions and loops were harder to read.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Angular’s new syntax fixes all of that. It’s built directly into the template engine, meaning no more directives — just clean, readable control flow.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@if&lt;/code&gt; and &lt;code&gt;@else&lt;/code&gt;&lt;br&gt;
The new &lt;code&gt;@if&lt;/code&gt; syntax replaces &lt;code&gt;*ngIf&lt;/code&gt; and feels much closer to regular JavaScript logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&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;&amp;lt;div *ngIf="isLoggedIn; else guestPart"&amp;gt;
  Welcome back!
&amp;lt;/div&amp;gt;

&amp;lt;ng-template #guestPart&amp;gt;
  Please log in.
&amp;lt;/ng-template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&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;@if (isLoggedIn) {
  &amp;lt;div&amp;gt;Welcome back!&amp;lt;/div&amp;gt;
} @else {
  &amp;lt;div&amp;gt;Please log in.&amp;lt;/div&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Easier to read&lt;br&gt;
✅ No  blocks or template references&lt;br&gt;
✅ Perfect for nesting conditions&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@for&lt;/code&gt;&lt;br&gt;
The classic &lt;code&gt;*ngFor&lt;/code&gt; still works, but &lt;code&gt;@for&lt;/code&gt; feels cleaner and reads more like plain JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&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;&amp;lt;ul&amp;gt;
  &amp;lt;li *ngFor="let user of users; trackBy: trackById"&amp;gt;
    {{ user.name }}
  &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&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;&amp;lt;ul&amp;gt;
  @for (user of users; track user.id) {
    &amp;lt;li&amp;gt;{{ user.name }}&amp;lt;/li&amp;gt;
  }
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Simpler syntax (track instead of trackBy)&lt;br&gt;
✅ No asterisk confusion&lt;br&gt;
✅ Easier to reason about&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@let&lt;/code&gt;&lt;br&gt;
Sometimes you need to store a local variable in your template.&lt;br&gt;
&lt;code&gt;@let&lt;/code&gt; makes that super easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&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;&amp;lt;ng-container *ngIf="user as u"&amp;gt;
  &amp;lt;p&amp;gt;Hello {{ u.name }}&amp;lt;/p&amp;gt;
&amp;lt;/ng-container&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&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;@let u = user;
&amp;lt;p&amp;gt;Hello {{ u.name }}&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Cleaner variable handling&lt;br&gt;
✅ Works outside &lt;code&gt;@if&lt;/code&gt; blocks&lt;br&gt;
✅ Makes templates easier to follow&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@switch&lt;/code&gt;, &lt;code&gt;@case&lt;/code&gt;, and &lt;code&gt;@default&lt;/code&gt;&lt;br&gt;
The new &lt;code&gt;@switch&lt;/code&gt; syntax replaces &lt;code&gt;ngSwitch&lt;/code&gt; and feels just like a real switch statement in JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&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;&amp;lt;div [ngSwitch]="status"&amp;gt;
  &amp;lt;p *ngSwitchCase="'active'"&amp;gt;Active&amp;lt;/p&amp;gt;
  &amp;lt;p *ngSwitchCase="'inactive'"&amp;gt;Inactive&amp;lt;/p&amp;gt;
  &amp;lt;p *ngSwitchDefault&amp;gt;Unknown&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&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;@switch (status) {
  @case ('active') {
    &amp;lt;p&amp;gt;Active&amp;lt;/p&amp;gt;
  }
  @case ('inactive') {
    &amp;lt;p&amp;gt;Inactive&amp;lt;/p&amp;gt;
  }
  @default {
    &amp;lt;p&amp;gt;Unknown&amp;lt;/p&amp;gt;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ More readable&lt;br&gt;
✅ No extra attributes&lt;br&gt;
✅ Matches JavaScript logic perfectly&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Start Using It
&lt;/h2&gt;

&lt;p&gt;You’ll need Angular 17 or newer to use this new syntax.&lt;br&gt;
If you’re upgrading, just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng update @angular/core@latest @angular/cli@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No extra setup or imports needed — it’s ready out of the box.&lt;/p&gt;

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

&lt;p&gt;After switching to the new syntax, my templates feel much cleaner and easier to maintain.&lt;br&gt;
I don’t need to wrap everything in containers or remember special &lt;code&gt;*&lt;/code&gt; rules anymore.&lt;/p&gt;

&lt;p&gt;If you’ve been using Angular for a while, try replacing a few &lt;code&gt;*ngIf&lt;/code&gt; or &lt;code&gt;*ngFor&lt;/code&gt; blocks with the new syntax and you’ll instantly see the difference.&lt;/p&gt;

&lt;p&gt;Sometimes small changes make a big impact and this one definitely does.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
