<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>webcodr</title>
    <link>https://webcodr.io/topics/linux/</link>
    <description>Recent content on webcodr</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 31 Oct 2025 21:48:59 +0000</lastBuildDate>
    <atom:link href="https://webcodr.io/topics/linux/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Fix Omarchy Gaming (Vulkan)</title>
      <link>https://webcodr.io/2025/10/fix-omarchy-gaming-vulkan/</link>
      <pubDate>Fri, 31 Oct 2025 21:48:59 +0000</pubDate>
      <guid>https://webcodr.io/2025/10/fix-omarchy-gaming-vulkan/</guid>
      <description>After setting up my new notebook, I wanted to try some games on Steam. Works like a charm on my mini PC with Omarchy, but not this time. After starting a game, it takes a few seconds and nothing, the game silently crashes.
After fiddling and searching around, Proton logging etc., still no cause in sight. Then I tried Doom 2016 and it worked! But why? Doom starts with an OpenGL renderer, after switching to Vulkan it behaves like the other games. So there’s something wrong with Vulkan?
</description>
      <content:encoded><![CDATA[<p>After setting up my new notebook, I wanted to try some games on Steam. Works like a charm on my mini PC with Omarchy, but not this time. After starting a game, it takes a few seconds and nothing, the game silently crashes.</p>
<p>After fiddling and searching around, Proton logging etc., still no cause in sight. Then I tried Doom 2016 and it worked! But why? Doom starts with an OpenGL renderer, after switching to Vulkan it behaves like the other games. So there&rsquo;s something wrong with Vulkan?</p>
<p>Vulkan Tools (Arch package <code>vulkan-tools</code>) to the rescue! After running <code>vulkaninfo</code> it became pretty clear that something important was missing: the Radeon Vulkan driver. No driver, no Vulkan. No Vulkan, no Proton &hellip;</p>
<p>Thankfully it&rsquo;s easy to fix, just install the missing packages:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -S vulkan-radeon mesa mesa-vdpau lib32-vulkan-radeon lib32-mesa
</span></span></code></pre></div><p>It should work immediately after the installation. There&rsquo;s already a GitHub issue with a pull request to solve this, but it&rsquo;s been open for weeks now and it&rsquo;s not clear, when the fix will be merged and released.</p>
<p>I don&rsquo;t know why it&rsquo;s no problem with my other PC, but I have installed Omarchy the old way on this machine (Arch Install and the Omarchy setup script). My best guess is that the bug was introduced with Omarchy&rsquo;s ISO setup.</p>
<h2 id="how-does-it-run"><a href="#how-does-it-run" class="heading-anchor">How does it run?</a></h2>
<p>Well, that Ryzen AI MAX+ 390 is an absolute beast. Doom 2016 runs with over 100 fps with max settings on the internal display (2880x1800) and still far beyond 60 fps in 4K on my main monitor. Just don&rsquo;t use fullscreen mode, it flickers like hell (known problem of Doom 2016 with the Vulkan renderer).</p>
<p>The HP ZBook Ultra is no gaming notebook, but it has a really powerful APU and is still a quite compact and light device on the level of a 14&quot; MacBook Pro. I don&rsquo;t want a 250 W 4 kg behemoth of a notebook.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Hyprland Trackpad Tips &amp; Tricks</title>
      <link>https://webcodr.io/2025/10/hyprland-trackpad-tips-tricks/</link>
      <pubDate>Wed, 29 Oct 2025 22:57:34 +0000</pubDate>
      <guid>https://webcodr.io/2025/10/hyprland-trackpad-tips-tricks/</guid>
      <description>For the first time in my life I bought a PC notebook. I didn’t even consider booting into the pre-installed Windows 11 and installed Omarchy right away.
The HP ZBook has a quite good trackpad, even compared to MacBooks, but some things seemed off. No right-click with two fingers, instead it would only work in the lower right corner. And I absolutely hate tapping, I want real clicks.
Turns out, it’s not the hardware. It’s all configurable in Hyprland. In Omarchy you can find the settings in .config/hypr/input, sub-category input:touchpad.
</description>
      <content:encoded><![CDATA[<p>For the first time in my life I bought a PC notebook. I didn&rsquo;t even consider booting into the pre-installed Windows 11 and installed Omarchy right away.</p>
<p>The HP ZBook has a quite good trackpad, even compared to MacBooks, but some things seemed off. No right-click with two fingers, instead it would only work in the lower right corner. And I absolutely hate tapping, I want real clicks.</p>
<p>Turns out, it&rsquo;s not the hardware. It&rsquo;s all configurable in Hyprland. In Omarchy you can find the settings in <code>.config/hypr/input</code>, sub-category <code>input:touchpad</code>.</p>
<p>Here are some handy options to tweak the settings:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">input <span class="o">{</span>
</span></span><span class="line"><span class="cl">  touchpad <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Enable two-finger clicks for right-clicking</span>
</span></span><span class="line"><span class="cl">    <span class="nv">clickfinger_behavior</span> <span class="o">=</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Disable tapping</span>
</span></span><span class="line"><span class="cl">    tap-to-click <span class="o">=</span> <span class="nb">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Enable natural scrolling</span>
</span></span><span class="line"><span class="cl">    <span class="nv">natural_scroll</span> <span class="o">=</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Disable the trackpad while typing (accidental tapping etc.)</span>
</span></span><span class="line"><span class="cl">    <span class="nv">disable_while_typing</span> <span class="o">=</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><p>There is even more like tap button maps, middle button emulation etc. &ndash; you can find all options <a href="https://wiki.hypr.land/Configuring/Basics/Variables/#touchpad">here</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>I&#39;m using Arch btw</title>
      <link>https://webcodr.io/2025/08/im-using-arch-btw/</link>
      <pubDate>Fri, 01 Aug 2025 20:36:11 +0000</pubDate>
      <guid>https://webcodr.io/2025/08/im-using-arch-btw/</guid>
      <description>Well, that escalated quickly. One week ago I would have said never to touch Arch (except SteamOS). Nothing personal, it’s just that I am primarily a Mac guy and never stayed with Linux that long. I really enjoyed Pop!_OS. System76 created a really nice flavor of Ubuntu, but it’s still Ubuntu, so packages are often out of date and you always have to rely on custom repos or other means to get current versions.
</description>
      <content:encoded><![CDATA[<p>Well, that escalated quickly. One week ago I would have said never to touch Arch (except SteamOS). Nothing personal, it&rsquo;s just that I am primarily a Mac guy and never stayed with Linux that long. I really enjoyed Pop!_OS. System76 created a really nice flavor of Ubuntu, but it&rsquo;s still Ubuntu, so packages are often out of date and you always have to rely on custom repos or other means to get current versions.</p>
<p>With Arch and its rolling release model the latest versions are almost immediately available. Sounds good? Of course there&rsquo;s a catch: breaking changes are also immediately available. Updating all dependencies can break many things at once and that can get very annoying pretty fast. From what I&rsquo;ve heard the situation improved over the years, so if you&rsquo;re doing nothing too crazy, it should be okay.</p>
<p>A few days ago I discovered <a href="https://omarchy.org/">Omarchy</a> from DHH (creator of Ruby on Rails). He created an opinionated Arch setup for developers. <del>Just install Arch via <code>archinstall</code> and run Omarchy&rsquo;s installation script and you&rsquo;re mostly done.</del> A few days ago Omarchy version 2.0 was released and brings a complete ISO file with its own installer. Just boot the ISO from a USB drive, enter some things like your user name, password, hostname etc. and wait a few minutes. That&rsquo;s it!</p>
<p>Omarchy ships with Hyprland, a really efficient and fast tiling Wayland compositor that doesn&rsquo;t look like it&rsquo;s from the 1980s. There&rsquo;s all sorts of eyecandy, everything is customizable and there are also many cool plugins.</p>
<p>Setting up Hyprland and plugins on your own can be a daunting task and a very time-consuming one as well. Omarchy to the rescue! It ships with a really good default configuration and is perfectly usable from the get-go, but that&rsquo;s only the beginning of the journey. DHH considers Omarchy a starting point for your own configuration and therefore made it very easy to customize the configuration for your needs. There is even a special Omarchy configuration tool for switching the global color theme (for Hyprland, Alacritty, Neovim etc.) or setting up fingerprint sensors for biometric authentication (should be working very well with Framework devices).</p>
<p>Omarchy also installs many useful terminal and GUI programs, like Alacritty (terminal emulator), Neovim, Spotify, Lazygit, <code>fd</code> etc. All GUI programs are mapped to intuitive hotkeys, f.e. <code>SUPER</code> + <code>M</code> for Spotify or <code>SUPER</code> + <code>B</code> for the browser (Chromium by default). <code>SUPER</code> + <code>Space</code> displays the application launcher (like a simple version of Spotlight or Raycast). There&rsquo;s much more for controlling the current window size to move the focus, switch virtual desktops, fullscreen etc.</p>
<p>All hotkeys are easily customizable in <code>.config/hypr/bindings.conf</code>. You don&rsquo;t like Chromium? Just install your favorite browser with Pacman (Arch&rsquo;s package manager) and update the variable <code>$browser</code> in the Hyprland config. That&rsquo;s it. The browser is also used for webapps mapped on hotkeys, ChatGPT f.e. is mapped on <code>SUPER</code> + <code>A</code>.</p>
<p>A little example to change the music hotkey to Apple Music as webapp (there is no native Linux version).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">bindd</span> <span class="o">=</span> SUPER, M, Apple Music, exec, <span class="nv">$webapp</span><span class="o">=</span><span class="s2">&#34;https://music.apple.com/de/library/recently-added?l=en&#34;</span>
</span></span></code></pre></div><p>Pressing <code>SUPER</code> + <code>M</code> now opens a browser window in app mode (no address bar etc.) with the Apple Music website. Nice. I also changed <code>SUPER</code> + <code>A</code> from ChatGPT to Theo Browne&rsquo;s awesome <a href="https://t3.chat/">T3.chat</a>.</p>
<p>That&rsquo;s far from all that Omarchy offers, but would be a bit much to list every feature in this blog post. Omarchy has a pretty good documentation with many useful tips, a troubleshooting section etc. They even have advice on my problems with Bluetooth. The Minis Forum UM760 comes with a MediaTek WiFi card and sadly MediaTek doesn&rsquo;t offer Linux drivers for this particular model. I switched to an Intel AX210 card for a few bucks and now it works like a charm.</p>
<p>According to DHH they will even ship an ISO file with Arch and a custom installer in the near future. It&rsquo;s also planned to switch the default terminal from Alacritty to Ghostty, but there are still some issues to solve.</p>
<h2 id="tldr"><a href="#tldr" class="heading-anchor">TL;DR</a></h2>
<p>If you&rsquo;re not afraid of Linux and want a decent base installation of Arch with many developer-focused features, give Omarchy a chance!</p>
<h3 id="updates"><a href="#updates" class="heading-anchor">Updates</a></h3>
<ol>
<li>2025-08-05: Omarchy 1.11 brings a new Hyprland config file structure and <code>bindd</code> command. I updated the file path for key bindings and the example for Apple Music accordingly.</li>
<li>2025-08-28: a small update about the release of Omarchy 2.0 with its own ISO and installer.</li>
</ol>
]]></content:encoded>
    </item>
    
    <item>
      <title>Fixing no A2DP with Bluetooth headsets on Linux</title>
      <link>https://webcodr.io/2024/10/fixing-no-a2dp-with-bluetooth-headsets-on-linux/</link>
      <pubDate>Mon, 07 Oct 2024 20:00:00 +0200</pubDate>
      <guid>https://webcodr.io/2024/10/fixing-no-a2dp-with-bluetooth-headsets-on-linux/</guid>
      <description>Please beware that the following instructions are suitable for media consumption only! After these changes your headset can’t make any calls without a dedicated microphone until you undo them.
Having trouble with the audio quality of your Bluetooth headset on Linux? It sounds awful if you’re listening to music and videos? Well, congratulations, I had the same problem and found a solution. At least if you’re only into listening and don’t make any calls. This works on Ubuntu or Ubuntu-based distributions like Pop!_OS or any other distribution that relies on BlueZ and Pipewire/WirePlumber for Bluetooth audio.
</description>
      <content:encoded><![CDATA[<p><strong>Please beware that the following instructions are suitable for media consumption only! After these changes your headset can&rsquo;t make any calls without a dedicated microphone until you undo them.</strong></p>
<p>Having trouble with the audio quality of your Bluetooth headset on Linux? It sounds awful if you&rsquo;re listening to music and videos? Well, congratulations, I had the same problem and found a solution. At least if you&rsquo;re only into listening and don&rsquo;t make any calls. This works on Ubuntu or Ubuntu-based distributions like Pop!_OS or any other distribution that relies on BlueZ and Pipewire/WirePlumber for Bluetooth audio.</p>
<h2 id="whats-wrong"><a href="#whats-wrong" class="heading-anchor">What&rsquo;s wrong?</a></h2>
<p>Bluetooth has different profiles for different things. If you want to make a call, your headset will switch to the Hands-free Profile (HFP). The available bandwidth will be shared for audio input and output and different audio codecs will be used. It&rsquo;s good for calls, but really shitty if you want to listen to music. The headset needs to switch to A2DP (Advanced Audio Distribution Profile) for good sound quality. This should happen automatically and HFP should only be active, if you&rsquo;re making a call. I never had trouble on macOS or Windows with this, but I&rsquo;m trying Pop!_OS now. It worked for a few days, but today the headset would only connect with the HFP and streaming music or watching videos was as pleasant as dental treatment with a power drill.</p>
<p>Many searches later, I found out that WirePlumber (the session manager for the Pipewire multimedia framework) has some bugs that will trigger HFP on BT headsets even if there&rsquo;s no call. That&rsquo;s pretty annoying but at least somewhat easy to solve. There&rsquo;s a <a href="https://wiki.archlinux.org/title/Bluetooth_headset#Disable_PipeWire_HSP/HFP_profile">solution in the Arch Linux Wiki</a>, but it needs some modifications for Ubuntu-based distributions.</p>
<h2 id="the-solution"><a href="#the-solution" class="heading-anchor">The solution</a></h2>
<p>First you need to create a directory path in your home directory:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">mkdir -p ~/.config/wireplumber/bluetooth.lua.d/
</span></span></code></pre></div><p>This will create a directory that allows you to override the default WirePlumber Bluetooth config without overwriting the original file.</p>
<p>Now copy the original config to the override directory:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cp /usr/share/wireplumber/bluetooth.lua.d/50-bluez-config.lua ~/.config/wireplumber/bluetooth.lua.d/
</span></span></code></pre></div><p>You can now edit the file in the override directory.</p>
<p>Beware that the original instructions from the Arch Linux Wiki contain a conf file, but at least with Ubuntu (and Pop!_OS) the config file is written in lua, so it&rsquo;s a completely different syntax.</p>
<p>Look for <code>bluez5.roles</code> &ndash; it should be commented out. I would recommend not to replace the comment and just put the following line below. It&rsquo;s easier to undo if something goes wrong or you need to enable HFP.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="p">[</span><span class="s2">&#34;bluez5.roles&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;[ a2dp_sink a2dp_source ]&#34;</span>
</span></span></code></pre></div><p>Save the file and restart the Bluetooth service:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo systemctl restart bluetooth
</span></span></code></pre></div><p>Now reconnect your device and A2DP should be working fine.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Terminal evolved</title>
      <link>https://webcodr.io/2023/05/terminal-evolved/</link>
      <pubDate>Mon, 15 May 2023 19:22:14 +0000</pubDate>
      <guid>https://webcodr.io/2023/05/terminal-evolved/</guid>
      <description>I always saw myself as a casual user of the terminal. I preferred zsh with the Prezto framework within iTerm 2 with tabs and that’s about it. No more! A colleague of mine introduced me to kitty as terminal emulator, together with tmux and Neovim. That’s a lot to swallow. I was never a fan of the vi/vim user experience and more of a mouse guy. Well, what should I say? It’s awesome if you’re getting used to it. Let me explain …
</description>
      <content:encoded><![CDATA[<p>I always saw myself as a casual user of the terminal. I preferred zsh with the Prezto framework within iTerm 2 with tabs and that&rsquo;s about it. No more! A colleague of mine introduced me to kitty as terminal emulator, together with tmux and Neovim. That&rsquo;s a lot to swallow. I was never a fan of the vi/vim user experience and more of a mouse guy. Well, what should I say? It&rsquo;s awesome if you&rsquo;re getting used to it. Let me explain &hellip;</p>
<h2 id="jfyi"><a href="#jfyi" class="heading-anchor">JFYI</a></h2>
<p>kitty, tmux and nvim are available in Homebrew on macOS and should be also available in your favorite package manager on Linux.</p>
<p>Be aware, that most examples contain some macOS-specific settings marked with corresponding comments, as I am a Mac user.</p>
<h2 id="kitty"><a href="#kitty" class="heading-anchor">kitty</a></h2>
<p>iTerm 2 is a pretty good terminal emulator with many features and way better than Apple&rsquo;s sorry excuse of a terminal. To be fair, the macOS terminal app has gotten better over the years, but it still lacks essential features like true color support. As good as iTerm 2 is, there&rsquo;s one catch: iTerm 2 is slow. GPU-accelerated alternatives like kitty render much faster. Don&rsquo;t get me wrong, iTerm 2 is no slouch and works well, but if you&rsquo;re on the way to a terminal power-user, you will notice it. Switching between tmux windows is much faster in kitty or other terminal emulators like Alacritty. The latter is a really nice app, but unfortunately has some trouble with macOS key bindings within tmux and I found no easy solution to that. Kitty works out of the box.</p>
<h3 id="taming-the-kitten"><a href="#taming-the-kitten" class="heading-anchor">Taming the kitten</a></h3>
<p>Kitty&rsquo;s configuration is very well documented, but can be overwhelming. There are hundreds of options to explore. One of the most important is the font. Grab yourself a <a href="https://www.nerdfonts.com/">nerd-font</a>, add it to your OS and specify the font family. I&rsquo;m using &ldquo;Hack Nerd Font Mono&rdquo; for this example. Just open your kitty config in <code>~/.config/kitty/kitty.conf</code> and add the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># Replace with your preferred font</span>
</span></span><span class="line"><span class="cl"><span class="nx">font_family</span>			<span class="nx">Hack</span> <span class="nx">Nerd</span> <span class="nx">Font</span> <span class="nx">Mono</span> 
</span></span><span class="line"><span class="cl"><span class="nx">bold_font</span>			<span class="nx">auto</span>
</span></span><span class="line"><span class="cl"><span class="nx">italic_font</span>			<span class="nx">auto</span>
</span></span><span class="line"><span class="cl"><span class="nx">bold_italic_font</span>	<span class="nx">auto</span>
</span></span><span class="line"><span class="cl"><span class="c"># Replace with your preferred font size in points</span>
</span></span><span class="line"><span class="cl"><span class="nx">font_size</span>			<span class="mf">17.0</span> 
</span></span></code></pre></div><p>Save and reload the config via menu bar. Enjoy!</p>
<p>Now that&rsquo;s out of the way, how about some comfort features?</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># Set how many lines the buffer can scroll back</span>
</span></span><span class="line"><span class="cl"><span class="nx">scrollback_lines</span> <span class="mi">10000</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Auto-detect URLs</span>
</span></span><span class="line"><span class="cl"><span class="nx">detect_url</span> <span class="nx">yes</span>
</span></span><span class="line"><span class="cl"><span class="c"># Open URLs with ctrl + click</span>
</span></span><span class="line"><span class="cl"><span class="nx">mouse_map</span> <span class="nx">ctrl</span><span class="err">+</span><span class="nx">left</span> <span class="nx">press</span> <span class="nx">ungrabbed</span><span class="p">,</span><span class="nx">grabbed</span> <span class="nx">mouse_click_url</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Copy the mouse selection directly to the clipboard</span>
</span></span><span class="line"><span class="cl"><span class="nx">copy_on_select</span> <span class="nx">yes</span> 
</span></span><span class="line"><span class="cl"><span class="c"># Paste on right click</span>
</span></span><span class="line"><span class="cl"><span class="nx">mouse_map</span> <span class="nx">right</span> <span class="nx">press</span> <span class="nx">grabbed</span><span class="p">,</span><span class="nx">ungrabbed</span> <span class="nx">no-op</span>
</span></span><span class="line"><span class="cl"><span class="nx">mouse_map</span> <span class="nx">right</span> <span class="nx">click</span> <span class="nx">grabbed</span><span class="p">,</span><span class="nx">ungrabbed</span> <span class="nx">paste_from_clipboard</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Enable macOS copy &amp; paste via CMD + c/v</span>
</span></span><span class="line"><span class="cl"><span class="nx">map</span> <span class="nx">cmd</span><span class="err">+</span><span class="nx">c</span> <span class="nx">copy_to_clipboard</span>
</span></span><span class="line"><span class="cl"><span class="nx">map</span> <span class="nx">cmd</span><span class="err">+</span><span class="nx">v</span> <span class="nx">paste_from_clipboard</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Jump to beginning and end of a word with alt and arrow keys (macOS)</span>
</span></span><span class="line"><span class="cl"><span class="nx">map</span> <span class="nx">alt</span><span class="err">+</span><span class="nx">left</span> <span class="nx">send_text</span> <span class="nx">all</span> <span class="err">\</span><span class="nx">x1b</span><span class="err">\</span><span class="nx">x62</span>
</span></span><span class="line"><span class="cl"><span class="nx">map</span> <span class="nx">alt</span><span class="err">+</span><span class="nx">right</span> <span class="nx">send_text</span> <span class="nx">all</span> <span class="err">\</span><span class="nx">x1b</span><span class="err">\</span><span class="nx">x66</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Jump to beginning and end of a line with cmd and arrow keys (macOS)</span>
</span></span><span class="line"><span class="cl"><span class="nx">map</span> <span class="nx">cmd</span><span class="err">+</span><span class="nx">left</span> <span class="nx">send_text</span> <span class="nx">all</span> <span class="err">\</span><span class="nx">x01</span>
</span></span><span class="line"><span class="cl"><span class="nx">map</span> <span class="nx">cmd</span><span class="err">+</span><span class="nx">right</span> <span class="nx">send_text</span> <span class="nx">all</span> <span class="err">\</span><span class="nx">x05</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Nicer titlebar on macOS</span>
</span></span><span class="line"><span class="cl"><span class="nx">macos_titlebar_color</span> <span class="nx">background</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Make vim the default editor for the kitty config</span>
</span></span><span class="line"><span class="cl"><span class="nx">editor</span> <span class="nx">vim</span>
</span></span></code></pre></div><p>Want some color? No problem, there are hundreds of themes available just a Google search away. I prefer <a href="https://github.com/catppuccin/catppuccin">Catppuccin Macchiato</a>, but choose what ever you want. kitty config files support includes, so it&rsquo;s easy to add a theme:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="nx">include</span> <span class="p">.</span><span class="err">/</span><span class="nx">theme</span><span class="p">.</span><span class="nx">conf</span>
</span></span></code></pre></div><p>And put the file <code>theme.conf</code> in the same directory as the kitty config and paste your theme of choice into the file.</p>
<h2 id="tmux"><a href="#tmux" class="heading-anchor">tmux</a></h2>
<p>So, what the hell is tmux? If you need a terminal, tmux will be one of your best friends. Did you ever run something complex on the shell and accidentally closed the terminal window or something similar happened during an SSH session? It sucks.</p>
<p>tmux sessions to the rescue! A session will be open until you close it, so even if your internet connection breaks down during an SSH session, nothing will vanish. Just connect to the server again and re-join the tmux session. Everything will be as you left it.</p>
<p>Just type <code>tmux new</code> or if you want to give the session a name <code>tmux new -s my_new_session</code> . Of course tmux can handle multiple sessions. To list all open sessions use <code>tmux ls</code> and to join a session type <code>tmux a -t session_name</code> .</p>
<p>After opening a new session, tmux will display window 0. Need more windows? No problem. Need a window inside a window? No problem, they are called panes. Windows can be split in horizontal or vertical panes, as many and wild as you like.</p>
<p>Inside a tmux session you can trigger commands via a so-called prefix key following one or more keys to tell tmux what you want to do. The default prefix key is <code>ctrl + b</code> . To split your current window into two horizontal panes press <code>ctrl + b</code> followed by <code>%</code> , for a vertical split use <code>ctrl + b</code> and <code>&quot;</code>.</p>
<p>To close a pane, just exit the shell of the pane with <code>exit</code>. You can switch panes with <code>ctrl + b</code> followed by an arrow key in the corresponding direction.</p>
<p>Our new best friend <code>ctrl + b</code> is not the most intuitive key combination. I recommend using <code>ctrl + a</code> and map the caps lock key to ctrl (pro-tip: macOS can do this for you without tools or customizable keyboard firmware). It&rsquo;s way faster and easier to press. Of course, you can map whatever key combination you want, just beware of conflicts with other combinations like <code>cmd + space</code>.</p>
<p>To change the command key, go to your tmux config in <code>~/.tmux.conf</code> and add the following lines:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="nx">unbind</span> <span class="nx">C-b</span>
</span></span><span class="line"><span class="cl"><span class="nx">set</span> <span class="nx">-g</span> <span class="nx">prefix</span> <span class="nx">C-a</span>
</span></span><span class="line"><span class="cl"><span class="nx">bind-key</span> <span class="nx">C-a</span> <span class="nx">send-prefix</span>
</span></span></code></pre></div><p>This unbinds <code>ctrl + b</code> and sets the prefix key to <code>ctrl + a</code>. To reload the tmux config inside a session use <code>tmux source-file ~/.tmux.conf</code>.</p>
<h3 id="more-more"><a href="#more-more" class="heading-anchor">More? More!</a></h3>
<p>There is much more you can do. Here are some recommendations.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># Enable mouse support</span>
</span></span><span class="line"><span class="cl"><span class="nx">set</span> <span class="nx">-g</span> <span class="nx">mouse</span> <span class="nx">on</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Set history limit to 100,000 lines</span>
</span></span><span class="line"><span class="cl"><span class="nx">set-option</span> <span class="nx">-g</span> <span class="nx">history-limit</span> <span class="mi">100000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Enable true color support</span>
</span></span><span class="line"><span class="cl"><span class="nx">set-option</span> <span class="nx">-sa</span> <span class="nx">terminal-overrides</span> <span class="s2">&#34;,xterm*:Tc&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Start windows and panes at 1, not 0</span>
</span></span><span class="line"><span class="cl"><span class="nx">set</span> <span class="nx">-g</span> <span class="nx">base-index</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="nx">set</span> <span class="nx">-g</span> <span class="nx">pane-base-index</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="nx">set-window-option</span> <span class="nx">-g</span> <span class="nx">pane-base-index</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="nx">set-option</span> <span class="nx">-g</span> <span class="nx">renumber-windows</span> <span class="nx">on</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Open new panes in the same directory as their parent pane</span>
</span></span><span class="line"><span class="cl"><span class="nx">bind</span> <span class="s1">&#39;&#34;&#39;</span> <span class="nx">split-window</span> <span class="nx">-v</span> <span class="nx">-c</span> <span class="s2">&#34;#{pane_current_path}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">bind</span> <span class="err">%</span> <span class="nx">split-window</span> <span class="nx">-h</span> <span class="nx">-c</span> <span class="s2">&#34;#{pane_current_path}&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Vim style pane selection</span>
</span></span><span class="line"><span class="cl"><span class="nx">bind</span> <span class="nx">h</span> <span class="nx">select-pane</span> <span class="nx">-L</span>
</span></span><span class="line"><span class="cl"><span class="nx">bind</span> <span class="nx">j</span> <span class="nx">select-pane</span> <span class="nx">-D</span> 
</span></span><span class="line"><span class="cl"><span class="nx">bind</span> <span class="nx">k</span> <span class="nx">select-pane</span> <span class="nx">-U</span>
</span></span><span class="line"><span class="cl"><span class="nx">bind</span> <span class="nx">l</span> <span class="nx">select-pane</span> <span class="nx">-R</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Shift arrow to switch windows</span>
</span></span><span class="line"><span class="cl"><span class="nx">bind</span> <span class="nx">-n</span> <span class="nx">S-Left</span>  <span class="nx">previous-window</span>
</span></span><span class="line"><span class="cl"><span class="nx">bind</span> <span class="nx">-n</span> <span class="nx">S-Right</span> <span class="nx">next-window</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Don&#39;t scroll down on copy via mouse</span>
</span></span><span class="line"><span class="cl"><span class="nx">unbind</span> <span class="nx">-T</span> <span class="nx">copy-mode-vi</span> <span class="nx">MouseDragEnd1Pane</span>
</span></span></code></pre></div><p>With mouse support you can resize panes with drag &amp; drop and even get a context menu with a right click. By default tmux assigns numbers to windows for fast switching via <code>ctrl + b</code> and <code>number key</code>. Unfortunately the developers decided to begin with 0. This is technically correct, but on the keyboard it&rsquo;s quite unintuitive, so we can tell tmux to begin with 1. The rest is pretty much self-explanatory.</p>
<h2 id="neovim"><a href="#neovim" class="heading-anchor">Neovim</a></h2>
<p>Why neo? Good old vim is extensible via vimscript. It works, but it&rsquo;s like bash: ugly as fuck. Neovim is a fork of vim and replaces vimscript with support for lua-based extensions. So it&rsquo;s still blazingly fast(tm) and much nicer to write extensions.</p>
<p>You could setup Neovim and the necessary extensions yourself, but I won&rsquo;t recommend it in the beginning. Pre-built configs like <a href="https://astronvim.com/">AstroNvim</a> or <a href="https://github.com/NvChad/NvChad">NvChad</a> will massively speed up the process and have great defaults. It can be very overwhelming to get used to vim/nvim, so I would recommend to wait with your own config until you get more familiar with a keyboard-based editor.</p>
<h3 id="help-i-cant-quit-vim"><a href="#help-i-cant-quit-vim" class="heading-anchor">HELP! I can&rsquo;t quit vim!</a></h3>
<p>Don&rsquo;t worry, you are not the first and will certainly not be the last. vim is a so-called modal-based editor. It has different modes like command, insert, visual etc. As you may have noticed, typing will not add text to the buffer. You need to press certain keys like <code>i</code>  to enter insert mode to edit text. There are other keys to go in insert mode and every one of them has a slightly different, but pretty useful function, like <code>o</code> which creates a new line below the cursor and starts insert mode.</p>
<p>To exit vim you have to leave the insert mode by pressing <code>esc</code>. Now you are in command mode and can quit by typing <code>:</code> to enter the command line mode and hit <code>q</code> for quit, followed by enter to execute the command.</p>
<p>If you want to save a file, enter command line mode and use <code>w</code> for write. It&rsquo;s possible to chain certain commands. <code>wq</code> will save the file and quit vim.</p>
<p>Congratulations, you now know how to exit vim!</p>
<h3 id="navigation"><a href="#navigation" class="heading-anchor">Navigation</a></h3>
<p>To move the cursor you would just use the arrow keys in most other editors. But there is a more efficient key mapping in command mode: <code>h</code> (left), <code>j</code> (down), <code>k</code> (up) and <code>l</code> (right). No need to move your hand to the arrow keys anymore. To be honest, I&rsquo;m still not comfortable with this way of navigation, but it&rsquo;s objectively more efficient than moving the right hand to the arrow keys.</p>
<p>Of course vim has way more navigation possibilities. For example, the cursor can jump forward by one word with <code>w</code> and backwards with <code>b</code>.  Press <code>$</code> to jump to the end of the current line or <code>0</code> to the beginning. <code>G</code> navigates you to the last line and <code>gg</code> jumps to the first line. And there is so much more to explore. I recommend a decent <a href="https://vim.rtorr.com/">vim cheat sheet</a> to learn. But do yourself a favor and try not to learn all keys at once. You will only become frustrated and give up more easily, it&rsquo;s just too much to learn everything in the beginning.</p>
<p>Netflix developer and Twitch Streamer <a href="https://twitter.com/ThePrimeagen">ThePrimeagen</a> designed a Neovim plug-in to learn the navigation commands as a game. It&rsquo;s pretty good and fun: <a href="https://github.com/ThePrimeagen/vim-be-good">https://github.com/ThePrimeagen/vim-be-good</a></p>
<p>AstroNvim has many plug-ins out of the box. Syntax highlighting, linting, auto-formatting etc. are all there, but you need to install the corresponding servers, parsers etc.</p>
<p>To do this, enter command line mode and use <code>LspInstall</code> followed by the language name for installing a language server protocol. A language server for <a href="https://github.com/tree-sitter/tree-sitter">Tree-Sitter</a> can be installed with <code>TSInstall</code> followed by the language name. If there&rsquo;s nothing available, both commands will recommend plug-ins according to your input, if available.</p>
<p>Be aware, that LSPs and Tree-Sitter will not bring the necessary tools with them. If you install tooling for Rust, rust-analyzer has to be installed on the system. Same goes for ESLint, Prettier, Kotlin, Java etc.</p>
<h2 id="the-end"><a href="#the-end" class="heading-anchor">The End</a></h2>
<h2 id="-for-now"><a href="#-for-now" class="heading-anchor">&hellip; for now</a></h2>
<p>That was a lot to unpack, but there is so much more to show you. I will be back with more productivity tools and tips in the near future. Stay tuned!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>nginx Reverse Proxy on Raspberry Pi with Let&#39;s Encrypt</title>
      <link>https://webcodr.io/2018/02/nginx-reverse-proxy-on-raspberry-pi-with-lets-encrypt/</link>
      <pubDate>Sat, 17 Feb 2018 22:28:05 +0100</pubDate>
      <guid>https://webcodr.io/2018/02/nginx-reverse-proxy-on-raspberry-pi-with-lets-encrypt/</guid>
      <description>Another weekend, another guide. This time I will show you, how to setup a reverse proxy with nginx on a Raspberry Pi and secure the connection with a certificate from Let’s Encrypt.
NOTICE OF CAUTION BEGIN
Your Raspberry Pi will be exposed to the internet on port 80 for HTTP and port 443 for HTTPS/TLS. A potential attacker could have access to your network. Please make sure, that you keep yourself up to date on security issues and install updates regularly.
</description>
      <content:encoded><![CDATA[<p>Another weekend, another guide. This time I will show you, how to setup a reverse proxy with nginx on a Raspberry Pi and secure the connection with a certificate from Let&rsquo;s Encrypt.</p>
<p><em><strong>NOTICE OF CAUTION BEGIN</strong></em></p>
<p>Your Raspberry Pi will be exposed to the internet on port 80 for HTTP and port 443 for HTTPS/TLS. A potential attacker could have access to your network. Please make sure, that you keep yourself up to date on security issues and install updates regularly.</p>
<p>To secure your network, I recommend an isolated VLAN for your Pi and the web servers.</p>
<p>If this makes you uncomfortable, please re-consider running web servers within your network, that can be accessed from outside.</p>
<p><em><strong>NOTICE OF CAUTION END</strong></em></p>
<p>Still here? Okay, you have been warned. Let&rsquo;s go.</p>
<p>Please make sure, to forward port 80 and 443 from your router to the Raspberry Pi.</p>
<h2 id="install-nginx-and-certbot"><a href="#install-nginx-and-certbot" class="heading-anchor">Install nginx and Certbot</a></h2>
<p>This guide assumes that you&rsquo;re running the latest version of Raspbian on your Pi. It&rsquo;s based on Debian Stretch. If you&rsquo;re using an older version based on Jessie or even Wheezy, please consider a dist upgrade. This is not without risk, so back-up your current installation!</p>
<p>If you&rsquo;re already running a web server on your Pi, you should disable it. Otherwise nginx will not be able to use port 80 and 443. If you need that other web server, you should configure it to run on other ports and use nginx to forward the connections.</p>
<p>Now, to the installation:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo apt-get update
</span></span><span class="line"><span class="cl">sudo apt-get install nginx-full certbot -y
</span></span></code></pre></div><p>The nginx service will automatically start after APT finished.</p>
<h2 id="issue-a-certificate"><a href="#issue-a-certificate" class="heading-anchor">Issue a certificate</a></h2>
<p>In order to create a certificate, Certbot will need access to port 80, but that&rsquo;s no problem. Look at the following command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo certbot certonly --authenticator standalone -d example.com --pre-hook <span class="s2">&#34;service nginx stop&#34;</span> --post-hook <span class="s2">&#34;service nginx start&#34;</span>
</span></span></code></pre></div><p>This tells certbot to issue a certificate for <code>example.com</code> by using a standalone web server to validate the domain for the Let&rsquo;s Encrypt service. In order to run the server, you have to shutdown nginx until certbot is finished. The pre hook and post hook parameters will help you with that.</p>
<p>After the certificate is successfully issued, your new certificate and all other necessary files will be available here: <code>/etc/letsencrypt/live/example.com</code></p>
<h2 id="configure-nginx"><a href="#configure-nginx" class="heading-anchor">Configure nginx</a></h2>
<p>Don&rsquo;t like vim? Just use whatever editor you prefer instead.</p>
<p>Add a new site config to nginx:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo vim /etc/nginx/sites-enabled/example.com
</span></span></code></pre></div><p>All files in <code>/etc/nginx/sites-enabled/</code> will be automatically used by nginx.</p>
<p>Here is a config for <code>example.com</code>, that will be forwarded to <code>10.0.0.2</code>.</p>
<p>Please adjust it to your needs and paste/save it.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">server_name</span> <span class="s">example.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_pass</span> <span class="s">http://10.0.0.2:80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">server_name</span> <span class="s">example.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_certificate</span> <span class="s">/etc/letsencrypt/live/example.com/fullchain.pem</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_certificate_key</span> <span class="s">/etc/letsencrypt/live/example.com/privkey.pem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_session_timeout</span> <span class="s">1d</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_session_cache</span> <span class="s">shared:SSL:50m</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_session_tickets</span> <span class="no">off</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_protocols</span> <span class="s">TLSv1.1</span> <span class="s">TLSv1.2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_ciphers</span> <span class="s">&#39;ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_prefer_server_ciphers</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_stapling</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_stapling_verify</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">ssl_trusted_certificate</span> <span class="s">/etc/letsencrypt/live/example.com/chain.pem</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_pass</span> <span class="s">https://10.0.0.2:443</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>To test your config, use the following command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo nginx -t
</span></span></code></pre></div><p>The validator will tell you, if anything is wrong and why it&rsquo;s not working.</p>
<p>No errors? Great, just restart nginx and your reverse proxy is working.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo service nginx restart
</span></span></code></pre></div><h2 id="certificate-auto-renewal"><a href="#certificate-auto-renewal" class="heading-anchor">Certificate auto-renewal</a></h2>
<p>The certbot certificate renewal will renew all certificates you created with certbot.</p>
<p>Checking the renewal process:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo certbot renew --dry-run --pre-hook <span class="s2">&#34;service nginx stop&#34;</span> --post-hook <span class="s2">&#34;service nginx start&#34;</span>
</span></span></code></pre></div><p>The parameter <code>--dry-run</code> allows to test the renewal without actually replacing the certificates.</p>
<p>In order to renew the certificates automatically, open crontab for root:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo crontab -e
</span></span></code></pre></div><p>Add the following cron job and save.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="m">0</span> <span class="m">0</span> <span class="m">1</span> * * sudo certbot renew --pre-hook <span class="s2">&#34;service nginx stop&#34;</span> --post-hook <span class="s2">&#34;service nginx start&#34;</span>
</span></span></code></pre></div><p>And you&rsquo;re done. From now on, your certificates will be renewed every month automatically.</p>
<p>More domains? No problem, just issue the certificate and add another site config.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
