<?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>Forem: Archer Allstars</title>
    <description>The latest articles on Forem by Archer Allstars (@archerallstars).</description>
    <link>https://forem.com/archerallstars</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%2F759190%2Fd50fa025-a769-431b-a628-0b7db1fd605e.jpeg</url>
      <title>Forem: Archer Allstars</title>
      <link>https://forem.com/archerallstars</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/archerallstars"/>
    <language>en</language>
    <item>
      <title>Install Windscribe VPN Client in a Distrobox Container on Any Linux Distro!</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Sun, 22 Mar 2026 06:33:26 +0000</pubDate>
      <link>https://forem.com/archerallstars/install-windscribe-vpn-client-in-a-distrobox-container-on-any-linux-distro-1e4f</link>
      <guid>https://forem.com/archerallstars/install-windscribe-vpn-client-in-a-distrobox-container-on-any-linux-distro-1e4f</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://windscribe.com/" rel="noopener noreferrer"&gt;Windscribe&lt;/a&gt;&lt;/strong&gt; is a legitimate, privacy-focused VPN service with strong security features. It's regarded as one of the top VPN providers among enthusiasts in privacy-focused communities.&lt;/p&gt;

&lt;p&gt;Moreover, you can see miles away from the &lt;strong&gt;&lt;a href="https://windscribe.com/download?cpid=homepage&amp;amp;pcpid=homepage" rel="noopener noreferrer"&gt;download page&lt;/a&gt;&lt;/strong&gt; that it takes Linux users seriously. From my personal experience with the client, this is, by far, the best Linux compatible VPN client in the market!&lt;/p&gt;

&lt;p&gt;The client also works flawlessly inside a container, eliminating the need of layering the client on an immutable OS like Fedora Silverblue.&lt;/p&gt;

&lt;p&gt;Here are reasons why you should consider Windscribe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are many &lt;em&gt;connection protocols&lt;/em&gt; available, WireGuard, Stealth, WStunnel, OpenVPN, IKEv2 (on mobile). The differences between them depend on your use case

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WireGuard&lt;/strong&gt; is the fastest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stealth&lt;/strong&gt; is a censorship circumvention (China, Russia, Iran), restrictive networks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WStunnel&lt;/strong&gt; is a last-resort option for the toughest firewalls or corporate networks.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;If that's not enough, there are &lt;em&gt;more&lt;/em&gt; to &lt;strong&gt;&lt;a href="https://windscribe.com/features/circumvent-censorship" rel="noopener noreferrer"&gt;circumvent censorship&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://windscribe.com/features/decoy-traffic" rel="noopener noreferrer"&gt;decoy traffic&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://windscribe.com/features/gps-spoofing" rel="noopener noreferrer"&gt;MAC spoofing&lt;/a&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;a href="https://windscribe.com/features/gps-spoofing" rel="noopener noreferrer"&gt;GPS spoofing&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;

&lt;em&gt;Port forwarding&lt;/em&gt; is supported 🤫&lt;/li&gt;

&lt;li&gt;

&lt;em&gt;Split tunneling&lt;/em&gt; is supported.&lt;/li&gt;

&lt;li&gt;

&lt;em&gt;CLI client&lt;/em&gt; for those on headless servers&lt;/li&gt;

&lt;li&gt;Many &lt;em&gt;DNS resolver profiles&lt;/em&gt;, blocking malware, ads, and trackers by default.&lt;/li&gt;

&lt;li&gt;

&lt;em&gt;Static IP&lt;/em&gt; is available, along with &lt;em&gt;static port&lt;/em&gt; for port forwarding. This is a killing feature for your remote home projects 🧰&lt;/li&gt;

&lt;li&gt;

&lt;em&gt;Config files&lt;/em&gt; for OpenVPN, IKEv2 and WireGuard are available.&lt;/li&gt;

&lt;li&gt;

&lt;em&gt;Arcade sound&lt;/em&gt; for the connection! 👾🕹️ This feature sealed the deal for me 😆 &lt;/li&gt;

&lt;li&gt;And many more, see &lt;strong&gt;&lt;a href="https://windscribe.com/features" rel="noopener noreferrer"&gt;all features&lt;/a&gt;&lt;/strong&gt;!&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Install Windscribe in a Container
&lt;/h2&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%2Fis6p4l3pxii54gq7t96q.jpg" 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%2Fis6p4l3pxii54gq7t96q.jpg" alt="A container" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  👉️ Table of contents:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;distrobox&lt;/code&gt; 🪩, &lt;code&gt;podman&lt;/code&gt; 💊, and &lt;code&gt;screen&lt;/code&gt; 📺️&lt;/li&gt;
&lt;li&gt;Configure &lt;code&gt;distrobox&lt;/code&gt; to use &lt;code&gt;podman&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a Container 📦️&lt;/li&gt;
&lt;li&gt;Install Windscribe client in the Container&lt;/li&gt;
&lt;li&gt;Enable the Client's Helper&lt;/li&gt;
&lt;li&gt;Create a Launcher Script 🚀 and a Desktop File 🖥️ on the Host&lt;/li&gt;
&lt;li&gt;Make the Container Update Itself Automatically, Zero Maintenance! 😍&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🧧 And More:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Config Your Firewall 🔥 to Have Port Forwarding 🔌 Working Correctly

&lt;ul&gt;
&lt;li&gt;For &lt;code&gt;ufw&lt;/code&gt; System&lt;/li&gt;
&lt;li&gt;For &lt;code&gt;firewalld&lt;/code&gt; System&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Check the Reach-ability of Your Opened Port 🔍️

&lt;ul&gt;
&lt;li&gt;GUI way&lt;/li&gt;
&lt;li&gt;CLI way&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  😱 Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;App-based Split Tunneling 🪓

&lt;ul&gt;
&lt;li&gt;Solution ✅️&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;A Container-safe 👷 Startup Delay

&lt;ul&gt;
&lt;li&gt;Solution ✅️&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Install &lt;code&gt;distrobox&lt;/code&gt; 🪩, &lt;code&gt;podman&lt;/code&gt; 💊, and &lt;code&gt;screen&lt;/code&gt; 📺️
&lt;/h2&gt;

&lt;p&gt;The command will be differ based on your specific package manager. Refer to your distro's docs. For example, on Fedora Silverblue:&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;rpm-ostree &lt;span class="nb"&gt;install &lt;/span&gt;distrobox podman screen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;After the installation, reboot your system to activate the new layer. For other mutable distros, there's no need to reboot.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Configure &lt;code&gt;distrobox&lt;/code&gt; to use &lt;code&gt;podman&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'container_manager="podman"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.config/distrobox/distrobox.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Create a Container 📦️
&lt;/h2&gt;

&lt;p&gt;I use the &lt;em&gt;official&lt;/em&gt; container image from Ubuntu, as I also use the image for &lt;strong&gt;&lt;a href="https://www.zerotier.com/" rel="noopener noreferrer"&gt;ZeroTier&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://developers.cloudflare.com/warp-client/get-started/linux/" rel="noopener noreferrer"&gt;Cloudflare WARP&lt;/a&gt;&lt;/strong&gt;. Otherwise, you could  use openSUSE image instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;registry.opensuse.org/opensuse/distrobox:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's &lt;em&gt;easier to maintain&lt;/em&gt; as it uses a rolling release model, no need to worry about the EOL date of the image/OS.&lt;/li&gt;
&lt;li&gt;It offers some &lt;strong&gt;&lt;a href="https://search.brave.com/search?q=x86-64-v3&amp;amp;source=desktop&amp;amp;conversation=08e02c695b0623727ebf061a4ea7e2cc81b5&amp;amp;summary=1" rel="noopener noreferrer"&gt;x86-64-v3&lt;/a&gt;&lt;/strong&gt; packages, free performance boost!, just by installing the &lt;code&gt;patterns-glibc-hwcaps-x86_64_v3&lt;/code&gt; package.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Do &lt;strong&gt;NOT&lt;/strong&gt; create a rootful &lt;code&gt;init&lt;/code&gt; container, as it can cause ownership/permission conflicts on shared volumes between the host and other containers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Creating a Container for Windscribe (Ubuntu Image)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;distrobox create &lt;span class="nt"&gt;-i&lt;/span&gt; docker.io/library/ubuntu:latest &lt;span class="nt"&gt;-n&lt;/span&gt; vpn-dbx--root &lt;span class="nt"&gt;-H&lt;/span&gt; ~/distrobox/vpn-dbx--root &lt;span class="nt"&gt;--additional-packages&lt;/span&gt; &lt;span class="s2"&gt;"pipewire libxcb-shape0 libnl-genl-3-200"&lt;/span&gt; &lt;span class="nt"&gt;--volume&lt;/span&gt; /run/dbus/system_bus_socket:/run/dbus/system_bus_socket &lt;span class="nt"&gt;--additional-flags&lt;/span&gt; &lt;span class="s2"&gt;"--device=/dev/net/tun --cap-add=NET_ADMIN --cap-add=SYS_ADMIN"&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;I add the &lt;code&gt;pipewire&lt;/code&gt; package to have the audio working for the arcade sound in the client 👾🕹️&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;libxcb-shape0&lt;/code&gt; and &lt;code&gt;libnl-genl-3-200&lt;/code&gt; are used by the client.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/run/dbus/system_bus_socket&lt;/code&gt;, &lt;code&gt;/dev/net/tun&lt;/code&gt;, along with &lt;code&gt;--cap-add=NET_ADMIN&lt;/code&gt; &lt;code&gt;--cap-add=SYS_ADMIN&lt;/code&gt; are universally necessary for any app that wants to modify the state of your network.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt; is used to create a rootful container, for obvious reason.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Install Windscribe client in the Container
&lt;/h2&gt;

&lt;p&gt;Please refer to Windscribe's official &lt;strong&gt;&lt;a href="https://windscribe.com/download" rel="noopener noreferrer"&gt;download page&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Update All Packages in the Container
&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 update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install the &lt;em&gt;Official&lt;/em&gt; Client You Downloaded
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; ./windscribe_2.20.7_amd64.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Enable the Client's Helper
&lt;/h2&gt;

&lt;p&gt;The client requires its helper running to function. Normally, if you install/layer the client directly on the system, the installer script will create a &lt;code&gt;systemd&lt;/code&gt; unit for the helper automatically. But no worry, it can be done easily.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Service Running the Helper
&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;nano /etc/systemd/system/windscribe-helper.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Start Windscribe VPN Helper
&lt;span class="nt"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;network-online.target
&lt;span class="nt"&gt;Wants&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;network-online.target
&lt;span class="nt"&gt;RequiresMountsFor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;%t/containers
&lt;span class="nt"&gt;StartLimitIntervalSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;30
&lt;span class="nt"&gt;StartLimitBurst&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;5

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="nt"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;exec
&lt;span class="nt"&gt;ExecStartPre&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/bin/podman start vpn-dbx--root
&lt;span class="nt"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/bin/podman exec vpn-dbx--root bash -c "/opt/windscribe/helper"
&lt;span class="nt"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;on-failure
&lt;span class="nt"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;5
&lt;span class="nt"&gt;RemainAfterExit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a Timer Triggering the Helper Service
&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;nano /etc/systemd/system/windscribe-helper.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;A trigger to start Windscribe's helper on startup

&lt;span class="k"&gt;[Timer]&lt;/span&gt;
&lt;span class="nt"&gt;OnBootSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;25
&lt;span class="nt"&gt;RandomizedDelaySec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;10

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="nt"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;timers.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reload and Enable the Timer
&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;systemctl daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; windscribe-helper.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The helper is now running in the background 👟&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Create a Launcher Script 🚀 and a Desktop File 🖥️ on the Host
&lt;/h2&gt;

&lt;p&gt;It wouldn't be practical if you have to manually type a lengthy command in the terminal just to open a VPN client 😆&lt;/p&gt;

&lt;p&gt;There are extra steps we will have to do to circumvent the security of our rootful container. But no worry, I will &lt;strong&gt;NOT&lt;/strong&gt; do it in a way that compromises the security, as it's there for a reason.&lt;/p&gt;

&lt;p&gt;I will simply use a wrapper script to launch the client. Then, put the script in a desktop file, so we can launch the app by clicking at a beautiful app icon like any other apps on your system.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Wrapper Script
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.local/bin/windscribe-launcher.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Define container name and flag file&lt;/span&gt;
&lt;span class="nv"&gt;CONTAINER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"vpn-dbx--root"&lt;/span&gt;
&lt;span class="nv"&gt;READY_FLAG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/tmp/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONTAINER_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-ready.flag"&lt;/span&gt;

&lt;span class="c"&gt;# Define the app's binary path and its StartupWMClass name&lt;/span&gt;
&lt;span class="c"&gt;# The StartupWMClass has to be set up correctly. On GNOME, use Alt+F2 then lg to check the correct StartupWMClass of any app&lt;/span&gt;
&lt;span class="nv"&gt;APP_BINARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/opt/windscribe/Windscribe"&lt;/span&gt;
&lt;span class="nv"&gt;APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Windscribe"&lt;/span&gt;

: &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;SYSTEM_SERVICE_FILE_SECTION&lt;/span&gt;&lt;span class="sh"&gt;'
If you don't use/enable the system service file,
or you don't want to check whether it's running,
you can safely remove this whole section.
&lt;/span&gt;&lt;span class="no"&gt;SYSTEM_SERVICE_FILE_SECTION

&lt;/span&gt;&lt;span class="nv"&gt;APP_HELPER_SERVICE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"windscribe-helper.service"&lt;/span&gt;

&lt;span class="c"&gt;# If invoked with "launch" argument, skip service start and proceed&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"launch"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;shift
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="c"&gt;# Check if the service is active (system service)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; systemctl is-active &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_HELPER_SERVICE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APP_HELPER_SERVICE_NAME&lt;/span&gt;&lt;span class="s2"&gt; is not active. Attempting to start it..."&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
            &lt;span class="c"&gt;# Start directly&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;systemctl start &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_HELPER_SERVICE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APP_HELPER_SERVICE_NAME&lt;/span&gt;&lt;span class="s2"&gt; started successfully (as root)."&lt;/span&gt;
            &lt;span class="k"&gt;else
                &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to start &lt;/span&gt;&lt;span class="nv"&gt;$APP_HELPER_SERVICE_NAME&lt;/span&gt;&lt;span class="s2"&gt; (as root)."&lt;/span&gt;
                &lt;span class="nb"&gt;exit &lt;/span&gt;1
            &lt;span class="k"&gt;fi&lt;/span&gt;
            &lt;span class="c"&gt;# Drop back to original user and re-run&lt;/span&gt;
            &lt;span class="nb"&gt;exec &lt;/span&gt;runuser &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SUDO_USER&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; launch
        &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="c"&gt;# Use pkexec with retries&lt;/span&gt;
            &lt;span class="nv"&gt;MAX_RETRIES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3
            &lt;span class="nv"&gt;ATTEMPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$ATTEMPT&lt;/span&gt; &lt;span class="nt"&gt;-le&lt;/span&gt; &lt;span class="nv"&gt;$MAX_RETRIES&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
                if &lt;/span&gt;pkexec systemctl start &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_HELPER_SERVICE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APP_HELPER_SERVICE_NAME&lt;/span&gt;&lt;span class="s2"&gt; started successfully."&lt;/span&gt;
                    &lt;span class="nb"&gt;break
                &lt;/span&gt;&lt;span class="k"&gt;else
                    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to start &lt;/span&gt;&lt;span class="nv"&gt;$APP_HELPER_SERVICE_NAME&lt;/span&gt;&lt;span class="s2"&gt; (attempt &lt;/span&gt;&lt;span class="nv"&gt;$ATTEMPT&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$MAX_RETRIES&lt;/span&gt;&lt;span class="s2"&gt;)."&lt;/span&gt;
                    &lt;span class="nv"&gt;ATTEMPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;ATTEMPT &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
                &lt;span class="k"&gt;fi
            done
            if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$ATTEMPT&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; &lt;span class="nv"&gt;$MAX_RETRIES&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Exceeded maximum retries. Exiting."&lt;/span&gt;
                &lt;span class="nb"&gt;exit &lt;/span&gt;1
            &lt;span class="k"&gt;fi
        fi&lt;/span&gt;
        &lt;span class="c"&gt;# Re-execute to separate pkexec calls&lt;/span&gt;
        &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; launch
    &lt;span class="k"&gt;fi
fi&lt;/span&gt;

&lt;span class="c"&gt;### End of SYSTEM_SERVICE_FILE_SECTION&lt;/span&gt;

&lt;span class="c"&gt;# Check if the systemd scope is active (indicating the app is running)&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; is-active &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.scope&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# Check if there's an existing app's window&lt;/span&gt;
    &lt;span class="nv"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;gdbus call &lt;span class="nt"&gt;--session&lt;/span&gt; &lt;span class="nt"&gt;--dest&lt;/span&gt; org.gnome.Shell &lt;span class="nt"&gt;--object-path&lt;/span&gt; /org/gnome/Shell &lt;span class="nt"&gt;--method&lt;/span&gt; org.gnome.Shell.Eval &lt;span class="s2"&gt;"
    global.get_window_actors()
        .map(a =&amp;gt; a.meta_window)
        .some(w =&amp;gt; w.get_wm_class() === '&lt;/span&gt;&lt;span class="nv"&gt;$APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="s2"&gt;');"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'true'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$exists&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="c"&gt;# Activate the existing window&lt;/span&gt;
        gdbus call &lt;span class="nt"&gt;--session&lt;/span&gt; &lt;span class="nt"&gt;--dest&lt;/span&gt; org.gnome.Shell &lt;span class="nt"&gt;--object-path&lt;/span&gt; /org/gnome/Shell &lt;span class="nt"&gt;--method&lt;/span&gt; org.gnome.Shell.Eval &lt;span class="s2"&gt;"
        const window = global.get_window_actors()
            .map(a =&amp;gt; a.meta_window)
            .find(w =&amp;gt; w.get_wm_class() === '&lt;/span&gt;&lt;span class="nv"&gt;$APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="s2"&gt;');
        if (window) {
            window.activate(global.get_current_time());
        }"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="c"&gt;# No window but scope active: Send resume command to persistent screen session (no prompt)&lt;/span&gt;
        screen &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;-dbx&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 0 &lt;span class="nt"&gt;-X&lt;/span&gt; stuff &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_BINARY_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi
    &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# If scope not active, ensure persistent screen session for container entry&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; screen &lt;span class="nt"&gt;-ls&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-dbx"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# Clean up any old flag (optional, for safety)&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$READY_FLAG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;# Start detached screen session that enters the container and signals readiness (pkexec prompt for graphically auth)&lt;/span&gt;
    &lt;span class="c"&gt;# The command runs ONLY after the container is ready: touch the flag, then keep the session open with bash&lt;/span&gt;
    screen &lt;span class="nt"&gt;-dmS&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;-dbx&lt;/span&gt; sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"DBX_SUDO_PROGRAM=pkexec distrobox-enter -r &lt;/span&gt;&lt;span class="nv"&gt;$CONTAINER_NAME&lt;/span&gt;&lt;span class="s2"&gt; -- bash -c 'touch &lt;/span&gt;&lt;span class="nv"&gt;$READY_FLAG&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; bash'"&lt;/span&gt;

    &lt;span class="c"&gt;# Wait for the flag file to appear (poll with a timeout for safety)&lt;/span&gt;
    &lt;span class="nv"&gt;TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60 &lt;span class="c"&gt;# Max seconds to wait&lt;/span&gt;
    &lt;span class="nv"&gt;ELAPSED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$READY_FLAG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ELAPSED&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-ge&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TIMEOUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Timeout: Container did not become ready in &lt;/span&gt;&lt;span class="nv"&gt;$TIMEOUT&lt;/span&gt;&lt;span class="s2"&gt; seconds."&lt;/span&gt;
            &lt;span class="c"&gt;# Optional: Kill the screen session if timed out&lt;/span&gt;
            screen &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;-dbx&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; quit
            &lt;span class="nb"&gt;exit &lt;/span&gt;1
        &lt;span class="k"&gt;fi
        &lt;/span&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;1
        &lt;span class="nv"&gt;ELAPSED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;ELAPSED &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;done&lt;/span&gt;

    &lt;span class="c"&gt;# Container is ready! Clean up the flag and proceed&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$READY_FLAG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Container is ready. Running next command..."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Send the initial launch command to the screen session&lt;/span&gt;
screen &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;-dbx&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 0 &lt;span class="nt"&gt;-X&lt;/span&gt; stuff &lt;span class="s2"&gt;"systemd-run --scope --user --unit=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_STARTUP_WM_CLASS_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.scope &lt;/span&gt;&lt;span class="nv"&gt;$APP_BINARY_PATH&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Explanation 🤓
&lt;/h4&gt;

&lt;p&gt;If you need it, this script works with any app in a rootful container. Here are all the variables you can change at the top of the script:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CONTAINER_NAME&lt;/code&gt;, as the name suggests.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;READY_FLAG&lt;/code&gt; is used to check the readiness of the container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;APP_BINARY_PATH&lt;/code&gt; is the binary path of the app you want to use. In this case, it's &lt;code&gt;/opt/windscribe/Windscribe&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;APP_STARTUP_WM_CLASS_NAME&lt;/code&gt; is the &lt;code&gt;StartupWMClass&lt;/code&gt; of the app. It has to be set up correctly. On GNOME, use &lt;strong&gt;Alt+F2&lt;/strong&gt; then &lt;code&gt;lg&lt;/code&gt; to check the correct &lt;code&gt;StartupWMClass&lt;/code&gt; of any app.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;APP_HELPER_SERVICE_NAME&lt;/code&gt; is the file name of the helper service we have created in the previous step. You don't have to wait for the helper to start, if you're in such a hurry, you can launch the app whenever you want, the script will help you launch the helper too if it's not already running!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to &lt;code&gt;systemd-run&lt;/code&gt; and its &lt;code&gt;scope&lt;/code&gt; unit, we can check easily whether the app's running, then use different commands to activate the app's window. I would say, not only this is native, but cleaner and more reliable than any other methods.&lt;/p&gt;

&lt;p&gt;Then, I use &lt;code&gt;gdbus&lt;/code&gt; to manipulate the state of the app's window. This is a native way on GNOME, so it works seamlessly on GNOME, but &lt;em&gt;I don't know&lt;/em&gt; about the compatibility with other desktop environments.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But as I don't use other DEs, I wouldn't dare to publish the code that I didn't test or have any idea of. Therefore, if any of you have any idea on how to make it work with other DEs like KDE, COSMIC DE, or even tiling window managers like Hyprland, Niri, etc., please comment down below with a working script.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also use &lt;code&gt;screen&lt;/code&gt; to have a persistent session for &lt;code&gt;distrobox-enter -r&lt;/code&gt; to our rootful container, so we don't have to enter our &lt;code&gt;sudo&lt;/code&gt; password every single time we click on the app's icon 😂&lt;/p&gt;

&lt;h3&gt;
  
  
  The Desktop File
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.local/share/applications/windscribe.desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Desktop Entry]&lt;/span&gt;
&lt;span class="nt"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Application
&lt;span class="nt"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/var/home/archerallstars/.local/share/icons/windscribe.png
&lt;span class="nt"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Windscribe
&lt;span class="nt"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Start Windscribe VPN
&lt;span class="nt"&gt;Keywords&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;vpn;windscribe
&lt;span class="nt"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/bin/bash /var/home/archerallstars/.local/bin/windscribe-launcher.sh
&lt;span class="nt"&gt;StartupWMClass&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Windscribe
&lt;span class="nt"&gt;Terminal&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Replace &lt;code&gt;/var/home/archerallstars&lt;/code&gt; with your &lt;em&gt;host&lt;/em&gt; system's &lt;code&gt;$HOME&lt;/code&gt; absolute path (the path without &lt;code&gt;~&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;💡 You can download the app icon easily from the &lt;strong&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.windscribe.vpn&amp;amp;pcampaignid=web_share" rel="noopener noreferrer"&gt;Play Store&lt;/a&gt;&lt;/strong&gt; 🛍️ Then, replace the icon's path on the above with your icon's &lt;em&gt;absolute&lt;/em&gt; path.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, you have the client 100% fully working!&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%2Fpknnf6t679n2h0w0lmhp.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%2Fpknnf6t679n2h0w0lmhp.png" alt="The client screenshot" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check your public IP address and DNS resolver to see if they're matched with the ones showing in your Windscribe client, and also to see if there's any DNS leak by using &lt;a href="https://dnscheck.tools/" rel="noopener noreferrer"&gt;https://dnscheck.tools/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For what it's worth, you might want to change your &lt;code&gt;systemd-resolved&lt;/code&gt;'s &lt;em&gt;DNS over TLS&lt;/em&gt; setting to &lt;code&gt;opportunistic&lt;/code&gt;, so it won't interfere with your VPN's DNS setup.&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;nano /etc/systemd/resolved.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Resolve]&lt;/span&gt;
&lt;span class="nt"&gt;DNSOverTLS&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;opportunistic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lastly, restart &lt;code&gt;systemd-resolved&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;systemctl restart systemd-resolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Make the Container Update Itself Automatically, Zero Maintenance! 😍
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create a Service File
&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;nano /etc/systemd/system/vpn-dbx-upgrade.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Upgrade vpn-dbx--root
&lt;span class="nt"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;network-online.target
&lt;span class="nt"&gt;Wants&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;network-online.target
&lt;span class="nt"&gt;RequiresMountsFor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;%t/containers
&lt;span class="nt"&gt;StartLimitIntervalSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;600
&lt;span class="nt"&gt;StartLimitBurst&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;5

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="nt"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;exec
&lt;span class="nt"&gt;ExecStartPre&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/bin/podman start vpn-dbx--root
&lt;span class="nt"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/bin/podman exec vpn-dbx--root bash -c "apt update -y &amp;amp;&amp;amp; apt full-upgrade -y"
&lt;span class="nt"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;on-failure
&lt;span class="nt"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;60
&lt;span class="nt"&gt;RemainAfterExit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a Timer File
&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;nano /etc/systemd/system/vpn-dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Upgrade vpn-dbx--root daily.

&lt;span class="k"&gt;[Timer]&lt;/span&gt;
&lt;span class="nt"&gt;OnCalendar&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;daily
&lt;span class="nt"&gt;Persistent&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;true
&lt;span class="nt"&gt;RandomizedDelaySec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;5min

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="nt"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;timers.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reload and Enable the Timer
&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;systemctl daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;vpn-dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Config Your Firewall 🔥 to Have Port Forwarding 🔌 Working Correctly
&lt;/h2&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%2Fqhdyn32ti3m6qr0bqcw8.jpg" 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%2Fqhdyn32ti3m6qr0bqcw8.jpg" alt="A WiFi Device" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It depends on your host's firewall. For example, Ubuntu uses &lt;code&gt;ufw&lt;/code&gt;, Fedora uses &lt;code&gt;firewalld&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  For &lt;code&gt;ufw&lt;/code&gt; System
&lt;/h3&gt;

&lt;p&gt;Check your firewall status:&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 status verbose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it's enabled, you will need to open the correct port that you've opened in your Windscribe account's port forwarding page:&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 &amp;lt;port&amp;gt;/tcp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow &amp;lt;port&amp;gt;/udp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Change  to your desired port number.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  For &lt;code&gt;firewalld&lt;/code&gt; System
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Create a New Zone in &lt;code&gt;firewalld&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;List all the available zones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--get-zones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will create a new zone called &lt;code&gt;vpn&lt;/code&gt;, if it's not presented yet, create a new one:&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;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--new-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vpn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload &lt;code&gt;firewalld&lt;/code&gt; for it to take effect:&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;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check all the available zones again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--get-zones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, &lt;code&gt;vpn&lt;/code&gt; should be listed as one of the zones.&lt;/p&gt;




&lt;h4&gt;
  
  
  2. Finding the Interface's Name Using Network Manager
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ It's possible to add a new interface to &lt;code&gt;firewalld&lt;/code&gt;'s zones using the Network Manager, but it'll be conflicted with how Windscribe's client manages the network. Therefore, you should use &lt;code&gt;firewalld&lt;/code&gt; to manage its firewall's rules. Never use the Network Manager to manage your firewall rules!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;firewalld&lt;/code&gt;, however, only knows and manages the interfaces that are bound to one of its zones. It cannot see any newly created interfaces that have never been introduced to it. Therefore, we use the Network Manager to list &lt;em&gt;all&lt;/em&gt; the active interfaces on our system instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finding your active connection name first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmcli connection show &lt;span class="nt"&gt;--active&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will return 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;NAME                UUID                           TYPE  DEVICE 
YourConnectionName  xxxxxxxxxxxxxxxxxxxxxxxxxxxxx  wifi  xxxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note down your connection name. Usually, it will be something that has &lt;code&gt;tun&lt;/code&gt; it its name. If you have connected to the VPN network, you can use an app like &lt;strong&gt;&lt;a href="https://flathub.org/en/apps/net.nokyan.Resources" rel="noopener noreferrer"&gt;Resources&lt;/a&gt;&lt;/strong&gt; to know the name for sure.&lt;/p&gt;




&lt;h4&gt;
  
  
  3. Adding the Interface to &lt;code&gt;firewalld&lt;/code&gt; Permanently
&lt;/h4&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;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vpn &lt;span class="nt"&gt;--change-interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'YourConnectionName'&lt;/span&gt; &lt;span class="nt"&gt;--permanent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload the firewall (to apply the change):&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;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, check whether the interface is already in &lt;code&gt;firewalld&lt;/code&gt;'s zone (it should):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vpn &lt;span class="nt"&gt;--list-interfaces&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  4. Adding the Required Ports to &lt;code&gt;firewalld&lt;/code&gt;'s Zone Permanently
&lt;/h4&gt;

&lt;p&gt;List all the rules in &lt;code&gt;vpn&lt;/code&gt; zone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vpn &lt;span class="nt"&gt;--list-all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 If it doesn't show any port number after the &lt;code&gt;ports:&lt;/code&gt; entry, this means &lt;code&gt;firewalld&lt;/code&gt; is blocking &lt;em&gt;all&lt;/em&gt; incoming ports in this zone (&lt;code&gt;vpn&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can add your port 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;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vpn &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;yourport&amp;gt;/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vpn &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;yourport&amp;gt;/udp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Replace &lt;code&gt;&amp;lt;yourport&amp;gt;&lt;/code&gt; with the port you want to allow in the firewall.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reload the firewall (to apply the change):&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;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to remove the port, since most of you would use an ephemeral port anyway:&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;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--remove-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;yourport&amp;gt;/tcp &lt;span class="nt"&gt;--permanent&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--remove-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;yourport&amp;gt;/udp &lt;span class="nt"&gt;--permanent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Replace &lt;code&gt;&amp;lt;yourport&amp;gt;&lt;/code&gt; with the port you want to allow in the firewall.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;😅 &lt;code&gt;firewalld&lt;/code&gt; is very complicate. If you can't connect with your local devices, you need to add mDNS and process forwarded traffic into this new &lt;code&gt;vpn&lt;/code&gt; zone. It's the default &lt;code&gt;public&lt;/code&gt; zone settings in Fedora that works for me with an app like &lt;strong&gt;&lt;a href="https://flathub.org/en/apps/org.localsend.localsend_app" rel="noopener noreferrer"&gt;LocalSend&lt;/a&gt;&lt;/strong&gt;, for example.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&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;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vpn &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mdns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vpn &lt;span class="nt"&gt;--add-forward&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Check the Reach-ability of Your Opened Port 🔍️
&lt;/h2&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%2Fiq47xe7mgraykmb9py8b.jpg" 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%2Fiq47xe7mgraykmb9py8b.jpg" alt="A Hand" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First, please don't use any of the online port checkers like &lt;strong&gt;&lt;a href="https://portchecker.co/" rel="noopener noreferrer"&gt;portchecker.co&lt;/a&gt;&lt;/strong&gt;, for example. It never works for me...&lt;/p&gt;

&lt;p&gt;The reliable way to test the reach-ability of your opened port is through torrent clients like &lt;strong&gt;&lt;a href="https://flathub.org/en/apps/de.haeckerfelix.Fragments" rel="noopener noreferrer"&gt;Fragments&lt;/a&gt;&lt;/strong&gt;, for 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%2F3ze1gdq7wvugcb7brj3q.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%2F3ze1gdq7wvugcb7brj3q.png" alt="Fragments Port Test 1" width="800" height="634"&gt;&lt;/a&gt;&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%2F4hqz8hqv41uhap5bl6oa.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%2F4hqz8hqv41uhap5bl6oa.png" alt="Fragments Port Test 2" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  For Headless Folks
&lt;/h3&gt;

&lt;p&gt;You can use this command to check the reach-ability of your opened port in the terminal 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;&lt;span class="nv"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;port_number&amp;gt;&lt;span class="p"&gt;;&lt;/span&gt; curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://portcheck.transmissionbt.com/&lt;span class="nv"&gt;$p&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'^1'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;32m✅ Port &lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt; is OPEN&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;31m❌ Port &lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt; is CLOSED&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Please change the &lt;code&gt;&amp;lt;port_number&amp;gt;&lt;/code&gt; to the one you want to check.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This will return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Port XXXXX is OPEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ Port XXXXX is CLOSED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  😱 Limitations
&lt;/h2&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%2Fniw98m0cd8fhw6ekd4nd.jpg" 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%2Fniw98m0cd8fhw6ekd4nd.jpg" alt="A Workplace" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  App-based Split Tunneling 🪓
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 It should be noted that while we need to work around the app-based split tunneling, IP-based split tunneling is &lt;em&gt;fully working&lt;/em&gt;. You can check your current IP routing table with &lt;code&gt;ip route show&lt;/code&gt; command. The client's GUI simply routes your desired IPs using the routing table.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The issue with the app-based split tunneling is expected, as we install the client in a container, so there's a layer of separation, even for a rootful container. Therefore, the client doesn't see any of your apps on the host or in other containers.&lt;/p&gt;

&lt;p&gt;But no worry! This is a &lt;em&gt;soft&lt;/em&gt; limitation, not a hard one or a blocker.&lt;/p&gt;




&lt;h4&gt;
  
  
  Solution ✅️
&lt;/h4&gt;

&lt;p&gt;If you really need this functionality, you can install the client in a &lt;em&gt;rootless&lt;/em&gt; container with &lt;code&gt;distrobox-create&lt;/code&gt; command's &lt;code&gt;--unshare-netns&lt;/code&gt; option.&lt;/p&gt;

&lt;p&gt;Basically, all routing, interfaces, and VPN tunnels stay confined to the container's network, so the VPN connection stay &lt;code&gt;inside&lt;/code&gt; the container and won't be routed on the host, as the container simply lacks the &lt;em&gt;capability/permission&lt;/em&gt; to do so.&lt;/p&gt;

&lt;p&gt;You can create a container for the apps that you want to connect through the VPN, while leaving your host's connection outside the VPN tunnel. This behavior is exactly the same with Windscribe client's split tunneling in the &lt;em&gt;inclusive&lt;/em&gt; mode:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Please enable your Windscribe's VPN connection before creating a container. Because &lt;code&gt;pasta&lt;/code&gt;, the new &lt;code&gt;podman&lt;/code&gt; (v5.3+) container's network interface, even though it's a lot faster than before, it will only capture your host's &lt;em&gt;current&lt;/em&gt; DNS addresses into the container.&lt;/p&gt;

&lt;p&gt;💡 You can also specify multiple DNS addresses using &lt;code&gt;distrobox-create&lt;/code&gt;'s &lt;code&gt;--additional-flags "--dns 1.1.1.1 --dns 9.9.9.9"&lt;/code&gt;, for example. If you use this flag, remember to also include at least one &lt;em&gt;public&lt;/em&gt; DNS resolver, so you always have the connection. &lt;/p&gt;

&lt;p&gt;✍️ Without the &lt;code&gt;--dns&lt;/code&gt; flag, &lt;code&gt;pasta&lt;/code&gt; will create a DNS forwarding entry, so whatever your host DNS is, it will be used in the container dynamically.&lt;/p&gt;

&lt;p&gt;⚠️ The VPN client can only use the DNS as per &lt;code&gt;pasta&lt;/code&gt;'s snapshot &lt;em&gt;inside&lt;/em&gt; the container in &lt;code&gt;/etc/resolv.conf&lt;/code&gt; (changing this later on won't have any effects). Therefore, if the VPN's DNS address wasn't there from the start, it would regress back to your current DNS resolver on the host (through &lt;code&gt;pasta&lt;/code&gt;'s DNS forwarding entry), hence leaking. In that case, please re-create the container again when you have the VPN connection up on the host 😅&lt;/p&gt;

&lt;p&gt;✍️ Otherwise, you can create an &lt;code&gt;init&lt;/code&gt; container with its own &lt;code&gt;systemd-resolved&lt;/code&gt; and all, but it won't integrate well with the host. Therefore, I don't recommend this route.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, finally, we can create a VPN only container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;distrobox-create &lt;span class="nt"&gt;-i&lt;/span&gt; registry.opensuse.org/opensuse/distrobox:latest &lt;span class="nt"&gt;-n&lt;/span&gt; vpn-apps-dbx &lt;span class="nt"&gt;-H&lt;/span&gt; ~/distrobox/vpn-apps-dbx &lt;span class="nt"&gt;--unshare-netns&lt;/span&gt; &lt;span class="nt"&gt;--volume&lt;/span&gt; /run/dbus/system_bus_socket:/run/dbus/system_bus_socket &lt;span class="nt"&gt;--additional-packages&lt;/span&gt; &lt;span class="s2"&gt;"libnl3-200 libxkbcommon-x11-0 libxcb-icccm4 libxcb-keysyms1 NetworkManager"&lt;/span&gt; &lt;span class="nt"&gt;--additional-flags&lt;/span&gt; &lt;span class="s2"&gt;"-p 127.0.0.1::57383"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Now, I use the openSUSE image instead of Ubuntu image, as a rolling release container is much easier to maintain, or rather, to not having to maintain anything 😂&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;--unshare-netns&lt;/code&gt; so we use the container's network interface instead of the host's network interface (&lt;code&gt;--network=host&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;-p 127.0.0.1::57383&lt;/code&gt; is basically tell &lt;code&gt;podman&lt;/code&gt; that &lt;em&gt;only&lt;/em&gt; your host can talk to the container directly. Otherwise, others on the internet can &lt;em&gt;bypass&lt;/em&gt; your host's firewall and talk to your container directly, hence a significant security risk. This is something you'll have to be careful when using the container's network interface (&lt;code&gt;pasta&lt;/code&gt;) instead of &lt;code&gt;--network=host&lt;/code&gt;. You can use any port number with &lt;code&gt;-p 127.0.0.1::&amp;lt;container-port&amp;gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🤩 With a &lt;em&gt;rootless&lt;/em&gt; container, you would be able to upgrade &lt;em&gt;all&lt;/em&gt; your containers at once by using the &lt;code&gt;distrobox-upgrade --all&lt;/code&gt; command. Make it run daily in the background using a &lt;code&gt;--user&lt;/code&gt; &lt;code&gt;systemd&lt;/code&gt; service, like I wrote &lt;strong&gt;&lt;a href="https://dev.to/archerallstars/the-complete-guide-to-containerize-any-chromium-browsers-using-distrobox-on-any-linux-distros-3j3m"&gt;here&lt;/a&gt;&lt;/strong&gt;, for example. Moreover, You can use &lt;strong&gt;&lt;a href="https://flathub.org/en/apps/com.github.marhkb.Pods" rel="noopener noreferrer"&gt;Pods&lt;/a&gt;&lt;/strong&gt; to manage your rootless containers beautifully:&lt;/p&gt;
&lt;/blockquote&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%2Fbqq3xj6m6wyspg0l9652.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%2Fbqq3xj6m6wyspg0l9652.png" alt="Pods" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rest of the setup is the same as with a rootful container, except now, you don't have to circumvent the security of a rootful container. Meaning, everything works OOTB without the wrapper script.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Remember that &lt;code&gt;/opt/windscribe/helper&lt;/code&gt; have to be run with &lt;code&gt;sudo&lt;/code&gt;, so when you export it with &lt;code&gt;distrobox-export&lt;/code&gt; don't forget to add &lt;code&gt;--sudo&lt;/code&gt; flag. And now that this is a &lt;em&gt;rootless&lt;/em&gt; container, remember to use a &lt;code&gt;systemd&lt;/code&gt;'s &lt;code&gt;--user&lt;/code&gt; service, not the root one (without the &lt;code&gt;--user&lt;/code&gt; flag), to launch it on the container's start up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After you set everything up and running, provided you set up your firewall correctly, you can check your opened port forwarding by using &lt;strong&gt;&lt;a href="https://transmissionbt.com/" rel="noopener noreferrer"&gt;Transmission&lt;/a&gt;&lt;/strong&gt; in the container:&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%2Fsstxs0d2h2axw9i81bqf.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%2Fsstxs0d2h2axw9i81bqf.png" alt="Transmission" width="800" height="876"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  A Container-safe 👷 Startup Delay
&lt;/h3&gt;

&lt;p&gt;This is unfortunately, a &lt;em&gt;hard&lt;/em&gt; limitation. There's nothing we can do about it. I put some delay in all my containers' initial process. I use 25 seconds delay for the client's helper here.&lt;/p&gt;

&lt;p&gt;Otherwise, the system's booting process could crash entirely due to early-boot dependency race with the container runtime, storage, networking, or cgroup/setup layers.&lt;/p&gt;

&lt;p&gt;See more &lt;strong&gt;&lt;a href="https://grok.com/share/c2hhcmQtMg_f7ad9ff8-a12b-4328-bcc7-ca55bcf6cfab" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  Solution ✅️
&lt;/h4&gt;

&lt;p&gt;We can simply install all of the apps that we want to have the VPN connection at all time inside a &lt;em&gt;rootless&lt;/em&gt; container, as shown on the above.&lt;/p&gt;

&lt;p&gt;With this solution, there will be no leak, as you have orderly control when launching the apps inside the container using &lt;code&gt;systemd&lt;/code&gt;'s &lt;code&gt;After=&lt;/code&gt; and &lt;code&gt;Requires=&lt;/code&gt; directives.&lt;/p&gt;

&lt;p&gt;Therefore, it doesn't matter if you can't have the VPN connection right away on startup.&lt;/p&gt;




&lt;p&gt;Thanks for reading 🤓&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Cover Photo&lt;/strong&gt; by &lt;strong&gt;&lt;a href="https://unsplash.com/@thomasrichter?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Thomas Richter&lt;/a&gt;&lt;/strong&gt; on &lt;strong&gt;&lt;a href="https://unsplash.com/photos/aerial-photo-of-wind-turbines-near-field-B09tL5bSQJk?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Container Photo&lt;/strong&gt; by &lt;strong&gt;&lt;a href="https://unsplash.com/@ssoph?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Sophie Cardinale&lt;/a&gt;&lt;/strong&gt; on &lt;strong&gt;&lt;a href="https://unsplash.com/photos/brown-and-black-steel-container-van-TqD5_9MTwMU?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A WiFi Device Photo&lt;/strong&gt; by &lt;strong&gt;&lt;a href="https://unsplash.com/@b45i?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Amal S&lt;/a&gt;&lt;/strong&gt; on &lt;strong&gt;&lt;a href="https://unsplash.com/photos/transparent-device-with-wifi-signal-on-screen-QEmVIPD0IvQ?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Hand Photo&lt;/strong&gt; by &lt;strong&gt;&lt;a href="https://unsplash.com/@eventidedesignco?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Frankie Mish&lt;/a&gt;&lt;/strong&gt; on &lt;strong&gt;&lt;a href="https://unsplash.com/photos/a-blurry-image-of-a-persons-hand-reaching-for-something-KqjRmA9YshE?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Workplace Photo&lt;/strong&gt; by &lt;strong&gt;&lt;a href="https://unsplash.com/@ryu_11?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;ryu _&lt;/a&gt;&lt;/strong&gt; on &lt;strong&gt;&lt;a href="https://unsplash.com/photos/a-clock-reflected-in-a-mirror-on-a-desk-6FxEh_hbGhI?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>linux</category>
      <category>networking</category>
    </item>
    <item>
      <title>I've updated this walkthrough to work with the latest version of Podman, Distrobox, and "any" of your favorite Linux OS!

Cloudflare WARP is the easiest way to enable IPv6 and security on your network today.</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Tue, 10 Mar 2026 21:03:57 +0000</pubDate>
      <link>https://forem.com/archerallstars/ive-updated-this-walkthrough-to-work-with-the-latest-version-of-podman-distrobox-and-any-of-1g94</link>
      <guid>https://forem.com/archerallstars/ive-updated-this-walkthrough-to-work-with-the-latest-version-of-podman-distrobox-and-any-of-1g94</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/archerallstars/install-cloudflare-warp-on-any-linux-distro-thanks-to-distrobox-4dp9" class="crayons-story__hidden-navigation-link"&gt;Install Cloudflare WARP on any Linux Distro, Thanks to Distrobox!&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/archerallstars" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F759190%2Fd50fa025-a769-431b-a628-0b7db1fd605e.jpeg" alt="archerallstars profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/archerallstars" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Archer Allstars
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Archer Allstars
                
              
              &lt;div id="story-author-preview-content-1820536" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/archerallstars" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F759190%2Fd50fa025-a769-431b-a628-0b7db1fd605e.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Archer Allstars&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/archerallstars/install-cloudflare-warp-on-any-linux-distro-thanks-to-distrobox-4dp9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 15 '24&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/archerallstars/install-cloudflare-warp-on-any-linux-distro-thanks-to-distrobox-4dp9" id="article-link-1820536"&gt;
          Install Cloudflare WARP on any Linux Distro, Thanks to Distrobox!
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/linux"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;linux&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/network"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;network&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/archerallstars/install-cloudflare-warp-on-any-linux-distro-thanks-to-distrobox-4dp9" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;38&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/archerallstars/install-cloudflare-warp-on-any-linux-distro-thanks-to-distrobox-4dp9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              3&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>tutorial</category>
      <category>linux</category>
      <category>productivity</category>
      <category>network</category>
    </item>
    <item>
      <title>Install Mailspring, the Best Free Email App on Linux, in a Distrobox Container!</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Mon, 29 Dec 2025 03:48:23 +0000</pubDate>
      <link>https://forem.com/archerallstars/install-mailspring-the-best-free-email-app-on-linux-in-a-distrobox-container-4b4j</link>
      <guid>https://forem.com/archerallstars/install-mailspring-the-best-free-email-app-on-linux-in-a-distrobox-container-4b4j</guid>
      <description>&lt;p&gt;From my experience, it's actually the best free, open source, and underrated email app on Linux, see its &lt;strong&gt;&lt;a href="https://github.com/Foundry376/Mailspring" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The GUI is sharp and modern.&lt;/li&gt;
&lt;li&gt;It has an excellent built-in email language translator.&lt;/li&gt;
&lt;li&gt;It follows the system's light/dark theme (using a plug-in system).&lt;/li&gt;
&lt;li&gt;Many email providers are supported OOTB with single sign-on system.&lt;/li&gt;
&lt;li&gt;Can be run in the background with the obvious &lt;code&gt;--background&lt;/code&gt; flag.&lt;/li&gt;
&lt;li&gt;Pro subscription is available for more features, see &lt;strong&gt;&lt;a href="https://www.getmailspring.com/pro" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But if you only use one email, an email client probably doesn't matter much 😂&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not Geary?
&lt;/h2&gt;

&lt;p&gt;This is the go-to email client for many. With the &lt;strong&gt;&lt;a href="https://github.com/lassekongo83/adw-gtk3" rel="noopener noreferrer"&gt;adw-gtk3&lt;/a&gt;&lt;/strong&gt; theme and the &lt;strong&gt;&lt;a href="https://github.com/mukul29/legacy-theme-auto-switcher-gnome-extension" rel="noopener noreferrer"&gt;Legacy (GTK3) Theme Scheme Auto Switcher&lt;/a&gt;&lt;/strong&gt; GNOME extension, it blends very well with GNOME and other Adwaita apps. It also integrates with GNOME Online Accounts.&lt;/p&gt;

&lt;p&gt;Unfortunately, its Flatpak version is plagued with a &lt;em&gt;non-debuggable&lt;/em&gt; crashing issue (&lt;a href="https://gitlab.gnome.org/GNOME/geary/-/issues/1679" rel="noopener noreferrer"&gt;&lt;strong&gt;Geary issue #1679&lt;/strong&gt;&lt;/a&gt;) to the point that it's unusable for me now.&lt;/p&gt;

&lt;p&gt;And as I am on Fedora Silverblue, I am not willing to layer something like an email client... And I can't find a way to make it follow the system's light/dark theme in a container.&lt;/p&gt;

&lt;p&gt;Therefore, I uninstalled it and never looked back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not Evolution?
&lt;/h2&gt;

&lt;p&gt;I don't want to use an email client with the 90s graphical interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not Thunderbird?
&lt;/h2&gt;

&lt;p&gt;I want my email client to be an email client, not also a calendar client, etc.&lt;/p&gt;




&lt;h2&gt;
  
  
  👉️ Table of contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install Distrobox and Podman&lt;/li&gt;
&lt;li&gt;Configure Distrobox to Use Podman&lt;/li&gt;
&lt;li&gt;Create a Container 📦️&lt;/li&gt;
&lt;li&gt;Enable x86-64-v3 Packages&lt;/li&gt;
&lt;li&gt;Install Required Packages&lt;/li&gt;
&lt;li&gt;[optional] Symlink fonts and fontconfig Directories on the Host&lt;/li&gt;
&lt;li&gt;Install Mailspring&lt;/li&gt;
&lt;li&gt;Export Mailspring to the Host&lt;/li&gt;
&lt;li&gt;Make Mailspring Follow the System’s Light/Dark Theme&lt;/li&gt;
&lt;li&gt;Start Mailspring in the Background on Startup&lt;/li&gt;
&lt;li&gt;Update the Container Automatically, Zero Maintenance!&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Install Distrobox and Podman
&lt;/h2&gt;

&lt;p&gt;The command will differ based on your specific package manager. Refer to your distro's docs. For example, on Arch based distros:&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; distrobox podman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Fedora Silverblue, Podman is installed by default. The rest is layering Distrobox:&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;rpm-ostree &lt;span class="nb"&gt;install &lt;/span&gt;distrobox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You need to reboot to use the layered package.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Configure Distrobox to Use Podman
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'container_manager="podman"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.config/distrobox/distrobox.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Create a Container 📦️
&lt;/h2&gt;

&lt;p&gt;I use openSUSE container image because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It has &lt;strong&gt;&lt;a href="https://search.brave.com/search?q=x86-64-v3&amp;amp;source=desktop&amp;amp;conversation=d2b0abd8e003bcaa5c9563&amp;amp;summary=1" rel="noopener noreferrer"&gt;x86-x64-v3&lt;/a&gt;&lt;/strong&gt; packages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It uses a rolling release model, so I don't have to worry about the EOL date of the image/OS, hence eliminated the necessarily of upgrading my container. Basically, it's the setup that you can forget about it once it's done 😁&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;distrobox-create &lt;span class="nt"&gt;-i&lt;/span&gt; registry.opensuse.org/opensuse/distrobox:latest &lt;span class="nt"&gt;-n&lt;/span&gt; email-dbx &lt;span class="nt"&gt;-H&lt;/span&gt; ~/distrobox/email-dbx &lt;span class="nt"&gt;--volume&lt;/span&gt; /run/dbus/system_bus_socket:/run/dbus/system_bus_socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Don't forget to add &lt;code&gt;--nvidia&lt;/code&gt; if you have NVIDIA GPU. See more &lt;strong&gt;&lt;a href="https://github.com/89luca89/distrobox/blob/main/docs/usage/distrobox-create.md#nvidia-integration" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Enable x86-64-v3 Packages
&lt;/h2&gt;

&lt;p&gt;Enter the container and update all the packages first:&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;zypper dup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable x86-64-v3 packages:&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;zypper &lt;span class="nb"&gt;install &lt;/span&gt;patterns-glibc-hwcaps-x86_64_v3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Install Required Packages
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;zypper &lt;span class="nb"&gt;install &lt;/span&gt;zenity mozilla-nspr mozilla-nss libcanberra-gtk3-module libwebkitgtk-6_0-4 libgbm1 libtidy58 libcurl4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. [optional] Symlink fonts and fontconfig Directories on the Host
&lt;/h2&gt;

&lt;p&gt;This is usually necessary for multilingual individuals if they want to change the font for a specific language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make the Required Directories Inside the Container
&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.local/share
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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; ~/.config/fontconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Symlink With the Host
&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;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /var/home/archerallstars/.local/share/fonts ~/.local/share/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /var/home/archerallstars/.config/fontconfig/conf.d ~/.config/fontconfig/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Replace &lt;code&gt;/var/home/archerallstars&lt;/code&gt; with your home directory!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Install Mailspring
&lt;/h2&gt;

&lt;p&gt;Simply go to the &lt;strong&gt;&lt;a href="https://www.getmailspring.com/download" rel="noopener noreferrer"&gt;&lt;em&gt;official&lt;/em&gt; download page&lt;/a&gt;&lt;/strong&gt; and download the &lt;code&gt;.rpm&lt;/code&gt; package.&lt;/p&gt;

&lt;p&gt;You can install any &lt;code&gt;.rpm&lt;/code&gt; packages locally (inside the container) with:&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;zypper &lt;span class="nb"&gt;install&lt;/span&gt; ./&amp;lt;package-name&amp;gt;.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;zypper &lt;span class="nb"&gt;install&lt;/span&gt; ./mailspring-1.19.0-0.1.x86_64.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;When you're being asked about the package's signature, just ignore it (hit &lt;code&gt;i&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  8. Export Mailspring to the Host
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;distrobox-export &lt;span class="nt"&gt;-a&lt;/span&gt; mailspring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the app's icon on your app drawer on the host now.&lt;/p&gt;

&lt;p&gt;Exit the container with &lt;code&gt;exit&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Make Mailspring Follow the System’s Light/Dark Theme
&lt;/h2&gt;

&lt;p&gt;Many thanks to &lt;strong&gt;&lt;a href="https://gitlab.com/andrewminion" rel="noopener noreferrer"&gt;Andrew Minion&lt;/a&gt;&lt;/strong&gt; and his &lt;strong&gt;&lt;a href="https://gitlab.com/andrewminion/mailspring-automatic-light-dark-mode" rel="noopener noreferrer"&gt;Mailspring Automatic Light-Dark Mode&lt;/a&gt;&lt;/strong&gt; plug-in.&lt;/p&gt;

&lt;p&gt;Simply download or clone the repo directory, then copy the entire directory to &lt;code&gt;~/distrobox/email-dbx/.config/Mailspring/packages&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then, in the Mailspring app, from the menu bar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer &amp;gt; Install a Plugin...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Choose the plug-in directory in &lt;code&gt;~/distrobox/email-dbx/.config/Mailspring/packages&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The plug-in works instantly without having to restart the app. You can try switching your system theme between light and dark.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After this, you can hide the &lt;em&gt;ancient&lt;/em&gt; menu bar, as shown in the screenshot below:&lt;/p&gt;
&lt;/blockquote&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%2F0yv9qqo14254q20s4z46.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%2F0yv9qqo14254q20s4z46.png" alt="Hidding the ancient menu bar" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Toggle the menu bar with &lt;code&gt;Alt&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  10. Start Mailspring in the Background on Startup
&lt;/h2&gt;

&lt;p&gt;We'll use the &lt;code&gt;systemd&lt;/code&gt; for this.&lt;/p&gt;

&lt;p&gt;The service file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/mailspring.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Mailspring
&lt;span class="nt"&gt;RequiresMountsFor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/run/user/1000/containers

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="nt"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;exec
&lt;span class="nt"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/usr/bin/distrobox-enter  -n email-dbx  --   mailspring --background
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The timer file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/mailspring.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Start Mailspring service with some delay.

&lt;span class="k"&gt;[Timer]&lt;/span&gt;
&lt;span class="nt"&gt;OnStartupSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;40
&lt;span class="nt"&gt;RandomizedDelaySec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;10
&lt;span class="nt"&gt;Persistent&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;true

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="nt"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;timers.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload and enable the timer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nb"&gt;enable &lt;/span&gt;mailspring.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  11. Update the Container Automatically, Zero Maintenance!
&lt;/h2&gt;

&lt;p&gt;This will automatically update &lt;em&gt;all&lt;/em&gt; &lt;strong&gt;rootless&lt;/strong&gt; Distrobox containers on your system!&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a User &lt;code&gt;systemd&lt;/code&gt; Service on the Host
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/dbx-upgrade.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the service file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Upgrade all Distrobox containers
&lt;span class="nt"&gt;RequiresMountsFor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/run/user/1000/containers
&lt;span class="nt"&gt;StartLimitBurst&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;3
&lt;span class="nt"&gt;StartLimitIntervalSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;600

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="nt"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;exec
&lt;span class="nt"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;sh -c "distrobox-upgrade --all"
&lt;span class="nt"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;on-failure
&lt;span class="nt"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the timer file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Start Distrobox containers upgrade service with some delay.

&lt;span class="k"&gt;[Timer]&lt;/span&gt;
&lt;span class="nt"&gt;OnStartupSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;45
&lt;span class="nt"&gt;RandomizedDelaySec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;15
&lt;span class="nt"&gt;Persistent&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;true

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="nt"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;timers.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload and enable the timer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nb"&gt;enable &lt;/span&gt;dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Cover Photo&lt;/strong&gt; by &lt;strong&gt;&lt;a href="https://unsplash.com/@utsavsrestha?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Utsav Srestha&lt;/a&gt;&lt;/strong&gt; on &lt;strong&gt;&lt;a href="https://unsplash.com/photos/blue-0204-locker-6HH8txwF2_U?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>linux</category>
      <category>opensource</category>
    </item>
    <item>
      <title>My Opinionated Fedora Silverblue Setup</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Sat, 27 Dec 2025 23:06:08 +0000</pubDate>
      <link>https://forem.com/archerallstars/my-opinionated-fedora-silverblue-setup-4o9p</link>
      <guid>https://forem.com/archerallstars/my-opinionated-fedora-silverblue-setup-4o9p</guid>
      <description>&lt;p&gt;This is intended to be my personal note of what I will do after installing Fedora Silverblue.&lt;/p&gt;

&lt;p&gt;But why does it have to be Fedora Silverblue?&lt;/p&gt;

&lt;p&gt;Because it's so simple to use, i.e., it's so simple to debug, since the core is immutable and the update process is atomic. Moreover, as &lt;em&gt;almost&lt;/em&gt; everything is being layered on the base system, you can start anew easily without affecting the base system in anyway, doesn't leave any residues, etc. even the config files...&lt;/p&gt;

&lt;p&gt;Basically, it's a system that you or your mom/grandma can't break.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Enable Transparent Disk Compression&lt;/li&gt;
&lt;li&gt;Using a Secure DNS Resolver&lt;/li&gt;
&lt;li&gt;Enable BBR, a Better Network Congestion Control Algorithm&lt;/li&gt;
&lt;li&gt;Enable &lt;code&gt;ptrace_scope = 1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Changing the Default ZRAM Configuration&lt;/li&gt;
&lt;li&gt;Enable RPM Fusion for Nonfree Codecs&lt;/li&gt;
&lt;li&gt;Removing All the Apps From Fedora’s Flatpak and Disable the Repo Entirely From the App Store&lt;/li&gt;
&lt;li&gt;Removing All the Unused Apps From the Default Image (Base System)&lt;/li&gt;
&lt;li&gt;Enable the System’s Auto-Update&lt;/li&gt;
&lt;li&gt;[Bonus] GNOME Extensions That I Use&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Enable Transparent Disk Compression
&lt;/h2&gt;

&lt;p&gt;Sadly, this technology that's available natively with Btrfs file system that the system uses is &lt;em&gt;not&lt;/em&gt; enabled by default.&lt;/p&gt;

&lt;p&gt;As someone who wants to save his disk space whenever it's possible, so I enable it.&lt;/p&gt;

&lt;p&gt;First, find out your current kernel boot parameters (to avoid duplicates):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpm-ostree kargs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should return many parameters, including &lt;code&gt;rootflags=subvol=root&lt;/code&gt; to which is our target for enabling the compression. &lt;/p&gt;

&lt;p&gt;You can simply &lt;em&gt;append&lt;/em&gt; your custom parameters after the ones from the default configuration that's can't be replaced or deleted for obvious reason 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;&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm-ostree kargs &lt;span class="nt"&gt;--append&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"rootflags=subvol=root,compress=zstd:1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, reboot the system for it to take effect.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I use the compression level &lt;code&gt;1&lt;/code&gt; instead of the default (&lt;code&gt;3&lt;/code&gt;), that's because it uses the least CPU time while providing a reasonable compression ratio, see more on &lt;a href="https://hackmd.io/kIMJv7yHSiKoAq1MPcCMdw" rel="noopener noreferrer"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also add other kernel boot parameters with the same command, for example, &lt;code&gt;snd-intel-dspcfg.dsp_driver=1&lt;/code&gt; to use the HD Audio driver instead of the default AVS driver on some old Intel hardware, at least until &lt;strong&gt;&lt;a href="https://github.com/alsa-project/alsa-ucm-conf/pull/571" rel="noopener noreferrer"&gt;this issue&lt;/a&gt;&lt;/strong&gt; is sorted out.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Compress Existing Data
&lt;/h3&gt;

&lt;p&gt;The above command will only compress &lt;em&gt;new&lt;/em&gt; data. To compress existing data:&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;btrfs filesystem defragment &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nt"&gt;-czstd&lt;/span&gt; /var
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Using a Secure DNS Resolver
&lt;/h2&gt;

&lt;p&gt;I wrote about this in detail &lt;strong&gt;&lt;a href="https://dev.to/archerallstars/how-to-manage-wireguard-vpn-connection-in-gnome-without-the-wireguard-tools-1od5"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure &lt;code&gt;/etc/systemd/resolved.conf&lt;/code&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;nano /etc/systemd/resolved.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Resolve]
DNSOverTLS=opportunistic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;I use &lt;code&gt;DNSOverTLS=opportunistic&lt;/code&gt; because it's the only way currently to have both &lt;em&gt;non-leaking&lt;/em&gt; DNS when using a VPN (with its own DNS) and to be able to configure your preferred &lt;em&gt;secure&lt;/em&gt; DNS in the settings' GUI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you use &lt;code&gt;DNSOverTLS=no&lt;/code&gt; (the default value), you have non-leaking DNS when using a VPN (with its own DNS), but you won't be able to configure any secure DNS in the GUI at all.&lt;/p&gt;

&lt;p&gt;If you use &lt;code&gt;DNSOverTLS=yes&lt;/code&gt;, you won't be able to use VPN with its DNS setup, hence forcing to be leaked. Also, you won't be able to configure any secure DNS in the GUI at all. This is the &lt;em&gt;worst&lt;/em&gt; setup!&lt;/p&gt;

&lt;p&gt;At least, this is the situation currently in Fedora Silverblue.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Just make sure to configure your preferred secure DNS in the GUI as per connection. But if you don't use VPN, you can just use &lt;code&gt;DNSOverTLS=yes&lt;/code&gt; and have your secure DNS set up in &lt;code&gt;/etc/systemd/resolved.conf&lt;/code&gt; globally. See more &lt;strong&gt;&lt;a href="https://dev.to/archerallstars/using-dns-over-tls-on-opensuse-linux-in-4-easy-steps-enable-cloud-firewall-for-free-today-2job"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lastly, restart &lt;code&gt;systemd-resolved&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;systemctl restart systemd-resolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure Your Preferred DNS Resolver in the GUI
&lt;/h3&gt;

&lt;p&gt;For example, using Cloudflare (with malware filtering) as your DNS resolver:&lt;/p&gt;

&lt;h4&gt;
  
  
  IPv4
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.1.1.2, 1.0.0.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fmj5mpg36vyut3tqwe0c0.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%2Fmj5mpg36vyut3tqwe0c0.png" alt="IPv4" width="800" height="713"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  IPv6
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2606:4700:4700::1112, 2606:4700:4700::1002
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fx7tbttxz27c88a853ngl.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%2Fx7tbttxz27c88a853ngl.png" alt="IPv6" width="800" height="713"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Enable BBR, a Better Network Congestion Control Algorithm
&lt;/h2&gt;

&lt;p&gt;I wrote about this in detail &lt;strong&gt;&lt;a href="https://dev.to/archerallstars/enable-bbr-a-better-network-congestion-control-algorithm-from-google-on-linux-2pgl"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable the Module
&lt;/h3&gt;

&lt;p&gt;Check whether the module is already enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;bbr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it doesn't return anything, you must enable tcp_bbr module first:&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;"tcp_bbr"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/modules-load.d/bbr.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, reboot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Change the Congestion Control Algorithm to BBR
&lt;/h3&gt;

&lt;p&gt;Edit the &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; file:&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;nano /etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reboot the system again. Then, check the current congestion control algorithm with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sysctl net.ipv4.tcp_congestion_control
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Enable &lt;code&gt;ptrace_scope = 1&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This is necessary to get a complete sandboxing in Chromium-base browsers. It's enabled by default in &lt;strong&gt;&lt;a href="https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace_Protection" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://man.archlinux.org/man/ptrace.2.en#/proc/sys/kernel/yama/ptrace_scope" rel="noopener noreferrer"&gt;Arch&lt;/a&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;a href="https://bugzilla.suse.com/show_bug.cgi?id=1217051" rel="noopener noreferrer"&gt;openSUSE&lt;/a&gt;&lt;/strong&gt; (from my request 😄).&lt;/p&gt;

&lt;p&gt;I wrote about this in detail &lt;strong&gt;&lt;a href="https://dev.to/archerallstars/the-complete-guide-to-containerize-any-chromium-browsers-using-distrobox-on-any-linux-distros-3j3m"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check Your Current &lt;code&gt;ptrace_scope&lt;/code&gt; Value
&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;cat&lt;/span&gt; /proc/sys/kernel/yama/ptrace_scope
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enable &lt;code&gt;ptrace_scope = 1&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;If it's not enable yet (returns &lt;code&gt;0&lt;/code&gt; from the above command), copying the default config file and edit it:&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 cp&lt;/span&gt; /usr/lib/sysctl.d/10-default-yama-scope.conf /etc/sysctl.d/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;nano /etc/sysctl.d/10-default-yama-scope.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Changing the last line from &lt;code&gt;kernel.yama.ptrace_scope = 0&lt;/code&gt; to &lt;code&gt;kernel.yama.ptrace_scope = 1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then, reboot.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Changing the Default ZRAM Configuration
&lt;/h2&gt;

&lt;p&gt;It's a good thing that Fedora enabled ZRAM by default, but I find it's too conservative, especially for a system that doesn't have a lot of RAM.&lt;/p&gt;

&lt;p&gt;So, I make it &lt;strong&gt;1.5x&lt;/strong&gt; the amount of my physical RAM. And I also set the &lt;code&gt;swap-priority = 100&lt;/code&gt;, as ZRAM doesn't use [slowish]disk as a swap medium; therefore, I want to swap (compress the data on RAM) ASAP, so it won't use a ton of CPU time all at once when the system already has very little resource left to do anything, if at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a New Configuration File
&lt;/h3&gt;

&lt;p&gt;Fedora uses &lt;code&gt;zram-generator&lt;/code&gt; to manage its ZRAM configuration. First, we'll create a directory for a new rule that will override the default configuration:&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 mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/systemd/zram-generator.conf.d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, create a config file:&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;nano /etc/systemd/zram-generator.conf.d/zram-generator.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[zram0]
zram-size = ram * 1.5
compression-algorithm = zstd
swap-priority = 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adding Some Secret Sauce
&lt;/h3&gt;

&lt;p&gt;Thanks to the optimization effort to improve system responsiveness under memory pressure, particularly for desktops with compressed swap in RAM &lt;strong&gt;&lt;a href="https://github.com/pop-os/default-settings/pull/163" rel="noopener noreferrer"&gt;by Pop!_OS&lt;/a&gt;&lt;/strong&gt;, I use this secret sauce with all my Linux systems too!&lt;/p&gt;

&lt;h4&gt;
  
  
  Editing &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; File
&lt;/h4&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;nano /etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vm.page-cluster=0
vm.swappiness=180
vm.watermark_boost_factor=0
vm.watermark_scale_factor=125
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, reboot the system.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Enable RPM Fusion for Nonfree Codecs
&lt;/h2&gt;

&lt;p&gt;You might have heard from some strange people telling you to use Flatpak apps.&lt;/p&gt;

&lt;p&gt;The problem is not media consumption, which can be done through Flatpak or a Distrobox container, like I wrote &lt;strong&gt;&lt;a href="https://dev.to/archerallstars/install-the-official-build-of-mpv-media-player-on-any-linux-distribution-4ifg"&gt;here&lt;/a&gt;&lt;/strong&gt; in detail, but it's the ability to browse your media files in the first place. This is your file manager's responsibility, not your media player's.&lt;/p&gt;

&lt;p&gt;And that one piece of software is &lt;em&gt;not&lt;/em&gt; available in Flatpak format; see &lt;strong&gt;&lt;a href="https://gitlab.gnome.org/GNOME/nautilus/-/issues/318" rel="noopener noreferrer"&gt;GNOME Files issue #318&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Therefore, in order to have most of your media files showing their thumbnails in your file manager, like they are on our phones universally, you need to add RPM Fusion into your system. There's no other way.&lt;/p&gt;

&lt;p&gt;To install RPM Fusion on your system, please refer to the official RPM Fusion doc specifically for OSTree system &lt;strong&gt;&lt;a href="https://rpmfusion.org/Howto/OSTree" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Removing All the Apps From Fedora’s Flatpak and Disable the Repo Entirely From the App Store
&lt;/h2&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%2F95e9ambkwqxx4a4zypa5.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%2F95e9ambkwqxx4a4zypa5.png" alt="Fedora's Flatpak repo disabled" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This can be done through GNOME Software GUI, as shown in the screenshot above. You can reinstall these apps from &lt;strong&gt;&lt;a href="https://flathub.org/en" rel="noopener noreferrer"&gt;Flathub&lt;/a&gt;&lt;/strong&gt; if necessary. &lt;/p&gt;

&lt;p&gt;In my honest opinion, Fedora's Flatpak is &lt;em&gt;useless&lt;/em&gt; and &lt;em&gt;has no real value&lt;/em&gt; for end-users. It's a painful, wasteful step that Fedora users have to do after the installation. For example, see &lt;strong&gt;&lt;a href="https://itsfoss.com/news/obs-studio-fedora-feud/" rel="noopener noreferrer"&gt;this recent drama&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It should be noted that, contrary to Flathub, Fedora's Flatpak has the same limitation regarding proprietary codecs as Fedora's native RPM packages. Therefore, remove it from your system, it has zero benefit.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Removing All the Unused Apps From the Default Image (Base System)
&lt;/h2&gt;

&lt;p&gt;What if you want to remove some apps from the base immutable image? For example, I don't use Firefox and don't want to support its nutjobs in any way. Here's how to remove it:&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;rpm-ostree override remove firefox firefox-langpacks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, reboot the system.&lt;/p&gt;

&lt;p&gt;Now, you can simply check your image status with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpm-ostree status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This one command can help you identify most issues or feature parity with other systems that use the same image. This is why it's so easy to debug.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can also layer any packages you want if they need to be installed on the system level. You will most likely want to install &lt;code&gt;distrobox&lt;/code&gt; for example:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&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;rpm-ostree &lt;span class="nb"&gt;install &lt;/span&gt;distrobox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Only install packages using this method when it's necessary.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Enable the System’s Auto-Update
&lt;/h2&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%2Fztq8idbq6eftrzfyosx4.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%2Fztq8idbq6eftrzfyosx4.png" alt="GNOME Software" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please note that enabling the &lt;em&gt;automatic&lt;/em&gt; software updates option in GNOME Software will &lt;em&gt;NOT&lt;/em&gt; automatically update your system.&lt;/p&gt;

&lt;p&gt;And unfortunately, there's no mention of the automatic update anywhere on &lt;strong&gt;&lt;a href="https://docs.fedoraproject.org/en-US/fedora-silverblue/updates-upgrades-rollbacks/" rel="noopener noreferrer"&gt;the official docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's how to make your system automatically downloads and stages updates without you ever having to do anything:&lt;/p&gt;

&lt;h3&gt;
  
  
  Set &lt;code&gt;AutomaticUpdatePolicy&lt;/code&gt; in &lt;code&gt;/etc/rpm-ostreed.conf&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Change the policy to &lt;code&gt;stage&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;nano /etc/rpm-ostreed.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AutomaticUpdatePolicy=stage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reload &lt;code&gt;rpm-ostree&lt;/code&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;rpm-ostree reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enable &lt;code&gt;rpm-ostreed-automatic.timer&lt;/code&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;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;rpm-ostreed-automatic.timer &lt;span class="nt"&gt;--now&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You can check the automatic update status with:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpm-ostree status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If enabled correctly, it should return something like this:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AutomaticUpdates: stage; rpm-ostreed-automatic.timer: last run 3h 4min ago
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. [Bonus] GNOME Extensions That I Use
&lt;/h2&gt;

&lt;p&gt;These extensions that I use are not intended to change the designed GNOME experience. I like GNOME UX and UI philosophy. But I think they are necessary in my workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  AppIndicator and KStatusNotifierItem Support
&lt;/h3&gt;

&lt;p&gt;This one adds system tray support in GNOME. It's developed by Ubuntu, so you can expect a good support and maintenance. &lt;strong&gt;&lt;a href="https://github.com/ubuntu/gnome-shell-extension-appindicator" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  GJS OSK
&lt;/h3&gt;

&lt;p&gt;One weakness of GNOME is its onscreen keyboard, even though it's designed with touch screen usage in mind 😂 It isn't even usable in all apps, e.g., non-GTK apps.&lt;/p&gt;

&lt;p&gt;This one adds a much better onscreen keyboard to the system and can be used in all apps. &lt;strong&gt;&lt;a href="https://github.com/Vishram1123/gjs-osk" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Legacy (GTK3) Theme Scheme Auto Switcher
&lt;/h3&gt;

&lt;p&gt;It changes the GTK3 (legacy) theme variant to light/dark when the scheme is changed from Settings.&lt;/p&gt;

&lt;p&gt;When paring with &lt;strong&gt;&lt;a href="https://github.com/lassekongo83/adw-gtk3" rel="noopener noreferrer"&gt;adw-gtk3&lt;/a&gt;&lt;/strong&gt; theme, all the GTK3 apps blend nicely with Adwaita apps, and they also follow your system's light/dark theme. &lt;strong&gt;&lt;a href="https://github.com/mukul29/legacy-theme-auto-switcher-gnome-extension" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Light Style
&lt;/h3&gt;

&lt;p&gt;This one adds light theme to the top bar and its panels. It's developed and maintained by GNOME, so long time support can be expected. &lt;strong&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-shell-extensions" rel="noopener noreferrer"&gt;GitLab repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lock Keys
&lt;/h3&gt;

&lt;p&gt;This one shows numlock and capslock status on the panel. So, it's harder for you to mistype your password accidentally. &lt;strong&gt;&lt;a href="https://github.com/kazysmaster/gnome-shell-extension-lockkeys" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Unblank Lock Screen
&lt;/h3&gt;

&lt;p&gt;In order to prevent my laptop from crashing when the display is blanked (it happens randomly even on Windows!), this extension allows me to use lock screen again, as it unblanks my display when my lock screen kicks in! &lt;strong&gt;&lt;a href="https://github.com/sunwxg/gnome-shell-extension-unblank" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Weather O'Clock
&lt;/h3&gt;

&lt;p&gt;This one is nice to have. It displays the current weather info next to the top bar's clock. &lt;strong&gt;&lt;a href="https://github.com/CleoMenezesJr/weather-oclock" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Cover Photo&lt;/strong&gt; by &lt;a href="https://unsplash.com/@alexacea?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Alexandru Acea&lt;/strong&gt;&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/turned-on-flat-screen-tv--WBYxmW4yuw?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Unsplash&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Install Steam in a Distrobox Container With x86-64-v3 Power Boost!</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Sun, 21 Dec 2025 07:05:12 +0000</pubDate>
      <link>https://forem.com/archerallstars/install-steam-in-a-distrobox-container-with-x86-64-v3-power-boost-2am0</link>
      <guid>https://forem.com/archerallstars/install-steam-in-a-distrobox-container-with-x86-64-v3-power-boost-2am0</guid>
      <description>&lt;p&gt;Like always, I prefer to install any app in a manageable way, i.e., layer on the base system without altering the base in any way or leaving a lot of residue upon uninstallation.&lt;/p&gt;

&lt;p&gt;Moreover, you can choose to use any images you want regardless of your base system. For example, you can use the &lt;em&gt;official&lt;/em&gt; CachyOS image that provides &lt;strong&gt;x86-64-v3 optimized packages&lt;/strong&gt;, hence improving gaming performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Installing Distrobox and Podman
&lt;/h2&gt;

&lt;p&gt;The command will differ based on your specific package manager. Refer to your distro's docs. For example, on Arch based distros:&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; distrobox podman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Configure Distrobox to use Podman
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'container_manager="podman"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.config/distrobox/distrobox.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Create a container
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;distrobox-create &lt;span class="nt"&gt;-i&lt;/span&gt; docker.io/cachyos/cachyos-v3:latest &lt;span class="nt"&gt;-n&lt;/span&gt; games-dbx &lt;span class="nt"&gt;-H&lt;/span&gt; ~/distrobox/games-dbx &lt;span class="nt"&gt;--additional-flags&lt;/span&gt; &lt;span class="s2"&gt;"--dns=none"&lt;/span&gt; &lt;span class="nt"&gt;--volume&lt;/span&gt; /run/dbus/system_bus_socket:/run/dbus/system_bus_socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;I use the &lt;code&gt;--dns=none&lt;/code&gt; flag because I want to go as light as possible by not using an &lt;code&gt;init&lt;/code&gt; container (a container with its own &lt;code&gt;systemd&lt;/code&gt;). Without this flag, Steam will try to find &lt;code&gt;systemd-resolved&lt;/code&gt;, of which doesn't exist obviously, and won't be able to launch successfully.&lt;/p&gt;

&lt;p&gt;Without &lt;code&gt;systemd&lt;/code&gt; inside the container, Steam will always show UTC time instead of your local time in Big Picture Mode, see &lt;strong&gt;&lt;a href="https://github.com/ValveSoftware/steam-for-linux/issues/10057#issuecomment-2135487109" rel="noopener noreferrer"&gt;Steam issue #10057&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; For NVIDIA users, in order to use the GPU inside the container, you need to add &lt;code&gt;--nvidia&lt;/code&gt; flag to the &lt;code&gt;distrobox-create&lt;/code&gt; command. See more &lt;strong&gt;&lt;a href="https://github.com/89luca89/distrobox/blob/main/docs/useful_tips.md#using-the-gpu-inside-the-container" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Enable x86-64-v3 packages
&lt;/h2&gt;

&lt;p&gt;Once the container is created, enter the container and enable x86-64-v3 packages:&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;-Syu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;-Qqn&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Generating the container's locales
&lt;/h2&gt;

&lt;p&gt;First, install &lt;code&gt;nano&lt;/code&gt; to be able to edit &lt;code&gt;/etc/locale.gen&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; nano
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, editing &lt;code&gt;/etc/locale.gen&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;nano /etc/locale.gen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uncomment (removing &lt;code&gt;#&lt;/code&gt;) from &lt;code&gt;en_US.UTF-8 UTF-8&lt;/code&gt; line. Also, if your local language is differ, uncomment your local language too. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;en_US.UTF-8 UTF-8
th_TH.UTF-8 UTF-8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lastly, generating locales:&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;locale-gen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Install Steam!
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;p&gt;If you're asked during the installation,...&lt;/p&gt;

&lt;p&gt;About the font, I use &lt;strong&gt;Noto&lt;/strong&gt; font.&lt;/p&gt;

&lt;p&gt;About which Vulkan to use, use your vendor's Vulkan. It should be obvious enough, for example, &lt;code&gt;vulkan-intel&lt;/code&gt; (or &lt;code&gt;lib32-vulkan-intel&lt;/code&gt;).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please use everything from CachyOS repository if being asked.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Export Steam inside the container to the host
&lt;/h2&gt;

&lt;p&gt;Run this inside the container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;distrobox-export &lt;span class="nt"&gt;-a&lt;/span&gt; steam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this, you will be able to launch Steam on the host, i.e., with Steam icon on the host.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If Steam fails to start occasionally, you might want to edit the execution command in the desktop file a bit:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Find Steam's desktop file in &lt;code&gt;~/.local/share/applications/&lt;/code&gt; on the host, then edit the first &lt;code&gt;Exec=&lt;/code&gt; line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Exec=bash -c 'echo "Y" | distrobox-stop games-dbx &amp;amp;&amp;amp; distrobox-enter games-dbx -- /usr/bin/steam' %U
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will stop the container first before entering it and launch Steam.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Auto-update the container, zero maintenance time!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create a &lt;code&gt;systemd&lt;/code&gt; service file:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/dbx-upgrade.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the service file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Upgrade all Distrobox containers
RequiresMountsFor=/run/user/1000/containers
StartLimitBurst=3
StartLimitIntervalSec=600

[Service]
Type=exec
ExecStart=sh -c "distrobox-upgrade --all"
Restart=on-failure
RestartSec=60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a &lt;code&gt;systemd&lt;/code&gt; timer file:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the timer file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Start Distrobox containers upgrade service with some delay.

[Timer]
OnStartupSec=30
RandomizedDelaySec=15
Persistent=true

[Install]
WantedBy=timers.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reload and enable the timer:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nb"&gt;enable &lt;/span&gt;dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  BONUS: Increase &lt;code&gt;vm.max_map_count&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;According to &lt;strong&gt;&lt;a href="https://wiki.archlinux.org/title/Steam" rel="noopener noreferrer"&gt;Arch Wiki&lt;/a&gt;&lt;/strong&gt;, it's recommended to increase the &lt;code&gt;vm.max_map_count&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This one has to be done on the host and the container will follow automatically. The procedure should be the same across all distros.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;sysctl&lt;/code&gt; rule:&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;nano /etc/sysctl.d/99-gamecompatibility.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;vm.max_map_count = 2147483642&lt;/code&gt; in the file.&lt;/p&gt;

&lt;p&gt;Then, apply the change immediately with:&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;sysctl &lt;span class="nt"&gt;--system&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;With this, you should be able to run Steam inside a container. Enjoy!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Cover Photo&lt;/strong&gt; by &lt;a href="https://unsplash.com/@alteredpoint?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Igor Saikin&lt;/strong&gt;&lt;/a&gt; on &lt;strong&gt;&lt;a href="https://unsplash.com/photos/three-old-crt-monitors-display-a-line-8LE9Z6Kx7XQ?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;      &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>archlinux</category>
      <category>containers</category>
    </item>
    <item>
      <title>Enable BBR, a Better Network Congestion Control Algorithm From Google on Linux</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Wed, 05 Nov 2025 03:07:39 +0000</pubDate>
      <link>https://forem.com/archerallstars/enable-bbr-a-better-network-congestion-control-algorithm-from-google-on-linux-2pgl</link>
      <guid>https://forem.com/archerallstars/enable-bbr-a-better-network-congestion-control-algorithm-from-google-on-linux-2pgl</guid>
      <description>&lt;p&gt;&lt;strong&gt;TCP BBR&lt;/strong&gt; (Bottleneck Bandwidth and Round-trip propagation time) is a congestion control algorithm developed by Google to improve internet performance by focusing on actual network conditions rather than relying solely on packet loss as a signal to reduce transmission speed.&lt;/p&gt;

&lt;p&gt;It can significantly improve throughput compared to traditional algorithms like CUBIC, with improvements ranging from 2 to 25 times.&lt;/p&gt;

&lt;p&gt;BBR is also used on Google Search and YouTube servers, resulting in a 4% average global increase in YouTube network throughput and over 14% improvement in some countries. Meaning, it has been used (not only tested/experimented) on a global scale!&lt;/p&gt;

&lt;p&gt;Therefore, it would be wised to enable BBR in your system, especially if you're on a wireless network with a lot of packet loss.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that you need Linux kernel version 4.9+ for BBR v1, or 5.18+ for BBR v2.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Enable the Module
&lt;/h2&gt;

&lt;p&gt;Check whether the module is already enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;bbr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the module is loaded, it should return something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tcp_bbr                20480  26
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can skip to the next step.&lt;/p&gt;

&lt;p&gt;If it doesn't return anything, you must enable &lt;code&gt;tcp_bbr&lt;/code&gt; module first:&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;"tcp_bbr"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/modules-load.d/bbr.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reboot. Then, check if &lt;code&gt;bbr&lt;/code&gt; is listed as one of the congestion control algorithms:&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; /proc/sys/net/ipv4/tcp_available_congestion_control
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should return 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;reno cubic bbr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Change the Congestion Control Algorithm to BBR
&lt;/h2&gt;

&lt;p&gt;You can use &lt;code&gt;nano&lt;/code&gt; or your preferred text editor to edit the &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; file:&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;nano /etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reboot the system. Then, check the current congestion control algorithm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sysctl net.ipv4.tcp_congestion_control
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;net.ipv4.tcp_congestion_control = bbr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note that even though it has &lt;code&gt;ipv4&lt;/code&gt; in the name, it applies to IPv6 as well.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;You can notice that I also enabled the fair queueing packet scheduler (&lt;code&gt;qdisc&lt;/code&gt;) as well with &lt;code&gt;net.core.default_qdisc = fq&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;It's a match made in heaven for BBR. For example:&lt;/p&gt;

&lt;p&gt;Without the fair queueing (traditional &lt;code&gt;qdiscs&lt;/code&gt; like &lt;code&gt;pfifo_fast&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BBR wants to send at 950 Mbps
↓
Kernel qdisc can't pace → bursts 1 Gbps for 100ms → queue builds → 200ms latency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the fair queueing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BBR wants to send at 950 Mbps
↓
FQ paces exactly 950 Mbps → no bursts → queue stays &amp;lt;1ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Thanks for reading 🙏 God bless ✝️&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Cover Photo&lt;/strong&gt; by &lt;a href="https://unsplash.com/@shiwa_id?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Shiwa ID&lt;/strong&gt;&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/black-and-silver-laptop-computer-kxqgk1lKSsY?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Unsplash&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>linux</category>
      <category>networking</category>
    </item>
    <item>
      <title>How to Manage WireGuard VPN Connection in GNOME Without the wireguard-tools</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Sat, 18 Oct 2025 00:30:33 +0000</pubDate>
      <link>https://forem.com/archerallstars/how-to-manage-wireguard-vpn-connection-in-gnome-without-the-wireguard-tools-1od5</link>
      <guid>https://forem.com/archerallstars/how-to-manage-wireguard-vpn-connection-in-gnome-without-the-wireguard-tools-1od5</guid>
      <description>&lt;p&gt;If you want to use/connect to VPN without installing the VPN client on your system, the common way to do it is through the WireGuard configuration file.&lt;/p&gt;

&lt;p&gt;This's more preferable on an immutable OS, e.g. Fedora Silverblue, unless the VPN provider you're using has their client &lt;em&gt;officially&lt;/em&gt; available on Flathub.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why not &lt;code&gt;wireguard-tools&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Because using the WireGuard configuration file in GUI (GNOME's network settings) is easier and faster.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Set Up &lt;code&gt;systemd-resolved&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;systemd-resolved&lt;/code&gt; is enabled by default in Fedora Silverblue. So, you only have to set up its configure file right.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;DNSOverTLS=opportunistic&lt;/code&gt; is Your Best Friend
&lt;/h3&gt;

&lt;p&gt;Because it's the only way currently to have both &lt;em&gt;non-leaking&lt;/em&gt; DNS when using a VPN (with its own DNS) and to be able to configure your preferred &lt;em&gt;secure&lt;/em&gt; DNS in the settings' GUI.&lt;/p&gt;

&lt;p&gt;If you use &lt;code&gt;DNSOverTLS=no&lt;/code&gt; (the default value), you have non-leaking DNS when using a VPN (with its own DNS), but you won't be able to configure any secure DNS in the GUI at all.&lt;/p&gt;

&lt;p&gt;If you use &lt;code&gt;DNSOverTLS=yes&lt;/code&gt;, you won't be able to use VPN with its DNS setup, hence forcing to be leaked. Also, you won't be able to configure any secure DNS in the GUI at all. I would say, this is the worst setup!&lt;/p&gt;

&lt;p&gt;But if you don't use VPN, you can just use &lt;code&gt;DNSOverTLS=yes&lt;/code&gt; and have your secure DNS set up directly in &lt;code&gt;/etc/systemd/resolved.conf&lt;/code&gt;. See more &lt;strong&gt;&lt;a href="https://dev.to/archerallstars/using-dns-over-tls-on-opensuse-linux-in-4-easy-steps-enable-cloud-firewall-for-free-today-2job"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In any case, I recommend &lt;code&gt;DNSOverTLS=opportunistic&lt;/code&gt; because of its flexibility.&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;nano /etc/systemd/resolved.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Resolve]
DNSOverTLS=opportunistic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lastly, restart &lt;code&gt;systemd-resolved&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;systemctl restart systemd-resolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Having your default DNS setup
&lt;/h2&gt;

&lt;p&gt;It's &lt;em&gt;extremely&lt;/em&gt; important to &lt;strong&gt;NOT&lt;/strong&gt; using your ISP's DNS. Why? Because it's &lt;a href="https://search.brave.com/search?q=what%27s+the+security+implication+of+unencrypted+DNS&amp;amp;source=web&amp;amp;conversation=2470c967c1a1df6953901b&amp;amp;summary=1" rel="noopener noreferrer"&gt;&lt;strong&gt;not likely going to be encrypted&lt;/strong&gt;&lt;/a&gt;. Not only that, it's prone to censorship.&lt;/p&gt;

&lt;p&gt;Please use a secure DNS from reputable providers like &lt;a href="https://developers.cloudflare.com/1.1.1.1/infrastructure/network-operators/#available-endpoints" rel="noopener noreferrer"&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/a&gt; or &lt;a href="https://quad9.net/" rel="noopener noreferrer"&gt;&lt;strong&gt;Quad9&lt;/strong&gt;&lt;/a&gt;, for example. Quad9 if you don't have Cloudflare WARP proxy setup like I wrote &lt;a href="https://dev.to/archerallstars/install-cloudflare-warp-on-any-linux-distro-thanks-to-distrobox-4dp9"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;. Otherwise, it's better to use Cloudflare, so you won't have a leak with WARP proxy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloudflare DNS
&lt;/h3&gt;

&lt;p&gt;I recommend using the Families (malware filtering) endpoint &lt;code&gt;1.1.1.2&lt;/code&gt; or &lt;code&gt;1.0.0.2&lt;/code&gt; instead of the usual &lt;code&gt;1.1.1.1&lt;/code&gt;. See more &lt;a href="https://developers.cloudflare.com/1.1.1.1/infrastructure/network-operators/#available-endpoints" rel="noopener noreferrer"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quad9
&lt;/h3&gt;

&lt;p&gt;As the name suggested, &lt;code&gt;9.9.9.9&lt;/code&gt;. Quad9 filtered out malware by default. From many tests I've seen for years, it's leading in this regard, slightly better than Cloudflare's &lt;code&gt;1.1.1.2&lt;/code&gt;. See more on &lt;a href="https://quad9.net/" rel="noopener noreferrer"&gt;&lt;strong&gt;their website&lt;/strong&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Make either of them your default DNS as per connection easily in GNOME settings
&lt;/h3&gt;

&lt;p&gt;For example, in your Wi-Fi settings, put in the DNS's IPv4 and IPv6 accordingly:&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%2F7uy6f7ej2l9dzarjhla4.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%2F7uy6f7ej2l9dzarjhla4.png" alt="DNS IPv4" width="800" height="571"&gt;&lt;/a&gt;&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%2F3sxjlnx9y0hexlrz1sf9.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%2F3sxjlnx9y0hexlrz1sf9.png" alt="DNS IPv6" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Import your WireGuard configuration file
&lt;/h2&gt;

&lt;p&gt;You can import WireGuard configuration files directly in GNOME's network settings, and use them at will through the quick settings panel. It's that easy, no need to go through many hoops with different VPN clients.&lt;/p&gt;

&lt;p&gt;The process is straightforward enough that no screenshot is needed 😆&lt;/p&gt;

&lt;p&gt;However, there are some caveats. Check your WireGuard configuration file, make sure under the &lt;code&gt;[Interface]&lt;/code&gt; section, the DNS line should exist or not commented out. Otherwise, your VPN connection will regress back to the default DNS address in the previous step, hence leaking.&lt;/p&gt;

&lt;p&gt;The best place to check your public IP and DNS addresses you're using is &lt;a href="https://dnscheck.tools/" rel="noopener noreferrer"&gt;https://dnscheck.tools/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Thanks for reading 🙏 God bless ✝️&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Cover Photo&lt;/strong&gt; by &lt;a href="https://unsplash.com/@fp4?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Gavin Allanwood&lt;/strong&gt;&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/white-and-blue-electric-cable-IPApn5olGLk?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Unsplash&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>linux</category>
      <category>networking</category>
      <category>security</category>
    </item>
    <item>
      <title>Here's How to Change GNOME Fractal's Font Size</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Fri, 17 Oct 2025 01:04:52 +0000</pubDate>
      <link>https://forem.com/archerallstars/heres-how-to-change-gnome-fractals-font-size-392j</link>
      <guid>https://forem.com/archerallstars/heres-how-to-change-gnome-fractals-font-size-392j</guid>
      <description>&lt;p&gt;&lt;a href="https://flathub.org/en/apps/org.gnome.Fractal" rel="noopener noreferrer"&gt;&lt;strong&gt;Fractal&lt;/strong&gt;&lt;/a&gt; is a Matrix chat client, like &lt;a href="https://element.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Element&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://flathub.org/en/apps/in.cinny.Cinny" rel="noopener noreferrer"&gt;&lt;strong&gt;Cinny&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://flathub.org/en/apps/im.fluffychat.Fluffychat" rel="noopener noreferrer"&gt;&lt;strong&gt;FluffyChat&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are many good things with chatting in Matrix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's secure because of &lt;em&gt;E2EE&lt;/em&gt;. &lt;/li&gt;
&lt;li&gt;You can also &lt;em&gt;use any clients you want&lt;/em&gt;, provided that the one you choose implemented the security features of the Matrix protocol correctly.&lt;/li&gt;
&lt;li&gt;You can even &lt;em&gt;self-host&lt;/em&gt; it, meaning you control your data. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can't go wrong with any of them on the above. It depends on your needs and your preference. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want calling, Element and FluffyChat (experimental feature) are there for you.&lt;/li&gt;
&lt;li&gt;I like Fractal and Cinny UIs. And both of them are easy on RAM, especially Cinny. But I go with Fractal because its cross signing process is seamless. I use Element X on mobile, so I can't verify Cinny without the recovery key. Otherwise, I would go with Cinny.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;There's one &lt;em&gt;major&lt;/em&gt; issue with Fractal, though. I can't change its &lt;em&gt;tiny&lt;/em&gt; font size. Sadly, its devs &lt;a href="https://gitlab.gnome.org/World/fractal/-/issues/212#note_269979" rel="noopener noreferrer"&gt;&lt;strong&gt;mistakenly understand&lt;/strong&gt;&lt;/a&gt; that texts in chat messages should be treated the same with texts in the OS/DE user interface with all the visual aids in place.&lt;/p&gt;

&lt;p&gt;To tell you the truth, I already have 1.5x scaling on my setup. I can't go further than this with a FHD screen. Enable the "Large Text" mode would also break many apps' UI at 1.5x scaling. You can go with 1.25x scaling with the Large Text mode, of which will end up with the same font size as 1.5x scaling. So, I absolutely need a bigger text to keep my eyes healthy 👀&lt;/p&gt;

&lt;p&gt;Without further ado, here is how:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create a config file
&lt;/h2&gt;

&lt;p&gt;Assuming you install it from Flathub which is the official channel to get the app.&lt;/p&gt;

&lt;p&gt;First, create a 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; ~/.var/app/org.gnome.Fractal/config/gtk-4.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, use &lt;code&gt;nano&lt;/code&gt; or any text editor to create a config file (CSS) there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.var/app/org.gnome.Fractal/config/gtk-4.0/gtk.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Change the font size in the config file we previously created
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16pt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change your preferred &lt;code&gt;font-size&lt;/code&gt; as needed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This method should work with any GTK4 apps.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Thanks for reading 🙏&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Cover Photo&lt;/strong&gt; by &lt;a href="https://unsplash.com/@lowmurmer?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Parker Coffman&lt;/strong&gt;&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-pair-of-glasses-sitting-on-top-of-a-window-sill-XC_eF9D4qdM?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Unsplash&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>The Complete Guide to Containerize Any Chromium Browsers Using Distrobox on Any Linux Distros</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Sat, 11 Oct 2025 05:57:13 +0000</pubDate>
      <link>https://forem.com/archerallstars/the-complete-guide-to-containerize-any-chromium-browsers-using-distrobox-on-any-linux-distros-3j3m</link>
      <guid>https://forem.com/archerallstars/the-complete-guide-to-containerize-any-chromium-browsers-using-distrobox-on-any-linux-distros-3j3m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: As of Chrome/Chromium 143 or Brave 1.85, hardware video decode is enabled by default on Wayland, see &lt;a href="https://issues.chromium.org/issues/40225939" rel="noopener noreferrer"&gt;&lt;strong&gt;Chromium issue #40225939&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, hardware video &lt;em&gt;encode&lt;/em&gt; is still &lt;em&gt;not&lt;/em&gt; enabled by default, so you still need &lt;code&gt;--enable-features=AcceleratedVideoEncoder&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ever wonder how to install your web browser in a container with &lt;em&gt;everything&lt;/em&gt; working, e.g. hardware accelerations, usable PWAs shortcuts, keyring encryption, light/dark theme scheme that follows the host, auto-update, etc.? Basically, there's zero downside plus these many benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This won't pull a ton of dependencies directly on your base system. It's always very hard to keep track of those residues, you know it! Your base system (host) would also be more stable, less prone to upgrade conflicts in the process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A clear separation of config files. You can always start anew easily. You can delete the container along with everything inside it without affecting your system in any way.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Better&lt;/em&gt; performance if you're running on a distro that doesn't deliver &lt;strong&gt;x86-64-v3&lt;/strong&gt; microarchitecture optimization packages (99% of all distros out there).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This setup works on &lt;em&gt;all&lt;/em&gt; distros, without exceptions!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Probably many more, depending on your use cases.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Installing Distrobox and Podman&lt;/li&gt;
&lt;li&gt;Configure Distrobox to use Podman&lt;/li&gt;
&lt;li&gt;Create a container&lt;/li&gt;
&lt;li&gt;Enable x86-64-v3 packages&lt;/li&gt;
&lt;li&gt;Install required packages&lt;/li&gt;
&lt;li&gt;Install GPU driver&lt;/li&gt;
&lt;li&gt;Prepare directories for PWAs&lt;/li&gt;
&lt;li&gt;Symlink with the user directories on the host&lt;/li&gt;
&lt;li&gt;Install your browser&lt;/li&gt;
&lt;li&gt;Export the browser to the host&lt;/li&gt;
&lt;li&gt;Create a script to run the browser with hardware video acceleration flags&lt;/li&gt;
&lt;li&gt;Modify the browser desktop file that we previously exported on the host&lt;/li&gt;
&lt;li&gt;Fixing the PWAs issue in the container&lt;/li&gt;
&lt;li&gt;Auto-update the container to which will also update the browser and everything inside with zero maintenance&lt;/li&gt;
&lt;li&gt;Check the browser's keyring entry&lt;/li&gt;
&lt;li&gt;Enhancing the sandbox in a distro that doesn't enable the &lt;code&gt;ptrace_scope=1&lt;/code&gt; by default&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Installing Distrobox and Podman
&lt;/h2&gt;

&lt;p&gt;The command will differ based on your specific package manager. Refer to your distro's docs. For example, on Arch based distros:&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; distrobox podman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Configure Distrobox to use Podman
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'container_manager="podman"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.config/distrobox/distrobox.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Create a container
&lt;/h2&gt;

&lt;p&gt;I use the &lt;em&gt;official&lt;/em&gt; &lt;strong&gt;container image from CachyOS&lt;/strong&gt; because it has &lt;strong&gt;x86-64-v3&lt;/strong&gt; repositories configured out of the box. Moreover, it doesn't have any issues with proprietary codecs, as all the codecs, free and proprietary ones, are available on the main Arch repositories.&lt;/p&gt;

&lt;p&gt;It's also possible to use x86-64-v3 packages with &lt;strong&gt;openSUSE image (the Distrobox variant)&lt;/strong&gt; if you install &lt;code&gt;patterns-glibc-hwcaps-x86_64_v3&lt;/code&gt; then &lt;code&gt;sudo zypper dup&lt;/code&gt;. The only reason to use openSUSE image rather than CachyOS image is when the browser you want to use doesn't have an official build for Arch based distros, e.g. Google Chrome, Microsoft Edge.&lt;/p&gt;

&lt;p&gt;The problem with openSUSE image is also depended on your GPU. If you're using Intel or NVIDIA GPU, it doesn't matter, as Intel relies on &lt;code&gt;intel-media-driver&lt;/code&gt;, and NVIDIA relies on &lt;code&gt;libva-nvidia-driver&lt;/code&gt; for VA-API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unfortunately, if you're with AMD&lt;/strong&gt;, &lt;em&gt;and&lt;/em&gt; for some reason, hurt yourself by not using Brave 😂, you will have to add PackMan repo in openSUSE image. The problem happens when you upgrade the container, it will be conflicted with the main repo from time to time, except now it will happen in your container instead of it happening directly on your system. It's in a way better, but not ideal.&lt;/p&gt;

&lt;p&gt;Here's a summary of how to choose which container image to use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intel and NVIDIA users:&lt;/strong&gt; Choose based on whether your browser has the &lt;em&gt;official&lt;/em&gt; build for the container image, e.g. Brave users use CachyOS image, Google Chrome and Microsoft Edge users use openSUSE image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AMD users:&lt;/strong&gt; Use CachyOS image + Brave, and call it a day. Otherwise, use openSUSE image + PackMan repo (more on that later).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, it's time to actually create a container 😁&lt;/p&gt;

&lt;h3&gt;
  
  
  CachyOS Image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;distrobox-create &lt;span class="nt"&gt;-i&lt;/span&gt; docker.io/cachyos/cachyos-v3:latest &lt;span class="nt"&gt;-n&lt;/span&gt; browser-v3-dbx &lt;span class="nt"&gt;-H&lt;/span&gt; ~/distrobox/browser-v3-dbx &lt;span class="nt"&gt;--volume&lt;/span&gt; /run/dbus/system_bus_socket:/run/dbus/system_bus_socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  openSUSE Image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;distrobox-create &lt;span class="nt"&gt;-i&lt;/span&gt; registry.opensuse.org/opensuse/distrobox:latest &lt;span class="nt"&gt;-n&lt;/span&gt; browser-v3-dbx &lt;span class="nt"&gt;-H&lt;/span&gt; ~/distrobox/browser-v3-dbx &lt;span class="nt"&gt;--volume&lt;/span&gt; /run/dbus/system_bus_socket:/run/dbus/system_bus_socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, enter the container with &lt;code&gt;distrobox enter browser-v3-dbx&lt;/code&gt; and follow the next step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: For NVIDIA users, in order to use the GPU inside the container, you need to add &lt;code&gt;--nvidia&lt;/code&gt; flags to the &lt;code&gt;distrobox-create&lt;/code&gt; command. See more &lt;a href="https://github.com/89luca89/distrobox/blob/main/docs/useful_tips.md#using-the-gpu-inside-the-container" rel="noopener noreferrer"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Enable x86-64-v3 packages
&lt;/h2&gt;

&lt;p&gt;Depends on the container image you choose...&lt;/p&gt;

&lt;h3&gt;
  
  
  CachyOS Image
&lt;/h3&gt;

&lt;p&gt;Update all the packages:&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;-Syu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reinstall all the packages from CachyOS repos (this will replace x86-64 AKA x86-64-v1 packages with x86-64-v3 ones):&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;-Qqn&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  openSUSE Image
&lt;/h3&gt;

&lt;p&gt;Update all the packages:&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;zypper dup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable x86-64-v3 packages:&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;zypper &lt;span class="nb"&gt;install &lt;/span&gt;patterns-glibc-hwcaps-x86_64_v3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Install required packages
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CachyOS Image
&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;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; dbus xdg-utils glib2 pipewire adwaita-icon-theme adwaita-cursors adwaita-fonts watchexec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  openSUSE Image
&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;zypper &lt;span class="nb"&gt;install &lt;/span&gt;dbus-1 dbus-1-x11 xdg-utils glib2 pipewire adwaita-icon-theme adwaita-fonts watchexec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Install GPU driver
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;pacman&lt;/code&gt; command for CachyOS Image, &lt;code&gt;zypper&lt;/code&gt; for openSUSE Image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intel
&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;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; intel-media-driver libva-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;zypper &lt;span class="nb"&gt;install &lt;/span&gt;intel-media-driver libva-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AMD
&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;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; Mesa libva libva-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For openSUSE image, adding PackMan repo first:&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;zypper ar &lt;span class="nt"&gt;-f&lt;/span&gt; https://ftp.gwdg.de/pub/linux/misc/packman/suse/openSUSE_Tumbleweed/ packman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Refresh the repos:&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;zypper refresh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;zypper dup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the driver:&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;zypper &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--from&lt;/span&gt; packman Mesa-libva libva2 libva-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  NVIDIA
&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;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; libva-nvidia-driver libva-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;zypper &lt;span class="nb"&gt;install &lt;/span&gt;libva-nvidia-driver libva-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Prepare directories for PWAs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.local/share/applications
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/Desktop
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.local/share/icons
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Symlink with the user directories on the host
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /var/home/archerallstars/.local/share/icons/hicolor ~/.local/share/icons/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /var/home/archerallstars/.local/share/fonts ~/.local/share/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Replace &lt;code&gt;/var/home/archerallstars&lt;/code&gt; with your home directory's &lt;em&gt;absolute&lt;/em&gt; path on your system (the path you can copy from your file manager, the path without &lt;code&gt;~&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  (optional) Symlink with &lt;strong&gt;fontconfig&lt;/strong&gt; directory on the host
&lt;/h3&gt;

&lt;p&gt;This is usually necessary for multilingual individuals if they want to change the font for a specific language.&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; ~/.config/fontconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /var/home/archerallstars/.config/fontconfig/conf.d ~/.config/fontconfig/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, if I want to change the font just for Thai language while keeping the rest intact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/fontconfig/conf.d/99-my-preferred-font-for-th.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I can add this to the file:&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="cp"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE fontconfig SYSTEM "fonts.dtd"&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;fontconfig&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;"pattern"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"lang"&lt;/span&gt; &lt;span class="na"&gt;compare=&lt;/span&gt;&lt;span class="s"&gt;"contains"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;th&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt; &lt;span class="na"&gt;qual=&lt;/span&gt;&lt;span class="s"&gt;"any"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"family"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;sans-serif&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"family"&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;"prepend"&lt;/span&gt; &lt;span class="na"&gt;binding=&lt;/span&gt;&lt;span class="s"&gt;"strong"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Waree&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/fontconfig&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Normally, people with the need would already configure this on their host. So, just by linking &lt;code&gt;~/.config/fontconfig/conf.d/&lt;/code&gt; on the host will make the container follows the same rule without having to do anything. Just make sure you also link the fonts directory on the host as shown on the above, so the container can use the font specified in this rule.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Install your browser
&lt;/h2&gt;

&lt;p&gt;Please refer to your browser installation instruction. It's the same regardless of the containerization. For example, &lt;a href="https://brave.com/linux/" rel="noopener noreferrer"&gt;Brave&lt;/a&gt; in CachyOS container:&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; yay
yay &lt;span class="nt"&gt;-Sy&lt;/span&gt; brave-bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Export the browser to the host
&lt;/h2&gt;

&lt;p&gt;For example, for Brave:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;distrobox-export &lt;span class="nt"&gt;-a&lt;/span&gt; brave
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The actual name of the browser could be different. For example, if you're using CachyOS image, Brave uses &lt;code&gt;brave&lt;/code&gt; for its binary, while it's &lt;code&gt;brave-browser&lt;/code&gt; when installing from their official openSUSE repo 😂&lt;/p&gt;

&lt;p&gt;Try catching this with &lt;code&gt;ls /usr/bin | grep brave&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After the export, you can exit from the container and forget it with &lt;code&gt;exit&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Create a script to run the browser with hardware video acceleration flags
&lt;/h2&gt;

&lt;p&gt;Unfortunately, this is still necessary in 2025. So, create a file called &lt;code&gt;brave-vaapi&lt;/code&gt; or something, put it in &lt;code&gt;~/.local/bin&lt;/code&gt; on your host. Here are the scripts depending on your GPU vendor:&lt;/p&gt;

&lt;h3&gt;
  
  
  Intel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;exec&lt;/span&gt; /usr/bin/distrobox-enter  &lt;span class="nt"&gt;-n&lt;/span&gt; browser-v3-dbx  &lt;span class="nt"&gt;--&lt;/span&gt;   /usr/bin/brave &lt;span class="nt"&gt;--enable-features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;AcceleratedVideoEncoder &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AMD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;exec&lt;/span&gt; /usr/bin/distrobox-enter  &lt;span class="nt"&gt;-n&lt;/span&gt; browser-v3-dbx  &lt;span class="nt"&gt;--&lt;/span&gt;   /usr/bin/brave &lt;span class="nt"&gt;--enable-features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;AcceleratedVideoEncoder,VaapiIgnoreDriverChecks &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  NVIDIA
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;exec&lt;/span&gt; /usr/bin/distrobox-enter  &lt;span class="nt"&gt;-n&lt;/span&gt; browser-v3-dbx  &lt;span class="nt"&gt;--&lt;/span&gt;   /usr/bin/brave &lt;span class="nt"&gt;--enable-features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;AcceleratedVideoEncoder,VaapiIgnoreDriverChecks,VaapiOnNvidiaGPUs &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file, then right-click &amp;gt; properties and make it executable/run as program.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The reason I use the script to add these flags because these flags could change at any time. Instead of changing them in all the desktop files, changing them here would take a much lesser effort 😅&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Modify the browser desktop file that we previously exported on the host
&lt;/h2&gt;

&lt;p&gt;It's in &lt;code&gt;~/.local/share/applications/&lt;/code&gt;. The desktop file could be &lt;code&gt;browser-v3-dbx-brave-browser.desktop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Open it with your text editor, then search for &lt;code&gt;exec&lt;/code&gt;, replace its value to your script from the previous step, 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;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/home/archerallstars/.local/bin/brave-vaapi  %U
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Search for all lines that starts with &lt;code&gt;Exec=&lt;/code&gt;, replace them with your script, but keep its flags intact (if there's any), like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/home/archerallstars/.local/bin/brave-vaapi &lt;span class="nt"&gt;--incognito&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Remember to use the absolute path!&lt;/p&gt;




&lt;h2&gt;
  
  
  13. Fixing the PWAs issue in the container
&lt;/h2&gt;

&lt;p&gt;There's one serious issue that would prevent us from the seamless integration, though. That's the broken PWAs icons, as the icons created in the container would obviously refer to their executable path in the container, of which doesn't exist on the host side.&lt;/p&gt;

&lt;p&gt;Moreover, it also has &lt;a href="https://github.com/flathub/org.chromium.Chromium/issues/216" rel="noopener noreferrer"&gt;&lt;strong&gt;the same issue&lt;/strong&gt;&lt;/a&gt; with every Chromium browser on Flathub when running in native Wayland mode.&lt;/p&gt;

&lt;p&gt;However, you can fix both of these issues easily with a simple bash script, called it &lt;code&gt;brave-pwa-fix&lt;/code&gt; and save it in &lt;code&gt;~/.local/bin&lt;/code&gt; on your host.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;yourBrowser&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"brave"&lt;/span&gt;
&lt;span class="nv"&gt;browserDesktopFilename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"browser-v3-dbx-brave-browser.desktop"&lt;/span&gt;
&lt;span class="nv"&gt;binPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/home/archerallstars/.local/bin/brave-with-video-accelerated"&lt;/span&gt;
&lt;span class="nv"&gt;hostAppsPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/home/archerallstars/.local/share/applications"&lt;/span&gt;
&lt;span class="nv"&gt;containerAppsPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/home/archerallstars/distrobox/browser-v3-dbx/Desktop"&lt;/span&gt;

process_file&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        return
    fi
    &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;temp_file
    &lt;span class="nv"&gt;temp_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;changed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;icon_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;

    &lt;span class="c"&gt;# First pass to get icon_value&lt;/span&gt;
    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; line&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^Icon&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nv"&gt;icon_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;#Icon=&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;fi
    done&lt;/span&gt; &amp;lt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;# Second pass to process&lt;/span&gt;
    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; line&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^Name&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$line&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;" ("&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;%% (*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
                &lt;span class="nv"&gt;changed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
            &lt;span class="k"&gt;fi
        elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^Exec&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;exec_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;#Exec=&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$exec_value&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;" --"&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;suffix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;exec_value&lt;/span&gt;&lt;span class="p"&gt;#* --&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
                &lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Exec=&lt;/span&gt;&lt;span class="nv"&gt;$binPath&lt;/span&gt;&lt;span class="s2"&gt; --&lt;/span&gt;&lt;span class="nv"&gt;$suffix&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;else
                &lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Exec=&lt;/span&gt;&lt;span class="nv"&gt;$binPath&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;fi
            &lt;/span&gt;&lt;span class="nv"&gt;changed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^StartupWMClass&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$icon_value&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nv"&gt;current_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;#StartupWMClass=&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$current_value&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$icon_value&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"StartupWMClass=&lt;/span&gt;&lt;span class="nv"&gt;$icon_value&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
                &lt;span class="nv"&gt;changed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
            &lt;span class="k"&gt;fi
        fi
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$temp_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;done&lt;/span&gt; &amp;lt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$changed&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 1 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$temp_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$hostAppsPath&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi
    &lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$temp_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Process missing files from container&lt;/span&gt;
find &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$containerAppsPath&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*&lt;/span&gt;&lt;span class="nv"&gt;$yourBrowser&lt;/span&gt;&lt;span class="s2"&gt;*.desktop"&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; file&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;host_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$hostAppsPath&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$basename&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$host_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;process_file &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi
done&lt;/span&gt;

&lt;span class="c"&gt;# Synchronize: remove orphaned files from hostAppsPath&lt;/span&gt;
find &lt;span class="nv"&gt;$hostAppsPath&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*&lt;/span&gt;&lt;span class="nv"&gt;$yourBrowser&lt;/span&gt;&lt;span class="s2"&gt;*.desktop"&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; host_file&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$host_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$basename&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$browserDesktopFilename&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        continue
    fi
    &lt;/span&gt;&lt;span class="nv"&gt;container_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$containerAppsPath&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$basename&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$container_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$host_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi
done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file, then right-click &amp;gt; properties and make it executable/run as program.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explaination
&lt;/h3&gt;

&lt;p&gt;You only need to change these variables values at the top of the script to match the one on your system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;yourBrowser&lt;/code&gt; and&lt;code&gt;browserDesktopFilename&lt;/code&gt; should be obvious enough 😂&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;binPath&lt;/code&gt; is the path of the script you use to launch the browser with hardware accelerated flags above.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;hostAppsPath&lt;/code&gt; is the path of the user desktop files on the host.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;containerAppsPath&lt;/code&gt; is one of the paths of the user desktop files in the container where PWAs desktop files reside.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Using &lt;code&gt;watchexec&lt;/code&gt; to sync PWAs from inside the container to the host and vice versa
&lt;/h3&gt;

&lt;p&gt;The script already handled everything. So, we just need a watcher that we already installed in step #5, &lt;code&gt;watchexec&lt;/code&gt;. We'll run this small yet powerful tool using a systemd service, in which we'll also autostart it after user login (with some delay - container safe).&lt;/p&gt;

&lt;p&gt;I will go quickly with &lt;code&gt;nano&lt;/code&gt;. By now, you should be familiar with what we're doing now 😁&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/pwa-watcher.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the service file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Start PWA watcher in the background for the containerized browser
RequiresMountsFor=/run/user/1000/containers
StartLimitBurst=3
StartLimitIntervalSec=600

[Service]
Type=exec
ExecStart=/usr/bin/distrobox-enter  -n browser-v3-dbx  --   bash -c 'watchexec -n --watch ~/Desktop distrobox-host-exec /var/home/archerallstars/.local/bin/brave-pwa-fix'
Restart=on-failure
RestartSec=60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Replace my host's absolute path with your host's absolute path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/pwa-watcher.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the timer file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Start PWA watcher service with some delay.

[Timer]
OnStartupSec=23
RandomizedDelaySec=12
Persistent=true

[Install]
WantedBy=timers.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload and enable the timer, also start the service if you will:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; daemon-reload
systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nb"&gt;enable &lt;/span&gt;pwa-watcher.timer
systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; start pwa-watcher
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. Auto-update the container to which will also update the browser and everything inside with zero maintenance
&lt;/h2&gt;

&lt;p&gt;We will use a systemd service and its timer agian. Not only that it will update the container that we created, if you have more fun with more containers, all of them will also be updated in the background.&lt;/p&gt;

&lt;p&gt;There's a caveat, though. A misconfigured container will stop the update process of &lt;em&gt;all&lt;/em&gt; containers &lt;em&gt;after&lt;/em&gt; it, so make sure you're doing it right.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/dbx-upgrade.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the service file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Upgrade all Distrobox containers
RequiresMountsFor=/run/user/1000/containers
StartLimitBurst=3
StartLimitIntervalSec=600

[Service]
Type=exec
ExecStart=sh -c "distrobox-upgrade --all &amp;amp;&amp;amp; distrobox enter browser-v3-dbx -- yay -Syu --noconfirm"
Restart=on-failure
RestartSec=60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Since the &lt;em&gt;official&lt;/em&gt; build of Brave for Arch based distros is delivered on AUR, we need to chain &lt;code&gt;yay -Syu --noconfirm&lt;/code&gt; manually (&lt;code&gt;distrobox-upgrade --all&lt;/code&gt; doesn't take care of AUR) to keep Brave up-to-date (only if you installed Brave in CachyOS container). You can chain as many containers as you want to update AUR packages if necessary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/systemd/user/dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the timer file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Start Distrobox containers upgrade service with some delay.

[Timer]
OnStartupSec=30
RandomizedDelaySec=15
Persistent=true

[Install]
WantedBy=timers.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload and enable the timer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nb"&gt;enable &lt;/span&gt;dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  15. Check the browser's keyring entry
&lt;/h2&gt;

&lt;p&gt;After you turning on the sync feature in your browser, it's super important to check whether your setup has created the keyring's entries correctly to ensure you use the uncompromised encryption to store your data.&lt;/p&gt;

&lt;p&gt;You can check this easily with &lt;a href="https://flathub.org/en/apps/org.gnome.seahorse.Application" rel="noopener noreferrer"&gt;&lt;strong&gt;GNOME Passwords and Keys&lt;/strong&gt;&lt;/a&gt;. It looks dated than &lt;a href="https://flathub.org/en/apps/app.drey.KeyRack" rel="noopener noreferrer"&gt;Key Rack&lt;/a&gt;, but the latter doesn't always find all the entries.&lt;/p&gt;

&lt;p&gt;If you did everything right, you will see an entry like this:&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%2Fwk61y4wgd97guhs50rsw.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%2Fwk61y4wgd97guhs50rsw.png" alt="Brave Keyring" width="800" height="782"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;, if you're using Brave, you won't be able to use the sync feature without the access to the system's keyring. While the rest won't tell you anything 😂&lt;/p&gt;

&lt;p&gt;Anyway, you can also launch the browser in the terminal (inside the container) with debug mode enable. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brave &lt;span class="nt"&gt;--enable-logging&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;stderr &lt;span class="nt"&gt;--v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will pump out the debug log like crazy 😂 You can search (ctrl + shift + F) in the terminal for &lt;code&gt;libsecret&lt;/code&gt;. If you're using the system keyring properly, you'll see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Selected backend for OSCrypt: GNOME_LIBSECRET
OSCrypt using Libsecret as backend.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Is it just easier to go with the Flatpak version if you're using Brave?
&lt;/h2&gt;

&lt;p&gt;Yes, it's. But it has a &lt;em&gt;questionable&lt;/em&gt; security implication, thus &lt;em&gt;not&lt;/em&gt; recommended by Brave. When it comes to web browser, I want maximum security. Less is not more here, it's unacceptable!&lt;/p&gt;

&lt;p&gt;You can check this with the &lt;code&gt;://sandbox&lt;/code&gt; page, for example, in Brave: &lt;code&gt;brave://sandbox&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  When running inside the container
&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%2Fojh65w3cdmcccjzed8fj.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%2Fojh65w3cdmcccjzed8fj.png" alt="Sandbox Status - Container" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Simply the same with running the browser natively on your system. Meaning your browser sandbox is &lt;em&gt;not&lt;/em&gt; compromised when it's running inside the container.&lt;/p&gt;

&lt;h3&gt;
  
  
  When running in Flatpak
&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%2F8r2nuixh8g1zwsj82k2a.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%2F8r2nuixh8g1zwsj82k2a.png" alt="Sandbox Status - Flatpak" width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the &lt;strong&gt;Layer 1 Sandbox&lt;/strong&gt; is now &lt;strong&gt;SUID&lt;/strong&gt;, and this is without Ptrace Protection with Yama LSM (Non-broker) enabled, of which is available as an alternative mode when namespaces aren't available, see more &lt;a href="https://github.com/ungoogled-software/ungoogled-chromium/issues/519#issuecomment-425315496" rel="noopener noreferrer"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://chromium.googlesource.com/chromium/src/+/d267fd9917cb1c7494a8067ea3c6f1831bb37e78" rel="noopener noreferrer"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  16. Enhancing the sandbox in a distro that doesn't enable the &lt;code&gt;ptrace_scope=1&lt;/code&gt; by default
&lt;/h2&gt;

&lt;p&gt;For any users that doesn't debug anything on their PC, enable this security feature shouldn't break anything. It's enabled by default in &lt;a href="https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace_Protection" rel="noopener noreferrer"&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://man.archlinux.org/man/ptrace.2.en#/proc/sys/kernel/yama/ptrace_scope" rel="noopener noreferrer"&gt;&lt;strong&gt;Arch&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://bugzilla.suse.com/show_bug.cgi?id=1217051" rel="noopener noreferrer"&gt;&lt;strong&gt;openSUSE&lt;/strong&gt;&lt;/a&gt; (by my request 😄).&lt;/p&gt;

&lt;p&gt;Currently, I'm on Fedora Silverblue 42, of which doesn't enable &lt;code&gt;ptrace_scope=1&lt;/code&gt; by default. There's &lt;a href="https://discussion.fedoraproject.org/t/f44-change-proposal-mitigate-vulnerabilities-attacks-by-enabling-kernel-kptr-restrict-and-net-core-bpf-jit-harden-by-default-and-by-obsoleting-a-package-that-risks-to-accidentally-disable-kernel-yama-ptrace-scope-by-default-systemwide/163535" rel="noopener noreferrer"&gt;&lt;strong&gt;a proposal&lt;/strong&gt;&lt;/a&gt; to enable this by default in Fedora 44, though.&lt;/p&gt;

&lt;p&gt;You can check your current &lt;code&gt;ptrace_scope&lt;/code&gt; value with:&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; /proc/sys/kernel/yama/ptrace_scope
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, in the meantime, you can enable this easily by copying the default config file and edit it:&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 cp&lt;/span&gt; /usr/lib/sysctl.d/10-default-yama-scope.conf /etc/sysctl.d/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;nano /etc/sysctl.d/10-default-yama-scope.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last line should be &lt;code&gt;kernel.yama.ptrace_scope = 1&lt;/code&gt; instead of &lt;code&gt;kernel.yama.ptrace_scope = 0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then, reboot. &lt;code&gt;cat /proc/sys/kernel/yama/ptrace_scope&lt;/code&gt; again, now, it should return &lt;code&gt;1&lt;/code&gt;. And when you open &lt;code&gt;brave://sandbox/&lt;/code&gt; again, there should be no red entries left (meaning a secure sandbox):&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%2Fo9xmsgxgtzz8ldmi3ned.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%2Fo9xmsgxgtzz8ldmi3ned.png" alt="Secure Sandboxing" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I hope I don't miss anything. Thanks for reading 🙏&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Cover Image&lt;/strong&gt; by &lt;a href="https://unsplash.com/@aronyigin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Aron Yigin&lt;/strong&gt;&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/brown-cardboard-boxes-under-blue-sky-during-daytime-sNY6B9NsPP8?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;&lt;strong&gt;Unsplash&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>containerapps</category>
      <category>distrobox</category>
      <category>linux</category>
    </item>
    <item>
      <title>Chrome Flags' Latest 2024 Update, Web Browser Video Hardware Acceleration on Linux</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Fri, 15 Nov 2024 02:50:14 +0000</pubDate>
      <link>https://forem.com/archerallstars/chrome-flags-latest-2024-update-web-browser-video-hardware-acceleration-on-linux-34k1</link>
      <guid>https://forem.com/archerallstars/chrome-flags-latest-2024-update-web-browser-video-hardware-acceleration-on-linux-34k1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: As of Chrome/Chromium 143 or Brave 1.85, hardware video decode is enabled by default on Wayland, see &lt;a href="https://issues.chromium.org/issues/40225939" rel="noopener noreferrer"&gt;&lt;strong&gt;Chromium issue #40225939&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, hardware video &lt;em&gt;encode&lt;/em&gt; is still &lt;em&gt;not&lt;/em&gt; enabled by default, so you still need &lt;code&gt;--enable-features=AcceleratedVideoEncoder&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's an important change made to the flags to enable video hardware acceleration on Linux, starting from Chrome/Chromium 131, or Brave 1.73.89 which is based on Chromium 131. Other Chromium based browsers are all affected too.&lt;/p&gt;

&lt;p&gt;It's on &lt;a href="https://issues.chromium.org/issues/40225939#comment54" rel="noopener noreferrer"&gt;&lt;strong&gt;Chromium issue #40225939&lt;/strong&gt;&lt;/a&gt;. Here are the updated flags for each GPU vendor:&lt;/p&gt;

&lt;h2&gt;
  
  
  Intel GPUs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--enable-features=AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoDecodeLinuxGL,AcceleratedVideoEncoder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Vaapi&lt;/code&gt; part is replaced with &lt;code&gt;Accelerated&lt;/code&gt;. Other than that, &lt;code&gt;--use-gl=angle --use-angle=gl&lt;/code&gt; is no longer needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  AMD GPUs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--enable-features=AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoDecodeLinuxGL,VaapiIgnoreDriverChecks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  NVIDIA GPUs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--enable-features=AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoDecodeLinuxGL,VaapiIgnoreDriverChecks,VaapiOnNvidiaGPUs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;I am not sure whether adding &lt;code&gt;AcceleratedVideoEncoder&lt;/code&gt; would enable video hardware &lt;em&gt;encoding&lt;/em&gt; on AMD and NVIDIA GPUs like it does on my Intel GPU.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Here's how to check
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;chrome://gpu&lt;/code&gt; or &lt;code&gt;brave://gpu&lt;/code&gt; if you're using Brave.&lt;/li&gt;
&lt;li&gt;Scroll down nearing the end of the page, see in the &lt;strong&gt;Video Acceleration Information&lt;/strong&gt; section, if you have video decoding and encoding, it should show the info similar to this:&lt;/li&gt;
&lt;/ol&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%2Ft4q53856ar7o1qyoaxj5.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%2Ft4q53856ar7o1qyoaxj5.png" alt="Chromium's video decoding and encoding info" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Are we close to have video hardware acceleration enabled by default on Linux (in Chromium browsers)?
&lt;/h2&gt;

&lt;p&gt;The answer would be yes and no. While &lt;code&gt;AcceleratedVideoDecoder&lt;/code&gt; will be &lt;a href="https://source.chromium.org/chromium/chromium/src/+/main:media/base/media_switches.cc;l=700?q=AcceleratedVideoDecodeLinuxGL&amp;amp;ss=chromium" rel="noopener noreferrer"&gt;enabled in Chrome/Chromium 132&lt;/a&gt; by default, it's &lt;a href="https://issues.chromium.org/issues/40225939#comment58" rel="noopener noreferrer"&gt;not decided yet&lt;/a&gt; for &lt;code&gt;AcceleratedVideoDecodeLinuxZeroCopyGL&lt;/code&gt;. And &lt;code&gt;AcceleratedVideoEncoder&lt;/code&gt; is not getting much attention. Meaning that, we will still have to launch the browser with flags for the &lt;em&gt;unforeseeable&lt;/em&gt; future.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the problem with the flags?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;They change overtime, as they are considered experiment features.&lt;/li&gt;
&lt;li&gt;It's inconvenient to make use of PWAs. If we need all the accelerations to work, we will have to launch the first instance of the browser with these flags. In other word, we can't just go straight to the PWA window. And it is &lt;em&gt;not&lt;/em&gt; a good idea either to populate all these flags in all the PWAs' desktop files, as flags are changed/removed all the time. I don't think this is an ideal setup for my grandma's PC.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Well, this is it for today! Thanks for reading. Bye 💨&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;a href="https://unsplash.com/photos/man-in-black-shirt-sitting-beside-table-SUYgiqO2wAE" rel="noopener noreferrer"&gt;Cover Photo&lt;/a&gt;&lt;/strong&gt; by &lt;strong&gt;&lt;a href="https://unsplash.com/@planeteelevene?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Muhammad-Taha Ibrahim&lt;/a&gt;&lt;/strong&gt; on &lt;strong&gt;&lt;a href="https://unsplash.com/photos/man-in-black-shirt-sitting-beside-table-SUYgiqO2wAE?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>news</category>
      <category>linux</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Running adb in a rootless Podman Distrobox container</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Thu, 23 May 2024 19:20:19 +0000</pubDate>
      <link>https://forem.com/archerallstars/running-adb-in-a-rootless-podman-distrobox-container-2kap</link>
      <guid>https://forem.com/archerallstars/running-adb-in-a-rootless-podman-distrobox-container-2kap</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Updated&lt;/strong&gt;: As of Distrobox 1.8.1.2, &lt;code&gt;adb&lt;/code&gt; works out of the box in a rootless container.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;adb&lt;/code&gt; stands for &lt;a href="https://developer.android.com/tools/adb" rel="noopener noreferrer"&gt;&lt;em&gt;Android Debug Bridge&lt;/em&gt;&lt;/a&gt;. It's a part of &lt;a href="https://developer.android.com/tools/releases/platform-tools" rel="noopener noreferrer"&gt;SDK Platform Tools&lt;/a&gt;, which is bundled with &lt;a href="https://developer.android.com/studio" rel="noopener noreferrer"&gt;Android Studio&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;For Linux users, they might want to use &lt;code&gt;adb&lt;/code&gt; with &lt;code&gt;scrcpy&lt;/code&gt; (&lt;a href="https://github.com/Genymobile/scrcpy" rel="noopener noreferrer"&gt;https://github.com/Genymobile/scrcpy&lt;/a&gt;), which is a very powerful tool for controlling Android devices from PC. Installing &lt;code&gt;scrcpy&lt;/code&gt; from the distro's repo would bring in &lt;code&gt;adb&lt;/code&gt; by default, so it's not necessary to download &lt;code&gt;adb&lt;/code&gt; directly from Google.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why would anyone use &lt;code&gt;adb&lt;/code&gt; in a container?
&lt;/h1&gt;

&lt;p&gt;Like most apps that anyone would want to run in a container: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It &lt;em&gt;doesn't&lt;/em&gt; pile up your system with a ton of packages/dependencies.&lt;/li&gt;
&lt;li&gt;You always get the latest &lt;em&gt;official&lt;/em&gt; release of apps, regardless of your Linux distro.&lt;/li&gt;
&lt;li&gt;You can easily delete &lt;em&gt;all&lt;/em&gt; the app data and its configurations.&lt;/li&gt;
&lt;li&gt;It works with &lt;em&gt;immutable&lt;/em&gt; OSes very well. &lt;/li&gt;
&lt;li&gt;Minimizing the apps' system access through a &lt;em&gt;rootless&lt;/em&gt; environment.&lt;/li&gt;
&lt;li&gt;Maybe more. 😎&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note, Distrobox gives you a convenient over raw Podman/Docker setup, and it also integrates very well in the system. But if you want the &lt;em&gt;absolute&lt;/em&gt; security, please consider setting up a rootless Podman container without using Distrobox. However, I will go with Distrobox, as I think a rootless Distrobox container already gives you a sane amount of security-convenient ratio.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉️ Table of contents:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Know Your Device&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;udev&lt;/code&gt; Rules Setup on the Host&lt;/li&gt;
&lt;li&gt;Preparing the Container&lt;/li&gt;
&lt;li&gt;Testing &lt;code&gt;adb&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Automatically Update the Container&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  1. Know Your Device
&lt;/h1&gt;

&lt;p&gt;You can identify your device easily with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It will list all USB related devices. Look for a line that's corresponding to your Android device. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bus 001 Device 009: ID 1234:5678 Google Inc. Nexus/Pixel Device (charging + debug)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is your device ID, which is &lt;code&gt;1234:5678&lt;/code&gt; in this example. We'll use this ID in the next step.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. &lt;code&gt;udev&lt;/code&gt; Rules Setup on the Host
&lt;/h1&gt;

&lt;p&gt;In &lt;code&gt;/etc/udev/rules.d/51-android.rules&lt;/code&gt; I put:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE="0666", GROUP="yourusername"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If yours doesn't have &lt;code&gt;51-android.rules&lt;/code&gt; in &lt;code&gt;/etc/udev/rules.d/&lt;/code&gt;, please create a new one.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;ATTR{idVendor}=="1234"&lt;/code&gt; and &lt;code&gt;ATTRS{idProduct}=="5678"&lt;/code&gt; with your real device ID.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;yourusername&lt;/code&gt; with your real username.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  3. Preparing the Container
&lt;/h1&gt;

&lt;h2&gt;
  
  
  3.1. Install Distrobox and Podman on the Host
&lt;/h2&gt;

&lt;p&gt;For example, on openSUSE Tumbleweed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo zypper install distrobox podman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3.2. Configure Distrobox to use Podman
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo 'container_manager="podman"' &amp;gt; ~/.config/distrobox/distrobox.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3.3. Create a New Distrobox Container for &lt;code&gt;adb&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;distrobox create -i docker.io/library/archlinux:latest -n adb-dbx -H ~/distrobox/adb-dbx --volume /dev/bus/usb/:/dev/bus/usb --volume /etc/udev/rules.d/:/etc/udev/rules.d --additional-packages "adwaita-cursors" 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I use Arch container image because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's a rolling image, so every necessary package or dependency would always be updated.&lt;/li&gt;
&lt;li&gt;It really depends on your needs. If you plan to use this container with &lt;code&gt;scrcpy&lt;/code&gt;, the best container for &lt;code&gt;adb&lt;/code&gt; would be Arch, since you will get all the codecs from the main repo. If you plan to use this container as a dev box, Tumbleweed image would be better because Chrome is &lt;em&gt;not&lt;/em&gt; available &lt;em&gt;officially&lt;/em&gt; on Arch. But if you only want to run &lt;code&gt;adb&lt;/code&gt;, the container image wouldn't matter much.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I volume &lt;code&gt;/dev/bus/usb/&lt;/code&gt; and &lt;code&gt;/etc/udev/rules.d/&lt;/code&gt; in the container because they're needed for &lt;code&gt;adb&lt;/code&gt; to work.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Testing &lt;code&gt;adb&lt;/code&gt;
&lt;/h1&gt;



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

&lt;/div&gt;



&lt;p&gt;This should return your device properly. If it's not, please check whether you have &lt;code&gt;adb&lt;/code&gt; process already running in the background. In that case, please end the process first.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Automatically Update the Container
&lt;/h1&gt;

&lt;p&gt;We can use systemd's service and timer to update/upgrade all Distrobox's containers like this:&lt;/p&gt;

&lt;h2&gt;
  
  
  dbx-upgrade.service
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Upgrade all rootless Distrobox containers.
RequiresMountsFor=/run/user/1000/containers

[Service]
Type=exec
ExecStart=-bash -c "distrobox-upgrade --all"
Restart=on-failure
RestartSec=60
TimeoutStopSec=5min
RemainAfterExit=yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this file as &lt;code&gt;~/.config/systemd/user/dbx-upgrade.service&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  dbx-upgrade.timer
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Run distrobox-upgrade --all daily.

[Timer]
OnCalendar=daily
RandomizedDelaySec=5min
Persistent=true

[Install]
WantedBy=timers.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this file as &lt;code&gt;~/.config/systemd/user/dbx-upgrade.timer&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enable the Timer
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl --user daemon-reload &amp;amp;&amp;amp; systemctl --user enable dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Cover Photo by &lt;a href="https://unsplash.com/@dhofit?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Edho Fitrah&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/person-standing-in-front-of-bridge-sBUhP60IlAo?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>android</category>
      <category>productivity</category>
      <category>container</category>
    </item>
    <item>
      <title>Install the official build of mpv media player on any Linux distribution</title>
      <dc:creator>Archer Allstars</dc:creator>
      <pubDate>Sat, 18 May 2024 01:08:47 +0000</pubDate>
      <link>https://forem.com/archerallstars/install-the-official-build-of-mpv-media-player-on-any-linux-distribution-4ifg</link>
      <guid>https://forem.com/archerallstars/install-the-official-build-of-mpv-media-player-on-any-linux-distribution-4ifg</guid>
      <description>&lt;p&gt;Ever wonder why we should use the software directly from the developer’s &lt;em&gt;official&lt;/em&gt; distribution channel when it's possible? Maybe, we should learn from an example in the recent Snap store incidents: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A fake Exodus wallet app had entered the store and &lt;a href="https://popey.com/blog/2024/02/exodus-bitcoin-wallet-490k-swindle/" rel="noopener noreferrer"&gt;scammed 9 BTC (worth around $490K at the time)&lt;/a&gt; from an investor. And &lt;a href="https://popey.com/blog/2024/03/exodus-wallet-part-three/" rel="noopener noreferrer"&gt;another incident&lt;/a&gt; happened &lt;em&gt;again&lt;/em&gt; shortly after the first incident. It's a mess nonetheless.&lt;/li&gt;
&lt;li&gt;As we can see, the sandboxing security of Snap didn’t help. This is why we should only use the official apps &lt;em&gt;when it’s possible&lt;/em&gt;, as this could’ve happened to any store, Flathub, Play Store, App Store, etc. In fact, it already happened on App Store &lt;a href="https://news.ycombinator.com/item?id=39685272" rel="noopener noreferrer"&gt;[1]&lt;/a&gt;, &lt;a href="https://www.bleepingcomputer.com/news/security/fake-leather-wallet-app-on-apple-app-store-is-a-crypto-drainer/" rel="noopener noreferrer"&gt;[2]&lt;/a&gt; and Microsoft Store &lt;a href="https://www.bleepingcomputer.com/news/security/fake-ledger-live-app-in-microsoft-store-steals-768-000-in-crypto/" rel="noopener noreferrer"&gt;[3]&lt;/a&gt; recently.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The level of trust
&lt;/h2&gt;

&lt;h3&gt;
  
  
  App Developer
&lt;/h3&gt;

&lt;p&gt;Sure, if we can’t trust developers, we shouldn’t use their apps at all. But if we decide to use their apps, it means we &lt;em&gt;must&lt;/em&gt; only download the apps from them, unless we prefer to get ourselves scammed. Therefore, this should be our 101 security practice.&lt;/p&gt;

&lt;p&gt;This is not only for our security concerns, but using the &lt;em&gt;official&lt;/em&gt; build will also make the debugging a lot &lt;em&gt;less&lt;/em&gt; painful for the upstream developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  System
&lt;/h3&gt;

&lt;p&gt;We can’t possibly use everything directly from the original developers, e.g. apps, packages, drivers, or even the Linux kernel, etc. It’s undeniably that &lt;em&gt;choosing Linux distro wisely&lt;/em&gt; is a very important part of our threat model. Therefore, your distro’s main/default repos, &lt;em&gt;excluding&lt;/em&gt; the community maintained repos like &lt;a href="https://aur.archlinux.org/packages" rel="noopener noreferrer"&gt;AUR&lt;/a&gt; or home projects on &lt;a href="https://build.opensuse.org/" rel="noopener noreferrer"&gt;OBS&lt;/a&gt; for example, are &lt;em&gt;probably&lt;/em&gt; safe enough to use. At the very least, they shouldn’t introduce more risk, since you already trusted the kernel from them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Third-party / unverified / community maintained
&lt;/h3&gt;

&lt;p&gt;Unless we have no other choice, this channel should be avoided at all cost.&lt;/p&gt;




&lt;p&gt;The good thing about &lt;code&gt;mpv&lt;/code&gt; over other video players is that it plays HDR videos nicely on my SDR monitors and projectors. Without further ado, let’s see how to install &lt;code&gt;mpv&lt;/code&gt;, my favorite video player, using &lt;a href="https://mpv.io/installation/" rel="noopener noreferrer"&gt;the official build (Arch package)&lt;/a&gt; on any Linux distro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Distrobox
&lt;/h2&gt;

&lt;p&gt;Yes, we can install &lt;a href="https://mpv.io/" rel="noopener noreferrer"&gt;&lt;code&gt;mpv&lt;/code&gt;&lt;/a&gt; for Arch (official package) on any Linux distro using a rootless &lt;a href="https://github.com/89luca89/distrobox" rel="noopener noreferrer"&gt;Distrobox&lt;/a&gt; container. We’ll install &lt;code&gt;mpv&lt;/code&gt; in Arch container using &lt;a href="https://hub.docker.com/_/archlinux" rel="noopener noreferrer"&gt;the official Arch Docker image&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I will use command lines in this walkthrough. You can use &lt;a href="https://github.com/Dvlv/BoxBuddyRS" rel="noopener noreferrer"&gt;BoxBuddy&lt;/a&gt; if you prefer the GUI for the container’s creation process. But that’s about it. The app is pretty much bare bone currently. In the end, you’ll have to use the command lines to set up everything inside the container. Therefore, have your terminal ready!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note, I use openSUSE Tumbleweed. Therefore, I will use &lt;code&gt;zypper&lt;/code&gt; command in this walkthrough. Please change the command according to your distro's package manager.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉️ Table of contents:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Preparing the Container&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;mpv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enable Video Hardware Acceleration&lt;/li&gt;
&lt;li&gt;Exporting the App&lt;/li&gt;
&lt;li&gt;Automatically Update the App&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Preparing the Container
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1. Install Distrobox and Podman on the Host
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo zypper install distrobox podman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.2. Configure Distrobox to use Podman
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo 'container_manager="podman"' &amp;gt; ~/.config/distrobox/distrobox.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You can see more of the config options on &lt;a href="https://github.com/89luca89/distrobox#configure-distrobox" rel="noopener noreferrer"&gt;the official repo&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1.3. Create a New Distrobox Container for &lt;code&gt;mpv&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;distrobox create -i docker.io/library/archlinux:latest -n mpv-dbx -H ~/distrobox/mpv-dbx --additional-packages "adwaita-cursors"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;distrobox create&lt;/code&gt; is used to create a Distrobox container. &lt;a href="https://github.com/89luca89/distrobox/blob/main/docs/usage/distrobox-create.md" rel="noopener noreferrer"&gt;See the docs&lt;/a&gt; for all the usages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1.4. Prepare the Packages Inside the Container
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Update All the Packages
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo pacman -Syu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When it asks which DBus you want to use, I recommend &lt;code&gt;dbus-broker&lt;/code&gt; over &lt;code&gt;dbus-daemon&lt;/code&gt;, as it’s &lt;a href="https://archlinux.org/news/making-dbus-broker-our-default-d-bus-daemon/" rel="noopener noreferrer"&gt;the new default DBus on Arch&lt;/a&gt; now.&lt;/p&gt;

&lt;h4&gt;
  
  
  Install GPU Video Acceleration Driver for Your GPU
&lt;/h4&gt;

&lt;p&gt;For example, VA-API drivers for Intel GPUs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo pacman -S intel-media-driver libva-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Install &lt;code&gt;mpv&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo pacman -S mpv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will ask which jack you want to use, between &lt;code&gt;jack&lt;/code&gt; and &lt;code&gt;pipewire-jack&lt;/code&gt;. You can choose &lt;code&gt;pipewire-jack&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Enable Video Hardware Acceleration
&lt;/h2&gt;

&lt;p&gt;Creating a config file at &lt;code&gt;~/.config/mpv/mpv.conf&lt;/code&gt; (in the container), as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# enable video hardware acceleration
hwdec=auto

# optional options
vo=gpu-next
tone-mapping=reinhard
ao=pipewire
sub-border-style=opaque-box
sub-outline-color=0.0/0.0/0.0/0.75
sub-auto=fuzzy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I put &lt;code&gt;vo=gpu-next&lt;/code&gt; option to use the new GPU backend, which is supposed to be a lot faster than the current default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I put &lt;code&gt;tone-mapping=reinhard&lt;/code&gt; to enable tone mapping from HDR to SDR on my SDR projector. There are many tone mappings available, but I like this one the most.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I put &lt;code&gt;ao=pipewire&lt;/code&gt; option to use &lt;a href="https://www.pipewire.org/" rel="noopener noreferrer"&gt;PipeWire&lt;/a&gt; audio driver.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I put &lt;code&gt;sub-border-style=opaque-box&lt;/code&gt; and &lt;code&gt;sub-outline-color=0.0/0.0/0.0/0.75&lt;/code&gt; options to make some subtitles easier to see.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I put &lt;code&gt;sub-auto=fuzzy&lt;/code&gt; option to make &lt;code&gt;mpv&lt;/code&gt; scan for separated subtitle files, even if they don't have exactly the same filenames as the video file. You can try to enable this option if &lt;code&gt;mpv&lt;/code&gt; can't find your subtitles.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see all the available config options from &lt;a href="https://mpv.io/manual/stable/" rel="noopener noreferrer"&gt;the official mpv manual&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Exporting the App
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;distrobox-export -a mpv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By exporting the app, it can be set as your default video player. You can also open any video with the app. No one would notice that it's installed in the container. This is the system integration power of Distrobox!&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Automatically Update the App
&lt;/h2&gt;

&lt;p&gt;We can use systemd's service and timer to update/upgrade &lt;em&gt;all&lt;/em&gt; Distrobox's containers like this:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;dbx-upgrade.service&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Upgrade all rootless Distrobox containers.
RequiresMountsFor=/run/user/1000/containers

[Service]
Type=exec
ExecStart=-bash -c "distrobox-upgrade --all"
Restart=on-failure
RestartSec=60
TimeoutStopSec=5min
RemainAfterExit=yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this file as &lt;code&gt;~/.config/systemd/user/dbx-upgrade.service&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;dbx-upgrade.timer&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Run distrobox-upgrade --all daily.

[Timer]
OnCalendar=daily
RandomizedDelaySec=5min
Persistent=true

[Install]
WantedBy=timers.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this file as &lt;code&gt;~/.config/systemd/user/dbx-upgrade.timer&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable the Timer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl --user daemon-reload &amp;amp;&amp;amp; systemctl --user enable dbx-upgrade.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Cover Photo by &lt;a href="https://unsplash.com/@denisseleon?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Denisse Leon&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/closeup-photo-of-audio-mixer-n4BDkIEls78?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>container</category>
    </item>
  </channel>
</rss>
