<?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>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>
