<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Abdul Talha - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Abdul Talha - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 08 May 2026 16:49:08 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/author/abdultalha3226/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Self-Host Your Own Server Monitoring Dashboard Using Uptime Kuma and Docker ]]>
                </title>
                <description>
                    <![CDATA[ As a developer, there's nothing worse than finding out from an angry user that your website is down. Usually, you don't know your server crashed until someone complains. And while many SaaS tools can  ]]>
                </description>
                <link>https://www.freecodecamp.org/news/self-host-uptime-kuma-docker/</link>
                <guid isPermaLink="false">69d4185f40c9cabf44851652</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-hosted ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Devops ]]>
                    </category>
                
                    <category>
                        <![CDATA[ monitoring ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Ubuntu ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Abdul Talha ]]>
                </dc:creator>
                <pubDate>Mon, 06 Apr 2026 20:32:31 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/uploads/covers/5e1e335a7a1d3fcc59028c64/ea068a20-bc19-400a-a42e-1bbb7e492da8.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>As a developer, there's nothing worse than finding out from an angry user that your website is down. Usually, you don't know your server crashed until someone complains.</p>
<p>And while many SaaS tools can monitor your site, they often charge high monthly fees for simple alerts.</p>
<p>My goal with this article is to help you stop paying those expensive fees by showing you a powerful, free, open-source alternative called Uptime Kuma.</p>
<p>In this guide, you'll learn how to use Docker to deploy Uptime Kuma safely on a local Ubuntu machine.</p>
<p>By the end of this tutorial, you'll have set up your own private server monitoring dashboard in less than 10 minutes and created an automated Discord alert to ping your phone if your website goes offline.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><p><a href="#heading-prerequisites">Prerequisites</a></p>
</li>
<li><p><a href="#heading-step-1-update-packages-and-prepare-the-firewall">Step 1: Update Packages and Prepare the Firewall</a></p>
</li>
<li><p><a href="#heading-step-2-create-the-docker-compose-file">Step 2: Create the Docker Compose File</a></p>
</li>
<li><p><a href="#heading-step-3-start-the-application">Step 3: Start the Application</a></p>
</li>
<li><p><a href="#heading-step-4-access-the-dashboard">Step 4: Access the Dashboard</a></p>
</li>
<li><p><a href="#heading-step-5-use-case-monitor-a-website-and-send-discord-alerts">Step 5: Use Case – Monitor a Website and Send Discord Alerts</a></p>
</li>
<li><p><a href="#heading-conclusion">Conclusion</a></p>
</li>
</ul>
<h2 id="heading-prerequisites">Prerequisites</h2>
<p>Before you start, make sure you have:</p>
<ul>
<li><p>An Ubuntu machine (like a local server, VM, or desktop).</p>
</li>
<li><p>Docker and Docker Compose installed.</p>
</li>
<li><p>Basic knowledge of the Linux terminal.</p>
</li>
</ul>
<h2 id="heading-step-1-update-packages-and-prepare-the-firewall">Step 1: Update Packages and Prepare the Firewall</h2>
<p>First, you'll want to make sure your system has the newest updates. Then, you'll install the Uncomplicated Firewall (UFW) and open the network "door" (port) that Uptime Kuma uses for the dashboard. You'll also need to allow SSH so you don't lock yourself out.</p>
<p>Run these commands in your terminal:</p>
<ol>
<li>Update your packages:</li>
</ol>
<pre><code class="language-shell">sudo apt update &amp;&amp; sudo apt upgrade -y
</code></pre>
<ol>
<li>Install the firewall:</li>
</ol>
<pre><code class="language-shell">sudo apt install ufw -y
</code></pre>
<ol>
<li>Allow SSH and open port 3001:</li>
</ol>
<pre><code class="language-shell">sudo ufw allow ssh
sudo ufw allow 3001/tcp
</code></pre>
<ol>
<li>Enable the firewall:</li>
</ol>
<pre><code class="language-shell">sudo ufw enable
sudo ufw reload
</code></pre>
<h2 id="heading-step-2-create-the-docker-compose-file">Step 2: Create the Docker Compose File</h2>
<p>Using a <code>docker-compose.yml</code> file is the professional way to manage Docker containers. It keeps your setup organised in one single place.</p>
<p>To start, create a new folder for your project and enter it:</p>
<pre><code class="language-shell">mkdir uptime-kuma &amp;&amp; cd uptime-kuma
</code></pre>
<p>Then create the configuration file:</p>
<pre><code class="language-shell">nano docker-compose.yml
</code></pre>
<p>Paste the following code into the editor:</p>
<pre><code class="language-yaml">services:
  uptime-kuma:
    image: louislam/uptime-kuma:2
    restart: unless-stopped
    volumes:
      - ./data:/app/data
    ports:
      - "3001:3001"
</code></pre>
<p><strong>Note</strong>: The <code>./data:/app/data</code> line is very important. It saves your database in a normal folder on your machine, making it easy to back up later.</p>
<p>Finally, save and exit: Press <code>CTRL + X</code>, then <code>Y</code>, then <code>Enter</code>.</p>
<h2 id="heading-step-3-start-the-application">Step 3: Start the Application</h2>
<p>Now, tell Docker to read your file and start the monitoring service in the background.</p>
<pre><code class="language-shell">docker compose up -d
</code></pre>
<p><strong>How to verify:</strong> Docker will download the files. When it finishes, your terminal should print <code>Started uptime-kuma</code>.</p>
<h2 id="heading-step-4-access-the-dashboard">Step 4: Access the Dashboard</h2>
<p>To access the dashboard, first open your web browser and go to <code>http://localhost:3001</code> (or your machine's local IP address).</p>
<p>When asked to choose the database, select <strong>SQLite</strong>. It's simple, fast, and requires no extra setup.</p>
<p>Then create an account and choose a secure admin username and password.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/02913589-020e-4a8a-aa7a-1bf70a9244c6.png" alt="02913589-020e-4a8a-aa7a-1bf70a9244c6" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<h2 id="heading-step-5-use-case-monitor-a-website-and-send-discord-alerts">Step 5: Use Case – Monitor a Website and Send Discord Alerts</h2>
<p>Now you'll put Uptime Kuma to work by monitoring a live website and setting up an alert. Just follow these steps:</p>
<ol>
<li><p>Click Add New Monitor.</p>
</li>
<li><p>Set the Monitor Type to <code>HTTP(s)</code>.</p>
</li>
<li><p>Give it a Friendly Name (e.g., "My Blog") and enter your website's URL.</p>
</li>
</ol>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/74567f1e-acc4-480f-b969-7883e01aa459.png" alt="74567f1e-acc4-480f-b969-7883e01aa459" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<h3 id="heading-pro-tip-how-to-fix-down-errors-bot-protection">Pro-Tip: How to Fix "Down" Errors (Bot Protection)</h3>
<p>If your site uses strict security, it might block Uptime Kuma and say your site is "Down" with a 403 Forbidden error.</p>
<p><strong>The Fix:</strong> Scroll down to Advanced, find the User Agent box, and paste this text to make Uptime Kuma look like a normal Chrome browser:</p>
<p><code>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36</code></p>
<h3 id="heading-add-a-discord-alert">Add a Discord Alert</h3>
<p>To get a message on your phone when your site goes down:</p>
<ol>
<li><p>On the right side of the monitor screen, click Setup Notification.</p>
</li>
<li><p>Select Discord from the dropdown list.</p>
</li>
<li><p>Paste a Discord Webhook URL (you can create one in your Discord server settings under Integrations).</p>
</li>
<li><p>Click Test to receive a test ping, then click Save.</p>
</li>
</ol>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Congratulations! You just took control of your server health. By deploying Uptime Kuma, you replaced an expensive SaaS subscription with a powerful, free monitoring tool that alerts you the second a project goes offline.</p>
<p><strong>Let’s connect!</strong> I am a developer and technical writer specialising in writing step-by-step guides and workflows. You can find my latest projects on my <a href="https://blog.abdultalha.tech/portfolio"><strong>Technical Writing Portfolio</strong></a> or reach out to me directly on <a href="https://www.linkedin.com/in/abdul-talha/"><strong>LinkedIn</strong></a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Troubleshoot Ghost CMS: Fixing WSL, Docker, and ActivityPub Errors ]]>
                </title>
                <description>
                    <![CDATA[ Setting up Ghost CMS (Content Management System) on your local machine is a great way to develop themes and test new features. But if you're using Windows or Docker, you might run into errors that sto ]]>
                </description>
                <link>https://www.freecodecamp.org/news/fix-ghost-cms-errors/</link>
                <guid isPermaLink="false">69bc3254b238fd45a31f6959</guid>
                
                    <category>
                        <![CDATA[ ghost ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                    <category>
                        <![CDATA[ WSL ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Node.js ]]>
                    </category>
                
                    <category>
                        <![CDATA[ troubleshooting ]]>
                    </category>
                
                    <category>
                        <![CDATA[ debugging ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Abdul Talha ]]>
                </dc:creator>
                <pubDate>Thu, 19 Mar 2026 17:28:52 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/uploads/covers/5e1e335a7a1d3fcc59028c64/85f5e0bb-26ff-42ce-ba66-afec6df4bb5d.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Setting up Ghost CMS (Content Management System) on your local machine is a great way to develop themes and test new features. But if you're using Windows or Docker, you might run into errors that stop your progress. And debugging takes time away from your actual development work.</p>
<p>In this guide, you'll learn the root causes and exact fixes for three common Ghost CMS deployment errors:</p>
<ul>
<li><p><strong>Error 1:</strong> SQLite installation failures on Windows.</p>
</li>
<li><p><strong>Error 2:</strong> Docker containers crashing with Code 137 (memory limits).</p>
</li>
<li><p><strong>Error 3:</strong> "Loading Interrupted" errors in the ActivityPub Network tab.</p>
</li>
</ul>
<p>By the end of this article, you'll have a stable, working local Ghost setup. You'll know how to properly use WSL for Node.js apps, manage Docker resources, and successfully configure Ghost's new social web features.</p>
<h2 id="heading-error-1-sqlite-installation-failures-on-windows">Error 1: SQLite Installation Failures on Windows</h2>
<h3 id="heading-the-symptom"><strong>The Symptom</strong></h3>
<p>When you run the command <code>ghost install local</code> on a Windows machine, the setup fails. You will see a long list of red text in your terminal that looks like this:</p>
<pre><code class="language-plaintext">Error: Cannot find module 'sqlite3'
...
node-pre-gyp ERR! stack Error: Failed to execute...
...
MSB4019: The imported project "C:\Microsoft.Cpp.Default.props" was not found.
</code></pre>
<p>The error usually mentions "sqlite3" and says it "failed to execute" or is "missing."</p>
<h3 id="heading-the-cause"><strong>The Cause</strong></h3>
<p>Ghost uses SQLite to store your blog's data. SQLite is a "native module." This means it needs a small piece of code that must be built to fit your computer's system perfectly.</p>
<p>Because Ghost was created to run on Linux servers, it expects to find Linux build tools to make these files. Windows uses different tools and a different way of organising files. When the Ghost CLI tries to build the SQLite files on Windows, it can't find the tools it needs, so the installation stops. Using WSL gives Ghost the Linux environment it expects.</p>
<h3 id="heading-how-to-fix-it">How to Fix it:</h3>
<p>You can use Windows Subsystem for Linux (WSL) to create a working setup.</p>
<ol>
<li><p>Open your WSL terminal (like Ubuntu).</p>
</li>
<li><p>Check your tools by running <code>node --version</code>, <code>npm --version</code>, and <code>python3 --version</code>.</p>
</li>
<li><p>Install the Ghost CLI globally inside WSL:</p>
<pre><code class="language-plaintext">npm install -g ghost-cli@latest
</code></pre>
</li>
<li><p>Run the local setup command:</p>
<pre><code class="language-plaintext">ghost install local
</code></pre>
</li>
<li><p>Start the server:</p>
<pre><code class="language-plaintext">ghost start
</code></pre>
</li>
</ol>
<h3 id="heading-how-to-verify">How to Verify:</h3>
<p>Open your web browser and go to <code>http://localhost:2368</code>. You should see the default Ghost welcome page load without errors.</p>
<h2 id="heading-error-2-docker-container-exiting-with-code-137">Error 2: Docker Container Exiting with Code 137</h2>
<h3 id="heading-the-symptom">The Symptom:</h3>
<p>When you're running Ghost using Docker Compose, the containers crash. The terminal logs show <code>Ghost admin container exiting with code 137</code> or <code>Admin service killed due to memory constraints</code>.</p>
<h3 id="heading-the-cause">The Cause:</h3>
<p>So why does this happen? Well, error code 137 means your computer ran out of memory (RAM) and stopped the container. This usually happens if you try to run the full Ghost developer setup (which includes 15+ extra tools) on a standard computer.</p>
<h3 id="heading-how-to-fix-it">How to Fix it:</h3>
<p>To fix this error, you can switch from the complex setup to a simple setup using the official Ghost Docker image.</p>
<p>To do this, first stop and remove the broken containers:</p>
<pre><code class="language-plaintext">docker-compose down -v
docker system prune -a
</code></pre>
<p>Then create a new <code>docker-compose.yml</code> file with only the basic tools (Ghost and a database):</p>
<pre><code class="language-plaintext">services:
  ghost:
    image: ghost:latest
    restart: always
    ports:
      - "2368:2368"
    environment:
      database__client: mysql
      database__connection__host: mysql
      database__connection__user: root
      database__connection__password: yourpassword
      database__connection__database: ghost
      url: http://localhost:2368
    volumes:
      - ghost_content:/var/lib/ghost/content

  mysql:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: yourpassword
      MYSQL_DATABASE: ghost
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  ghost_content:
  mysql_data:
</code></pre>
<p>Then start the simple setup:</p>
<pre><code class="language-plaintext">docker-compose up -d
</code></pre>
<h3 id="heading-how-to-verify">How to Verify:</h3>
<p>Type <code>docker-compose ps</code> in your terminal. You should see both the <code>ghost</code> and <code>mysql</code> containers listed with a status of "Up".</p>
<h2 id="heading-error-3-loading-interrupted-in-network-analytics">Error 3: "Loading Interrupted" in Network Analytics</h2>
<h3 id="heading-the-symptom">The Symptom:</h3>
<p>When you click the <strong>Analytics → Network</strong> tab in your local Ghost admin panel, the page shows a "Loading Interrupted" error. Your terminal logs show 404 errors and webhook failures:</p>
<pre><code class="language-plaintext">INFO "GET /.ghost/activitypub/v1/feed/reader/" 404 52ms
ERROR No webhook secret found - cannot initialise
</code></pre>
<h3 id="heading-the-cause">The Cause:</h3>
<p>The Network tab acts as an ActivityPub reader, not a normal analytics dashboard. This error happens because ActivityPub is not set up for local use. It needs extra tools (Caddy, Redis) and a clean web address without port numbers to work.</p>
<h3 id="heading-how-to-fix-it">How to Fix it:</h3>
<p>To fix this error, just run Ghost with its required Docker tools and update your local config file to turn on the social web features.</p>
<p>First, start the required tools (Caddy, MySQL, Redis) from your Ghost folder:</p>
<pre><code class="language-plaintext">SSH_AUTH_SOCK=/dev/null docker compose up -d caddy mysql redis
</code></pre>
<p>Then open your <code>config.local.json</code> file. Set the URL to a clean localhost address (remove the <code>:2368</code> port) and turn on the developer features:</p>
<pre><code class="language-plaintext">{
    "url": "http://localhost",
    "social_web_enabled": true,
    "enableDeveloperExperiments": true
}
</code></pre>
<p>Stop your current Ghost process:</p>
<pre><code class="language-plaintext">pkill -f "yarn dev:ghost"
</code></pre>
<p>And restart Ghost with the new settings:</p>
<pre><code class="language-plaintext">yarn dev:ghost
</code></pre>
<h3 id="heading-how-to-verify">How to Verify:</h3>
<p>Log back into your Ghost admin panel and click <strong>Analytics → Network</strong>. The error message will be gone, and you will see the ActivityPub feed instead.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>Local setups can be hard, especially when mixing Windows, Docker, and new features like ActivityPub.</p>
<p>By fixing these three errors, you did more than just get Ghost running. You learned how to bypass Windows limits using WSL, how to manage Docker memory, and how Ghost routes social web traffic.</p>
<p>You now have a stable, fast, and fully working Ghost CMS workspace ready for your content.</p>
<p><strong>Let’s connect!</strong> You can find my latest work on my <a href="https://blog.abdultalha.tech/portfolio"><strong>Technical Writing Portfolio</strong></a> or reach out to me on <a href="https://www.linkedin.com/in/abdul-talha/"><strong>LinkedIn</strong></a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Self-Host AFFiNE on Windows with WSL and Docker ]]>
                </title>
                <description>
                    <![CDATA[ Depending on cloud apps means that you don't truly own your notes. If your internet goes down or if the company changes its rules, you could lose access. In this article, you'll learn how to build you ]]>
                </description>
                <link>https://www.freecodecamp.org/news/self-host-affine-windows/</link>
                <guid isPermaLink="false">69b2e3051be92d8f177bf807</guid>
                
                    <category>
                        <![CDATA[ self-hosted ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Open Source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ deployment ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                    <category>
                        <![CDATA[ WSL ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Abdul Talha ]]>
                </dc:creator>
                <pubDate>Thu, 12 Mar 2026 16:00:05 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/uploads/covers/5e1e335a7a1d3fcc59028c64/950eee10-aa2c-4071-9c40-abaf759f6d10.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Depending on cloud apps means that you don't truly own your notes. If your internet goes down or if the company changes its rules, you could lose access.</p>
<p>In this article, you'll learn how to build your own private workspace using AFFiNE. You'll use Docker Compose to link three separate pieces of software together:</p>
<ul>
<li><p>The AFFiNE Core application.</p>
</li>
<li><p>A PostgreSQL database to store your notes and pages.</p>
</li>
<li><p>A Redis cache to make the app run fast and smooth.</p>
</li>
</ul>
<p>By the end of this article, you'll have a fully functional web app running on your own computer that works just like the cloud version of Notion.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><p><a href="#heading-what-is-affine">What is AFFiNE?</a></p>
</li>
<li><p><a href="#heading-prerequisites">Prerequisites</a></p>
</li>
<li><p><a href="#heading-step-1-preparing-your-workspace">Step 1: Preparing Your Workspace</a></p>
</li>
<li><p><a href="#heading-step-2-getting-the-official-setup-files">Step 2: Getting the Official Setup Files</a></p>
</li>
<li><p><a href="#heading-step-3-configuring-your-environment-env">Step 3: Configuring Your Environment (.env)</a></p>
</li>
<li><p><a href="#heading-step-4-launching-the-system">Step 4: Launching the System</a></p>
</li>
<li><p><a href="#heading-step-5-accessing-the-admin-panel">Step 5: Accessing the Admin Panel</a></p>
</li>
<li><p><a href="#heading-step-6-configuration-making-it-yours">Step 6: Configuration (Making It Yours)</a></p>
</li>
<li><p><a href="#heading-step-7-connecting-the-desktop-app-optional">Step 7: Connecting the Desktop App (Optional)</a></p>
</li>
<li><p><a href="#heading-step-8-stopping-the-server-and-safe-backups">Step 8: Stopping the Server and Safe Backups</a></p>
</li>
<li><p><a href="#heading-step-9-how-to-upgrade-later">Step 9: How to Upgrade Later</a></p>
</li>
<li><p><a href="#heading-common-installation-errors-and-troubleshooting">Common Installation Errors and Troubleshooting</a></p>
</li>
<li><p><a href="#heading-conclusion">Conclusion</a></p>
</li>
</ul>
<h2 id="heading-what-is-affine">What is AFFiNE?</h2>
<p>AFFiNE is an "all-in-one" workspace that combines the powers of writing, drawing, and planning.</p>
<p>While tools like Notion focus on documents and Miro focus on whiteboards, AFFiNE lets you do both in a single space. You can turn your written notes into a visual canvas with one click. This makes it perfect for brainstorming, tracking tasks, and managing your personal knowledge.</p>
<h3 id="heading-the-power-of-self-hosting">The Power of Self-Hosting</h3>
<p>While AFFiNE offers a cloud version, hosting it yourself gives you three major benefits:</p>
<ul>
<li><p><strong>Total data ownership:</strong> Your notes never leave your machine. You own the database.</p>
</li>
<li><p><strong>Privacy in the AI age:</strong> No big tech company can scan your private ideas or use them for AI training.</p>
</li>
<li><p><strong>Real DevOps skills:</strong> Learning how to manage Docker inside WSL is a high-value skill for any modern developer.</p>
</li>
</ul>
<h2 id="heading-prerequisites">Prerequisites</h2>
<p>To follow this article, make sure you have these tools ready on your machine:</p>
<ul>
<li><p><strong>WSL 2 Installation:</strong> You must have WSL installed if you are using Windows (I am using Ubuntu for this guide).</p>
</li>
<li><p><strong>Docker and Docker Compose:</strong> These must be installed and running on your machine.</p>
</li>
<li><p><strong>Linux Terminal Commands:</strong> You should be familiar with basic commands like <code>mkdir</code>, <code>cd</code>, and <code>wget</code>.</p>
</li>
</ul>
<h2 id="heading-step-1-preparing-your-workspace">Step 1: Preparing Your Workspace</h2>
<p>To start, create a folder for your AFFiNE files. This keeps your data in one organised place.</p>
<p>Then open your WSL terminal and run these commands:</p>
<pre><code class="language-shell">mkdir affine
cd affine
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/021e4aef-ede1-4bec-b96e-2acaea9d8f40.png" alt="A terminal Showing the commands mkdir and cd" style="display:block;margin:0 auto" width="1919" height="392" loading="lazy">

<h2 id="heading-step-2-getting-the-official-setup-files">Step 2: Getting the Official Setup Files</h2>
<p>You will download the official configuration files directly from the AFFiNE. In your WSL terminal, run these two commands:</p>
<ol>
<li>Download the Docker Compose file:</li>
</ol>
<pre><code class="language-shell">wget -O docker-compose.yml https://github.com/toeverything/affine/releases/latest/download/docker-compose.yml
</code></pre>
<ol>
<li>Download the Environment template:</li>
</ol>
<pre><code class="language-shell">wget -O .env https://github.com/toeverything/affine/releases/latest/download/default.env.example
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/5b366a5f-b426-4e70-95c0-b469f40d6af5.png" alt="A terminal Showing the commands to download affine" style="display:block;margin:0 auto" width="1905" height="808" loading="lazy">

<h2 id="heading-step-3-configuring-your-environment-env">Step 3: Configuring Your Environment (.env)</h2>
<p>The <code>.env</code> file is like a hidden settings sheet. It keeps your passwords and setup details private.</p>
<p>To edit this file, you can use Nano, which is a simple text editor built into your Linux terminal. Follow these steps to update your settings:</p>
<ol>
<li><p><strong>Open the file with Nano:</strong></p>
<pre><code class="language-shell">nano .env
</code></pre>
</li>
<li><p><strong>Update the settings:</strong> Use your arrow keys to move around the file. Update these specific lines to match the locations below. This keeps your data safely inside your new <code>affine</code> folder:</p>
<pre><code class="language-plaintext">DB_DATA_LOCATION=./postgres
UPLOAD_LOCATION=./storage
CONFIG_LOCATION=./config

DB_USERNAME=affine
DB_PASSWORD=
DB_DATABASE=affine
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/d0f4a358-e221-45d3-94df-d97b606b4afc.png" alt="A terminal to change the values in env file" style="display:block;margin:0 auto" width="1909" height="795" loading="lazy">

<p><strong>Save and Exit:</strong> Press Ctrl + O to save.</p>
<ul>
<li><p>Press <strong>Enter</strong> to confirm the filename.</p>
</li>
<li><p>Press <strong>Ctrl + X</strong> to exit the editor.</p>
</li>
</ul>
</li>
</ol>
<h2 id="heading-step-4-launching-the-system">Step 4: Launching the System</h2>
<p>Run this Docker command to build your workspace:</p>
<pre><code class="language-shell">docker compose up -d
</code></pre>
<p>Docker will download the AFFiNE app and a Postgres database. The <code>-d</code> flag means it will run quietly in the background.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/407237bd-f805-4fca-b15c-6bf001f467e7.png" alt="A terminal Showing the commands for docker compose" style="display:block;margin:0 auto" width="1895" height="224" loading="lazy">

<h2 id="heading-step-5-accessing-the-admin-panel">Step 5: Accessing the Admin Panel</h2>
<p>Once the terminal says "Started," your private server is live!</p>
<p>Open your web browser and go to:</p>
<pre><code class="language-plaintext">http://localhost:3010/
</code></pre>
<p>The first time you visit this page, you must create an admin account. This is the master key to your server.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/780fafda-0afd-4b67-a2fa-6248b4d5d4f3.png" alt="creating an Admin account" style="display:block;margin:0 auto" width="982" height="1054" loading="lazy">

<h2 id="heading-step-6-configuration-making-it-yours">Step 6: Configuration (Making It Yours)</h2>
<p>There are two ways to configure your server.</p>
<h3 id="heading-the-easy-way-admin-panel"><strong>The Easy Way: Admin Panel</strong></h3>
<p>In your browser, go to <code>http://localhost:3010/admin/settings</code>. You can change your server name or set up emails here.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/0f8d4e97-7a47-4328-8e91-a36582d47143.png" alt="Overview of the settings page" style="display:block;margin:0 auto" width="1919" height="870" loading="lazy">

<h3 id="heading-the-developer-way-config-file"><strong>The Developer Way: Config File</strong></h3>
<p>You can also create a <code>config.json</code> file inside your <code>./config</code> folder.</p>
<pre><code class="language-json">{
  "$schema": "https://github.com/toeverything/affine/releases/latest/download/config.schema.json",
  "server": {
    "name": "My Private Workspace"
  }
}
</code></pre>
<h2 id="heading-step-7-connecting-the-desktop-app-optional">Step 7: Connecting the Desktop App (Optional)</h2>
<p>You don't have to use the browser. You can connect the official AFFiNE desktop app.</p>
<ol>
<li><p>Download the AFFiNE desktop app.</p>
</li>
<li><p>Click the workspace list panel in the top left corner.</p>
</li>
<li><p>Click "Add Server" and enter <code>http://localhost:3010</code>.</p>
</li>
<li><p>Log in with your account.</p>
</li>
</ol>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/2c668ed4-3552-420f-9217-e5f8d09f311c.png" alt="Connecting your local server to Affine Server" style="display:block;margin:0 auto" width="498" height="610" loading="lazy">

<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/3a12b7f6-33b9-497e-8684-7fd7a09d8c42.png" alt="Overview of Workspace" style="display:block;margin:0 auto" width="1919" height="869" loading="lazy">

<h2 id="heading-step-8-stopping-the-server-and-safe-backups">Step 8: Stopping the Server and Safe Backups</h2>
<p>You must turn your server off safely before you back up your notes.</p>
<p>To do that, run this command:</p>
<pre><code class="language-shell">docker compose down
</code></pre>
<p>Once it stops, you can safely copy your entire <code>affine</code> folder to a safe place.</p>
<h2 id="heading-step-9-how-to-upgrade-later">Step 9: How to Upgrade Later</h2>
<p>When AFFiNE releases a new version, run these commands inside your <code>affine</code> folder:</p>
<ol>
<li>Download the newest blueprint:</li>
</ol>
<pre><code class="language-shell">wget -O docker-compose.yml https://github.com/toeverything/affine/releases/latest/download/docker-compose.yml
</code></pre>
<ol>
<li>Pull the new images and restart:</li>
</ol>
<pre><code class="language-shell">docker compose pull
docker compose up -d
</code></pre>
<h2 id="heading-common-installation-errors-and-troubleshooting">Common Installation Errors and Troubleshooting</h2>
<h3 id="heading-1-docker-is-not-running">1. Docker is Not Running</h3>
<ul>
<li><p><strong>The Error:</strong> Terminal says <code>docker: command not found</code>.</p>
</li>
<li><p><strong>The Fix:</strong> Open the Docker Desktop app on Windows and wait for it to start.</p>
</li>
</ul>
<h3 id="heading-2-docker-is-not-connected-to-wsl">2. Docker is Not Connected to WSL</h3>
<ul>
<li><strong>The Fix:</strong> In Docker Desktop, go to <strong>Settings &gt; Resources &gt; WSL Integration</strong> and turn it ON for your distro.</li>
</ul>
<h3 id="heading-3-the-port-is-already-in-use">3. The Port is Already in Use</h3>
<ul>
<li><strong>The Fix:</strong> Open <code>docker-compose.yml</code>. Change <code>"3010:3010"</code> to <code>"4000:3010"</code>. You will now visit <code>localhost:4000</code>.</li>
</ul>
<h3 id="heading-4-permission-denied">4. Permission Denied</h3>
<ul>
<li><strong>The Fix:</strong> If you cannot delete a folder, use the sudo command: <code>sudo rm -rf affine/</code>.</li>
</ul>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this tutorial, you've successfully built a self-hosted, private workspace. You practised using WSL, Docker Compose, and Postgres. These are valuable skills for any developer.</p>
<p><strong>Your next steps:</strong></p>
<ol>
<li><p>Create a note in AFFiNE documenting what you learned.</p>
</li>
<li><p>Turn off your server (<code>docker compose down</code>) and copy your folder to a backup drive.</p>
</li>
<li><p>Explore Cloudflare Tunnels if you want to access your server from your phone!</p>
</li>
</ol>
<p>Self-hosting takes a little work, but the privacy is worth it.</p>
<p><strong>Let’s connect!</strong> You can find my latest work on my <a href="https://blog.abdultalha.tech/portfolio"><strong>Technical Writing Portfolio</strong></a> or reach out to me on <a href="https://www.linkedin.com/in/abdul-talha/"><strong>LinkedIn</strong></a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How Open Source Can Grow Your Tech Career: A Handbook for Beginners ]]>
                </title>
                <description>
                    <![CDATA[ Hi everyone. In this handbook, you will learn about the growing world of open source, and how it can shape your career as a developer. Open source is something I found confusing and scary when I first ]]>
                </description>
                <link>https://www.freecodecamp.org/news/open-source-career-handbook/</link>
                <guid isPermaLink="false">69a6fdc756428acc6ff16dd8</guid>
                
                    <category>
                        <![CDATA[ Open Source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ handbook ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Abdul Talha ]]>
                </dc:creator>
                <pubDate>Tue, 03 Mar 2026 15:27:03 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/uploads/covers/5fc16e412cae9c5b190b6cdd/d9a95683-8157-4f44-9a1c-9ebf5ddfc330.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Hi everyone. In this handbook, you will learn about the growing world of open source, and how it can shape your career as a developer.</p>
<p>Open source is something I found confusing and scary when I first started coding. I heard the term many times, but didn’t clearly understand what it meant, how it worked, or why developers thought it was important.</p>
<p>In this handbook, I will give you a clear and easy introduction to open source, not just what it is, but how it operates and how it connects directly to your career growth.</p>
<p>We'll talk about what open source really means, look at how projects function, and cover the roles of communities and maintainers. We'll also talk about the good and bad parts, and how contributing builds your skills, visibility, and career.</p>
<p>First, I will explain the core concept for each topic. Then, we'll look at real-world examples. This will help you see how open source fits into the real world. It will show you how to use it to grow your career.</p>
<p>By the end of this guide, you will be ready to make your first real contribution and start building your public portfolio.</p>
<p>Let’s get started.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><p><a href="#heading-what-is-open-source">What is Open Source?</a></p>
</li>
<li><p><a href="#heading-how-open-source-actually-works">How Open Source Actually Works</a></p>
</li>
<li><p><a href="#heading-the-role-of-maintainers-contributors-and-communities">The Role of Maintainers, Contributors, and Communities</a></p>
</li>
<li><p><a href="#heading-common-misconceptions-about-open-source">Common Misconceptions About Open Source</a></p>
</li>
<li><p><a href="#heading-the-downsides-of-open-source-an-honest-perspective">The Downsides of Open Source (An Honest Perspective)</a></p>
</li>
<li><p><a href="#heading-why-open-source-matters-for-developers">Why Open Source Matters for Developers</a></p>
</li>
<li><p><a href="#heading-skills-you-develop-beyond-coding">Skills You Develop Beyond Coding</a></p>
</li>
<li><p><a href="#heading-proof-of-work-vs-resume-claims">Proof of Work vs. Resume Claims</a></p>
</li>
<li><p><a href="#heading-collaboration-communication-and-professional-visibility">Collaboration, Communication, and Professional Visibility</a></p>
</li>
<li><p><a href="#heading-how-open-source-connects-to-jobs-referrals-and-remote-work">How Open Source Connects to Jobs, Referrals, and Remote Work</a></p>
</li>
<li><p><a href="#heading-what-you-really-need-before-contributing">What You Really Need Before Contributing</a></p>
</li>
<li><p><a href="#heading-choosing-the-right-projects-and-tech-stack">Choosing the Right Projects and Tech Stack</a></p>
</li>
<li><p><a href="#heading-types-of-contributions-code-documentation-design-and-more">Types of Contributions (Code, Documentation, Design, and More)</a></p>
</li>
<li><p><a href="#heading-practical-demonstration-from-forking-to-creating-a-pull-request">Practical Demonstration: From Forking to Creating a Pull Request</a></p>
</li>
<li><p><a href="#heading-working-with-maintainers-and-handling-feedback">Working With Maintainers and Handling Feedback</a></p>
</li>
<li><p><a href="#heading-learning-in-public">Learning in Public</a></p>
</li>
<li><p><a href="#heading-blogging-and-documenting-your-work">Blogging and Documenting Your Work</a></p>
</li>
<li><p><a href="#heading-building-a-personal-brand-through-open-source">Building a Personal Brand Through Open Source</a></p>
</li>
<li><p><a href="#heading-open-source-programs-internships-and-opportunities">Open Source Programs, Internships, and Opportunities</a></p>
</li>
<li><p><a href="#heading-it-is-never-too-late-to-start">It Is Never Too Late to Start</a></p>
</li>
<li><p><a href="#heading-conclusion-your-next-steps">Conclusion — Your Next Steps</a></p>
</li>
</ul>
<h2 id="heading-what-is-open-source"><strong>What is Open Source?</strong></h2>
<p>At its heart, open source is about community. It is a way to build software. The "source code" is the actual logic that makes an app work. In open source, projects share this code publicly—anyone in the world can view, study, and change it.</p>
<h3 id="heading-the-open-core"><strong>The Open Core</strong></h3>
<p>Companies keep most normal software "closed" or proprietary. So only the company that owns the product can see the code.</p>
<p>But open source is different. It lets you look at the code. So, you aren't just a user, but you can also become a potential helper.</p>
<h3 id="heading-global-collaboration"><strong>Global Collaboration</strong></h3>
<p>Open source lets anyone in the world change projects or software. Your location or background doesn't matter. If you can improve the code, you can contribute.</p>
<p>Companies today publicly share their code on platforms like <strong>GitHub or GitLab</strong>. This global transparency means:</p>
<ul>
<li><p>Anyone can suggest a new feature.</p>
</li>
<li><p>Anyone can find and fix a bug.</p>
</li>
<li><p>Anyone can help improve the documentation.</p>
</li>
</ul>
<h3 id="heading-the-managed-process"><strong>The Managed Process</strong></h3>
<p>You might wonder, "If anyone can change the code, won't the software break?" This is where maintainers come in.</p>
<p>Anyone can propose a change. However, the core team of maintainers review every single contribution. They act as the "gatekeepers" and ensure that only safe, high-quality code enters the project.</p>
<h3 id="heading-public-code-career-growth"><strong>Public Code = Career Growth</strong></h3>
<p>You develop these projects in public. Because of this, open source creates a permanent, verified portfolio for you. GitHub or GitLab signs every contribution with your name.</p>
<p>With this, a recruiter doesn't have to take your word for it. They can see exactly how you write code and solve problems. They can see how you talk to a global team. In open source, your public code becomes the engine of your professional growth.</p>
<h3 id="heading-the-reality-check"><strong>The Reality Check</strong></h3>
<p>Open source isn't just a "free" version of software. It is a living product. A global team builds it together in public. When you contribute, you aren't just writing code, you are joining a worldwide conversation.</p>
<h2 id="heading-how-open-source-actually-works"><strong>How Open Source Actually Works</strong></h2>
<p>Open source might seem like magic. However, it follows a very logical workflow. Most of this happens on platforms like <strong>GitHub or GitLab</strong>. GitHub acts as the central meeting place for developers. Here is the life cycle of a contribution:</p>
<h3 id="heading-forking-making-your-own-copy"><strong>Forking: Making Your Own Copy</strong></h3>
<p>Imagine seeing a great recipe in a cookbook. You want to try adding a new spice to it, but you wouldn't write directly in the original book. Instead, you'd photocopy the page.</p>
<p>In open source, we call this "forking". It's a process of creating a personal copy of the project’s code under your own GitHub account.</p>
<h3 id="heading-cloning-bringing-it-to-your-machine"><strong>Cloning: Bringing It to Your Machine</strong></h3>
<p>Now that you have your "photocopy" on GitHub. You need to move it onto your local computer. This lets you actually work on it. We call this step "cloning".</p>
<h3 id="heading-the-branch-keeping-things-organized"><strong>The Branch: Keeping Things Organized</strong></h3>
<p>Before you start typing, you have to create a branch. Think of this as a safe workspace. It lets you work on a feature or fix. It keeps you from messing up the original code.</p>
<h3 id="heading-committing-saving-your-progress"><strong>Committing: Saving Your Progress</strong></h3>
<p>You might write code. You might fix a typo in the guide. When you are done, you "save" your work using a "commit". Every commit needs a message. For example, you can write, "Fixed a typo in the README." This tells others exactly what you changed and why.</p>
<h3 id="heading-the-pull-request-pr-asking-for-a-review"><strong>The Pull Request (PR): Asking for a Review</strong></h3>
<p>This is the most important part! Once your changes are ready, you send a "pull request".</p>
<p>You send this back to the original project. You are basically saying, "Hey, I've made these improvements to your recipe. Would you like to pull them into the main cookbook?"</p>
<h3 id="heading-the-review-and-merge"><strong>The Review and Merge</strong></h3>
<p>The maintainers will look at your PR. They might ask you to change a few things or fix a small bug. Once they approve the quality, they merge your work. Your code officially joins the project and others can use it!</p>
<h3 id="heading-why-this-workflow-shapes-your-career"><strong>Why This Workflow Shapes Your Career</strong></h3>
<p>This process isn't just about code, it's about collaboration.</p>
<p>When a recruiter sees your pull requests, they see three things. A normal resume cannot show these things:</p>
<ul>
<li><p><strong>Version Control Mastery:</strong> You clearly know how to use Git and GitHub in a professional way.</p>
</li>
<li><p><strong>Communication Skills:</strong> They can see how you handle feedback. They see how you explain your logic to others.</p>
</li>
<li><p><strong>Professional Persistence:</strong> They see you follow a task from start to finish.</p>
</li>
</ul>
<h2 id="heading-the-role-of-maintainers-contributors-and-communities"><strong>The Role of Maintainers, Contributors, and Communities</strong></h2>
<p>Code builds open source. However, people drive it. To do well in this space, you need to understand three main roles. These roles keep a project alive.</p>
<h3 id="heading-the-maintainers-your-guides-and-gatekeepers"><strong>The Maintainers (Your Guides and Gatekeepers)</strong></h3>
<p>Maintainers are the backbone of any open-source project. They are experienced developers. They manage the project, and also help you move forward in your journey.</p>
<p>You might solve an issue and open a PR. However, the project does not merge your code automatically. The team performs a careful review process, and your code must match the project's quality standards and pass tests.</p>
<p>Maintainers handle all of this review. They give feedback, ask for changes. and finally, they approve your work.</p>
<h3 id="heading-the-contributors-that-is-you"><strong>The Contributors (That Is You!)</strong></h3>
<p>Contributors are the engine of innovation. You do not need permission to become a contributor. You find a problem and offer a solution. Contributors write code and fix bugs.</p>
<p>They design interfaces. They also improve guides. Every maintainer started exactly where you are today.</p>
<h3 id="heading-the-communities-the-welcoming-committee"><strong>The Communities (The Welcoming Committee)</strong></h3>
<p>You might feel scared to share your code publicly. But the reality is very supportive. There are many open-source communities that actively welcome newcomers. They want to help you succeed.</p>
<p>These communities usually live on Discord, Slack, or GitHub Discussions. They provide a safe space. You can ask questions there. You can ask for help when your code breaks. And you can learn from more experienced developers.</p>
<h2 id="heading-common-misconceptions-about-open-source"><strong>Common Misconceptions About Open Source</strong></h2>
<p>Before you make your first contribution, we need to clear up a few myths.</p>
<p>Many beginners delay their open-source journey for months because of false ideas. Let’s break the most common myths right now.</p>
<h3 id="heading-myth-1-open-source-is-only-for-experienced-developers"><strong>Myth 1: Open Source Is Only for Experienced Developers</strong></h3>
<ul>
<li><p><strong>The Reality:</strong> This is entirely wrong. You do not need to be a senior engineer to contribute. Many repositories offer easy tasks. They often tag these with labels like <code>good first issue</code>.</p>
</li>
<li><p><strong>The Secret:</strong> Open source is not just about writing code. You have huge opportunities for non-code contributions. For example, you can fix a project's documentation. Good documentation acts as the lifeline of any project. Maintainers love beginners who help improve it.</p>
</li>
</ul>
<h3 id="heading-myth-2-you-have-to-understand-the-entire-codebase-before-you-can-fix-anything"><strong>Myth 2: You Have to Understand the Entire Codebase Before You Can Fix Anything</strong></h3>
<ul>
<li><strong>The Reality:</strong> Massive projects can have hundreds of thousands of lines of code. Nobody understands all of it. Not even the core team! You only need to understand the tiny section where your bug lives. Think of it like fixing a leaky sink in a mansion. You don't need to memorize the blueprints for the entire house. You just need to understand the kitchen.</li>
</ul>
<h3 id="heading-myth-3-maintainers-are-harsh-and-will-mock-a-beginners-code"><strong>Myth 3: Maintainers Are Harsh and Will Mock a Beginner's Code</strong></h3>
<ul>
<li><strong>The Reality:</strong> Beginners often fear getting fear for writing "bad" code. In reality, maintainers are just regular people. They feel incredibly grateful for free help. As long as you remain respectful and read their <code>CONTRIBUTING.md</code> guidelines, they will act as patient mentors. They want you to succeed.</li>
</ul>
<h3 id="heading-myth-4-open-source-doesnt-pay-so-its-a-waste-of-time"><strong>Myth 4: Open Source Doesn't Pay, So It's a Waste of Time</strong></h3>
<ul>
<li><strong>The Reality:</strong> You might not get a direct paycheck for submitting a pull request. However, the return on investment is massive. Your public portfolio leads directly to full-time job offers. There are also paid programs. Programs like Google Summer of Code or Outreachy actually pay beginners to contribute.</li>
</ul>
<h2 id="heading-the-downsides-of-open-source-an-honest-perspective"><strong>The Downsides of Open Source (An Honest Perspective)</strong></h2>
<p>Open source is a great way to build your career. But it is not perfect. If you think everything will be fast and easy, you might get upset. Here is an honest look at the real problems you will face.</p>
<h3 id="heading-long-wait-times-tired-maintainers"><strong>Long Wait Times (Tired Maintainers)</strong></h3>
<p>Most maintainers work on these projects for free. When a project gets popular, they get too many updates to look at. They work very hard just to keep up.</p>
<ul>
<li><strong>The Downside:</strong> You might send in great code. But it could take weeks for a maintainer to look at it. You must learn to be patient. Do not feel bad if they remain quiet.</li>
</ul>
<h3 id="heading-strict-rules-for-adding-code"><strong>Strict Rules for Adding Code</strong></h3>
<p>Big projects set strict rules for adding code. It is rarely as easy as clicking a "Save" button.</p>
<ul>
<li><strong>The Downside:</strong> Big projects run strict tests automatically. The system might reject your code many times because of a missing comma. This can happen before a human even sees it.</li>
</ul>
<h3 id="heading-inactive-projects"><strong>Inactive Projects</strong></h3>
<p>There are millions of projects on GitHub. Not all of them are active.</p>
<ul>
<li><strong>The Downside:</strong> Beginners often spend hours fixing a bug. Then they find out the creator has not updated the project in two years. This teaches a hard lesson. Always check if a project is still active before you start working.</li>
</ul>
<h3 id="heading-high-competition-for-easy-tasks"><strong>High Competition for Easy Tasks</strong></h3>
<p>Many projects mark easy tasks for beginners. But you are not the only one looking for them.</p>
<ul>
<li><strong>The Downside:</strong> Many people try to grab a <code>good first issue</code> label in minutes. It can be sad to feel like you are always too late. You will need to learn how to claim tasks quickly. You can also find smaller projects to make your first change.</li>
</ul>
<h2 id="heading-why-open-source-matters-for-developers"><strong>Why Open Source Matters for Developers</strong></h2>
<p>Open source offers many great benefits. It is not just about writing free code. It is about building your future. Here is why spending time in open source is a great move.</p>
<h3 id="heading-real-world-skills-for-free"><strong>Real-World Skills for Free</strong></h3>
<p>You do not need to pay for an expensive course to learn software development. Open source gives you hands-on coding skills. You learn how big projects work, how teams work together, and how to write clean code.</p>
<h3 id="heading-a-low-risk-way-to-test-the-waters"><strong>A Low-Risk Way to Test the Waters</strong></h3>
<p>How do you know if you actually like a certain job? Open source is the perfect place for self-exploration.</p>
<ul>
<li><p>It is a low-risk way to see if a tech stack fits you.</p>
</li>
<li><p>You can try being a full-stack developer or a technical writer for a few weeks. You do not have to quit a job. If you do not like it, you can just try a different project!</p>
</li>
</ul>
<h3 id="heading-global-networking-and-mentorship"><strong>Global Networking and Mentorship</strong></h3>
<p>Open source connects you to the whole world. You can build a network with smart people. You can get free guidance from some of the best developers on the planet. As you grow, these connections can even lead to speaking at tech conferences.</p>
<h3 id="heading-your-public-proof-of-work"><strong>Your Public "Proof of Work"</strong></h3>
<p>A normal resume just tells people what you can do. Open source actually shows them.</p>
<ul>
<li><p>Your GitHub profile acts as your "Proof of Work."</p>
</li>
<li><p>Companies trust your skills when they see your code merged into a real project.</p>
</li>
</ul>
<h3 id="heading-jobs-and-internships"><strong>Jobs and Internships</strong></h3>
<p>Open source is a direct path to getting hired. You might be a student looking for an internship, or a professional looking for a remote job. Companies actively look for open-source contributors. It shows you know how to work well with a team.</p>
<h2 id="heading-skills-you-develop-beyond-coding"><strong>Skills You Develop Beyond Coding</strong></h2>
<p>When you contribute to open source, you learn more than just code. You learn how to be a professional. Hiring managers look for these exact skills.</p>
<h3 id="heading-clear-communication-and-writing"><strong>Clear Communication and Writing</strong></h3>
<p>In open source, you work with people you have never met. You cannot tap them on the shoulder to explain an idea.</p>
<p>You have to write it down.</p>
<ul>
<li><p>You learn how to explain a problem clearly.</p>
</li>
<li><p>You learn how to write good technical guides.</p>
</li>
<li><p>You learn how to talk to people across different time zones.</p>
</li>
</ul>
<h3 id="heading-testing-and-finding-bugs"><strong>Testing and Finding Bugs</strong></h3>
<p>The team must approve your code before adding it. Open source teaches you how to think like a software tester. You learn how to find hidden bugs, write tests for your code, and make sure your changes do not break the app.</p>
<h3 id="heading-seeing-the-big-picture"><strong>Seeing the Big Picture</strong></h3>
<p>Big projects let you see how everything connects. You start to understand how the front-end talks to the back-end. This helps you grow into a full-stack developer. You see how the whole system works together.</p>
<h3 id="heading-taking-feedback-and-giving-it"><strong>Taking Feedback (and Giving It)</strong></h3>
<p>A maintainer will tell you what is wrong with your code. This teaches you how to take feedback without getting upset. You also learn how to review other people's work respectfully.</p>
<h3 id="heading-managing-your-own-time"><strong>Managing Your Own Time</strong></h3>
<p>No one is forcing you to contribute. You have to set your own schedule. This teaches you how to manage your time from home. Companies love this. It shows you can be trusted to work remotely.</p>
<h2 id="heading-proof-of-work-vs-resume-claims"><strong>Proof of Work vs. Resume Claims</strong></h2>
<p>A normal resume lists the tools you know. You might type, "I know React." But anyone can type words on a page. A hiring manager doesn't know if your skills are actually good.</p>
<p>Open source changes the game. It gives you <strong>Proof of Work</strong>.</p>
<h3 id="heading-showing-instead-of-telling"><strong>Showing Instead of Telling</strong></h3>
<p>Open source lets you show your tech stack. Every time you change a project, you open a pull request (PR). This PR is public.</p>
<p>A company gets to see the real you. They do not have to guess. They look at your PR and see:</p>
<ul>
<li><p>Exactly how you format your code.</p>
</li>
<li><p>How you fix problems and bugs.</p>
</li>
<li><p>How you talk to maintainers.</p>
</li>
</ul>
<h3 id="heading-the-ultimate-job-application"><strong>The Ultimate Job Application</strong></h3>
<p>Your merged pull requests are your public portfolio. A resume is just a claim. A merged PR is real proof. It proves your skills are ready for the real world.</p>
<h2 id="heading-collaboration-communication-and-professional-visibility"><strong>Collaboration, Communication, and Professional Visibility</strong></h2>
<p>Open source is about collaboration. Anyone in the world can join a project. You must learn how to work well with others. Here is how to grow as a team player.</p>
<h3 id="heading-helping-others-is-a-contribution"><strong>Helping Others Is a Contribution</strong></h3>
<p>Many beginners think they only add value when they write code. This is not true. Helping other developers is a huge part of open source.</p>
<ul>
<li><p>Take time to help someone else.</p>
</li>
<li><p>Answer questions in Discord or Slack channels.</p>
</li>
<li><p>Helping a new person fix an error shows you are a team player.</p>
</li>
</ul>
<h3 id="heading-learning-asynchronous-communication"><strong>Learning "Asynchronous" Communication</strong></h3>
<p>Open source is a global community. The person you are working with might live across the world. You will use asynchronous communication. This means you will not get an answer right away. You might send a message while the maintainer is sleeping.</p>
<p>They will reply hours later. You have to write very clear messages. This gives them all the details they need.</p>
<h3 id="heading-soft-skills-and-respecting-maintainers"><strong>Soft Skills and Respecting Maintainers</strong></h3>
<p>Your "soft skills" matter just as much as your coding skills. You must always show complete respect.</p>
<ul>
<li><p>Most project maintainers do not get paid. They do this work for free.</p>
</li>
<li><p>They give you their free time to review your work.</p>
</li>
<li><p>Do not get angry if a maintainer asks you to change your code. Make the changes and thank them.</p>
</li>
</ul>
<h3 id="heading-building-professional-visibility"><strong>Building Professional Visibility</strong></h3>
<p>People notice when you help others and write good code. You do all of this work in public.</p>
<ul>
<li><p>Your GitHub profile records these good habits.</p>
</li>
<li><p>It is real proof of your character.</p>
</li>
<li><p>Companies see a kind, helpful professional who works well on a global team.</p>
</li>
</ul>
<h2 id="heading-how-open-source-connects-to-jobs-referrals-and-remote-work"><strong>How Open Source Connects to Jobs, Referrals, and Remote Work</strong></h2>
<p>Many people use open source as a bridge to get a tech job. Here is exactly how free code connects to a paid career.</p>
<h3 id="heading-the-direct-path-to-hiring"><strong>The Direct Path to Hiring</strong></h3>
<p>Big companies build and use open-source tools. When they need to hire, they do not just look at resumes. They look at the people already fixing their code on GitHub.</p>
<p>You are proving you can do the job! Recruiters often send messages saying, "We love your free work. Would you like to come work for us full-time?"</p>
<h3 id="heading-earning-real-job-referrals"><strong>Earning Real Job Referrals</strong></h3>
<p>Getting a job is often about who you know. You code next to senior developers in open source. These developers will remember your name if you do good work. Later, you can ask them for a referral. This puts your name at the very top of the hiring list.</p>
<h3 id="heading-proving-you-are-ready-for-remote-work"><strong>Proving You Are Ready for Remote Work</strong></h3>
<p>Working from home is a dream for many developers. Companies want to be sure they can trust you.</p>
<p>Open source is exactly like remote work. You prove that you can:</p>
<ul>
<li><p>Manage your own time.</p>
</li>
<li><p>Talk clearly through text across different time zones.</p>
</li>
<li><p>Use tools like Git and GitHub.</p>
</li>
<li><p>Solve hard problems from your own desk.</p>
</li>
</ul>
<p>Hiring managers know you are trained for a remote job. They can trust you from day one.</p>
<h2 id="heading-what-you-really-need-before-contributing"><strong>What You Really Need Before Contributing</strong></h2>
<p>You need a few basic things before you make your first change. You do not need to be an expert. You just need simple tools and the right mindset.</p>
<h3 id="heading-a-github-account"><strong>A GitHub Account</strong></h3>
<p>Almost all work happens on GitHub. Create a free account. This will be your public profile.</p>
<h3 id="heading-basic-knowledge-of-git"><strong>Basic Knowledge of Git</strong></h3>
<p>Git is the tool developers use to save code. You only need to learn the basics:</p>
<ul>
<li><p>How to copy a project (<code>clone</code>).</p>
</li>
<li><p>How to save your changes (<code>commit</code>).</p>
</li>
<li><p>How to send changes to GitHub (<code>push</code>).</p>
</li>
<li><p>How to ask maintainers to look at your work (<code>pull request</code>).</p>
</li>
</ul>
<h3 id="heading-one-core-skill-code-or-writing"><strong>One Core Skill (Code or Writing)</strong></h3>
<p>You do not need to know ten programming languages. You just need one core skill.</p>
<ul>
<li><p>Know basic HTML and CSS? You can fix how a website looks.</p>
</li>
<li><p>Know basic Python or JavaScript? You can fix small bugs.</p>
</li>
<li><p>Don't know how to code? You can be a technical writer. You can help fix documentation.</p>
</li>
</ul>
<h3 id="heading-a-code-editor"><strong>A Code Editor</strong></h3>
<p>You need a place to type code. Download a free editor like VS Code. It is very easy to use.</p>
<h3 id="heading-patience-and-willingness-to-read"><strong>Patience and Willingness to Read</strong></h3>
<p>This is the most important tool. You must read the project's rules before you ask a question.</p>
<p>Read the <code>README.md</code> and <code>CONTRIBUTING.md</code> files carefully. They tell you exactly how to set up the project.</p>
<h2 id="heading-choosing-the-right-projects-and-tech-stack"><strong>Choosing the Right Projects and Tech Stack</strong></h2>
<p>Finding your first project can feel hard. There are so many choices. But it is easy if you know where to look.</p>
<h3 id="heading-how-to-find-the-right-project"><strong>How to Find the Right Project</strong></h3>
<p>You can use a few simple tricks to find projects that want help:</p>
<ul>
<li><p><strong>Search GitHub:</strong> Look for very active projects. Check for a <code>good first issue</code> label. This means the project welcomes beginners.</p>
</li>
<li><p><strong>Use Google:</strong> Search for "Top open source projects for beginners."</p>
</li>
<li><p><strong>Visit the GSoC Website:</strong> Go to the Google Summer of Code website. It has a huge list of groups. You can filter the list to find exact coding languages.</p>
</li>
</ul>
<h3 id="heading-choosing-your-tech-stack"><strong>Choosing Your Tech Stack</strong></h3>
<p>A "tech stack" is the group of tools used to build software. You can choose from many areas:</p>
<ul>
<li><p><strong>Web Development:</strong> Building websites (HTML, CSS, JavaScript, React).</p>
</li>
<li><p><strong>Mobile Development:</strong> Building phone apps (Swift, Kotlin, Flutter).</p>
</li>
<li><p><strong>AI and Machine Learning:</strong> Working with smart data (Python).</p>
</li>
<li><p><strong>Cloud and DevOps:</strong> Helping software run on the internet (Docker, AWS).</p>
</li>
<li><p><strong>Web3:</strong> Working with blockchain technology.</p>
</li>
</ul>
<h3 id="heading-pick-what-fits-you"><strong>Pick What Fits You</strong></h3>
<p>Select a path based on the skills you already have. Look for a web project if you are learning web development. Open source is the best place to practice the skills you want to use in a future job.</p>
<h2 id="heading-types-of-contributions-code-documentation-design-and-more"><strong>Types of Contributions (Code, Documentation, Design, and More)</strong></h2>
<p>Open source needs all kinds of skills to survive. Think of a project like building a house. You need builders, painters, and instruction writers. Here are the different ways you can contribute:</p>
<h3 id="heading-code-contributions-the-builders"><strong>Code Contributions (The Builders)</strong></h3>
<p>If you know how to code, you can help build the software.</p>
<ul>
<li><p><strong>Fixing Bugs:</strong> Find a small error and fix it.</p>
</li>
<li><p><strong>Adding Features:</strong> Write new code to do something new.</p>
</li>
<li><p><strong>Writing Tests:</strong> Write bits of code to check if the software works.</p>
</li>
</ul>
<h3 id="heading-documentation-the-teachers"><strong>Documentation (The Teachers)</strong></h3>
<p>Every good project needs instructions. You do not need to know how to code to do this!</p>
<ul>
<li><p><strong>Writing Guides:</strong> Write simple steps on how to use the project.</p>
</li>
<li><p><strong>Fixing Typos:</strong> Read the <code>README.md</code> file and fix spelling mistakes.</p>
</li>
<li><p><strong>Translating:</strong> Translate guides into another language.</p>
</li>
</ul>
<h3 id="heading-design-and-art-the-painters"><strong>Design and Art (The Painters)</strong></h3>
<p>Software needs to look good and be easy to use.</p>
<ul>
<li><p><strong>Making Logos:</strong> Create a cool logo or icon.</p>
</li>
<li><p><strong>Improving Design (UI/UX):</strong> Make menus easier to click.</p>
</li>
<li><p><strong>Creating Pictures:</strong> Draw diagrams to explain how things work.</p>
</li>
</ul>
<h3 id="heading-community-and-support-the-helpers"><strong>Community and Support (The Helpers)</strong></h3>
<p>A project is nothing without its people.</p>
<ul>
<li><p><strong>Answering Questions:</strong> Go to Discord and help beginners.</p>
</li>
<li><p><strong>Organizing Events:</strong> Help plan online meetings.</p>
</li>
<li><p><strong>Testing:</strong> Use the software and report any problems.</p>
</li>
</ul>
<h2 id="heading-practical-demonstration-from-forking-to-creating-a-pull-request"><strong>Practical Demonstration: From Forking to Creating a Pull Request</strong></h2>
<p>Now it is time to put everything together. We are going to walk through the exact steps to make a change on GitHub.</p>
<h3 id="heading-step-1-fork-the-project"><strong>Step 1: Fork the Project</strong></h3>
<p>Go to the GitHub page of the project you want to help. Click the Fork button in the top right corner. This makes a complete copy of the project. It puts it in your own GitHub account, so cannot break the original one!</p>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/3383d02e-4f8b-48e3-8537-2b701cb09706.png" alt="3383d02e-4f8b-48e3-8537-2b701cb09706" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<h3 id="heading-step-2-clone-it-to-your-computer"><strong>Step 2: Clone It to Your Computer</strong></h3>
<p>Now, download that code to your own computer.</p>
<ol>
<li><p>Go to your new copied project.</p>
</li>
<li><p>Click the green Code button and copy the web link.</p>
</li>
<li><p>Open your computer's terminal. Type: <code>git clone [paste your link here]</code></p>
</li>
</ol>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/cbac87b7-47e4-483b-aa70-2b48e20a1a68.png" alt="cbac87b7-47e4-483b-aa70-2b48e20a1a68" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<h3 id="heading-step-3-create-a-new-branch"><strong>Step 3: Create a New Branch</strong></h3>
<p>You must create a safe workspace before you change files. This is called a "branch." Type this command: <code>git checkout -b &lt;branch_name&gt;.</code></p>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/00faae3e-f3c3-4f2f-aa81-8de8186c1164.png" alt="00faae3e-f3c3-4f2f-aa81-8de8186c1164" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<h3 id="heading-step-4-make-your-changes"><strong>Step 4: Make Your Changes</strong></h3>
<p>Open the project folder in VS Code. Find the file you want to fix. Make your change and save the file.</p>
<h3 id="heading-step-5-save-commit-your-work"><strong>Step 5: Save (Commit) Your Work</strong></h3>
<p>Tell Git you are done making changes. Type these two commands:</p>
<ol>
<li><p><code>git add .</code></p>
</li>
<li><p><code>git commit -m "Fixed a spelling mistake in the README."</code></p>
</li>
</ol>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/51c9b32f-23ec-4af2-baac-7fa9098a858e.png" alt="51c9b32f-23ec-4af2-baac-7fa9098a858e" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<h3 id="heading-step-6-push-the-code-back-to-github"><strong>Step 6: Push the Code Back to GitHub</strong></h3>
<p>Send your changes back up to your GitHub account. Type this command: <code>git push origin &lt;branch_name&gt;.</code></p>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/d7fc25bb-1cb3-4270-89f0-182113ecea92.png" alt="d7fc25bb-1cb3-4270-89f0-182113ecea92" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<h3 id="heading-step-7-create-the-pull-request-pr"><strong>Step 7: Create the Pull Request (PR)</strong></h3>
<p>Go back to your GitHub page. Click the big green Compare &amp; pull request button. Write a nice note to the project maintainers. Click Create pull request.</p>
<p>Congratulations! You sent your first open-source contribution!</p>
<img src="https://cdn.hashnode.com/uploads/covers/6729b04417afd6915f5c2e3e/a9b37aa1-0cbb-4494-b187-1ed669b70051.png" alt="a9b37aa1-0cbb-4494-b187-1ed669b70051" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<h2 id="heading-working-with-maintainers-and-handling-feedback"><strong>Working With Maintainers and Handling Feedback</strong></h2>
<p>Your job is not done yet. Now, you get to work with the maintainers. This is how you handle the review process.</p>
<h3 id="heading-the-waiting-game"><strong>The Waiting Game</strong></h3>
<p>You have to wait after you send a PR. Remember, maintainers are busy people working for free.</p>
<ul>
<li><p>Do not leave angry comments.</p>
</li>
<li><p>Do not tag them every day.</p>
</li>
<li><p>Be patient. It might take a week for a reply.</p>
</li>
</ul>
<h3 id="heading-it-is-about-the-code-not-you"><strong>It Is About the Code, Not You</strong></h3>
<p>Maintainers will leave comments. They might say, "Please change this word," or "Your code breaks this rule." Do not feel bad! The maintainer is not saying you are a bad coder. They want you to succeed.</p>
<h3 id="heading-how-to-make-the-changes"><strong>How to Make the Changes</strong></h3>
<p>Do not close your PR if they ask for a change! It is easy to update it.</p>
<ul>
<li><p>Make the changes in your code editor.</p>
</li>
<li><p>Save the file.</p>
</li>
<li><p>Type <code>git add .</code> and <code>git commit -m "Fixed the feedback."</code></p>
</li>
<li><p>Type <code>git push origin &lt;branch_name&gt;</code>.</p>
</li>
</ul>
<p>Your Pull Request on GitHub will update all by itself!</p>
<h3 id="heading-say-thank-you"><strong>Say Thank You</strong></h3>
<p>Good manners go a long way. Always say thank you when a maintainer reviews your code. When everything looks good, they will click <code>Merge</code>. Your work is now permanent!</p>
<h2 id="heading-learning-in-public"><strong>Learning in Public</strong></h2>
<p>"Learning in public" means sharing your progress with the world. Doing this acts as real proof of your skills.</p>
<p>It opens up many new chances for your career.</p>
<h3 id="heading-the-bigger-impact-of-asking-questions"><strong>The Bigger Impact of Asking Questions</strong></h3>
<p>Ask your questions publicly in a forum or a channel. Asking in public creates a bigger impact:</p>
<ul>
<li><p>You get answers from the whole community.</p>
</li>
<li><p>Another beginner can search and find your public conversation later.</p>
</li>
<li><p>You are actually helping others solve their problems!</p>
</li>
</ul>
<h3 id="heading-building-trust-and-proof-of-work"><strong>Building Trust and Proof of Work</strong></h3>
<p>People start to trust you when you share what you learn. Your public posts act as proof of work. This can easily lead to a job offer or internship.</p>
<h3 id="heading-where-to-share-your-journey"><strong>Where to Share Your Journey</strong></h3>
<p>You just need to talk about what you learned today. Here are ways to do it:</p>
<ul>
<li><p><strong>Short Updates:</strong> Write short posts on X (Twitter) or LinkedIn about a new tool you tried.</p>
</li>
<li><p><strong>Longer Articles:</strong> Write full articles on platforms like <a href="https://hashnode.com/">Hashnode</a>, <a href="http://Dev.to">Dev.to</a>, or <a href="https://medium.com/">Medium</a>.</p>
</li>
</ul>
<h2 id="heading-blogging-and-documenting-your-work"><strong>Blogging and Documenting Your Work</strong></h2>
<p>Writing about your open-source work is very important. You help others learn. You also leave a clear record of your skills.</p>
<h3 id="heading-short-posts-vs-long-articles"><strong>Short Posts vs. Long Articles</strong></h3>
<p>You can share your work in two ways:</p>
<ul>
<li><p><strong>Short Posts:</strong> Use LinkedIn to share quick wins. Write, "Today I fixed my first bug!"</p>
</li>
<li><p><strong>Long Blogs:</strong> Write step-by-step guides on <a href="https://hashnode.com/">Hashnode</a>, <a href="https://medium.com/">Medium</a>, or <a href="https://dev.to/">dev.to</a>.</p>
</li>
<li><p><strong>Write for freeCodeCamp:</strong> You can even apply to write articles directly for freeCodeCamp!</p>
</li>
</ul>
<h3 id="heading-do-not-wait-to-be-perfect"><strong>Do Not Wait to Be Perfect</strong></h3>
<p>Do not wait for your blog to be perfect. Just hit publish. You will improve your skills naturally. Make each new blog a little bit better than the last one.</p>
<h3 id="heading-how-to-learn-technical-writing"><strong>How to Learn Technical Writing</strong></h3>
<p>There are great free tools to help you learn. Check out the <a href="https://www.youtube.com/@ShowwcaseHQ">Showwcase</a> YouTube channel. They have plenty of videos for beginners.</p>
<h3 id="heading-a-path-to-new-jobs"><strong>A Path to New Jobs</strong></h3>
<p>Writing about your code can lead to new career choices. You build a public portfolio. This can lead to job offers in technical writing. Companies love developers who can explain tech simply!</p>
<h2 id="heading-building-a-personal-brand-through-open-source"><strong>Building a Personal Brand Through Open Source</strong></h2>
<p>A personal brand is simply what people think of when they see your name online. Open source builds this brand for you naturally.</p>
<h3 id="heading-your-living-portfolio"><strong>Your Living Portfolio</strong></h3>
<p>You build a living, public portfolio when you share your journey.</p>
<ul>
<li><p>Every pull request is part of your portfolio.</p>
</li>
<li><p>Every blog post is part of your portfolio.</p>
</li>
<li><p>Every time you help a new person, it becomes public record.</p>
</li>
</ul>
<h3 id="heading-it-happens-automatically"><strong>It Happens Automatically</strong></h3>
<p>You do not have to try hard to build a brand. It happens automatically.</p>
<p>You naturally build your brand as an "Open Source Contributor." People will know you as someone who is helpful and smart.</p>
<h3 id="heading-let-your-work-do-the-talking"><strong>Let Your Work Do the Talking</strong></h3>
<p>Your code, writing, and kindness do the talking for you. Hiring managers will see a trusted, active member of the global tech community.</p>
<h2 id="heading-open-source-programs-internships-and-opportunities"><strong>Open Source Programs, Internships, and Opportunities</strong></h2>
<p>Open source is not only volunteer work. There are amazing programs that will actually pay you to learn and write code.</p>
<h3 id="heading-google-summer-of-code-gsoc"><a href="https://summerofcode.withgoogle.com/"><strong>Google Summer of Code (GSoC)</strong></a></h3>
<p>Google runs this program every year.</p>
<ul>
<li><strong>How It Works:</strong> You suggest a project. Google pays you real money to write code over the summer and you get a mentor to guide you.</li>
</ul>
<h3 id="heading-outreachy"><a href="https://www.outreachy.org/"><strong>Outreachy</strong></a></h3>
<p>Outreachy provides paid remote internships.</p>
<ul>
<li><strong>How It Works:</strong> You can apply to do design work, marketing, or write guides. You work from home and get paid.</li>
</ul>
<h3 id="heading-major-league-hacking-mlh-fellowship"><a href="https://fellowship.mlh.io/"><strong>Major League Hacking (MLH) Fellowship</strong></a></h3>
<p>The MLH Fellowship is like a remote internship.</p>
<ul>
<li><strong>How It Works:</strong> A professional mentor guides your team. You get paid and help major open-source projects.</li>
</ul>
<h3 id="heading-open-source-design-for-uiux-and-art"><a href="https://opensourcedesign.net/"><strong>Open Source Design (For UI/UX and Art)</strong></a></h3>
<p>This community connects designers with open-source projects.</p>
<ul>
<li><strong>How It Works:</strong> Projects ask for help making logos or doing user research. Some of these are paid jobs.</li>
</ul>
<h3 id="heading-the-good-docs-project-for-writers"><a href="https://www.thegooddocsproject.dev/"><strong>The Good Docs Project (For Writers)</strong></a></h3>
<p>This community focuses on improving open-source instructions.</p>
<ul>
<li><strong>How It Works:</strong> You practice writing guides. You get feedback from expert writers. You build a public writing portfolio.</li>
</ul>
<h3 id="heading-lfx-mentorship-linux-foundation"><a href="https://lfx.linuxfoundation.org/tools/mentorship/"><strong>LFX Mentorship (Linux Foundation)</strong></a></h3>
<p>The Linux Foundation runs a great mentorship program.</p>
<ul>
<li><strong>How It Works:</strong> You can learn about technical writing or community management. Many of these tracks pay you while you learn.</li>
</ul>
<h3 id="heading-paid-tutorial-programs-freelance-writing"><strong>Paid Tutorial Programs (Freelance Writing)</strong></h3>
<p>Cloud hosting companies need clear guides on how to set up open-source software.</p>
<ul>
<li><strong>How It Works:</strong> Companies will pay you to write step-by-step guides. This is a great way to earn a part-time income.</li>
</ul>
<h2 id="heading-it-is-never-too-late-to-start"><strong>It Is Never Too Late to Start</strong></h2>
<p>Many people worry that they missed their chance. This is completely false. Your age never matters in open source.</p>
<h3 id="heading-the-code-does-not-care-how-old-you-are"><strong>The Code Does Not Care How Old You Are</strong></h3>
<p>Nobody asks for your age. The community only cares about one thing: Does your work help the project? You will be welcomed if you help the community.</p>
<h3 id="heading-consistency-is-the-real-secret"><strong>Consistency Is the Real Secret</strong></h3>
<p>You do not need to be the fastest coder. The only thing that matters is that you start and stay consistent.</p>
<ul>
<li><p>Doing one small thing every week is best.</p>
</li>
<li><p>Keep showing up in the community.</p>
</li>
<li><p>These small steps will build a massive portfolio.</p>
</li>
</ul>
<h3 id="heading-your-past-experience-is-a-superpower"><strong>Your Past Experience Is a Superpower</strong></h3>
<p>You have a big advantage if you are starting later in life. You already know how to manage your time and work on a team. Do not wait for the perfect time. The perfect time is right now.</p>
<h2 id="heading-conclusion-your-next-steps"><strong>Conclusion — Your Next Steps</strong></h2>
<p>You made it to the end of this handbook! You now know what open source is. You know how it works and how it can change your career.</p>
<p>You don't need to be an expert coder to start. You just need to try. You also need to be willing to learn in public.</p>
<p>Reading this guide was your first step. Now it is time to take real action. Here is a simple checklist for this week:</p>
<h3 id="heading-your-action-plan"><strong>Your Action Plan</strong></h3>
<ol>
<li><p><strong>Set Up Your Tools:</strong> Make a free GitHub account and download VS Code.</p>
</li>
<li><p><strong>Find Your First Project:</strong> Search for a project that welcomes beginners. Look for the <code>good first issue</code> label.</p>
</li>
<li><p><strong>Say Hello:</strong> Join the project's Discord or Slack. Tell them you want to help.</p>
</li>
<li><p><strong>Try Technical Writing:</strong> Pick an open-source tool. Figure out how to set it up. Write a simple guide about it.</p>
</li>
<li><p><strong>Share Your Start:</strong> Write a short post online to say you are starting your open-source journey.</p>
</li>
</ol>
<p>Open source is a massive world. But it is a friendly one. Every great developer started exactly where you are right now. Do not wait for the perfect moment. Make your first contribution today. Start building your future!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Build a Résumé Screening System Using Python and Multiprocessing ]]>
                </title>
                <description>
                    <![CDATA[ Hiring the right candidate starts with one time-consuming task: screening résumés. If you’ve ever posted a job opening, you know the pain of hundreds of applications in your inbox, leaving you to spend hours reviewing each résumé manually. In this ar... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/python-resume-screening-system/</link>
                <guid isPermaLink="false">698614754058fffacf721cc8</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                    <category>
                        <![CDATA[ streamlit ]]>
                    </category>
                
                    <category>
                        <![CDATA[ multiprocessing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ automation ]]>
                    </category>
                
                    <category>
                        <![CDATA[ pdf ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Abdul Talha ]]>
                </dc:creator>
                <pubDate>Fri, 06 Feb 2026 16:19:01 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1770331777028/1ac80e66-cf22-4160-8812-ea917384cd3f.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Hiring the right candidate starts with one time-consuming task: screening résumés. If you’ve ever posted a job opening, you know the pain of hundreds of applications in your inbox, leaving you to spend hours reviewing each résumé manually.</p>
<p>In this article, you’ll build a résumé screening system using pure Python, focusing on core programming concepts and the power of multiprocessing. You’ll create a custom system that automates the evaluation process by transforming unstructured résumé documents into a ranked leaderboard.</p>
<p>By the end of this guide, you will:</p>
<ul>
<li><p>Parse documents by extracting text from PDF and DOCX résumés using Python</p>
</li>
<li><p>Extract information by identifying skills and keywords from résumé content</p>
</li>
<li><p>Design a scoring algorithm using weighted logic to rank candidates objectively</p>
</li>
<li><p>Build a web interface using Streamlit</p>
</li>
<li><p>Deploy the application on Streamlit Cloud for public access</p>
</li>
</ul>
<p>By following this tutorial, you’ll build a tool capable of processing hundreds of résumés in seconds.</p>
<p>Here’s the source code: <a target="_blank" href="https://github.com/abdultalha0862/Resume_Parser_Project">GitHub Repository</a></p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><p><a class="post-section-overview" href="#heading-prerequisites">Prerequisites</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-project-overview">Project Overview</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-the-system-works">How the System Works</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-system-architecture">System Architecture</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-project-structure">Project Structure</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-step-1-set-up-the-project">Step 1: Set Up the Project</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-step-2-build-the-resume-parser">Step 2: Build the Résumé Parser</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-step-3-build-the-keyword-extractor">Step 3: Build the Keyword Extractor</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-step-4-implement-the-scoring-engine">Step 4: Implement the Scoring Engine</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-step-5-build-the-web-interface">Step 5: Build the Web Interface</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-step-6-test-the-system">Step 6: Test the System</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-step-7-deploy-the-application">Step 7: Deploy the Application</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-conclusion">Conclusion</a></p>
</li>
</ul>
<h2 id="heading-prerequisites">Prerequisites</h2>
<p>To follow along with this tutorial, you should have:</p>
<ul>
<li><p>Basic knowledge of Python (functions, loops, dictionaries)</p>
</li>
<li><p>Python 3.8 or higher installed</p>
</li>
<li><p>Familiarity with installing packages using <code>pip</code></p>
</li>
<li><p>A code editor such as VS Code, PyCharm, or any editor you prefer</p>
</li>
</ul>
<h2 id="heading-project-overview">Project Overview</h2>
<p>In this guide, you’ll develop a system that takes a folder of résumés and a Job Description (JD) as input. The system processes each résumé, extracts relevant information, and calculates a score based on how well the candidate matches the job requirements.</p>
<h2 id="heading-how-the-system-works">How the System Works</h2>
<p>The project consists of four core components:</p>
<ul>
<li><p><strong>Résumé Parser</strong>: Reads PDF and DOCX files and extracts text</p>
</li>
<li><p><strong>JD Parser</strong>: Analyses the job description to identify required skills</p>
</li>
<li><p><strong>Keyword Extractor</strong>: Matches résumé content against a skills taxonomy</p>
</li>
<li><p><strong>Scoring Engine</strong>: Ranks candidates using a weighted algorithm</p>
</li>
</ul>
<h3 id="heading-scoring-formula">Scoring Formula</h3>
<p>Here’s the scoring formula we’ll use:</p>
<pre><code class="lang-plaintext">Total Score =
(Required Skills × 50%) +
(Preferred Skills × 25%) +
(Experience × 15%) +
(Keywords × 10%)
</code></pre>
<p>This approach ensures that essential skills carry more weight than secondary keywords.</p>
<h3 id="heading-how-this-approach-helps-reduce-bias">How This Approach Helps Reduce Bias</h3>
<p>This system evaluates résumés using predefined criteria instead of subjective judgment. Each résumé is scored based on the same set of required skills, preferred skills, experience indicators, and keywords.</p>
<p>Because all candidates are evaluated using the same weighted formula, personal factors such as writing style, formatting, or unconscious preferences don’t influence the ranking. The scoring logic focuses only on how closely a résumé matches the job requirements.</p>
<p>By normalising the evaluation process, the system promotes more consistent and objective screening, which helps reduce bias during the initial résumé review stage.</p>
<h2 id="heading-system-architecture">System Architecture</h2>
<pre><code class="lang-plaintext">Input                    Processing                     Output
─────                    ──────────                     ──────

Résumés ──► Résumé Parser ──► Keyword Extractor ──┐
(PDF/DOCX)                                        │
                                                  ├──► Scoring Engine ──► Ranked Results
Job Description ──► JD Parser ────────────────────┘
(TXT/PDF)
</code></pre>
<p>The system follows a simple input–process–output flow.</p>
<p>Résumés and the job description are provided as inputs. The Résumé Parser extracts text from each résumé, while the JD Parser identifies required and preferred skills from the job description.</p>
<p>The extracted résumé text is then passed to the Keyword Extractor, which matches skills and keywords using a predefined taxonomy.</p>
<p>Finally, the Scoring Engine applies a weighted formula to calculate a score for each candidate and outputs a ranked list of résumés.</p>
<h2 id="heading-project-structure">Project Structure</h2>
<pre><code class="lang-plaintext">resume_screening_system/
├── app.py                    # Streamlit web interface
├── main.py                   # Command-line interface
├── parsers/
│   ├── resume_parser.py      # PDF/DOCX text extraction
│   └── jd_parser.py          # Job description parsing
├── extractors/
│   └── keyword_extractor.py  # Skills and experience extraction
├── matcher/
│   └── scorer.py             # Scoring algorithm
├── data/
│   ├── config.json           # Scoring weights
│   └── skills_taxonomy.json  # Skills database
└── requirements.txt          # Dependencies
</code></pre>
<p>The project is organised into clear, modular directories. Parsing logic, keyword extraction, and scoring are separated into their own folders, while configuration files and data are kept isolated. This structure keeps the codebase easy to navigate, maintain, and extend.</p>
<h2 id="heading-step-1-set-up-the-project">Step 1: Set Up the Project</h2>
<p>Create the folder structure and set up a virtual environment:</p>
<pre><code class="lang-bash">mkdir resume_screening_system
<span class="hljs-built_in">cd</span> resume_screening_system
mkdir parsers extractors matcher data input output
python -m venv venv
</code></pre>
<p>Then go ahead and activate the virtual environment:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Windows</span>
<span class="hljs-built_in">source</span> venv/Scripts/activate

<span class="hljs-comment"># macOS / Linux</span>
<span class="hljs-built_in">source</span> venv/bin/activate
</code></pre>
<p>Install the required dependencies like this:</p>
<pre><code class="lang-bash">pip install PyPDF2 python-docx streamlit pandas
</code></pre>
<h2 id="heading-step-2-build-the-resume-parser">Step 2: Build the Résumé Parser</h2>
<p>The résumé parser handles different file formats by using a separate extraction method for each type.</p>
<p>For PDF files, the parser opens the document page by page and extracts text from each page using a PDF reader. The extracted text is combined into a single string for further processing.</p>
<p>For DOCX files, the parser reads each paragraph in the document and joins the paragraph text into one block. This ensures consistent text output regardless of the résumé format.</p>
<p>By combining all résumés into plain text, the parser allows components such as keyword extraction and scoring to work efficiently.</p>
<p><strong>File:</strong> <code>parsers/resume_parser.py</code></p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">_extract_pdf</span>(<span class="hljs-params">self, file_path: Path</span>) -&gt; str:</span>
    text = <span class="hljs-string">""</span>
    <span class="hljs-keyword">with</span> open(file_path, <span class="hljs-string">"rb"</span>) <span class="hljs-keyword">as</span> file:
        pdf_reader = PyPDF2.PdfReader(file)
        <span class="hljs-keyword">for</span> page <span class="hljs-keyword">in</span> pdf_reader.pages:
            page_text = page.extract_text()
            <span class="hljs-keyword">if</span> page_text:
                text += page_text + <span class="hljs-string">"\\n"</span>
    <span class="hljs-keyword">return</span> text.strip()

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">_extract_docx</span>(<span class="hljs-params">self, file_path: Path</span>) -&gt; str:</span>
    <span class="hljs-keyword">from</span> docx <span class="hljs-keyword">import</span> Document
    doc = Document(file_path)
    <span class="hljs-keyword">return</span> <span class="hljs-string">"\\n"</span>.join(
        para.text <span class="hljs-keyword">for</span> para <span class="hljs-keyword">in</span> doc.paragraphs
    ).strip()
</code></pre>
<h2 id="heading-step-3-build-the-keyword-extractor">Step 3: Build the Keyword Extractor</h2>
<p>This project uses a résumé dataset from <a target="_blank" href="https://www.kaggle.com/datasets/snehaanbhawal/resume-dataset">Kaggle</a> to ensure the logic works with real-world professional data. The keyword extractor identifies skills by scanning the résumé text.</p>
<p>The résumé text is first converted to lowercase so that matching is case-insensitive. A predefined skills taxonomy stores each skill along with its possible variations. The extractor checks the résumé text against these variations to find matches.</p>
<p>Word boundaries are used during matching to avoid partial matches, such as matching “Java” inside “JavaScript”. Matched skills are stored in a set to prevent duplicates.</p>
<p>This approach ensures consistent and controlled skill detection across all résumés.</p>
<p><strong>File:</strong> <code>extractors/keyword_extractor.py</code></p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">extract_skills</span>(<span class="hljs-params">self, text: str</span>) -&gt; Set[str]:</span>
    text_lower = text.lower()
    found_skills = set()

    <span class="hljs-keyword">for</span> category, skills_dict <span class="hljs-keyword">in</span> self.skills_taxonomy.items():
        <span class="hljs-keyword">for</span> skill_name, variations <span class="hljs-keyword">in</span> skills_dict.items():
            <span class="hljs-keyword">for</span> variation <span class="hljs-keyword">in</span> variations:
                <span class="hljs-comment"># Prevent "Java" matching "JavaScript"</span>
                pattern = <span class="hljs-string">r"\\b"</span> + re.escape(variation) + <span class="hljs-string">r"\\b"</span>
                <span class="hljs-keyword">if</span> re.search(pattern, text_lower):
                    found_skills.add(skill_name)
                    <span class="hljs-keyword">break</span>

    <span class="hljs-keyword">return</span> found_skills
</code></pre>
<h2 id="heading-step-4-implement-the-scoring-engine">Step 4: Implement the Scoring Engine</h2>
<p>To produce objective rankings, the system uses a weighted scoring formula.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Component</td><td>Weight</td><td>Rationale</td></tr>
</thead>
<tbody>
<tr>
<td>Required Skills</td><td>50%</td><td>Essential technical needs</td></tr>
<tr>
<td>Preferred Skills</td><td>25%</td><td>Competitive differentiators</td></tr>
<tr>
<td>Experience</td><td>15%</td><td>Professional depth</td></tr>
<tr>
<td>Keywords</td><td>10%</td><td>Domain familiarity</td></tr>
</tbody>
</table>
</div><pre><code class="lang-plaintext">Total Score =
(S_req × 0.50) +
(S_pref × 0.25) +
(E_exp × 0.15) +
(K_key × 0.10)
</code></pre>
<p>The scoring engine calculates a final score for each résumé using weighted values.</p>
<p>It counts how many required skills, preferred skills, experience indicators, and keywords appear in a résumé. Each count is multiplied by its assigned weight, with required skills contributing the most.</p>
<p>The weighted values are summed to produce a single score. Résumés are then sorted by this score to generate a ranked list of candidates.</p>
<h2 id="heading-step-5-build-the-web-interface">Step 5: Build the Web Interface</h2>
<p>Streamlit provides a simple web interface for interacting with the résumé screening system.</p>
<p>The text area allows users to input a job description, while the file uploader lets them upload multiple résumé files. When the button is clicked, Streamlit triggers the backend logic to parse résumés, extract data, and calculate scores.</p>
<p>The results are then displayed in the browser, allowing users to run the screening process without using the command line.</p>
<p><strong>File:</strong> <code>app.py</code></p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> streamlit <span class="hljs-keyword">as</span> st

jd_text = st.text_area(
    <span class="hljs-string">"Paste the job description here:"</span>,
    height=<span class="hljs-number">300</span>
)

uploaded_files = st.file_uploader(
    <span class="hljs-string">"Upload resume files:"</span>,
    type=[<span class="hljs-string">"pdf"</span>, <span class="hljs-string">"docx"</span>, <span class="hljs-string">"txt"</span>],
    accept_multiple_files=<span class="hljs-literal">True</span>
)

<span class="hljs-keyword">if</span> st.button(<span class="hljs-string">"Screen Resumes"</span>, type=<span class="hljs-string">"primary"</span>):
    st.success(<span class="hljs-string">"Processing resumes..."</span>)
</code></pre>
<p>Run the application:</p>
<pre><code class="lang-bash">streamlit run app.py
</code></pre>
<p>The app will be available at <a target="_blank" href="http://localhost:8501/"><code>http://localhost:8500</code></a>.</p>
<h2 id="heading-step-6-test-the-system">Step 6: Test the System</h2>
<h3 id="heading-sample-job-description-input">Sample Job Description Input</h3>
<p>Below is an example of a job description you can use to test the system:</p>
<pre><code class="lang-plaintext">We are looking for a Senior Python Developer with strong experience in backend development.

Required Skills:
- Python
- Django
- REST APIs
- SQL

Preferred Skills:
- PostgreSQL
- Docker
- AWS

Experience:
- 3+ years of professional Python development
- Experience building web applications
</code></pre>
<p>This input helps the system identify required skills, preferred skills, and experience keywords, which are then used by the scoring engine to rank résumés.</p>
<pre><code class="lang-bash">python main.py
</code></pre>
<h3 id="heading-sample-output">Sample Output</h3>
<pre><code class="lang-plaintext">============================================================
SCREENING RESULTS
============================================================
Rank #1: Alice Johnson | Score: 85.42/100 | Matched: python, django, postgresql
Rank #2: Carol Davis   | Score: 72.50/100 | Matched: python, django
</code></pre>
<h2 id="heading-step-7-deploy-the-application">Step 7: Deploy the Application</h2>
<p>To make the system publicly accessible:</p>
<ol>
<li><p>Push the code to GitHub</p>
</li>
<li><p>Go to <a target="_blank" href="http://share.streamlit.io/"><code>share.streamlit.io</code></a></p>
</li>
<li><p>Select your <a target="_blank" href="http://app.py/"><code>app.py</code></a> file</p>
</li>
<li><p>Deploy the application</p>
</li>
</ol>
<p>Your app will be live at:</p>
<pre><code class="lang-plaintext">&lt;https://your-app-name.streamlit.app&gt;
</code></pre>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this tutorial, you’ve built a complete résumé screening system from scratch using Python. By combining text processing, structured scoring, and automation, this project demonstrates how manual résumé screening can be transformed into an efficient and objective workflow.</p>
<p>This system helps reduce bias, save time, and evaluate candidates more consistently. Happy coding!</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
