<?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>Tech on Pink Noise</title><link>https://rustikus.codeberg.page/tech/</link><description>Recent content in Tech on Pink Noise</description><generator>Hugo -- 0.163.3</generator><language>en-us</language><lastBuildDate>Wed, 01 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://rustikus.codeberg.page/tech/index.xml" rel="self" type="application/rss+xml"/><item><title>KOReader Plugins and Library Integration</title><link>https://rustikus.codeberg.page/tech/koreader-plugins-and-library-integration/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/koreader-plugins-and-library-integration/</guid><description>&lt;p&gt;&lt;a href="https://github.com/koreader/koreader"&gt;KOReader&lt;/a&gt; is one of the best upgrades you can give an e-reader. It runs on devices like Kindle, Kobo, PocketBook, Android, and Linux, and it is especially nice if you want more control over formats, typography, PDF handling, OPDS catalogs, and plugins than the stock reader usually provides.&lt;/p&gt;
&lt;p&gt;The default experience is already powerful, but KOReader gets much more interesting once you add a few focused plugins and connect it to a proper library backend.&lt;/p&gt;</description></item><item><title>Quicktip: USGerman Keyboard Layout on macOS</title><link>https://rustikus.codeberg.page/tech/usgerman-keyboard-layout-macos/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/usgerman-keyboard-layout-macos/</guid><description>&lt;p&gt;If you use a Mac with a US keyboard but still write German regularly, the &lt;a href="https://hci.rwth-aachen.de/usgermankeyboard"&gt;USGerman keyboard layout&lt;/a&gt; is a small quality-of-life fix. It keeps the normal US layout and adds German umlauts and &lt;code&gt;ß&lt;/code&gt; behind the Option key, so you do not have to switch to a full German keyboard layout or use macOS&amp;rsquo; long-press character picker.&lt;/p&gt;
&lt;p&gt;After downloading and unzipping the layout, copy &lt;code&gt;Roman.bundle&lt;/code&gt; into the system keyboard layouts folder:&lt;/p&gt;</description></item><item><title>Quicktip: Blocking LG WebOS Ads</title><link>https://rustikus.codeberg.page/tech/blocking-lg-webos-ads-and-tracking/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/blocking-lg-webos-ads-and-tracking/</guid><description>&lt;p&gt;LG WebOS TVs are notorious for phoning home &amp;ndash; ads on the home screen, tracking via ACR (automatic content recognition), and telemetry across 1,700+ domains including &lt;code&gt;alphonso.tv&lt;/code&gt;, &lt;code&gt;lgsmartad.com&lt;/code&gt;, and various &lt;code&gt;lge.com&lt;/code&gt; subdomains. HaGeZi maintains a dedicated &lt;a href="https://raw.githubusercontent.com/hagezi/dns-blocklists/main/domains/native.lgwebos.txt"&gt;LG WebOS DNS blocklist&lt;/a&gt; for all of these that you can add to your DNS blocker of choice.&lt;/p&gt;
&lt;p&gt;One domain worth blocking separately is &lt;code&gt;snu.lge.com&lt;/code&gt; &amp;ndash; this is responsible for the firmware update notification popups. Blocking it stops the TV from nagging you to update, which is useful if you want to stay on a specific firmware version.&lt;/p&gt;</description></item><item><title>Quicktip: WebOS Homebrew Apps for LG TVs</title><link>https://rustikus.codeberg.page/tech/webos-homebrew-apps-for-lg-tvs/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/webos-homebrew-apps-for-lg-tvs/</guid><description>&lt;p&gt;LG TVs let you enable a &lt;a href="https://webostv.developer.lge.com/develop/getting-started/developer-mode-app"&gt;Developer Mode&lt;/a&gt; through the LG Content Store, which allows sideloading apps via &lt;code&gt;ares-install&lt;/code&gt;. Two apps worth installing:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/NicholasBly/youtube-webos"&gt;youtube-webos&lt;/a&gt; is an actively maintained fork that replaces the stock YouTube app with one that blocks ads, integrates &lt;a href="https://sponsor.ajay.app/"&gt;SponsorBlock&lt;/a&gt;, and adds features like Return YouTube Dislike, force max quality, and customizable themes. The official YouTube app needs to be uninstalled first.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Moonfin-Client/WebOS"&gt;Moonfin&lt;/a&gt; is an enhanced Jellyfin client built with LG&amp;rsquo;s Enact framework. It supports multi-server unified libraries, Jellyseerr integration for requesting content, and hardware-accelerated playback through the native webOS media pipeline.&lt;/p&gt;</description></item><item><title>Deploying Hugo to Codeberg Pages</title><link>https://rustikus.codeberg.page/tech/deploying-hugo-to-codeberg-pages/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/deploying-hugo-to-codeberg-pages/</guid><description>&lt;p&gt;This site uses Forgejo Actions to automatically build and deploy whenever changes are pushed. The repository is named &lt;code&gt;pages&lt;/code&gt;, which is required for Codeberg Pages to serve it at the canonical URL.&lt;/p&gt;
&lt;p&gt;The source files live in the &lt;code&gt;main&lt;/code&gt; branch, and the workflow builds the Hugo site and pushes the resulting HTML to a &lt;code&gt;pages&lt;/code&gt; branch. After the first deployment, you need to change the default branch to &lt;code&gt;pages&lt;/code&gt; in the repository settings.&lt;/p&gt;</description></item><item><title>Tailscale Setup Guide: Self-Hosted and UniFi Integration</title><link>https://rustikus.codeberg.page/tech/tailscale-setup-guide/</link><pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/tailscale-setup-guide/</guid><description>&lt;p&gt;Tailscale is a modern VPN built on WireGuard with automatic mesh networking. For complete self-hosting, use Headscale—an open-source Tailscale control server implementation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UniFi Devices&lt;/strong&gt;: If you run UniFi hardware (Dream Machine, Dream Router, etc.), install Tailscale directly on your gateway:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install the latest version of Tailscale on UniFi OS 2.x+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sSLq https://raw.github.com/SierraSoftworks/tailscale-udm/main/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Start Tailscale&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tailscale up
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Advertise routes to your local network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tailscale up --advertise-routes&lt;span class="o"&gt;=&lt;/span&gt;10.0.0.0/24 --advertise-exit-node
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The installation automatically restarts after UniFi updates, runs via systemd on UniFi OS 2.x+, and supports Tailscale SSH. It works on UniFi Dream Machine, Dream Router, Cloud Key Gen 2, and similar devices.&lt;/p&gt;</description></item><item><title>Quicktip: Bypass Tailscale Routing for Local LAN</title><link>https://rustikus.codeberg.page/tech/bypass-tailscale-routing-for-local-lan/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/bypass-tailscale-routing-for-local-lan/</guid><description>&lt;p&gt;When using Tailscale with Magic DNS enabled, hostname resolution always routes through Tailscale—even when you&amp;rsquo;re on your home network. This adds unnecessary latency for local connections. The issue is documented in &lt;a href="https://github.com/tailscale/tailscale/issues/1227"&gt;GitHub issue #1227&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A workaround is to use split DNS with a custom domain. Configure your local router with local DNS entries and set up public DNS entries that point to Tailscale IPs. When you&amp;rsquo;re at home, your devices use the router&amp;rsquo;s DNS. When away, they use public DNS.&lt;/p&gt;</description></item><item><title>k9s</title><link>https://rustikus.codeberg.page/tech/k9s/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/k9s/</guid><description>&lt;p&gt;&lt;strong&gt;Kubernetes CLI To Manage Your Clusters In Style!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;K9s provides a terminal UI to interact with your Kubernetes clusters. The aim of this project is to make it easier to navigate, observe and manage your applications in the wild. K9s continually watches Kubernetes for changes and offers subsequent commands to interact with your observed resources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Link:&lt;/strong&gt; &lt;a href="https://github.com/derailed/k9s"&gt;https://github.com/derailed/k9s&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://k9scli.io"&gt;https://k9scli.io&lt;/a&gt;&lt;/p&gt;</description></item><item><title>AeroSpace: Fixing Homebrew PATH for GUI Apps on macOS</title><link>https://rustikus.codeberg.page/tech/aerospace-homebrew-path-macos/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/aerospace-homebrew-path-macos/</guid><description>&lt;p&gt;When using &lt;a href="https://github.com/nikitabobko/AeroSpace"&gt;AeroSpace&lt;/a&gt; (a tiling window manager for macOS), GUI applications don&amp;rsquo;t have Homebrew&amp;rsquo;s prefix in their &lt;code&gt;PATH&lt;/code&gt; by default. This means Homebrew binaries like &lt;code&gt;sketchybar&lt;/code&gt; or &lt;code&gt;yabai&lt;/code&gt; won&amp;rsquo;t be found unless you specify the full path.&lt;/p&gt;
&lt;p&gt;AeroSpace handles this automatically with a sensible default configuration. If you don&amp;rsquo;t override the &lt;code&gt;[exec]&lt;/code&gt; section, it uses:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;inherit-env-vars&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env-vars&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;PATH&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/opt/homebrew/bin:/opt/homebrew/sbin:${PATH}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you need custom environment variables, preserve the Homebrew PATH when overriding the &lt;code&gt;[exec]&lt;/code&gt; section:&lt;/p&gt;</description></item><item><title>Generate a PDF Planner for Kindle Scribe or iPad</title><link>https://rustikus.codeberg.page/tech/generate-pdf-planner-for-kindle-scribe/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/generate-pdf-planner-for-kindle-scribe/</guid><description>&lt;p&gt;&lt;a href="https://remarkably-organized.pages.dev/planner"&gt;Remarkably Organized&lt;/a&gt; is a web-based tool for generating custom PDF planners. Here&amp;rsquo;s a preconfigured version optimized for note-taking on Kindle Scribe or iPad:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://remarkably-organized.pages.dev/planner?help=0&amp;amp;settings=%7B%22quarterPage%22%3A%7B%22disable%22%3Atrue%7D%2C%22weekPage%22%3A%7B%22notePagesAmount%22%3A11%2C%22useWeekNumbersInSideNav%22%3Atrue%7D%2C%22calendars%22%3A%5B%7B%22events%22%3A%5B%5D%2C%22url%22%3A%22https%3A%2F%2Fwww.schulferien.org%2Fmedia%2Fical%2Fdeutschland%2Fferien_baden-wuerttemberg_2025.ics%3Fk%3Dofx7qOasaB-WJt05fYm74XylwpcuUABdte3QRcNFvbKa69k1rQIxfurMXCtDbkWLohZjGYGycTlVp6EIs3l54VKQULowXnLGtb5X57smKeg%22%2C%22lastUpdated%22%3A0%2C%22name%22%3A%22%22%7D%5D%7D#2025"&gt;Generate PDF Planner for iPad or Kindle Scribe&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The configuration includes 11 note pages per week, week numbers in the navigation, and Baden-Württemberg school holidays. You can adjust all settings in the sidebar, add your own iCal calendar feeds, and toggle sections as needed. The URL encodes all your settings, so you can bookmark it and regenerate your planner anytime with updated dates.&lt;/p&gt;</description></item><item><title>Nix Setup on macOS: An Overview</title><link>https://rustikus.codeberg.page/tech/nix-setup-on-macos-overview/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/nix-setup-on-macos-overview/</guid><description>&lt;p&gt;A collection of resources for setting up Nix on macOS with nix-darwin and home-manager.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;a href="https://github.com/ryan4yin/nix-darwin-kickstarter"&gt;nix-darwin-kickstarter&lt;/a&gt;&lt;/strong&gt; repository is a good starting point for macOS.&lt;/p&gt;
&lt;p&gt;Run programs without installing them with &lt;code&gt;nix-shell -p cowsay&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remote Deployment&lt;/strong&gt;: &lt;a href="https://www.haskellforall.com/2023/01/announcing-nixos-rebuild-new-deployment.html"&gt;nixos-rebuild announcement&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example configurations&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/jdheyburn/nixos-configs/tree/main"&gt;jdheyburn/nixos-configs&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Great examples for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Caddy web server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FreshRSS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;deploy-rs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tailscale integration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/wimpysworld/nix-config"&gt;wimpysworld/nix-config&lt;/a&gt;&lt;/strong&gt; - Production-ready configuration&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Remote installation with nixos-anywhere&lt;/strong&gt;: &lt;a href="https://github.com/nix-community/nixos-anywhere"&gt;nixos-anywhere&lt;/a&gt; uses kexec. If kexec doesn&amp;rsquo;t work, &lt;a href="https://github.com/nix-community/nixos-anywhere/blob/main/docs/howtos/no-os.md"&gt;boot with NixOS ISO instead&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wireless in initrd&lt;/strong&gt;: &lt;a href="https://discourse.nixos.org/t/wireless-connection-within-initrd/38317/12"&gt;Unlocking encrypted drives over WiFi&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Running Kanata on macOS with LaunchDaemon</title><link>https://rustikus.codeberg.page/tech/running-kanata-on-macos-with-launchdaemon/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/running-kanata-on-macos-with-launchdaemon/</guid><description>&lt;p&gt;Kanata provides more readable keyboard remapping configurations than Karabiner-Elements. To run it automatically on macOS startup, set it up as a LaunchDaemon.&lt;/p&gt;
&lt;p&gt;Install Kanata via Homebrew:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install kanata
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Download and install the &lt;a href="https://github.com/pqrs-org/Karabiner-DriverKit-VirtualHIDDevice/releases"&gt;Karabiner VirtualHIDDevice driver&lt;/a&gt;. Kanata needs this to interact with macOS.&lt;/p&gt;
&lt;p&gt;Create your Kanata configuration at &lt;code&gt;~/.config/kanata/config.kbd&lt;/code&gt;. See the &lt;a href="https://github.com/jtroo/kanata"&gt;documentation&lt;/a&gt; for examples. Add a key combo to reload your configuration (command: &lt;code&gt;lrld&lt;/code&gt;) to avoid manually restarting.&lt;/p&gt;
&lt;p&gt;Create two &lt;code&gt;.plist&lt;/code&gt; files in &lt;code&gt;/Library/LaunchDaemons/&lt;/code&gt; to launch Kanata at startup.&lt;/p&gt;</description></item><item><title>Auto-mounting Encrypted External Drive in NixOS</title><link>https://rustikus.codeberg.page/tech/auto-mounting-encrypted-external-drive-nixos/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/auto-mounting-encrypted-external-drive-nixos/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This article is heavily based on &lt;a href="https://blog.pankajraghav.com/2024/09/17/AUTOMOUNT.html"&gt;The Uncommitted Changes Blog&lt;/a&gt; by Pankaj Raghav. All credit goes to the original author.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Setting up auto-mounting for a LUKS-encrypted external drive on NixOS requires coordinating LUKS decryption, udev device detection, and systemd mounting. Here&amp;rsquo;s how to configure it so the drive automatically decrypts and mounts when connected.&lt;/p&gt;
&lt;p&gt;First, encrypt the drive if you haven&amp;rsquo;t already:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup luksFormat /dev/sda1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Enter password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup open /dev/sda1 vault
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dd &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;512&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/random &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/root/keyfile.key &lt;span class="nv"&gt;iflag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fullblock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup luksAddKey /dev/sda1 /root/keyfile.key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkfs.btrfs -L vault /dev/mapper/vault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The keyfile allows automatic decryption without typing a password each time. Your device layout will look like:&lt;/p&gt;</description></item><item><title>Incorporating EDID into initrd Image on Linux</title><link>https://rustikus.codeberg.page/tech/incorporating-edid-into-initrd-linux/</link><pubDate>Fri, 09 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/incorporating-edid-into-initrd-linux/</guid><description>&lt;p&gt;Some monitors don&amp;rsquo;t properly report their capabilities (EDID - Extended Display Identification Data) to Linux systems during early boot, causing incorrect resolutions or no video output. You can fix this by incorporating custom EDID data into the initrd image.&lt;/p&gt;
&lt;p&gt;First, extract the EDID from a working system. Install the required tools:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install read-edid edid-decode
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Extract and verify the EDID:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo get-edid &amp;gt; desktop_edid.bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;edid-decode desktop_edid.bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Transfer the file to your target system and copy it to the firmware directory:&lt;/p&gt;</description></item><item><title>Configuring markdownlint-cli2 in LazyVim</title><link>https://rustikus.codeberg.page/tech/configuring-markdownlint-in-lazyvim/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/configuring-markdownlint-in-lazyvim/</guid><description>&lt;p&gt;Using shell variables like &lt;code&gt;$HOME&lt;/code&gt; in LazyVim&amp;rsquo;s nvim-lint configuration doesn&amp;rsquo;t work as expected—the string gets passed literally instead of being expanded. To use a custom markdownlint-cli2 config file with a machine-agnostic path, use Lua&amp;rsquo;s &lt;code&gt;os.getenv()&lt;/code&gt; function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;HOME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os.getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;HOME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mfussenegger/nvim-lint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;optional&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;linters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;markdownlint-cli2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--config&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HOME&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/.markdownlint-cli2.yaml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Create your &lt;code&gt;~/.markdownlint-cli2.yaml&lt;/code&gt; configuration file with your preferred rules:&lt;/p&gt;</description></item><item><title>Mounting an Encrypted Btrfs System in Arch Linux</title><link>https://rustikus.codeberg.page/tech/mounting-encrypted-btrfs-arch-linux/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0000</pubDate><guid>https://rustikus.codeberg.page/tech/mounting-encrypted-btrfs-arch-linux/</guid><description>&lt;p&gt;To access an encrypted Btrfs Arch Linux system from a live USB, you need to unlock the LUKS partition and mount each Btrfs subvolume before chrooting:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Unlock the encrypted partition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup open /dev/nvme0n1 cryptlvm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Mount the root subvolume&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o &lt;span class="nv"&gt;subvol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;@ /dev/mapper/cryptlvm /mnt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Mount the home subvolume&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o &lt;span class="nv"&gt;subvol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;@home /dev/mapper/cryptlvm /mnt/home
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Mount the log subvolume with nodatacow option&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o nodatacow,subvol&lt;span class="o"&gt;=&lt;/span&gt;@var_log /dev/mapper/cryptlvm /mnt/var/log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Chroot into the system&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo arch-chroot /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;cryptsetup open&lt;/code&gt; command unlocks the encrypted partition and maps it to &lt;code&gt;/dev/mapper/cryptlvm&lt;/code&gt;. Each Btrfs subvolume needs to be mounted separately. The &lt;code&gt;nodatacow&lt;/code&gt; option on &lt;code&gt;/var/log&lt;/code&gt; prevents copy-on-write for log files. The &lt;code&gt;arch-chroot&lt;/code&gt; command automatically handles mounting &lt;code&gt;/proc&lt;/code&gt;, &lt;code&gt;/sys&lt;/code&gt;, and &lt;code&gt;/dev&lt;/code&gt;.&lt;/p&gt;</description></item></channel></rss>