<?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: Ajmal Hasan</title>
    <description>The latest articles on DEV Community by Ajmal Hasan (@ajmal_hasan).</description>
    <link>https://dev.to/ajmal_hasan</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%2F376439%2F5c8c757f-9969-42c5-86e1-cdeec52d1abf.jpg</url>
      <title>DEV Community: Ajmal Hasan</title>
      <link>https://dev.to/ajmal_hasan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajmal_hasan"/>
    <language>en</language>
    <item>
      <title>📐 Mathematics for AI — Foundation Course</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Sat, 25 Jul 2026 09:06:54 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/mathematics-for-ai-foundation-course-18dk</link>
      <guid>https://dev.to/ajmal_hasan/mathematics-for-ai-foundation-course-18dk</guid>
      <description>&lt;p&gt;Before you can truly understand how AI systems think, learn, and generate responses, you need to understand the math that powers them. This guide covers the essential mathematical concepts that form the backbone of modern Artificial Intelligence and Large Language Models (LLMs).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why does this matter?&lt;/strong&gt; Every aspect of AI — from how text is encoded, to how a model predicts the next word, to how it improves itself during training — is driven by mathematics. Skipping this foundation means you will only ever use AI as a black box, without understanding &lt;em&gt;why&lt;/em&gt; it works.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔄 How an LLM Actually Works — The Complete Pipeline
&lt;/h2&gt;

&lt;p&gt;Before diving into each math concept individually, here's the &lt;strong&gt;big picture&lt;/strong&gt; of how text flows through a Large Language Model from input to output. Every section in this guide maps to a step in this pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ┌─────────────────────┐
  │     Your Prompt     │   "What is gravity?"
  └──────────┬──────────┘
             ↓
  ┌─────────────────────┐
  │     Tokenizer       │   Splits text into chunks (BPE algorithm)
  └──────────┬──────────┘   → Section 1: Number Systems &amp;amp; Encoding
             ↓
  ┌─────────────────────┐
  │     Token IDs       │   Each token → a number (e.g., "gravity" → 17942)
  └──────────┬──────────┘   → Section 1: Number Systems &amp;amp; Encoding
             ↓
  ┌─────────────────────┐
  │   Embedding Model   │   Each token ID → a dense vector of numbers
  └──────────┬──────────┘   → Section 3: Vectors &amp;amp; Embeddings
             ↓
  ┌─────────────────────┐
  │      Vectors        │   [0.12, -0.87, 0.45, ...] per token
  │  + Positional Info  │   → Section 3 &amp;amp; 6: Embeddings &amp;amp; Linear Algebra
  └──────────┬──────────┘
             ↓
  ┌─────────────────────┐
  │    Transformer      │   Multi-Head Attention + Feed-Forward layers
  │    (×N layers)      │   repeated 32-96+ times
  └──────────┬──────────┘   → Section 4, 6: Algebra &amp;amp; Linear Algebra
             ↓
  ┌─────────────────────┐
  │    Probability      │   Softmax converts final output to
  │    Distribution     │   probabilities over entire vocabulary
  └──────────┬──────────┘   → Section 2 &amp;amp; 6: Probability &amp;amp; Softmax
             ↓
  ┌─────────────────────┐
  │    Next Token       │   Sampling picks one token
  │    (Sampling)       │   (using Temperature, Top-K, Top-P)
  └──────────┬──────────┘   → Section 2: Probability &amp;amp; Prediction
             ↓
  ┌─────────────────────┐
  │  Append &amp;amp; Repeat    │   Add the new token to the sequence,
  │  (Autoregressive)   │   feed it back in, and repeat until done
  └─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F7psp57rafk9fgasqnujc.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%2F7psp57rafk9fgasqnujc.png" alt=" " width="800" height="687"&gt;&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%2F9m6igntw7npk0f0d62zr.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%2F9m6igntw7npk0f0d62zr.png" alt=" " width="800" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; The model generates text &lt;strong&gt;one token at a time&lt;/strong&gt;. Each time it produces a token, it adds it to the input and runs the entire pipeline again for the next token. This is called &lt;strong&gt;autoregressive generation&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📚 Core Concepts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Number Systems &amp;amp; Encoding
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;How do computers understand human language?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Computers only understand numbers. So before any AI can process text, every character must be converted into a number.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ASCII:&lt;/strong&gt; The original standard that mapped 128 common English characters (letters, digits, symbols) to numbers. For example, the letter &lt;code&gt;A&lt;/code&gt; = &lt;code&gt;65&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unicode:&lt;/strong&gt; An expanded standard that covers over 140,000 characters across all human languages, including emojis and special symbols.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UTF-8:&lt;/strong&gt; The most widely used encoding format on the internet. It efficiently encodes Unicode characters into byte sequences that computers can store and transmit. English characters use 1 byte, while complex characters (like Chinese or emojis) use up to 4 bytes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tokenization:&lt;/strong&gt; AI models do not read character-by-character. Instead, text is broken into chunks called &lt;strong&gt;tokens&lt;/strong&gt; (which can be words, parts of words, or punctuation). Each token is then converted into a numeric ID before being fed into the model.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BPE (Byte Pair Encoding):&lt;/strong&gt; The most common tokenization algorithm used by models like GPT. It starts with individual characters, then repeatedly merges the most frequent pairs of adjacent tokens until a target vocabulary size is reached.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vocabulary Size:&lt;/strong&gt; The total number of unique tokens a model recognizes. GPT-4 uses ~100,000 tokens. Larger vocabularies mean fewer tokens per sentence (more efficient), but a bigger embedding matrix (more memory).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-Hot Encoding:&lt;/strong&gt; Before embeddings existed, words were represented as sparse binary vectors where only one position is "1" and the rest are "0". This is wasteful and captures no meaning, which is why embeddings replaced it.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — How "Hello AI" becomes numbers:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Text Input:   "Hello AI"

Step 1 – Tokenize (using BPE):
  ["Hello", " AI"]

Step 2 – Assign Token IDs (lookup in vocabulary table):
  "Hello" → 9906
  " AI"   → 15592

Step 3 – Model Input:
  [9906, 15592]

The model never sees letters — only numbers.
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — One-Hot Encoding vs. Embeddings:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vocabulary: [cat, dog, fish, car]

One-Hot (sparse, no meaning):
  "cat"  → [1, 0, 0, 0]
  "dog"  → [0, 1, 0, 0]
  "fish" → [0, 0, 1, 0]
  "car"  → [0, 0, 0, 1]
  Problem: "cat" and "dog" look equally different from each other
           as "cat" and "car". No notion of similarity.

Embedding (dense, captures meaning):
  "cat"  → [0.82, -0.15, 0.47]   ← close to "dog"
  "dog"  → [0.79, -0.12, 0.51]   ← close to "cat"
  "fish" → [0.55, 0.33, 0.42]    ← animal but different
  "car"  → [-0.71, 0.88, -0.22]  ← very different from animals
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. Probability &amp;amp; Prediction
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;How does AI "know" what to say next?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;AI models do not look up facts in a database. Instead, they &lt;strong&gt;predict the most probable next token&lt;/strong&gt; based on everything they have processed so far. This is purely a probability problem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Probability Distribution:&lt;/strong&gt; After processing your input, the model calculates a probability score for every word in its vocabulary. The word with the highest score is the most likely next word.

&lt;ul&gt;
&lt;li&gt;All probabilities must sum to exactly &lt;code&gt;1.0&lt;/code&gt; (100%).&lt;/li&gt;
&lt;li&gt;This distribution is produced by the &lt;strong&gt;Softmax&lt;/strong&gt; function (covered in Section 6).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional Probability:&lt;/strong&gt; The probability of a word depends on all the words that came before it. Mathematically: &lt;code&gt;P(word_n | word_1, word_2, ..., word_n-1)&lt;/code&gt;. This chain of dependencies is what makes language models "contextual."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temperature:&lt;/strong&gt; A setting that controls how "creative" or "random" the model's output is.

&lt;ul&gt;
&lt;li&gt;Mathematically, temperature &lt;strong&gt;divides the logits before Softmax&lt;/strong&gt;: &lt;code&gt;softmax(logits / T)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A low temperature (e.g., &lt;code&gt;0.2&lt;/code&gt;) sharpens the distribution — the top word dominates.&lt;/li&gt;
&lt;li&gt;A high temperature (e.g., &lt;code&gt;1.5&lt;/code&gt;) flattens the distribution — more words become viable.&lt;/li&gt;
&lt;li&gt;Temperature = &lt;code&gt;0&lt;/code&gt; → always picks the single most probable word (called &lt;strong&gt;greedy decoding&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top-K Sampling:&lt;/strong&gt; Instead of considering all possible words, the model only picks from the top &lt;code&gt;K&lt;/code&gt; most likely words. This prevents very unlikely words from ever being chosen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top-P (Nucleus) Sampling:&lt;/strong&gt; Instead of a fixed count like Top-K, the model picks from the smallest group of words whose combined probability adds up to &lt;code&gt;P&lt;/code&gt; (e.g., 90%). This is a more flexible and nuanced approach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Greedy vs. Beam Search:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Greedy Decoding:&lt;/strong&gt; Always pick the single most probable token at each step. Fast, but can miss globally optimal sequences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beam Search:&lt;/strong&gt; Keep track of the top &lt;code&gt;N&lt;/code&gt; best partial sequences at each step and choose the best overall. Slower, but often produces higher-quality output for tasks like translation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — Predicting the next word for "The sky is ___":&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model's probability scores:
  "blue"     → 55%
  "clear"    → 25%
  "cloudy"   → 15%
  "falling"  →  3%
  "delicious"→  0.1%

Temperature = 0.2 (low) → almost always picks "blue"  (safe, predictable)
Temperature = 1.5 (high) → might pick "cloudy" or even "falling" (creative)
Top-K = 2               → only considers "blue" and "clear"
Top-P = 0.80            → only considers "blue" + "clear" (80% combined)
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;📊 Top-k vs. Top-p Comparison:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Top-k&lt;/th&gt;
&lt;th&gt;Top-p (Nucleus)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Selection method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fixed number of tokens&lt;/td&gt;
&lt;td&gt;Dynamic (based on probability mass)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Adaptability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When model is confident&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Still forces k tokens&lt;/td&gt;
&lt;td&gt;Uses very few tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When model is uncertain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limits to k tokens&lt;/td&gt;
&lt;td&gt;Can use many tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Risk of bad tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple control&lt;/td&gt;
&lt;td&gt;Natural, high-quality text&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;💡 Example — Greedy vs. Beam Search:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: "I want to"

Greedy (pick best at each step):
  Step 1: "go" (40%)  → "I want to go"
  Step 2: "to" (35%)  → "I want to go to"
  Step 3: "the" (50%) → "I want to go to the"
  Result: "I want to go to the" — decent but narrow

Beam Search (track top 3 paths):
  Path A: "go"   (40%) → "go home"    (18%) → score: 7.2
  Path B: "eat"  (30%) → "eat dinner" (25%) → score: 7.5  ← winner
  Path C: "know" (20%) → "know more"  (15%) → score: 3.0
  Result: "I want to eat dinner" — better overall sentence
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  3. Vectors &amp;amp; Embeddings
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;How does AI understand meaning, not just words?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A computer cannot inherently understand that "King" and "Queen" are related, or that "cat" and "dog" are both animals. &lt;strong&gt;Embeddings&lt;/strong&gt; solve this problem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What is a Vector?&lt;/strong&gt; A vector is simply a list of numbers (e.g., &lt;code&gt;[0.2, -0.5, 0.8, ...]&lt;/code&gt;). In AI, every word or concept is converted into a vector with hundreds or thousands of numbers. Each number in the vector represents some learned aspect of the word's meaning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimensionality:&lt;/strong&gt; The number of values in a vector. GPT-3 uses 12,288 dimensions per token. Higher dimensions can capture more nuance but require more computation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embeddings:&lt;/strong&gt; These are vector representations where words with similar meanings end up having mathematically similar vectors (i.e., they are "close" to each other in vector space). Embeddings are &lt;strong&gt;learned&lt;/strong&gt; during training — the model figures out the best numerical representation for each word.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Types of Embeddings:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Word Embeddings:&lt;/strong&gt; Each word gets a single fixed vector (e.g., Word2Vec, GloVe). Limitation: "bank" has the same vector whether it means "river bank" or "financial bank."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual Embeddings:&lt;/strong&gt; Each word gets a different vector depending on its context (e.g., BERT, GPT). This solved the ambiguity problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentence / Document Embeddings:&lt;/strong&gt; Entire sentences or documents are represented as a single vector, useful for search and comparison.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cosine Similarity:&lt;/strong&gt; The most common way to measure how similar two vectors are. It calculates the angle between them. A cosine similarity of &lt;code&gt;1.0&lt;/code&gt; means identical direction (very similar), &lt;code&gt;0&lt;/code&gt; means unrelated, and &lt;code&gt;-1&lt;/code&gt; means opposite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Similarity:&lt;/strong&gt; Because embeddings capture meaning, an AI can calculate that &lt;code&gt;"Paris" - "France" + "Germany" ≈ "Berlin"&lt;/code&gt;. This is how AI understands relationships between concepts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why this matters for RAG:&lt;/strong&gt; Vector databases store these embeddings, allowing an AI to semantically search your documents — finding related content even if the exact words don't match.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — Words as coordinates in space:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Imagine a 2D map where similar words are placed close together:

       [Royalty Axis]
            ↑
   Queen •  | • King
            |
  ──────────┼──────────→ [Gender Axis]
            |
   Woman •  | • Man
            |

"King" - "Man" + "Woman" ≈ "Queen"
The math works because similar concepts cluster together in vector space.
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — Cosine Similarity in practice:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Embedding for "dog":    [0.8,  0.3, -0.1]
Embedding for "puppy":  [0.75, 0.35, -0.05]
Embedding for "laptop": [-0.2, 0.9,  0.6]

cosine_similarity("dog", "puppy")  = 0.99  → very similar ✓
cosine_similarity("dog", "laptop") = 0.12  → very different ✗

This is how a search engine knows that a query for "puppy care"
should also return results about "dog health" — even though the
exact words don't match.
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  4. Algebra &amp;amp; Model Formulas
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;The math inside a neural network.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At its core, a neural network is just a series of mathematical functions applied one after another.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Core Formula:&lt;/strong&gt; The fundamental building block of a neural network is: &lt;code&gt;y = wx + b&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;x&lt;/code&gt; = the input (your data)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;w&lt;/code&gt; = weights (values the model learns during training to adjust its behavior)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b&lt;/code&gt; = bias (an offset value that helps the model fit the data better)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;y&lt;/code&gt; = the output (the model's prediction)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With Multiple Inputs:&lt;/strong&gt; In real networks, a neuron has many inputs: &lt;code&gt;y = w₁x₁ + w₂x₂ + w₃x₃ + ... + b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summation (&lt;code&gt;Σ&lt;/code&gt;):&lt;/strong&gt; Neurons in a network receive multiple inputs and add them all together (as a weighted sum) before passing the result forward: &lt;code&gt;y = Σ(wᵢxᵢ) + b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation Functions:&lt;/strong&gt; After the summation, a non-linear function is applied to the result. This is what allows the network to learn complex, non-linear patterns in data. Without activation functions, a neural network would just be a linear equation, no matter how many layers you stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common Activation Functions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;| Function | Formula | Range | Used For |&lt;br&gt;
  |---|---|---|---|&lt;br&gt;
  | &lt;strong&gt;ReLU&lt;/strong&gt; | &lt;code&gt;max(0, x)&lt;/code&gt; | [0, ∞) | Hidden layers (most common) |&lt;br&gt;
  | &lt;strong&gt;Sigmoid&lt;/strong&gt; | &lt;code&gt;1 / (1 + e⁻ˣ)&lt;/code&gt; | (0, 1) | Binary classification outputs |&lt;br&gt;
  | &lt;strong&gt;Tanh&lt;/strong&gt; | &lt;code&gt;(eˣ - e⁻ˣ) / (eˣ + e⁻ˣ)&lt;/code&gt; | (-1, 1) | Hidden layers, LSTMs |&lt;br&gt;
  | &lt;strong&gt;Softmax&lt;/strong&gt; | &lt;code&gt;eˣⁱ / Σeˣʲ&lt;/code&gt; | (0, 1), sums to 1 | Multi-class outputs |&lt;br&gt;
  | &lt;strong&gt;GELU&lt;/strong&gt; | &lt;code&gt;x · Φ(x)&lt;/code&gt; | (-0.17, ∞) | Transformers (GPT, BERT) |&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layers:&lt;/strong&gt; A neural network is made of stacked layers. Each layer applies its own &lt;code&gt;wx + b&lt;/code&gt; + activation. The output of one layer becomes the input to the next.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input Layer:&lt;/strong&gt; Receives the raw data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hidden Layers:&lt;/strong&gt; The layers between input and output where the actual "learning" happens. More layers = deeper network = ability to learn more complex patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output Layer:&lt;/strong&gt; Produces the final prediction.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — Predicting house price (y = wx + b):&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input (x):   150  (house size in m²)
Weight (w):  0.5  (learned: each m² adds $500)
Bias (b):    20   (learned: base price is $20k)

y = 0.5 × 150 + 20 = 95  → Predicted price: $95,000

During training, 'w' and 'b' are adjusted thousands of times
until predictions match the real prices in the dataset.
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — Why non-linearity (activation) matters:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Without activation (just stacking y = wx + b):
  Layer 1: y = 2x + 1
  Layer 2: y = 3(2x + 1) + 5 = 6x + 8
  → Still just a straight line! No matter how many layers.

With ReLU activation:
  Layer 1: y = ReLU(2x + 1) = max(0, 2x + 1)
  Layer 2: y = 3 · max(0, 2x + 1) + 5
  → Now the network can model curves, bends, and complex shapes!

This is why we need activation functions — they let the network
learn patterns that are NOT simple straight lines.
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  5. Statistics
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Understanding the shape of your data.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Statistics are used to analyze and understand the data that is used to train AI models. Knowing the statistical properties of your data directly impacts model quality.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mean (Average):&lt;/strong&gt; The central value of a dataset. Calculated by summing all values and dividing by the count. In AI, model weights are often initialized near a mean of &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variance:&lt;/strong&gt; The average of the squared differences from the mean. Tells you how much the data values vary. High variance in training data can make a model unstable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normal Distribution (Bell Curve):&lt;/strong&gt; Many real-world datasets follow this pattern, where most values cluster around the average (mean) and fewer values exist at the extremes.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;68-95-99.7 Rule:&lt;/strong&gt; In a normal distribution, 68% of data falls within 1 standard deviation of the mean, 95% within 2, and 99.7% within 3.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standard Deviation (σ):&lt;/strong&gt; The square root of variance. A more intuitive measure of spread because it's in the same unit as the data.

&lt;ul&gt;
&lt;li&gt;A low σ means data points are clustered close to the mean.&lt;/li&gt;
&lt;li&gt;A high σ means they are spread out widely.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skewness:&lt;/strong&gt; A measure of how asymmetric a distribution is. Understanding skewness is critical for identifying and fixing data quality issues before training a model.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Right-skewed:&lt;/strong&gt; Tail extends to the right (e.g., income data — most people earn average, few earn millions).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Left-skewed:&lt;/strong&gt; Tail extends to the left (e.g., age at retirement — most retire at 60-65, few retire at 30).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalization &amp;amp; Standardization:&lt;/strong&gt; Techniques to scale data before training:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Min-Max Normalization:&lt;/strong&gt; Scales values to a [0, 1] range. &lt;code&gt;x_new = (x - min) / (max - min)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Z-Score Standardization:&lt;/strong&gt; Scales values to have mean=0 and σ=1. &lt;code&gt;x_new = (x - mean) / σ&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it matters:&lt;/strong&gt; If one input feature ranges from 0-1 and another from 0-1,000,000, the model will be overwhelmed by the larger feature. Normalization puts all features on an equal footing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch Normalization:&lt;/strong&gt; A technique used &lt;em&gt;inside&lt;/em&gt; neural networks that normalizes the output of each layer before passing it to the next. This dramatically speeds up training and makes networks more stable.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — Normal Distribution of user response lengths:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       Most users write medium-length messages
                        ↓
   |         ▂▄█▄▂
   |       ▂██████▂
   |     ▄██████████▄
   |___▄████████████████▄___
       5  10  20  30  40  (words)
       ↑                ↑
     Very           Very long
     short         (rare)
     (rare)

68-95-99.7 Rule:
  68% of messages are 15-25 words  (within 1σ of mean=20)
  95% of messages are 10-30 words  (within 2σ)
  99.7% are 5-35 words             (within 3σ)
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — Why Normalization matters:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Raw Features for a model predicting salary:
  Age:              [25, 30, 45, 50]         ← range: 25-50
  Years of Exp:     [2, 5, 18, 22]           ← range: 2-22
  GitHub Commits:   [100, 500, 8000, 12000]  ← range: 100-12000

Without normalization: the model thinks "GitHub Commits" is
240x more important than "Age" just because the numbers are bigger!

After Min-Max Normalization (all become 0-1):
  Age:              [0.0, 0.2, 0.8, 1.0]
  Years of Exp:     [0.0, 0.15, 0.8, 1.0]
  GitHub Commits:   [0.0, 0.034, 0.66, 1.0]

Now all features are on equal footing ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  6. Matrices &amp;amp; Linear Algebra
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;How AI handles data at massive scale.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Training AI on millions of data points simultaneously requires extremely efficient computation. Matrices make this possible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalar, Vector, Matrix, Tensor:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalar:&lt;/strong&gt; A single number (e.g., &lt;code&gt;5&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector:&lt;/strong&gt; A 1D array of numbers (e.g., &lt;code&gt;[1, 2, 3]&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matrix:&lt;/strong&gt; A 2D grid of numbers (rows × columns).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tensor:&lt;/strong&gt; A generalization — can be any number of dimensions. A 3D tensor is a "stack of matrices." All data in deep learning frameworks (PyTorch, TensorFlow) is represented as tensors.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Matrix Multiplication:&lt;/strong&gt; The core operation in neural networks. When a model processes a batch of inputs through a layer, it's performing matrix multiplication: &lt;code&gt;Output = Input × Weights + Bias&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rule:&lt;/strong&gt; To multiply matrix A (m×n) by matrix B (n×p), the inner dimensions must match. The result is (m×p).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GPU Parallelism:&lt;/strong&gt; Graphics Processing Units (GPUs) are extremely efficient at performing &lt;strong&gt;thousands of matrix operations simultaneously&lt;/strong&gt; (in parallel), which is why they are essential for AI training. A CPU processes operations one-by-one; a GPU processes entire matrices at once.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dot Product:&lt;/strong&gt; The sum of element-wise multiplication of two vectors. It measures how "aligned" two vectors are. This is the fundamental building block of attention.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[1, 2, 3] · [4, 5, 6] = (1×4) + (2×5) + (3×6) = 32&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transpose:&lt;/strong&gt; Flipping a matrix so rows become columns and vice versa. Written as &lt;code&gt;Aᵀ&lt;/code&gt;. Essential for many neural network operations (e.g., computing attention scores).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Softmax Function:&lt;/strong&gt; A function applied to the final output layer of a model that converts a list of raw scores (logits) into a probability distribution (all values sum to 1), making it easy to select the most likely prediction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Attention Mechanism (Query, Key, Value):&lt;/strong&gt; The core of the &lt;strong&gt;Transformer&lt;/strong&gt; architecture. This is perhaps the most important concept in modern AI.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; For each token, the model creates three vectors:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query (Q):&lt;/strong&gt; "What am I looking for?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key (K):&lt;/strong&gt; "What information do I have?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value (V):&lt;/strong&gt; "What is the actual content I will use?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Attention Formula:&lt;/strong&gt; &lt;code&gt;Attention(Q, K, V) = softmax(QKᵀ / √dₖ) × V&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;QKᵀ&lt;/code&gt; = dot product of queries and keys → produces attention scores (how relevant is each token to every other token)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/ √dₖ&lt;/code&gt; = scaling factor to prevent scores from getting too large (dₖ = dimension of key vectors)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;softmax(...)&lt;/code&gt; = normalizes scores to probabilities&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;× V&lt;/code&gt; = weighted sum of values using those probabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Head Attention:&lt;/strong&gt; Instead of computing attention once, the model does it &lt;code&gt;N&lt;/code&gt; times in parallel with different learned projections ("heads"), then concatenates the results. This lets the model focus on different types of relationships simultaneously (e.g., one head tracks grammar, another tracks meaning, another tracks position).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Positional Encoding:&lt;/strong&gt; Since Transformers process all tokens simultaneously (not sequentially like RNNs), they have no inherent sense of word order. Positional encodings are special vectors added to the input embeddings to tell the model the position of each token in the sequence.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — Matrix Multiplication in a neural network layer:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input batch (2 sentences, 3 features each):     Weights (3 inputs → 2 outputs):

X = | 1  2  3 |                                  W = | 0.5  0.1 |
    | 4  5  6 |                                      | 0.3  0.7 |
    (2×3)                                            | 0.8  0.2 |
                                                     (3×2)
Output = X × W

  | (1×0.5+2×0.3+3×0.8)  (1×0.1+2×0.7+3×0.2) |     | 3.5  2.1 |
  | (4×0.5+5×0.3+6×0.8)  (4×0.1+5×0.7+6×0.2) |  =  | 8.3  5.1 |
  (2×2)                                              (2×2)

Both sentences processed AT THE SAME TIME — this is why GPUs are fast.
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — Softmax converting raw scores to probabilities:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Raw model scores (logits):
  "cat"  →  3.2
  "dog"  →  1.8
  "car"  →  0.5

After Softmax:
  "cat"  → 68%  ← highest probability, model picks this
  "dog"  → 26%
  "car"  →  6%
  Total  = 100% ✓
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — Attention in the sentence "The animal didn't cross the street because **it&lt;/strong&gt; was too tired":**&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;When the model processes "it", attention helps it look back:

  "The"(2%) "animal"(60%) "didn't"(3%) "cross"(5%)
  "the"(2%) "street"(8%) "because"(5%) "it"(15%)

The model correctly identifies "it" = "animal", not "street"
— because attention assigns higher weight to "animal".
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — Multi-Head Attention (simplified):&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sentence: "The bank was flooded after the river overflowed"

Head 1 (Grammatical):  "bank" attends to → "was" (subject-verb)
Head 2 (Semantic):     "bank" attends to → "river" (meaning = river bank)
Head 3 (Positional):   "bank" attends to → "The" (nearby context)

Combined: The model understands "bank" = river bank, not financial bank.
Multiple perspectives = better understanding.
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  7. Calculus &amp;amp; Optimization
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;How does a model actually learn?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Learning in AI is the process of gradually adjusting the model's internal parameters (weights) to make better predictions. Calculus is the tool used to determine &lt;em&gt;how&lt;/em&gt; to adjust them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Loss Function:&lt;/strong&gt; A formula that measures how wrong the model's prediction is compared to the actual correct answer. The goal of training is to &lt;strong&gt;minimize&lt;/strong&gt; this value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common Loss Functions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;| Loss Function | Used For | What It Measures |&lt;br&gt;
  |---|---|---|&lt;br&gt;
  | &lt;strong&gt;MSE (Mean Squared Error)&lt;/strong&gt; | Regression (predicting numbers) | Average of squared differences |&lt;br&gt;
  | &lt;strong&gt;Cross-Entropy Loss&lt;/strong&gt; | Classification (predicting categories) | Difference between predicted and actual probability distributions |&lt;br&gt;
  | &lt;strong&gt;Binary Cross-Entropy&lt;/strong&gt; | Yes/No classification | Cross-Entropy for 2 classes |&lt;br&gt;
  | &lt;strong&gt;Contrastive Loss&lt;/strong&gt; | Embedding models | Distance between similar vs. dissimilar pairs |&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Derivative / Gradient:&lt;/strong&gt; The derivative tells us the &lt;strong&gt;rate of change&lt;/strong&gt; — how much the loss changes if we slightly adjust a weight. The gradient is a vector of all partial derivatives across all weights.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the gradient is positive → the weight is making the loss go up → &lt;strong&gt;decrease&lt;/strong&gt; it.&lt;/li&gt;
&lt;li&gt;If the gradient is negative → the weight is making the loss go down → &lt;strong&gt;increase&lt;/strong&gt; it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Backpropagation:&lt;/strong&gt; The algorithm that efficiently calculates gradients for every weight in the network by working &lt;strong&gt;backward&lt;/strong&gt; from the output layer to the input layer, using the chain rule of calculus.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Chain Rule:&lt;/strong&gt; If &lt;code&gt;y = f(g(x))&lt;/code&gt;, then &lt;code&gt;dy/dx = f'(g(x)) × g'(x)&lt;/code&gt;. In a deep network with many layers, the chain rule is applied repeatedly to propagate the error signal back through each layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gradient Descent:&lt;/strong&gt; The core optimization algorithm. After calculating the gradients, we take a small step in the direction that reduces the loss. Repeat this process millions of times, and the model progressively improves.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Variants of Gradient Descent:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;| Variant | Description | Pros/Cons |&lt;br&gt;
  |---|---|---|&lt;br&gt;
  | &lt;strong&gt;Batch GD&lt;/strong&gt; | Uses ALL training data per step | Accurate but very slow on large datasets |&lt;br&gt;
  | &lt;strong&gt;Stochastic GD (SGD)&lt;/strong&gt; | Uses ONE random sample per step | Very fast but noisy/unstable |&lt;br&gt;
  | &lt;strong&gt;Mini-Batch GD&lt;/strong&gt; | Uses a small batch (e.g., 32 samples) | Best balance — standard in practice |&lt;br&gt;
  | &lt;strong&gt;Adam&lt;/strong&gt; | Adaptive learning rate per parameter | Most popular optimizer; fast convergence |&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learning Rate (α):&lt;/strong&gt; A hyperparameter that controls how large each step in gradient descent is. Too large, and the model overshoots and may never converge. Too small, and training is extremely slow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Learning Rate Scheduling:&lt;/strong&gt; Strategies to change the learning rate during training:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warmup:&lt;/strong&gt; Start with a very small LR, then gradually increase. Prevents early instability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decay:&lt;/strong&gt; Gradually reduce LR as training progresses to fine-tune final weights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cosine Annealing:&lt;/strong&gt; LR follows a cosine curve — starts high, smoothly decreases, optionally restarts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vanishing / Exploding Gradients:&lt;/strong&gt; In very deep networks, gradients can become extremely small (vanishing) or extremely large (exploding) as they pass through many layers during backpropagation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vanishing:&lt;/strong&gt; Early layers stop learning because the gradient signal is too weak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploding:&lt;/strong&gt; Weights blow up to infinity, causing NaN errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solutions:&lt;/strong&gt; ReLU activation (prevents vanishing), gradient clipping (prevents exploding), residual connections (Skip connections, as used in Transformers).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — Gradient Descent as rolling a ball downhill:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Imagine a valley (the loss landscape):

  Loss
   |  \         /
   |   \       /
   |    \     /
   |     \   /
   |      \_/   ← Minimum loss (best model weights)
   └──────────────── Weights

The "ball" = model's current weights
Gradient   = slope at the ball's current position (which way is "down"?)
Step size  = Learning Rate

Too large a step → overshoots the valley, bounces around forever
Too small a step → takes forever to reach the bottom
Just right       → smoothly rolls to the minimum ✓
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — Backpropagation (Chain Rule applied to a 3-layer network):&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Forward Pass:
  Input → [Layer 1] → [Layer 2] → [Layer 3] → Prediction → Loss = 5.2

Backward Pass (backpropagation):
  Loss = 5.2
  ← How much did Layer 3 contribute to this error?  → adjust Layer 3 weights
  ← How much did Layer 2 contribute?                → adjust Layer 2 weights
  ← How much did Layer 1 contribute?                → adjust Layer 1 weights

Each layer's contribution is calculated using the Chain Rule:
  ∂Loss/∂w₁ = ∂Loss/∂Layer3 × ∂Layer3/∂Layer2 × ∂Layer2/∂w₁

This is how error signals "propagate back" through the network.
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  8. Information Theory
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Measuring uncertainty in AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Information theory provides mathematical tools to quantify how much uncertainty exists in a probability distribution — crucial for evaluating model quality.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Entropy (H):&lt;/strong&gt; Measures the average amount of uncertainty or "randomness" in a system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Formula: &lt;code&gt;H(X) = -Σ p(x) × log₂(p(x))&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A high-entropy model is very uncertain about its predictions.&lt;/li&gt;
&lt;li&gt;A low-entropy model is very confident.&lt;/li&gt;
&lt;li&gt;Maximum entropy = uniform distribution (all outcomes equally likely).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practical use:&lt;/strong&gt; During training, you want the model's entropy on correct answers to decrease (becoming more confident about the right answer).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cross-Entropy:&lt;/strong&gt; Measures the difference between the true distribution and the predicted distribution. This is the &lt;strong&gt;most commonly used loss function&lt;/strong&gt; for classification tasks and language models.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Formula: &lt;code&gt;H(P, Q) = -Σ p(x) × log₂(q(x))&lt;/code&gt; where P is the true distribution and Q is the predicted.&lt;/li&gt;
&lt;li&gt;A perfect model has cross-entropy equal to the true entropy.&lt;/li&gt;
&lt;li&gt;A bad model has much higher cross-entropy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Perplexity:&lt;/strong&gt; A direct measure of how well a language model predicts a sample of text. Mathematically, it's &lt;code&gt;2^(cross-entropy)&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A lower perplexity score means the model is better at predicting the text and is less "surprised" by it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intuition:&lt;/strong&gt; A perplexity of 10 means the model is as confused as if it had to choose uniformly among 10 options at each step. A perplexity of 100 means it's choosing among 100 options. Lower is better.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;KL Divergence (Kullback-Leibler Divergence):&lt;/strong&gt; Measures the difference between two probability distributions. It is NOT symmetric: &lt;code&gt;KL(P||Q) ≠ KL(Q||P)&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Formula: &lt;code&gt;KL(P||Q) = Σ p(x) × log(p(x) / q(x))&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use in RLHF:&lt;/strong&gt; When fine-tuning a model with Reinforcement Learning from Human Feedback, KL divergence is used as a penalty to prevent the model from changing too much from its original behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use in VAEs:&lt;/strong&gt; Variational Autoencoders use KL divergence to ensure the learned data representation stays close to a normal distribution.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mutual Information:&lt;/strong&gt; Measures how much knowing one variable tells you about another. If two variables share a lot of mutual information, they are strongly related. Used in feature selection and understanding what a model has learned.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — Entropy comparison:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fair coin flip:
  P(heads) = 0.5, P(tails) = 0.5
  H = -(0.5 × log₂(0.5) + 0.5 × log₂(0.5)) = 1.0 bit
  → Maximum uncertainty (could be either outcome)

Biased coin:
  P(heads) = 0.99, P(tails) = 0.01
  H = -(0.99 × log₂(0.99) + 0.01 × log₂(0.01)) = 0.08 bits
  → Very low uncertainty (almost always heads)

AI Application: When a model is well-trained, its predictions
should have LOW entropy on correct answers.
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — Perplexity comparison:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sentence: "The cat sat on the ___"

Good Model (low perplexity):
  "mat" → 60%, "floor" → 20%, "roof" → 10% ...
  Model is NOT surprised. Perplexity ≈ 5

Bad Model (high perplexity):
  "mat" → 8%, "democracy" → 7%, "blue" → 6% ...
  Model is very confused. Perplexity ≈ 500

Lower perplexity = better language understanding ✓
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;💡 Example — KL Divergence in RLHF:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original Model (before fine-tuning):
  P("thank you") = 30%, P("thanks") = 25%, P("ok") = 20%

Fine-tuned Model (after RLHF):
  Q("thank you") = 80%, Q("thanks") = 15%, Q("ok") = 2%

KL(P||Q) = 0.82  → Significant drift from original behavior

If KL &amp;gt; threshold → apply penalty to prevent the model from
becoming too different (could lose general capabilities)
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🧠 The Complete Training Loop
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Putting it all together — how a model actually trains from start to finish.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Understanding each math concept individually is important, but the real power comes from seeing how they all work together in the training loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│                     THE TRAINING LOOP                           │
│                                                                 │
│  1. INPUT                                                       │
│     Raw text → Tokenize → Token IDs → Embeddings (vectors)     │
│     (Encoding)  (BPE)      (Lookup)    (Learned vectors)        │
│                                                                 │
│  2. FORWARD PASS                                                │
│     Embeddings + Positional Encoding                            │
│        → Multi-Head Attention (Q, K, V + Softmax)               │
│        → Feed-Forward layers (wx + b → Activation → wx + b)    │
│        → Repeat N times (e.g., 96 layers for GPT-4)            │
│        → Final Softmax → Probability distribution over vocab    │
│     (Linear Algebra + Algebra + Probability)                    │
│                                                                 │
│  3. COMPUTE LOSS                                                │
│     Compare prediction vs. actual next token                    │
│     Loss = Cross-Entropy(predicted_probs, actual_token)         │
│     (Information Theory + Statistics)                            │
│                                                                 │
│  4. BACKWARD PASS (Backpropagation)                             │
│     Calculate gradients for ALL weights using Chain Rule         │
│     ∂Loss/∂w for every weight in every layer                    │
│     (Calculus)                                                  │
│                                                                 │
│  5. UPDATE WEIGHTS                                              │
│     w_new = w_old - learning_rate × gradient                    │
│     (Using Adam or SGD optimizer)                               │
│     (Gradient Descent / Optimization)                           │
│                                                                 │
│  6. REPEAT steps 1-5 for millions of batches                    │
│     until loss is sufficiently low                              │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚠️ Common Pitfalls in Model Training
&lt;/h2&gt;

&lt;p&gt;Understanding these common issues will save you hours of debugging:&lt;/p&gt;

&lt;h3&gt;
  
  
  Overfitting vs. Underfitting
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overfitting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Model memorizes the training data instead of learning general patterns&lt;/td&gt;
&lt;td&gt;Training loss ↓, Validation loss ↑&lt;/td&gt;
&lt;td&gt;Dropout, Data Augmentation, Early Stopping, Regularization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Underfitting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Model is too simple to capture the patterns in the data&lt;/td&gt;
&lt;td&gt;Both training and validation loss remain high&lt;/td&gt;
&lt;td&gt;Increase model size, Train longer, Better features&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — Overfitting vs. Underfitting:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Imagine fitting a curve through data points:

Underfitting:                     Good Fit:                    Overfitting:
 (straight line through           (smooth curve through        (wiggly line through
  scattered points)                the general trend)           EVERY point exactly)

   •  •                              •  •                       •──•
    ───────── •                    ╱  ╲                        ╱    ╲ •
   •     •                       •     •                     •      ╲╱
                                                                    •
   "Too simple"                  "Just right"                "Memorized noise"
   High train error              Low train error              Zero train error
   High test error               Low test error               High test error
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Regularization Techniques
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L1 Regularization (Lasso):&lt;/strong&gt; Adds the sum of absolute weights to the loss. Encourages many weights to become exactly &lt;code&gt;0&lt;/code&gt; (sparse model). Useful for feature selection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L2 Regularization (Ridge):&lt;/strong&gt; Adds the sum of squared weights to the loss. Encourages all weights to be small but non-zero. Most common.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dropout:&lt;/strong&gt; During training, randomly "turn off" a percentage of neurons in each layer (e.g., 20%). This forces the network to not rely on any single neuron and builds redundancy. Turned off during inference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early Stopping:&lt;/strong&gt; Monitor validation loss during training. If it starts going up while training loss keeps going down → stop training. You've found the sweet spot before overfitting begins.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Example — Dropout:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal forward pass:          With Dropout (20%):

 [N1]──[N4]──[N7]             [N1]──[  ]──[N7]     ← N4 turned off
 [N2]──[N5]──[N8]             [  ]──[N5]──[N8]     ← N2 turned off
 [N3]──[N6]──[N9]             [N3]──[N6]──[  ]     ← N9 turned off

Each training step randomly disables different neurons.
This prevents the network from "memorizing" via specific neurons
and forces it to learn more robust, general patterns.
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;




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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What it powers in AI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Number Systems &amp;amp; Encoding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How text is converted into data a model can process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Probability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How models generate and sample their responses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vectors &amp;amp; Embeddings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How AI understands semantic meaning and similarity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Algebra &amp;amp; Activation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The core computations inside every neural network layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Statistics &amp;amp; Normalization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Analyzing data quality and ensuring stable training&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linear Algebra &amp;amp; Attention&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enabling massively parallel GPU computation and context understanding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Calculus &amp;amp; Optimization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How models learn from mistakes and improve over time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Information Theory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Measuring and evaluating model confidence and quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Training Loop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How all concepts connect into an end-to-end learning system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Regularization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Preventing models from memorizing data instead of learning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For Aspiring AI Engineers:&lt;/strong&gt; Mastering these fundamentals is more important than jumping directly into complex model architectures. Once you understand &lt;em&gt;why&lt;/em&gt; the math works, complex topics like Transformers and fine-tuning become significantly easier to learn.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 Advanced Roadmap (Next Steps)
&lt;/h2&gt;

&lt;p&gt;Once you are comfortable with the concepts above, consider exploring these more advanced mathematical topics used in AI research:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eigenvalues &amp;amp; Eigenvectors:&lt;/strong&gt; Used in dimensionality reduction and understanding how data transforms through a network. An eigenvector is a direction that remains unchanged when a matrix transformation is applied; the eigenvalue tells you by how much it was scaled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Principal Component Analysis (PCA):&lt;/strong&gt; A technique to reduce the number of features in a dataset while retaining the most important information. Uses eigenvalues to find the directions of maximum variance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Singular Value Decomposition (SVD):&lt;/strong&gt; A factorization technique that decomposes any matrix into three simpler matrices. Used in recommendation systems (like Netflix), data compression, and LoRA (Low-Rank Adaptation for efficient LLM fine-tuning).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matrix Factorization:&lt;/strong&gt; A method used in recommendation systems and for compressing large model weights into smaller, faster representations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fourier Transforms:&lt;/strong&gt; Used in signal processing and some attention variants to efficiently capture patterns at different frequency scales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bayesian Statistics:&lt;/strong&gt; A framework for updating beliefs based on new evidence. Used in uncertainty estimation and some reinforcement learning algorithms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markov Chains &amp;amp; Monte Carlo Methods:&lt;/strong&gt; Used in sampling algorithms, reinforcement learning, and some text generation strategies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convex Optimization:&lt;/strong&gt; The mathematical theory behind why gradient descent works for certain types of problems and what can go wrong in non-convex landscapes (like deep learning).&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>machinelearning</category>
      <category>python</category>
    </item>
    <item>
      <title>🐍 Python Essentials for GenAI</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Sun, 21 Jun 2026 17:01:32 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/python-essentials-for-genai-lji</link>
      <guid>https://dev.to/ajmal_hasan/python-essentials-for-genai-lji</guid>
      <description>&lt;h2&gt;
  
  
  Everything a JS/React Native Developer Needs to Know
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; You know JavaScript/TypeScript. This guide maps Python concepts to what you already know.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Get comfortable with Python patterns used heavily in LangChain, LangGraph, and GenAI tooling.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. JavaScript → Python Mental Model
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Syntax Cheat Sheet
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# JS/TS → Python Translation Table
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="c1"&gt;# Variables
&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;              &lt;span class="c1"&gt;# let name = "Ajmal"
&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;               &lt;span class="c1"&gt;# let age: number = 28
&lt;/span&gt;&lt;span class="n"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.14159&lt;/span&gt;                &lt;span class="c1"&gt;# const PI = 3.14159 (convention: UPPERCASE = constant)
&lt;/span&gt;
&lt;span class="c1"&gt;# Strings (f-strings = template literals)
&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;# `Hello, ${name}`
&lt;/span&gt;
&lt;span class="c1"&gt;# Multiline strings
&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
This is a
multiline string
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;                          &lt;span class="c1"&gt;# Same as backtick strings in JS
&lt;/span&gt;
&lt;span class="c1"&gt;# Boolean
&lt;/span&gt;&lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;             &lt;span class="c1"&gt;# true → True, false → False, null → None
&lt;/span&gt;
&lt;span class="c1"&gt;# None (like null/undefined)
&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;                 &lt;span class="c1"&gt;# let value = null
&lt;/span&gt;
&lt;span class="c1"&gt;# Print
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# console.log("Hello")
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Name: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# console.log(`Name: ${name}`)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Indentation = Curly Braces
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python uses INDENTATION instead of {}
# This is the #1 thing to get used to
&lt;/span&gt;
&lt;span class="c1"&gt;# JavaScript:
# if (age &amp;gt; 18) {
#     console.log("Adult");
# } else {
#     console.log("Minor");
# }
&lt;/span&gt;
&lt;span class="c1"&gt;# Python:
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adult&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Minor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Functions
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="c1"&gt;# function greet(name: string): string
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# For loops
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;              &lt;span class="c1"&gt;# for (let i = 0; i &amp;lt; 5; i++)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;my_list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;            &lt;span class="c1"&gt;# for (const item of myList)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# While loops
&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                &lt;span class="c1"&gt;# while (count &amp;gt; 0) {
&lt;/span&gt;    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                  &lt;span class="c1"&gt;#     count--;
&lt;/span&gt;                                &lt;span class="c1"&gt;# }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Truthiness Differences
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python falsy values:
# False, None, 0, 0.0, "", [], {}, set()
&lt;/span&gt;
&lt;span class="c1"&gt;# ⚠️ Key difference from JS:
# JS:  [] is truthy     → if ([]) { "runs!" }
# Py:  [] is falsy      → if []:   "NEVER runs"
&lt;/span&gt;
&lt;span class="c1"&gt;# JS:  {} is truthy     → if ({}) { "runs!" }
# Py:  {} is falsy      → if {}:   "NEVER runs"
&lt;/span&gt;
&lt;span class="c1"&gt;# Check for None specifically:
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;        &lt;span class="c1"&gt;# NOT: if value == None
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="c1"&gt;# NOT: if value != None
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Has value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Data Structures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lists (= JavaScript Arrays)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Creating lists
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apple&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;banana&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cherry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;    &lt;span class="c1"&gt;# const fruits = ["apple", "banana", "cherry"]
&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;                                 &lt;span class="c1"&gt;# const empty = []
&lt;/span&gt;
&lt;span class="c1"&gt;# Accessing
&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="c1"&gt;# fruits[0]
&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="c1"&gt;# fruits[fruits.length - 1]  ← Python has negative indexing!
&lt;/span&gt;
&lt;span class="c1"&gt;# Slicing (Python superpower — no equivalent in JS)
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;                &lt;span class="c1"&gt;# ["banana", "cherry"]  — from index 1 up to (not including) 3
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;                 &lt;span class="c1"&gt;# ["apple", "banana"]   — first 2
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;                 &lt;span class="c1"&gt;# ["banana", "cherry"]  — from index 1 to end
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;                &lt;span class="c1"&gt;# ["banana", "cherry"]  — last 2
&lt;/span&gt;
&lt;span class="c1"&gt;# Adding
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# fruits.push("date")
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avocado&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# fruits.unshift("avocado")
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fig&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grape&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;    &lt;span class="c1"&gt;# fruits.push(...["fig", "grape"])
&lt;/span&gt;
&lt;span class="c1"&gt;# Removing
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;banana&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# const i = fruits.indexOf("banana"); fruits.splice(i,1)
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                       &lt;span class="c1"&gt;# fruits.pop()
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                      &lt;span class="c1"&gt;# fruits.shift()
&lt;/span&gt;
&lt;span class="c1"&gt;# Checking
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apple&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;                  &lt;span class="c1"&gt;# fruits.includes("apple")
&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                        &lt;span class="c1"&gt;# fruits.length
&lt;/span&gt;
&lt;span class="c1"&gt;# Iterating
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;               &lt;span class="c1"&gt;# for (const fruit of fruits)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# fruits.forEach((fruit, i) =&amp;gt; ...)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fruit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Comprehensions (Python Superpower)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# JS: const doubled = numbers.map(n =&amp;gt; n * 2)
&lt;/span&gt;&lt;span class="n"&gt;doubled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# JS: const evens = numbers.filter(n =&amp;gt; n % 2 === 0)
&lt;/span&gt;&lt;span class="n"&gt;evens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# JS: const results = numbers.filter(n =&amp;gt; n &amp;gt; 5).map(n =&amp;gt; n * 2)
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Nested comprehension
# JS: matrix.flat().map(x =&amp;gt; x * 2)
&lt;/span&gt;&lt;span class="n"&gt;flat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Dict comprehension
# JS: Object.fromEntries(items.map(item =&amp;gt; [item.id, item]))
&lt;/span&gt;&lt;span class="n"&gt;lookup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dictionaries (= JavaScript Objects)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Creating dicts
&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skills&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;React Native&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# ⚠️ Keys MUST be strings (or other hashable types) — no unquoted keys like JS
&lt;/span&gt;
&lt;span class="c1"&gt;# Accessing
&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;                    &lt;span class="c1"&gt;# person.name or person["name"]
&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                &lt;span class="c1"&gt;# Same, but returns None instead of KeyError
&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;N/A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# Default value if key missing
&lt;/span&gt;
&lt;span class="c1"&gt;# Setting
&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a@b.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;      &lt;span class="c1"&gt;# person.email = "a@b.com"
&lt;/span&gt;
&lt;span class="c1"&gt;# Checking
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;                  &lt;span class="c1"&gt;# "name" in person (same!)
&lt;/span&gt;
&lt;span class="c1"&gt;# Iterating
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                     &lt;span class="c1"&gt;# for (const key in person)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;      &lt;span class="c1"&gt;# Object.entries(person).forEach(([k,v]) =&amp;gt; ...)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Merging (Python 3.9+)
&lt;/span&gt;&lt;span class="n"&gt;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;dict1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;dict2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;            &lt;span class="c1"&gt;# const merged = {...obj1, ...obj2}
&lt;/span&gt;&lt;span class="n"&gt;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dict1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;dict2&lt;/span&gt;                 &lt;span class="c1"&gt;# Python 3.9+ pipe merge operator
&lt;/span&gt;
&lt;span class="c1"&gt;# Destructuring
&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;                  &lt;span class="c1"&gt;# const { name } = person
# Python doesn't have object destructuring like JS
# But you can unpack dicts to function kwargs:
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                        &lt;span class="c1"&gt;# Unpacks dict as keyword arguments
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tuples (Immutable Lists — No JS Equivalent)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Tuples are like frozen arrays — can't modify after creation
&lt;/span&gt;&lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rgb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;           &lt;span class="c1"&gt;# Destructuring! → x=10, y=20
&lt;/span&gt;
&lt;span class="c1"&gt;# Used for: returning multiple values, dict keys, immutable sequences
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;  &lt;span class="c1"&gt;# Returns a tuple
&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Destructure the return value
&lt;/span&gt;
&lt;span class="c1"&gt;# ⚠️ Single-element tuple needs trailing comma:
&lt;/span&gt;&lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;          &lt;span class="c1"&gt;# This is a tuple
&lt;/span&gt;&lt;span class="n"&gt;not_tuple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# This is just the number 42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sets (= JavaScript Sets)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;unique&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;                     &lt;span class="c1"&gt;# const unique = new Set([1, 2, 3])
&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                           &lt;span class="c1"&gt;# unique.add(4)
&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;discard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                       &lt;span class="c1"&gt;# unique.delete(2)
&lt;/span&gt;
&lt;span class="c1"&gt;# Set operations (Python is way better than JS here)
&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;           &lt;span class="c1"&gt;# Union: {1, 2, 3, 4}
&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;           &lt;span class="c1"&gt;# Intersection: {2, 3}
&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;           &lt;span class="c1"&gt;# Difference: {1}
&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;           &lt;span class="c1"&gt;# Symmetric diff: {1, 4}
&lt;/span&gt;
&lt;span class="c1"&gt;# Great for deduplication
&lt;/span&gt;&lt;span class="n"&gt;unique_items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items_with_dupes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Functions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Function Definitions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Basic function
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Add two numbers.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;          &lt;span class="c1"&gt;# Docstring (like JSDoc but built-in)
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="c1"&gt;# Default parameters
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# *args — like ...rest in JS
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sum_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;              &lt;span class="c1"&gt;# function sumAll(...numbers)
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;sum_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 10
&lt;/span&gt;
&lt;span class="c1"&gt;# **kwargs — named rest parameters (no JS equivalent)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# {"name": "Ajmal", "age": 28}
&lt;/span&gt;
&lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Combining *args and **kwargs
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;flexible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Required: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extra positional: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extra keyword: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;flexible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Required: hello
# Extra positional: (1, 2, 3)
# Extra keyword: {"debug": True, "verbose": False}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lambda Functions (= Arrow Functions)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# JS: const double = (x) =&amp;gt; x * 2
&lt;/span&gt;&lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;# JS: items.sort((a, b) =&amp;gt; a.name.localeCompare(b.name))
&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# JS: items.filter(item =&amp;gt; item.active)
&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# ⚠️ Lambdas are single-expression only. For multi-line, use def.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Higher-Order Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# map, filter, reduce exist but list comprehensions are more Pythonic
&lt;/span&gt;
&lt;span class="c1"&gt;# map
# JS:  numbers.map(n =&amp;gt; n * 2)
# Py:  list(map(lambda n: n * 2, numbers))        ← works but ugly
# Py:  [n * 2 for n in numbers]                    ← Pythonic ✓
&lt;/span&gt;
&lt;span class="c1"&gt;# filter
# JS:  numbers.filter(n =&amp;gt; n &amp;gt; 5)
# Py:  list(filter(lambda n: n &amp;gt; 5, numbers))      ← works but ugly
# Py:  [n for n in numbers if n &amp;gt; 5]               ← Pythonic ✓
&lt;/span&gt;
&lt;span class="c1"&gt;# reduce
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;functools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;reduce&lt;/span&gt;
&lt;span class="c1"&gt;# JS:  numbers.reduce((acc, n) =&amp;gt; acc + n, 0)
&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Or just: total = sum(numbers)                    ← Pythonic ✓
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Object-Oriented Python
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Classes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# JS Class → Python Class
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="c1"&gt;# JavaScript:
# class User {
#     constructor(name, email) {
#         this.name = name;
#         this.email = email;
#     }
#     greet() {
#         return `Hello, ${this.name}`;
#     }
# }
&lt;/span&gt;
&lt;span class="c1"&gt;# Python:
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;A user in our system.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;   &lt;span class="c1"&gt;# constructor
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;                          &lt;span class="c1"&gt;# this.name = name
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;                        &lt;span class="c1"&gt;# this.email = email
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                       &lt;span class="c1"&gt;# methods always take 'self'
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                     &lt;span class="c1"&gt;# toString() equivalent
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__repr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                    &lt;span class="c1"&gt;# Developer-friendly string
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User(name=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, email=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a@b.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;# Calls __str__
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inheritance
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nb"&gt;NotImplementedError&lt;/span&gt;       &lt;span class="c1"&gt;# Abstract method
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;                      &lt;span class="c1"&gt;# class Dog extends Animal
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; says Woof!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; says Meow!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rex&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# "Rex says Woof!"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dataclasses (Like TypeScript Interfaces + Auto-Constructor)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;

&lt;span class="c1"&gt;# Instead of writing boilerplate __init__, __repr__, __eq__:
&lt;/span&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="c1"&gt;# Default value
&lt;/span&gt;    &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

&lt;span class="c1"&gt;# Auto-generates __init__, __repr__, __eq__
&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Document(content='Hello', source='test.pdf', page=1, score=0.0)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pydantic (⭐ Critical for LangChain)
&lt;/h3&gt;

&lt;p&gt;Pydantic is used &lt;strong&gt;everywhere&lt;/strong&gt; in LangChain for data validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;User profile with validation.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ge&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;le&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="c1"&gt;# Valid — works fine
&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a@b.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Invalid — raises ValidationError automatically!
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;bad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a@b.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# age must be &amp;gt;= 0
&lt;/span&gt;
&lt;span class="c1"&gt;# Parse from dict (like JSON deserialization)
&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a@b.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Parse from JSON string
&lt;/span&gt;&lt;span class="n"&gt;json_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a@b.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: 28}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_validate_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Convert to dict/JSON
&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_dump&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;            &lt;span class="c1"&gt;# {"name": "Ajmal", "email": "a@b.com", ...}
&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_dump_json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;       &lt;span class="c1"&gt;# '{"name": "Ajmal", ...}'
&lt;/span&gt;
&lt;span class="c1"&gt;# Get JSON schema (used by LLM structured output!)
&lt;/span&gt;&lt;span class="n"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_json_schema&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Pydantic matters in GenAI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LangChain tools use Pydantic for input schemas&lt;/li&gt;
&lt;li&gt;Structured output from LLMs is validated with Pydantic&lt;/li&gt;
&lt;li&gt;State definitions in LangGraph often use Pydantic&lt;/li&gt;
&lt;li&gt;Configuration objects use Pydantic&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Type Hints (= TypeScript Types)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;# string | undefined
&lt;/span&gt;    &lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# string | number
&lt;/span&gt;    &lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;# "a" | "b" | "c"
&lt;/span&gt;    &lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# { name: string; age: number }
&lt;/span&gt;    &lt;span class="n"&gt;Annotated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# Used in LangGraph for state reducers
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Basic types
&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;
&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;95.5&lt;/span&gt;
&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;lookup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Optional (value or None)
&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;          &lt;span class="c1"&gt;# string | undefined
&lt;/span&gt;
&lt;span class="c1"&gt;# Union (multiple types)
&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;          &lt;span class="c1"&gt;# string | number
# Python 3.10+: id: str | int = "abc"
&lt;/span&gt;
&lt;span class="c1"&gt;# Literal (specific values only)
&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;active&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inactive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;active&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# TypedDict (typed dictionaries — used in LangGraph state!)
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AgentState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;
    &lt;span class="n"&gt;query_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Annotated (adds metadata to types — used in LangGraph!)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph.message&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;add_messages&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Annotated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;add_messages&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# The add_messages is a "reducer"
&lt;/span&gt;
&lt;span class="c1"&gt;# Function type hints
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;# Callable type (function as parameter)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Decorators (Used Everywhere in GenAI)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# Decorators = Higher-order functions that wrap other functions
# Like HOCs in React, but for functions
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="c1"&gt;# Basic decorator
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_calls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Log every time a function is called.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calling &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Done: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="nd"&gt;@log_calls&lt;/span&gt;                    &lt;span class="c1"&gt;# Same as: greet = log_calls(greet)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ajmal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Output:
# Calling greet...
# Done: Hello, Ajmal
&lt;/span&gt;
&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# REAL-WORLD: LangChain @tool decorator
# ─────────────────────────────────────────────────
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;

&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Evaluate a math expression. Use for calculations.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# The @tool decorator:
# 1. Reads the function name → tool.name = "calculator"
# 2. Reads the docstring → tool.description = "Evaluate a math..."
# 3. Reads the type hints → tool.args = {"expression": {"type": "string"}}
# 4. Wraps the function so LangChain agents can call it
&lt;/span&gt;
&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# Other decorators you'll see:
# ─────────────────────────────────────────────────
&lt;/span&gt;&lt;span class="nd"&gt;@property&lt;/span&gt;           &lt;span class="c1"&gt;# Getter (like a computed property in Vue)
&lt;/span&gt;&lt;span class="nd"&gt;@staticmethod&lt;/span&gt;       &lt;span class="c1"&gt;# No 'self' parameter (like static in JS)
&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;        &lt;span class="c1"&gt;# Takes 'cls' instead of 'self'
&lt;/span&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;          &lt;span class="c1"&gt;# Auto-generate __init__, __repr__, etc.
&lt;/span&gt;&lt;span class="nd"&gt;@pytest.fixture&lt;/span&gt;     &lt;span class="c1"&gt;# Test fixtures
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# FastAPI route handlers
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Generators &amp;amp; Iterators (For Streaming LLM Responses)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Generators produce values lazily (one at a time)
# Critical for: streaming LLM tokens, processing large files
&lt;/span&gt;
&lt;span class="c1"&gt;# Generator function (uses yield instead of return)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;count_up&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Generate numbers 0 to n-1.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;      &lt;span class="c1"&gt;# Pauses here, returns i, resumes on next()
&lt;/span&gt;        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# Using a generator
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;count_up&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 0, 1, 2, 3, 4
&lt;/span&gt;
&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# REAL-WORLD: Streaming LLM responses
# ─────────────────────────────────────────────────
# LangChain uses generators for streaming:
&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tell me a story&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Behind the scenes, this is a generator yielding tokens one by one
&lt;/span&gt;
&lt;span class="c1"&gt;# Generator expression (like list comprehension, but lazy)
&lt;/span&gt;&lt;span class="n"&gt;squares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# No memory allocated for all values
&lt;/span&gt;&lt;span class="n"&gt;first_10&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;squares&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Context Managers (with statement)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Context managers handle setup/cleanup automatically
# Like try-finally, but cleaner
&lt;/span&gt;
&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# File I/O (most common use)
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="c1"&gt;# ❌ Without context manager:
&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                  &lt;span class="c1"&gt;# Easy to forget!
&lt;/span&gt;
&lt;span class="c1"&gt;# ✅ With context manager:
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# File is automatically closed, even if an exception occurs
&lt;/span&gt;
&lt;span class="c1"&gt;# Writing files
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, World!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Reading JSON
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;config.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Writing JSON
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# You'll see context managers with:
# - Database connections
# - HTTP sessions
# - Temporary files
# - Lock management
# ─────────────────────────────────────────────────
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Error Handling
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# try/except (= try/catch in JS)
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                    &lt;span class="c1"&gt;# catch specific error
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Can&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t divide by zero!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;         &lt;span class="c1"&gt;# catch multiple
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                       &lt;span class="c1"&gt;# catch-all (like catch(e) in JS)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unexpected error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                        &lt;span class="c1"&gt;# Runs if NO exception (no JS equivalent)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Result: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                     &lt;span class="c1"&gt;# Always runs (same as JS)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# Raising exceptions (= throw in JS)
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Age cannot be negative: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;

&lt;span class="c1"&gt;# Custom exceptions
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DocumentNotFoundError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Raised when a document cannot be found in the knowledge base.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# Real-world: LLM API error handling
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APIError&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;safe_llm_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rate limited, waiting &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;APIError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;API error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, retrying...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Max retries exceeded&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Async/Await (Same Concept as JS!)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;

&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# Python async is very similar to JS async/await
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="c1"&gt;# JS:
# async function fetchData(url) {
#     const response = await fetch(url);
#     return await response.json();
# }
&lt;/span&gt;
&lt;span class="c1"&gt;# Python:
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Running async code
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# Concurrent execution (like Promise.all)
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_batch&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# JS: await Promise.all([task1(), task2(), task3()])
&lt;/span&gt;    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;

&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# LangChain async (used for parallel LLM calls)
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="c1"&gt;# Most LangChain classes have async versions:
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ainvoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# Async invoke
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abatch&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;input1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# Batch process
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;astream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;       &lt;span class="c1"&gt;# Async streaming
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  11. Modules &amp;amp; Imports
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# Python imports vs JS imports
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="c1"&gt;# JS: import { useState, useEffect } from 'react'
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OpenAIEmbeddings&lt;/span&gt;

&lt;span class="c1"&gt;# JS: import React from 'react'
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt;

&lt;span class="c1"&gt;# JS: import * as utils from './utils'
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt;  &lt;span class="c1"&gt;# Access: agents.create_react_agent(...)
&lt;/span&gt;
&lt;span class="c1"&gt;# JS: import { default as MyComponent } from './Component'
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;LLM&lt;/span&gt;   &lt;span class="c1"&gt;# Alias
&lt;/span&gt;
&lt;span class="c1"&gt;# Relative imports (within your project)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;orchestrator&lt;/span&gt;        &lt;span class="c1"&gt;# from ./agents import ...
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;..config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;           &lt;span class="c1"&gt;# from ../config import ...
&lt;/span&gt;
&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# __init__.py = index.js
# ─────────────────────────────────────────────────
# A folder with __init__.py is a Python "package" (like having index.js)
# src/
# ├── __init__.py          ← Makes 'src' importable
# ├── agents/
# │   ├── __init__.py      ← Makes 'agents' importable
# │   ├── rag_agent.py
# │   └── search_agent.py
# └── config.py
&lt;/span&gt;
&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# if __name__ == "__main__": (entry point guard)
# ─────────────────────────────────────────────────
# This runs ONLY when the file is executed directly (not imported)
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Running as main script&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Like: if (require.main === module) { main() }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  12. Environment &amp;amp; Package Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Virtual Environments (Like node_modules, but Cleaner)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create virtual environment&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv

&lt;span class="c"&gt;# Activate (macOS/Linux)&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate

&lt;span class="c"&gt;# Activate (Windows)&lt;/span&gt;
.venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate

&lt;span class="c"&gt;# Deactivate&lt;/span&gt;
deactivate

&lt;span class="c"&gt;# ⚠️ ALWAYS activate venv before pip install&lt;/span&gt;
&lt;span class="c"&gt;# Otherwise packages install globally (bad!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  pip (Like npm)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# npm install langchain    →    pip install langchain&lt;/span&gt;
&lt;span class="c"&gt;# npm install              →    pip install -r requirements.txt&lt;/span&gt;
&lt;span class="c"&gt;# npm install --save       →    pip install langchain &amp;amp;&amp;amp; pip freeze &amp;gt; requirements.txt&lt;/span&gt;
&lt;span class="c"&gt;# package.json             →    requirements.txt (or pyproject.toml)&lt;/span&gt;
&lt;span class="c"&gt;# node_modules/            →    .venv/lib/&lt;/span&gt;

&lt;span class="c"&gt;# Install specific version&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;langchain&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.2.0

&lt;span class="c"&gt;# Install from requirements.txt&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# See installed packages&lt;/span&gt;
pip list

&lt;span class="c"&gt;# Generate requirements.txt from current environment&lt;/span&gt;
pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  .env Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Install: pip install python-dotenv
&lt;/span&gt;
&lt;span class="c1"&gt;# .env file:
# OPENAI_API_KEY=sk-your-key-here
# QDRANT_URL=http://localhost:6333
&lt;/span&gt;
&lt;span class="c1"&gt;# Load in Python:
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Reads .env file into environment variables
&lt;/span&gt;
&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qdrant_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;QDRANT_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:6333&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# With default
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. Common Patterns in GenAI Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pattern 1: Method Chaining with LCEL (Pipe Operator)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# LangChain Expression Language uses | (pipe) like Unix pipes
# Similar to RxJS pipe() or lodash chain()
&lt;/span&gt;
&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;output_parser&lt;/span&gt;

&lt;span class="c1"&gt;# This means: prompt.invoke() → pass result to llm.invoke() → pass to parser
# Like: prompt.pipe(llm).pipe(output_parser)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 2: TypedDict for State (LangGraph)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Annotated&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AgentState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Annotated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;add_messages&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Reducer: append new messages
&lt;/span&gt;    &lt;span class="n"&gt;query_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;                           &lt;span class="c1"&gt;# Replace on update
&lt;/span&gt;
&lt;span class="c1"&gt;# This is like defining a Redux state shape with reducers
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 3: Factory Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Functions that create and return configured objects
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_rag_chain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;retriever&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vector_store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;as_retriever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;search_kwargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;k&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;retriever&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;format_docs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;question&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RunnablePassthrough&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
        &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;
        &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;
        &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;StrOutputParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_rag_chain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 4: Callback / Event Handlers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# LangChain uses callbacks for logging, streaming, etc.
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.callbacks&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseCallbackHandler&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseCallbackHandler&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_llm_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;serialized&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LLM starting with &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; prompts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_llm_end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LLM finished&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_tool_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;serialized&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tool called: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;serialized&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Attach to LLM
&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callbacks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;MyHandler&lt;/span&gt;&lt;span class="p"&gt;()])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. Essential Standard Library
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# Modules you'll use constantly in GenAI work
# ─────────────────────────────────────────────────
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;                 &lt;span class="c1"&gt;# Environment vars, file paths
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;               &lt;span class="c1"&gt;# Parse/generate JSON
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;               &lt;span class="c1"&gt;# Sleep, timing
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;            &lt;span class="c1"&gt;# Production logging
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;            &lt;span class="c1"&gt;# Hashing (for caching)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;  &lt;span class="c1"&gt;# Modern file path handling
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;      &lt;span class="c1"&gt;# Type hints
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;  &lt;span class="c1"&gt;# Timestamps
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;  &lt;span class="c1"&gt;# Useful data structures
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;functools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lru_cache&lt;/span&gt;       &lt;span class="c1"&gt;# Functional utils + caching
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;      &lt;span class="c1"&gt;# Data classes
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;                 &lt;span class="c1"&gt;# Regex
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;               &lt;span class="c1"&gt;# Unique IDs (for thread_ids, collection names)
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;            &lt;span class="c1"&gt;# Async programming
&lt;/span&gt;
&lt;span class="c1"&gt;# ─────────────────────────────────────────────────
# pathlib.Path (modern file handling)
# ─────────────────────────────────────────────────
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="c1"&gt;# Old way: os.path.join("data", "docs", "file.pdf")
# New way:
&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;         &lt;span class="c1"&gt;# Does it exist?
&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_file&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;        &lt;span class="c1"&gt;# Is it a file?
&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_dir&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;         &lt;span class="c1"&gt;# Is it a directory?
&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;           &lt;span class="c1"&gt;# ".pdf"
&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stem&lt;/span&gt;             &lt;span class="c1"&gt;# "file"
&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;           &lt;span class="c1"&gt;# Path("data/docs")
&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;      &lt;span class="c1"&gt;# Read file contents as string
&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Write string to file
&lt;/span&gt;
&lt;span class="c1"&gt;# List all PDFs in a directory
&lt;/span&gt;&lt;span class="n"&gt;pdfs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**/*.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  15. Quick Reference Card
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;JS/TS&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;const&lt;/code&gt; / &lt;code&gt;let&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;just assign&lt;/td&gt;
&lt;td&gt;No const keyword; UPPER_CASE = convention for constants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;===&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;==&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Python &lt;code&gt;==&lt;/code&gt; compares values (like JS &lt;code&gt;===&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;null&lt;/code&gt; / &lt;code&gt;undefined&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Only one "nothing" value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;True&lt;/code&gt; / &lt;code&gt;False&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Capitalized!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;print()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;typeof x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;type(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x instanceof Y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;isinstance(x, Y)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Array.isArray()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;isinstance(x, list)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JSON.parse()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;json.loads()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JSON.stringify()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;json.dumps()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;async/await&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;async/await&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same concepts! Need &lt;code&gt;asyncio.run()&lt;/code&gt; to start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;try/catch/finally&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;try/except/finally&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;catch&lt;/code&gt; → &lt;code&gt;except&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;throw new Error()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;raise Exception()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;throw&lt;/code&gt; → &lt;code&gt;raise&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;import { x } from 'y'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from y import x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reversed order&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;export&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No keyword needed&lt;/td&gt;
&lt;td&gt;Everything is importable by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;this&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;self&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Must explicitly pass &lt;code&gt;self&lt;/code&gt; to methods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;...spread&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;*args&lt;/code&gt; / &lt;code&gt;**kwargs&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;*&lt;/code&gt; for positional, &lt;code&gt;**&lt;/code&gt; for keyword&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Template literals&lt;/td&gt;
&lt;td&gt;f-strings&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;`${x}`&lt;/code&gt; → &lt;code&gt;f"{x}"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.map()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;list comprehension&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[f(x) for x in items]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.filter()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;list comprehension&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[x for x in items if cond]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.forEach()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;for x in items:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Promise.all()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;asyncio.gather()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;node_modules/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.venv/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;requirements.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>genai</category>
      <category>javascript</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Use React Native Best Practices Agent Skills</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Thu, 22 Jan 2026 05:07:14 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/how-to-use-react-native-best-practices-agent-skills-121k</link>
      <guid>https://dev.to/ajmal_hasan/how-to-use-react-native-best-practices-agent-skills-121k</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;React Native performance optimization can be complex, with many pitfalls that affect FPS, bundle size, memory usage, and startup time. The &lt;strong&gt;react-native-best-practices&lt;/strong&gt; skill package provides AI coding agents with comprehensive guidelines to automatically detect, suggest, and implement performance optimizations in React Native and Expo applications.&lt;/p&gt;

&lt;p&gt;These best practices are packaged as &lt;strong&gt;Agent skills&lt;/strong&gt; that integrate seamlessly into &lt;strong&gt;Cursor&lt;/strong&gt; and other AI-powered coding agents.&lt;/p&gt;

&lt;p&gt;When your agent reviews, optimizes, or develops a React Native codebase, it can automatically reference these patterns and suggest fixes based on proven optimization techniques from Callstack's "Ultimate Guide to React Native Optimization."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For detailed information, refer to the official announcement:&lt;/strong&gt; &lt;a href="https://www.callstack.com/blog/announcing-react-native-best-practices-for-ai-agents" rel="noopener noreferrer"&gt;Announcing: React Native Best Practices for AI Agents&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Are Agent Skills?
&lt;/h2&gt;

&lt;p&gt;Agent skills are knowledge packages that enhance AI coding assistants with domain-specific expertise. Instead of manually searching documentation or remembering optimization patterns, your AI assistant can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatically detect&lt;/strong&gt; performance issues in your code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suggest specific fixes&lt;/strong&gt; based on proven patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference detailed guides&lt;/strong&gt; when working on optimization tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply best practices&lt;/strong&gt; without you having to prompt for each one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The react-native-best-practices skill contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 main SKILL.md file&lt;/strong&gt; with quick references and problem mappings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;28 detailed reference files&lt;/strong&gt; covering JavaScript, Native, and Bundling optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority-ordered guidelines&lt;/strong&gt; (CRITICAL → HIGH → MEDIUM impact)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code examples&lt;/strong&gt; showing incorrect vs. correct patterns&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Cursor
&lt;/h3&gt;

&lt;p&gt;Install the skill package using npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx add-skill callstackincubator/agent-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the skill package&lt;/li&gt;
&lt;li&gt;Install it into your agent's skill directory (typically &lt;code&gt;.agents/skills/&lt;/code&gt; or &lt;code&gt;.windsurf/skills/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Make it available for automatic reference during coding sessions&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Automatic Activation
&lt;/h3&gt;

&lt;p&gt;The skill is &lt;strong&gt;automatically activated&lt;/strong&gt; when your AI assistant detects tasks related to:&lt;/p&gt;

&lt;h4&gt;
  
  
  Performance Issues
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"App feels slow/janky"&lt;/li&gt;
&lt;li&gt;"Animation drops frames"&lt;/li&gt;
&lt;li&gt;"List scroll is laggy"&lt;/li&gt;
&lt;li&gt;"Too many re-renders"&lt;/li&gt;
&lt;li&gt;"FPS is low"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Bundle &amp;amp; App Size
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Bundle size is too large"&lt;/li&gt;
&lt;li&gt;"App size optimization"&lt;/li&gt;
&lt;li&gt;"Reduce bundle size"&lt;/li&gt;
&lt;li&gt;"Tree shaking issues"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Memory Problems
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Memory leaks"&lt;/li&gt;
&lt;li&gt;"Memory growing over time"&lt;/li&gt;
&lt;li&gt;"App crashes due to memory"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Startup Time
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Slow app startup"&lt;/li&gt;
&lt;li&gt;"TTI (Time to Interactive) optimization"&lt;/li&gt;
&lt;li&gt;"Cold start performance"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Native Modules
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Native module performance"&lt;/li&gt;
&lt;li&gt;"Turbo Modules"&lt;/li&gt;
&lt;li&gt;"Bridge overhead"&lt;/li&gt;
&lt;li&gt;"Android 16KB alignment"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Specific Technologies
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;FlashList optimization&lt;/li&gt;
&lt;li&gt;Hermes optimization&lt;/li&gt;
&lt;li&gt;React Native profiling&lt;/li&gt;
&lt;li&gt;Reanimated worklets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example: Automatic Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;You ask:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"My FlatList is scrolling slowly, how can I optimize it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The agent automatically:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recognizes this as a performance issue&lt;/li&gt;
&lt;li&gt;References &lt;code&gt;js-lists-flatlist-flashlist.md&lt;/code&gt; from the skill&lt;/li&gt;
&lt;li&gt;Suggests replacing FlatList with FlashList&lt;/li&gt;
&lt;li&gt;Provides code examples and migration steps&lt;/li&gt;
&lt;li&gt;Explains the performance benefits&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You ask:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"My bundle size is 15MB, how can I reduce it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The agent automatically:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Detects bundle size optimization need&lt;/li&gt;
&lt;li&gt;References multiple bundle-related skills:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bundle-analyze-js.md&lt;/code&gt; (to analyze current bundle)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-barrel-exports.md&lt;/code&gt; (to fix barrel imports)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-tree-shaking.md&lt;/code&gt; (to enable tree shaking)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Provides step-by-step optimization plan&lt;/li&gt;
&lt;li&gt;Shows before/after code examples&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What's Included
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Priority-Ordered Guidelines
&lt;/h3&gt;

&lt;p&gt;The skill organizes optimizations by impact:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Examples&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;FPS &amp;amp; Re-renders&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CRITICAL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FlashList, React Compiler, atomic state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Bundle Size&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CRITICAL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Barrel exports, tree shaking, R8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;TTI Optimization&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hermes mmap, native navigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Native Performance&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Turbo Modules, threading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Memory Management&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MEDIUM-HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory leak detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Animations&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MEDIUM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reanimated worklets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Reference Files
&lt;/h3&gt;

&lt;h4&gt;
  
  
  JavaScript/React (&lt;code&gt;js-*&lt;/code&gt;)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;js-lists-flatlist-flashlist.md&lt;/code&gt; - Replace ScrollView with virtualized lists&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-profile-react.md&lt;/code&gt; - React DevTools profiling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-measure-fps.md&lt;/code&gt; - FPS monitoring&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-memory-leaks.md&lt;/code&gt; - JS memory leak detection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-atomic-state.md&lt;/code&gt; - Jotai/Zustand patterns&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-concurrent-react.md&lt;/code&gt; - useDeferredValue, useTransition&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-react-compiler.md&lt;/code&gt; - Automatic memoization&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-animations-reanimated.md&lt;/code&gt; - Reanimated worklets&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js-uncontrolled-components.md&lt;/code&gt; - TextInput optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Native (&lt;code&gt;native-*&lt;/code&gt;)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;native-turbo-modules.md&lt;/code&gt; - Building fast native modules&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-sdks-over-polyfills.md&lt;/code&gt; - Native vs JS libraries&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-measure-tti.md&lt;/code&gt; - TTI measurement&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-threading-model.md&lt;/code&gt; - Turbo Module threads&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-profiling.md&lt;/code&gt; - Xcode/Android Studio profiling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-memory-leaks.md&lt;/code&gt; - Native memory leak detection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;native-android-16kb-alignment.md&lt;/code&gt; - Google Play alignment&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Bundling (&lt;code&gt;bundle-*&lt;/code&gt;)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bundle-barrel-exports.md&lt;/code&gt; - Avoid barrel imports&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-analyze-js.md&lt;/code&gt; - JS bundle visualization&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-tree-shaking.md&lt;/code&gt; - Dead code elimination&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-r8-android.md&lt;/code&gt; - Android code shrinking&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle-hermes-mmap.md&lt;/code&gt; - Disable bundle compression&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real-World Usage Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Fixing Slow List Scrolling
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before (without skill):&lt;/strong&gt;&lt;br&gt;
You might manually search for "React Native list optimization" and try various solutions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With skill:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Agent automatically suggests:&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ Current code&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ScrollView&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Item&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ScrollView&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// ✅ Optimized code&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FlashList&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@shopify/flash-list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FlashList&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;renderItem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{({&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Item&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;  &lt;span class="nx"&gt;estimatedItemSize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why FlashList is better than FlatList/ScrollView&lt;/li&gt;
&lt;li&gt;How to estimate item sizes&lt;/li&gt;
&lt;li&gt;Performance improvements (often 2-3x faster)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example 2: Reducing Bundle Size
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;With skill, the agent automatically:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyzes your imports&lt;/li&gt;
&lt;li&gt;Detects barrel exports&lt;/li&gt;
&lt;li&gt;Suggests direct imports
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Barrel import (bundles everything)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Modal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Direct imports (only bundles what you use)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components/Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Card&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components/Card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 3: Memory Leak Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;You mention:&lt;/strong&gt; "My app's memory keeps growing"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent automatically:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;References &lt;code&gt;js-memory-leaks.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Suggests profiling steps&lt;/li&gt;
&lt;li&gt;Identifies common leak patterns:

&lt;ul&gt;
&lt;li&gt;Event listeners not cleaned up&lt;/li&gt;
&lt;li&gt;Timers/intervals not cleared&lt;/li&gt;
&lt;li&gt;Subscriptions not unsubscribed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Provides fix examples&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Problem → Skill Mapping
&lt;/h2&gt;

&lt;p&gt;The skill includes a built-in mapping so agents know which reference to use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Agent References&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;App feels slow/janky&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;js-measure-fps.md&lt;/code&gt; → &lt;code&gt;js-profile-react.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Too many re-renders&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;js-profile-react.md&lt;/code&gt; → &lt;code&gt;js-react-compiler.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow startup (TTI)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;native-measure-tti.md&lt;/code&gt; → &lt;code&gt;bundle-analyze-js.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large app size&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;bundle-analyze-app.md&lt;/code&gt; → &lt;code&gt;bundle-r8-android.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory growing&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;js-memory-leaks.md&lt;/code&gt; or &lt;code&gt;native-memory-leaks.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Animation drops frames&lt;/td&gt;
&lt;td&gt;&lt;code&gt;js-animations-reanimated.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List scroll jank&lt;/td&gt;
&lt;td&gt;&lt;code&gt;js-lists-flatlist-flashlist.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TextInput lag&lt;/td&gt;
&lt;td&gt;&lt;code&gt;js-uncontrolled-components.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native module slow&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;native-turbo-modules.md&lt;/code&gt; → &lt;code&gt;native-threading-model.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Automatic Pattern Recognition&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;No need to remember all optimization patterns. The agent recognizes issues and suggests fixes automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Proven Solutions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Based on Callstack's comprehensive optimization guide, tested in real-world applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Context-Aware Suggestions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The agent understands your specific problem and provides relevant solutions, not generic advice.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Code Examples&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each skill includes before/after code examples, making implementation straightforward.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Priority Guidance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;CRITICAL issues are addressed first, ensuring maximum impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Comprehensive Coverage&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;28 reference files cover JavaScript, Native, and Bundling optimizations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Practices for Using the Skill
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Be Specific About Problems&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of "my app is slow," say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"My FlatList scrolls at 30 FPS"&lt;/li&gt;
&lt;li&gt;"App startup takes 5 seconds"&lt;/li&gt;
&lt;li&gt;"Bundle size is 20MB"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Let the Agent Analyze First&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ask the agent to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Analyze my codebase for performance issues"&lt;/li&gt;
&lt;li&gt;"Check for barrel imports"&lt;/li&gt;
&lt;li&gt;"Review my list components"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Follow the Suggestions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The agent provides prioritized fixes. Start with CRITICAL items first.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Measure Before and After&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use the profiling tools mentioned in the skills to verify improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FPS monitoring&lt;/li&gt;
&lt;li&gt;Bundle analysis&lt;/li&gt;
&lt;li&gt;Memory profiling&lt;/li&gt;
&lt;li&gt;TTI measurement&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Integration with Your Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  During Code Review
&lt;/h3&gt;

&lt;p&gt;The agent automatically flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ScrollView usage (should be FlashList)&lt;/li&gt;
&lt;li&gt;Barrel imports&lt;/li&gt;
&lt;li&gt;Missing memoization&lt;/li&gt;
&lt;li&gt;Inline styles (if using Unistyles)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  During Development
&lt;/h3&gt;

&lt;p&gt;The agent suggests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better component patterns&lt;/li&gt;
&lt;li&gt;Performance optimizations&lt;/li&gt;
&lt;li&gt;Memory-efficient implementations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  During Optimization
&lt;/h3&gt;

&lt;p&gt;The agent provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step-by-step optimization plans&lt;/li&gt;
&lt;li&gt;Measurement tools&lt;/li&gt;
&lt;li&gt;Before/after comparisons&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Skill Not Activating?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check Installation&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;ls&lt;/span&gt; .agents/skills/react-native-best-practices/
   &lt;span class="c"&gt;# or&lt;/span&gt;
   &lt;span class="nb"&gt;ls&lt;/span&gt; .windsurf/skills/react-native-best-practices/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Specific Keywords&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"performance"&lt;/li&gt;
&lt;li&gt;"optimization"&lt;/li&gt;
&lt;li&gt;"bundle size"&lt;/li&gt;
&lt;li&gt;"memory leak"&lt;/li&gt;
&lt;li&gt;"FPS"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Be Explicit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Use react-native-best-practices to optimize this"&lt;/li&gt;
&lt;li&gt;"Check this code against performance best practices"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Skill Suggestions Not Relevant?
&lt;/h3&gt;

&lt;p&gt;The skill is designed for React Native/Expo apps. For other frameworks, different skills may be needed.&lt;/p&gt;




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

&lt;p&gt;The react-native-best-practices agent skill transforms your AI coding assistant into a React Native performance expert. By automatically detecting issues and suggesting proven optimizations, it helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build faster apps&lt;/strong&gt; with better FPS and responsiveness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduce bundle sizes&lt;/strong&gt; for faster downloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevent memory leaks&lt;/strong&gt; that cause crashes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize startup time&lt;/strong&gt; for better user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install it once, and your agent will continuously help you write performant React Native code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official Announcement&lt;/strong&gt;: &lt;a href="https://www.callstack.com/blog/announcing-react-native-best-practices-for-ai-agents" rel="noopener noreferrer"&gt;Announcing: React Native Best Practices for AI Agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Guide&lt;/strong&gt;: Based on &lt;a href="https://www.callstack.com/blog/the-ultimate-guide-to-react-native-optimization" rel="noopener noreferrer"&gt;Callstack's Ultimate Guide to React Native Optimization&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill Repository&lt;/strong&gt;: &lt;code&gt;callstackincubator/agent-skills&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installation&lt;/strong&gt;: &lt;code&gt;npx add-skill callstackincubator/agent-skills&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Happy Optimizing! 🚀&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
    <item>
      <title>Lightning-Fast In-App Debugging with React Native BugBubble</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Mon, 05 Jan 2026 07:05:58 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/lightning-fast-in-app-debugging-with-react-native-bugbubble-5bao</link>
      <guid>https://dev.to/ajmal_hasan/lightning-fast-in-app-debugging-with-react-native-bugbubble-5bao</guid>
      <description>&lt;p&gt;If you want real-time visibility into network calls, WebSocket events, console logs, and analytics without leaving your app, &lt;a href="https://github.com/lokal-app/react-native-bugbubble" rel="noopener noreferrer"&gt;&lt;code&gt;@lokal-dev/react-native-bugbubble&lt;/code&gt;&lt;/a&gt; is a lightweight drop-in debugger for React Native.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/lokal-app/react-native-bugbubble?tab=readme-ov-file#demo" rel="noopener noreferrer"&gt;DEMO&lt;/a&gt;&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%2Fpc2n43phr6xcd8llirt5.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%2Fpc2n43phr6xcd8llirt5.png" alt=" " width="800" height="1739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why BugBubble?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Floating debug bubble you can drag and tap to open the debugger UI.&lt;/li&gt;
&lt;li&gt;Tracks network, WebSocket, console, and analytics events out of the box.&lt;/li&gt;
&lt;li&gt;Zero native setup; pure JS/TS with sensible defaults.&lt;/li&gt;
&lt;li&gt;Configurable log limits, button position, and per-signal tracking.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add @lokal-dev/react-native-bugbubble
&lt;span class="c"&gt;# or&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @lokal-dev/react-native-bugbubble
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Minimal Integration
&lt;/h3&gt;

&lt;p&gt;Add the component at your app root so it mounts once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BugBubbleProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@components/global/BugBubbleProvider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;YourApp&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;BugBubbleProvider&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuring the Debugger
&lt;/h3&gt;

&lt;p&gt;You can tune log limits, bubble position, and tracking switches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BugBubble&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@lokal-dev/react-native-bugbubble&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;IS_BUG_BUBBLE_ENABLED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ENV&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * BugBubble configuration options
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bugBubbleConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;maxLogs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Maximum number of logs to store&lt;/span&gt;
  &lt;span class="na"&gt;floatingButtonPosition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;trackingOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;console&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Track console logs&lt;/span&gt;
      &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Track network requests&lt;/span&gt;
      &lt;span class="na"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Track websocket connections&lt;/span&gt;
      &lt;span class="na"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Disable analytics tracking&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;ignoreUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;/symbolicate/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/generate_204/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/clients3&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;google&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;com/&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// optional: hide unwanted urls&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BugBubbleProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;IS_BUG_BUBBLE_ENABLED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;BugBubble&lt;/span&gt; &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;bugBubbleConfig&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Config is read on mount; remount to change it.&lt;/li&gt;
&lt;li&gt;Disabling a log type hides its tab and stops interceptors for that type.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Manual Logging (Optional)
&lt;/h3&gt;

&lt;p&gt;If you need to log custom events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@lokal-dev/react-native-bugbubble&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logAnalytics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user_login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logNetwork&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logWebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wss://api.example.com/ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;BugBubbleLogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logConsole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Deprecated API used&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Use It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;QA builds to inspect API traffic without remote tools.&lt;/li&gt;
&lt;li&gt;Investigating flaky WebSocket or console noise in CI-only environments.&lt;/li&gt;
&lt;li&gt;Lightweight alternative to heavier remote debuggers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For full API details and examples, see the project repo: &lt;a href="https://github.com/lokal-app/react-native-bugbubble" rel="noopener noreferrer"&gt;react-native-bugbubble on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Knip: Dead Code Detector for JavaScript &amp; TypeScript Projects</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Tue, 23 Dec 2025 19:51:53 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/knip-the-ultimate-dead-code-detector-for-javascript-typescript-projects-3463</link>
      <guid>https://dev.to/ajmal_hasan/knip-the-ultimate-dead-code-detector-for-javascript-typescript-projects-3463</guid>
      <description>&lt;p&gt;Every mature codebase has &lt;strong&gt;dead code&lt;/strong&gt;. That utility function someone wrote "just in case." The component from a feature that was scrapped. The npm package installed for a spike that never went anywhere.&lt;/p&gt;

&lt;p&gt;ESLint can catch unused variables and imports within a file, but what about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Files that are never imported anywhere?&lt;/li&gt;
&lt;li&gt;Exported functions that no one uses?&lt;/li&gt;
&lt;li&gt;Dependencies in &lt;code&gt;package.json&lt;/code&gt; you forgot to remove?&lt;/li&gt;
&lt;li&gt;Types and interfaces defined but never referenced?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where &lt;strong&gt;Knip&lt;/strong&gt; comes in.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Knip Detects
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🗂️ &lt;strong&gt;Unused Files&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Source files that aren't imported anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 &lt;strong&gt;Unused Dependencies&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Packages in &lt;code&gt;package.json&lt;/code&gt; that aren't used&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📤 &lt;strong&gt;Unused Exports&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Functions, classes, types exported but never imported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔧 &lt;strong&gt;Unused Dev Dependencies&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Dev packages that aren't needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❓ &lt;strong&gt;Unlisted Dependencies&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Packages used in code but missing from &lt;code&gt;package.json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔗 &lt;strong&gt;Unresolved Imports&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Imports pointing to non-existent modules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&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%2Fn0xvkipuv3kq4t2ttih2.png" alt=" " width="800" height="234"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# npm&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; knip

&lt;span class="c"&gt;# yarn&lt;/span&gt;
yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; knip

&lt;span class="c"&gt;# pnpm&lt;/span&gt;
pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; knip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Basic Usage
&lt;/h3&gt;

&lt;p&gt;Just run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx knip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Knip will analyze your project and output all the unused code it finds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;For most projects, Knip works out of the box. But for complex setups (monorepos, custom entry points, etc.), you'll want a config file.&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;knip.json&lt;/code&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://unpkg.com/knip@5/schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"entry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/index.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/App.tsx"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/**/*.{ts,tsx}"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/__tests__/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/__mocks__/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/node_modules/**"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignoreDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"prettier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"husky"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Configuration Options
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;entry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Entry point files where Knip starts tracing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Files to analyze&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ignore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Files/patterns to skip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ignoreDependencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dependencies to skip (useful for config-only packages)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ignoreExportsUsedInFile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Don't report exports used only in the same file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  React Native Example
&lt;/h3&gt;

&lt;p&gt;For React Native projects, you'll need to account for native tooling and development dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://unpkg.com/knip@5/schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"entry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/App.tsx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/**/*.{ts,tsx}"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/__tests__/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/__mocks__/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"android/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ios/**"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignoreDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@react-native/metro-config"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@react-native/typescript-config"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@react-native/babel-preset"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"patch-package"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"reactotron-react-native"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignoreExportsUsedInFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real-World Results
&lt;/h2&gt;

&lt;p&gt;I ran Knip on a production React Native app, and here's what it found:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Unused files &lt;span class="o"&gt;(&lt;/span&gt;73&lt;span class="o"&gt;)&lt;/span&gt;
src/components/map/index.tsx
src/components/views/NotificationMenuButton.tsx
src/models/requests/auth/authRequests.ts
src/utils/helpers/contactHelper.ts
... and 69 more

Unused dependencies &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
@react-native-firebase/perf

Unused devDependencies &lt;span class="o"&gt;(&lt;/span&gt;4&lt;span class="o"&gt;)&lt;/span&gt;
@babel/preset-env
@testing-library/jest-native
@types/react-native-get-random-values
eslint-plugin-react-you-might-not-need-an-effect

Unlisted dependencies &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;
credit-card-type  src/features/paymentMethods/addNewCard/index.tsx

Unused exports &lt;span class="o"&gt;(&lt;/span&gt;74&lt;span class="o"&gt;)&lt;/span&gt;
translations        src/config/localization/languages.ts
defaultAddressForm  src/features/addressBook/addressTypes.ts
... and more
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;73 unused files!&lt;/strong&gt; That's potentially thousands of lines of dead code that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increases bundle size&lt;/li&gt;
&lt;li&gt;Confuses new developers&lt;/li&gt;
&lt;li&gt;Creates maintenance burden&lt;/li&gt;
&lt;li&gt;Shows up in search results, wasting time&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>programming</category>
    </item>
    <item>
      <title>iOS Bridging Header Setup for React Native</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Tue, 16 Dec 2025 18:51:43 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/ios-bridging-header-setup-for-react-native-2gln</link>
      <guid>https://dev.to/ajmal_hasan/ios-bridging-header-setup-for-react-native-2gln</guid>
      <description>&lt;p&gt;A bridging header allows Swift code to access Objective-C libraries and native modules. Here's how to set it up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setup Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create the Bridging Header File
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Right-click on your project folder in Xcode&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;New File from Template&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Header file&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&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%2F6wkgiafwgf2xjyd64sdt.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%2F6wkgiafwgf2xjyd64sdt.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Configure the File
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Header file&lt;/strong&gt; template&lt;/li&gt;
&lt;li&gt;Name it: &lt;code&gt;YourAppName-Bridging-Header.h&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select all targets (main app, development, production)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Step 3: Set the Bridging Header Path
&lt;/h3&gt;

&lt;p&gt;For &lt;strong&gt;each target&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Build Settings&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;"Objective-C Bridging Header"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set path: &lt;code&gt;YourAppName/YourAppName-Bridging-Header.h&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&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%2Ftrqoau3n5400jhxwqkrb.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%2Ftrqoau3n5400jhxwqkrb.png" alt=" " width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Import Your Headers
&lt;/h3&gt;

&lt;p&gt;Open the bridging header and import what you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight objective_c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// React Native Config&lt;/span&gt;
&lt;span class="cp"&gt;#import "RNCConfig.h"
&lt;/span&gt;
&lt;span class="c1"&gt;// Google Maps&lt;/span&gt;
&lt;span class="cp"&gt;#import &amp;lt;GoogleMaps/GoogleMaps.h&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// Your custom modules&lt;/span&gt;
&lt;span class="cp"&gt;#import "CustomNativeModule.h"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fhsa28irpmaxwwx06f6r8.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%2Fhsa28irpmaxwwx06f6r8.png" alt=" " width="754" height="262"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Use in AppDelegate.Swift
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;UIKit&lt;/span&gt;

&lt;span class="kd"&gt;@UIApplicationMain&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;AppDelegate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIResponder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UIApplicationDelegate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                     &lt;span class="n"&gt;didFinishLaunchingWithOptions&lt;/span&gt; &lt;span class="nv"&gt;launchOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;UIApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;LaunchOptionsKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]?)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// Access environment variables&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;RNCConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"API_KEY"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;GMSServices&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;provideAPIKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Initialize Firebase&lt;/span&gt;
        &lt;span class="kt"&gt;FirebaseApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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




&lt;h3&gt;
  
  
  Step 6: Clean and Build
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Clean: &lt;code&gt;Cmd + Shift + K&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Build: &lt;code&gt;Cmd + B&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run: &lt;code&gt;Cmd + R&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YourAppName/
├── ios/
│   ├── YourAppName/
│   │   ├── AppDelegate.swift
│   │   ├── YourAppName-Bridging-Header.h  ✅
│   │   └── Info.plist
│   └── Pods/
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Found this helpful?&lt;/strong&gt; Drop a ❤️ below! 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  ReactNative #iOS #Swift #MobileDevelopment
&lt;/h1&gt;

</description>
      <category>reactnative</category>
      <category>ios</category>
    </item>
    <item>
      <title>Stop Fighting React Native Dependency Hell — Use This Microsoft Tool</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Mon, 08 Dec 2025 14:18:07 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/stop-fighting-react-native-dependency-hell-use-this-microsoft-tool-3g5g</link>
      <guid>https://dev.to/ajmal_hasan/stop-fighting-react-native-dependency-hell-use-this-microsoft-tool-3g5g</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Every React Native Dev Knows
&lt;/h2&gt;

&lt;p&gt;You've been there. You run &lt;code&gt;yarn install&lt;/code&gt;, everything looks fine, then &lt;strong&gt;boom&lt;/strong&gt; — runtime crashes, red screens, or mysterious build failures. The culprit? Incompatible package versions.&lt;/p&gt;

&lt;p&gt;React Native's ecosystem moves fast. Package A needs React Native 0.81, but Package B was last tested on 0.79. Figuring out which versions play nice together? A nightmare.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter &lt;a href="https://microsoft.github.io/rnx-kit/docs/guides/dependency-management" rel="noopener noreferrer"&gt;&lt;code&gt;@rnx-kit/align-deps&lt;/code&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Microsoft built a tool that solves this: &lt;strong&gt;align-deps&lt;/strong&gt;. It automatically checks and fixes your dependencies to ensure they're compatible with your React Native version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Setup (2 minutes)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Install it:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add @rnx-kit/align-deps &lt;span class="nt"&gt;--dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Add these scripts to &lt;code&gt;package.json&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"check-dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rnx-align-deps"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fix-dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rnx-align-deps --write"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Initialize for your RN version:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx rnx-align-deps &lt;span class="nt"&gt;--init&lt;/span&gt; app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Fix any issues:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn fix-dependencies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The tool scans your dependencies and adjusts versions to ones known to work together.&lt;/p&gt;




&lt;h2&gt;
  
  
  Upgrading React Native? Here's Your Toolkit
&lt;/h2&gt;

&lt;p&gt;Upgrading React Native involves two things: &lt;strong&gt;dependencies&lt;/strong&gt; and &lt;strong&gt;native files&lt;/strong&gt;. You need different tools for each.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Align Your Dependencies
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;align-deps&lt;/code&gt; to update all your JS dependencies to compatible versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @rnx-kit/align-deps &lt;span class="nt"&gt;--requirements&lt;/span&gt; react-native@0.81 &lt;span class="nt"&gt;--write&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This updates &lt;strong&gt;all&lt;/strong&gt; your React Native-related packages to versions known to work with RN 0.81. No more guessing which version of &lt;code&gt;react-native-screens&lt;/code&gt; or &lt;code&gt;react-native-reanimated&lt;/code&gt;, etc you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Update Native Files (iOS/Android)
&lt;/h3&gt;

&lt;p&gt;Dependencies are only half the battle. React Native upgrades often require changes to native files like &lt;code&gt;AppDelegate.swift&lt;/code&gt;, &lt;code&gt;build.gradle&lt;/code&gt;, &lt;code&gt;Podfile&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;👉 Use the &lt;strong&gt;&lt;a href="https://react-native-community.github.io/upgrade-helper" rel="noopener noreferrer"&gt;React Native Upgrade Helper&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This tool shows you a &lt;strong&gt;visual diff&lt;/strong&gt; of all native file changes between your current version and your target version. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to use it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://react-native-community.github.io/upgrade-helper" rel="noopener noreferrer"&gt;react-native-community.github.io/upgrade-helper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select your &lt;strong&gt;current&lt;/strong&gt; RN version (e.g., 0.79.0)&lt;/li&gt;
&lt;li&gt;Select your &lt;strong&gt;target&lt;/strong&gt; RN version (e.g., 0.81.0)&lt;/li&gt;
&lt;li&gt;Review the diff and apply changes to your &lt;code&gt;ios/&lt;/code&gt; and &lt;code&gt;android/&lt;/code&gt; folders&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pro Tip: Use Both Together
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Update JS dependencies&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@rnx-kit/align-deps&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update native files&lt;/td&gt;
&lt;td&gt;&lt;a href="https://react-native-community.github.io/upgrade-helper" rel="noopener noreferrer"&gt;Upgrade Helper&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This combo makes React Native upgrades &lt;strong&gt;dramatically&lt;/strong&gt; less painful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What align-deps Actually Does
&lt;/h2&gt;

&lt;p&gt;When I ran &lt;code&gt;fix-dependencies&lt;/code&gt; on my project, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⬇️ &lt;strong&gt;Downgraded&lt;/strong&gt; some packages to stable, compatible versions&lt;/li&gt;
&lt;li&gt;🔓 &lt;strong&gt;Added flexibility&lt;/strong&gt; (&lt;code&gt;^&lt;/code&gt;) to some pinned versions&lt;/li&gt;
&lt;li&gt;📋 &lt;strong&gt;Generated config&lt;/strong&gt; tracking which "capabilities" my app uses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, it changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-native-modal&lt;/code&gt;: &lt;code&gt;^14.0.0-rc.1&lt;/code&gt; → &lt;code&gt;^13.0.0&lt;/code&gt; (stable over RC)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;react-native-screens&lt;/code&gt;: &lt;code&gt;4.16.0&lt;/code&gt; → &lt;code&gt;^4.11.1&lt;/code&gt; (known compatible)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Should You Use It?
&lt;/h2&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%2Fxtirvsy6qwh12cptjpji.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%2Fxtirvsy6qwh12cptjpji.png" alt=" " width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You maintain a production React Native app&lt;/li&gt;
&lt;li&gt;You've wasted time debugging version conflicts&lt;/li&gt;
&lt;li&gt;You want safer React Native upgrades&lt;/li&gt;
&lt;li&gt;You work in a team and need consistent dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Maybe not if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need bleeding-edge package versions&lt;/li&gt;
&lt;li&gt;You have a simple app with few dependencies&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Important: Always Review Changes
&lt;/h2&gt;

&lt;p&gt;The tool modifies your &lt;code&gt;package.json&lt;/code&gt; automatically. &lt;strong&gt;Always:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Review the diff (&lt;code&gt;git diff package.json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Test your app thoroughly&lt;/li&gt;
&lt;li&gt;Check if any downgraded packages break features you need&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📚 &lt;a href="https://microsoft.github.io/rnx-kit/docs/guides/dependency-management" rel="noopener noreferrer"&gt;align-deps Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔄 &lt;a href="https://react-native-community.github.io/upgrade-helper" rel="noopener noreferrer"&gt;React Native Upgrade Helper&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Have you tried these tools? Did they help or cause issues? Drop a comment below!&lt;/strong&gt; 👇&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Debugging Native Code in React Native: A Step-by-Step Guide (Android &amp; iOS)</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Sun, 07 Dec 2025 18:06:21 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/debugging-native-code-in-react-native-a-step-by-step-guide-android-ios-14o3</link>
      <guid>https://dev.to/ajmal_hasan/debugging-native-code-in-react-native-a-step-by-step-guide-android-ios-14o3</guid>
      <description>&lt;p&gt;As React Native developers, we're comfortable with JavaScript debugging—Chrome DevTools, console logs, the usual suspects. But native code? That's where things get intimidating.&lt;/p&gt;

&lt;p&gt;Here's what I learned about debugging Kotlin/Swift code in React Native apps, and why it's not as scary as you think.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Bother with Native Debugging?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Third-party library crashes&lt;/strong&gt;: That cryptic native error? Step through the actual code to see what's breaking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom native modules&lt;/strong&gt;: Debug your bridge code properly instead of littering it with log statements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance issues&lt;/strong&gt;: JavaScript profiling won't show native rendering bottlenecks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform-specific bugs&lt;/strong&gt;: That Android 12-only crash? See exactly where and why it fails.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Debugging Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Android Studio (Kotlin/Java)
&lt;/h3&gt;

&lt;p&gt;Android Studio is your IDE for the Android native side. It's built on IntelliJ, so if you've used WebStorm or other JetBrains tools, the interface will feel familiar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key debugging shortcuts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;F8&lt;/code&gt; - Step Over (execute current line, move to next)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F7&lt;/code&gt; - Step Into (dive into function call)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Shift+F8&lt;/code&gt; - Step Out (finish current function, return to caller)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F9&lt;/code&gt; - Resume (continue until next breakpoint)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cmd+F8&lt;/code&gt; - Toggle breakpoint&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.amazonaws.com%2Fuploads%2Farticles%2Fx96zq9dpyxlobj7pz0f5.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%2Fx96zq9dpyxlobj7pz0f5.png" alt=" " width="800" height="601"&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fzezz69h2kn83cejadmss.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%2Fzezz69h2kn83cejadmss.png" alt=" " width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Xcode (Swift/Objective-C)
&lt;/h3&gt;

&lt;p&gt;Xcode is Apple's IDE for iOS development. It has powerful debugging tools, though the keyboard shortcuts differ from Android Studio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key debugging shortcuts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;F6&lt;/code&gt; - Step Over&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F7&lt;/code&gt; - Step Into
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F8&lt;/code&gt; - Step Out&lt;/li&gt;
&lt;li&gt;Control button (or &lt;code&gt;Ctrl+Cmd+Y&lt;/code&gt;) - Continue/Resume&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cmd+\&lt;/code&gt; - Toggle breakpoint&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.amazonaws.com%2Fuploads%2Farticles%2Frfb9k8vqxsly6clqb6nv.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%2Frfb9k8vqxsly6clqb6nv.png" alt=" " width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up: My Practice Code
&lt;/h2&gt;

&lt;p&gt;To really learn debugging, I added sample code to both platforms with common patterns you'll encounter. Here's what I created:&lt;/p&gt;

&lt;h3&gt;
  
  
  Android (MainActivity.kt)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;debugBreakpointDemo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;userName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ReactNativeDev"&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;userAge&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;isActive&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Cherry"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Elderberry"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withIndex&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BreakpointDemo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Item $index: $item"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;specialItem&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BreakpointDemo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Special item found: $specialItem"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BreakpointDemo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Calculation result: $result"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;multiplied&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;multiplied&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  iOS (AppDelegate.swift)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;debugBreakpointDemo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ReactNativeDev"&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;userAge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;isActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Cherry"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Elderberry"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enumerated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Item &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;specialItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uppercased&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Special item found: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;specialItem&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Calculation result: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;multiplied&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;multiplied&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Hands-On: Your First Native Debugging Session
&lt;/h2&gt;

&lt;p&gt;Let me walk you through a practice session. This is how I learned, and it demystified native debugging completely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Set Your First Breakpoint
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;android/app/src/main/java/.../MainActivity.kt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find the line &lt;code&gt;val userName = "ReactNativeDev"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click the gray gutter area to the left of the line number&lt;/li&gt;
&lt;li&gt;A red dot appears—that's your breakpoint&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;ios/YourApp/AppDelegate.swift&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find the line &lt;code&gt;let userName = "ReactNativeDev"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click the gray gutter to the left&lt;/li&gt;
&lt;li&gt;A blue arrow appears—that's your breakpoint&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Run in Debug Mode
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the bug icon 🪲 in the toolbar (or press &lt;code&gt;Shift+F9&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The app launches and immediately pauses at your breakpoint&lt;/li&gt;
&lt;li&gt;The IDE highlights the current line in blue&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;Cmd+R&lt;/code&gt; or click the Play button&lt;/li&gt;
&lt;li&gt;The app pauses at your breakpoint&lt;/li&gt;
&lt;li&gt;The current line is highlighted with a green overlay&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Explore the Variables Panel
&lt;/h3&gt;

&lt;p&gt;This is where the magic happens. Look at the bottom of your IDE.&lt;/p&gt;

&lt;p&gt;You'll see a "Variables" panel showing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;userName = "ReactNativeDev"
userAge = &amp;lt;not initialized yet&amp;gt;
isActive = &amp;lt;not initialized yet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why aren't the others initialized? Because breakpoints pause &lt;em&gt;before&lt;/em&gt; executing the line. The line is about to run but hasn't yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Step Over (F8 or F6)
&lt;/h3&gt;

&lt;p&gt;Press &lt;code&gt;F8&lt;/code&gt; (Android Studio) or &lt;code&gt;F6&lt;/code&gt; (Xcode) a few times. Watch as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;userName&lt;/code&gt; appears in variables&lt;/li&gt;
&lt;li&gt;Next step: &lt;code&gt;userAge&lt;/code&gt; appears
&lt;/li&gt;
&lt;li&gt;Next step: &lt;code&gt;isActive&lt;/code&gt; appears&lt;/li&gt;
&lt;li&gt;The list &lt;code&gt;items&lt;/code&gt; gets created&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You're executing line by line. This is &lt;strong&gt;stepping over&lt;/strong&gt;—you execute the current line and move to the next one without diving into function internals.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Step Into a Function (F7)
&lt;/h3&gt;

&lt;p&gt;Keep stepping until you reach the line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now instead of pressing F8/F6, press &lt;strong&gt;F7&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Boom! You're now &lt;em&gt;inside&lt;/em&gt; the &lt;code&gt;performCalculation&lt;/code&gt; function. The IDE jumped you to its definition. This is &lt;strong&gt;stepping into&lt;/strong&gt;—diving into the implementation of a function call.&lt;/p&gt;

&lt;p&gt;Step over a couple of times inside this function. Watch &lt;code&gt;sum&lt;/code&gt; and &lt;code&gt;multiplied&lt;/code&gt; appear in the variables panel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Step Out (Shift+F8 or F8)
&lt;/h3&gt;

&lt;p&gt;You've seen enough inside &lt;code&gt;performCalculation&lt;/code&gt;. Press &lt;strong&gt;Shift+F8&lt;/strong&gt; (Android Studio) or &lt;strong&gt;F8&lt;/strong&gt; (Xcode).&lt;/p&gt;

&lt;p&gt;The function completes, and you're back where you called it from. The &lt;code&gt;result&lt;/code&gt; variable now contains the return value (60). This is &lt;strong&gt;stepping out&lt;/strong&gt;—finishing the current function and returning to the caller.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Resume Execution (F9 or Continue Button)
&lt;/h3&gt;

&lt;p&gt;Press &lt;strong&gt;F9&lt;/strong&gt; (Android Studio) or click the &lt;strong&gt;Continue button&lt;/strong&gt; (Xcode) to let the app run normally until it hits another breakpoint (or finishes).&lt;/p&gt;




&lt;h2&gt;
  
  
  Advanced Techniques I Use Daily
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Conditional Breakpoints
&lt;/h3&gt;

&lt;p&gt;Right-click a breakpoint and add a condition. For example, only break when &lt;code&gt;index == 2&lt;/code&gt; in a loop. This saved me hours when debugging issues that only occurred on the 100th iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt; Right-click breakpoint → More → Condition&lt;br&gt;
&lt;strong&gt;Xcode:&lt;/strong&gt; Right-click breakpoint → Edit Breakpoint → Condition&lt;/p&gt;

&lt;h3&gt;
  
  
  Expression Evaluation
&lt;/h3&gt;

&lt;p&gt;While paused, you can evaluate any expression on the fly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select an expression in code&lt;/li&gt;
&lt;li&gt;Right-click → Evaluate Expression (or &lt;code&gt;Alt+F8&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Try: &lt;code&gt;items.filter { it.startsWith("A") }&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;In the debug console, type: &lt;code&gt;po items.filter { $0.hasPrefix("A") }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;po&lt;/code&gt; means "print object"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Call Stack Navigation
&lt;/h3&gt;

&lt;p&gt;The call stack shows how you got to the current line. Click any frame to jump to that context and see its variables. Invaluable when you're deep in a chain of function calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watch Variables
&lt;/h3&gt;

&lt;p&gt;Add variables to your watch list to track them across function calls. They persist even when out of scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android Studio:&lt;/strong&gt; Right-click variable → Add to Watches&lt;br&gt;
&lt;strong&gt;Xcode:&lt;/strong&gt; Right-click variable → Watch "variableName"&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example: Debugging a Crash
&lt;/h2&gt;

&lt;p&gt;Last week, my app crashed when users tapped a button. JavaScript logs showed nothing. Here's how native debugging saved me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Android Studio&lt;/strong&gt;: Set breakpoint in &lt;code&gt;onClick&lt;/code&gt; handler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run in debug mode&lt;/strong&gt;, tap the button&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step through&lt;/strong&gt; the native code&lt;/li&gt;
&lt;li&gt;Found the crash: accessing an ArrayList index that didn't exist&lt;/li&gt;
&lt;li&gt;The issue: JavaScript sent wrong array length to native&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without stepping through with breakpoints, I'd have spent hours adding log statements and rebuilding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips from the Trenches
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start simple&lt;/strong&gt;: Don't try to debug react-native core libraries on day one. Practice with your own simple native code first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use both IDEs&lt;/strong&gt;: I have both Android Studio and Xcode open when working on RN. Debug both platforms regularly—they have different bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combine with JS debugging&lt;/strong&gt;: Use both Chrome DevTools for JS and native debuggers. Some bugs span both layers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the call stack&lt;/strong&gt;: When you hit a breakpoint, spend time reading the call stack. Understanding how you got there is as important as where you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't fear native code&lt;/strong&gt;: It's just code. Kotlin and Swift are actually quite pleasant languages. The debugging process is identical to JavaScript debugging, just different tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practice Challenge
&lt;/h2&gt;

&lt;p&gt;Here's what I recommend: spend 30 minutes today just stepping through the sample code I showed above. Don't try to fix anything, just explore:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set breakpoints in loops&lt;/li&gt;
&lt;li&gt;Step into and out of functions&lt;/li&gt;
&lt;li&gt;Watch variables change&lt;/li&gt;
&lt;li&gt;Evaluate expressions&lt;/li&gt;
&lt;li&gt;Add conditional breakpoints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This low-pressure practice builds the muscle memory. When you hit a real bug, you'll know exactly what to do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources That Helped Me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/studio/debug" rel="noopener noreferrer"&gt;Android Developer Guide - Debug Your App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/xcode/debugging" rel="noopener noreferrer"&gt;Apple Developer - Debugging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactnative.dev/docs/debugging#debugging-native-code" rel="noopener noreferrer"&gt;React Native - Native Debugging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Native debugging isn't scary—it's empowering. As React Native developers, we shouldn't fear diving into the native layer. These tools are powerful, learnable, and absolutely essential for professional RN development.&lt;/p&gt;

&lt;p&gt;The difference between a good RN developer and a great one? Great ones are comfortable in all three worlds: JavaScript, Android native, and iOS native.&lt;/p&gt;

&lt;p&gt;Start small, practice deliberately, and soon you'll wonder how you ever developed without native debugging.&lt;/p&gt;

&lt;p&gt;Happy debugging! 🐛🔍&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What native debugging techniques have you found helpful? Share your experiences in the comments below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>ios</category>
      <category>android</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How I Reduced My React Native 0.81 APK Size by 50% (Without Breaking Anything)</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Fri, 05 Dec 2025 21:38:01 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/how-i-reduced-my-react-native-081-apk-size-by-50-without-breaking-anything-e2a</link>
      <guid>https://dev.to/ajmal_hasan/how-i-reduced-my-react-native-081-apk-size-by-50-without-breaking-anything-e2a</guid>
      <description>&lt;p&gt;A large APK size can slow down downloads, increase install drop-offs, and impact user experience — especially in regions with slower internet connections.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk you through the &lt;strong&gt;exact steps&lt;/strong&gt; I used to reduce a production React Native 0.81 app's APK size by ~50%, while maintaining full functionality and security.&lt;/p&gt;




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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Reduction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;~85 MB&lt;/td&gt;
&lt;td&gt;~42 MB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~50%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛠️ Step 1: Build Only for arm64-v8a Architecture
&lt;/h2&gt;

&lt;p&gt;Most optimization guides tell you to split APKs by CPU architecture. But here's the thing: &lt;strong&gt;if your minSdkVersion is 29+ (Android 10+), you only need arm64-v8a&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Why? Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ All Android 10+ devices support 64-bit (arm64-v8a)&lt;/li&gt;
&lt;li&gt;✅ Google Play Store requires 64-bit support&lt;/li&gt;
&lt;li&gt;✅ 95%+ of active Android devices use arm64-v8a&lt;/li&gt;
&lt;li&gt;❌ armeabi-v7a is for 32-bit devices (pre-2014)&lt;/li&gt;
&lt;li&gt;❌ x86/x86_64 is for Intel devices (&amp;lt;1% market share)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;

&lt;p&gt;In your &lt;code&gt;android/app/build.gradle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Enable separate builds per CPU architecture
def enableSeparateBuildPerCPUArchitecture = true

android {
    // ... existing config ...

    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // No universal APK needed
            include "arm64-v8a"  // Only modern 64-bit devices
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&amp;gt; 💡 &lt;strong&gt;Pro tip&lt;/strong&gt;: Set &lt;code&gt;universalApk false&lt;/code&gt; to skip building a fat universal APK — it's unnecessary when targeting a single architecture.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Step 2: Keep Only Necessary Languages
&lt;/h2&gt;

&lt;p&gt;Your app probably only supports a few languages, but by default, Android bundles resources for &lt;strong&gt;ALL&lt;/strong&gt; languages from your dependencies (like Google Play Services).&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;android/app/build.gradle&lt;/code&gt;, inside &lt;code&gt;defaultConfig&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defaultConfig {
    // ... existing config ...

    // Keep only necessary languages to reduce APK size
    resConfigs "ar", "en", "fr"  // Add your supported languages
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single line can remove &lt;strong&gt;several megabytes&lt;/strong&gt; of unused language resources!&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Step 3: Enable Resource Shrinking &amp;amp; PNG Compression
&lt;/h2&gt;

&lt;p&gt;Enable these in your release build type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buildTypes {
    release {
        signingConfig signingConfigs.release
        debuggable false
        minifyEnabled true          // Code shrinking (already enabled)
        shrinkResources true        // Remove unused resources
        crunchPngs true             // Extra PNG compression
        zipAlignEnabled true        // Memory optimization
        proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What Each Does:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;minifyEnabled true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removes unused code, obfuscates names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shrinkResources true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removes unused drawables, layouts, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crunchPngs true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Additional PNG compression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zipAlignEnabled true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optimizes APK for memory-mapped reading&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔐 Step 4: Optimize ProGuard Rules
&lt;/h2&gt;

&lt;p&gt;ProGuard (or R8) is powerful but can break your app if not configured correctly. Here's a comprehensive, battle-tested configuration for React Native 0.81:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;android/app/proguard-rules.pro&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ========== STANDARD OPTIMIZATIONS ==========
-optimizationpasses 3
-allowaccessmodification
-overloadaggressively
-repackageclasses ''
-dontusemixedcaseclassnames
-dontpreverify

# Remove debug logging in production (keeps error logs)
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** i(...);
    public static *** w(...);
}

# Keep crash reporting info
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
-keepattributes Signature, *Annotation*

# ========== REACT NATIVE CORE ==========
-keep class com.facebook.hermes.** { *; }
-keep class com.facebook.hermes.unicode.** { *; }
-keep class com.facebook.react.** { *; }
-keep class com.facebook.jni.** { *; }
-keep class com.facebook.soloader.** { *; }

# Bridge &amp;amp; Native Modules
-keep public class * extends com.facebook.react.bridge.NativeModule { *; }
-keep class com.facebook.react.bridge.** { *; }
-keepclassmembers class * { 
    @com.facebook.react.bridge.ReactMethod *; 
}
-keepclassmembers class * {
    @com.facebook.proguard.annotations.DoNotStrip *;
}

# UI Manager &amp;amp; View System
-keep @com.facebook.react.uimanager.annotations.ReactProp class * { *; }
-keep @com.facebook.react.uimanager.annotations.ReactPropGroup class * { *; }
-keep class * extends com.facebook.react.uimanager.ViewManager { *; }
-keep class com.facebook.react.uimanager.** { *; }

# TurboModules (New Architecture)
-keep class com.facebook.react.turbomodule.** { *; }
-keep class com.facebook.react.animated.** { *; }
-keep class com.facebook.react.common.** { *; }

# ========== COMMON LIBRARIES ==========
# Reanimated
-keep class com.swmansion.reanimated.** { *; }
-keep class com.swmansion.** { *; }
-dontwarn com.swmansion.**

# SVG
-keep public class com.horcrux.svg.** { *; }

# Fast Image
-keep class com.dylanvann.fastimage.** { *; }

# Firebase
-keep class com.google.firebase.** { *; }
-dontwarn com.google.firebase.**

# OkHttp
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
-dontwarn okio.**### Why This Works:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-optimizationpasses 3&lt;/code&gt;&lt;/strong&gt; — Multiple optimization passes for maximum shrinkage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log removal&lt;/strong&gt; — Strips debug/verbose/info/warning logs (keeps errors for debugging)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-keepattributes SourceFile,LineNumberTable&lt;/code&gt;&lt;/strong&gt; — Preserves stack traces for crash reporting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive &lt;code&gt;-keep&lt;/code&gt; rules&lt;/strong&gt; — Protects all React Native internals and common libraries&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ✅ Step 5: Verify Hermes is Enabled
&lt;/h2&gt;

&lt;p&gt;Hermes is React Native's optimised JavaScript engine. It should be enabled by default in RN 0.81, but verify in your &lt;code&gt;android/gradle.properties&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hermesEnabled=true&lt;/code&gt;&lt;br&gt;
Hermes provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Faster app startup&lt;/li&gt;
&lt;li&gt;✅ Smaller JS bundle size&lt;/li&gt;
&lt;li&gt;✅ Lower memory usage&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Testing Your Build
&lt;/h2&gt;

&lt;p&gt;After applying all optimisations:&lt;/p&gt;

&lt;h1&gt;
  
  
  Clean previous builds
&lt;/h1&gt;

&lt;p&gt;cd android &amp;amp;&amp;amp; ./gradlew clean&lt;/p&gt;

&lt;h1&gt;
  
  
  Build release APK
&lt;/h1&gt;

&lt;p&gt;./gradlew assembleRelease&lt;/p&gt;

&lt;h1&gt;
  
  
  Check APK size
&lt;/h1&gt;

&lt;p&gt;ls -lh app/build/outputs/apk/&lt;em&gt;/release/&lt;/em&gt;.apk---&lt;/p&gt;

&lt;h2&gt;
  
  
  📋 Complete Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Set &lt;code&gt;enableSeparateBuildPerCPUArchitecture = true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Include only &lt;code&gt;arm64-v8a&lt;/code&gt; architecture (if minSdk 29+)&lt;/li&gt;
&lt;li&gt;[ ] Set &lt;code&gt;universalApk false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Add &lt;code&gt;resConfigs&lt;/code&gt; for your supported languages&lt;/li&gt;
&lt;li&gt;[ ] Enable &lt;code&gt;shrinkResources true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Enable &lt;code&gt;crunchPngs true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Enable &lt;code&gt;zipAlignEnabled true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Add comprehensive ProGuard rules&lt;/li&gt;
&lt;li&gt;[ ] Verify Hermes is enabled&lt;/li&gt;
&lt;li&gt;[ ] Test on real devices before release!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Optimization&lt;/th&gt;
&lt;th&gt;APK Size Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single architecture (arm64-v8a)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-30-40%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource shrinking&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-5-10%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language filtering&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-2-5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ProGuard optimizations&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-5-10%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNG compression&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-1-3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⚠️ Important Notes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Always test on real devices&lt;/strong&gt; after applying these optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep error logs&lt;/strong&gt; — don't strip &lt;code&gt;Log.e()&lt;/code&gt; for production debugging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Crashlytics still works&lt;/strong&gt; — we preserved &lt;code&gt;SourceFile,LineNumberTable&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Play Store accepts single-architecture APKs&lt;/strong&gt; — they'll deliver the right one to users&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Hope this helps you ship a lighter, faster React Native app! 🚀&lt;/p&gt;

&lt;p&gt;Got questions or improvements? Drop them in the comments! 👇&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found this useful? Follow me for more React Native optimization tips!&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Setting Up SonarQube Locally for React Native &amp; MERN Projects</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Sat, 08 Nov 2025 16:12:05 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/setting-up-sonarqube-locally-for-react-native-mern-projects-3hgn</link>
      <guid>https://dev.to/ajmal_hasan/setting-up-sonarqube-locally-for-react-native-mern-projects-3hgn</guid>
      <description>&lt;p&gt;As a React Native and MERN developer, I recently integrated SonarQube into my local workflow using Docker. Here's a straightforward guide to get you started.&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%2Fpvle9x1na5gzl7a5zhke.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%2Fpvle9x1na5gzl7a5zhke.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is SonarQube?
&lt;/h2&gt;

&lt;p&gt;SonarQube automatically scans your code to find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bugs and potential errors&lt;/li&gt;
&lt;li&gt;Security vulnerabilities&lt;/li&gt;
&lt;li&gt;Code smells (maintainability issues)&lt;/li&gt;
&lt;li&gt;Test coverage gaps&lt;/li&gt;
&lt;li&gt;Duplicate code&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Install Docker Desktop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open Docker Desktop from Applications and make sure it's running.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setup Steps (project👨‍💻)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create Docker Compose File
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;docker-compose.yml&lt;/code&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonarqube:community&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonarqube-local&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9000:9000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sonarqube_data:/opt/sonarqube/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sonarqube_extensions:/opt/sonarqube/extensions&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sonarqube_logs:/opt/sonarqube/logs&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sonarqube-network&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube_extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube_logs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarqube-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Add Scripts to package.json
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sonar-scanner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar:start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker-compose up -d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar:stop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker-compose stop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar:down"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker-compose down"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sonar:logs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker-compose logs -f sonarqube"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Create SonarQube Configuration
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;sonar-project.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="c"&gt;# Project identification
&lt;/span&gt;&lt;span class="py"&gt;sonar.projectKey&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;my-app&lt;/span&gt;
&lt;span class="py"&gt;sonar.projectName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;My App&lt;/span&gt;
&lt;span class="py"&gt;sonar.projectVersion&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1.0.0&lt;/span&gt;

&lt;span class="c"&gt;# Source code location
&lt;/span&gt;&lt;span class="py"&gt;sonar.sources&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;
&lt;span class="py"&gt;sonar.tests&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;__tests__&lt;/span&gt;

&lt;span class="c"&gt;# Exclude directories
&lt;/span&gt;&lt;span class="py"&gt;sonar.exclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/node_modules/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/android/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/ios/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/vendor/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/coverage/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/__mocks__/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/build/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.spec.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.spec.tsx,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.test.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.test.tsx,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/assets/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.config.js,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.config.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.config.mjs,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/babel.config.js,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/metro.config.js,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/jest.config.js,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/jest-setup.ts&lt;/span&gt;

&lt;span class="c"&gt;# Test exclusions
&lt;/span&gt;&lt;span class="py"&gt;sonar.test.exclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/node_modules/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/coverage/**&lt;/span&gt;

&lt;span class="c"&gt;# Language
&lt;/span&gt;&lt;span class="py"&gt;sonar.language&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ts&lt;/span&gt;

&lt;span class="c"&gt;# Encoding
&lt;/span&gt;&lt;span class="py"&gt;sonar.sourceEncoding&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;UTF-8&lt;/span&gt;

&lt;span class="c"&gt;# TypeScript specific
&lt;/span&gt;&lt;span class="py"&gt;sonar.typescript.node&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;node&lt;/span&gt;

&lt;span class="c"&gt;# Coverage report paths
&lt;/span&gt;&lt;span class="py"&gt;sonar.javascript.lcov.reportPaths&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;coverage/lcov.info&lt;/span&gt;
&lt;span class="py"&gt;sonar.coverage.exclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/__tests__/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/__mocks__/**,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.test.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.test.tsx,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.spec.ts,&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;**/*.spec.tsx&lt;/span&gt;

&lt;span class="c"&gt;# Disable external issues
&lt;/span&gt;&lt;span class="py"&gt;sonar.typescript.internal.typescriptLocation&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;node_modules/typescript&lt;/span&gt;

&lt;span class="c"&gt;# Host URL
&lt;/span&gt;&lt;span class="py"&gt;sonar.host.url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;http://localhost:9000&lt;/span&gt;

&lt;span class="c"&gt;# Authentication token (add after generating)
# sonar.login=your-token-here
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Update .gitignore
&lt;/h3&gt;

&lt;p&gt;Add to your &lt;code&gt;.gitignore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# SonarQube
.scannerwork/
.sonarqube/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Start SonarQube
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start Docker Desktop first&lt;/span&gt;
open &lt;span class="nt"&gt;-a&lt;/span&gt; Docker

&lt;span class="c"&gt;# Start SonarQube server&lt;/span&gt;
yarn sonar:start

&lt;span class="c"&gt;# Wait 1-2 minutes, then check logs&lt;/span&gt;
yarn sonar:logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Generate Authentication Token
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="http://localhost:9000" rel="noopener noreferrer"&gt;http://localhost:9000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Login with &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change password when prompted&lt;/li&gt;
&lt;li&gt;Go to Profile Icon → My Account → Security&lt;/li&gt;
&lt;li&gt;Generate token:

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;local-scanner&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Type: &lt;code&gt;Global Analysis Token&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Copy the token immediately!&lt;/li&gt;
&lt;/ol&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%2F1a8wj9tpmca19pc6yqu2.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%2F1a8wj9tpmca19pc6yqu2.png" alt=" " width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Add Token to Configuration
&lt;/h3&gt;

&lt;p&gt;Edit &lt;code&gt;sonar-project.properties&lt;/code&gt; and uncomment the last line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;sonar.login&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your-generated-token-here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Install &lt;a href="https://www.npmjs.com/package/sonarqube-scanner" rel="noopener noreferrer"&gt;Sonar Scanner&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @sonar/scan
&lt;span class="c"&gt;# or&lt;/span&gt;
yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; @sonar/scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9. Run Your First Scan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run tests with coverage&lt;/span&gt;
yarn &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--coverage&lt;/span&gt;

&lt;span class="c"&gt;# Run SonarQube analysis&lt;/span&gt;
yarn sonar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;View results at &lt;a href="http://localhost:9000" rel="noopener noreferrer"&gt;http://localhost:9000&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Daily Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start server (if not running)&lt;/span&gt;
yarn sonar:start

&lt;span class="c"&gt;# After making code changes&lt;/span&gt;
yarn &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--coverage&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; yarn sonar

&lt;span class="c"&gt;# View results at http://localhost:9000&lt;/span&gt;

&lt;span class="c"&gt;# Stop server when done&lt;/span&gt;
yarn sonar:stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Configuration for Different Projects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For Node.js/Express Backend:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;sonar.sources&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;
&lt;span class="py"&gt;sonar.tests&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;
&lt;span class="py"&gt;sonar.test.inclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;**/*.test.js,**/*.spec.js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For React Native:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;sonar.sources&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;
&lt;span class="py"&gt;sonar.tests&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;__tests__&lt;/span&gt;
&lt;span class="py"&gt;sonar.exclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;**/android/**,**/ios/**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Issues
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker not running:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open &lt;span class="nt"&gt;-a&lt;/span&gt; Docker
&lt;span class="c"&gt;# Wait 30 seconds, then retry&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Port 9000 in use:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :9000
&lt;span class="c"&gt;# Kill the process or change port in docker-compose.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Authentication error:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify token in sonar-project.properties&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;sonar-project.properties | &lt;span class="nb"&gt;grep &lt;/span&gt;sonar.login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What Gets Analyzed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Code quality issues&lt;/li&gt;
&lt;li&gt;Potential bugs&lt;/li&gt;
&lt;li&gt;Security vulnerabilities
&lt;/li&gt;
&lt;li&gt;Test coverage&lt;/li&gt;
&lt;li&gt;Duplicate code&lt;/li&gt;
&lt;li&gt;Complexity metrics&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Benefits
&lt;/h2&gt;

&lt;p&gt;✅ Catch bugs before production&lt;br&gt;&lt;br&gt;
✅ Improve code maintainability&lt;br&gt;&lt;br&gt;
✅ Track test coverage&lt;br&gt;&lt;br&gt;
✅ Enforce coding standards&lt;br&gt;&lt;br&gt;
✅ Identify security issues early  &lt;/p&gt;




&lt;h2&gt;
  
  
  Useful Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn sonar:start   &lt;span class="c"&gt;# Start server&lt;/span&gt;
yarn sonar:stop    &lt;span class="c"&gt;# Stop server&lt;/span&gt;
yarn sonar:down    &lt;span class="c"&gt;# Stop and remove containers&lt;/span&gt;
yarn sonar:logs    &lt;span class="c"&gt;# View logs&lt;/span&gt;
yarn sonar         &lt;span class="c"&gt;# Run analysis&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Keep SonarQube running in the background and scan your code regularly to maintain high-quality standards.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.sonarqube.org/" rel="noopener noreferrer"&gt;SonarQube Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/products/docker-desktop" rel="noopener noreferrer"&gt;Docker Desktop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>react</category>
      <category>nextjs</category>
      <category>node</category>
    </item>
    <item>
      <title>🧹 How I Freed Up Half My Mac Storage Safely as a React Native Developer</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Sun, 19 Oct 2025 16:40:59 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/how-i-freed-up-half-my-mac-storage-as-a-react-native-developer-8fj</link>
      <guid>https://dev.to/ajmal_hasan/how-i-freed-up-half-my-mac-storage-as-a-react-native-developer-8fj</guid>
      <description>&lt;p&gt;As a React Native developer, I constantly build for both &lt;strong&gt;iOS&lt;/strong&gt; and &lt;strong&gt;Android&lt;/strong&gt;, which means my machine takes a beating from &lt;strong&gt;Xcode, simulators, Gradle builds, node modules, and caches&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Recently, I noticed that my 512GB SSD was nearly full — and when I checked, &lt;strong&gt;Xcode alone was consuming over 85 GB&lt;/strong&gt;! 😱&lt;/p&gt;

&lt;p&gt;So, I decided to do a full cleanup.&lt;br&gt;
After running a few terminal commands and deleting unneeded build data, I freed up &lt;strong&gt;half my disk space&lt;/strong&gt;. Here’s what I did 👇&lt;/p&gt;


&lt;h3&gt;
  
  
  💣 The Hidden Storage Hogs
&lt;/h3&gt;
&lt;h4&gt;
  
  
  🧩 1. &lt;strong&gt;Xcode Build Data &amp;amp; Indexes&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;These files rebuild every time you open or compile a project — so it’s completely safe to delete them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/Xcode/DerivedData
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  📦 2. &lt;strong&gt;Old Archives&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Old &lt;code&gt;.xcarchive&lt;/code&gt; files pile up with every TestFlight or App Store build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/Xcode/Archives/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  🔍 3. &lt;strong&gt;DeviceSupport Files&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Every time you connect an iPhone or test a new iOS version, Xcode downloads symbol data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/Xcode/iOS&lt;span class="se"&gt;\ &lt;/span&gt;DeviceSupport/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  📱 4. &lt;strong&gt;Simulator Devices &amp;amp; Cache&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Each simulator keeps its own storage, logs, and app data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/CoreSimulator/Devices/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/CoreSimulator/Caches/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also remove unused runtimes from&lt;br&gt;
&lt;strong&gt;Simulator → Settings → Runtimes&lt;/strong&gt; or&lt;br&gt;
&lt;strong&gt;Window → Devices and Runtimes → Delete unused devices&lt;/strong&gt;.&lt;/p&gt;


&lt;h4&gt;
  
  
  ⚡ 5. &lt;strong&gt;Xcode Cache&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Recreated automatically after you relaunch Xcode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Caches/com.apple.dt.Xcode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ⚙️ React Native &amp;amp; Node Cleanup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🌀 6. &lt;strong&gt;Metro &amp;amp; Watchman Caches&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;watchman watch-del-all 2&amp;gt;/dev/null
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Caches/metro&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Metro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  📦 7. &lt;strong&gt;npm / yarn / pnpm Cache&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm cache clean &lt;span class="nt"&gt;--force&lt;/span&gt;
yarn cache clean
pnpm store prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  💡 8. &lt;strong&gt;Project &lt;code&gt;node_modules&lt;/code&gt; (Optional)&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; node_modules &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🍫 CocoaPods (for iOS builds)
&lt;/h3&gt;

&lt;p&gt;Caches dependencies that can be safely redownloaded.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Caches/CocoaPods
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.cocoapods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🤖 Android / Java Cleanup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ⚙️ 9. &lt;strong&gt;Gradle Caches &amp;amp; Build Artifacts&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.gradle/caches
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.gradle/daemon
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.android/build-cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete unused &lt;strong&gt;AVDs (emulators)&lt;/strong&gt; from&lt;br&gt;
&lt;strong&gt;Android Studio → Device Manager&lt;/strong&gt;&lt;br&gt;
and unused &lt;strong&gt;system images&lt;/strong&gt; via &lt;strong&gt;SDK Manager&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧰 10. &lt;strong&gt;Other Optional Cleanups&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Homebrew cleanup&lt;/span&gt;
brew cleanup &lt;span class="nt"&gt;-s&lt;/span&gt;

&lt;span class="c"&gt;# CocoaPods Specs repo&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.cocoapods/repos

&lt;span class="c"&gt;# Xcode docs&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Developer/Shared/Documentation/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧩 Project-Level Cleanup Command (Run on projects that you are not working on)
&lt;/h2&gt;

&lt;p&gt;For day-to-day development cleanup, I also added this handy script inside my &lt;strong&gt;package.json&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cleanBuild"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rm -rf .jso node_modules Gemfile.lock &amp;amp;&amp;amp; cd ios &amp;amp;&amp;amp; rm -rf build Pods .xcode.env.local Podfile.lock &amp;amp;&amp;amp; cd .. &amp;amp;&amp;amp; cd android &amp;amp;&amp;amp; rm -rf build .gradle &amp;amp;&amp;amp; cd app &amp;amp;&amp;amp; rm -rf development build .cxx &amp;amp;&amp;amp; cd .. &amp;amp;&amp;amp; cd .."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I can simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run cleanBuild
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn cleanBuild
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to completely wipe build artifacts for both iOS and Android.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ The Results
&lt;/h3&gt;

&lt;p&gt;After deleting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DerivedData (85+ GB)&lt;/li&gt;
&lt;li&gt;Old simulator data (10+ GB)&lt;/li&gt;
&lt;li&gt;CocoaPods and Gradle caches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My system went from &lt;strong&gt;almost full to over 50% free space&lt;/strong&gt;.&lt;br&gt;
Xcode now opens faster, simulators load instantly, and builds are cleaner.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧠 Pro Tip: Automate It
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;clean-dev-space.sh&lt;/code&gt; and add all the commands above.&lt;br&gt;
Then simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash clean-dev-space.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🚀 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;If you’re a React Native developer juggling iOS and Android, your Mac silently collects &lt;strong&gt;tens of gigabytes of temporary build data&lt;/strong&gt; every month.&lt;br&gt;
Cleaning up regularly not only saves space but also improves build speed and performance.&lt;/p&gt;

&lt;p&gt;I freed up half my storage with a few terminal commands — and now my Mac feels brand new again. ✨&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>ios</category>
      <category>android</category>
      <category>mac</category>
    </item>
    <item>
      <title>React Native ESLint 9 Setup: Complete Guide with VSCode Integration, Husky Pre-commit Hooks, Prettier, and CI/CD</title>
      <dc:creator>Ajmal Hasan</dc:creator>
      <pubDate>Wed, 24 Sep 2025 20:06:11 +0000</pubDate>
      <link>https://dev.to/ajmal_hasan/eslint-prettier-setup-for-latest-react-native-with-typescript-17do</link>
      <guid>https://dev.to/ajmal_hasan/eslint-prettier-setup-for-latest-react-native-with-typescript-17do</guid>
      <description>&lt;h2&gt;
  
  
  📦 Install All Dependencies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Core ESLint dependencies&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; eslint @eslint/js globals typescript-eslint

&lt;span class="c"&gt;# React and React Native plugins&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-native

&lt;span class="c"&gt;# Prettier integration&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; prettier eslint-config-prettier

&lt;span class="c"&gt;# Husky and lint-staged for pre-commit hooks&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; husky lint-staged

&lt;span class="c"&gt;# Additional helpful tools&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; @types/node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ File Creation (Step by Step)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create ESLint Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;eslint.config.mjs&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@eslint/js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;globals&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;tseslint&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript-eslint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;pluginReact&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint-plugin-react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;pluginReactHooks&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint-plugin-react-hooks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;pluginReactNative&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint-plugin-react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;ignores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node_modules/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;android/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ios/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;build/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dist/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;tseslint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;pluginReact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;__DEV__&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;readonly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;readonly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;__filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;readonly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;ecmaVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;latest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;sourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;parserOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;ecmaFeatures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;jsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-hooks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pluginReactHooks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pluginReactNative&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// React Native&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/no-unused-styles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/split-platform-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/no-inline-styles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/no-color-literals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/no-single-element-style-arrays&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;// React Hooks&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-hooks/rules-of-hooks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-hooks/exhaustive-deps&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Disabled for ESLint 9 compatibility&lt;/span&gt;

      &lt;span class="c1"&gt;// React&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react/react-in-jsx-scope&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react/prop-types&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react/display-name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;// General&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-console&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-debugger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-unused-vars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prefer-const&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-var&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-duplicate-imports&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;max-lines&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;skipBlankLines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;react&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;detect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Create Prettier Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.prettierrc.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;semi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;singleQuote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tabWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;trailingComma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;all&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;printWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;bracketSpacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;arrowParens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;avoid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Create Prettier Ignore
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.prettierignore&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
android
ios
build
dist
coverage
*.snap
*.md
*.json
*.lock
*.log
.DS_Store
eslint.config.mjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Update Package.json Scripts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Add to &lt;code&gt;package.json&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint:fix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint . --fix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint:check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint . --max-warnings 0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prettier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prettier:check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --check ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write . &amp;amp;&amp;amp; eslint . --fix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prepare"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"husky install"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lint-staged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"*.{js,jsx,ts,tsx}"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"eslint --fix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Setup Husky Pre-commit Hooks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Initialize husky&lt;/span&gt;
yarn prepare

&lt;span class="c"&gt;# Add pre-commit hook&lt;/span&gt;
npx husky add .husky/pre-commit &lt;span class="s2"&gt;"npx lint-staged"&lt;/span&gt;

&lt;span class="c"&gt;# Add pre-push hook (optional)&lt;/span&gt;
npx husky add .husky/pre-push &lt;span class="s2"&gt;"yarn lint:check"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Create VSCode Settings
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.vscode/settings.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.codeActionsOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source.fixAll.eslint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"explicit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source.organizeImports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"explicit"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eslint.validate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"javascript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"javascriptreact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"typescript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"typescriptreact"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eslint.workingDirectories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typescript.preferences.organizeImportsIgnoreCase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typescript.preferences.includePackageJsonAutoImports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[javascript]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[javascriptreact]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[typescript]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[typescriptreact]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Create VSCode Extensions Recommendations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.vscode/extensions.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommendations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"dbaeumer.vscode-eslint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ms-vscode.vscode-typescript-next"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"bradlc.vscode-tailwindcss"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Create GitHub Actions Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;.github/workflows/lint.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Code Quality&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;lint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;yarn'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn install --frozen-lockfile&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn lint:check&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn prettier:check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚡ Quick Setup Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Install everything&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; eslint @eslint/js globals typescript-eslint eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-native prettier eslint-config-prettier husky lint-staged @types/node

&lt;span class="c"&gt;# 2. Initialize husky&lt;/span&gt;
yarn prepare

&lt;span class="c"&gt;# 3. Setup pre-commit hooks&lt;/span&gt;
npx husky add .husky/pre-commit &lt;span class="s2"&gt;"npx lint-staged"&lt;/span&gt;
npx husky add .husky/pre-push &lt;span class="s2"&gt;"yarn lint:check"&lt;/span&gt;

&lt;span class="c"&gt;# 4. Run initial format&lt;/span&gt;
yarn format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎯 VSCode Integration Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-fix on save&lt;/strong&gt;: ESLint fixes applied automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format on save&lt;/strong&gt;: Prettier formatting on file save&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import organization&lt;/strong&gt;: Auto-organize imports on save&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time linting&lt;/strong&gt;: Inline error/warning indicators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick fixes&lt;/strong&gt;: Ctrl/Cmd+. for fix suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📋 Essential VSCode Extensions
&lt;/h2&gt;

&lt;p&gt;Install these extensions for full functionality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ESLint&lt;/strong&gt; (dbaeumer.vscode-eslint)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prettier&lt;/strong&gt; (esbenp.prettier-vscode)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript Importer&lt;/strong&gt; (pmneo.tsimporter)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 Usage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lint all files&lt;/strong&gt;: &lt;code&gt;yarn lint&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix auto-fixable issues&lt;/strong&gt;: &lt;code&gt;yarn lint:fix&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check for any issues&lt;/strong&gt;: &lt;code&gt;yarn lint:check&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format all files&lt;/strong&gt;: &lt;code&gt;yarn prettier&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format and fix&lt;/strong&gt;: &lt;code&gt;yarn format&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚠️ Known Issues
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-hooks/exhaustive-deps&lt;/code&gt; disabled due to ESLint 9 compatibility&lt;/li&gt;
&lt;li&gt;Will be re-enabled when plugin updates for ESLint 9&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Post-Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Delete any old &lt;code&gt;.eslintrc.*&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Restart VSCode for settings to take effect&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;yarn format&lt;/code&gt; to format existing code&lt;/li&gt;
&lt;li&gt;Commit changes to trigger pre-commit hooks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This setup provides a complete, production-ready linting environment with VSCode integration and automated quality checks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Additionally integrate SonarQube for code report:&lt;br&gt;
&lt;a href="https://dev.to/ajmal_hasan/setting-up-sonarqube-locally-for-react-native-mern-projects-3hgn"&gt;https://dev.to/ajmal_hasan/setting-up-sonarqube-locally-for-react-native-mern-projects-3hgn&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>reactnative</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
