<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ikegbo Ogochukwu</title>
    <description>The latest articles on DEV Community by Ikegbo Ogochukwu (@kenryikegbo).</description>
    <link>https://dev.to/kenryikegbo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F419033%2Faf7bdc0a-e5fb-4d05-a32c-661fa8d1bca5.png</url>
      <title>DEV Community: Ikegbo Ogochukwu</title>
      <link>https://dev.to/kenryikegbo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kenryikegbo"/>
    <language>en</language>
    <item>
      <title>Stop Guessing Your Network: Using PowerShell and TCP Commands to Understand What’s Happening Behind the Scenes</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Tue, 19 May 2026 18:47:05 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/stop-guessing-your-network-using-powershell-and-tcp-commands-to-understand-whats-happening-behind-51mf</link>
      <guid>https://dev.to/kenryikegbo/stop-guessing-your-network-using-powershell-and-tcp-commands-to-understand-whats-happening-behind-51mf</guid>
      <description>&lt;p&gt;Most developers and IT beginners only touch networking when something breaks.&lt;/p&gt;

&lt;p&gt;The internet is “working,” the API is responding, Docker containers are starting, and life moves on.&lt;/p&gt;

&lt;p&gt;Until one day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your app cannot connect to a database&lt;/li&gt;
&lt;li&gt;Docker says the daemon is unreachable&lt;/li&gt;
&lt;li&gt;A server responds slowly for no obvious reason&lt;/li&gt;
&lt;li&gt;A device disappears from the network&lt;/li&gt;
&lt;li&gt;SSH refuses connections&lt;/li&gt;
&lt;li&gt;Your Raspberry Pi suddenly becomes invisible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is usually when people realize they do not actually understand their network.&lt;/p&gt;

&lt;p&gt;One of the best ways to fix that is by learning how to inspect and troubleshoot networks directly from the terminal using PowerShell and TCP-based tools.&lt;/p&gt;

&lt;p&gt;This post is inspired by a networking article from &lt;a href="https://blog.paessler.com/know-your-network-with-powershell-and-tcp?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Paessler Blog&lt;/a&gt; and expands it into a more developer-focused practical guide. (&lt;a href="https://blog.paessler.com/know-your-network-with-powershell-and-tcp?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;blog.paessler.com&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  Why PowerShell Matters for Networking
&lt;/h1&gt;

&lt;p&gt;For years, networking on Windows relied heavily on old tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ping&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ipconfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;netstat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tracert&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;netsh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These still work.&lt;/p&gt;

&lt;p&gt;But modern Windows networking is increasingly PowerShell-driven. Microsoft has gradually shifted many administration and diagnostic workflows toward PowerShell because it is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scriptable&lt;/li&gt;
&lt;li&gt;automatable&lt;/li&gt;
&lt;li&gt;object-oriented&lt;/li&gt;
&lt;li&gt;easier to integrate into larger workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of parsing messy text output, PowerShell returns structured objects you can filter, sort, and automate. (&lt;a href="https://blog.paessler.com/know-your-network-with-powershell-and-tcp?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;blog.paessler.com&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  Understanding TCP Before Troubleshooting
&lt;/h1&gt;

&lt;p&gt;Most developer tools rely on TCP underneath:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;databases&lt;/li&gt;
&lt;li&gt;SSH&lt;/li&gt;
&lt;li&gt;web servers&lt;/li&gt;
&lt;li&gt;cloud platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TCP (Transmission Control Protocol) is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reliable communication&lt;/li&gt;
&lt;li&gt;packet ordering&lt;/li&gt;
&lt;li&gt;retransmission&lt;/li&gt;
&lt;li&gt;connection establishment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When applications fail to communicate, the problem is often not the application itself — it is the TCP/network layer.&lt;/p&gt;

&lt;p&gt;Understanding a few networking commands can save hours of frustration.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Check Your Network Configuration
&lt;/h1&gt;

&lt;p&gt;The first thing to inspect is your machine’s network configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-NetIPAddress&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP address&lt;/li&gt;
&lt;li&gt;subnet&lt;/li&gt;
&lt;li&gt;interface&lt;/li&gt;
&lt;li&gt;IPv4/IPv6 details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ipconfig&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But PowerShell gives more structured information.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Test Connectivity Properly
&lt;/h1&gt;

&lt;p&gt;Most people know &lt;code&gt;ping&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;PowerShell modernizes it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Test-Connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;google.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can test multiple systems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Test-Connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;google.com&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;github.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or continuously monitor latency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Test-Connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.168.1.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps detect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unstable Wi-Fi&lt;/li&gt;
&lt;li&gt;packet loss&lt;/li&gt;
&lt;li&gt;intermittent routing issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microsoft’s networking documentation also recommends PowerShell-based connectivity testing for modern administration workflows. (&lt;a href="https://learn.microsoft.com/en-us/powershell/scripting/samples/performing-networking-tasks?view=powershell-7.6&amp;amp;utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Discover Devices on Your Network
&lt;/h1&gt;

&lt;p&gt;One of the most useful troubleshooting techniques is identifying what devices are actually online.&lt;/p&gt;

&lt;p&gt;You can inspect your ARP table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;arp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-a&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;IP addresses&lt;/li&gt;
&lt;li&gt;MAC addresses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to devices your machine has communicated with recently.&lt;/p&gt;

&lt;p&gt;Modern network discovery guides still rely heavily on ARP-based discovery for local troubleshooting. (&lt;a href="https://blog.paessler.com/network-device-lists-and-discovery?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;blog.paessler.com&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Scan an Entire Subnet
&lt;/h1&gt;

&lt;p&gt;Suppose your Raspberry Pi disappeared from the network.&lt;/p&gt;

&lt;p&gt;You can sweep your subnet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;254&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Test-Connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Quiet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This checks which devices respond.&lt;/p&gt;

&lt;p&gt;Microsoft demonstrates similar subnet enumeration approaches in PowerShell networking examples. (&lt;a href="https://learn.microsoft.com/en-us/powershell/scripting/samples/performing-networking-tasks?view=powershell-7.6&amp;amp;utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Find Open TCP Ports
&lt;/h1&gt;

&lt;p&gt;Sometimes the device is online, but the service is not.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH may not be running&lt;/li&gt;
&lt;li&gt;Docker daemon may be down&lt;/li&gt;
&lt;li&gt;database service may have crashed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can test ports directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.168.1.10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;22&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL&lt;/td&gt;
&lt;td&gt;3306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;5432&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker API&lt;/td&gt;
&lt;td&gt;2375/2376&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This immediately tells you whether the issue is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;routing&lt;/li&gt;
&lt;li&gt;firewall&lt;/li&gt;
&lt;li&gt;service availability&lt;/li&gt;
&lt;li&gt;TCP-level rejection&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  6. Monitor Active TCP Connections
&lt;/h1&gt;

&lt;p&gt;To inspect live connections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can filter by state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Established"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or inspect a specific port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is extremely useful when debugging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;containers&lt;/li&gt;
&lt;li&gt;backend services&lt;/li&gt;
&lt;li&gt;reverse proxies&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  7. Troubleshoot Docker Connectivity
&lt;/h1&gt;

&lt;p&gt;If Docker suddenly breaks on Windows, PowerShell networking commands become incredibly useful.&lt;/p&gt;

&lt;p&gt;For example, errors like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;failed to connect to the docker API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;often indicate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker daemon stopped&lt;/li&gt;
&lt;li&gt;named pipe failure&lt;/li&gt;
&lt;li&gt;TCP bridge issue&lt;/li&gt;
&lt;li&gt;virtualization problem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;localhost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2375&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ls&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding networking basics makes Docker troubleshooting much easier because Docker heavily relies on virtual networking and TCP communication internally.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Automate Network Diagnostics
&lt;/h1&gt;

&lt;p&gt;This is where PowerShell becomes powerful.&lt;/p&gt;

&lt;p&gt;Instead of manually checking systems one by one, you can automate diagnostics.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$servers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.12"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$servers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;22&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can verify SSH availability across multiple systems automatically.&lt;/p&gt;

&lt;p&gt;This scales extremely well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;labs&lt;/li&gt;
&lt;li&gt;classrooms&lt;/li&gt;
&lt;li&gt;hubs&lt;/li&gt;
&lt;li&gt;server farms&lt;/li&gt;
&lt;li&gt;IoT deployments&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  9. Network Monitoring at Scale
&lt;/h1&gt;

&lt;p&gt;At some point, command-line troubleshooting is not enough.&lt;/p&gt;

&lt;p&gt;That is where monitoring systems come in.&lt;/p&gt;

&lt;p&gt;Platforms like &lt;a href="https://www.paessler.com/prtg?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;PRTG Network Monitor&lt;/a&gt; automate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;network discovery&lt;/li&gt;
&lt;li&gt;latency tracking&lt;/li&gt;
&lt;li&gt;device monitoring&lt;/li&gt;
&lt;li&gt;traffic inspection&lt;/li&gt;
&lt;li&gt;uptime monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern network visibility systems combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ARP discovery&lt;/li&gt;
&lt;li&gt;TCP monitoring&lt;/li&gt;
&lt;li&gt;SNMP&lt;/li&gt;
&lt;li&gt;device inventories&lt;/li&gt;
&lt;li&gt;automated alerting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to give administrators full infrastructure visibility. (&lt;a href="https://blog.paessler.com/network-device-lists-and-discovery?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;blog.paessler.com&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  Real Lesson: Developers Need Networking Skills
&lt;/h1&gt;

&lt;p&gt;One pattern keeps repeating in modern software engineering:&lt;/p&gt;

&lt;p&gt;The deeper you go, the more networking matters.&lt;/p&gt;

&lt;p&gt;Machine learning engineers, backend developers, DevOps engineers, cybersecurity analysts, embedded engineers, and cloud architects all eventually run into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ports&lt;/li&gt;
&lt;li&gt;sockets&lt;/li&gt;
&lt;li&gt;firewalls&lt;/li&gt;
&lt;li&gt;routing&lt;/li&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;TCP failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Networking knowledge is no longer optional.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Learning PowerShell networking commands is not about becoming a network engineer overnight.&lt;/p&gt;

&lt;p&gt;It is about gaining visibility.&lt;/p&gt;

&lt;p&gt;Once you can inspect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;connections&lt;/li&gt;
&lt;li&gt;devices&lt;/li&gt;
&lt;li&gt;ports&lt;/li&gt;
&lt;li&gt;adapters&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you stop guessing and start diagnosing systems properly.&lt;/p&gt;

&lt;p&gt;And honestly, that is one of the biggest transitions from beginner developer to advanced engineer.&lt;/p&gt;




&lt;h1&gt;
  
  
  Further Reading
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.paessler.com/know-your-network-with-powershell-and-tcp?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Paessler Networking Article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/powershell/scripting/samples/performing-networking-tasks?view=powershell-7.6&amp;amp;utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Microsoft PowerShell Networking Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.techtarget.com/searchnetworking/tip/PowerShell-commands-for-network-troubleshooting?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;PowerShell Network Troubleshooting Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(&lt;a href="https://blog.paessler.com/know-your-network-with-powershell-and-tcp?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;blog.paessler.com&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>cli</category>
      <category>networking</category>
      <category>webdev</category>
      <category>docker</category>
    </item>
    <item>
      <title>From Zero to Supercomputing: A Beginner-Friendly Guide to Using HPC Clusters Like CINECA</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Thu, 14 May 2026 11:05:39 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/-from-zero-to-supercomputing-a-beginner-friendly-guide-to-using-hpc-clusters-like-cineca-55jm</link>
      <guid>https://dev.to/kenryikegbo/-from-zero-to-supercomputing-a-beginner-friendly-guide-to-using-hpc-clusters-like-cineca-55jm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A practical introduction to Linux, SLURM, GPU clusters, AI workloads, and supercomputing workflows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Supercomputers are no longer reserved only for physicists and national laboratories.&lt;/p&gt;

&lt;p&gt;Today, AI engineers, machine learning researchers, data scientists, and students increasingly rely on High Performance Computing (HPC) systems for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large-scale AI training&lt;/li&gt;
&lt;li&gt;scientific simulations&lt;/li&gt;
&lt;li&gt;big data analytics&lt;/li&gt;
&lt;li&gt;distributed computing&lt;/li&gt;
&lt;li&gt;computational research&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recently, I started exploring the documentation of the CINECA HPC infrastructure, one of Europe’s major supercomputing environments, and I realized something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most beginners struggle not because HPC is impossible, but because the ecosystem feels overwhelming at first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article breaks down the core concepts into a practical workflow that beginners can actually understand.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Is an HPC Cluster?
&lt;/h1&gt;

&lt;p&gt;An HPC (High Performance Computing) cluster is a network of powerful computers called &lt;strong&gt;nodes&lt;/strong&gt; working together to solve computational problems.&lt;/p&gt;

&lt;p&gt;Instead of training a model on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one laptop CPU&lt;/li&gt;
&lt;li&gt;one small GPU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you may gain access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hundreds of CPU cores&lt;/li&gt;
&lt;li&gt;multiple A100/H100 GPUs&lt;/li&gt;
&lt;li&gt;terabytes of memory&lt;/li&gt;
&lt;li&gt;ultra-fast networking&lt;/li&gt;
&lt;li&gt;distributed storage systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Systems like those hosted at CINECA are used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI training&lt;/li&gt;
&lt;li&gt;weather forecasting&lt;/li&gt;
&lt;li&gt;genomics&lt;/li&gt;
&lt;li&gt;computational physics&lt;/li&gt;
&lt;li&gt;climate simulations&lt;/li&gt;
&lt;li&gt;deep learning research&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Understanding the Architecture
&lt;/h1&gt;

&lt;p&gt;Most HPC systems follow this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Laptop
     ↓
Login Node
     ↓
SLURM Scheduler
     ↓
Compute Nodes
     ↓
GPU/CPU Execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s simplify what each layer means.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Login Node&lt;/td&gt;
&lt;td&gt;Used for coding, editing, compiling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute Node&lt;/td&gt;
&lt;td&gt;Where actual jobs run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU Node&lt;/td&gt;
&lt;td&gt;Used for AI and deep learning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduler&lt;/td&gt;
&lt;td&gt;Manages resources and queues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage System&lt;/td&gt;
&lt;td&gt;Stores datasets and outputs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One important rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Never run heavy workloads directly on login nodes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  The Biggest Mindset Shift in HPC
&lt;/h1&gt;

&lt;p&gt;On a laptop, you usually do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write code → Run immediately → See output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In HPC, the workflow becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write code
↓
Submit job
↓
Wait in queue
↓
Resources allocated
↓
Execution starts
↓
Logs/results generated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HPC is asynchronous.&lt;/p&gt;

&lt;p&gt;That is one of the biggest transitions beginners must adapt to.&lt;/p&gt;




&lt;h1&gt;
  
  
  Connecting to the Cluster
&lt;/h1&gt;

&lt;p&gt;Most HPC systems are accessed using SSH.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh username@login.clustername.cineca.it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modern systems may also require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2FA&lt;/li&gt;
&lt;li&gt;SSH certificates&lt;/li&gt;
&lt;li&gt;OTP authentication&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Linux Skills You MUST Know
&lt;/h1&gt;

&lt;p&gt;Before touching supercomputers seriously, Linux fundamentals are essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Navigation Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;pwd
ls
cd
mkdir
rm
cp
mv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  File Inspection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat
&lt;/span&gt;less
&lt;span class="nb"&gt;head
tail
&lt;/span&gt;nano
vim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Process Monitoring
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;top
htop
ps
&lt;span class="nb"&gt;kill&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are weak in Linux, HPC will feel painful very quickly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Understanding Modules
&lt;/h1&gt;

&lt;p&gt;HPC environments rarely allow random software installations directly on the system.&lt;/p&gt;

&lt;p&gt;Instead, they use &lt;strong&gt;modules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Modules dynamically load:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python versions&lt;/li&gt;
&lt;li&gt;CUDA versions&lt;/li&gt;
&lt;li&gt;compilers&lt;/li&gt;
&lt;li&gt;MPI libraries&lt;/li&gt;
&lt;li&gt;AI frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Checking Available Modules
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module avail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Loading Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module load python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Viewing Loaded Modules
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Clearing Modules
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module purge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents dependency conflicts between projects.&lt;/p&gt;




&lt;h1&gt;
  
  
  Understanding SLURM
&lt;/h1&gt;

&lt;p&gt;Most HPC systems use a scheduler called &lt;strong&gt;SLURM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;SLURM manages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;job queues&lt;/li&gt;
&lt;li&gt;GPU allocation&lt;/li&gt;
&lt;li&gt;runtime limits&lt;/li&gt;
&lt;li&gt;cluster resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do not directly “take” GPUs.&lt;/p&gt;

&lt;p&gt;You request resources from SLURM.&lt;/p&gt;




&lt;h1&gt;
  
  
  Essential SLURM Commands
&lt;/h1&gt;

&lt;h2&gt;
  
  
  View Available Partitions
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;h2&gt;
  
  
  View Running Jobs
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Submit a Job
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbatch train.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Start Interactive Session
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;srun &lt;span class="nt"&gt;--pty&lt;/span&gt; bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cancel a Job
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scancel JOB_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Your First SLURM Script
&lt;/h1&gt;

&lt;p&gt;Create a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano train.sbatch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --job-name=my_training&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --partition=gpu&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --nodes=1&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --ntasks=1&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --cpus-per-task=8&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --gres=gpu:1&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --time=04:00:00&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --mem=32G&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --output=output.log&lt;/span&gt;

module purge
module load cuda
module load python

python train.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Submit it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbatch train.sbatch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SLURM responds with something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Submitted batch job 12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Understanding SBATCH Parameters
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--job-name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Name of the job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--partition&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Queue name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--nodes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of machines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--cpus-per-task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CPU cores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--gres=gpu:1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Request GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runtime limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--mem&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RAM allocation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Monitoring Jobs
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Check Queue
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;squeue &lt;span class="nt"&gt;-u&lt;/span&gt; username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Live Monitoring
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;watch squeue &lt;span class="nt"&gt;-u&lt;/span&gt; username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  View Job Details
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scontrol show job 12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Understanding Job States
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PD&lt;/td&gt;
&lt;td&gt;Pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CG&lt;/td&gt;
&lt;td&gt;Completing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CD&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;Failed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your job stays in &lt;code&gt;PD&lt;/code&gt;, it usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;resources are busy&lt;/li&gt;
&lt;li&gt;queue is full&lt;/li&gt;
&lt;li&gt;requested resources are too large&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Interactive GPU Sessions
&lt;/h1&gt;

&lt;p&gt;Interactive sessions are useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debugging&lt;/li&gt;
&lt;li&gt;notebook testing&lt;/li&gt;
&lt;li&gt;experimentation&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;srun &lt;span class="nt"&gt;--partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gpu &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--gres&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gpu:1 &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--cpus-per-task&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8 &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--mem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;32G &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--pty&lt;/span&gt; bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Python Environments on HPC
&lt;/h1&gt;

&lt;p&gt;Never rely entirely on system Python for serious AI work.&lt;/p&gt;

&lt;p&gt;Most researchers use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conda&lt;/li&gt;
&lt;li&gt;virtual environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create Environment
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda create &lt;span class="nt"&gt;-n&lt;/span&gt; ml &lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda activate ml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;torch transformers datasets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  GPU Training Workflow
&lt;/h1&gt;

&lt;p&gt;A common AI workflow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Local Machine
    ↓
Upload Dataset
    ↓
Prepare Environment
    ↓
Write SLURM Script
    ↓
Submit Training
    ↓
Monitor Logs
    ↓
Download Results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Storage Systems Matter More Than Beginners Think
&lt;/h1&gt;

&lt;p&gt;HPC systems typically have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;home storage&lt;/li&gt;
&lt;li&gt;scratch storage&lt;/li&gt;
&lt;li&gt;project storage&lt;/li&gt;
&lt;li&gt;high-speed temporary storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A common beginner mistake is training directly from slow home directories.&lt;/p&gt;

&lt;p&gt;For large AI workloads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use scratch storage&lt;/li&gt;
&lt;li&gt;optimize data loading&lt;/li&gt;
&lt;li&gt;clean temporary files regularly&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Transferring Files
&lt;/h1&gt;

&lt;h2&gt;
  
  
  SCP Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp dataset.zip username@cluster:/scratch/project/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  RSYNC Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rsync &lt;span class="nt"&gt;-av&lt;/span&gt; dataset/ username@cluster:/scratch/project/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Running PyTorch on HPC
&lt;/h1&gt;

&lt;p&gt;Simple GPU check:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_available&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_device_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SLURM script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#SBATCH --gres=gpu:1&lt;/span&gt;

python train.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Multi-GPU Training
&lt;/h1&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#SBATCH --nodes=1&lt;/span&gt;
&lt;span class="c"&gt;#SBATCH --gres=gpu:4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PyTorch distributed execution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;torchrun &lt;span class="nt"&gt;--nproc_per_node&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4 train.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where HPC becomes significantly more powerful than normal laptops.&lt;/p&gt;




&lt;h1&gt;
  
  
  MPI and Distributed Computing
&lt;/h1&gt;

&lt;p&gt;Scientific applications often use MPI.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module load openmpi

mpirun &lt;span class="nt"&gt;-np&lt;/span&gt; 16 ./simulation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MPI is heavily used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;physics&lt;/li&gt;
&lt;li&gt;computational fluid dynamics&lt;/li&gt;
&lt;li&gt;simulations&lt;/li&gt;
&lt;li&gt;weather forecasting&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Containers in HPC
&lt;/h1&gt;

&lt;p&gt;Unlike cloud-native environments that heavily use Docker, HPC systems often use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Singularity&lt;/li&gt;
&lt;li&gt;Apptainer&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module load singularity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;singularity &lt;span class="nb"&gt;exec &lt;/span&gt;container.sif python train.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Common Beginner Mistakes
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Running Heavy Jobs on Login Nodes
&lt;/h2&gt;

&lt;p&gt;This annoys system administrators very quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requesting Too Many Resources
&lt;/h2&gt;

&lt;p&gt;Large requests stay longer in queue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ignoring Logs
&lt;/h2&gt;

&lt;p&gt;Logs explain most failures.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; output.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CUDA Version Mismatches
&lt;/h2&gt;

&lt;p&gt;Your PyTorch CUDA version must match cluster CUDA support.&lt;/p&gt;




&lt;h1&gt;
  
  
  HPC vs Cloud GPUs
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HPC&lt;/th&gt;
&lt;th&gt;Cloud&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shared infrastructure&lt;/td&gt;
&lt;td&gt;Commercial infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Often research-funded&lt;/td&gt;
&lt;td&gt;Pay-as-you-go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queue-based&lt;/td&gt;
&lt;td&gt;Immediate provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strong interconnects&lt;/td&gt;
&lt;td&gt;Flexible scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Excellent for huge workloads&lt;/td&gt;
&lt;td&gt;Excellent for startups&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Recommended Learning Path
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Stage 1 — Linux
&lt;/h2&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bash&lt;/li&gt;
&lt;li&gt;file systems&lt;/li&gt;
&lt;li&gt;SSH&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Stage 2 — SLURM
&lt;/h2&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;job submission&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;partitions&lt;/li&gt;
&lt;li&gt;scheduling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Stage 3 — Python Environments
&lt;/h2&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conda&lt;/li&gt;
&lt;li&gt;CUDA&lt;/li&gt;
&lt;li&gt;pip&lt;/li&gt;
&lt;li&gt;virtual environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Stage 4 — GPU Computing
&lt;/h2&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PyTorch&lt;/li&gt;
&lt;li&gt;distributed training&lt;/li&gt;
&lt;li&gt;checkpointing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Stage 5 — Advanced HPC
&lt;/h2&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MPI&lt;/li&gt;
&lt;li&gt;NCCL&lt;/li&gt;
&lt;li&gt;DeepSpeed&lt;/li&gt;
&lt;li&gt;multi-node training&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Practice Projects for Beginners
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Beginner
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Submit hello-world SLURM job&lt;/li&gt;
&lt;li&gt;Train MNIST on GPU&lt;/li&gt;
&lt;li&gt;Monitor job states&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Intermediate
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Multi-GPU image classifier&lt;/li&gt;
&lt;li&gt;Jupyter on HPC&lt;/li&gt;
&lt;li&gt;Distributed preprocessing pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advanced
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DeepSpeed training&lt;/li&gt;
&lt;li&gt;MPI simulations&lt;/li&gt;
&lt;li&gt;Large language model fine-tuning&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;The people who stand out in HPC environments are usually not just the best programmers.&lt;/p&gt;

&lt;p&gt;They are the people who understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;systems&lt;/li&gt;
&lt;li&gt;optimization&lt;/li&gt;
&lt;li&gt;storage bottlenecks&lt;/li&gt;
&lt;li&gt;resource management&lt;/li&gt;
&lt;li&gt;debugging workflows&lt;/li&gt;
&lt;li&gt;automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supercomputing is less about “running code fast” and more about learning how to think computationally at scale.&lt;/p&gt;

&lt;p&gt;If you are entering AI, scientific computing, or large-scale machine learning research, learning HPC may become one of the most valuable technical skills you acquire.&lt;/p&gt;




&lt;h1&gt;
  
  
  Useful Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.hpc.cineca.it/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;CINECA HPC Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slurm.schedmd.com/documentation.html?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SLURM Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pytorch.org/tutorials/intermediate/ddp_tutorial.html?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;PyTorch Distributed Training Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.open-mpi.org/doc/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;OpenMPI Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apptainer.org/docs/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Apptainer Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you are already working with supercomputers or HPC clusters, what was the hardest concept for you when you first started?&lt;/p&gt;

</description>
      <category>gpu</category>
      <category>cluster</category>
      <category>supercomputers</category>
      <category>ai</category>
    </item>
    <item>
      <title>Docker Cheat Sheet: Commands Every Developer Should Know</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Tue, 12 May 2026 18:57:12 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/-docker-cheat-sheet-commands-every-developer-should-know-1aj0</link>
      <guid>https://dev.to/kenryikegbo/-docker-cheat-sheet-commands-every-developer-should-know-1aj0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Docker helps you package an application with everything it needs to run: code, dependencies, environment variables, and runtime settings. This cheat sheet covers the most useful Docker commands for daily development.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Check Docker Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
docker info
docker &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Docker Images
&lt;/h2&gt;

&lt;h3&gt;
  
  
  List images
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pull an image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull nginx
docker pull python:3.12
docker pull node:20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove an image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker rmi image_name
docker rmi image_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build an image from a Dockerfile
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; my-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build with a specific Dockerfile
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-f&lt;/span&gt; Dockerfile.dev &lt;span class="nt"&gt;-t&lt;/span&gt; my-app-dev &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Docker Containers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Run a container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run container in detached mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run container with a name
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; my-nginx nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run container and map ports
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This maps port &lt;code&gt;8080&lt;/code&gt; on your computer to port &lt;code&gt;80&lt;/code&gt; inside the container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run container with environment variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;APP_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;development my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run container interactively
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; ubuntu bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. List Containers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Running containers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  All containers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Stop, Start, Restart Containers
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stop container_name
docker start container_name
docker restart container_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Remove Containers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Remove one container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;rm &lt;/span&gt;container_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove all stopped containers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Logs and Debugging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  View logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs container_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Follow logs live
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; container_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enter a running container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; container_name bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;bash&lt;/code&gt; is not available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; container_name sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inspect container details
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect container_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Volumes
&lt;/h2&gt;

&lt;p&gt;Volumes help you persist data outside the container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a volume
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create my-volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List volumes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use a volume
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-v&lt;/span&gt; my-volume:/app/data my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove a volume
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume &lt;span class="nb"&gt;rm &lt;/span&gt;my-volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove unused volumes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Bind Mounts
&lt;/h2&gt;

&lt;p&gt;Bind mounts connect a folder on your computer to a folder inside the container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/app my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;${PWD}&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;/app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;my-app&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Networks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  List networks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a network
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create my-network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run container on a network
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--network&lt;/span&gt; my-network &lt;span class="nt"&gt;--name&lt;/span&gt; app my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove a network
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network &lt;span class="nb"&gt;rm &lt;/span&gt;my-network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  11. Dockerfile Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.12-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "app.py"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  12. Docker Compose
&lt;/h2&gt;

&lt;p&gt;Docker Compose helps you run multiple containers together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;APP_ENV=development&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;

  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=admin&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=mydb&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Start services
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Start in detached mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stop services
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rebuild services
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  View logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose logs
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. Cleaning Up Docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Remove unused data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker system prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove unused data including images
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker system prune &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove unused containers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove unused images
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker image prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove unused volumes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Be careful with prune commands because they delete unused Docker resources.&lt;/p&gt;




&lt;h2&gt;
  
  
  14. Common Docker Commands Summary
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; my-app &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8000:8000 my-app
docker ps
docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;
docker stop container_name
docker start container_name
docker restart container_name
docker &lt;span class="nb"&gt;rm &lt;/span&gt;container_name
docker rmi image_name
docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; container_name
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; container_name bash
docker system prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  15. Useful Docker Compose Commands Summary
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
docker compose down
docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt;
docker compose ps
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Note
&lt;/h2&gt;

&lt;p&gt;Docker is powerful because it makes your application easier to run, share, test, and deploy. Once you understand images, containers, volumes, networks, and Docker Compose, you can package almost any application into a reproducible environment.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>containers</category>
      <category>virtualmachine</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Implementing Facebook Login in Flutter with Meta and Firebase: The Configuration Guide Most Teams Actually Need</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Mon, 11 May 2026 22:33:07 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/implementing-facebook-login-in-flutter-with-meta-and-firebase-the-configuration-guide-most-teams-3cci</link>
      <guid>https://dev.to/kenryikegbo/implementing-facebook-login-in-flutter-with-meta-and-firebase-the-configuration-guide-most-teams-3cci</guid>
      <description>&lt;h2&gt;
  
  
  Subtitle
&lt;/h2&gt;

&lt;p&gt;How to set up Meta for Developers, Business ownership, Firebase Authentication, and native mobile config without mixing up App Domains, key hashes, and redirect URIs&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Facebook Login looks simple from the Flutter side. In code, it can be as small as calling &lt;code&gt;FacebookAuth.instance.login()&lt;/code&gt;, converting the token to a Firebase credential, and signing the user in.&lt;/p&gt;

&lt;p&gt;The real complexity is not in the Dart code. It is in the configuration spread across four systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.facebook.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Meta for Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Meta Business ownership and app access&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/auth?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Firebase Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Native Android and iOS app configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If one of those layers is misconfigured, the failure usually shows up as a vague login cancellation, invalid OAuth redirect, key-hash error, or a token exchange failure. That is why treating Facebook Login as a console-configuration workflow, not only a code task, saves time.&lt;/p&gt;

&lt;p&gt;This guide explains the full setup path using abstract examples instead of production identifiers.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Understand the flow before configuring anything
&lt;/h2&gt;

&lt;p&gt;In a Firebase-backed Flutter app, the Facebook login flow usually works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The app launches the Facebook login flow using the native Facebook SDK through a Flutter plugin.&lt;/li&gt;
&lt;li&gt;Facebook returns an access token to the app.&lt;/li&gt;
&lt;li&gt;The app converts that Facebook token into a Firebase credential.&lt;/li&gt;
&lt;li&gt;Firebase signs the user in and issues a Firebase ID token.&lt;/li&gt;
&lt;li&gt;Your backend can then verify the Firebase token and create or update the app-specific user session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That means Meta is not replacing Firebase. Meta is the identity provider, Firebase is the authentication broker, and your backend remains the application session authority if your product uses its own access and refresh tokens.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Start with a real Meta developer account
&lt;/h2&gt;

&lt;p&gt;Before you can create a Facebook app, you need to register as a Meta developer.&lt;/p&gt;

&lt;p&gt;Meta's developer registration flow requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Facebook account&lt;/li&gt;
&lt;li&gt;agreement to Meta's platform terms and policies&lt;/li&gt;
&lt;li&gt;verification of your account contact details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meta's documentation states that developer verification is based on confirming the phone number and email address you provide for developer notifications. In practice, the exact verification flow can vary depending on the account and region.&lt;/p&gt;

&lt;p&gt;The practical takeaway is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;do not build the app under a throwaway personal Facebook account&lt;/li&gt;
&lt;li&gt;use an account your organization can retain access to&lt;/li&gt;
&lt;li&gt;enable two-factor authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful references:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.facebook.com/docs/development/register?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Meta Developer Registration Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/security/2fac/setup/intro?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Meta Security Center&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Use a Business-owned app, not a personal orphan app
&lt;/h2&gt;

&lt;p&gt;This is the part many teams skip until they run into access problems.&lt;/p&gt;

&lt;p&gt;Even if a single developer creates the app initially, the long-term owner should be the business, not one person's personal account. A proper Meta Business portfolio helps with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shared ownership&lt;/li&gt;
&lt;li&gt;teammate access&lt;/li&gt;
&lt;li&gt;future app review or verification requests&lt;/li&gt;
&lt;li&gt;preserving control if a developer leaves&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a simple Facebook Login integration that only requests minimal data, business verification may not be the first blocker. But for production ownership, review, and future scaling, organizing the app under the correct business from the beginning is still the better decision.&lt;/p&gt;

&lt;p&gt;Keep this distinction clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;developer account: the person who can access Meta for Developers&lt;/li&gt;
&lt;li&gt;business portfolio: the organization that should own the app and related assets&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Meta app setup has three different configuration buckets
&lt;/h2&gt;

&lt;p&gt;This is where the confusion usually starts. Developers often mix up values that belong in completely different places.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Settings
&lt;/h3&gt;

&lt;p&gt;This area is about the identity of your Meta app.&lt;/p&gt;

&lt;p&gt;Typical values here include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;app name&lt;/li&gt;
&lt;li&gt;app contact email&lt;/li&gt;
&lt;li&gt;privacy policy URL&lt;/li&gt;
&lt;li&gt;app domains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important trap: &lt;code&gt;App Domains&lt;/code&gt; is not the same thing as Firebase's OAuth redirect URI.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;App Domains&lt;/code&gt; should represent the real public domain associated with your app or website. In practice, this is the host that serves your public web presence or policy pages.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;exampleapp.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth.exampleapp.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; put these in &lt;code&gt;App Domains&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://sample-project.firebaseapp.com/__/auth/handler&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;any URL with &lt;code&gt;https://&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;callback paths&lt;/li&gt;
&lt;li&gt;&lt;code&gt;localhost&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Android package names&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That guidance aligns with how Meta uses the field. OAuth redirect URIs belong elsewhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Facebook Login product settings
&lt;/h3&gt;

&lt;p&gt;This is where you configure login-specific callback handling.&lt;/p&gt;

&lt;p&gt;If you use Firebase Authentication with Facebook as a provider, Firebase requires the OAuth redirect URI from Firebase Console to be added to your Facebook app.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://sample-project.firebaseapp.com/__/auth/handler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This belongs in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Facebook Login&lt;/li&gt;
&lt;li&gt;Settings&lt;/li&gt;
&lt;li&gt;Valid OAuth Redirect URIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/auth/flutter/federated-auth?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Firebase Federated Authentication Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Platform settings
&lt;/h3&gt;

&lt;p&gt;Meta also needs to know which native apps are allowed to use the Meta app.&lt;/p&gt;

&lt;p&gt;For Android, Meta requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;package name&lt;/li&gt;
&lt;li&gt;default activity class&lt;/li&gt;
&lt;li&gt;development and release key hashes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For iOS, Meta requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bundle identifier registration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are platform identity values, not OAuth redirect values.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.facebook.com/docs/facebook-login/android?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Meta Facebook Login for Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.facebook.com/docs/facebook-login/ios?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Meta Facebook Login for iOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Firebase sits in the middle of the sign-in flow
&lt;/h2&gt;

&lt;p&gt;Firebase's Flutter authentication documentation describes the Facebook setup in a very direct way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a Facebook Developer App&lt;/li&gt;
&lt;li&gt;enable Facebook provider in Firebase Console&lt;/li&gt;
&lt;li&gt;add the Facebook App ID and App Secret&lt;/li&gt;
&lt;li&gt;use a native Facebook SDK path on Android and iOS&lt;/li&gt;
&lt;li&gt;authenticate using &lt;code&gt;FacebookAuthProvider.credential(...)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Firebase also highlights two important details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the Facebook provider must be enabled in Firebase Console&lt;/li&gt;
&lt;li&gt;the Firebase OAuth redirect URI must be added to the Facebook app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why setup order matters. If Meta is configured but Firebase is not, the native token may be returned while Firebase authentication still fails.&lt;/p&gt;

&lt;p&gt;Reference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/auth/flutter/federated-auth?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Firebase Auth for Flutter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Native mobile config still matters in a Flutter project
&lt;/h2&gt;

&lt;p&gt;Flutter does not remove the need for native Facebook settings.&lt;/p&gt;

&lt;p&gt;Meta's Android setup requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;facebook_app_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;facebook_client_token&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fb_login_protocol_scheme&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;manifest metadata&lt;/li&gt;
&lt;li&gt;Facebook activities&lt;/li&gt;
&lt;li&gt;Custom Tab configuration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;INTERNET&lt;/code&gt; permission&lt;/li&gt;
&lt;li&gt;package/class association&lt;/li&gt;
&lt;li&gt;key hashes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meta's iOS setup requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CFBundleURLSchemes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FacebookAppID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FacebookClientToken&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FacebookDisplayName&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LSApplicationQueriesSchemes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;bundle ID registration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even in Flutter, Facebook Login still relies on native Android and iOS configuration under the hood.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What a properly configured project usually contains
&lt;/h2&gt;

&lt;p&gt;In a typical Flutter + Firebase + Facebook Login project, you will usually have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flutter_facebook_auth&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;a login flow calling &lt;code&gt;FacebookAuth.instance.login()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Firebase credential conversion&lt;/li&gt;
&lt;li&gt;Android package identifiers&lt;/li&gt;
&lt;li&gt;iOS bundle identifiers&lt;/li&gt;
&lt;li&gt;native Android metadata&lt;/li&gt;
&lt;li&gt;iOS &lt;code&gt;Info.plist&lt;/code&gt; Facebook entries&lt;/li&gt;
&lt;li&gt;Firebase Authentication enabled&lt;/li&gt;
&lt;li&gt;a configured Firebase auth domain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that stage, the remaining work is often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aligning Meta console settings with native identifiers&lt;/li&gt;
&lt;li&gt;adding Android debug and release key hashes&lt;/li&gt;
&lt;li&gt;enabling Facebook provider in Firebase&lt;/li&gt;
&lt;li&gt;confirming the correct ownership and admin structure&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Business portfolio is operational hygiene, not bureaucracy
&lt;/h2&gt;

&lt;p&gt;If you are building a real product, business ownership matters for reasons beyond compliance.&lt;/p&gt;

&lt;p&gt;Without proper business ownership, you can run into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one developer privately owning the Meta app&lt;/li&gt;
&lt;li&gt;broken access when people leave the team&lt;/li&gt;
&lt;li&gt;confusion over who can submit apps for review&lt;/li&gt;
&lt;li&gt;delays when Meta later requests verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a small team, the disciplined approach is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create or select the correct business portfolio&lt;/li&gt;
&lt;li&gt;make the business the long-term owner&lt;/li&gt;
&lt;li&gt;assign appropriate admin and developer roles&lt;/li&gt;
&lt;li&gt;keep business documentation ready if verification is requested&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Testing should happen in stages
&lt;/h2&gt;

&lt;p&gt;A reliable testing sequence looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm Facebook provider is enabled in Firebase.&lt;/li&gt;
&lt;li&gt;Confirm Android and iOS platform values are correct in Meta.&lt;/li&gt;
&lt;li&gt;Add Android debug key hash and test debug builds.&lt;/li&gt;
&lt;li&gt;Add Android release key hash and test release builds.&lt;/li&gt;
&lt;li&gt;Test iOS on a real device if shipping on iOS.&lt;/li&gt;
&lt;li&gt;Confirm Firebase user creation succeeds.&lt;/li&gt;
&lt;li&gt;Confirm backend session creation succeeds.&lt;/li&gt;
&lt;li&gt;Test logout and account deletion flows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you only test debug Android builds, you can still ship a broken production login flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Common mistakes to avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;putting the Firebase redirect URI into &lt;code&gt;App Domains&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;forgetting Android release key hashes&lt;/li&gt;
&lt;li&gt;enabling Facebook Login in Meta but not in Firebase&lt;/li&gt;
&lt;li&gt;exposing the Facebook App Secret in Flutter code&lt;/li&gt;
&lt;li&gt;registering the app under the wrong personal account&lt;/li&gt;
&lt;li&gt;assuming Flutter removes native setup requirements&lt;/li&gt;
&lt;li&gt;testing only in development mode&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;Facebook Login in Flutter is not mainly a Dart problem. It is a configuration and ownership problem.&lt;/p&gt;

&lt;p&gt;The teams that get it right usually do four things well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;they create the Meta app under a durable owner&lt;/li&gt;
&lt;li&gt;they align Meta settings, Firebase settings, and native mobile settings&lt;/li&gt;
&lt;li&gt;they understand the difference between &lt;code&gt;App Domains&lt;/code&gt; and OAuth redirect URIs&lt;/li&gt;
&lt;li&gt;they test both debug and release login paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those pieces are aligned, the Flutter implementation becomes the easy part.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.facebook.com/docs/development/register?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Meta Developer Registration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.facebook.com/docs/facebook-login/android?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Meta Facebook Login for Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.facebook.com/docs/facebook-login/ios?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Meta Facebook Login for iOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/auth/flutter/federated-auth?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Firebase Flutter Federated Authentication Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>android</category>
      <category>auth0challenge</category>
    </item>
    <item>
      <title>How to Change Wi-Fi Details on a Headless Raspberry Pi When You Don’t Know the Current Network</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Fri, 08 May 2026 12:05:34 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/-how-to-change-wi-fi-details-on-a-headless-raspberry-pi-when-you-dont-know-the-current-network-375l</link>
      <guid>https://dev.to/kenryikegbo/-how-to-change-wi-fi-details-on-a-headless-raspberry-pi-when-you-dont-know-the-current-network-375l</guid>
      <description>&lt;p&gt;If you’ve ever worked with a headless Raspberry Pi, you’ve probably faced this problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Raspberry Pi was previously connected to a Wi-Fi network&lt;/li&gt;
&lt;li&gt;You do not know which network it is connected to&lt;/li&gt;
&lt;li&gt;You cannot connect a monitor, keyboard, or mouse&lt;/li&gt;
&lt;li&gt;SSH is your only option&lt;/li&gt;
&lt;li&gt;The Pi is no longer appearing on your current network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This usually happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You move to a new location&lt;/li&gt;
&lt;li&gt;Your Wi-Fi name/password changes&lt;/li&gt;
&lt;li&gt;Someone else configured the Pi&lt;/li&gt;
&lt;li&gt;You forgot the old network credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this guide, I’ll show you how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diagnose the problem&lt;/li&gt;
&lt;li&gt;Reconfigure Wi-Fi without a monitor&lt;/li&gt;
&lt;li&gt;Force the Pi onto a new network&lt;/li&gt;
&lt;li&gt;Recover SSH access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The methods below work for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raspberry Pi 3&lt;/li&gt;
&lt;li&gt;Raspberry Pi 4&lt;/li&gt;
&lt;li&gt;Raspberry Pi 5&lt;/li&gt;
&lt;li&gt;Raspberry Pi Zero W/2W&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Understanding the Problem
&lt;/h1&gt;

&lt;p&gt;A Raspberry Pi configured for headless access boots and automatically tries to connect to the Wi-Fi credentials saved inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wpa_supplicant.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the saved Wi-Fi no longer exists&lt;/li&gt;
&lt;li&gt;the password changed&lt;/li&gt;
&lt;li&gt;or the Pi is too far from the router&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then the Pi never joins the network.&lt;/p&gt;

&lt;p&gt;Since SSH depends on network access, you lose remote control completely.&lt;/p&gt;




&lt;h1&gt;
  
  
  Method 1 — Edit Wi-Fi Credentials Directly from the SD Card (Best Method)
&lt;/h1&gt;

&lt;p&gt;This is the fastest recovery method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — Remove the SD Card
&lt;/h2&gt;

&lt;p&gt;Power off the Raspberry Pi safely.&lt;/p&gt;

&lt;p&gt;Remove the microSD card and insert it into your computer using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SD card reader&lt;/li&gt;
&lt;li&gt;USB adapter&lt;/li&gt;
&lt;li&gt;laptop SD slot&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Step 2 — Open the Boot Partition
&lt;/h1&gt;

&lt;p&gt;After inserting the SD card, you’ll see a small partition called:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;boot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bootfs&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open it.&lt;/p&gt;

&lt;p&gt;This partition is readable on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows&lt;/li&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;li&gt;macOS&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Step 3 — Create or Edit &lt;code&gt;wpa_supplicant.conf&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Inside the boot partition, create a file named:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wpa_supplicant.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it already exists, edit it.&lt;/p&gt;

&lt;p&gt;Paste this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;NG
&lt;span class="nv"&gt;ctrl_interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/run/wpa_supplicant &lt;span class="nv"&gt;GROUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;netdev
&lt;span class="nv"&gt;update_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1

&lt;span class="nv"&gt;network&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;
    &lt;span class="nv"&gt;ssid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_WIFI_NAME"&lt;/span&gt;
    &lt;span class="nv"&gt;psk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_WIFI_PASSWORD"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;NG
&lt;span class="nv"&gt;ctrl_interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/run/wpa_supplicant &lt;span class="nv"&gt;GROUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;netdev
&lt;span class="nv"&gt;update_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1

&lt;span class="nv"&gt;network&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;
    &lt;span class="nv"&gt;ssid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"MTN_Home"&lt;/span&gt;
    &lt;span class="nv"&gt;psk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"mysecurepassword"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Why &lt;code&gt;country=NG&lt;/code&gt; Matters
&lt;/h1&gt;

&lt;p&gt;A lot of people ignore this.&lt;/p&gt;

&lt;p&gt;The country code controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wi-Fi regulatory channels&lt;/li&gt;
&lt;li&gt;allowed radio frequencies&lt;/li&gt;
&lt;li&gt;transmission compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your country code is wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wi-Fi may fail silently&lt;/li&gt;
&lt;li&gt;some channels become inaccessible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Nigeria, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;NG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;



&lt;p&gt;unless you are actually in the US.&lt;/p&gt;




&lt;p&gt;Do You Need to Remove Old Wi-Fi Networks?&lt;/p&gt;

&lt;p&gt;Usually, no.&lt;/p&gt;

&lt;p&gt;The Raspberry Pi can store multiple Wi-Fi networks and automatically connect to whichever known network is available.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;network&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;
    &lt;span class="nv"&gt;ssid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Old_Wifi"&lt;/span&gt;
    &lt;span class="nv"&gt;psk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"oldpassword"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;network&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;
    &lt;span class="nv"&gt;ssid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"New_Wifi"&lt;/span&gt;
    &lt;span class="nv"&gt;psk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"newpassword"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Old_Wifi is unavailable, the Pi will try New_Wifi.&lt;/p&gt;

&lt;p&gt;When Should You Remove Old Networks?&lt;/p&gt;

&lt;p&gt;You may want to remove old saved networks if:&lt;/p&gt;

&lt;p&gt;The Pi keeps reconnecting to the wrong network&lt;br&gt;
Multiple nearby networks are available&lt;br&gt;
The old Wi-Fi has poor internet access&lt;br&gt;
You want cleaner configuration management&lt;br&gt;
You are deploying the Pi to a new environment permanently&lt;/p&gt;

&lt;p&gt;In that case, simply delete the old network={} block from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wpa_supplicant.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and leave only the new network.&lt;/p&gt;

&lt;p&gt;Best Practice&lt;/p&gt;

&lt;p&gt;For classroom projects, IoT deployments, and Raspberry Pi labs, it is usually better to:&lt;/p&gt;

&lt;p&gt;remove outdated Wi-Fi networks&lt;br&gt;
keep only the active network&lt;br&gt;
avoid connection conflicts&lt;/p&gt;

&lt;p&gt;This makes troubleshooting much easier later.&lt;/p&gt;
&lt;h1&gt;
  
  
  Step 4 — Enable SSH
&lt;/h1&gt;

&lt;p&gt;Still inside the boot partition:&lt;/p&gt;

&lt;p&gt;Create an empty file named:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;No extension.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssh.conf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;/div&gt;



&lt;p&gt;This enables the SSH server during boot.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 5 — Reinsert SD Card and Boot
&lt;/h1&gt;

&lt;p&gt;Insert the SD card back into the Raspberry Pi.&lt;/p&gt;

&lt;p&gt;Power it on.&lt;/p&gt;

&lt;p&gt;Wait about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1–3 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;for the Pi to boot and connect.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 6 — Find the Raspberry Pi on the Network
&lt;/h1&gt;

&lt;p&gt;Now you need the Pi’s IP address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option A — Use Fing (Recommended)
&lt;/h2&gt;

&lt;p&gt;Install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fing (Android/iPhone)&lt;/li&gt;
&lt;li&gt;Fing Desktop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scan your network.&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raspberrypi&lt;/li&gt;
&lt;li&gt;Raspberry Pi Foundation&lt;/li&gt;
&lt;li&gt;hostname you configured&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Option B — Use Router Admin Page
&lt;/h2&gt;

&lt;p&gt;Login to your router.&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connected Devices&lt;/li&gt;
&lt;li&gt;DHCP Clients&lt;/li&gt;
&lt;li&gt;LAN Devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You may see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;raspberrypi.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or an IP like:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Option C — Use &lt;code&gt;ping&lt;/code&gt;
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping raspberrypi.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping yourhostname.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 7 — SSH Into the Pi
&lt;/h1&gt;

&lt;p&gt;Once you have the IP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh pi@192.168.1.12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh username@hostname.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh stanley@raspberrypi.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  What If You Don’t Know the Username?
&lt;/h1&gt;

&lt;p&gt;Modern Raspberry Pi OS no longer uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;raspberry&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;by default.&lt;/p&gt;

&lt;p&gt;The username is whatever was set during OS imaging.&lt;/p&gt;

&lt;p&gt;If you forgot it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reflash the OS&lt;/li&gt;
&lt;li&gt;or inspect old documentation&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Method 2 — Reflash Using Raspberry Pi Imager (Cleanest Option)
&lt;/h1&gt;

&lt;p&gt;If recovery fails completely, just rewrite the OS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Raspberry Pi Imager
&lt;/h2&gt;

&lt;p&gt;Download from:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.raspberrypi.com/software/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Raspberry Pi Imager&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Configure Headless Setup Properly
&lt;/h1&gt;

&lt;p&gt;Inside Raspberry Pi Imager:&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NEXT → EDIT SETTINGS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure:&lt;/p&gt;

&lt;h2&gt;
  
  
  General
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Hostname&lt;/li&gt;
&lt;li&gt;Username&lt;/li&gt;
&lt;li&gt;Password&lt;/li&gt;
&lt;li&gt;Wi-Fi SSID&lt;/li&gt;
&lt;li&gt;Wi-Fi Password&lt;/li&gt;
&lt;li&gt;Country&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Services
&lt;/h2&gt;

&lt;p&gt;Enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Password authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then write the OS.&lt;/p&gt;

&lt;p&gt;This is the most reliable method.&lt;/p&gt;




&lt;h1&gt;
  
  
  Troubleshooting Tips
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Pi Not Appearing on Network
&lt;/h2&gt;

&lt;p&gt;Possible causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wrong Wi-Fi password&lt;/li&gt;
&lt;li&gt;Wrong country code&lt;/li&gt;
&lt;li&gt;Weak Wi-Fi signal&lt;/li&gt;
&lt;li&gt;5GHz unsupported network&lt;/li&gt;
&lt;li&gt;Hidden SSID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mobile hotspot&lt;/li&gt;
&lt;li&gt;2.4GHz Wi-Fi&lt;/li&gt;
&lt;li&gt;moving Pi closer&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  2. SSH “Hostname Could Not Be Resolved”
&lt;/h1&gt;

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

&lt;ul&gt;
&lt;li&gt;the Pi is not on the network&lt;/li&gt;
&lt;li&gt;or mDNS isn’t working&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use direct IP instead.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. SSH Connection Refused
&lt;/h1&gt;

&lt;p&gt;Usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH disabled&lt;/li&gt;
&lt;li&gt;Pi still booting&lt;/li&gt;
&lt;li&gt;firewall issue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recreate the empty &lt;code&gt;ssh&lt;/code&gt; file.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Raspberry Pi Only Supports 2.4GHz
&lt;/h1&gt;

&lt;p&gt;Some older Pis cannot use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5GHz&lt;/li&gt;
&lt;li&gt;Wi-Fi 6 only networks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mixed mode&lt;/li&gt;
&lt;li&gt;2.4GHz compatibility&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Bonus Tip — Use Your Phone Hotspot
&lt;/h1&gt;

&lt;p&gt;If you don’t know the old network:&lt;/p&gt;

&lt;p&gt;Create a hotspot using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;same Wi-Fi name&lt;/li&gt;
&lt;li&gt;same password&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;as the old network.&lt;/p&gt;

&lt;p&gt;The Pi may reconnect automatically.&lt;/p&gt;

&lt;p&gt;This is one of the fastest recovery tricks.&lt;/p&gt;




&lt;h1&gt;
  
  
  Recommended Headless Workflow
&lt;/h1&gt;

&lt;p&gt;Here’s the workflow I now use for every Raspberry Pi deployment:&lt;/p&gt;

&lt;h2&gt;
  
  
  During OS Imaging
&lt;/h2&gt;

&lt;p&gt;Always configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hostname&lt;/li&gt;
&lt;li&gt;SSH&lt;/li&gt;
&lt;li&gt;Wi-Fi&lt;/li&gt;
&lt;li&gt;username/password&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;inside Raspberry Pi Imager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep Backup Notes
&lt;/h2&gt;

&lt;p&gt;Save:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hostname&lt;/li&gt;
&lt;li&gt;username&lt;/li&gt;
&lt;li&gt;password&lt;/li&gt;
&lt;li&gt;Wi-Fi used&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;li&gt;Google Docs&lt;/li&gt;
&lt;li&gt;password manager&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Static Hostnames
&lt;/h2&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cv-group1
iot-node2
weather-station
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes network discovery easier.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Headless Raspberry Pi setups are incredibly powerful, but Wi-Fi issues can lock you out completely if you don’t plan ahead.&lt;/p&gt;

&lt;p&gt;The good news is:&lt;br&gt;
you usually do NOT need a monitor.&lt;/p&gt;

&lt;p&gt;As long as you can access the SD card, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;change Wi-Fi&lt;/li&gt;
&lt;li&gt;enable SSH&lt;/li&gt;
&lt;li&gt;recover the device&lt;/li&gt;
&lt;li&gt;regain remote access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you master this workflow, managing remote Raspberry Pis becomes much easier — especially in classrooms, IoT deployments, robotics projects, and AI edge systems.&lt;/p&gt;

&lt;p&gt;Happy building 🚀&lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>ai</category>
      <category>iot</category>
      <category>micropython</category>
    </item>
    <item>
      <title>API Keys vs. Access Tokens: What's the Real Difference?</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Wed, 06 May 2026 13:39:41 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/api-keys-vs-access-tokens-whats-the-real-difference-1fbd</link>
      <guid>https://dev.to/kenryikegbo/api-keys-vs-access-tokens-whats-the-real-difference-1fbd</guid>
      <description>&lt;p&gt;As a developer, you’ve definitely seen them: &lt;code&gt;x-api-key&lt;/code&gt;, &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;, and &lt;code&gt;Personal Access Tokens&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;If you've ever wondered if they are just different names for the same thing—&lt;strong&gt;they aren't.&lt;/strong&gt; Using the wrong one can leave your app wide open to security risks.&lt;/p&gt;

&lt;p&gt;Here is the "explain like I'm five" breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔑 The API Key: The "Project ID Card"
&lt;/h2&gt;

&lt;p&gt;Think of an &lt;strong&gt;API Key&lt;/strong&gt; as a static ID card for an entire project or application. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Who is it?&lt;/strong&gt; It identifies the &lt;em&gt;application&lt;/em&gt; (e.g., "This request is coming from the WeatherDashboard app").&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Life Span:&lt;/strong&gt; Long-lived. It usually doesn't expire unless you manually rotate it.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Best for:&lt;/strong&gt; Accessing public data (maps, weather) or simple server-to-server tasks where no specific user login is required.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simple but less secure - anyone with the key can use it.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://weather.com{YOUR_API_KEY}`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎟️ The Access Token: The "Visitor Badge"
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;Access Token&lt;/strong&gt; (like a &lt;a href="https://dev.to/authress/api-authentication-creating-service-client-api-keys-25i6"&gt;JWT&lt;/a&gt;) is more like a temporary visitor badge. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Who is it?&lt;/strong&gt; It identifies the &lt;em&gt;specific user&lt;/em&gt; and what they are allowed to do.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Life Span:&lt;/strong&gt; Short-lived. It expires quickly (often in 1 hour) and needs a "refresh" to stay active.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Best for:&lt;/strong&gt; Private user data (Gmail, Spotify, Banking). It ensures that even if a token is stolen, the damage is limited by time and scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📊 Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;API Key&lt;/th&gt;
&lt;th&gt;Access Token&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identifies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Application&lt;/td&gt;
&lt;td&gt;The User&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expiration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usually Permanent&lt;/td&gt;
&lt;td&gt;Short-lived (Expires)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (Static)&lt;/td&gt;
&lt;td&gt;High (Dynamic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Common Flow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generated in a Portal&lt;/td&gt;
&lt;td&gt;Generated via Login (OAuth)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  💡 When to use which?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use an &lt;a href="https://dev.to/codeparrot/api-keys-vs-tokens-theyre-not-the-same-thing-41fi"&gt;API Key&lt;/a&gt; when:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;You are calling a public service (like Google Maps).&lt;/li&gt;
&lt;li&gt;You need to track usage for billing (e.g., "App X used 1,000 requests").&lt;/li&gt;
&lt;li&gt;You are doing internal server-to-server communication in a trusted environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Use an &lt;a href="https://dev.to/saif_shines/migrating-from-api-keys-to-oauth-2h40"&gt;Access Token&lt;/a&gt; when:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;You are dealing with user-specific data (e.g., reading &lt;em&gt;my&lt;/em&gt; emails).&lt;/li&gt;
&lt;li&gt;Security is a priority (you want the credential to expire).&lt;/li&gt;
&lt;li&gt;You need "granular permissions" (e.g., "This app can read my profile but NOT post for me").&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🛡️ Pro-tip: Never Hardcode!
&lt;/h2&gt;

&lt;p&gt;Whether you use a key or a token, &lt;strong&gt;never&lt;/strong&gt; commit them to GitHub. Always use &lt;a href="https://dev.to/kylejb/how-should-you-secure-your-api-token-2odl"&gt;environment variables&lt;/a&gt; and a &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are you currently using in your latest project? Drop a comment below! 👇&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>🚀 Setting Up Raspberry Pi &amp; Camera for AI Projects (Complete Command Guide)</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Mon, 04 May 2026 18:34:12 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/setting-up-raspberry-pi-camera-for-ai-projects-complete-command-guide-340g</link>
      <guid>https://dev.to/kenryikegbo/setting-up-raspberry-pi-camera-for-ai-projects-complete-command-guide-340g</guid>
      <description>&lt;p&gt;If you're working with a Raspberry Pi for computer vision or AI projects, getting everything set up can be confusing—especially with newer devices like the Raspberry Pi 5.&lt;/p&gt;

&lt;p&gt;This guide compiles &lt;strong&gt;all essential commands&lt;/strong&gt; used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up your Raspberry Pi&lt;/li&gt;
&lt;li&gt;Configuring network access&lt;/li&gt;
&lt;li&gt;Enabling remote control&lt;/li&gt;
&lt;li&gt;Troubleshooting camera issues&lt;/li&gt;
&lt;li&gt;Capturing images&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧠 1. System Setup &amp;amp; Updates
&lt;/h1&gt;

&lt;p&gt;Before doing anything, your system should be updated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🌐 2. Network &amp;amp; IP Configuration
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Check IP address
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 This is needed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH connection&lt;/li&gt;
&lt;li&gt;VNC connection&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🔐 3. Remote Access Setup
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Enable SSH and VNC
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;raspi-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then navigate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Interface Options → Enable SSH
Interface Options → Enable VNC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Connect via SSH
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh pi@&amp;lt;IP_ADDRESS&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh pi@192.168.43.25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🖥️ 4. VNC (Remote Desktop Access)
&lt;/h1&gt;

&lt;p&gt;Used when you want full GUI access from your laptop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Enable VNC (see above)&lt;/li&gt;
&lt;li&gt;Install VNC Viewer on your laptop&lt;/li&gt;
&lt;li&gt;Connect using:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;IP_ADDRESS&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📸 5. Camera System (Important Update)
&lt;/h1&gt;

&lt;p&gt;On modern Raspberry Pi OS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera is enabled by default (libcamera system)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You will NOT see "Camera" in raspi-config anymore.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧪 6. Test Camera
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Preview camera
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpicam-hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Works only on GUI (monitor or VNC)&lt;/p&gt;




&lt;h2&gt;
  
  
  Capture image
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpicam-still &lt;span class="nt"&gt;-o&lt;/span&gt; test.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Record video
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpicam-vid &lt;span class="nt"&gt;-t&lt;/span&gt; 5000 &lt;span class="nt"&gt;-o&lt;/span&gt; video.h264
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📂 7. File Management Commands
&lt;/h1&gt;

&lt;h2&gt;
  
  
  List files
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create folder
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;dataset
&lt;span class="nb"&gt;cd &lt;/span&gt;dataset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🔁 8. Capture Multiple Images
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..10&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;rpicam-still &lt;span class="nt"&gt;-o&lt;/span&gt; img_&lt;span class="nv"&gt;$i&lt;/span&gt;.jpg&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;sleep &lt;/span&gt;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🖼️ 9. Open Image (on Raspberry Pi GUI)
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xdg-open test.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🧪 10. Python + OpenCV Setup
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Start Python
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Import OpenCV
&lt;/h2&gt;



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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Load image
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Resize image
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imwrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resized.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resized&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Convert to grayscale
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;gray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLOR_BGR2GRAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imwrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gray.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Convert to HSV
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;hsv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLOR_BGR2HSV&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imwrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hsv.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hsv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Exit Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ⚠️ 11. Common Troubleshooting
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Camera not working?
&lt;/h2&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cable orientation&lt;/li&gt;
&lt;li&gt;Proper connection&lt;/li&gt;
&lt;li&gt;Correct port (Pi 5 has 2 ports)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  No preview?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SSH = No preview
VNC/Monitor = Preview works
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Restart system
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🧠 Key Takeaways
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✔ Raspberry Pi OS now uses libcamera
✔ No manual camera enable needed
✔ rpicam-* commands replace raspistill
✔ SSH is for control, not display
✔ VNC gives full desktop access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🎯 Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Once your Raspberry Pi and camera are set up:&lt;/p&gt;

&lt;p&gt;👉 You are ready to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collect image datasets&lt;/li&gt;
&lt;li&gt;Train AI models&lt;/li&gt;
&lt;li&gt;Deploy computer vision applications&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🔥 If you found this useful
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Drop a ❤️&lt;/li&gt;
&lt;li&gt;Share with someone learning Raspberry Pi&lt;/li&gt;
&lt;li&gt;Follow for more AI + Embedded Systems content&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>ai</category>
      <category>computervision</category>
      <category>raspberrypi</category>
      <category>iot</category>
    </item>
    <item>
      <title>COMPLETE COURSE: Git &amp; GitHub (From Zero to Advanced)</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Thu, 30 Apr 2026 17:59:55 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/complete-course-git-github-from-zero-to-advanced-14e4</link>
      <guid>https://dev.to/kenryikegbo/complete-course-git-github-from-zero-to-advanced-14e4</guid>
      <description>&lt;h2&gt;
  
  
  📘 COURSE OVERVIEW
&lt;/h2&gt;

&lt;p&gt;This course gives you a &lt;strong&gt;rock-solid foundation&lt;/strong&gt; in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git (local version control)&lt;/li&gt;
&lt;li&gt;GitHub (remote collaboration)&lt;/li&gt;
&lt;li&gt;Real-world workflows (branching, merging, collaboration)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Git = tracks changes locally&lt;br&gt;
GitHub = cloud platform for collaboration&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  🧩 MODULE 1: WHAT IS GIT?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Definition
&lt;/h2&gt;

&lt;p&gt;Git is a &lt;strong&gt;Version Control System (VCS)&lt;/strong&gt; that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tracks every change in your files&lt;/li&gt;
&lt;li&gt;Stores history (who, when, what changed)&lt;/li&gt;
&lt;li&gt;Allows rollback to previous versions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹 Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tracks &lt;strong&gt;any file type&lt;/strong&gt; (code, text, images, videos)&lt;/li&gt;
&lt;li&gt;Maintains &lt;strong&gt;multiple versions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enables &lt;strong&gt;safe experimentation&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹 Real-world Problem Git Solves
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;Build a project → client likes it&lt;/li&gt;
&lt;li&gt;Update it → client wants old version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Without Git → you're stuck&lt;br&gt;
👉 With Git → you restore instantly&lt;/p&gt;




&lt;h1&gt;
  
  
  🔗 MODULE 2: GIT vs GITHUB
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Git
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Local tool&lt;/li&gt;
&lt;li&gt;Runs on your computer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹 GitHub
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cloud platform&lt;/li&gt;
&lt;li&gt;Stores repositories online&lt;/li&gt;
&lt;li&gt;Enables collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹 Analogy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Git = coffee ☕&lt;/li&gt;
&lt;li&gt;GitHub = coffee shop 🏪&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹 Alternatives
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitLab&lt;/li&gt;
&lt;li&gt;Bitbucket&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🏗️ MODULE 3: GIT ARCHITECTURE
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Two Parts
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Local&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote (GitHub)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🔹 Workflow Stages
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Working Directory&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Where you edit files&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Staging Area&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Temporary holding area&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Permanent storage (commit history)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔁 Workflow Summary
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Working Directory → Staging Area → Local Repo → Remote Repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ⚙️ MODULE 4: INSTALLING GIT
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to official Git website&lt;/li&gt;
&lt;li&gt;Download for:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Windows (32/64-bit)&lt;/li&gt;
&lt;li&gt;Mac (Homebrew)&lt;/li&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹 Verify Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ If installed → shows version&lt;br&gt;
❌ Else → error&lt;/p&gt;




&lt;h1&gt;
  
  
  💻 MODULE 5: TERMINAL BASICS
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Important Commands (NOT Git commands)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;       &lt;span class="c"&gt;# change directory&lt;/span&gt;
&lt;span class="nb"&gt;pwd&lt;/span&gt;      &lt;span class="c"&gt;# show current path&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt;    &lt;span class="c"&gt;# create folder&lt;/span&gt;
&lt;span class="nb"&gt;touch&lt;/span&gt;    &lt;span class="c"&gt;# create file&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt;       &lt;span class="c"&gt;# list files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📁 MODULE 6: CREATING A PROJECT
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Steps
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Desktop
&lt;span class="nb"&gt;mkdir &lt;/span&gt;git-1
&lt;span class="nb"&gt;cd &lt;/span&gt;git-1

&lt;span class="nb"&gt;touch &lt;/span&gt;1.txt
&lt;span class="nb"&gt;touch &lt;/span&gt;2.txt

&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-folder
&lt;span class="nb"&gt;cd &lt;/span&gt;my-folder
&lt;span class="nb"&gt;touch &lt;/span&gt;3.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🚀 MODULE 7: INITIALIZING GIT
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 What Happens
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Creates hidden &lt;code&gt;.git&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;Git starts tracking project
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Shows &lt;code&gt;.git&lt;/code&gt; folder&lt;/p&gt;




&lt;h1&gt;
  
  
  🌐 MODULE 8: GITHUB REPOSITORY
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to GitHub&lt;/li&gt;
&lt;li&gt;Create new repo&lt;/li&gt;
&lt;li&gt;Add files online&lt;/li&gt;
&lt;li&gt;Commit changes&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  📥 MODULE 9: CLONING A REPO
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;repo-url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Result
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Downloads remote repo&lt;/li&gt;
&lt;li&gt;Creates local copy&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🔍 MODULE 10: TRACKING CHANGES
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Shows:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Modified files&lt;/li&gt;
&lt;li&gt;New files&lt;/li&gt;
&lt;li&gt;Deleted files&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  📦 MODULE 11: STAGING (git add)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Purpose
&lt;/h2&gt;

&lt;p&gt;Move changes → staging area&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Variations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Add everything
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nt"&gt;--all&lt;/span&gt;
git add &lt;span class="nt"&gt;-A&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Add current directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Add specific file
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Add by extension
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="k"&gt;*&lt;/span&gt;.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Add using wildcard
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Does NOT include deleted files&lt;/p&gt;




&lt;h1&gt;
  
  
  🔄 MODULE 12: UNSTAGING
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Moves files back to working directory&lt;/p&gt;




&lt;h1&gt;
  
  
  💾 MODULE 13: COMMITTING
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"message"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Meaning
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Permanently saves changes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ First-time Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"you@email.com"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ⏪ MODULE 14: UNDO COMMITS
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset HEAD~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Undo last commit&lt;/p&gt;




&lt;h1&gt;
  
  
  ❌ MODULE 15: DELETING FILES
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Delete + stage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;rm &lt;/span&gt;file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Force delete
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Remove from Git only
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;--cached&lt;/span&gt; file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📜 MODULE 16: VIEW HISTORY
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Short version:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🌿 MODULE 17: BRANCHING
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Create branch
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch development
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 View branches
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Switch branch
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout development
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 Concept
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Main = stable code&lt;/li&gt;
&lt;li&gt;Branch = experimentation&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🔀 MODULE 18: MERGING
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Merge branch
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge development
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ⚠️ MODULE 19: MERGE CONFLICTS
&lt;/h1&gt;

&lt;p&gt;Occurs when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same file edited in different branches&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹 Resolution Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open file&lt;/li&gt;
&lt;li&gt;Choose correct version&lt;/li&gt;
&lt;li&gt;Remove conflict markers&lt;/li&gt;
&lt;li&gt;Commit&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  ⏳ MODULE 20: TIME TRAVEL
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Go to old commit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &amp;lt;commit-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Return to latest
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🔍 MODULE 21: COMPARE CHANGES
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff &amp;lt;commit1&amp;gt; &amp;lt;commit2&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Red → removed&lt;/li&gt;
&lt;li&gt;Green → added&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ☁️ MODULE 22: REMOTE OPERATIONS
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Push
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Fetch
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Pull
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔁 Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;push → local → remote&lt;/li&gt;
&lt;li&gt;fetch → remote → local (no merge)&lt;/li&gt;
&lt;li&gt;pull → fetch + merge&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🔄 MODULE 23: RESTORE
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Undo changes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git restore file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Restore all
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git restore &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Unstage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git restore &lt;span class="nt"&gt;--staged&lt;/span&gt; file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📦 MODULE 24: STASH
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Save unfinished work
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Retrieve later
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🧠 FINAL SUMMARY
&lt;/h1&gt;

&lt;p&gt;You now understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git fundamentals&lt;/li&gt;
&lt;li&gt;Local vs remote workflow&lt;/li&gt;
&lt;li&gt;Full command lifecycle&lt;/li&gt;
&lt;li&gt;Branching &amp;amp; collaboration&lt;/li&gt;
&lt;li&gt;Conflict resolution&lt;/li&gt;
&lt;li&gt;Undoing mistakes safely&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>linux</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Git and GitHub tutorials for Beginners</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Thu, 30 Apr 2026 11:03:44 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/git-and-github-tutorials-for-beginners-41nm</link>
      <guid>https://dev.to/kenryikegbo/git-and-github-tutorials-for-beginners-41nm</guid>
      <description>&lt;h1&gt;
  
  
  🔰 1. What is Git?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Git = Version Control System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 It helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track changes in your code&lt;/li&gt;
&lt;li&gt;Go back to previous versions&lt;/li&gt;
&lt;li&gt;Collaborate with others safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Google Docs version history… but for code”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Git records every change as a &lt;strong&gt;snapshot (commit)&lt;/strong&gt; ([FreeCodeCamp][1])&lt;/p&gt;




&lt;h1&gt;
  
  
  🌐 2. What is GitHub?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;GitHub is a &lt;strong&gt;cloud platform&lt;/strong&gt; that hosts Git repositories&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collaboration&lt;/li&gt;
&lt;li&gt;Sharing code&lt;/li&gt;
&lt;li&gt;Team development&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 Key idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Git = tool&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub = online platform using Git&lt;/strong&gt; ([product.hubspot.com][2])&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🏗️ 3. Core Git Concepts (VERY IMPORTANT)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  📁 Repository (Repo)
&lt;/h2&gt;

&lt;p&gt;A project folder tracked by Git&lt;/p&gt;

&lt;h2&gt;
  
  
  🧾 Commit
&lt;/h2&gt;

&lt;p&gt;A saved snapshot of your work&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Staging Area
&lt;/h2&gt;

&lt;p&gt;Where you prepare changes before saving&lt;/p&gt;

&lt;h2&gt;
  
  
  🌿 Branch
&lt;/h2&gt;

&lt;p&gt;A separate version of your project (for new features)&lt;/p&gt;

&lt;h2&gt;
  
  
  🔀 Merge
&lt;/h2&gt;

&lt;p&gt;Combining branches together&lt;/p&gt;




&lt;h1&gt;
  
  
  ⚙️ 4. Basic Git Workflow (The Heart of Everything)
&lt;/h1&gt;

&lt;p&gt;This is the &lt;strong&gt;main flow taught in the video&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Initialize Git
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Turns your folder into a Git repository&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Add Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Moves files to the &lt;strong&gt;staging area&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Commit Changes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Your message"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Saves a snapshot of your work&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Connect to GitHub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add origin &amp;lt;repo-url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 5: Push to GitHub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Uploads your code online&lt;/p&gt;




&lt;h1&gt;
  
  
  🔄 5. Everyday Git Commands
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Check status
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  See history
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Download updates
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Upload changes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🌿 6. Working with Branches (Key Skill)
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Create a branch
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Switch branch
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Merge branch
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge feature-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Why branches matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work on features without breaking main code ([product.hubspot.com][2])&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🤝 7. Collaboration Workflow (GitHub Flow)
&lt;/h1&gt;

&lt;p&gt;This is how teams work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create branch&lt;/li&gt;
&lt;li&gt;Make changes&lt;/li&gt;
&lt;li&gt;Push branch&lt;/li&gt;
&lt;li&gt;Open Pull Request (PR)&lt;/li&gt;
&lt;li&gt;Review&lt;/li&gt;
&lt;li&gt;Merge&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 Pull Request = “Please review my changes”&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 8. Mental Model (Very Important)
&lt;/h1&gt;

&lt;p&gt;Think of Git like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Working Directory → Staging → Commit → GitHub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Working → you edit files&lt;/li&gt;
&lt;li&gt;Staging → you prepare changes&lt;/li&gt;
&lt;li&gt;Commit → you save version&lt;/li&gt;
&lt;li&gt;GitHub → you share it&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ⚡ 9. Common Beginner Mistakes (From the Video)
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;❌ Forgetting to &lt;code&gt;git add&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;❌ Bad commit messages&lt;/li&gt;
&lt;li&gt;❌ Working directly on main branch&lt;/li&gt;
&lt;li&gt;❌ Not pulling before pushing&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🚀 10. Your First Practice Exercise
&lt;/h1&gt;

&lt;p&gt;Try this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
git init

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello Git"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; file.txt
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"First commit"&lt;/span&gt;

&lt;span class="c"&gt;# connect to GitHub repo&lt;/span&gt;
git remote add origin &amp;lt;your-repo-url&amp;gt;
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>git</category>
      <category>github</category>
      <category>versioncontrol</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>🔐 Android App Signing: Why the "Keystore" is Your Most Important File</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Tue, 28 Apr 2026 22:35:07 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/android-app-signing-why-the-keystore-is-your-most-important-file-38ee</link>
      <guid>https://dev.to/kenryikegbo/android-app-signing-why-the-keystore-is-your-most-important-file-38ee</guid>
      <description>&lt;p&gt;If you are a new Android developer, there is one file that can literally make or break your entire career: the Keystore.&lt;br&gt;
In this post, let’s break down what Android App Signing actually is, why it matters for security, and how Google Play App Signing saved us all from potential disaster.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧱 The Basics: What is an App Signature?
&lt;/h2&gt;

&lt;p&gt;Think of an app signature as a digital wax seal.&lt;br&gt;
When you build an APK or AAB, you sign it with a private key. This signature tells the Android OS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identity: This app was created by Developer X.&lt;/li&gt;
&lt;li&gt;Integrity: This app hasn't been modified or tampered with since it was signed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🛡️ The "Secure Update" Model
&lt;/h2&gt;

&lt;p&gt;The most important thing to understand is how Android handles updates.&lt;br&gt;
When you try to install an update over an existing app, Android checks if the new signature matches the old signature.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Matches? The update proceeds and your user data is safe.&lt;/li&gt;
&lt;li&gt;Doesn't match? Android throws an error and blocks the install.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents a hacker from creating a "fake" update to your app to steal user passwords or data.&lt;/p&gt;

&lt;h2&gt;
  
  
  😱 The "Lost Key" Nightmare (The Old Way)
&lt;/h2&gt;

&lt;p&gt;Before 2017, if you lost your .jks (Java Keystore) file or forgot the password, you were finished.&lt;br&gt;
Because the signature is the only way Android identifies the developer, losing the key meant you could never update your app again. You would have to upload a completely new app with a new package name, losing all your installs and reviews.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 How "Google Play App Signing" Fixed It
&lt;/h2&gt;

&lt;p&gt;Google introduced Play App Signing to solve this exact problem. It splits the signing into two parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Upload Key: This is the key you keep. You sign your app with it and upload it to Google.&lt;/li&gt;
&lt;li&gt;The App Signing Key: Google keeps this master key in their secure "Vault."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The big win: If you lose your Upload Key, you just message Google Support. They verify your ID, reset the key, and you're back in business. The App Signing Key (the one the users see) never changes, so the update chain is never broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Quick Pro-Tips for Devs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Never commit your .jks file to GitHub (even in a private repo). Use Environment Variables or Secrets.&lt;/li&gt;
&lt;li&gt;Always opt-in to Google Play App Signing for new apps.&lt;/li&gt;
&lt;li&gt;Backup your keystore in a secure password manager like Bitwarden or 1Password.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;App signing isn't just a technical hurdle; it’s the foundation of trust between you and your users. Treat your keys like your house keys—don't lose them, and don't give them to anyone else!&lt;br&gt;
Have you ever had a "Lost Keystore" horror story? Let’s talk in the comments! 👇&lt;/p&gt;

</description>
      <category>android</category>
      <category>mobile</category>
      <category>flutter</category>
      <category>androiddev</category>
    </item>
    <item>
      <title>Stop Losing Progress: Setting Up a Pro Jupyter Workflow in VS Code (No More Colab Timeouts!)</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Tue, 21 Apr 2026 08:46:18 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/stop-losing-progress-setting-up-a-pro-jupyter-workflow-in-vs-code-no-more-colab-timeouts-10b</link>
      <guid>https://dev.to/kenryikegbo/stop-losing-progress-setting-up-a-pro-jupyter-workflow-in-vs-code-no-more-colab-timeouts-10b</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: The "Colab Heartbreak"
&lt;/h2&gt;

&lt;p&gt;We’ve all been there: You’re 40 epochs into a multimodal model for crop disease detection, and suddenly—Session Terminated. Your variables are gone, your local drive isn't synced, and you have to start over.&lt;br&gt;
While Google Colab is great for quick scripts, serious AI projects (like my current multimodal yield prediction system) need persistence and the power of a local IDE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why VS Code for Jupyter?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;IntelliSense: Better code completion than any browser-based notebook.&lt;/li&gt;
&lt;li&gt;Local Environment Control: No more !pip install every time you open the file.&lt;/li&gt;
&lt;li&gt;Git Integration: Version control your experiments easily.&lt;/li&gt;
&lt;li&gt;The Best of Both Worlds: Use your local UI while connecting to powerful cloud GPUs (like Paperspace or Saturn Cloud).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 1: The Essentials
&lt;/h2&gt;

&lt;p&gt;First, grab the Jupyter Extension from the VS Code Marketplace. This transforms VS Code into a full-featured notebook editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Virtual Environment (The Secret to Stability)
&lt;/h2&gt;

&lt;p&gt;Don't install your ML libraries globally! Create a dedicated environment for your project:&lt;/p&gt;

&lt;h1&gt;
  
  
  Create the env
&lt;/h1&gt;

&lt;p&gt;python -m venv crop_ai_env&lt;/p&gt;

&lt;h1&gt;
  
  
  Activate it
&lt;/h1&gt;

&lt;p&gt;source crop_ai_env/bin/activate  # Mac/Linux# .\crop_ai_env\Scripts\activate # Windows&lt;/p&gt;

&lt;h1&gt;
  
  
  Install the kernel connector
&lt;/h1&gt;

&lt;p&gt;pip install ipykernel tensorflow-gpu pillow pandas&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Launching the Notebook
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create a file named experiment.ipynb.&lt;/li&gt;
&lt;li&gt;Look at the top right corner of the editor. Click Select Kernel.&lt;/li&gt;
&lt;li&gt;Choose your crop_ai_env.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tip: If you don't see it, press Ctrl+Shift+P and run "Python: Select Interpreter" first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Pro-Tip for Long Training Runs
&lt;/h2&gt;

&lt;p&gt;If you are doing heavy transfer learning (like MobileNetV3), use a Checkpoint Callback. This ensures that even if your computer restarts, your model weights are safe on your drive:&lt;/p&gt;

&lt;p&gt;checkpoint_path = "checkpoints/crop_model_v1.ckpt"cp_callback = tf.keras.callbacks.ModelCheckpoint(&lt;br&gt;
    filepath=checkpoint_path,&lt;br&gt;
    save_weights_only=True,&lt;br&gt;
    verbose=1&lt;br&gt;
)&lt;/p&gt;

&lt;h1&gt;
  
  
  Your model.fit() now has a safety net
&lt;/h1&gt;

&lt;p&gt;model.fit(train_data, epochs=50, callbacks=[cp_callback])&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Switching from Colab to VS Code + a local virtual environment (synced via GitHub or a Cloud Drive) has saved me hours of re-training time. If you're building lightweight TFLite models for offline use, this local-first workflow is a game-changer.
&lt;/h2&gt;

&lt;p&gt;What’s your biggest frustration with browser-based notebooks? Let’s discuss in the comments!&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Fixing a Flutter Release APK Build That Failed on Windows</title>
      <dc:creator>Ikegbo Ogochukwu</dc:creator>
      <pubDate>Thu, 16 Apr 2026 13:27:12 +0000</pubDate>
      <link>https://dev.to/kenryikegbo/-fixing-a-flutter-release-apk-build-that-failed-on-windows-41ip</link>
      <guid>https://dev.to/kenryikegbo/-fixing-a-flutter-release-apk-build-that-failed-on-windows-41ip</guid>
      <description>&lt;p&gt;&lt;strong&gt;How I diagnosed a misleading Gradle failure, separated a temporary Maven network issue from the real Android packaging problem, and fixed the release APK build with a small Gradle change&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I was building a Flutter release APK on Windows for tester distribution and ran into a confusing sequence of build failures.&lt;/p&gt;

&lt;p&gt;The first error looked like a dependency-resolution problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Could not GET 'https://repo.maven.apache.org/...'
No such host is known (repo.maven.apache.org)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That made it look like the project or Firebase setup was broken.&lt;/p&gt;

&lt;p&gt;After retrying once the network recovered, the real build blocker appeared:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Execution failed for task ':app:extractReleaseNativeSymbolTables'.
Failed to create MD5 hash for file ... libflutter.so.sym.temp-stream ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the kind of issue that wastes time because the first failure distracts you from the second one. The Maven error was temporary. The actual release-build problem was native symbol extraction during Android packaging on Windows.&lt;/p&gt;

&lt;p&gt;This post explains how I diagnosed it and the small fix that got the APK building successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  The goal
&lt;/h2&gt;

&lt;p&gt;The goal was simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;produce a signed release APK&lt;/li&gt;
&lt;li&gt;share it directly with testers&lt;/li&gt;
&lt;li&gt;avoid changing unrelated parts of the Android build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project already had release signing configured, so this was not a keystore or package-name problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Separate the temporary network error from the real build issue
&lt;/h2&gt;

&lt;p&gt;The first failure was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Could not resolve all files for configuration ':firebase_core:releaseRuntimeClasspath'
Could not download error_prone_annotations-2.26.0.jar
No such host is known (repo.maven.apache.org)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not a Flutter code issue.&lt;/p&gt;

&lt;p&gt;It means Gradle could not reach Maven Central at that moment. Before changing any project files, I verified whether the host was reachable from the machine.&lt;/p&gt;

&lt;p&gt;Useful checks on Windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;nslookup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;repo.maven.apache.org&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;repo.maven.apache.org&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once Maven Central was reachable again, the dependency download issue disappeared.&lt;/p&gt;

&lt;p&gt;That was important, because fixing the wrong problem would have been wasted effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Retry the build and read the next failure carefully
&lt;/h2&gt;

&lt;p&gt;After the network issue cleared, the build failed again, but with a different error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Execution failed for task ':app:extractReleaseNativeSymbolTables'.
Cannot access output property 'outputDir' of task ':app:extractReleaseNativeSymbolTables'.
Failed to create MD5 hash for file ... libflutter.so.sym.temp-stream ... as it does not exist.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pointed to Android native symbol extraction, not Firebase, not signing, and not dependency resolution.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;By this point, the release APK build was already far enough along to show that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flutter dependencies were resolving&lt;/li&gt;
&lt;li&gt;Firebase packages were not the main blocker&lt;/li&gt;
&lt;li&gt;the Android project structure was basically valid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The failure was happening in the release packaging phase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Identify what was actually safe to disable
&lt;/h2&gt;

&lt;p&gt;For a tester APK, I did not need packaged native debug symbols.&lt;/p&gt;

&lt;p&gt;That made the fix straightforward: disable native debug symbol packaging for the release build.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;android/app/build.gradle.kts&lt;/code&gt;, I updated the &lt;code&gt;release&lt;/code&gt; build type to set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;ndk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;debugSymbolLevel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"none"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The relevant release block became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;buildTypes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;release&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;isMinifyEnabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
        &lt;span class="n"&gt;isShrinkResources&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
        &lt;span class="nf"&gt;ndk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;debugSymbolLevel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"none"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasKeystoreConfig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;signingConfig&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;signingConfigs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;signingConfig&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;signingConfigs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"debug"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was a targeted fix. It did not relax signing. It did not remove shrinking. It only stopped the build from trying to package native debug symbols that were triggering the failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Rebuild the APK
&lt;/h2&gt;

&lt;p&gt;From the Flutter project root, I reran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;flutter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;flutter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;apk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--release&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the &lt;code&gt;debugSymbolLevel = "none"&lt;/code&gt; change, the build completed successfully and produced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build\app\outputs\flutter-apk\app-release.apk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my case, the resulting APK was about &lt;code&gt;64.5 MB&lt;/code&gt;, which was fine for direct tester distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warnings that looked scary but were not the blocker
&lt;/h2&gt;

&lt;p&gt;During the build, there were also warnings like these:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source value 8 is obsolete
target value 8 is obsolete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Font asset "MaterialIcons-Regular.otf" was tree-shaken
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those warnings were not what caused the release build to fail.&lt;/p&gt;

&lt;p&gt;It is worth calling that out because large build logs often mix harmless warnings with the real failure, and it is easy to chase the wrong thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this fix made sense
&lt;/h2&gt;

&lt;p&gt;This was a pragmatic release-build decision.&lt;/p&gt;

&lt;p&gt;For a tester APK, the priority was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;get a stable release artifact&lt;/li&gt;
&lt;li&gt;keep minification and shrinking enabled&lt;/li&gt;
&lt;li&gt;avoid unnecessary Gradle/NDK packaging work that was failing on this environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I were setting up a more advanced crash-symbol workflow later, I could revisit symbol generation in a more controlled release pipeline. But for immediate tester distribution, disabling native debug symbol packaging was the right tradeoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;The key lesson was not just the Gradle fix. It was the debugging sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;verify whether the first error is actually environmental&lt;/li&gt;
&lt;li&gt;retry once the environment is healthy&lt;/li&gt;
&lt;li&gt;fix the first reproducible project-level failure, not the first scary message in the log&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the Maven Central error was temporary network/DNS trouble&lt;/li&gt;
&lt;li&gt;the actual reproducible blocker was &lt;code&gt;extractReleaseNativeSymbolTables&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the successful fix was setting &lt;code&gt;debugSymbolLevel = "none"&lt;/code&gt; in the release build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your Flutter release APK build fails on Windows during native symbol extraction, and you do not need packaged native symbols for that build, this is a clean fix worth trying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build command recap
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;flutter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;flutter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;apk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--release&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gradle fix recap
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;ndk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;debugSymbolLevel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"none"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>flutter</category>
      <category>android</category>
      <category>gradle</category>
    </item>
  </channel>
</rss>
