<?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: Mohammed Chami</title>
    <description>The latest articles on DEV Community by Mohammed Chami (@chami).</description>
    <link>https://dev.to/chami</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%2F805512%2F65ffb890-5242-4fa8-8433-8b34197034d2.jpeg</url>
      <title>DEV Community: Mohammed Chami</title>
      <link>https://dev.to/chami</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chami"/>
    <language>en</language>
    <item>
      <title>How to Authenticate GitHub Using SSH and Push Code Securely</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Fri, 08 Aug 2025 18:01:03 +0000</pubDate>
      <link>https://dev.to/chami/how-to-authenticate-github-using-ssh-and-push-code-securely-3ch8</link>
      <guid>https://dev.to/chami/how-to-authenticate-github-using-ssh-and-push-code-securely-3ch8</guid>
      <description>&lt;p&gt;When working with GitHub, using HTTPS for pushing changes often asks for your username and password or personal access token every time. A better and more secure way is to use &lt;strong&gt;SSH authentication&lt;/strong&gt;. This guide will show you how to generate an SSH key, add it to your GitHub account, and change your Git remote URL from HTTPS to SSH.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Step 1: Check for Existing SSH Keys
&lt;/h2&gt;

&lt;p&gt;Before generating a new SSH key, check if one already exists:&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;ls&lt;/span&gt; &lt;span class="nt"&gt;-al&lt;/span&gt; ~/.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see files like &lt;code&gt;id_rsa&lt;/code&gt; and &lt;code&gt;id_rsa.pub&lt;/code&gt; or &lt;code&gt;id_ed25519&lt;/code&gt; and &lt;code&gt;id_ed25519.pub&lt;/code&gt;, you already have SSH keys. You can skip to Step 3 if you want to use an existing key.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Step 2: Generate a New SSH Key
&lt;/h2&gt;

&lt;p&gt;If no key exists or you want to generate a new one, use the Ed25519 algorithm (recommended) or RSA as a fallback:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Ed25519 (recommended):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For RSA (if Ed25519 isn't supported):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If &lt;code&gt;ssh-keygen&lt;/code&gt; is not found, install OpenSSH:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For Ubuntu/Debian&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;openssh-client

&lt;span class="c"&gt;# For Arch-based distros (e.g., EndeavourOS)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; openssh

&lt;span class="c"&gt;# For CentOS/RHEL/Fedora&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;openssh-clients
&lt;span class="c"&gt;# or for older versions: sudo yum install openssh-clients&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When prompted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;Enter&lt;/code&gt; to accept the default location (&lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt; or &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Optionally enter a secure passphrase for extra protection&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📋 Step 3: Add the SSH Key to the SSH Agent
&lt;/h2&gt;

&lt;p&gt;Start the ssh-agent in the background:&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;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-c&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; // &lt;span class="k"&gt;for &lt;/span&gt;fish

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

&lt;/div&gt;



&lt;p&gt;Then add your SSH private key to the agent:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Ed25519:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For RSA:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔑 Step 4: Add the Public Key to GitHub
&lt;/h2&gt;

&lt;p&gt;Copy your public key to the clipboard:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Ed25519:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For RSA:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add to GitHub:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;GitHub.com&lt;/strong&gt; → Click your profile picture → &lt;strong&gt;Settings&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In the sidebar, click &lt;strong&gt;SSH and GPG keys&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;New SSH key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In the "Title" field, add a descriptive label (e.g., "My Linux Dev Machine")&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Authentication Key&lt;/strong&gt; as the key type&lt;/li&gt;
&lt;li&gt;Paste your public key into the "Key" field&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add SSH key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;If prompted, confirm access to your GitHub account&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🧪 Step 5: Test Your SSH Connection
&lt;/h2&gt;

&lt;p&gt;Verify that your SSH key is working correctly:&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;span class="nt"&gt;-T&lt;/span&gt; git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Write Yes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected successful output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi your_username! You've successfully authenticated, but GitHub does not provide shell access.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Troubleshooting common issues:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you get a "Permission denied" error, double-check that your key was added correctly to GitHub&lt;/li&gt;
&lt;li&gt;If you get a "Host key verification failed" error, run: &lt;code&gt;ssh-keyscan github.com &amp;gt;&amp;gt; ~/.ssh/known_hosts&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔁 Step 6: Change Git Remote from HTTPS to SSH
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Check your current remote URL:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If it shows HTTPS format:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;origin  https://github.com/your_username/your_repo.git (fetch)
origin  https://github.com/your_username/your_repo.git (push)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Change it to SSH:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote set-url origin git@github.com:your_username/your_repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify the change:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Should now show SSH format:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;origin  git@github.com:your_username/your_repo.git (fetch)
origin  git@github.com:your_username/your_repo.git (push)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For multiple remotes:&lt;/strong&gt;&lt;br&gt;
If you have multiple remotes, you can change them individually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote set-url upstream git@github.com:original_owner/original_repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Step 7: Push Your Project
&lt;/h2&gt;

&lt;p&gt;Now you can push your project securely over SSH:&lt;br&gt;
&lt;/p&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;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit"&lt;/span&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;You won't be asked for a username or password again (unless you set a passphrase for your SSH key).&lt;/p&gt;

&lt;h2&gt;
  
  
  🔒 Security Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use a strong passphrase&lt;/strong&gt; for your SSH key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep your private key secure&lt;/strong&gt; - never share it or commit it to a repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regularly rotate your SSH keys&lt;/strong&gt; (recommended every 1-2 years)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use different SSH keys&lt;/strong&gt; for different services or environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable two-factor authentication&lt;/strong&gt; on your GitHub account for additional security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good Luck&lt;/p&gt;

</description>
      <category>github</category>
      <category>beginners</category>
      <category>linux</category>
      <category>coding</category>
    </item>
    <item>
      <title>How to Check Disk Space in Linux (Terminal &amp; GUI Methods)</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Thu, 24 Jul 2025 21:50:24 +0000</pubDate>
      <link>https://dev.to/chami/how-to-check-disk-space-in-linux-terminal-gui-methods-4apa</link>
      <guid>https://dev.to/chami/how-to-check-disk-space-in-linux-terminal-gui-methods-4apa</guid>
      <description>&lt;p&gt;Managing disk space is essential for keeping your Linux system running smoothly. Whether you prefer the command line or graphical tools, here’s a straightforward guide to checking your free and used storage.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. Quick Terminal Commands&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Check Total Disk Usage (&lt;code&gt;df&lt;/code&gt;)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The simplest way to see disk space across all partitions:&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;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-h&lt;/code&gt;&lt;/strong&gt; → Shows sizes in &lt;strong&gt;GB/MB&lt;/strong&gt; (human-readable).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key columns:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Avail&lt;/code&gt;&lt;/strong&gt; → Free space.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Use%&lt;/code&gt;&lt;/strong&gt; → Percentage used.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p3  200G   50G  150G  25% /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Check Folder Sizes (&lt;code&gt;du&lt;/code&gt;)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To see how much space a specific folder (like &lt;code&gt;/home&lt;/code&gt;) is using:&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;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; ~/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-s&lt;/code&gt;&lt;/strong&gt; → Summary (total size).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-h&lt;/code&gt;&lt;/strong&gt; → Human-readable format.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Interactive Disk Usage Analyzer (&lt;code&gt;ncdu&lt;/code&gt;)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For a more detailed breakdown, install &lt;code&gt;ncdu&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; ncdu
ncdu /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Navigate&lt;/strong&gt; with arrow keys.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sort&lt;/strong&gt; by size (press &lt;strong&gt;&lt;code&gt;n&lt;/code&gt;&lt;/strong&gt; for name, &lt;strong&gt;&lt;code&gt;s&lt;/code&gt;&lt;/strong&gt; for size).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete&lt;/strong&gt; files directly (press &lt;strong&gt;&lt;code&gt;d&lt;/code&gt;&lt;/strong&gt;).
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Graphical Tools (For Desktop Users)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GNOME Disks (Default in GNOME)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;"Disks"&lt;/strong&gt; from the app menu.
&lt;/li&gt;
&lt;li&gt;Select your disk → View partition usage in the graph.
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;KDE Partition Manager (For KDE Plasma)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install it:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; partitionmanager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Partition Manager&lt;/strong&gt; → Check disk space visually.
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;File Manager (Thunar/Dolphin/Nautilus)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open your file manager (e.g., &lt;strong&gt;Thunar&lt;/strong&gt; in Xfce).
&lt;/li&gt;
&lt;li&gt;Right-click a drive → &lt;strong&gt;Properties&lt;/strong&gt; → See &lt;strong&gt;free space&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. Advanced: Finding Large Files&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To locate large files (&amp;gt;100MB) in your home directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find ~/ &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-size&lt;/span&gt; +100M &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-type f&lt;/code&gt;&lt;/strong&gt; → Files only (excludes folders).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-size +100M&lt;/code&gt;&lt;/strong&gt; → Filters files larger than 100MB.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Summary: Which Method Should You Use?&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Recommended Tool&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Command&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Quick overview of all disks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;df -h&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;df -h&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check a folder’s size&lt;/td&gt;
&lt;td&gt;&lt;code&gt;du&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;du -sh ~/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interactive disk analysis&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ncdu&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ncdu /&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GUI (GNOME)&lt;/td&gt;
&lt;td&gt;Disks app&lt;/td&gt;
&lt;td&gt;Open from Applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GUI (KDE)&lt;/td&gt;
&lt;td&gt;Partition Manager&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo pacman -S partitionmanager&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Find large files&lt;/td&gt;
&lt;td&gt;&lt;code&gt;find&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;find ~/ -size +100M&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;thank you :&amp;gt;|&lt;/p&gt;

</description>
      <category>linux</category>
      <category>archlinux</category>
      <category>ubuntu</category>
      <category>kde</category>
    </item>
    <item>
      <title>Understanding Rendering in Programming: From Code to Pixels</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Tue, 08 Jul 2025 13:07:49 +0000</pubDate>
      <link>https://dev.to/chami/understanding-rendering-in-programming-from-code-to-pixels-358h</link>
      <guid>https://dev.to/chami/understanding-rendering-in-programming-from-code-to-pixels-358h</guid>
      <description>&lt;p&gt;I remember the first time someone asked me to explain what "rendering" means in programming. I fumbled through a technical explanation about DOM trees and paint operations, and watched their eyes glaze over completely. That's when I realized I didn't really understand it myself - I just knew the buzzwords.&lt;/p&gt;

&lt;p&gt;After years of debugging sluggish animations and optimizing app performance, I've learned that rendering is actually a pretty straightforward concept once you strip away the jargon. Let me explain it the way I wish someone had explained it to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Rendering, Really?
&lt;/h2&gt;

&lt;p&gt;At its core, rendering is just the process of turning your code into something visual on a screen. Think of it like a translator who takes your written instructions and turns them into pictures that users can actually see and interact with.&lt;/p&gt;

&lt;p&gt;When you write HTML like &lt;code&gt;&amp;lt;div style="color: red;"&amp;gt;Hello World!&amp;lt;/div&amp;gt;&lt;/code&gt;, something has to figure out how to display red text on the screen. That "something" is the rendering engine, and the process of making it happen is rendering.&lt;/p&gt;

&lt;p&gt;It's essentially the bridge between the abstract world of code and the concrete world of pixels on a display.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Different Systems Handle Rendering
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Web Browsers and WebViews
&lt;/h3&gt;

&lt;p&gt;When you load a webpage, your browser goes through what feels like a carefully choreographed dance:&lt;/p&gt;

&lt;p&gt;First, it reads through your HTML and CSS to understand what you want to display. Then it calculates where everything should go on the page - this is called layout or reflow. Finally, it actually draws the pixels on your screen - the painting phase.&lt;/p&gt;

&lt;p&gt;I've spent countless hours optimizing this process. The thing that surprised me most was learning that browsers don't just render once and call it done. Every time you scroll, resize the window, or interact with elements, parts of this process happen again. It's like having an artist constantly redrawing parts of a painting as you watch.&lt;/p&gt;

&lt;p&gt;WebViews in hybrid apps work exactly the same way - they're essentially browsers without the address bar, running inside your mobile app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Native Mobile Apps
&lt;/h3&gt;

&lt;p&gt;Native apps take a more direct approach. When you build with Swift on iOS or Kotlin on Android, the operating system handles rendering using its own optimized systems. There's no HTML to parse or CSS to interpret - your code talks directly to the platform's UI framework.&lt;/p&gt;

&lt;p&gt;This is why native apps often feel snappier than web-based alternatives. There are fewer translation layers between your code and the final pixels.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross-Platform Frameworks
&lt;/h3&gt;

&lt;p&gt;Cross-platform tools like React Native and Avalonia UI have gotten creative with rendering. React Native translates your JavaScript components into native UI elements, so you get the performance benefits of native rendering while writing in familiar web technologies.&lt;/p&gt;

&lt;p&gt;Avalonia UI takes a completely different approach. Instead of using platform UI components, it brings its own rendering engine (Skia) and draws everything from scratch. It's like bringing your own paintbrush to an art class instead of using the ones provided.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Performance Connection
&lt;/h2&gt;

&lt;p&gt;Here's where rendering becomes crucial for developers: poor rendering performance is often the culprit behind sluggish apps.&lt;/p&gt;

&lt;p&gt;I learned this lesson while working on a data-heavy dashboard that worked fine with small datasets but became unusable with real-world data. The problem wasn't the data processing - it was that we were forcing the browser to re-render thousands of DOM elements every time something changed.&lt;/p&gt;

&lt;p&gt;The solution was understanding how rendering works and optimizing accordingly. We implemented virtual scrolling, batched updates, and learned to work with the browser's rendering pipeline instead of against it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Rendering Scenarios
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Server-Side Rendering (SSR)&lt;/strong&gt; happens when your HTML is generated on the server before being sent to the browser. This is great for initial page loads and SEO, but it means your server is doing the heavy lifting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client-Side Rendering (CSR)&lt;/strong&gt; is when your JavaScript generates the HTML in the browser. This enables more interactive experiences but can make initial page loads slower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPU Rendering&lt;/strong&gt; comes into play for games and graphics-intensive applications. Instead of using your computer's main processor, rendering work gets handed off to the graphics card, which is optimized for this kind of parallel processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Developers
&lt;/h2&gt;

&lt;p&gt;Understanding rendering helps you make better architectural decisions. When you know that every DOM manipulation potentially triggers a re-render, you start thinking differently about how to structure your updates.&lt;/p&gt;

&lt;p&gt;It also helps with debugging. When users report that your app feels "janky" or slow, rendering performance is often the first place to look. Modern browser dev tools make it easy to profile rendering performance and identify bottlenecks.&lt;/p&gt;

&lt;p&gt;For mobile development, rendering efficiency directly impacts battery life. Apps that cause excessive re-renders or use inefficient rendering techniques will drain batteries faster - something users definitely notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Practical Takeaway
&lt;/h2&gt;

&lt;p&gt;Rendering is everywhere in modern software development. Whether you're building a simple website, a complex mobile app, or a real-time game, something somewhere is taking your code and turning it into pixels on a screen.&lt;/p&gt;

&lt;p&gt;The key insight is that rendering isn't just a technical detail - it's a fundamental part of user experience. Smooth, efficient rendering makes apps feel responsive and professional. Poor rendering makes even the best-designed applications feel broken.&lt;/p&gt;

&lt;p&gt;Understanding the basics of how rendering works in your chosen platform will make you a better developer. You'll write more efficient code, debug performance issues faster, and build applications that feel great to use.&lt;/p&gt;

&lt;p&gt;Next time you're working on a project, take a moment to think about the rendering pipeline. What's happening between your code and the user's screen? Understanding that journey is the difference between code that works and code that works well.&lt;/p&gt;

</description>
      <category>graphics</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Understanding Hybrid Apps and WebViews: What Every Developer Should Know</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Mon, 07 Jul 2025 16:22:59 +0000</pubDate>
      <link>https://dev.to/chami/understanding-hybrid-apps-and-webviews-what-every-developer-should-know-48gf</link>
      <guid>https://dev.to/chami/understanding-hybrid-apps-and-webviews-what-every-developer-should-know-48gf</guid>
      <description>&lt;p&gt;When I first heard about "hybrid apps," I thought it was just marketing speak for "apps that don't work properly on either platform." I was partially right, but also completely wrong. After building several hybrid applications and debugging countless WebView issues, I've learned that hybrid development is both more clever and more limited than I initially understood.&lt;/p&gt;

&lt;p&gt;Let me break down what's actually happening under the hood when you build a hybrid app, and why understanding WebViews is crucial for any mobile developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Hybrid Apps Really?
&lt;/h2&gt;

&lt;p&gt;The term "hybrid app" sounds fancy, but the concept is straightforward: take a web application you've already built, wrap it in a minimal native app shell, and distribute it through app stores. Think of it as putting your website in a native costume and teaching it to speak to the phone's hardware.&lt;/p&gt;

&lt;p&gt;Here's the basic architecture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqel0asut9a1g8kb2txji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqel0asut9a1g8kb2txji.png" alt="WebView Architecture image" width="664" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The native shell handles the boring stuff—app store distribution, permissions, device integration—while your familiar web technologies handle the user interface and business logic. It's like having a native app that's really good at pretending to be a web browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The WebView: Your App's Secret Browser
&lt;/h2&gt;

&lt;p&gt;Understanding WebViews is crucial because they're the magic ingredient that makes hybrid apps possible. A WebView is essentially a browser engine stripped of everything that makes it obviously a browser—no address bar, no tabs, no bookmarks—just the rendering engine.&lt;/p&gt;

&lt;p&gt;When users interact with your hybrid app, they're actually interacting with a web page that's been embedded inside a native application. Every tap, scroll, and animation is being processed by the same engine that renders websites, just packaged differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform Differences Matter
&lt;/h3&gt;

&lt;p&gt;Here's where things get interesting: WebViews aren't created equal across platforms. On Android, you're using Chromium's Blink engine (the same one that powers Chrome). On iOS, you're using WebKit (Safari's engine). This means your app might behave differently on each platform, even though you're using the same code.&lt;/p&gt;

&lt;p&gt;I learned this the hard way when an animation that worked perfectly on iOS devices stuttered terribly on Android. The CSS transforms I was using hit a performance bottleneck in the Android WebView that didn't exist in Safari's engine. Same code, different results.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Performance Reality Check
&lt;/h2&gt;

&lt;p&gt;Let's be honest about performance: hybrid apps are slower than native apps for most interactions. There's no getting around this fundamental limitation. When a user taps a button in your hybrid app, here's what actually happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The native touch event gets captured&lt;/li&gt;
&lt;li&gt;It's passed to the WebView&lt;/li&gt;
&lt;li&gt;The WebView processes it through its JavaScript engine&lt;/li&gt;
&lt;li&gt;Your app logic executes&lt;/li&gt;
&lt;li&gt;The DOM updates&lt;/li&gt;
&lt;li&gt;The WebView re-renders the affected elements&lt;/li&gt;
&lt;li&gt;The result appears on screen&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Compare this to a native app where the touch event goes directly to the native UI component and updates immediately. The difference is measurable, and for complex interactions, it's noticeable.&lt;/p&gt;

&lt;p&gt;However, for many types of apps—forms, dashboards, content readers—this performance difference is negligible. Users don't notice the extra milliseconds unless you're doing something intensive like real-time animations or handling large datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Hybrid Apps Make Sense
&lt;/h2&gt;

&lt;p&gt;Despite the performance limitations, hybrid apps have carved out a legitimate niche. They're particularly effective for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content-heavy applications&lt;/strong&gt; where users are primarily reading, browsing, or filling out forms. News apps, documentation viewers, and survey tools work great as hybrid apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rapid prototyping&lt;/strong&gt; when you need to test an idea across platforms quickly. Being able to deploy the same codebase to iOS, Android, and the web simultaneously is incredibly valuable during the validation phase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams with strong web expertise&lt;/strong&gt; but limited native mobile experience. If your developers are experts in React or Vue but have never touched Swift or Kotlin, hybrid development can be a practical bridge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apps that need frequent updates&lt;/strong&gt; to content or business logic. Web technologies make it easier to push updates without going through app store review processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Development Experience
&lt;/h2&gt;

&lt;p&gt;Building hybrid apps feels familiar if you're coming from web development, but there are mobile-specific considerations you can't ignore. You're still dealing with touch interfaces, different screen sizes, and platform-specific behaviors, even though you're using web technologies.&lt;/p&gt;

&lt;p&gt;The debugging experience is more complex than pure web development. When something goes wrong, you might need to debug through your JavaScript code, the plugin bridge, and potentially native platform code. Modern tools like Chrome DevTools integration with WebViews have made this much more manageable, but it's still more layers than a typical web app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Plugin Ecosystem
&lt;/h2&gt;

&lt;p&gt;One of hybrid development's biggest advantages is the plugin ecosystem. Need to access the camera? There's a plugin for that. Want to use push notifications? Plugin. GPS, accelerometer, contacts, file system—plugins handle the bridge between your JavaScript code and native device capabilities.&lt;/p&gt;

&lt;p&gt;Frameworks like Cordova and Capacitor have mature plugin ecosystems that cover most common use cases. When you need something custom, you can write your own plugins, though this requires some native development knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Pitfalls I've Encountered
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Assuming web performance translates to mobile performance.&lt;/strong&gt; Animations that run smoothly in desktop browsers might stutter in mobile WebViews. Always test on actual devices, not just simulators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring platform-specific UI conventions.&lt;/strong&gt; Just because you can make your app look identical on iOS and Android doesn't mean you should. Users have platform-specific expectations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over-engineering the plugin bridge.&lt;/strong&gt; It's tempting to create elaborate communication systems between JavaScript and native code, but simpler approaches usually work better and are easier to debug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forgetting about WebView security.&lt;/strong&gt; WebViews can be vulnerable to the same security issues as web browsers. Always sanitize user input and be careful about what external content you load.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of Hybrid Development
&lt;/h2&gt;

&lt;p&gt;The line between hybrid and other development approaches continues to blur. Progressive Web Apps are becoming more capable, while frameworks like Ionic have evolved to use modern web technologies like Web Components. Meanwhile, the WebView engines themselves are getting faster and more capable.&lt;/p&gt;

&lt;p&gt;Apple's recent improvements to iOS WebViews and Android's continued investment in Chromium mean that the performance gap between hybrid and native apps is narrowing for many use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the Right Choice
&lt;/h2&gt;

&lt;p&gt;Hybrid app development isn't the right choice for every project, but it's not the wrong choice for every project either. The key is understanding your specific constraints and requirements.&lt;/p&gt;

&lt;p&gt;If you're building a game, a photo editor, or anything that requires intensive real-time interactions, native development is probably worth the extra investment. If you're building a business app, a content reader, or a tool that's primarily about displaying and collecting information, hybrid development can be both practical and cost-effective.&lt;/p&gt;

&lt;p&gt;The most successful hybrid apps I've worked on were built by teams that understood both the capabilities and limitations of the approach. They designed their user experiences around what WebViews do well, rather than fighting against what they don't do well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Hybrid app development gets a bad reputation because it's often chosen for the wrong reasons—usually as a cost-cutting measure rather than a strategic technical decision. When approached thoughtfully, with realistic expectations about performance and user experience, hybrid apps can be a powerful tool for reaching users across platforms efficiently.&lt;/p&gt;

&lt;p&gt;The key is being honest about trade-offs. You're trading some performance and platform-specific polish for development efficiency and code reuse. For many projects, that's a worthwhile exchange.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>100daysofcode</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Understanding App Development Approaches: A Developer's Guide to Native, Cross-Platform, Hybrid, and PWA</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Mon, 07 Jul 2025 16:00:34 +0000</pubDate>
      <link>https://dev.to/chami/understanding-app-development-approaches-a-developers-guide-to-native-cross-platform-hybrid-15l6</link>
      <guid>https://dev.to/chami/understanding-app-development-approaches-a-developers-guide-to-native-cross-platform-hybrid-15l6</guid>
      <description>&lt;p&gt;When I first started developing applications, the sheer number of development approaches available was overwhelming. Should I build native apps for each platform? Try a cross-platform framework? Go with a hybrid solution? Or maybe consider a Progressive Web App? Each approach has its place, and understanding their strengths and weaknesses can save you months of development time and thousands of dollars in project costs.&lt;/p&gt;

&lt;p&gt;After working with all these approaches across various projects, I've learned that the "best" choice depends entirely on your specific requirements, timeline, and budget. Let me break down each approach and help you understand when to use which.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native App Development
&lt;/h2&gt;

&lt;p&gt;Native development means building applications specifically for one platform using that platform's official tools and programming languages. For iOS, you'd use Swift or Objective-C with Xcode. For Android, you'd use Kotlin or Java with Android Studio.&lt;/p&gt;

&lt;p&gt;Think of native development as speaking the platform's native language fluently. When you build natively, you're working directly with the operating system's APIs and frameworks, which gives you unparalleled access to device capabilities and performance optimization.&lt;/p&gt;

&lt;h3&gt;
  
  
  When Native Makes Sense
&lt;/h3&gt;

&lt;p&gt;I typically recommend native development for apps that need to squeeze every bit of performance from the device. Gaming apps, augmented reality experiences, and applications with complex animations benefit enormously from native development. If your app needs to access specialized hardware features or integrate deeply with the operating system, native is often your only viable option.&lt;/p&gt;

&lt;p&gt;The user experience also tends to be superior with native apps. They follow platform-specific design guidelines naturally, making them feel "at home" on each device. Users can immediately tell when an app was built natively versus when it's trying to mimic native behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Native Trade-offs
&lt;/h3&gt;

&lt;p&gt;The biggest drawback is obvious: you need separate codebases for each platform. This means hiring developers with different skill sets, maintaining multiple projects, and essentially building your app twice (or more if you're targeting additional platforms). The development timeline extends significantly, and costs can quickly spiral.&lt;/p&gt;

&lt;p&gt;However, for companies with the resources and long-term vision, native development often pays off in user satisfaction and app performance metrics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-Platform App Development
&lt;/h2&gt;

&lt;p&gt;Cross-platform frameworks like React Native, Flutter, and Avalonia promise something that sounds almost too good to be true: write your app once, deploy it everywhere. After shipping apps with each of these frameworks, I can tell you they largely deliver on this promise, but the devil is in the details.&lt;/p&gt;

&lt;p&gt;The fundamental insight behind cross-platform development is that you can share business logic and UI structure between platforms while still producing apps that feel genuinely native. It's like having a translator who doesn't just convert words but understands the cultural context behind them.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the Magic Actually Works
&lt;/h3&gt;

&lt;p&gt;Different frameworks take dramatically different approaches to solving the cross-platform puzzle, and understanding these differences is crucial for choosing the right tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React Native's Bridge Strategy:&lt;/strong&gt;&lt;br&gt;
React Native acts as a diplomatic bridge between JavaScript and native code. When you write a &lt;code&gt;&amp;lt;View&amp;gt;&lt;/code&gt; component, React Native doesn't render it as HTML - it maps directly to a &lt;code&gt;UIView&lt;/code&gt; on iOS or a &lt;code&gt;ViewGroup&lt;/code&gt; on Android. Your JavaScript business logic runs in one thread while the native UI renders in another, with messages passing back and forth through what's called "the bridge."&lt;/p&gt;

&lt;p&gt;This architecture means your app is genuinely using native components, not simulating them. When users scroll through a list, they're interacting with actual native scroll views, complete with platform-specific physics and behaviors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flutter's Compiled Approach:&lt;/strong&gt;&lt;br&gt;
Flutter takes a completely different philosophy. Instead of bridging to native components, it brings its own rendering engine (Skia) and draws everything from scratch. Think of it as a game engine for UI - it controls every pixel on the screen.&lt;/p&gt;

&lt;p&gt;Your Dart code compiles directly to native ARM assembly, eliminating the JavaScript bridge entirely. When Flutter renders a button, it's not using iOS's &lt;code&gt;UIButton&lt;/code&gt; or Android's &lt;code&gt;Button&lt;/code&gt; - it's drawing what looks like those buttons using its own graphics primitives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avalonia's Custom Rendering Approach:&lt;/strong&gt;&lt;br&gt;
Avalonia takes yet another path entirely. Like Flutter, it uses its own rendering engine (Skia) to draw everything from scratch, but it's built for the .NET ecosystem using C# and XAML. Think of it as bringing WPF's development model to every platform - you get the same UI framework whether you're targeting Windows, macOS, Linux, or even mobile platforms.&lt;/p&gt;

&lt;p&gt;Unlike React Native's component mapping or Flutter's widget system, Avalonia renders using familiar .NET patterns. Your XAML layouts and C# code-behind work exactly the same way across all platforms because Avalonia is literally drawing the same pixels everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Performance Reality
&lt;/h3&gt;

&lt;p&gt;After benchmarking these frameworks across various scenarios, here's what I've observed:&lt;/p&gt;

&lt;p&gt;For typical business apps - forms, lists, navigation - the performance difference between cross-platform and native is negligible. Users simply can't tell the difference. Where you start to notice gaps is in edge cases: complex animations with hundreds of elements, real-time graphics processing, or apps that push the boundaries of what mobile hardware can handle.&lt;/p&gt;

&lt;p&gt;React Native's bridge introduces some overhead, but Facebook's engineers have optimized it extensively. The bigger performance consideration is actually JavaScript execution speed, not bridge latency. Modern JavaScript engines are remarkably fast, and React Native includes optimizations like native animation drivers that bypass the bridge entirely for smooth animations.&lt;/p&gt;

&lt;p&gt;Flutter's compiled approach often delivers performance that's indistinguishable from native. Since everything compiles to native code and the rendering engine is highly optimized, you're essentially running a native app that happens to be written in Dart instead of Swift or Kotlin.&lt;/p&gt;

&lt;p&gt;Avalonia's performance sits somewhere between React Native and Flutter. Since it uses Skia for GPU-accelerated rendering like Flutter, you get smooth animations and pixel-perfect control. However, running on the .NET runtime adds some overhead compared to Flutter's ahead-of-time compilation. In practice, this difference is rarely noticeable for typical business applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Developer Experience Difference
&lt;/h3&gt;

&lt;p&gt;Building cross-platform apps requires a different mindset than web development. You're not just making a website responsive - you're thinking about platform conventions, navigation patterns, and user expectations that vary between iOS and Android.&lt;/p&gt;

&lt;p&gt;The debugging experience is more complex too. When something goes wrong, you might need to trace through your application code, the framework's bridge layer, and potentially native platform code. Modern developer tools have improved significantly, but there's still more complexity than pure native development.&lt;/p&gt;

&lt;p&gt;However, the productivity gains are substantial. Being able to implement a feature once and see it work across platforms is genuinely satisfying. The iteration speed during development is typically faster than native development because you're not context-switching between different IDEs, languages, and toolchains.&lt;/p&gt;

&lt;h3&gt;
  
  
  When Cross-Platform Shines
&lt;/h3&gt;

&lt;p&gt;I recommend cross-platform development when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have a clear product-market fit and need to reach users quickly across platforms&lt;/li&gt;
&lt;li&gt;Your team has stronger web/JavaScript skills than native mobile experience&lt;/li&gt;
&lt;li&gt;You're building a content-heavy app rather than a games or graphics-intensive application&lt;/li&gt;
&lt;li&gt;You want to maintain feature parity across platforms without doubling development effort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The approach works particularly well for apps that follow standard mobile patterns: tab navigation, lists, forms, and basic animations. If your app could be described as "standard mobile app functionality with custom business logic," cross-platform is probably ideal.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Limitations to Consider
&lt;/h3&gt;

&lt;p&gt;Cross-platform development becomes challenging when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need cutting-edge platform features that aren't yet supported by the framework&lt;/li&gt;
&lt;li&gt;Your app requires extensive platform-specific UI customization&lt;/li&gt;
&lt;li&gt;You're building games or graphics-intensive applications&lt;/li&gt;
&lt;li&gt;You need to integrate with complex native libraries or SDKs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most common frustration I encounter is when designers create mockups that look identical across platforms but violate platform-specific conventions. iOS users expect certain navigation patterns, Android users expect others, and sometimes "write once, run everywhere" conflicts with "design for the platform."&lt;/p&gt;

&lt;h3&gt;
  
  
  The Ecosystem Maturity
&lt;/h3&gt;

&lt;p&gt;The cross-platform ecosystem has matured significantly. React Native powers apps like Facebook, Instagram, and Airbnb. Flutter is used by Google Pay, BMW, and Alibaba. Avalonia is gaining traction in enterprise applications where teams want to leverage existing .NET expertise across desktop and mobile platforms. These aren't toy frameworks - they're production-ready tools used by companies with millions of users.&lt;/p&gt;

&lt;p&gt;The third-party library ecosystem is robust, though not as comprehensive as native development. Most common functionality is available through community packages, but occasionally you'll need to write native bridge code for specialized requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Making the Decision
&lt;/h3&gt;

&lt;p&gt;Cross-platform development has evolved from a compromise to a legitimate first choice for many projects. The performance trade-offs are minimal for most applications, the development efficiency gains are substantial, and the ecosystem is mature enough to support complex applications.&lt;/p&gt;

&lt;p&gt;The key is being honest about your specific requirements. If you're building a straightforward business app and want to reach market quickly, cross-platform is often the optimal choice. If you're building the next breakthrough mobile game or need to push the boundaries of what mobile hardware can do, native development might be worth the additional investment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hybrid App Development
&lt;/h2&gt;

&lt;p&gt;Hybrid development represents the web developer's entry point into mobile app development. Using frameworks like Ionic, Cordova, or Capacitor, you build your app using familiar web technologies (HTML, CSS, JavaScript) and then wrap it in a native container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding WebView
&lt;/h3&gt;

&lt;p&gt;Here's where technical understanding becomes crucial. Hybrid apps run inside what's called a WebView - essentially a browser window embedded within a native app shell. When users interact with your hybrid app, they're actually interacting with a web page that's been packaged to look and feel like a native app.&lt;/p&gt;

&lt;p&gt;This WebView approach has both advantages and limitations. On the positive side, you can leverage your existing web development skills and build for multiple platforms simultaneously. The challenge is that you're fundamentally limited by the performance characteristics of the WebView itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rendering Pipeline
&lt;/h3&gt;

&lt;p&gt;When a user taps a button in your hybrid app, that interaction must travel through several layers: the native touch event gets passed to the WebView, which then processes it through the web rendering engine, executes your JavaScript, potentially updates the DOM, and finally renders the result back to the screen.&lt;/p&gt;

&lt;p&gt;This multi-step process introduces latency that native apps don't experience. For simple interactions, this delay is negligible. For complex interfaces or animations, it becomes noticeable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Progressive Web Apps (PWA)
&lt;/h2&gt;

&lt;p&gt;PWAs represent an evolution of web applications that blurs the line between web and native experiences. They're built with standard web technologies but include features traditionally associated with native apps: offline functionality, push notifications, and the ability to be installed on the home screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Service Workers: The Game Changer
&lt;/h3&gt;

&lt;p&gt;The magic of PWAs comes from Service Workers - JavaScript files that run in the background, separate from your main web page. Think of them as a proxy server that sits between your web app and the network. They can intercept network requests, serve cached content when offline, and handle background tasks like push notifications.&lt;/p&gt;

&lt;p&gt;This architecture enables PWAs to work offline in ways that traditional web apps cannot. When you visit a PWA for the first time, the Service Worker downloads and caches essential resources. On subsequent visits, even without internet connectivity, the app can still function using cached data.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Installation Experience
&lt;/h3&gt;

&lt;p&gt;Modern browsers allow PWAs to be "installed" directly from the browser without going through an app store. This creates an interesting distribution model where users can discover your app through web searches and install it immediately, bypassing the traditional app store approval process.&lt;/p&gt;

&lt;p&gt;However, this also means PWAs miss out on the discoverability benefits of app stores. Users don't typically browse for PWAs the way they browse for native apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Considerations
&lt;/h2&gt;

&lt;p&gt;Understanding performance differences requires looking at how each approach handles the rendering pipeline - the process of turning your code into pixels on the screen.&lt;/p&gt;

&lt;p&gt;Native apps have the most direct path to the screen. When you update a native UI element, it communicates directly with the platform's rendering system. Cross-platform frameworks add a translation layer but often compile to native code, minimizing overhead.&lt;/p&gt;

&lt;p&gt;Hybrid apps face the biggest performance challenge because they must render through the WebView's HTML/CSS engine, which then gets composited with native UI elements. PWAs run entirely within the browser's rendering engine, which can be highly optimized but may not match native performance for complex interactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the Right Choice
&lt;/h2&gt;

&lt;p&gt;The decision usually comes down to a few key factors:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance requirements&lt;/strong&gt;: If your app needs to handle complex animations, real-time interactions, or intensive computational tasks, native development typically provides the best results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development timeline&lt;/strong&gt;: Cross-platform and hybrid approaches can significantly reduce development time, especially if you have web development expertise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Budget constraints&lt;/strong&gt;: PWAs offer the lowest development costs, while native development typically requires the largest investment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Target audience&lt;/strong&gt;: Consider how your users will discover and interact with your app. PWAs excel at immediate accessibility, while native apps provide the best integration with device ecosystems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long-term maintenance&lt;/strong&gt;: Native apps require maintaining separate codebases, while cross-platform solutions let you fix bugs and add features once for all platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future Landscape
&lt;/h2&gt;

&lt;p&gt;The boundaries between these approaches continue to blur. Apple's recent changes to iOS make PWAs more capable, while frameworks like Flutter are pushing cross-platform performance closer to native levels. Meanwhile, technologies like WebAssembly are improving web app performance dramatically.&lt;/p&gt;

&lt;p&gt;Rather than viewing these as competing approaches, I've found it helpful to think of them as tools in a toolkit. The best developers understand the strengths and limitations of each approach and can recommend the right solution for each specific project.&lt;/p&gt;

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

&lt;p&gt;There's no universally "correct" choice among these development approaches. I've seen successful apps built with each method, and I've also seen projects fail because they chose the wrong approach for their specific requirements.&lt;/p&gt;

&lt;p&gt;The key is understanding your priorities: performance vs. development speed, native integration vs. cross-platform reach, app store distribution vs. web accessibility. Once you're clear on these priorities, the right approach usually becomes obvious.&lt;/p&gt;

&lt;p&gt;Remember that you're not locked into your initial choice forever. Many successful apps have evolved from one approach to another as their requirements and resources changed. The important thing is making an informed decision based on your current needs and constraints.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>watercooler</category>
      <category>coding</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Checking Your .NET Installation (SDK and RunTime): A Quick Guide</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Mon, 07 Jul 2025 14:38:56 +0000</pubDate>
      <link>https://dev.to/chami/checking-your-net-installation-sdk-and-runtime-a-quick-guide-3kie</link>
      <guid>https://dev.to/chami/checking-your-net-installation-sdk-and-runtime-a-quick-guide-3kie</guid>
      <description>&lt;p&gt;Whether you're just starting with .NET development or troubleshooting an existing project, one of the first things you'll need to know is what versions of the .NET SDK and runtime are installed on your machine. This information becomes crucial when dealing with compatibility issues, setting up new projects, or collaborating with team members who might be using different versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Quick Commands You Need
&lt;/h2&gt;

&lt;p&gt;Fortunately, Microsoft made this process straightforward with a few simple commands that work across Windows, macOS, and Linux.&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking Installed SDKs
&lt;/h3&gt;

&lt;p&gt;To see all .NET SDKs installed on your system, open your terminal or command prompt and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nt"&gt;--list-sdks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will show you 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;6.0.405 [C:\Program Files\dotnet\sdk]
7.0.102 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each line shows the SDK version followed by its installation path. The SDK is what you need for developing .NET applications - it includes the compiler, tools, and libraries necessary to build your projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking Installed Runtimes
&lt;/h3&gt;

&lt;p&gt;To see all .NET runtimes on your system, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nt"&gt;--list-runtimes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll get output similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Microsoft.AspNetCore.App 6.0.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 7.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 6.0.13 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The runtime is what's needed to actually run .NET applications. You might notice different types of runtimes listed - these serve different purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft.NETCore.App&lt;/strong&gt;: The base runtime for console and server applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft.AspNetCore.App&lt;/strong&gt;: Additional components for web applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft.WindowsDesktop.App&lt;/strong&gt;: Components for Windows desktop applications (WPF, WinForms)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The All-in-One Command
&lt;/h3&gt;

&lt;p&gt;If you want a comprehensive overview of your .NET installation, there's a single command that provides everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nt"&gt;--info&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command gives you detailed information about your entire .NET environment, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The currently active SDK version&lt;/li&gt;
&lt;li&gt;All installed SDKs and runtimes&lt;/li&gt;
&lt;li&gt;Runtime environment details&lt;/li&gt;
&lt;li&gt;Operating system information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output is quite verbose, but it's incredibly useful when you need to provide environment details for bug reports or when working with support teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Output
&lt;/h2&gt;

&lt;p&gt;When you run these commands, you might see multiple versions installed. This is completely normal and actually beneficial - .NET supports side-by-side installations, meaning you can have multiple versions coexisting without conflicts.&lt;/p&gt;

&lt;p&gt;The .NET CLI will automatically select the appropriate SDK version based on your project's configuration. If you have a &lt;code&gt;global.json&lt;/code&gt; file in your project, it will use the SDK version specified there. Otherwise, it defaults to the latest installed version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Scenarios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Starting a New Project
&lt;/h3&gt;

&lt;p&gt;Before creating a new .NET project, check your available SDKs to ensure you're using the version you want. If you need a specific version for compatibility reasons, you can specify it in a &lt;code&gt;global.json&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  What If Nothing Is Installed?
&lt;/h2&gt;

&lt;p&gt;If you run these commands and get a message like "command not found" or "dotnet is not recognized," it means the .NET CLI isn't installed on your system. You can download it from Microsoft's official .NET website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping Track of Versions
&lt;/h2&gt;

&lt;p&gt;Different projects might target different .NET versions, and that's okay. The beauty of .NET's side-by-side installation model is that you can maintain multiple projects with different framework requirements without conflicts.&lt;/p&gt;

&lt;p&gt;If you find yourself frequently switching between different .NET versions for various projects, consider keeping a simple text file or note with the versions each project requires. This can save time when you return to older projects months later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;These simple commands are among the most useful in any .NET developer's toolkit. Whether you're debugging a mysterious build issue, setting up a new development environment, or just satisfying your curiosity about what's installed on your machine, these commands will quickly give you the information you need.&lt;/p&gt;

&lt;p&gt;Remember that having multiple versions installed is normal and often necessary, especially if you're maintaining applications that target different .NET versions. The key is understanding what you have available and how to use that information effectively in your development workflow.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>dotnetcore</category>
      <category>linux</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Connecting to Your Android Device via SSH from Linux: A Complete Termux Guide</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Mon, 07 Jul 2025 14:11:02 +0000</pubDate>
      <link>https://dev.to/chami/connecting-to-your-android-device-via-ssh-from-linux-a-complete-termux-guide-4lhd</link>
      <guid>https://dev.to/chami/connecting-to-your-android-device-via-ssh-from-linux-a-complete-termux-guide-4lhd</guid>
      <description>&lt;p&gt;Ever wanted to access your Android phone's terminal from your Linux desktop? Whether you're transferring files, running commands remotely, or just exploring your device's capabilities, SSH access opens up a world of possibilities. However, getting that initial connection working can be frustrating when you're met with cryptic "Access Denied" errors.&lt;/p&gt;

&lt;p&gt;This guide will walk you through setting up a reliable SSH connection between your Pop!_OS machine and Android device using Termux, troubleshooting common issues, and ensuring secure access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SSH to Android?
&lt;/h2&gt;

&lt;p&gt;SSH access to your Android device transforms how you interact with it. You can transfer files without cables, run automated scripts, access your phone's filesystem, and even use it as a development environment. It's particularly useful for developers, system administrators, and anyone who prefers command-line efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Termux for SSH Access
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installing and Configuring Termux
&lt;/h3&gt;

&lt;p&gt;Termux stands out as the most capable terminal emulator for Android. Unlike other solutions, it provides a genuine Linux environment with package management and full SSH server capabilities.&lt;/p&gt;

&lt;p&gt;Download Termux from &lt;a href="https://f-droid.org/en/packages/com.termux/" rel="noopener noreferrer"&gt;F-Droid&lt;/a&gt; rather than Google Play. The F-Droid version receives more frequent updates and has fewer restrictions.&lt;/p&gt;

&lt;p&gt;Once installed, open Termux and update the package repositories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkg upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures you have the latest security patches and features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing OpenSSH Server
&lt;/h3&gt;

&lt;p&gt;Install the OpenSSH server package:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Termux's OpenSSH implementation is full-featured and includes all the security features you'd expect from a modern SSH server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Starting the SSH Service
&lt;/h3&gt;

&lt;p&gt;Launch the SSH daemon:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The SSH server will start immediately and begin listening for connections. Unlike traditional Linux systems, Termux doesn't use systemd, so the service won't automatically restart on reboot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding Your Android's Network Address
&lt;/h3&gt;

&lt;p&gt;Determine your Android device's IP address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip addr show wlan0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for the &lt;code&gt;inet&lt;/code&gt; line under the &lt;code&gt;wlan0&lt;/code&gt; interface. You'll see something like &lt;code&gt;192.168.1.155/24&lt;/code&gt; - the IP address is the part before the slash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Termux SSH Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Port Configuration
&lt;/h3&gt;

&lt;p&gt;Here's where many people get stuck: Termux uses port 8022 for SSH, not the standard port 22. This is because Android's security model prevents non-system apps from binding to privileged ports (those below 1024).&lt;/p&gt;

&lt;p&gt;Your SSH command will look like this:&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;span class="nt"&gt;-p&lt;/span&gt; 8022 &lt;span class="o"&gt;[&lt;/span&gt;username]@[ip_address]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Username Discovery
&lt;/h3&gt;

&lt;p&gt;Termux uses Android's internal username system. Find your username by running:&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;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see something like &lt;code&gt;u0_a123&lt;/code&gt; - this is your Android user ID that you'll need for SSH connections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring Authentication
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Password Authentication Challenge
&lt;/h3&gt;

&lt;p&gt;By default, Termux disables password authentication for security reasons. Most SSH "Access Denied" errors stem from this configuration.&lt;/p&gt;

&lt;p&gt;To enable password authentication for testing purposes, first set a password:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Then edit the SSH configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano &lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find the line containing &lt;code&gt;PasswordAuthentication&lt;/code&gt; and change it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;PasswordAuthentication&lt;/span&gt; &lt;span class="err"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the line doesn't exist, add it to the file.&lt;/p&gt;

&lt;p&gt;Restart the SSH service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkill sshd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testing the Connection
&lt;/h3&gt;

&lt;p&gt;Now attempt to connect from your Pop!_OS machine:&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;span class="nt"&gt;-p&lt;/span&gt; 8022 u0_a123@192.168.1.155
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;u0_a123&lt;/code&gt; with your actual username and &lt;code&gt;192.168.1.155&lt;/code&gt; with your Android's IP address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Key-Based Authentication
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Use SSH Keys?
&lt;/h3&gt;

&lt;p&gt;Password authentication works for testing, but key-based authentication is more secure and convenient. Once set up, you won't need to enter passwords for each connection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generating SSH Keys
&lt;/h3&gt;

&lt;p&gt;On your Pop!_OS machine, generate an SSH key pair if you don't already have one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Ed25519 algorithm provides excellent security with smaller key sizes compared to RSA.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copying Keys to Android
&lt;/h3&gt;

&lt;p&gt;The easiest method is using &lt;code&gt;ssh-copy-id&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-copy-id &lt;span class="nt"&gt;-p&lt;/span&gt; 8022 u0_a123@192.168.1.155
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command automatically copies your public key to the Android device's authorized keys file.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;ssh-copy-id&lt;/code&gt; fails, you can manually copy the key:&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;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub | ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 8022 u0_a123@192.168.1.155 &lt;span class="s1"&gt;'mkdir -p ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Disabling Password Authentication
&lt;/h3&gt;

&lt;p&gt;For better security, disable password authentication once key-based auth is working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano &lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;PasswordAuthentication&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the SSH service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkill sshd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting Common Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Connection Refused Errors
&lt;/h3&gt;

&lt;p&gt;If you get "Connection refused," the SSH service isn't running or isn't listening on the expected port. Check if the service is running:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If no process ID appears, start the service again:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Network Connectivity Problems
&lt;/h3&gt;

&lt;p&gt;Ensure both devices are on the same WiFi network. Test basic connectivity:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If ping fails, you have a network issue rather than an SSH problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Permission Denied with Keys
&lt;/h3&gt;

&lt;p&gt;If key authentication fails, check the key permissions on both devices:&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;# On Pop!_OS&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/.ssh/
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/id_ed25519
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Android (via Termux):&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;chmod &lt;/span&gt;700 ~/.ssh/
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Automating SSH Server Startup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Creating a Startup Script
&lt;/h3&gt;

&lt;p&gt;Since Termux doesn't automatically start SSH on boot, create a simple script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/start_ssh.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&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;#!/data/data/com.termux/files/usr/bin/bash&lt;/span&gt;
sshd
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SSH server started on port 8022"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable:&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;chmod&lt;/span&gt; +x ~/start_ssh.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using Termux:Boot
&lt;/h3&gt;

&lt;p&gt;For automatic startup, install the Termux:Boot add-on from F-Droid. Create a startup script in the required directory:&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; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.termux/boot/
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'sshd'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.termux/boot/start_ssh
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ~/.termux/boot/start_ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Custom SSH Configuration
&lt;/h3&gt;

&lt;p&gt;Create an SSH config file on your Pop!_OS machine for easier connections:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;Host&lt;/span&gt; &lt;span class="err"&gt;android-phone&lt;/span&gt;
    &lt;span class="err"&gt;HostName&lt;/span&gt; &lt;span class="err"&gt;192.168.1.155&lt;/span&gt;
    &lt;span class="err"&gt;Port&lt;/span&gt; &lt;span class="err"&gt;8022&lt;/span&gt;
    &lt;span class="err"&gt;User&lt;/span&gt; &lt;span class="err"&gt;u0_a123&lt;/span&gt;
    &lt;span class="err"&gt;IdentityFile&lt;/span&gt; &lt;span class="err"&gt;~/.ssh/id_ed25519&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can connect simply with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  File Transfer Operations
&lt;/h3&gt;

&lt;p&gt;Use SCP for file transfers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp &lt;span class="nt"&gt;-P&lt;/span&gt; 8022 file.txt u0_a123@192.168.1.155:~/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use rsync for more advanced synchronization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rsync &lt;span class="nt"&gt;-avz&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"ssh -p 8022"&lt;/span&gt; ~/Documents/ u0_a123@192.168.1.155:~/backup/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Firewall Configuration
&lt;/h3&gt;

&lt;p&gt;Consider enabling UFW on your Pop!_OS machine and configuring appropriate rules:&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;ufw allow from 192.168.1.0/24 to any port 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Regular Security Updates
&lt;/h3&gt;

&lt;p&gt;Keep both systems 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="c"&gt;# Pop!_OS&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade

&lt;span class="c"&gt;# Termux&lt;/span&gt;
pkg update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkg upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Setting up SSH access between Pop!_OS and Android via Termux opens up powerful possibilities for file management, remote administration, and development workflows. The key is understanding Termux's unique port configuration and authentication requirements.&lt;/p&gt;

&lt;p&gt;Remember that the SSH server in Termux won't survive app kills or device reboots, so you'll need to restart it periodically. Consider this when planning automated workflows or remote access scenarios.&lt;/p&gt;

&lt;p&gt;With proper configuration, you'll have a secure, efficient way to access your Android device's terminal from your Linux desktop, making cross-device development and file management significantly easier.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>android</category>
      <category>termux</category>
    </item>
    <item>
      <title>Building WordPress Sites Locally with Elementor on Linux: A Complete Guide</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Sun, 06 Jul 2025 23:45:05 +0000</pubDate>
      <link>https://dev.to/chami/building-wordpress-sites-locally-with-elementor-on-linux-a-complete-guide-30i4</link>
      <guid>https://dev.to/chami/building-wordpress-sites-locally-with-elementor-on-linux-a-complete-guide-30i4</guid>
      <description>&lt;p&gt;Setting up a local WordPress development environment has become essential for anyone serious about web design. Whether you're building client websites, testing new ideas, or just learning the ropes, having a local setup saves time, money, and prevents the embarrassment of breaking a live site.&lt;/p&gt;

&lt;p&gt;This guide will walk you through creating a powerful local WordPress development environment on Linux using Elementor's drag-and-drop interface. You'll be able to design and test your websites completely offline before taking them live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose Local Development?
&lt;/h2&gt;

&lt;p&gt;Working locally offers several advantages over developing directly on live servers. You can experiment freely without worrying about downtime, test plugins and themes without affecting visitors, and work without an internet connection. Plus, local development is significantly faster since everything runs on your own machine.&lt;/p&gt;

&lt;p&gt;The combination of WordPress and Elementor gives you professional-grade website building capabilities. WordPress provides the robust content management system, while Elementor adds an intuitive visual editor that rivals premium website builders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Your Local Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Easy Route: Using Local by Flywheel
&lt;/h3&gt;

&lt;p&gt;Local by Flywheel (now simply called "Local") has become the go-to solution for WordPress developers. It handles all the server configuration automatically, so you can focus on building rather than debugging Apache configurations.&lt;/p&gt;

&lt;p&gt;First, head over to &lt;a href="https://localwp.com" rel="noopener noreferrer"&gt;localwp.com&lt;/a&gt; and download the Linux version. You'll get a &lt;code&gt;.deb&lt;/code&gt; file that installs cleanly on Linux.&lt;/p&gt;

&lt;p&gt;Once downloaded, install it through the terminal:&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;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; ~/Downloads/local-5.2.3-linux-&lt;span class="k"&gt;*&lt;/span&gt;.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nt"&gt;--fix-broken&lt;/span&gt; &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for arch linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yay &lt;span class="nt"&gt;-Ss&lt;/span&gt; flywheel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you will get this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aur/local-by-flywheel-bin 9.2.4-6788 &lt;span class="o"&gt;(&lt;/span&gt;+22 0.18&lt;span class="o"&gt;)&lt;/span&gt;
    A program to create a &lt;span class="nb"&gt;local &lt;/span&gt;WordPress development environment.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to install do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yay &lt;span class="nt"&gt;-Sy&lt;/span&gt; local-by-flywheel-bin 9.2.4-6788
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second command fixes any dependency issues that might arise during installation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Your First Local Site
&lt;/h3&gt;

&lt;p&gt;Launch Local from your applications menu. The interface is refreshingly clean and straightforward.&lt;/p&gt;

&lt;p&gt;Click "Create a New Site" and you'll be guided through a simple setup process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Site Name&lt;/strong&gt;: Choose something descriptive like "MyPortfolio" or "ClientProject"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment&lt;/strong&gt;: The default "Preferred" option works well for most projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WordPress Credentials&lt;/strong&gt;: Set up your admin username and password (write these down!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local handles all the behind-the-scenes work - setting up the database, configuring PHP, and installing WordPress. In just a few minutes, you'll have a fully functional WordPress site running on your machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx2t8h3ffddhqy33rgei.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx2t8h3ffddhqy33rgei.png" alt="Local software" width="800" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Elementor
&lt;/h3&gt;

&lt;p&gt;With your local WordPress site ready, it's time to add Elementor's design capabilities. Click "WP Admin" in Local to open your WordPress dashboard.&lt;/p&gt;

&lt;p&gt;Navigate to Plugins → Add New and search for "Elementor". Install and activate both the free Elementor plugin and Elementor Pro if you have a license. The free version provides plenty of functionality for most projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxc4n4r82q62zp9lq6h35.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxc4n4r82q62zp9lq6h35.png" alt="site preview" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing with Elementor
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Getting Started with the Visual Editor
&lt;/h3&gt;

&lt;p&gt;Elementor transforms WordPress from a traditional CMS into a visual design tool. Create a new page or edit an existing one, then click "Edit with Elementor" to launch the visual editor.&lt;/p&gt;

&lt;p&gt;The interface is divided into three main areas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Left Panel&lt;/strong&gt;: Contains all your widgets and design elements. You'll find everything from basic text blocks to complex carousel sliders and contact forms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Center Canvas&lt;/strong&gt;: This is your live preview area where you drag and drop elements. What you see here is exactly what your visitors will see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right Panel&lt;/strong&gt;: Controls styling and content for whatever element you have selected. This is where you'll adjust colors, fonts, spacing, and other design details.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building Your First Page
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4xbpz935g87ohne98cjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4xbpz935g87ohne98cjr.png" alt="WP Admin" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start by dragging a section from the left panel onto your canvas. Sections act as containers for your content and help organize your page layout.&lt;/p&gt;

&lt;p&gt;Within each section, you can add columns to create multi-column layouts. Then populate these columns with widgets like text boxes, images, buttons, and more complex elements.&lt;/p&gt;

&lt;p&gt;The real power of Elementor shows when you start styling these elements. Select any widget and the right panel fills with customization options. You can adjust typography, colors, spacing, animations, and responsive behavior without touching a line of code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Responsive Design Made Easy
&lt;/h3&gt;

&lt;p&gt;One of Elementor's strongest features is its responsive editing capabilities. At the bottom of the editor, you'll find device icons that let you preview and adjust your design for desktop, tablet, and mobile devices.&lt;/p&gt;

&lt;p&gt;Make sure to test your design on all screen sizes. What looks perfect on desktop might need adjustments on mobile devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking Your Site Live
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Preparing for Migration
&lt;/h3&gt;

&lt;p&gt;When you're satisfied with your local development, it's time to move your site to a live server. This process involves transferring both your WordPress files and database.&lt;/p&gt;

&lt;p&gt;From your Local environment, you can export your site in several ways. The simplest approach is using Local's built-in export feature, which creates a package containing everything needed for your site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Database and File Transfer
&lt;/h3&gt;

&lt;p&gt;If you prefer manual control over the process, you can export your database directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; wpuser &lt;span class="nt"&gt;-p&lt;/span&gt; wordpress &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; wordpress_backup.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then compress your WordPress files:&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;tar&lt;/span&gt; &lt;span class="nt"&gt;-czvf&lt;/span&gt; wordpress_site.tar.gz /var/www/html/wordpress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Migration Tools
&lt;/h3&gt;

&lt;p&gt;For a more streamlined approach, consider using migration plugins like "All-in-One WP Migration" or "Duplicator". These tools handle the entire process automatically, including updating URLs and file paths.&lt;/p&gt;

&lt;p&gt;Most hosting providers also offer WordPress-specific migration tools that can import your local site directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting Common Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Local Won't Start
&lt;/h3&gt;

&lt;p&gt;If Local refuses to launch, try a clean reinstall:&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 remove &lt;span class="nb"&gt;local
sudo &lt;/span&gt;apt autoremove
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; local-linux-&lt;span class="k"&gt;*&lt;/span&gt;.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sometimes conflicting Apache or MySQL installations can interfere with Local. Check if you have other web servers running and stop them if necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elementor Performance Issues
&lt;/h3&gt;

&lt;p&gt;If Elementor feels sluggish, check your PHP version. WordPress and Elementor perform best with PHP 7.4 or newer:&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 &lt;span class="nb"&gt;install &lt;/span&gt;php8.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, ensure your Local site has adequate memory allocation. You can adjust this in Local's site settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugin Conflicts
&lt;/h3&gt;

&lt;p&gt;If you encounter unexpected behavior, try deactivating all plugins except Elementor, then reactivate them one by one to identify conflicts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Local Development
&lt;/h2&gt;

&lt;p&gt;Keep your local environment updated regularly. Both Local and WordPress release security and performance updates frequently.&lt;/p&gt;

&lt;p&gt;Use version control (like Git) to track changes in your custom themes and plugins. This makes it easier to collaborate with others and roll back problematic changes.&lt;/p&gt;

&lt;p&gt;Create a standardized development workflow. Install the same plugins and themes you use on live sites to ensure consistency.&lt;/p&gt;

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

&lt;p&gt;Setting up a local WordPress development environment with Elementor gives you professional-grade website building capabilities without the complexity of server management. You can experiment freely, work offline, and develop sites faster than ever before.&lt;/p&gt;

&lt;p&gt;The combination of Local's simplicity and Elementor's visual design tools makes this setup accessible to beginners while providing the power that professional developers need. Whether you're building your first website or your hundredth, this local development approach will streamline your workflow and improve your results.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>wordpress</category>
      <category>ubuntu</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Turn Your Android Phone into a Virtual Webcam for OBS on Linux (Without DroidCam)</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Sat, 05 Jul 2025 22:02:13 +0000</pubDate>
      <link>https://dev.to/chami/turn-android-phones-camera-into-a-virtual-webcam-for-obs-in-linux-pop-os-without-droidcam-app--45hc</link>
      <guid>https://dev.to/chami/turn-android-phones-camera-into-a-virtual-webcam-for-obs-in-linux-pop-os-without-droidcam-app--45hc</guid>
      <description>&lt;p&gt;If you're tired of dealing with DroidCam's WiFi-only limitations or want a more reliable USB connection for streaming, this guide will show you how to transform your Android phone into a high-quality virtual webcam for OBS Studio on Linux systems like Pop!_OS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Method Works Better
&lt;/h2&gt;

&lt;p&gt;After struggling with DroidCam's WiFi connectivity issues, I discovered this USB-based approach that delivers near-zero latency and crisp video quality. While you'll need a separate microphone for audio (or can set up PulseAudio loopback), the video quality improvement is worth it.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyw8ra6dkwpp8vejwix8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyw8ra6dkwpp8vejwix8.png" alt="I used custom camera app to change the scene mode" width="348" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;in OBS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9j1xq4uhm76tpv482ujo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9j1xq4uhm76tpv482ujo.png" alt="video on obs" width="740" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This solution creates a proper virtual webcam device (&lt;code&gt;/dev/videoX&lt;/code&gt;) that OBS and other applications can recognize as a standard camera input.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Stack
&lt;/h2&gt;

&lt;p&gt;Our setup uses three key components working together:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;scrcpy&lt;/strong&gt; - Originally designed for Android screen mirroring and remote control, we're repurposing it to stream your phone's camera feed over USB with minimal latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v4l2loopback&lt;/strong&gt; - This kernel module creates a virtual video device that acts as a bridge between scrcpy's output and OBS's input expectations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ffmpeg&lt;/strong&gt; - While optional, it helps with video format conversion when needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation and Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installing Required Packages
&lt;/h3&gt;

&lt;p&gt;Start by updating your system and installing the necessary tools:&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 &lt;span class="nb"&gt;install &lt;/span&gt;scrcpy v4l2loopback-dkms ffmpeg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setting Up the Virtual Camera Device
&lt;/h3&gt;

&lt;p&gt;Load the v4l2loopback kernel module to create your virtual webcam:&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;modprobe v4l2loopback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make this persistent across reboots, add it to your modules list:&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;echo&lt;/span&gt; &lt;span class="s2"&gt;"v4l2loopback"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/modules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Preparing Your Android Device
&lt;/h3&gt;

&lt;p&gt;Enable USB debugging on your Android phone by following these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to Settings → About Phone&lt;/li&gt;
&lt;li&gt;Tap "Build Number" seven times to unlock Developer Options&lt;/li&gt;
&lt;li&gt;Go to Developer Options and enable USB Debugging&lt;/li&gt;
&lt;li&gt;Connect your phone via USB cable&lt;/li&gt;
&lt;li&gt;Allow debugging access when prompted on your phone&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Starting the Camera Stream
&lt;/h3&gt;

&lt;p&gt;Launch scrcpy with virtual webcam output using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scrcpy &lt;span class="nt"&gt;--v4l2-sink&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/video2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This redirects your phone's display (including camera apps) to the virtual webcam device at &lt;code&gt;/dev/video2&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring OBS Studio
&lt;/h3&gt;

&lt;p&gt;In OBS Studio:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the "+" button in Sources&lt;/li&gt;
&lt;li&gt;Select "Video Capture Device" or "Window Capture"&lt;/li&gt;
&lt;li&gt;Name your source (e.g., "Android Camera")&lt;/li&gt;
&lt;li&gt;Choose &lt;code&gt;/dev/video2&lt;/code&gt; as the device&lt;/li&gt;
&lt;li&gt;Adjust resolution and frame rate settings as needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your video appears rotated, add the rotation parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scrcpy &lt;span class="nt"&gt;--v4l2-sink&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/video2 &lt;span class="nt"&gt;--rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting Common Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Virtual Device Not Found
&lt;/h3&gt;

&lt;p&gt;If &lt;code&gt;/dev/video2&lt;/code&gt; doesn't appear, verify the module loaded correctly:&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;ls&lt;/span&gt; /dev/video&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If missing, reload the v4l2loopback module:&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;modprobe &lt;span class="nt"&gt;-r&lt;/span&gt; v4l2loopback &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe v4l2loopback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Black Screen in OBS
&lt;/h3&gt;

&lt;p&gt;Try limiting the resolution to improve compatibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scrcpy &lt;span class="nt"&gt;--v4l2-sink&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/video2 &lt;span class="nt"&gt;--max-size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure to restart OBS after launching scrcpy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phone Connection Issues
&lt;/h3&gt;

&lt;p&gt;Check if your device is properly connected:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If your phone isn't listed, reconnect the USB cable and re-enable USB debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streamlining Your Workflow
&lt;/h2&gt;

&lt;p&gt;Create a simple script to avoid typing the full command each time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/android_cam.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add this 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;
scrcpy &lt;span class="nt"&gt;--v4l2-sink&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/video2 &lt;span class="nt"&gt;--max-size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable:&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;chmod&lt;/span&gt; +x ~/android_cam.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can start your Android webcam with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This method provides a reliable, low-latency solution for using your Android phone as a webcam without relying on potentially unstable WiFi connections. The USB connection ensures consistent performance, making it ideal for important streams or recordings where reliability matters most.&lt;/p&gt;

&lt;p&gt;The setup works with any camera app on your phone, giving you flexibility in how you want to frame and control your video feed. Just remember to keep your phone charged or use a longer USB cable that supports both data and charging if you plan on extended recording sessions.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>linux</category>
      <category>popos</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Fix: Can't use zsh in vs-codium issue</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Sat, 14 Jun 2025 18:30:21 +0000</pubDate>
      <link>https://dev.to/chami/cant-use-zsh-in-vs-codium-issue-la9</link>
      <guid>https://dev.to/chami/cant-use-zsh-in-vs-codium-issue-la9</guid>
      <description>&lt;p&gt;I recently run into an issue, I wanted to use zsh instead of sh or bash in the vs-codium terminal, I installed it as a flatpak.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Understand the problem:&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Flatpak app runs in an isolated sandbox;&lt;/li&gt;
&lt;li&gt;It can't access your real shell &lt;strong&gt;&lt;code&gt;(/usr/bin/zsh)&lt;/code&gt;&lt;/strong&gt; directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;u&gt;Solution:&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you need &lt;code&gt;host-spawn&lt;/code&gt; to bridge between sandbox and host system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to Check if You're Using Flatpak&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flatpak list | &lt;span class="nb"&gt;grep &lt;/span&gt;codium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see output like: &lt;code&gt;com.vscodium.codium&lt;/code&gt;, you are using the Flatpak version&lt;/p&gt;

&lt;p&gt;If You Are Using the Flatpak Version:&lt;br&gt;
1- Install &lt;code&gt;host-spawn&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;flatpak-xdg-utils
flatpak override &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nt"&gt;--filesystem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host com.vscodium.codium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2- Update your settings like (ctrl + shift + P, open user settings (json) ):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"terminal.integrated.defaultProfile.linux"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zsh"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.profiles.linux"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zsh"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/app/bin/host-spawn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"zsh"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"icon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"terminal-bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"overrideName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;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;Good luck :)&lt;/p&gt;

</description>
      <category>vscodium</category>
      <category>linux</category>
      <category>ubuntu</category>
      <category>flatpak</category>
    </item>
    <item>
      <title>Fix Night Light Issue in Pop! OS</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Sat, 14 Jun 2025 18:14:56 +0000</pubDate>
      <link>https://dev.to/chami/fix-night-light-issue-in-pop-os-1m8p</link>
      <guid>https://dev.to/chami/fix-night-light-issue-in-pop-os-1m8p</guid>
      <description>&lt;p&gt;I recently come across an issue that the night light in Pop! OS runs few seconds then get back to the bluelight even though it's ON and set to sunrise to sunrise, the easy solution that I found to install &lt;strong&gt;gammastep&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;gammastep
gammastep &lt;span class="nt"&gt;-O&lt;/span&gt; 3000  &lt;span class="c"&gt;# Test (3000K = warm, higher value more bluelight)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to learn more about the features run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gammastep &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;good luck :)&lt;/p&gt;

</description>
      <category>popos</category>
      <category>linux</category>
      <category>nighlight</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Export Avalonia App To linux Ubuntu step-by-step guide</title>
      <dc:creator>Mohammed Chami</dc:creator>
      <pubDate>Fri, 13 Jun 2025 02:31:56 +0000</pubDate>
      <link>https://dev.to/chami/export-avalonia-app-to-linux-ubuntu-step-by-step-guide-40id</link>
      <guid>https://dev.to/chami/export-avalonia-app-to-linux-ubuntu-step-by-step-guide-40id</guid>
      <description>&lt;p&gt;The first way needs dotnet runtime to run, the second way I will share the self contained without dotnet runtime.&lt;/p&gt;

&lt;p&gt;Need: dotnet runtime&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 1: Install System-Wide .NET SDK (Required)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Open a terminal and run:&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;# Add Microsoft's repository&lt;/span&gt;
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb &lt;span class="nt"&gt;-O&lt;/span&gt; packages-microsoft-prod.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; packages-microsoft-prod.deb
&lt;span class="nb"&gt;rm &lt;/span&gt;packages-microsoft-prod.deb

&lt;span class="c"&gt;# Install .NET 8 SDK&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; dotnet-sdk-8.0

&lt;span class="c"&gt;# Verify installation&lt;/span&gt;
dotnet &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Step 2: Install dotnet-deb Tool&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt; dotnet-deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Step 3: Prepare Your Avalonia Project&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open your &lt;code&gt;.csproj&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Add these lines &lt;strong&gt;inside&lt;/strong&gt; the &lt;code&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/code&gt; section:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;DebianPackage&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/DebianPackage&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;DebianPackageDependencies&amp;gt;&lt;/span&gt;libc6, libgcc1, libstdc++6&lt;span class="nt"&gt;&amp;lt;/DebianPackageDependencies&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;RuntimeIdentifier&amp;gt;&lt;/span&gt;linux-x64&lt;span class="nt"&gt;&amp;lt;/RuntimeIdentifier&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Step 4: Build the .deb Package&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet deb &lt;span class="nt"&gt;-c&lt;/span&gt; Release &lt;span class="nt"&gt;-r&lt;/span&gt; linux-x64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a &lt;code&gt;.deb&lt;/code&gt; file in:&lt;br&gt;&lt;br&gt;
&lt;code&gt;/bin/Release/net8.0/linux-x64/[your-app-name].deb&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Step 5: Install on Ubuntu&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; ./bin/Release/net8.0/linux-x64/[your-app-name].deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 6: Run Your App&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Find it in your application menu, or run via terminal:
&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="o"&gt;[&lt;/span&gt;your-app-name]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Troubleshooting Tips&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1- &lt;strong&gt;Missing dependencies?&lt;/strong&gt; Run:&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 &lt;span class="nb"&gt;install &lt;/span&gt;libx11-dev libgbm-dev libgl1-mesa-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2- &lt;strong&gt;Not showing in app menu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Check the generated &lt;code&gt;.desktop&lt;/code&gt; file in:&lt;br&gt;&lt;br&gt;
   &lt;code&gt;/usr/share/applications/[your-app-name].desktop&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3- &lt;strong&gt;Want a custom icon?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Add this to your &lt;code&gt;.csproj&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;DebianPackageIcon&amp;gt;&lt;/span&gt;path/to/your/icon.png&lt;span class="nt"&gt;&amp;lt;/DebianPackageIcon&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4- &lt;strong&gt;You must install .NET to run this application.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOTNET_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/dotnet/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Clean Uninstall Later&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove &lt;span class="o"&gt;[&lt;/span&gt;your-app-name]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;note: Self contained:&lt;br&gt;
To create a &lt;strong&gt;self-contained&lt;/strong&gt; .deb package that doesn't require users to install .NET separately, follow these steps:&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;1. Modify Your &lt;code&gt;.csproj&lt;/code&gt; File&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Add these properties to ensure a &lt;strong&gt;self-contained&lt;/strong&gt; deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Enable self-contained deployment --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;SelfContained&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/SelfContained&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;PublishSingleFile&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/PublishSingleFile&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;RuntimeIdentifier&amp;gt;&lt;/span&gt;linux-x64&lt;span class="nt"&gt;&amp;lt;/RuntimeIdentifier&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Required for dotnet-deb --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;DebianPackage&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/DebianPackage&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;DebianPackageDependencies&amp;gt;&lt;/span&gt;libc6, libgcc1, libstdc++6&lt;span class="nt"&gt;&amp;lt;/DebianPackageDependencies&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Publish &amp;amp; Build the .deb Package&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Run this command to generate a &lt;strong&gt;standalone&lt;/strong&gt; .deb:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet publish &lt;span class="nt"&gt;-c&lt;/span&gt; Release &lt;span class="nt"&gt;-r&lt;/span&gt; linux-x64 &lt;span class="nt"&gt;--self-contained&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;dotnet deb &lt;span class="nt"&gt;-c&lt;/span&gt; Release &lt;span class="nt"&gt;-r&lt;/span&gt; linux-x64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will output a &lt;code&gt;.deb&lt;/code&gt; file in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bin/Release/net8.0/linux-x64/[your-app-name].deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3. Key Improvements&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No .NET Runtime Needed&lt;/strong&gt;: The app bundles everything required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single Executable&lt;/strong&gt;: &lt;code&gt;PublishSingleFile&lt;/code&gt; reduces file clutter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debian Dependencies&lt;/strong&gt;: Only basic system libs (&lt;code&gt;libc6&lt;/code&gt;, etc.) are required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Install &amp;amp; Test on Another Machine&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; ./your-app-name.deb
your-app-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app should run &lt;strong&gt;without&lt;/strong&gt; requiring &lt;code&gt;dotnet&lt;/code&gt; installation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Troubleshooting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you get library errors, ensure these are installed:&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 &lt;span class="nb"&gt;install &lt;/span&gt;libx11-dev libgbm-dev libgl1-mesa-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Final notes&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SelfContained=true&lt;/code&gt; bundles the .NET runtime inside your app.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PublishSingleFile&lt;/code&gt; merges DLLs into one executable.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;.deb&lt;/code&gt; package handles installation like any native app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you.&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>linux</category>
      <category>avalonia</category>
      <category>debian</category>
    </item>
  </channel>
</rss>
