<?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: Hamza Amir</title>
    <description>The latest articles on DEV Community by Hamza Amir (@hamza_amir).</description>
    <link>https://dev.to/hamza_amir</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%2F3938164%2F217c0b51-f8b0-4107-8849-21e6c4af1683.jpg</url>
      <title>DEV Community: Hamza Amir</title>
      <link>https://dev.to/hamza_amir</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hamza_amir"/>
    <language>en</language>
    <item>
      <title>How LLMs Actually Work</title>
      <dc:creator>Hamza Amir</dc:creator>
      <pubDate>Thu, 30 Jul 2026 11:20:07 +0000</pubDate>
      <link>https://dev.to/hamza_amir/how-llms-actually-work-4ihi</link>
      <guid>https://dev.to/hamza_amir/how-llms-actually-work-4ihi</guid>
      <description>&lt;p&gt;Every large language model you use today, GPT, Claude, Gemini, Llama, is built on one core invention: the &lt;strong&gt;Transformer&lt;/strong&gt;. It came from a 2017 Google paper called &lt;em&gt;Attention Is All You Need&lt;/em&gt;. Before that paper, models read text one word at a time, in order, using recurrent networks (RNNs and LSTMs). That was slow and made it hard to connect words that were far apart in a sentence.&lt;/p&gt;

&lt;p&gt;The Transformer removed recurrence entirely and replaced it with &lt;strong&gt;attention&lt;/strong&gt;, a mechanism that lets every word look at every other word at the same time. That single change is why modern LLMs can be trained on massive datasets in parallel and why they handle long, complex text so well.&lt;/p&gt;

&lt;p&gt;This article walks through the full pipeline, from raw text to predicted output, in the order data actually flows through a model.&lt;/p&gt;




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

&lt;p&gt;Before the details, here is the full journey a sentence takes through an LLM:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tokenization&lt;/strong&gt; – break text into small chunks (tokens)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector Embedding&lt;/strong&gt; – turn each token into a list of numbers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Positional Encoding&lt;/strong&gt; – add information about word order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Attention&lt;/strong&gt; – let each token look at other tokens for context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Head Attention&lt;/strong&gt; – run several attention patterns in parallel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feed-Forward Network&lt;/strong&gt; – process each token's information further&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add &amp;amp; Norm (residual connections)&lt;/strong&gt; – stabilize and preserve information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack layers (Encoder / Decoder)&lt;/strong&gt; – repeat the above N times for depth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linear + Softmax&lt;/strong&gt; – convert the final vectors into word probabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sampling / Generation&lt;/strong&gt; – pick the next word and repeat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything below explains each of these steps in detail.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Tokenization: Turning Text Into Pieces
&lt;/h2&gt;

&lt;p&gt;A model cannot read raw text. It needs numbers. The first step is to split a sentence into &lt;strong&gt;tokens&lt;/strong&gt;, which are usually not full words. Modern LLMs use subword tokenization methods such as Byte-Pair Encoding (BPE) or WordPiece.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input text:  "unbelievable results"
Tokens:      ["un", "believ", "able", " results"]
Token IDs:   [4521, 8832, 219, 991]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why subwords instead of whole words? Two reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vocabulary size stays manageable.&lt;/strong&gt; A model does not need a separate entry for every possible word, including rare ones, typos, or made-up words. It can build them from smaller pieces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unknown words are never a dead end.&lt;/strong&gt; Even a word the model has never seen can be broken into familiar subword pieces.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original Transformer paper used Byte-Pair Encoding with a vocabulary of around 37,000 tokens for English-German translation, and word-piece encoding with a 32,000-token vocabulary for English-French. Today's LLMs use similar ideas but with larger vocabularies, often 50,000 to 100,000+ tokens.&lt;/p&gt;

&lt;p&gt;Once tokenized, each token is mapped to a unique integer ID using a lookup vocabulary. That ID is what enters the model.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Vector Embeddings: Giving Tokens Meaning
&lt;/h2&gt;

&lt;p&gt;A token ID like &lt;code&gt;4521&lt;/code&gt; is just a label. It carries no meaning by itself. The next step converts each token ID into a &lt;strong&gt;vector embedding&lt;/strong&gt;, a list of numbers (commonly 512, 768, 4096, or more dimensions depending on model size) that captures the token's meaning in a mathematical space.&lt;/p&gt;

&lt;p&gt;This mapping is learned during training. Tokens with similar meanings end up with similar vectors. That is why, in embedding space, the vector for "king" minus "man" plus "woman" lands close to the vector for "queen." The model is not memorizing definitions, it is learning relationships from patterns in massive amounts of text.&lt;/p&gt;

&lt;p&gt;In the original Transformer, the embedding dimension was called &lt;code&gt;d_model&lt;/code&gt; and set to 512 for the base model. The same weight matrix was shared between the input embedding layer, the output embedding layer, and the final linear layer before the output probabilities. This means the model has one consistent way to translate between tokens and vectors, coming and going.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Positional Encoding: Restoring Word Order
&lt;/h2&gt;

&lt;p&gt;Here is a subtle problem. Self-attention (explained next) looks at all tokens simultaneously, with no built-in sense of order. But word order clearly matters: "the dog bit the man" and "the man bit the dog" use identical words in a different order with a completely different meaning.&lt;/p&gt;

&lt;p&gt;To fix this, the Transformer adds a &lt;strong&gt;positional encoding&lt;/strong&gt; vector to each token's embedding before it enters the network. This encoding is built from sine and cosine waves of different frequencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;PE(position, 2i)   = sin(position / 10000&lt;span class="p"&gt;^&lt;/span&gt;(2i / d&lt;span class="p"&gt;_&lt;/span&gt;model))
PE(position, 2i+1) = cos(position / 10000&lt;span class="p"&gt;^&lt;/span&gt;(2i / d&lt;span class="p"&gt;_&lt;/span&gt;model))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each dimension of the encoding corresponds to a wave of a different frequency, so every position in the sequence gets a unique signature. The authors chose sine and cosine waves specifically because they let the model learn to attend to relative positions easily, and because the pattern can, in theory, generalize to sequence lengths longer than anything seen in training.&lt;/p&gt;

&lt;p&gt;Some newer models use learned positional embeddings instead of fixed sine/cosine ones. The original paper tested both and found they performed almost identically.&lt;/p&gt;

&lt;p&gt;At this point, each token is represented by: &lt;code&gt;embedding vector + positional encoding&lt;/code&gt;. This combined vector is what flows into the attention layers.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Self-Attention: The Core Idea
&lt;/h2&gt;

&lt;p&gt;This is the heart of the Transformer. Self-attention lets every token in a sequence look at every other token and decide how much to "pay attention" to it when building its own updated representation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Query, Key, Value (Q, K, V)
&lt;/h3&gt;

&lt;p&gt;Every token produces three vectors, all learned through separate weight matrices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Query (Q):&lt;/strong&gt; what this token is looking for&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key (K):&lt;/strong&gt; what this token offers, as a label others can search against&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value (V):&lt;/strong&gt; the actual content this token contributes if selected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple way to picture it: think of a search engine. Your search term is the Query. Every document in the index has a Key (title, tags, description). The engine compares your Query against all Keys to find matches, then returns the Values (the actual documents) weighted by how well they matched.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scaled Dot-Product Attention
&lt;/h3&gt;

&lt;p&gt;The formula from the paper is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Attention(Q, K, V) = softmax( (Q · K&lt;span class="p"&gt;^&lt;/span&gt;T) / sqrt(d&lt;span class="p"&gt;_&lt;/span&gt;k) ) · V
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step by step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take the dot product of the Query with every Key. This produces a raw compatibility score between the current token and every other token.&lt;/li&gt;
&lt;li&gt;Divide by the square root of the key dimension (&lt;code&gt;d_k&lt;/code&gt;). This scaling step keeps the numbers from growing too large, which would otherwise push the softmax function into regions with extremely small gradients and slow down learning.&lt;/li&gt;
&lt;li&gt;Apply softmax to turn the scores into a probability distribution that sums to 1. These are the attention weights.&lt;/li&gt;
&lt;li&gt;Multiply those weights by the Value vectors and sum them up. The result is a new vector for this token that blends in information from every other token, weighted by relevance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every word ends up with a new representation that reflects its context, not just its isolated meaning. This is how a model figures out that "bank" means something different in "river bank" versus "savings bank," purely from what surrounds it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Masked Self-Attention
&lt;/h3&gt;

&lt;p&gt;When a model generates text, it should not be able to "cheat" by looking at future words it hasn't produced yet. To prevent this, the decoder uses &lt;strong&gt;masked self-attention&lt;/strong&gt;: positions are only allowed to attend to earlier positions, not later ones. This is done by setting the attention score for any future position to negative infinity before the softmax step, which makes its weight effectively zero. Combined with shifting the output sequence by one position, this guarantees that a prediction for a given position depends only on the known outputs before it. This is what makes the model &lt;strong&gt;autoregressive&lt;/strong&gt;, generating one token at a time based only on what came before.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Multi-Head Attention: Many Perspectives at Once
&lt;/h2&gt;

&lt;p&gt;A single attention calculation only captures one type of relationship at a time. Multi-head attention runs several attention operations in parallel, each with its own learned Q, K, and V projection matrices, so the model can capture different kinds of relationships simultaneously: one head might track grammatical structure, another might track long-distance references, another might track sentiment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;MultiHead(Q, K, V) = Concat(head&lt;span class="p"&gt;_&lt;/span&gt;1, ..., head&lt;span class="p"&gt;_&lt;/span&gt;h) · W&lt;span class="p"&gt;_&lt;/span&gt;O
where head&lt;span class="p"&gt;_&lt;/span&gt;i = Attention(Q·W&lt;span class="p"&gt;_&lt;/span&gt;i&lt;span class="p"&gt;^&lt;/span&gt;Q, K·W&lt;span class="p"&gt;_&lt;/span&gt;i&lt;span class="p"&gt;^&lt;/span&gt;K, V·W&lt;span class="p"&gt;_&lt;/span&gt;i&lt;span class="p"&gt;^&lt;/span&gt;V)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The original Transformer used 8 attention heads (&lt;code&gt;h = 8&lt;/code&gt;), each working on a 64-dimensional slice (&lt;code&gt;d_k = d_v = 64&lt;/code&gt;), so the total dimensionality across all heads matched the model's overall size of 512. The outputs of all heads are concatenated and passed through one more linear projection to produce the final result.&lt;/p&gt;

&lt;p&gt;The paper found this mattered a lot: using just a single attention head performed noticeably worse, since averaging inhibits the model's ability to represent different types of relationships. But too many heads also hurt quality, since each head then works with too little dimensional space to be useful.&lt;/p&gt;

&lt;p&gt;The Transformer uses multi-head attention in three distinct places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encoder self-attention:&lt;/strong&gt; every input token attends to every other input token&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Masked decoder self-attention:&lt;/strong&gt; every output token attends only to earlier output tokens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encoder-decoder (cross) attention:&lt;/strong&gt; each decoder token attends to the full encoder output, letting the decoder pull relevant information from the input sequence while generating&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Feed-Forward Network
&lt;/h2&gt;

&lt;p&gt;After attention, each token's vector passes through a small, fully connected feed-forward network, applied identically and independently to each position:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;FFN(x) = max(0, x·W1 + b1)·W2 + b2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is two linear layers with a ReLU activation in between. In the base Transformer, the input and output are 512-dimensional, but the hidden layer in between expands to 2048 dimensions before compressing back down. This gives the model extra capacity to process and transform the information that attention just gathered, on a per-token basis. Attention handles mixing information &lt;em&gt;between&lt;/em&gt; tokens; the feed-forward layer handles processing information &lt;em&gt;within&lt;/em&gt; each token.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Add &amp;amp; Norm: Residual Connections and Layer Normalization
&lt;/h2&gt;

&lt;p&gt;Around both the attention sub-layer and the feed-forward sub-layer, the Transformer applies a &lt;strong&gt;residual connection&lt;/strong&gt;: the input to the sub-layer is added back to its output, followed by &lt;strong&gt;layer normalization&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Output = LayerNorm(x + Sublayer(x))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters for two practical reasons. First, residual connections let gradients flow more easily through deep networks during training, which prevents the vanishing gradient problems that plagued earlier deep architectures. Second, layer normalization keeps the scale of values consistent as data passes through many stacked layers, which stabilizes training.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Stacking It All: Encoder and Decoder
&lt;/h2&gt;

&lt;p&gt;A single attention + feed-forward block is called a &lt;strong&gt;layer&lt;/strong&gt;. The Transformer stacks several identical layers on top of each other, N = 6 in the original paper, to build depth. Each layer refines the representation a little further.&lt;/p&gt;

&lt;h3&gt;
  
  
  Encoder
&lt;/h3&gt;

&lt;p&gt;The encoder's job is to build a rich understanding of the input sequence. Each encoder layer has two sub-layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Multi-head self-attention (every input token looks at every other input token)&lt;/li&gt;
&lt;li&gt;Position-wise feed-forward network&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Decoder
&lt;/h3&gt;

&lt;p&gt;The decoder's job is to generate the output sequence, one token at a time, using both what it has generated so far and the encoder's understanding of the input. Each decoder layer has three sub-layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Masked multi-head self-attention (only looks at earlier output tokens)&lt;/li&gt;
&lt;li&gt;Encoder-decoder cross-attention (looks at the encoder's output)&lt;/li&gt;
&lt;li&gt;Position-wise feed-forward network&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This encoder-decoder structure is what the original paper used for machine translation. Most modern LLMs (GPT-style models) are &lt;strong&gt;decoder-only&lt;/strong&gt;: they drop the separate encoder and just stack masked self-attention decoder blocks, since their job is pure text generation rather than translating between two sequences. Models like BERT are &lt;strong&gt;encoder-only&lt;/strong&gt;, built for understanding text rather than generating it.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Linear + Softmax: From Vectors to Word Probabilities
&lt;/h2&gt;

&lt;p&gt;After the final decoder layer, the model has a vector for the next token position. This vector is passed through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;linear layer&lt;/strong&gt; that projects it into a score for every single word in the vocabulary (tens of thousands of numbers, one per possible token)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;softmax function&lt;/strong&gt; that converts those raw scores into probabilities that sum to 1&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a full probability distribution over the entire vocabulary: how likely each possible next token is, given everything the model has seen so far.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Generation: How the Model Actually Writes Text
&lt;/h2&gt;

&lt;p&gt;At inference time (when you chat with an LLM), the process becomes a loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The model looks at all tokens so far and predicts a probability distribution for the next token.&lt;/li&gt;
&lt;li&gt;A token is picked from that distribution. This can be the single most likely token (greedy decoding) or a token sampled according to the probabilities with some randomness (which is why the same prompt can give different answers, controlled by a setting often called "temperature").&lt;/li&gt;
&lt;li&gt;That chosen token is appended to the sequence.&lt;/li&gt;
&lt;li&gt;The whole sequence, now one token longer, is fed back into the model to predict the next token.&lt;/li&gt;
&lt;li&gt;This repeats until the model produces a stop signal or hits a length limit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why LLMs generate text one piece at a time and why longer responses take proportionally longer to produce: each new token requires another full pass through the model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Architecture Won
&lt;/h2&gt;

&lt;p&gt;The Transformer paper measured three things that mattered for training large models efficiently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Computational complexity per layer:&lt;/strong&gt; self-attention connects any two positions in a constant number of operations, while recurrent networks need a number of sequential steps proportional to sequence length.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallelization:&lt;/strong&gt; because self-attention has no step-by-step dependency like an RNN does, all tokens can be processed simultaneously on modern hardware like GPUs, drastically speeding up training.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path length between distant words:&lt;/strong&gt; in a recurrent network, information from word 1 has to pass through every word in between to reach word 100. In self-attention, any two words are directly connected in a single step, which makes it far easier to learn long-range relationships.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On real benchmarks, the Transformer did not just match previous state-of-the-art translation models, it beat them while training dramatically faster. The big Transformer model reached a BLEU score of 28.4 on English-to-German translation and 41.8 on English-to-French, both new records at the time, while training in a few days on 8 GPUs rather than weeks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full Cheat Sheet Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Key Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tokenization&lt;/td&gt;
&lt;td&gt;Splits text into subword units&lt;/td&gt;
&lt;td&gt;Uses BPE / WordPiece, ~32K-100K+ vocabulary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embedding&lt;/td&gt;
&lt;td&gt;Converts tokens into meaning-carrying vectors&lt;/td&gt;
&lt;td&gt;Learned during training, similar meanings cluster together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Positional Encoding&lt;/td&gt;
&lt;td&gt;Injects word order information&lt;/td&gt;
&lt;td&gt;Sine/cosine waves of varying frequency added to embeddings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-Attention&lt;/td&gt;
&lt;td&gt;Lets each token gather context from others&lt;/td&gt;
&lt;td&gt;Uses Query, Key, Value vectors and scaled dot products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Masking&lt;/td&gt;
&lt;td&gt;Prevents seeing future tokens during generation&lt;/td&gt;
&lt;td&gt;Sets future attention scores to negative infinity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Head Attention&lt;/td&gt;
&lt;td&gt;Captures multiple relationship types at once&lt;/td&gt;
&lt;td&gt;8 heads in the original paper, each 64-dimensional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feed-Forward Network&lt;/td&gt;
&lt;td&gt;Processes each token's info independently&lt;/td&gt;
&lt;td&gt;Two linear layers with ReLU, expands then compresses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add &amp;amp; Norm&lt;/td&gt;
&lt;td&gt;Stabilizes deep stacks of layers&lt;/td&gt;
&lt;td&gt;Residual connection + layer normalization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoder&lt;/td&gt;
&lt;td&gt;Builds understanding of the input&lt;/td&gt;
&lt;td&gt;Self-attention + feed-forward, repeated N=6 times&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decoder&lt;/td&gt;
&lt;td&gt;Generates output tokens one at a time&lt;/td&gt;
&lt;td&gt;Masked self-attention + cross-attention + feed-forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linear + Softmax&lt;/td&gt;
&lt;td&gt;Turns final vector into word probabilities&lt;/td&gt;
&lt;td&gt;Produces a distribution over the whole vocabulary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sampling&lt;/td&gt;
&lt;td&gt;Picks the actual next word&lt;/td&gt;
&lt;td&gt;Greedy or probability-based sampling, then loops&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Transformer Architecture Diagram
&lt;/h2&gt;

&lt;p&gt;Below is the original architecture diagram from &lt;em&gt;Attention Is All You Need&lt;/em&gt;, showing the encoder (left stack) and decoder (right stack) side by side, with inputs flowing up from the bottom and output probabilities produced at the top.&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%2F32s8sr4wblrv3pxvbh5c.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%2F32s8sr4wblrv3pxvbh5c.png" alt="Transformer Architecture" width="721" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading it bottom to top: input tokens are embedded and combined with positional encoding, pass through N stacked encoder layers (masked multi-head attention, add &amp;amp; norm, feed-forward, add &amp;amp; norm), while the decoder stack does the same on the output side but adds a middle layer of cross-attention over the encoder's output. The final decoder output goes through a linear layer and softmax to produce output probabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source Material
&lt;/h2&gt;

&lt;p&gt;This article summarizes concepts from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href="https://arxiv.org/pdf/1706.03762" rel="noopener noreferrer"&gt;Attention Is All You Need&lt;/a&gt; – Vaswani et al., Google Brain / Google Research, 2017. The original paper that introduced the Transformer architecture, tested on English-to-German and English-to-French machine translation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video:&lt;/strong&gt; &lt;a href="https://www.youtube.com/watch?v=K45s2PgywvI" rel="noopener noreferrer"&gt;Transformer walkthrough&lt;/a&gt; – a visual explanation of the same architecture, useful for seeing the matrix operations and data flow described above in action.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quick Recap in One Paragraph
&lt;/h2&gt;

&lt;p&gt;Text gets broken into tokens, each token becomes a vector, and position information gets added so the model knows word order. Self-attention lets every token gather context from every other token using Query, Key, and Value vectors, and multi-head attention runs several of these attention patterns in parallel to capture different relationships. Feed-forward layers then process each token's information further, with residual connections and normalization keeping training stable across many stacked layers. Finally, a linear layer plus softmax turns the model's internal representation into a probability distribution over the vocabulary, and the model samples one token at a time, feeding its own output back in, to generate text. That loop, repeated one token at a time, is what "the LLM is typing" actually looks like under the hood.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
      <category>python</category>
    </item>
    <item>
      <title>AI Fluency: The Career Skill That Separates Operators from the Obsolete</title>
      <dc:creator>Hamza Amir</dc:creator>
      <pubDate>Fri, 26 Jun 2026 15:16:39 +0000</pubDate>
      <link>https://dev.to/hamza_amir/ai-fluency-the-career-skill-that-separates-operators-from-the-obsolete-1i2h</link>
      <guid>https://dev.to/hamza_amir/ai-fluency-the-career-skill-that-separates-operators-from-the-obsolete-1i2h</guid>
      <description>&lt;p&gt;&lt;em&gt;By Hamza Amir | June 2026&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction: Two Professionals, One Tool, Very Different Results
&lt;/h2&gt;

&lt;p&gt;Two marketing managers sit down with the same AI tool on the same Monday morning.&lt;/p&gt;

&lt;p&gt;The first types: &lt;em&gt;"Write me a product launch email."&lt;/em&gt; She gets a passable draft, skims it, pastes it into Outlook, and moves on. She tells her colleagues AI is "pretty useful sometimes."&lt;/p&gt;

&lt;p&gt;The second types something longer. He specifies a persona, a target audience, a tone constraint, a strategic goal, and a desired call-to-action structure. He reviews the output not as a finished product but as a first draft from a smart collaborator who needs direction. He iterates twice. The final email drives a 34% open rate.&lt;/p&gt;

&lt;p&gt;Same tool. Wildly different outcomes.&lt;/p&gt;

&lt;p&gt;That gap has a name: &lt;strong&gt;AI fluency&lt;/strong&gt;. And it is not the same thing as AI literacy.&lt;/p&gt;

&lt;p&gt;AI literacy means you know what large language models are, that ChatGPT exists, that "prompt engineering" is a phrase people use. It is awareness. It is the equivalent of knowing that spreadsheets exist.&lt;/p&gt;

&lt;p&gt;AI fluency is different. It is the ability to work &lt;em&gt;with&lt;/em&gt; AI as a creative and analytical partner: to understand how it reasons, where it fails, how to structure your requests for precision, and how to apply judgment to everything it produces. It is the difference between someone who knows Excel exists and someone who can build a financial model from scratch.&lt;/p&gt;

&lt;p&gt;The professionals who build this skill are not just getting more done. They are producing qualitatively different work. Those who do not build it are not standing still; they are falling behind people who are moving faster every quarter.&lt;/p&gt;

&lt;p&gt;This article is not a survey of AI tools. It is a practical framework for developing the fluency that actually changes your output.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 1: The Probabilistic Mindset — Thinking Like AI Thinks
&lt;/h2&gt;

&lt;p&gt;Before you can work well with an AI system, you need to understand what it actually is. Not at a research-paper level. At a &lt;em&gt;practical intuition&lt;/em&gt; level.&lt;/p&gt;

&lt;h3&gt;
  
  
  What an LLM Actually Does (Without the Jargon)
&lt;/h3&gt;

&lt;p&gt;Here is a useful mental model: imagine every book, article, forum thread, and document ever written has been turned into an enormous weather map of language patterns. When you type a sentence to an AI, it does not &lt;em&gt;search&lt;/em&gt; that map for the right answer. It &lt;em&gt;forecasts&lt;/em&gt; the most statistically probable continuation of your sentence given everything it has seen. It is not retrieving a fact the way a database retrieves a record. It is doing something closer to highly sophisticated pattern completion.&lt;/p&gt;

&lt;p&gt;This has a direct consequence: &lt;strong&gt;AI is not an oracle. It is a probability engine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it gives you a confident-sounding response, that confidence is not a signal that the information is correct. It is a signal that the response &lt;em&gt;pattern&lt;/em&gt; is common and coherent. Those are two very different things.&lt;/p&gt;

&lt;p&gt;A calculator gives you a wrong answer only if you give it wrong inputs. An LLM can give you a wrong answer even with perfect inputs, because "wrong" is not part of its objective function. It optimizes for coherence, not truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why the Calculator Analogy Fails You
&lt;/h3&gt;

&lt;p&gt;Most professionals who underuse AI are treating it like a calculator: input goes in, output comes out, task is done. This leads to three predictable failure modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The acceptance trap:&lt;/strong&gt; They take the first output at face value and stop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The single-shot mistake:&lt;/strong&gt; They write one vague prompt and, when the result is generic, conclude that "AI doesn't work for this."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The passivity problem:&lt;/strong&gt; They forget that the output is a starting point, not a solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Professionals who &lt;em&gt;overperform&lt;/em&gt; with AI treat it differently. They treat it like a brilliant but imperfect colleague who needs context, direction, and regular feedback. They iterate. They interrogate the output. They push back when something feels off.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fluency Shift in Practice
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Thinking like a calculator user:&lt;/strong&gt; &lt;em&gt;"I asked it to write my report and the draft was mediocre."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thinking like a fluent collaborator:&lt;/strong&gt; &lt;em&gt;"My first prompt was too vague. Let me rebuild it with clearer constraints, give it my existing outline, and ask it to match the register of the executive summary I already wrote."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The second person is not smarter. They just have a more accurate mental model of what they are working with.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 2: Conversational Mastery and Structured Prompting
&lt;/h2&gt;

&lt;p&gt;If AI fluency has a single highest-leverage skill, it is this: &lt;strong&gt;the ability to construct precise, structured prompts that constrain the model toward your actual goal.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vague prompts produce generic outputs. Not because the AI is lazy, but because vague prompts leave enormous probabilistic space, and the model fills that space with statistically average content.&lt;/p&gt;

&lt;p&gt;Structured prompts collapse that space. They force the model toward &lt;em&gt;your&lt;/em&gt; specific context, audience, and intent.&lt;/p&gt;

&lt;h3&gt;
  
  
  The RCCOS Framework
&lt;/h3&gt;

&lt;p&gt;One practical framework for professional prompts covers five dimensions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;R — Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Defines the persona the AI should operate from&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"Act as a senior product manager reviewing a go-to-market plan."&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C — Context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides the background the AI needs to reason accurately&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"The product is a B2B SaaS tool for logistics companies. Our primary competitor is [X]."&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C — Constraints&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sets the guardrails: tone, length, format, what to avoid&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"Write in plain language. No jargon. Under 300 words. Avoid bullet points."&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;O — Objective&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;States exactly what the output should accomplish&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"The goal is to convince a skeptical CFO to approve a pilot budget."&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S — Style/Structure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Defines how the output should be organized&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"Structure it as: opening hook, three supporting points, one clear ask."&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Not every prompt needs all five layers. A casual brainstorm prompt can stay light. A high-stakes deliverable warrants the full framework.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before and After: The Same Request, Two Very Different Results
&lt;/h3&gt;

&lt;p&gt;The difference between a weak and a structured prompt is not about using more words. It is about using &lt;em&gt;the right&lt;/em&gt; words.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;WEAK PROMPT:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write a LinkedIn post about our new product launch.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this produces:&lt;/strong&gt; A generic, enthusiasm-heavy paragraph with no specific audience, no differentiated value proposition, and a call-to-action that could apply to any product on earth.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;STRUCTURED PROMPT (RCCOS applied):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Role: You are a B2B content strategist who writes for senior operations leaders.

Context: We are launching a supply chain visibility platform called TrackFlow. 
It integrates with existing ERP systems and cuts average inventory reconciliation 
time by 40%. Our audience is VP-level operations and logistics decision-makers 
at mid-sized manufacturing companies.

Constraints: 
- Write in a direct, peer-to-peer tone. Not promotional. Not hype-driven.
- Max 200 words.
- No exclamation marks.
- Avoid buzzwords like "game-changing," "innovative," or "cutting-edge."
- Do not open with "Excited to announce."

Objective: The post should make a VP of Operations think: 
"This sounds like it solves a problem I actually have."

Output structure:
1. Open with a specific, relatable pain point (1–2 sentences).
2. Introduce the product as a solution, not a feature list (2–3 sentences).
3. Include the 40% stat naturally in context.
4. Close with a single, low-friction call to action.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;The structured version takes 90 seconds longer to write. It produces output that would take 30 minutes to write manually. That is the trade-off that fluent professionals understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Iteration Is Not a Sign of Failure
&lt;/h3&gt;

&lt;p&gt;One subtle mindset block worth naming: many professionals feel that needing to revise an AI output means the tool "didn't work." This is backwards. Revision is the workflow. The first output is raw material. The second and third prompts refine it.&lt;/p&gt;

&lt;p&gt;A fluent AI user builds a dialogue, not a transaction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 3: The Critical Guardrails — Privacy, IP, and the Hallucination Problem
&lt;/h2&gt;

&lt;p&gt;AI fluency is not only about getting more out of the tools. It is equally about knowing where the tools will hurt you if you are not paying attention.&lt;/p&gt;

&lt;p&gt;Three guardrails matter more than any others.&lt;/p&gt;

&lt;h3&gt;
  
  
  Guardrail 1: Data Privacy and What You Should Never Type
&lt;/h3&gt;

&lt;p&gt;Every time you paste content into a public AI interface, you are making a decision about data exposure. For most consumer-facing AI tools, inputs are used in various ways depending on the platform, the settings, and the terms of service at the time you use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical rule:&lt;/strong&gt; Treat a public AI chat window like a semipublic email thread. Anything you would not want leaving your organization, do not paste in.&lt;/p&gt;

&lt;p&gt;This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unreleased financial data or earnings figures&lt;/li&gt;
&lt;li&gt;Client-identifying information or personal data covered by privacy regulations (GDPR, HIPAA, etc.)&lt;/li&gt;
&lt;li&gt;Internal strategic plans, M&amp;amp;A discussions, or product roadmaps&lt;/li&gt;
&lt;li&gt;Proprietary code that constitutes competitive advantage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most enterprise AI deployments offer privacy controls and zero-data-retention settings. Know what your organization's approved tools are and use those for sensitive work. Using an unapproved tool for a shortcut is not a productivity win; it is a liability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Guardrail 2: Intellectual Property and the Ownership Question
&lt;/h3&gt;

&lt;p&gt;AI-generated content sits in a genuinely unsettled legal space as of 2026. Different jurisdictions treat AI-assisted work differently, and the rules are still evolving. What this means practically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work produced with AI assistance may have ambiguous copyright status. Be transparent with your organization about how you are using AI in deliverables.&lt;/li&gt;
&lt;li&gt;If the AI reproduces a substantial amount of text that closely mirrors a training source, you could be looking at IP risk. For high-stakes external documents (contracts, published content, regulated communications), run a plagiarism check on AI-generated drafts.&lt;/li&gt;
&lt;li&gt;Do not use AI to reproduce or closely paraphrase copyrighted frameworks, methodologies, or branded materials without checking first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest answer is that most internal use cases carry low risk. But external deliverables, published content, and anything legal or regulatory in nature warrant an extra review step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Guardrail 3: Hallucinations — How They Work and How to Catch Them
&lt;/h3&gt;

&lt;p&gt;"Hallucination" is the term used when an AI produces information that is fluent, formatted, and completely wrong. It might cite a study that does not exist, give you a statistic that is plausible but fabricated, or produce a quote attributed to someone who never said it.&lt;/p&gt;

&lt;p&gt;This happens because of the probabilistic nature described in Section 1. The model is not lying. It does not have a concept of lying. It is producing the most statistically coherent continuation of your prompt, and sometimes "most coherent" diverges from "factually accurate."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High-risk areas for hallucinations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specific statistics, percentages, or numerical claims&lt;/li&gt;
&lt;li&gt;Citations, academic papers, and named studies&lt;/li&gt;
&lt;li&gt;Legal specifics: case names, statute numbers, jurisdiction-specific rules&lt;/li&gt;
&lt;li&gt;Historical dates and biographical details about non-famous figures&lt;/li&gt;
&lt;li&gt;Recent events (models have knowledge cutoffs and can fill gaps with plausible-sounding fabrications)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A practical validation protocol for high-stakes outputs:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Flag every factual claim.&lt;/strong&gt; Read the output and mark every specific number, name, citation, or assertion with a check symbol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify the checkmarks.&lt;/strong&gt; Search each claim against a primary source. Do not use another AI tool to verify; that compounds the risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For citations, confirm the source exists first.&lt;/strong&gt; Search the exact title, author, and publication. If you cannot find it, it may not exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply domain knowledge.&lt;/strong&gt; If something feels slightly off, it probably is. Trust your expertise over AI confidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For regulated outputs, involve a human expert.&lt;/strong&gt; Medical, legal, financial, and compliance content needs professional review before it goes anywhere.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The professionals who get burned by AI hallucinations are almost always the ones who did not read the output critically because it &lt;em&gt;sounded&lt;/em&gt; authoritative. Fluency includes knowing when to slow down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: The 30-Day AI Fluency Blueprint
&lt;/h2&gt;

&lt;p&gt;AI fluency is not a credential. It is not a course you finish. It is a working habit built in increments, refined through practice, and measured by the quality of what you produce.&lt;/p&gt;

&lt;p&gt;The professionals who will look back on this period and say they used it well are the ones who built the habit now, while the majority is still deciding whether AI is "worth the hype."&lt;/p&gt;

&lt;p&gt;Here is a practical framework for the next 30 days.&lt;/p&gt;




&lt;h3&gt;
  
  
  Your 30-Day AI Fluency Blueprint
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Week 1: Build the Mental Model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read enough about how LLMs work to genuinely internalize the probabilistic framing from Section 1. You do not need a technical background. You need the right intuition.&lt;/li&gt;
&lt;li&gt;Pick one AI tool and commit to it for the month. Do not tool-hop.&lt;/li&gt;
&lt;li&gt;List five tasks in your current role that are repetitive, language-heavy, or require structured reasoning. These are your practice targets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 2: Master the Structured Prompt&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apply the RCCOS framework to every significant prompt this week. Yes, every one.&lt;/li&gt;
&lt;li&gt;Save your best-performing prompts in a personal prompt library (a simple document works fine). You will reuse and refine these over time.&lt;/li&gt;
&lt;li&gt;Run the "before and after" exercise from Section 2 on one real work deliverable. Compare the outputs honestly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 3: Build Your Verification Habit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For any AI output you plan to use externally or in a decision-making context, apply the five-step validation protocol from Section 3.&lt;/li&gt;
&lt;li&gt;Deliberately test the model's limits this week. Ask it questions you know the answer to. See where it gets things wrong. That calibration exercise is more valuable than any tutorial.&lt;/li&gt;
&lt;li&gt;Identify which tasks in your workflow carry hallucination risk and build a standing verification step into your process for those.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 4: Integrate and Systematize&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Document two or three AI-assisted workflows that genuinely saved you time or improved your output quality this month. Be specific about what changed.&lt;/li&gt;
&lt;li&gt;Share one insight or technique with a colleague. Teaching accelerates your own understanding.&lt;/li&gt;
&lt;li&gt;Identify one area where you tried AI and it did not help. Ask yourself whether the problem was the tool, the prompt, or the task type. That reflection is where fluency gets built.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;One final thought:&lt;/strong&gt; the professionals who will be most valuable in three years are not the ones who used AI the most. They are the ones who combined AI's throughput with their own judgment, context, and accountability.&lt;/p&gt;

&lt;p&gt;The tools do not replace those things. They amplify them. The ceiling on that amplification is how fluent you choose to become.&lt;/p&gt;




&lt;p&gt;Hamza.dev&lt;br&gt;
🌐 &lt;a href="http://www.hamzaamir.me" rel="noopener noreferrer"&gt;www.hamzaamir.me&lt;/a&gt;&lt;br&gt;
&lt;em&gt;© 2026. All rights reserved.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Selecting Your Frontend Foundation: React vs. Next.js</title>
      <dc:creator>Hamza Amir</dc:creator>
      <pubDate>Tue, 16 Jun 2026 08:52:55 +0000</pubDate>
      <link>https://dev.to/hamza_amir/selecting-your-frontend-foundation-react-vs-nextjs-3898</link>
      <guid>https://dev.to/hamza_amir/selecting-your-frontend-foundation-react-vs-nextjs-3898</guid>
      <description>&lt;p&gt;React and Next.js solve different problems. React gives you a library for building user interfaces. Next.js gives you a full framework built on top of React, with routing, rendering, and optimization included from the start.&lt;/p&gt;

&lt;p&gt;This article breaks down the strengths and weaknesses of each option, so you make the right choice for your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What React Gives You
&lt;/h2&gt;

&lt;p&gt;React, built by Meta, focuses on one job: rendering components based on state and props. Developers pick React for these strengths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Component-based structure. You build small, reusable pieces and combine them into full interfaces.&lt;/li&gt;
&lt;li&gt;A large ecosystem. Thousands of libraries support React, from state managers to UI kits.&lt;/li&gt;
&lt;li&gt;Flexibility. You choose your own router, bundler, and styling approach.&lt;/li&gt;
&lt;li&gt;A strong job market. Companies across every industry hire React developers.&lt;/li&gt;
&lt;li&gt;React 19 added the React Compiler, which optimizes re-renders automatically, along with Actions for handling async operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where React Falls Short
&lt;/h2&gt;

&lt;p&gt;React stops at the component layer. You handle everything else yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No built-in routing. You add React Router or a similar library to manage pages.&lt;/li&gt;
&lt;li&gt;No server rendering by default. Without extra setup, your page ships an empty HTML shell, and content fills in after JavaScript loads.&lt;/li&gt;
&lt;li&gt;Slower initial load on content-heavy pages, since users wait for JavaScript before seeing meaningful content.&lt;/li&gt;
&lt;li&gt;Weak default SEO. Search engine crawlers struggle to read content rendered only on the client.&lt;/li&gt;
&lt;li&gt;Manual configuration for bundling, image optimization, and code splitting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Next.js Adds
&lt;/h2&gt;

&lt;p&gt;Next.js, built by Vercel, takes React and wraps production features around it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File-based routing. Drop a file into the pages or app folder, and the route exists. You need no separate router library.&lt;/li&gt;
&lt;li&gt;Server-side rendering. The server builds full HTML for each request, so users see content the moment the page loads.&lt;/li&gt;
&lt;li&gt;Static site generation. Pages build once at deploy time and serve from a CDN, with load times under 100 milliseconds for many sites.&lt;/li&gt;
&lt;li&gt;Incremental static regeneration. Pages stay static but refresh in the background on a schedule you set, so content stays current without a full rebuild.&lt;/li&gt;
&lt;li&gt;Built-in API routes. Write backend logic in the same project, without a separate server.&lt;/li&gt;
&lt;li&gt;Automatic image optimization. The Image component resizes images and serves modern formats without manual work.&lt;/li&gt;
&lt;li&gt;React Server Components through the App Router. Components render on the server by default, cutting the JavaScript sent to the browser.&lt;/li&gt;
&lt;li&gt;Server Actions. Forms submit directly to server functions, removing the need for separate API endpoints.&lt;/li&gt;
&lt;li&gt;Wide adoption in production. Platforms like TikTok, Twitch, and Hulu run Next.js at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where Next.js Falls Short
&lt;/h2&gt;

&lt;p&gt;Next.js brings structure, and structure comes with tradeoffs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A steeper learning curve. New concepts like Server Components, caching layers, and the App Router take time to learn.&lt;/li&gt;
&lt;li&gt;Hosting requirements. Server-side rendering needs a Node server or serverless functions, not a plain static host.&lt;/li&gt;
&lt;li&gt;Opinionated conventions. You follow the file structure and rendering rules Next.js sets, with less room for a fully custom setup.&lt;/li&gt;
&lt;li&gt;Weaker fit for highly interactive apps. Real-time tools like chat apps or multiplayer games gain little from server rendering and add unneeded complexity.&lt;/li&gt;
&lt;li&gt;Migration cost. Moving an existing React app to Next.js takes planning and rewritten routing logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;th&gt;Next.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rendering&lt;/td&gt;
&lt;td&gt;Client-side by default&lt;/td&gt;
&lt;td&gt;Server-side, static, or hybrid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Routing&lt;/td&gt;
&lt;td&gt;Requires a separate library&lt;/td&gt;
&lt;td&gt;Built-in, file-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO&lt;/td&gt;
&lt;td&gt;Needs extra setup&lt;/td&gt;
&lt;td&gt;Strong out of the box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend logic&lt;/td&gt;
&lt;td&gt;Separate server required&lt;/td&gt;
&lt;td&gt;API routes included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image handling&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Automatic optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;Higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Any static host&lt;/td&gt;
&lt;td&gt;Node server or serverless platform&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When React Fits Best
&lt;/h2&gt;

&lt;p&gt;Pick plain React when your project sits behind a login and search engines never see the page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Admin dashboards and internal tools&lt;/li&gt;
&lt;li&gt;Authenticated SaaS products where SEO carries no weight&lt;/li&gt;
&lt;li&gt;Embedded widgets and small components added to existing sites&lt;/li&gt;
&lt;li&gt;Projects needing full control over the build pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When Next.js Fits Best
&lt;/h2&gt;

&lt;p&gt;Pick Next.js when speed, search visibility, and full-stack structure matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marketing sites, blogs, and documentation hubs that depend on search traffic&lt;/li&gt;
&lt;li&gt;E-commerce product pages, where load speed affects conversion&lt;/li&gt;
&lt;li&gt;Content platforms publishing many pages that benefit from static generation&lt;/li&gt;
&lt;li&gt;Projects needing both frontend and backend code in one codebase&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Your Decision
&lt;/h2&gt;

&lt;p&gt;Your project requirements decide the answer, not trends. If your page needs to load fast for an anonymous visitor and rank on search engines, Next.js gives you the tools without added setup. If your app sits behind a login screen and serves logged-in users only, plain React with a bundler like Vite keeps things simple.&lt;/p&gt;

&lt;p&gt;Most teams starting a new public-facing project in 2026 reach for Next.js first, then move to plain React only when a specific reason supports the switch.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>My Open Source Journey with VoiceyBill</title>
      <dc:creator>Hamza Amir</dc:creator>
      <pubDate>Sun, 07 Jun 2026 03:53:38 +0000</pubDate>
      <link>https://dev.to/hamza_amir/my-open-source-journey-with-voiceybill-53em</link>
      <guid>https://dev.to/hamza_amir/my-open-source-journey-with-voiceybill-53em</guid>
      <description>&lt;p&gt;&lt;strong&gt;By Hamza Amir · June 2026&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;There is a moment every developer knows — staring at a GitHub repository thinking, &lt;em&gt;"I wish I could contribute to this,"&lt;/em&gt; then quietly closing the tab. I did that for months. Then I stopped.&lt;/p&gt;

&lt;p&gt;This is how I landed &lt;strong&gt;3 merged and active pull requests&lt;/strong&gt; across two repositories of &lt;strong&gt;VoiceyBill&lt;/strong&gt; — a real-world, open source web app that lets users track income and expenses through voice input, AI receipt scanning, and analytics dashboards. Contributions here are not practice exercises — they ship to actual users on a live production deployment.&lt;/p&gt;

&lt;p&gt;That raised the stakes. And honestly, that is what made it worth doing.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Terms — Read This First If You Are New&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository (Repo):&lt;/strong&gt; A project hosted on GitHub containing all the source code, history, and files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PR (Pull Request):&lt;/strong&gt; A proposal to add your code changes to the main project. The primary unit of open source contribution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fork:&lt;/strong&gt; Your personal copy of someone else's repository. You make changes here safely, then open a PR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Branch:&lt;/strong&gt; A separate version of the code where you work on a feature without touching the main codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Merge:&lt;/strong&gt; When the project maintainer accepts your PR and adds your code to the main project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RTK Query:&lt;/strong&gt; Redux Toolkit Query — a data-fetching tool used by VoiceyBill's frontend instead of Axios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ExcelJS:&lt;/strong&gt; A Node.js library for creating and formatting Excel spreadsheet files programmatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JWT (JSON Web Token):&lt;/strong&gt; A secure token sent with API requests to prove the user is logged in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD:&lt;/strong&gt; Automated checks (lint, build, tests) that run every time you push code. If they fail, your PR cannot merge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conventional Commits:&lt;/strong&gt; A standard for writing commit messages: &lt;code&gt;feat()&lt;/code&gt;, &lt;code&gt;fix()&lt;/code&gt;, &lt;code&gt;chore()&lt;/code&gt; etc. Keeps history readable.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Part 1: The Roadmap — From Observer to Contributor
&lt;/h2&gt;

&lt;p&gt;This is the exact path I followed. You can follow it too, regardless of your experience level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1 — Understand What Open Source Actually Is
&lt;/h3&gt;

&lt;p&gt;Open source means the source code of a project is publicly available for anyone to read, use, and contribute to. When you contribute, you are not just writing code — you are joining a team with real standards, real reviews, and real users depending on your work.&lt;/p&gt;

&lt;p&gt;VoiceyBill has three public repositories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;voiceyBill-web&lt;/strong&gt; — the frontend (React, TypeScript, Tailwind CSS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;voiceyBill-server&lt;/strong&gt; — the backend REST API (Node.js, Express, MongoDB)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;voiceyBill-App&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All accept contributions. I worked on couple of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2 — Build Your Basics First
&lt;/h3&gt;

&lt;p&gt;You do not need to be an expert. But you need to be comfortable with these fundamentals before touching a production codebase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt; — &lt;code&gt;clone&lt;/code&gt;, &lt;code&gt;branch&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pull&lt;/code&gt;, &lt;code&gt;merge&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; — forking, opening PRs, responding to review comments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your stack&lt;/strong&gt; — at least enough to read and understand existing code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of these feel unfamiliar, spend a few days on them first. A rough or broken first contribution is worse than no contribution — it creates work for the maintainers and damages your confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3 — Find the Right Project
&lt;/h3&gt;

&lt;p&gt;Not every project welcomes beginners. Look for these green flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; file that explains how to contribute&lt;/li&gt;
&lt;li&gt;Issues labeled &lt;code&gt;good first issue&lt;/code&gt; or &lt;code&gt;help wanted&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Active maintainers who respond to PRs within a few days&lt;/li&gt;
&lt;li&gt;A project you actually care about or find interesting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VoiceyBill had all of these. The maintainers responded quickly, the issues were clearly described, and the product itself — a voice-powered finance tracker — was genuinely interesting to work on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 4 — Study the Codebase Before Writing Any Code
&lt;/h3&gt;

&lt;p&gt;This is the most skipped step and the most important one.&lt;/p&gt;

&lt;p&gt;Before I opened a single issue, I spent time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading the existing PRs to understand what "good" looked like&lt;/li&gt;
&lt;li&gt;Studying the folder structure of both repositories&lt;/li&gt;
&lt;li&gt;Observing the team's commit message style (&lt;code&gt;feat()&lt;/code&gt;, &lt;code&gt;fix()&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Understanding the architecture — how the frontend talks to the backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When I finally wrote code, I was following patterns I had already internalized — not guessing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 5 — Claim an Issue and Plan Your Work
&lt;/h3&gt;

&lt;p&gt;Find an issue that matches your skill level. Comment on it to let the maintainers know you are working on it. This prevents two people from solving the same problem simultaneously.&lt;/p&gt;

&lt;p&gt;Then plan before you code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What files will I need to touch?&lt;/li&gt;
&lt;li&gt;Does this change affect the frontend, backend, or both?&lt;/li&gt;
&lt;li&gt;What is the expected behavior when I am done?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 6 — Build, Test, and Document
&lt;/h3&gt;

&lt;p&gt;Write your code. Test it manually. Run the project's lint and build commands. Then write your PR description as if you are explaining it to a teammate who has no context.&lt;/p&gt;

&lt;p&gt;A great PR description includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A summary of what the change does and why&lt;/li&gt;
&lt;li&gt;Step-by-step instructions for how to test it&lt;/li&gt;
&lt;li&gt;Screenshots or recordings if there are visual changes&lt;/li&gt;
&lt;li&gt;The issue number it closes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 7 — Treat Code Review as a Learning Tool
&lt;/h3&gt;

&lt;p&gt;When reviewers leave comments, they are not attacking you. They are doing their job — protecting the quality of a codebase that real users depend on.&lt;/p&gt;

&lt;p&gt;Read every comment carefully. Fix what needs fixing. Push the update. Re-request review. Repeat until merged.&lt;/p&gt;

&lt;p&gt;The review process is where you grow the fastest.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: PR #114 — Backend CSV Export (voiceyBill-server)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Is a Backend? Why Does It Matter?
&lt;/h3&gt;

&lt;p&gt;If you are new to full-stack development, here is a quick mental model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;frontend&lt;/strong&gt; is what users see in their browser — buttons, forms, dashboards&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;backend&lt;/strong&gt; is the server that runs behind the scenes — it handles data, business logic, authentication, and file generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a user clicks "Export CSV," the frontend sends a request to the backend. The backend generates the file and sends it back. The frontend then triggers the download.&lt;/p&gt;

&lt;p&gt;This PR built the backend half of that flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Issue
&lt;/h3&gt;

&lt;p&gt;The project needed a way for users to download their full transaction history as a spreadsheet. The issue asked for an API endpoint that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checks that the user is logged in (authentication)&lt;/li&gt;
&lt;li&gt;Fetches only that user's transactions from the database&lt;/li&gt;
&lt;li&gt;Generates a formatted Excel file&lt;/li&gt;
&lt;li&gt;Sends it back as a downloadable response&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I implemented the complete backend feature following VoiceyBill's existing &lt;strong&gt;controller → service → route&lt;/strong&gt; architecture. Here is what that means in plain terms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User clicks "Export" in browser
         ↓
Frontend sends: GET /api/transactions/export
         ↓
Route  →  Controller  →  Service  →  Database
                              ↓
                      ExcelJS generates .xlsx file
                              ↓
                 Backend sends file back to browser
                              ↓
              Browser downloads transactions.xlsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The files I created or modified:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service layer&lt;/strong&gt; — &lt;code&gt;exportTransactionsService&lt;/code&gt;: queries the database for the authenticated user's transactions, builds an Excel workbook using ExcelJS with bold/centered headers and formatted rows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controller&lt;/strong&gt; — &lt;code&gt;exportTransactionsController&lt;/code&gt;: handles the HTTP request, calls the service, sets the correct response headers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route&lt;/strong&gt; — registered &lt;code&gt;GET /api/transactions/export&lt;/code&gt; with authentication middleware so only logged-in users can access it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The spreadsheet columns exported:&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;Title&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Payment Method&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Recurring&lt;/th&gt;
&lt;th&gt;Created At&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The endpoint details:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/transactions/export
Authorization: Bearer &amp;lt;your-jwt-token&amp;gt;

Response: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
File: transactions.xlsx
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How to Test It (Step by Step)
&lt;/h3&gt;

&lt;p&gt;If you want to test this endpoint yourself after cloning the repo:&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;# 1. Start the backend server&lt;/span&gt;
npm run dev

&lt;span class="c"&gt;# 2. Make sure MongoDB is running (local or Atlas)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Login through the API to get your JWT token&lt;/span&gt;

&lt;span class="c"&gt;# 4. Call the export endpoint with your token&lt;/span&gt;
GET http://localhost:8000/api/transactions/export
Authorization: Bearer &amp;lt;your-token-here&amp;gt;

&lt;span class="c"&gt;# 5. Open the downloaded transactions.xlsx in Excel or Google Sheets&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Review Process — CI Failure
&lt;/h3&gt;

&lt;p&gt;The feature worked locally. But after I opened the PR, the project owner &lt;strong&gt;voiceyBill&lt;/strong&gt; flagged that the CI workflow was failing.&lt;/p&gt;

&lt;p&gt;CI (Continuous Integration) is an automated system that runs checks on every PR — linting, building, and testing the code. If CI fails, the PR cannot be merged, even if the code itself is correct.&lt;/p&gt;

&lt;p&gt;The issue was a missing &lt;code&gt;package-lock.json&lt;/code&gt; file. When I added a new dependency (&lt;code&gt;ExcelJS&lt;/code&gt;), I did not commit the lock file that records the exact package versions. The CI pipeline could not reproduce the exact environment and failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; I added the missing &lt;code&gt;package-lock.json&lt;/code&gt; and pushed the update.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;** Beginner Tip**&lt;/p&gt;

&lt;p&gt;Always commit your &lt;code&gt;package-lock.json&lt;/code&gt; (or &lt;code&gt;yarn.lock&lt;/code&gt;) when you add or update dependencies.&lt;/p&gt;

&lt;p&gt;This file locks down the exact version of every package so that CI servers and other developers get the same environment you tested with. Skipping it is one of the most common first-time mistakes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The Outcome
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;✅ Merged&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Approved by &lt;strong&gt;zainAwan9175&lt;/strong&gt; after CI checks passed.&lt;/p&gt;

&lt;p&gt;Merged into &lt;code&gt;main&lt;/code&gt; on June 6, 2026.&lt;/p&gt;

&lt;p&gt;4 commits. 8 CI checks passed. Backend export live in production.&lt;/p&gt;

&lt;p&gt;After the merge, the maintainer commented: &lt;em&gt;"@HamzaAmir1470, now open the PR for the mobile app also."&lt;/em&gt; — a signal that the team trusted the work and wanted more.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Part 3: PR #145 — Frontend CSV Export (voiceyBill-web)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Connecting Frontend to Backend
&lt;/h3&gt;

&lt;p&gt;Once the backend endpoint existed (PR #114), the frontend needed to actually call it and trigger the download in the browser. These two PRs are two halves of the same feature — one on each repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Issue
&lt;/h3&gt;

&lt;p&gt;Issue #116 asked for an Export CSV button on the Transactions page that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calls the backend endpoint when clicked&lt;/li&gt;
&lt;li&gt;Shows the user feedback during the process (loading, success, error)&lt;/li&gt;
&lt;li&gt;Triggers a file download in the browser when the backend responds&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I added an Export CSV button to the Transactions page using RTK Query's lazy query pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User clicks "Export CSV" button
         ↓
Toast shows: "Preparing export..."
         ↓
useLazyExportTransactionsQuery() fires the API call
         ↓
Backend responds with .xlsx blob
         ↓
downloadCsv() utility triggers browser download
         ↓
Toast shows: "Export completed" ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Review Process — Three Rounds of Corrections
&lt;/h3&gt;

&lt;p&gt;The feature worked. But the review process taught me far more than the build did.&lt;/p&gt;

&lt;h4&gt;
  
  
  Round 1: Duplicated Logic
&lt;/h4&gt;

&lt;p&gt;Reviewer &lt;strong&gt;Syed-Bilal-Haider-Engineer&lt;/strong&gt; spotted that my download logic — creating a blob URL, appending a link to the DOM, clicking it, and revoking the URL — was written twice: once for the Transactions page and once for the Reports page.&lt;/p&gt;

&lt;p&gt;His suggestion: extract it into a shared reusable utility.&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;// src/utils/downloadCsv.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;downloadCsv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&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;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;download&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;revokeObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;** Beginner Tip: The DRY Principle**&lt;/p&gt;

&lt;p&gt;DRY stands for "Don't Repeat Yourself." If the same logic exists in two places, it should live in one shared function.&lt;/p&gt;

&lt;p&gt;Why? Because if you need to fix a bug in that logic later, you only fix it in one place — not hunt down every copy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I refactored it. Done. Or so I thought.&lt;/p&gt;

&lt;h4&gt;
  
  
  Round 2: Missed Caller
&lt;/h4&gt;

&lt;p&gt;A second reviewer — &lt;strong&gt;zainAwan9175&lt;/strong&gt; — caught that &lt;code&gt;src/pages/transactions/index.tsx&lt;/code&gt; still contained the old duplicated implementation. I had created the shared utility but forgotten to update one of the original callers.&lt;/p&gt;

&lt;p&gt;Another fix pushed. This kind of mistake is common. It is why code review exists.&lt;/p&gt;

&lt;h4&gt;
  
  
  Round 3: Wrong Dependency
&lt;/h4&gt;

&lt;p&gt;A third flag: I had accidentally added &lt;code&gt;axios&lt;/code&gt; to &lt;code&gt;package.json&lt;/code&gt;, even though VoiceyBill deliberately uses RTK Query for all API calls. The project had made a deliberate architectural choice to use one data-fetching tool consistently.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;** Beginner Tip: Respect Project Architecture**&lt;/p&gt;

&lt;p&gt;Every codebase has intentional technology choices — which HTTP client to use, which state manager, which styling approach.&lt;/p&gt;

&lt;p&gt;Before adding a new dependency, check what the project already uses. If there is already a tool for the job, use that one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Removed the &lt;code&gt;axios&lt;/code&gt; import. All three issues addressed.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Outcome
&lt;/h3&gt;

&lt;p&gt;PR #145 is still under active review with all requested changes addressed, pending final approval from the maintainers. The backend is live. The frontend is ready.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: PR #171 — Mobile Sidebar Close Button (voiceyBill-web)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Issue
&lt;/h3&gt;

&lt;p&gt;Issue #132 identified a real usability failure: on mobile, the sidebar opened but had no way to close. Once open, it covered the entire content area with no escape route — affecting every mobile user of the application.&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;UI/UX bug&lt;/strong&gt; — the kind of issue that is highly visible, clearly scoped, and very satisfying to fix.&lt;/p&gt;

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

&lt;p&gt;I made the sidebar fully responsive without touching any existing desktop behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What "responsive" means for beginners:&lt;/strong&gt; A responsive UI adapts its layout based on the screen size. The same component behaves differently on a 375px phone screen versus a 1440px desktop monitor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On screens below 768px (mobile), I added:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hamburger button (☰)&lt;/strong&gt; — floating in the top-left corner, opens the sidebar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slide-out sidebar&lt;/strong&gt; — animates in from the left, same width as desktop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Close button (✕)&lt;/strong&gt; — inside the sidebar, explicitly closes it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backdrop overlay&lt;/strong&gt; — a semi-transparent layer behind the sidebar; clicking it closes the sidebar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-close on navigation&lt;/strong&gt; — tapping any nav link automatically closes the sidebar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top padding fix&lt;/strong&gt; — &lt;code&gt;pt-20&lt;/code&gt; on mobile / &lt;code&gt;pt-8&lt;/code&gt; on desktop so page content is not hidden behind the floating button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On desktop: nothing changed.&lt;/strong&gt; Every existing behavior — expanded/collapsed state, navigation links, VoiceyAI card, logout button — remained identical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The only file changed:&lt;/strong&gt; &lt;code&gt;src/components/sidebar/index.tsx&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessibility — Why It Matters
&lt;/h3&gt;

&lt;p&gt;Accessibility means making your UI usable by everyone, including people using screen readers, keyboard navigation, or assistive technology.&lt;/p&gt;

&lt;p&gt;For this PR, I added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;aria-label&lt;/code&gt; attributes on all new buttons so screen readers can announce their purpose&lt;/li&gt;
&lt;li&gt;Proper focus management — when the sidebar opens, focus moves into it; when it closes, focus returns to where it was&lt;/li&gt;
&lt;li&gt;Full keyboard navigation support — users can tab through the sidebar and press Escape to close it&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;** Beginner Tip: Always Think About Accessibility**&lt;/p&gt;

&lt;p&gt;Accessibility is not optional in production software. It is often a legal requirement and always the right thing to do.&lt;/p&gt;

&lt;p&gt;The simplest habit to build: every interactive element (button, link, input) should have a clear, descriptive label.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Testing — Why You Must Test Before Submitting
&lt;/h3&gt;

&lt;p&gt;Before submitting, I tested the component across six browsers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Browser&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chrome (latest)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefox (latest)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safari (latest)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge (latest)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile Safari (iOS)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome Mobile (Android)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;** Beginner Tip: Test on Real Devices**&lt;/p&gt;

&lt;p&gt;Chrome DevTools mobile emulation is a good start, but it does not perfectly replicate real device behavior — especially on iOS Safari.&lt;/p&gt;

&lt;p&gt;If you are building anything that affects mobile layout, test on a real phone before submitting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The Outcome
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;✅ Merged&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reviewed by &lt;strong&gt;ahadalireach&lt;/strong&gt;: &lt;em&gt;"awesome work man."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Approved by project owner &lt;strong&gt;voiceyBill&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Merged into &lt;code&gt;main&lt;/code&gt; on June 5, 2026.&lt;/p&gt;

&lt;p&gt;One commit. Clean history. No requested changes. First-pass approval.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Part 5: The Full Picture — 3 PRs Across 2 Repositories
&lt;/h2&gt;

&lt;p&gt;Here is how all three contributions connect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User on Mobile
      ↓
[PR #171] Mobile sidebar works — user can navigate the app
      ↓
User goes to Transactions page
      ↓
[PR #145] Clicks "Export CSV" → Frontend fires API call
      ↓
[PR #114] Backend generates Excel file → Sends to browser
      ↓
User downloads transactions.xlsx ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each PR was a standalone contribution. Together, they deliver a complete user-facing feature — end to end, across two repositories, across frontend and backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6: Real-World Challenges — What Nobody Warns You About
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1: The Codebase Feels Overwhelming
&lt;/h3&gt;

&lt;p&gt;Every new codebase does. There are architectural patterns you have not seen, naming conventions you did not expect, and files that seem to do the same thing. This is normal.&lt;/p&gt;

&lt;p&gt;The solution is not to understand everything before starting. It is to understand enough to do the specific task you have claimed, then let your understanding grow with each contribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 2: CI Failures Are Not Personal
&lt;/h3&gt;

&lt;p&gt;When CI fails on your PR, it is not a judgment of your ability. It is the automated system doing its job — catching things that humans miss. PR #114's CI failure (the missing &lt;code&gt;package-lock.json&lt;/code&gt;) was a one-line fix, but it required understanding why the CI system cares about that file.&lt;/p&gt;

&lt;p&gt;Read the CI logs carefully. They tell you exactly what failed and usually point to the file and line number.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 3: Review Feedback Stings — Then It Helps
&lt;/h3&gt;

&lt;p&gt;Three rounds of corrections on PR #145 felt uncomfortable in the moment. In hindsight, each one made the code meaningfully better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Round 1 taught me about the DRY principle in a real codebase&lt;/li&gt;
&lt;li&gt;Round 2 taught me to audit all callers when extracting shared logic&lt;/li&gt;
&lt;li&gt;Round 3 taught me to respect project-level architectural decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No tutorial teaches these lessons as well as a real reviewer does.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 4: Every Project Has Rules You Have to Discover
&lt;/h3&gt;

&lt;p&gt;VoiceyBill uses RTK Query, not Axios. It uses ExcelJS for spreadsheet generation. It has specific commit message formats. These rules are not always in the documentation — sometimes you learn them from a review comment.&lt;/p&gt;

&lt;p&gt;When you discover a project rule, write it down. Do not repeat the same mistake.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 5: Patience Is a Skill
&lt;/h3&gt;

&lt;p&gt;PR #145 is still awaiting final approval. The backend is live. The frontend is ready. The review has been thorough and constructive. Now I wait — and while waiting, I look for the next issue to work on.&lt;/p&gt;

&lt;p&gt;Open source moves at its own pace. The maintainers are often doing this work between other responsibilities. Respect their time. Follow up professionally if a PR sits too long without response. Never send repeated messages demanding attention.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 7: Strengths and Limitations of Open Source Contribution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What You Gain
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Real code review.&lt;/strong&gt; Engineers you have never met read your code line by line and tell you what is wrong. This feedback is more valuable than any course.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production exposure.&lt;/strong&gt; Your code runs for real users on real servers. The accountability is genuine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portfolio credibility.&lt;/strong&gt; A merged PR to an active public project is verifiable proof — anyone can read the code, the comments, and the review history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architectural thinking.&lt;/strong&gt; Working in a real codebase forces you to think about how your change fits into a larger system — not just whether it works in isolation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community.&lt;/strong&gt; You join a network of developers who share standards, norms, and context. After my PRs, the maintainer invited me to open another one. That invitation is worth more than a certificate.&lt;/p&gt;

&lt;h3&gt;
  
  
  What You Must Manage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Time and patience.&lt;/strong&gt; Reviews happen on the maintainer's schedule, not yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codebase learning curve.&lt;/strong&gt; Every new project is a new mental model. Budget reading time before building time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rejection.&lt;/strong&gt; Not every PR gets merged. Sometimes the approach conflicts with the project's direction. This is information, not failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependency on others.&lt;/strong&gt; If the maintainer is unavailable, your PR waits. This is part of collaborative software development.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 8: Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You do not need to be senior.&lt;/strong&gt; All three of these PRs were built by someone learning in public. Patience and professionalism matter more than seniority.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read before you write.&lt;/strong&gt; The fastest path to a merged PR is understanding what the team already expects — their conventions, their architecture, their tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Full-stack contributions are possible.&lt;/strong&gt; PR #114 was backend. PR #145 was frontend. PR #171 was UI. You do not have to pick a lane on your first day.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CI failures are fixable.&lt;/strong&gt; When automated checks fail, read the logs, understand why, and fix it. It is rarely as serious as it looks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Working code is not the finish line.&lt;/strong&gt; Code also needs to be consistent, non-duplicated, and aligned with the project's architectural choices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;One focused PR beats three scattered ones.&lt;/strong&gt; PR #171 merged on the first review because it did one thing, documented it completely, and tested it thoroughly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Every review makes you better.&lt;/strong&gt; The corrections on PR #145 — three rounds of them — were the most educational part of this entire journey.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The first PR is the hardest.&lt;/strong&gt; After it, the process is familiar, the codebase is less foreign, and the maintainers are less intimidating.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Part 9: How to Start — Your Action Plan
&lt;/h2&gt;

&lt;p&gt;If you are reading this and have not made your first open source contribution yet, here is a concrete plan:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1:&lt;/strong&gt; Pick a project you use or find interesting. Read its README, CONTRIBUTING.md, and 5–10 existing PRs. Do not write any code yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2:&lt;/strong&gt; Set up the project locally. Make sure it runs. Read the folder structure until you could explain it to someone else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3:&lt;/strong&gt; Find a &lt;code&gt;good first issue&lt;/code&gt;. Comment to claim it. Plan your approach. Ask a question in the issue if something is unclear — maintainers appreciate engaged contributors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 4:&lt;/strong&gt; Build your solution. Test it manually. Run lint and build. Write a detailed PR description. Submit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After submission:&lt;/strong&gt; Respond to every review comment within 24 hours. Make changes promptly. Be professional and thankful.&lt;/p&gt;

&lt;p&gt;Then look for the next issue and do it again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 10: Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git Branching Strategies&lt;/strong&gt; — trunk-based development, feature branches, and when to use each&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing Good PR Descriptions&lt;/strong&gt; — how to communicate change intent clearly to reviewers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conventional Commits Specification&lt;/strong&gt; — the standard used by VoiceyBill and most modern projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The DRY Principle&lt;/strong&gt; — why duplicated code creates long-term maintenance problems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Accessibility (a11y)&lt;/strong&gt; — ARIA attributes, keyboard navigation, and focus management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RTK Query Docs&lt;/strong&gt; — data fetching and caching in Redux Toolkit applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ExcelJS&lt;/strong&gt; — generating and formatting Excel files in Node.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understanding CI/CD&lt;/strong&gt; — what automated pipelines check and why they matter&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Closing Thought
&lt;/h2&gt;

&lt;p&gt;Open source contribution is not about adding more code. It is about adding &lt;strong&gt;structure, care, and precision&lt;/strong&gt; to a codebase that other people depend on.&lt;/p&gt;

&lt;p&gt;VoiceyBill did not make me a better developer by being easy. It made me better by being real — real standards, real reviewers, real users, and real consequences when something breaks.&lt;/p&gt;

&lt;p&gt;Three PRs across two repositories. One complete feature delivered end-to-end. Multiple rounds of review that sharpened the code and my thinking.&lt;/p&gt;

&lt;p&gt;Two of them are merged. One is pending. All of them taught me something that solo projects never could.&lt;/p&gt;

&lt;p&gt;If you have been putting off your first contribution, this is your sign. The codebase is not too advanced. The maintainers are not too intimidating. The issues are not too complex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick one issue. Clone the repo. Build it. Ship it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is how you start.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Hamza Amir&lt;/strong&gt; · &lt;a href="https://github.com/HamzaAmir1470" rel="noopener noreferrer"&gt;github.com/HamzaAmir1470&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/voiceyBill/voiceyBill-server/pull/114" rel="noopener noreferrer"&gt;PR #114 — Backend CSV Export&lt;/a&gt; &lt;br&gt;
&lt;a href="https://github.com/voiceyBill/voiceyBill-web/pull/145" rel="noopener noreferrer"&gt;PR #145 — Frontend CSV Export&lt;/a&gt; &lt;br&gt;
&lt;a href="https://github.com/voiceyBill/voiceyBill-web/pull/171" rel="noopener noreferrer"&gt;PR #171 — Mobile Sidebar&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>react</category>
      <category>node</category>
    </item>
  </channel>
</rss>
