<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux und Ich</title>
	<atom:link href="https://linuxundich.de/en/feed/" rel="self" type="application/rss+xml" />
	<link>https://linuxundich.de/en</link>
	<description>A German Linux blog, in English</description>
	<lastBuildDate>Sat, 03 Oct 2026 19:49:54 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>
	<item>
		<title>llmfit: Which AI models run on my machine?</title>
		<link>https://linuxundich.de/en/gnu-linux/llmfit-which-ai-models-run-on-my-machine/</link>
					<comments>https://linuxundich.de/en/gnu-linux/llmfit-which-ai-models-run-on-my-machine/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 20:43:48 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=7</guid>

					<description><![CDATA[Want to run a local AI but not sure which model really fits your hardware? llmfit reads out your specs, scores thousands of options, and estimates speed and VRAM requirements. This open-source tool takes the guesswork out and gives you concrete recommendations. In short: no more agonizing over quantization, you just know what runs.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Anyone who wants to try local AI will eventually run into a pretty mundane question: which model actually runs on my machine? The selection of open-source LLMs is huge by now, and the candidates differ quite a bit in size, quantization, and memory requirements. If you go digging through model cards and gigabytes of GGUF files, that&#8217;s a whole evening gone.</p>



<p class="wp-block-paragraph"><a href="https://www.llmfit.org/">llmfit</a> takes this research off your hands. The open-source tool reads out your hardware and compares it against a database of language models. What you get is a pretty concrete answer to what can actually run sensibly on your own machine.</p>



<h2 class="wp-block-heading">Which models fit my hardware?</h2>



<p class="wp-block-paragraph">After launching, llmfit first detects your hardware: CPU, RAM, graphics card and available VRAM. It then compares those resources against the models it supports and sorts the list by a score.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242e11bb&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242e11bb" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/llmfit-arch1.webp" alt=""/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Terminal window showing llmfit&#8217;s model list on a laptop with a GeForce GTX 1050, sorted by score, with columns for parameters, tokens per second, quantization and memory requirements.</figcaption></figure>



<p class="wp-block-paragraph">This is useful mainly because raw model size isn&#8217;t the only thing that counts. A model can theoretically fit into the available memory and still run painfully slowly in practice. So llmfit estimates how well a model suits your hardware and what speed and memory requirements you can expect.</p>



<p class="wp-block-paragraph">Just how much this differs from machine to machine shows up with two devices from my stash. On the laptop with a dedicated GTX 1050, the 4 GB of VRAM is a hard limit. On a computer with Iris Xe graphics, on the other hand, the CPU and the GPU share the same memory, and suddenly almost everything says “Perfect”.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242e15f3&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242e15f3" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/llmfit-arch2.webp" alt=""/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">llmfit&#8217;s model list on a system with integrated Intel Iris Xe graphics, where almost all entries in the Fit column are rated Perfect.</figcaption></figure>



<p class="wp-block-paragraph">The program also takes different quantizations into account. With locally run models, you quickly run into terms like Q4, Q5 or Q8. Put simply, this reduces the precision of the model weights to save memory and computing power. Depending on the level, you have to accept some loss in quality in return.</p>



<p class="wp-block-paragraph">This matters most for GGUF models, which are commonly used for local inference. llmfit factors the different quantization levels into its rating, so it can also compare models that come in several variants.</p>



<p class="wp-block-paragraph">If you&#8217;ve been using tools like <a href="https://linuxundich.de/software/mit-inxi-und-i-nex-informationen-zur-hardware-des-rechners-ausgeben/">Inxi</a> on Linux to get an overview of your hardware, you already know the principle. llmfit goes one step further, though, and puts the collected data directly in relation to possible AI models.</p>



<h2 class="wp-block-heading">Installation on Arch Linux</h2>



<p class="wp-block-paragraph"><strong>Update September 29, 2026:</strong> The wheel of time keeps turning, and on Arch it famously turns a little faster. When I started writing this article, llmfit was only available for Arch as an AUR package. Because of the turbulence and attacks on the AUR, I try to avoid it these days. In the meantime, the llmfit package has made it into the official Arch repositories, so all you need to install it is: <code>sudo pacman -S llmfit</code></p>



<p class="wp-block-paragraph">On Arch Linux, uv is available directly from the official repositories. That makes the installation pleasantly unspectacular:</p>



<pre class="wp-block-code"><code>sudo pacman -S uv</code></pre>



<p class="wp-block-paragraph">After that, you can install llmfit as a tool with <code>uv</code>:</p>



<pre class="wp-block-code"><code>uv tool install -U llmfit</code></pre>



<p class="wp-block-paragraph">Now <code>llmfit</code> is available right away as a command.</p>



<p class="wp-block-paragraph">If you just want to try the program first, you can use <code>uvx</code> instead. That runs llmfit without installing it permanently as a tool:</p>



<pre class="wp-block-code"><code>uvx llmfit</code></pre>



<p class="wp-block-paragraph">So on Arch Linux, you don&#8217;t need a separate installer for uv.</p>



<h2 class="wp-block-heading">Installation on Ubuntu</h2>



<p class="wp-block-paragraph">On Ubuntu, the route is a bit different. Depending on your Ubuntu version and the repositories you use, you can&#8217;t simply install uv with <code>apt</code>. The installer provided by the uv developers is therefore a straightforward option.</p>



<p class="wp-block-paragraph">With <code>curl</code> it works like this:</p>



<pre class="wp-block-code"><code>curl -LsSf https://astral.sh/uv/install.sh | sh</code></pre>



<p class="wp-block-paragraph">Alternatively, you can download and run the installation script with <code>wget</code>:</p>



<pre class="wp-block-code"><code>wget -qO- https://astral.sh/uv/install.sh | sh</code></pre>



<p class="wp-block-paragraph">After that, first check whether <code>uv</code> is available:</p>



<pre class="wp-block-code"><code>uv --version</code></pre>



<p class="wp-block-paragraph">From here on, installing llmfit works exactly like on Arch Linux:</p>



<pre class="wp-block-code"><code>uv tool install -U llmfit</code></pre>



<p class="wp-block-paragraph">If you just want to try it out without a permanent installation, uvx is available on Ubuntu as well:</p>



<pre class="wp-block-code"><code>uvx llmfit</code></pre>



<p class="wp-block-paragraph">If you&#8217;d rather not use <code>uv</code>, you can download the prebuilt binaries from the llmfit GitHub Releases instead.</p>



<h2 class="wp-block-heading">Getting rid of llmfit again</h2>



<p class="wp-block-paragraph">If the tool doesn&#8217;t convince you after all, the way back is short, but on Arch there&#8217;s a catch. The tool itself goes away with</p>



<pre class="wp-block-code"><code>uv tool uninstall llmfit</code></pre>



<p class="wp-block-paragraph">and this tells you whether anything is left over:</p>



<pre class="wp-block-code"><code>uv tool list</code></pre>



<p class="wp-block-paragraph">If you only tried llmfit with uvx, you never installed anything permanently in the first place. The downloaded packages still sit in uv&#8217;s cache, though. You empty it with</p>



<pre class="wp-block-code"><code>uv cache clean</code></pre>



<p class="wp-block-paragraph">Now for the catch: if you installed uv through the package manager, you&#8217;re tempted to simply type</p>



<pre class="wp-block-code"><code>sudo pacman -Rns uv</code></pre>



<p class="wp-block-paragraph">But pacman only removes its own package. What uv itself created in your home directory is unknown to the package manager, and without uv you can no longer run <code>uv tool uninstall</code> either. So uninstall the tool first and <code>uv</code> second, not the other way around.</p>



<p class="wp-block-paragraph">These commands show you where the leftovers are:</p>



<pre class="wp-block-code"><code>uv tool dir
uv cache dir</code></pre>



<p class="wp-block-paragraph">Usually that&#8217;s <code>~/.local/share/uv/tools</code> and <code>~/.cache/uv</code>. If uv is already gone and llmfit is still around, the only option is to clean up by hand:</p>



<pre class="wp-block-code"><code>rm -r ~/.local/share/uv</code></pre>



<p class="wp-block-paragraph">Be careful here: this also wipes out all tools installed with uv and the Python versions managed by uv, not just llmfit.</p>



<p class="wp-block-paragraph">On Ubuntu, where uv comes from the install script, there is no <code>uv self uninstall</code>. There, after the <code>uv tool uninstall</code>, you remove the two launcher binaries yourself:</p>



<pre class="wp-block-code"><code>rm ~/.local/bin/uv ~/.local/bin/uvx</code></pre>



<h2 class="wp-block-heading">The TUI is more than a simple model list</h2>



<p class="wp-block-paragraph">The terminal interface is one of the more interesting parts of llmfit to me. Instead of just printing a list, it lets you move through the results, search, and pull up more information on each model.</p>



<p class="wp-block-paragraph">Use <code>/</code> to search for a specific model, the arrow keys or <code>j</code> and <code>k</code> to navigate, and <code>h</code> opens the help. With almost 10,000 entries in the list, the search is no luxury.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242e2881&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242e2881" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/llmfit-txos.webp" alt=""/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">llmfit in the terminal on TUXEDO OS, the model list shows values between 2.9 and 65.7 in the tok/s column, with the search running at the bottom.</figcaption></figure>



<p class="wp-block-paragraph">The built-in benchmark features are interesting, too. <code>b</code> brings up community benchmarks, while <code>I</code> starts an inference benchmark on your own hardware. That slowly turns a pure estimate into a measurement with real numbers.</p>



<p class="wp-block-paragraph">It reminds me a bit of classic system tools. If you use <a href="https://linuxundich.de/software/mission-center-1-0-der-systemmonitor-fuer-gnome-geht-in-die-vollen/">Mission Center</a> on GNOME, for example, you get CPU, RAM, GPU and other resources presented graphically. llmfit, on the other hand, looks specifically at the question of what you can do with those resources in terms of local AI.</p>



<h2 class="wp-block-heading">Estimates instead of marketing promises</h2>



<p class="wp-block-paragraph">Of course, you shouldn&#8217;t mistake llmfit&#8217;s numbers for a real benchmark. A theoretical calculation can only estimate how fast a certain model might run on a certain piece of hardware.</p>



<p class="wp-block-paragraph">The hardware simulation is quite nice in this context. You can tweak RAM, VRAM, and core count just to see how the rating shifts. If you&#8217;re toying with the idea of buying more memory or a new graphics card, you at least get a ballpark figure.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242e2d12&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242e2d12" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/llmfit-arch2-details.webp" alt=""/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">llmfit with the Hardware Simulation dialog open, where you can change RAM, VRAM, and the number of CPU cores.</figcaption></figure>



<p class="wp-block-paragraph">That&#8217;s exactly why the benchmarks that are now built in are interesting. llmfit can download a model, start it via a supported runtime provider, and then measure the actual speed on your own hardware. The results are stored locally.</p>



<p class="wp-block-paragraph">If you like, you can then share your measurements with the community via</p>



<pre class="wp-block-code"><code>llmfit bench --share</code></pre>



<p class="wp-block-paragraph">The results are submitted as a GitHub pull request. This way, a database of real measurements slowly builds up, instead of just theoretical calculations.</p>



<p class="wp-block-paragraph">With local AI in particular, I find this approach sensible. After all, the statement “fits into VRAM” doesn&#8217;t tell you much about whether you can actually work with the model in a reasonable way.</p>



<h2 class="wp-block-heading">Also usable as a command-line tool</h2>



<p class="wp-block-paragraph">If a TUI isn&#8217;t your thing, you don&#8217;t have to use llmfit interactively. The program works entirely from the command line, too.</p>



<p class="wp-block-paragraph">For example,</p>



<pre class="wp-block-code"><code>llmfit recommend</code></pre>



<p class="wp-block-paragraph">gives you a recommendation for your hardware. With</p>



<pre class="wp-block-code"><code>llmfit recommend --json</code></pre>



<p class="wp-block-paragraph">you can output the results as JSON. That&#8217;s obviously a lot more interesting if you want to build llmfit into your own scripts or other tools.</p>



<p class="wp-block-paragraph">You can also start a web interface or an API:</p>



<pre class="wp-block-code"><code>llmfit serve --host 0.0.0.0 --port 8787</code></pre>



<p class="wp-block-paragraph">There is also a ready-made image for containers:</p>



<pre class="wp-block-code"><code>ghcr.io/alexsjones/llmfit</code></pre>



<p class="wp-block-paragraph">That means llmfit runs on a server or in an existing Docker setup, too. If you keep your containers up to date regularly, you may already know the drill from <a href="https://linuxundich.de/software/docker-container-einfach-aktuell-halten-mit-dockcheck/">Dockcheck</a>.</p>



<h2 class="wp-block-heading">And what do you run the model with?</h2>



<p class="wp-block-paragraph">One distinction you should keep in mind: llmfit is not an AI runtime itself. The program helps you choose and evaluate a model, while other tools do the actual inference.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242e3653&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242e3653" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/llmfit-arch2-sim.webp" alt=""/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Detail view in llmfit for DeepSeek-R1-Distill-Qwen-7B with a score breakdown, memory requirements per quantization level, and a GGUF download hint from bartowski.</figcaption></figure>



<p class="wp-block-paragraph">Supported tools include Ollama, llama.cpp, MLX, Docker Model Runner, and LM Studio. That means llmfit can, for example, benchmark a model through an existing Ollama or llama.cpp stack.</p>



<p class="wp-block-paragraph">On Linux, <a href="https://ollama.com/">Ollama</a> is certainly one of the easier ways to get local models up and running. If you want more control over the inference itself, you quickly end up with <a href="https://github.com/ggml-org/llama.cpp/">llama.cpp</a>. The two projects take somewhat different approaches, but both combine well with llmfit&#8217;s hardware check.</p>



<h2 class="wp-block-heading">Interesting for local AI</h2>



<p class="wp-block-paragraph">To me, llmfit closes a gap between “I&#8217;d like to try local AI” and “I first have to work my way through the hardware requirements of dozens of models.” That&#8217;s far more helpful than a generic list of the “best” local models. In the end, what matters isn&#8217;t which model scores well on some test system, but which one runs properly on your hardware for your use case.</p>



<p class="wp-block-paragraph">Of course, the estimates don&#8217;t replace your own testing. That&#8217;s exactly what the built-in benchmarks are for, and they&#8217;re what I want to tackle next: my own measurements on different machines, and then a comparison of how well llmfit&#8217;s predictions match reality.</p>



<p class="wp-block-paragraph">The tool should be especially interesting for developers. If you want to use a local AI assistant for programming, you first find out which models fit your hardware, and then experiment with the speeds you can actually reach.</p>



<p class="wp-block-paragraph">You&#8217;ll find more information, the current documentation, and the source code on <a href="https://github.com/AlexsJones/llmfit">GitHub</a>.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/gnu-linux/llmfit-which-ai-models-run-on-my-machine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tfm: A modern file manager for the terminal</title>
		<link>https://linuxundich.de/en/gnu-linux/tfm-a-modern-file-manager-for-the-terminal/</link>
					<comments>https://linuxundich.de/en/gnu-linux/tfm-a-modern-file-manager-for-the-terminal/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Wed, 16 Sep 2026 21:59:47 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=15</guid>

					<description><![CDATA[tfm brings a sidebar, tabs, dual-pane view and mouse support to the terminal – a file manager for everyone who prefers to work there anyway. It still has a few small beta quirks, but it's already worth a look.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">While browsing the web recently, I stumbled across <code>tfm</code>. This terminal file manager wants to take its cues for operation less from classic command-line tools and more from graphical file managers like Dolphin or Nautilus. If you like working directly in the terminal anyway, this is a really interesting find.</p>



<p class="wp-block-paragraph">Among other things, tfm comes with a sidebar, tabs, a dual-pane view, and file previews. The usual file operations like copying, moving, renaming, and deleting are on board as well. What&#8217;s interesting: you don&#8217;t have to work exclusively with the keyboard. Tfm also supports the mouse, so you can select, move, and rename files by drag and drop, for example.</p>



<p class="wp-block-paragraph">That way, tfm combines typical features of graphical file managers with the terminal environment. If you spend a lot of time there anyway, you can manage files and directories without opening a separate graphical app.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242e7c82&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242e7c82" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/tfm-archlinux-01.webp" alt="tfm right after launch on Arch Linux, with the sidebar and file view. The interface is reminiscent of classic graphical file managers." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">tfm right after launch on Arch Linux, with the sidebar and file view. The interface is reminiscent of classic graphical file managers.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242e8015&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242e8015" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/tfm-archlinux-02.webp" alt="You can open the settings with Esc. There you can adjust various options and the look of tfm." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">You can open the settings with Esc. There you can adjust various options and the look of tfm.</figcaption></figure>



<h2 class="wp-block-heading">Installing from the AUR</h2>



<p class="wp-block-paragraph">You can find Tfm in the AUR (Arch User Repository). If you use an AUR helper like <code>yay</code>, you can install the binary version right away. On Arch Linux, this command is all you need:</p>



<pre class="wp-block-code"><code>$ yay -S tfm-tui-bin</code></pre>



<p class="wp-block-paragraph">After that, start the file manager with:</p>



<pre class="wp-block-code"><code>$ tfm</code></pre>



<p class="wp-block-paragraph">If you use a different distribution, the <a href="https://github.com/clarkarch/tfm-tui">project page</a> has instructions for the install script provided there. With it, you install the current version independently of your distribution&#8217;s packages.</p>



<h2 class="wp-block-heading">Nerd Fonts for the icons</h2>



<p class="wp-block-paragraph">For tfm to show folders and files with the intended icons, you need a <a href="https://www.nerdfonts.com/">Nerd Font</a>. These fonts come with additional characters and icons that terminal apps use to display folders, files, and other elements.</p>



<p class="wp-block-paragraph">For this article, I&#8217;m using the Hack Nerd Font. On Arch Linux, the font is available directly in the official repositories and can be installed with <code>pacman</code>:</p>



<pre class="wp-block-code"><code>$ sudo pacman -S ttf-hack-nerd</code></pre>



<p class="wp-block-paragraph">For tfm to display the icons correctly, the Hack Nerd Font only has to be installed on your system. You don&#8217;t need to select the font in your terminal for that. You normally don&#8217;t need to refresh the font cache manually for a package from the Arch repositories either.</p>



<h2 class="wp-block-heading">Beta with a few rough edges</h2>



<p class="wp-block-paragraph">Tfm is still in beta, and you&#8217;ll notice it most in how icons are displayed. In my tests, the Nerd Font symbols didn&#8217;t show up reliably on every start. Folders and other elements sometimes appear without the icons they&#8217;re supposed to have.</p>



<p class="wp-block-paragraph">Restarting tfm or the terminal usually fixes it. What stands out: the icons come back on the next start even without any changes to the font cache, so the problems can&#8217;t be blamed solely on a broken installation of the font.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242e89aa&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242e89aa" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/tfm-archlinux-03.webp" alt="tfm in dual-pane mode with two file panes. The view makes it easier to work with files and directories side by side." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">tfm in dual-pane mode with two file panes. The view makes it easier to work with files and directories side by side.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242e8c51&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242e8c51" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/tfm-archlinux-04.webp" alt="The preview shows text and image files right inside tfm. For image thumbnails, though, you need a terminal with the Kitty Graphics Protocol." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The preview shows text and image files right inside tfm. For image thumbnails, though, you need a terminal with the Kitty Graphics Protocol.</figcaption></figure>



<p class="wp-block-paragraph">For graphical image previews, tfm needs a terminal that supports the Kitty Graphics Protocol. On Linux, Ghostty is a good choice, for example, and its Linux interface is built on GTK4. Gnome Terminal can&#8217;t offer this feature, because the underlying VTE library doesn&#8217;t support the Kitty Graphics Protocol.</p>



<p class="wp-block-paragraph">The rest of the interface isn&#8217;t yet as stable or consistent as what you&#8217;re used to from established file managers, either. If you try tfm, start with files that don&#8217;t matter, and don&#8217;t trust important data to such young software on its own.</p>



<h2 class="wp-block-heading">The most important keyboard shortcuts</h2>



<p class="wp-block-paragraph">Despite the mouse support, the keyboard plays an important role in tfm. You&#8217;ll find the most important commands in the following overview:</p>



<figure class="wp-block-table"><table><thead><tr><th>Shortcut</th><th>Function</th></tr></thead><tbody><tr><td><code>Esc</code></td><td>Open menu</td></tr><tr><td><code>Enter</code></td><td>Open file or folder</td></tr><tr><td><code>Backspace</code></td><td>Go up one directory level</td></tr><tr><td><code>F2</code></td><td>Rename file or folder</td></tr><tr><td><code>Tab</code></td><td>Switch between the two file panes</td></tr><tr><td><code>F5</code></td><td>Copy selection to the other pane</td></tr><tr><td><code>F6</code></td><td>Move selection to the other pane</td></tr><tr><td><code>Strg</code>+<code>C</code> / <code>Strg</code>+<code>X</code> / <code>Strg</code>+<code>V</code></td><td>Copy / Cut / Paste</td></tr><tr><td><code>Strg</code>+<code>D</code></td><td>Duplicate selection</td></tr><tr><td><code>Entf</code></td><td>Move selection to the trash</td></tr><tr><td><code>Strg</code>+<code>Z</code> / <code>Strg</code>+<code>Y</code></td><td>Undo / Redo</td></tr><tr><td><code>Strg</code>+<code>T</code> / <code>Strg</code>+<code>W</code></td><td>Open / close tab</td></tr><tr><td><code>Strg</code>+<code>Tab</code></td><td>Switch between tabs</td></tr><tr><td><code>Alt</code>+<code>Enter</code></td><td>Show properties</td></tr><tr><td><code>Strg</code>+<code>H</code></td><td>Show hidden files</td></tr><tr><td><code>Strg</code>+<code>L</code></td><td>Open path bar</td></tr><tr><td><code>Strg</code>+<code>G</code></td><td>Switch between list and grid view</td></tr><tr><td><code>F9</code></td><td>Show or hide preview</td></tr><tr><td><code>F4</code></td><td>Open terminal in the current directory</td></tr><tr><td><code>Strg</code>+<code>Umschalt</code>+<code>S</code></td><td>Connect to a server</td></tr><tr><td><code>Strg</code>+<code>Q</code></td><td>Quit tfm</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">All in all, tfm is a likable find for me, especially for anyone who spends all day in the terminal anyway. The sidebar, tabs, dual-pane view, preview and mouse control add a level of comfort you normally don&#8217;t get on the command line. If you like, you can even switch on animations – a <a href="https://www.reddit.com/r/tui/comments/1wh46e9/beta_release_tfm_terminal_file_manager_for_linux/">video on Reddit</a> shows what that looks like.</p>



<p class="wp-block-paragraph">Keep the quirks of the beta phase in mind, though, above all the icon rendering and the interface, which isn&#8217;t quite polished yet. I&#8217;ll keep following the development, and right now I&#8217;d mainly recommend tfm for trying it out – preferably with non-critical files until the software has matured a bit.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/gnu-linux/tfm-a-modern-file-manager-for-the-terminal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Shotwell 0.33: Fast GNOME Photo Manager Finally Moves to GTK4</title>
		<link>https://linuxundich.de/en/news/shotwell-0-33-fast-gnome-photo-manager-finally-moves-to-gtk4/</link>
					<comments>https://linuxundich.de/en/news/shotwell-0-33-fast-gnome-photo-manager-finally-moves-to-gtk4/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Tue, 15 Sep 2026 17:14:35 +0000</pubDate>
				<category><![CDATA[News]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=17</guid>

					<description><![CDATA[Shotwell 0.33 is here and brings the free GNOME photo manager to GTK4 for the first time. I took a look at the new version on Arch Linux and installed it as a Flatpak. Besides the more modern foundation, there are plenty of improvements to usability, export, publishing, and photo management.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Shotwell 0.33 is out, a new version of the free photo manager for GNOME. The most important change is under the hood: after years of development work, Shotwell has now been fully ported to GTK4. I took a look at the new version on Arch Linux.</p>



<p class="wp-block-paragraph">For <a href="https://shotwell-project.org/" data-type="link" data-id="https://shotwell-project.org/">Shotwell</a>, the switch to GTK4 is more than a visual facelift. Especially on Arch Linux with a current GNOME and Wayland, the app benefits from the toolkit&#8217;s more modern interfaces. Features like drag-and-drop and desktop portals should also work more reliably as a result.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242eb58c&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242eb58c" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/shotwell-0.33-gtk4-01-1280x807.webp" alt="The user interface of the photo manager Shotwell in dark mode on an orange-red desktop background. On the left is a sidebar with a folder structure sorted by year, while the main area shows a gallery of various thumbnails. The thumbnails mostly show cyclists in bright clothing on wet roads in foggy weather, as well as cloud-covered mountains." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Shotwell is another photo manager for the Linux desktop, alongside Darktable, Eye of GNOME, and GIMP.</figcaption></figure>



<p class="wp-block-paragraph">For my test, though, I didn&#8217;t install Shotwell on Arch Linux from the repositories but as a Flatpak. That&#8217;s especially interesting for larger GNOME apps when you want to try a current version without waiting for your distribution to catch up. It also makes it easy to delete the app&#8217;s data without leaving anything behind.</p>



<h2 class="wp-block-heading" id="gtk-4-bringt-shotwell-nach-vorn">GTK4 brings Shotwell up to date</h2>



<p class="wp-block-paragraph">Besides the GTK4 port, Shotwell 0.33 comes with plenty of smaller improvements. These include an overview of keyboard shortcuts, reworked export and print functions, and toasts as a modern alternative to plain dialog windows. Opening URLs in the viewer has been added as well.</p>



<p class="wp-block-paragraph">Some features that were temporarily missing during the GTK4 port are back, too, most notably drag and drop. The viewer also shows additional system information, and context menus can now be opened with the keyboard. Navigating between controls has been improved as well.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242eb9b5&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242eb9b5" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/shotwell-0.33-gtk4-02-1280x807.webp" alt="The Shotwell photo manager window showing a photo of a smiling road cyclist in a bright yellow jacket on a wet asphalt road. In the background of the foggy landscape you can see more cyclists and a grassy slope. On the left side of the interface is a folder library, while image editing tools are arranged along the bottom edge." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">If you want to quickly flip through lots of pictures, Shotwell makes that easy in the overview.</figcaption></figure>



<h2 class="wp-block-heading" id="veroffentlichung-und-fehlerkorrekturen">Publishing and bug fixes</h2>



<p class="wp-block-paragraph">Publishing photos to external services has been reworked as well. The window for external authentication can now be shown in several places. Shotwell replaces the previous separate authentication helper with a simple web server that runs locally on your machine.</p>



<p class="wp-block-paragraph">On top of that, there are plenty of bug fixes. Among other things, problems with toolbars that hide automatically in fullscreen mode, with the slideshow, with setting desktop wallpapers and with sending many photos at once have been fixed. Working with faces and their tags has also been improved further.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242ebdbd&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242ebdbd" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/09/shotwell-0.33-gtk4-03-1280x807.webp" alt="The user interface of the photo manager Shotwell with the straighten tool open. In the center is a photo of a cyclist on a rain-soaked road, overlaid with an alignment grid and a settings window for the angle. On the left is a navigation sidebar with a photo library sorted by year, while further editing functions such as Crop or Adjust are listed along the bottom edge." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Basic photo editing features such as straightening the horizon with automatic cropping are included as well.</figcaption></figure>



<h2 class="wp-block-heading" id="mein-eindruck-unter-arch-linux">My impression on Arch Linux</h2>



<p class="wp-block-paragraph">To me, the GTK4 port is the really interesting news in this release. It puts Shotwell in much better shape for current Linux desktops. Especially on Arch Linux with GNOME on Wayland, it&#8217;s nice when an older app doesn&#8217;t stay stuck on its old GTK foundation forever.</p>



<p class="wp-block-paragraph">If you want to try Shotwell on Arch Linux, you can first check which version is available in your repositories. For my test, I used Flatpak instead. That way you can install the current Shotwell version independently of what Arch Linux ships, and remove it again just as easily. Right now, even Arch Linux is one version behind.</p>



<p class="wp-block-paragraph">That makes the new version interesting for users who had written off Shotwell because of its technically outdated GTK3 base. Whether the app wins you over as a photo manager in the long run depends heavily on your own workflow, of course. But as a lean GNOME solution, it&#8217;s worth a look.</p>



<h2 class="wp-block-heading" id="weitere-beitrage-zu-gnome-und-bildern">More posts about GNOME and images</h2>



<p class="wp-block-paragraph">You&#8217;ll find a few older posts here on the blog about image editing and photo tools. For example, I&#8217;ve covered <a href="https://linuxundich.de/gnu-linux/einfache-bildbearbeitung-linux-ubuntu/">simple image editing on Linux</a> (in German) and a range of tools for taking screenshots and working with images. <a href="https://linuxundich.de/gnu-linux/gradia-1-4-screenshot-bildbearbeitung/">Gradia</a> has also gone all in on GTK4 by now.</p>



<p class="wp-block-paragraph">You can get the current version of Shotwell as a <a href="https://flathub.org/de/apps/org.gnome.Shotwell">Flatpak on Flathub</a>. If you&#8217;re interested in the latest technical changes to the app and want to follow how development goes from here, take a look at the <a href="https://discourse.gnome.org/t/shotwell-33-0-has-arrived/38759">official release announcement</a> and the <a href="https://shotwell-project.org/">Shotwell project page</a>.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/news/shotwell-0-33-fast-gnome-photo-manager-finally-moves-to-gtk4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mounting Network Shares Automatically: What Can Go Wrong with the NetworkManager Dispatcher</title>
		<link>https://linuxundich.de/en/gnu-linux/mounting-network-shares-automatically-what-can-go-wrong-with-the-networkmanager-dispatcher/</link>
					<comments>https://linuxundich.de/en/gnu-linux/mounting-network-shares-automatically-what-can-go-wrong-with-the-networkmanager-dispatcher/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Fri, 21 Aug 2026 16:11:08 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=13</guid>

					<description><![CDATA[All my mount script was supposed to do was one thing: mount the Samba share when I'm at home. In the end it broke shutdown, resume and standby for me, and taught me a few things about D-state processes and the Linux freezer.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">You may know the situation: at home you have a NAS or a cloud storage that you mount via Samba or WebDAV. But only when you are actually on your home network. Nobody wants to sit in a café waiting because the laptop is desperately trying to mount a share that is simply not reachable right now.</p>



<p class="wp-block-paragraph">The obvious solution: <code>/etc/fstab</code> plus a dispatcher script for NetworkManager that mounts automatically based on the SSID or on whether the server is reachable. Sounds like an evening project. It isn&#8217;t quite. I tripped over three pitfalls that you only notice when the machine shuts down, wakes up, or is supposed to go into standby. Those are the three I&#8217;ll walk you through here.</p>



<p class="wp-block-paragraph">I tested all of this on Arch Linux, but the setup is not Arch-specific. As long as your distro ships systemd and NetworkManager (so Fedora, Ubuntu, Debian or openSUSE, for example), everything here works one to one.</p>



<h3 class="wp-block-heading">The basic setup</h3>



<p class="wp-block-paragraph">Network shares traditionally get <code>noauto</code> in the fstab, so they are not mounted immediately at boot but only when needed:</p>



<pre class="wp-block-code"><code>//server/home /mnt/server/home cifs credentials=/etc/samba/server.credentials,rw,uid=1000,gid=100,noauto,_netdev 0 0
//server/data /mnt/server/data cifs credentials=/etc/samba/server.credentials,rw,uid=1000,gid=100,noauto,_netdev 0 0</code></pre>



<p class="wp-block-paragraph">For the mount type itself, the Arch Wiki has good guides depending on the protocol, for example on <a href="https://wiki.archlinux.org/title/Samba">Samba/CIFS</a> and on <a href="https://wiki.archlinux.org/title/Davfs2">davfs2 for WebDAV</a>. Both work on any distribution, as long as <em>cifs-utils</em> or <em>davfs2</em> are installed.</p>



<p class="wp-block-paragraph">The actual mounting is then handled by a script in <code>/etc/NetworkManager/dispatcher.d/</code>. NetworkManager calls such scripts on every connection change and passes along the interface and the status (up, down, pre-down and a few more). All the details are in the <a href="https://man.archlinux.org/man/NetworkManager-dispatcher.8.en">NetworkManager dispatcher man page</a>. A simple script checks the active Wi-Fi SSID and mounts if it matches:</p>



<pre class="wp-block-code"><code>#!/bin/bash
IFACE=&quot;$1&quot;
STATUS=&quot;$2&quot;

case &quot;$STATUS&quot; in
    up)
        SSID=$(nmcli -t -f active,ssid dev wifi | awk -F: '$1 == &quot;yes&quot; {print $2; exit}')
        if &amp;#91;&amp;#91; &quot;$SSID&quot; == &quot;MeinHeimnetz&quot; ]]; then
            mount /mnt/server/home
            mount /mnt/server/data
        fi
        ;;
    down)
        umount /mnt/server/home
        umount /mnt/server/data
        ;;
esac</code></pre>



<p class="wp-block-paragraph">Done, right? Not quite. As soon as you shut down the system, wake it from standby or put it into standby, it turns out that this approach has its catches.</p>



<h3 class="wp-block-heading">Why not just use GVfs?</h3>



<p class="wp-block-paragraph">You may now be wondering why I put myself through fstab and dispatcher scripts at all. GNOME offers “Connect to Server” in the file manager, which is a much easier way to mount network shares via SMB or WebDAV. That is exactly where my problem lies.</p>



<p class="wp-block-paragraph">Such mounts don&#8217;t go through the kernel but through GVfs, GNOME&#8217;s virtual file system. Programs that use the GIO library (almost all GTK apps, first and foremost the file manager itself) talk to shares directly through their own URIs like <code>smb://</code> or <code>dav://</code>, and accordingly display thumbnails and metadata correctly. For programs that can&#8217;t do that, GVfs additionally exposes the share as a perfectly normal path under <code>/run/user/&lt;uid&gt;/gvfs</code>. This bridge does run through FUSE. GVfs itself is not a classic FUSE file system but its own architecture with a daemon process per protocol, yet for exactly this case it provides a POSIX-compatible path via gvfsd-fuse.</p>



<p class="wp-block-paragraph">This very bridge is the sticking point for me: not every program copes with it reliably. In my case it shows up in a Markdown editor where I also embed images for articles. The file manager displays the images on the network drive just fine, because it speaks GVfs natively. The Markdown editor, on the other hand, shows only a placeholder for the same image. Access via the FUSE path simply doesn&#8217;t work reliably, even though the file is demonstrably there.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242eda49&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242eda49" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/08/apostrophe-webdav-bild-1280x720.webp" alt="Two windows are open on a computer screen. On the left is a text editor with a file showing structured text with headings and paragraphs. On the right is a document viewer with a longer body of text that also contains paragraphs and a heading. In the background a desktop with a gradient of dark and purple tones is visible. At the top, the interface shows a menu bar with icons and the time." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">A classic kernel mount via CIFS or davfs2, as described in the rest of this article, shows up as a perfectly normal, stable POSIX path in the file system, with no special treatment and the same for every program. So the extra effort with fstab and dispatcher scripts pays off precisely when you want to use shares reliably not just in the file manager but in all kinds of apps.</p>



<h3 class="wp-block-heading">Problem 1: The computer doesn&#8217;t shut down cleanly anymore</h3>



<p class="wp-block-paragraph">If the fstab lacks the option _netdev, systemd doesn&#8217;t know that this is a network share. On shutdown, systemd may then try to unmount <em>after</em> the network is already gone. The umount blocks until the job timeout kicks in, and your system hangs on shutdown.</p>



<p class="wp-block-paragraph"><a href="https://wiki.archlinux.org/title/Fstab#Remote_filesystem">_netdev</a> fixes that, because systemd then knows the right order: unmount first, then cut the network. It is also important that a dispatcher script reacts not just to down but to pre-down. That status fires before the connection actually drops, while down comes afterward and is too late for a clean unmount. For this to work, you additionally need a symlink in the subfolder <code>pre-down.d/</code>.</p>



<h3 class="wp-block-heading">Problem 2: The file manager freezes after waking up</h3>



<p class="wp-block-paragraph">A mount call for CIFS or WebDAV runs in the kernel and can block for quite a while if the server is unreachable, especially right after waking up, when DNS or routing aren&#8217;t fully back yet. By default, NetworkManager waits synchronously until such a dispatcher script has finished before it carries on. If the mount call hangs, suddenly your file manager or the network indicator hangs too, because they depend on the connection state.</p>



<p class="wp-block-paragraph">The fix: just run the mount attempts in the background, so the dispatcher script itself returns immediately, no matter how long the actual mount takes.</p>



<pre class="wp-block-code"><code>run_async() {
    ( &quot;$@&quot; ) &amp;&gt;/dev/null &amp;
    disown
}</code></pre>



<h3 class="wp-block-heading">Problem 3: Suspend suddenly stops working</h3>



<p class="wp-block-paragraph">And this is where it gets interesting. With the fix from problem 2 you stumble into a new and much nastier problem, which in my case looked like this: the screen turns off, but the keyboard backlight and LEDs stay on, and you have to force a hard power-off. What happened?</p>



<p class="wp-block-paragraph">The mount syscall for CIFS or davfs blocks with an unreachable server in the so-called <a href="https://eklitzke.org/uninterruptible-sleep">D state (uninterruptible sleep)</a>, a state that no signal can interrupt, not even SIGKILL. Before the kernel actually goes to sleep, it tries to freeze all processes. A process in D state can&#8217;t be frozen, so the whole suspend hangs until the network operation in the kernel gives up on its own, which can easily take a few minutes.</p>



<p class="wp-block-paragraph">Because the mount attempts from problem 2 now keep running in the background for longer, the chance also goes up that such a blocking connection attempt is active at exactly the moment you want to suspend.</p>



<p class="wp-block-paragraph">The reliable way out: before every mount, first check with a real userspace connection test whether the server is reachable at all. That kind of test can actually be aborted with a timeout, for example via Bash&#8217;s built-in /dev/tcp:</p>



<pre class="wp-block-code"><code>tcp_reachable() {
    local HOST=&quot;$1&quot;
    local PORT=&quot;$2&quot;
    local TIMEOUT_SECONDS=&quot;${3:-2}&quot;
    timeout &quot;${TIMEOUT_SECONDS}s&quot; bash -c &quot;echo &gt;/dev/tcp/${HOST}/${PORT}&quot; &amp;&gt;/dev/null
}</code></pre>



<p class="wp-block-paragraph">Only if the test succeeds does the actual mount follow. That way you almost never end up in the risky, blocking kernel connect, because by then you already know the server is there.</p>



<h3 class="wp-block-heading">The combination that works for me</h3>



<p class="wp-block-paragraph">In the end, a robust setup needs four ingredients:</p>



<ul class="wp-block-list">

<li><strong>_netdev</strong> in the fstab, so systemd classifies network shares correctly on shutdown.</li>


<li><strong>pre-down handling</strong> plus a symlink in pre-down.d/, so the unmount is guaranteed to happen before the connection is torn down, with a timeout and lazy unmount as a backup in case the normal umount acts up.</li>


<li><strong>Asynchronous mounts</strong> on up, so NetworkManager and everything that depends on it doesn&#8217;t block.</li>


<li><strong>A reachability test</strong> before every mount, so the actual, potentially blocking kernel connect never happens in the first place.</li>

</ul>



<p class="wp-block-paragraph">On top of that, a small health check via a systemd timer that looks a few minutes after boot and regularly afterward to see whether the shares are really there, and nudges things along if needed. Handy in case the triggering network event comes too early or too late.</p>



<h3 class="wp-block-heading">All files at a glance</h3>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242ee54a&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242ee54a" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/08/nm-dispatcher-helper.webp" alt="A computer screen shows a terminal window with a black background and white text. At the top is a tree structure of the directories and files under '/etc/NetworkManager/dispatcher.d'. The structure contains several subdirectories and shell scripts. On the left, timestamps and commands are visible, on the right the respective outputs. The window is framed by a gray menu bar." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">This is what it looks like on my machine: the NetworkManager dispatcher mounts shares automatically as soon as it finds the right server on the network or connects via Wi-Fi to a specific SSID.</figcaption></figure>



<p class="wp-block-paragraph">So you can rebuild all of this right away, here is the complete set of files. I replaced the example names from my own setup (a Samba server called bender, WebDAV via tuxedo) with generic placeholders. You&#8217;ll of course have to adapt them to your own environment.</p>



<p class="wp-block-paragraph"><strong>/etc/fstab</strong>: the two shares, one Samba, one WebDAV:</p>



<pre class="wp-block-code"><code>//server/home /mnt/server/home cifs credentials=/etc/samba/server.credentials,rw,uid=1000,gid=100,noauto,_netdev,x-systemd.mount-timeout=15s,soft 0 0
//server/data /mnt/server/data cifs credentials=/etc/samba/server.credentials,rw,uid=1000,gid=100,noauto,_netdev,x-systemd.mount-timeout=15s,soft 0 0
https://cloud.example.com/remote.php/dav/files/user /mnt/webdav davfs noauto,_netdev,uid=1000,gid=100,x-systemd.automount,x-systemd.idle-timeout=300,x-systemd.mount-timeout=15s 0 0</code></pre>



<p class="wp-block-paragraph">The fstab only references the credentials; they are stored in separate files, if only so the password doesn&#8217;t sit in plain text in a file that everyone can read.</p>



<p class="wp-block-paragraph"><strong>/etc/samba/server.credentials</strong>: credentials for the Samba share:</p>



<pre class="wp-block-code"><code>username=maxmuster
password=GeheimesPasswort123</code></pre>



<p class="wp-block-paragraph"><strong>/etc/davfs2/secrets</strong>: credentials for the WebDAV share. Here the mount point is referenced instead of an option in the fstab:</p>



<pre class="wp-block-code"><code>/mnt/webdav maxmuster GeheimesPasswort123</code></pre>



<p class="wp-block-paragraph">Both files belong to root and must not be readable by anyone else:</p>



<pre class="wp-block-code"><code>$ sudo chmod 600 /etc/samba/server.credentials /etc/davfs2/secrets
$ sudo chown root:root /etc/samba/server.credentials /etc/davfs2/secrets</code></pre>



<p class="wp-block-paragraph"><strong>/etc/NetworkManager/dispatcher.d/lib/mount-helpers.sh</strong>: the shared library that all the other scripts source:</p>



<pre class="wp-block-code"><code>#!/bin/bash
log() {
    &amp;#91;&amp;#91; &quot;$DEBUG&quot; == &quot;1&quot; ]] &amp;&amp; logger -t &quot;$LOG_TAG&quot; -- &quot;$1&quot;
}

run_async() {
    ( &quot;$@&quot; ) &amp;&gt;/dev/null &amp;
    disown
}

tcp_reachable() {
    local HOST=&quot;$1&quot;
    local PORT=&quot;$2&quot;
    local TIMEOUT_SECONDS=&quot;${3:-2}&quot;
    timeout &quot;${TIMEOUT_SECONDS}s&quot; bash -c &quot;echo &gt;/dev/tcp/${HOST}/${PORT}&quot; &amp;&gt;/dev/null
}

mount_with_retry() {
    local MOUNT=&quot;$1&quot;
    local MAX_ATTEMPTS=&quot;${2:-3}&quot;
    local SLEEP_SECONDS=&quot;${3:-2}&quot;
    local MOUNT_TIMEOUT=&quot;${4:-10}&quot;

    if mountpoint -q &quot;$MOUNT&quot;; then
        log &quot;$MOUNT ist bereits eingehängt&quot;
        return 0
    fi

    log &quot;Hänge $MOUNT ein&quot;

    local OUT ATTEMPT
    for ((ATTEMPT = 1; ATTEMPT &lt;= MAX_ATTEMPTS; ATTEMPT++)); do
        if OUT=$(timeout &quot;${MOUNT_TIMEOUT}s&quot; mount &quot;$MOUNT&quot; 2&gt;&amp;1); then
            log &quot;$MOUNT erfolgreich eingehängt&quot;
            return 0
        fi
        log &quot;Versuch $ATTEMPT/$MAX_ATTEMPTS für $MOUNT fehlgeschlagen (evtl. Timeout nach ${MOUNT_TIMEOUT}s): $OUT&quot;
        &amp;#91;&amp;#91; &quot;$ATTEMPT&quot; -lt &quot;$MAX_ATTEMPTS&quot; ]] &amp;&amp; sleep &quot;$SLEEP_SECONDS&quot;
    done

    log &quot;Alle Versuche für $MOUNT fehlgeschlagen&quot;
    return 1
}

umount_with_fallback() {
    local MOUNT=&quot;$1&quot;
    local TIMEOUT_SECONDS=&quot;${2:-5}&quot;

    if ! mountpoint -q &quot;$MOUNT&quot;; then
        log &quot;$MOUNT ist nicht eingehängt&quot;
        return 0
    fi

    log &quot;Hänge $MOUNT aus&quot;

    if timeout &quot;${TIMEOUT_SECONDS}s&quot; umount &quot;$MOUNT&quot;; then
        log &quot;$MOUNT erfolgreich ausgehängt&quot;
        return 0
    fi

    log &quot;Normaler Unmount von $MOUNT fehlgeschlagen, versuche Lazy Unmount&quot;
    if umount -l &quot;$MOUNT&quot;; then
        log &quot;$MOUNT per Lazy Unmount ausgehängt&quot;
        return 0
    fi

    log &quot;$MOUNT konnte nicht ausgehängt werden&quot;
    return 1
}</code></pre>



<p class="wp-block-paragraph"><strong>/etc/NetworkManager/dispatcher.d/90-server-mount</strong>: Samba share, bound to a specific Wi-Fi SSID or to the wired network:</p>



<pre class="wp-block-code"><code>#!/bin/bash

DEBUG=1
LOG_TAG=&quot;server-mount&quot;

LIB=&quot;/etc/NetworkManager/dispatcher.d/lib/mount-helpers.sh&quot;
if &amp;#91;&amp;#91; -r &quot;$LIB&quot; ]]; then
    source &quot;$LIB&quot;
else
    logger -t &quot;$LOG_TAG&quot; -- &quot;Bibliothek $LIB nicht gefunden, breche ab&quot;
    exit 1
fi

IFACE=&quot;$1&quot;
STATUS=&quot;$2&quot;

MOUNTS=(
    &quot;/mnt/server/home&quot;
    &quot;/mnt/server/data&quot;
)

mount_server() {
    if ! tcp_reachable server 445 2; then
        log &quot;server auf Port 445 nicht erreichbar, überspringe Mount-Versuch&quot;
        return 1
    fi

    for MOUNT in &quot;${MOUNTS&amp;#91;@]}&quot;; do
        mount_with_retry &quot;$MOUNT&quot; 3 2 10
    done
}

umount_server() {
    for MOUNT in &quot;${MOUNTS&amp;#91;@]}&quot;; do
        umount_with_fallback &quot;$MOUNT&quot; 5
    done
}

log &quot;Dispatcher gestartet: Interface=$IFACE, Status=$STATUS&quot;

case &quot;$STATUS&quot; in
    up)
        if &amp;#91;&amp;#91; &quot;$IFACE&quot; == wl* ]]; then
            SSID=$(nmcli -t -f active,ssid dev wifi |
                awk -F: '$1 == &quot;yes&quot; {print $2; exit}')

            log &quot;Aktive WLAN-SSID: $SSID&quot;

            if &amp;#91;&amp;#91; &quot;$SSID&quot; == &quot;MeinHeimnetz&quot; ]]; then
                run_async mount_server
            fi

        elif &amp;#91;&amp;#91; &quot;$IFACE&quot; == enp* || &quot;$IFACE&quot; == eth* ]]; then
            run_async mount_server
        fi
        ;;

    pre-down|vpn-pre-down)
        log &quot;Netzwerkverbindung wird beendet – Mounts aushängen&quot;
        umount_server
        ;;
esac

log &quot;Dispatcher beendet&quot;
exit 0</code></pre>



<p class="wp-block-paragraph"><strong>/etc/NetworkManager/dispatcher.d/90-webdav-mount</strong>: WebDAV share, which simply requires a reachable cloud server:</p>



<pre class="wp-block-code"><code>#!/bin/bash

DEBUG=1
LOG_TAG=&quot;webdav-mount&quot;

LIB=&quot;/etc/NetworkManager/dispatcher.d/lib/mount-helpers.sh&quot;
if &amp;#91;&amp;#91; -r &quot;$LIB&quot; ]]; then
    source &quot;$LIB&quot;
else
    logger -t &quot;$LOG_TAG&quot; -- &quot;Bibliothek $LIB nicht gefunden, breche ab&quot;
    exit 1
fi

IFACE=&quot;$1&quot;
STATUS=&quot;$2&quot;

MOUNTPOINT=&quot;/mnt/webdav&quot;
HOST=&quot;cloud.example.com&quot;

mount_webdav() {
    if ! tcp_reachable &quot;$HOST&quot; 443 3; then
        log &quot;$HOST auf Port 443 nicht erreichbar, überspringe Mount-Versuch&quot;
        return 1
    fi

    mount_with_retry &quot;$MOUNTPOINT&quot; 3 2 10
}

log &quot;Dispatcher gestartet: Interface=$IFACE, Status=$STATUS&quot;

case &quot;$STATUS&quot; in
    up)
        run_async mount_webdav
        ;;

    pre-down|vpn-pre-down)
        log &quot;Netzwerkverbindung wird beendet – Mount aushängen&quot;
        umount_with_fallback &quot;$MOUNTPOINT&quot; 5
        ;;
esac

log &quot;Dispatcher beendet&quot;
exit 0</code></pre>



<p class="wp-block-paragraph">For both scripts you also need the matching symlinks, so that pre-down is guaranteed to fire before the connection is torn down:</p>



<pre class="wp-block-code"><code>$ sudo ln -s /etc/NetworkManager/dispatcher.d/90-server-mount 
             /etc/NetworkManager/dispatcher.d/pre-down.d/90-server-mount
$ sudo ln -s /etc/NetworkManager/dispatcher.d/90-webdav-mount 
             /etc/NetworkManager/dispatcher.d/pre-down.d/90-webdav-mount</code></pre>



<p class="wp-block-paragraph"><strong>/usr/local/bin/mount-healthcheck.sh</strong>: the safety net that checks regularly:</p>



<pre class="wp-block-code"><code>#!/bin/bash
DEBUG=1
LOG_TAG=&quot;mount-healthcheck&quot;

LIB=&quot;/etc/NetworkManager/dispatcher.d/lib/mount-helpers.sh&quot;
if &amp;#91;&amp;#91; -r &quot;$LIB&quot; ]]; then
    source &quot;$LIB&quot;
else
    logger -t &quot;$LOG_TAG&quot; -- &quot;Bibliothek $LIB nicht gefunden, breche ab&quot;
    exit 1
fi

log &quot;Healthcheck gestartet&quot;

SSID=$(nmcli -t -f active,ssid dev wifi 2&gt;/dev/null |
    awk -F: '$1 == &quot;yes&quot; {print $2; exit}')

if &amp;#91;&amp;#91; &quot;$SSID&quot; == &quot;MeinHeimnetz&quot; ]] || ping -c 1 -W 1 server &gt;/dev/null 2&gt;&amp;1; then
    mount_with_retry &quot;/mnt/server/home&quot; 2 3
    mount_with_retry &quot;/mnt/server/data&quot; 2 3
else
    log &quot;server im aktuellen Netz nicht erreichbar, überspringe&quot;
fi

mount_with_retry &quot;/mnt/webdav&quot; 2 3

log &quot;Healthcheck beendet&quot;
exit 0</code></pre>



<p class="wp-block-paragraph"><strong>/etc/systemd/system/mount-healthcheck.service</strong> and <strong>mount-healthcheck.timer</strong>: systemd units that trigger the health check script 60 seconds after boot and every 10 minutes after that:</p>



<pre class="wp-block-code"><code>&amp;#91;Unit]
Description=Prueft und stellt Netzwerk-Mounts sicher
After=network-online.target
Wants=network-online.target

&amp;#91;Service]
Type=oneshot
TimeoutStartSec=120
ExecStart=/usr/local/bin/mount-healthcheck.sh</code></pre>



<pre class="wp-block-code"><code>&amp;#91;Unit]
Description=Fuehrt den Mount-Healthcheck 60s nach Boot und danach alle 10 Minuten aus

&amp;#91;Timer]
OnBootSec=60s
OnUnitActiveSec=10min
AccuracySec=30s

&amp;#91;Install]
WantedBy=timers.target</code></pre>



<p class="wp-block-paragraph">Don&#8217;t forget to enable it:</p>



<pre class="wp-block-code"><code>$ sudo systemctl daemon-reload
$ sudo systemctl enable --now mount-healthcheck.timer</code></pre>



<p class="wp-block-paragraph"><strong>/usr/lib/systemd/system-sleep/90-cancel-network-mounts</strong>: an optional safety net before suspend:</p>



<pre class="wp-block-code"><code>#!/bin/bash
case &quot;$1/$2&quot; in
    pre/*)
        logger -t sleep-mount-guard &quot;Breche evtl. laufende Netzwerk-Mount-Versuche vor Suspend ab&quot;
        pkill -9 -f 'mount.cifs' 2&gt;/dev/null
        pkill -9 -f 'mount.davfs' 2&gt;/dev/null
        ;;
esac

exit 0</code></pre>



<p class="wp-block-paragraph">All scripts have to be executable:</p>



<pre class="wp-block-code"><code>$ sudo chmod +x /etc/NetworkManager/dispatcher.d/lib/mount-helpers.sh 
              /etc/NetworkManager/dispatcher.d/90-server-mount 
              /etc/NetworkManager/dispatcher.d/90-webdav-mount 
              /usr/local/bin/mount-healthcheck.sh 
              /usr/lib/systemd/system-sleep/90-cancel-network-mounts</code></pre>



<h3 class="wp-block-heading">Long story short</h3>



<p class="wp-block-paragraph">Automatically mounting network shares via NetworkManager works well, but it is not a five-minute job, as the docs might make you think. If you just put the mount command into an up script, sooner or later one of the three problems will catch up with you, usually exactly when you&#8217;re on the road and have no log at hand.</p>



<p class="wp-block-paragraph">With _netdev, correct pre-down timing, asynchronous execution and a real reachability test before every mount, you&#8217;re on the safe side. And the pattern carries over one to one to other network-dependent automations, such as VPN connections or backup jobs that should only run on the right network.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/gnu-linux/mounting-network-shares-automatically-what-can-go-wrong-with-the-networkmanager-dispatcher/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rutile 0.2.2 – A Modern Alternative to Tilix</title>
		<link>https://linuxundich.de/en/gnu-linux/rutile-0-2-2-a-modern-alternative-to-tilix/</link>
					<comments>https://linuxundich.de/en/gnu-linux/rutile-0-2-2-a-modern-alternative-to-tilix/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Thu, 23 Jul 2026 06:50:10 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=11</guid>

					<description><![CDATA[Rutile is a new terminal emulator for GNOME that brings Tilix's proven way of working to GTK4, libadwaita, and Rust. The project is still in an early stage of development, but it already offers recursive terminal splits, multiple sessions, and synchronized input for getting real work done.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">For many years, <a href="https://github.com/gnunn1/tilix">Tilix</a> has been one of those terminal programs <a href="https://linuxundich.de/gnu-linux/bug-jaeger-vs-terminal-entwickler-aus-terminix-wird-tilix/" data-type="post" data-id="40376">I keep installing again and again</a>. Being able to split the terminal area however I like and manage several shells at the same time has made my daily work a lot easier. Unfortunately, the project is hardly maintained anymore and is still based on GTK3 and VTE3.</p>



<p class="wp-block-paragraph">That&#8217;s why <a href="https://github.com/yatoub/Rutile">Rutile</a> is an interesting project to watch. The developers aren&#8217;t simply continuing Tilix. They are rebuilding the terminal emulator completely in Rust, while keeping the same way of working. The goal isn&#8217;t to reinvent anything, but to create a modern implementation that fits right into current GNOME systems with GTK4 and libadwaita.</p>



<h2 class="wp-block-heading">A proven concept on a modern foundation</h2>



<p class="wp-block-paragraph">Many terminal emulators differ mainly in how they look or in a few minor extra features. Rutile takes a different approach. The goal is to carry over the way Tilix works as completely as possible and put it on a modern technical foundation. Existing users should feel at home right away.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242f2b81&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242f2b81" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/07/rutile-01-1280x817.webp" alt="The Rutile terminal emulator on GNOME on Arch Linux with several open terminals showing system information, file listings and CPU usage." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The buttons let you create new terminal panes horizontally or vertically. The controls deliberately follow the familiar Tilix concept.</figcaption></figure>



<p class="wp-block-paragraph">The app uses GTK4, libadwaita and VTE4, so it benefits from current libraries of the <a href="https://linuxundich.de/tag/gnome/" data-type="post_tag" data-id="1734">GNOME desktop</a>. At the same time, the developers have chosen Rust as the programming language. In the long run, that promises a more maintainable codebase and makes it possible to build new features on a modern architecture.</p>



<h2 class="wp-block-heading">Flexible terminal splitting</h2>



<p class="wp-block-paragraph">Rutile takes its most important feature straight from Tilix. You can split the terminal window recursively, both horizontally and vertically, and every pane can be split again. That gives you flexibly nested workspaces, without the app being locked into a fixed grid or a particular window layout.</p>



<p class="wp-block-paragraph">In everyday use, this way of working has plenty of advantages. On the left, for example, you can watch log files while several servers or containers are open on the right. You switch between the individual panes comfortably with the keyboard. That saves mouse movements and keeps things flowing when you&#8217;re working on more complex tasks.</p>



<p class="wp-block-paragraph">Other terminals like <a href="https://ghostty.org/">Ghostty</a> offer this feature too, but you have to memorize key combinations for it. Alternatively, you can of course use a terminal multiplexer like <a href="https://github.com/tmux/tmux/wiki">tmux</a>. The same applies there, though. Even if it&#8217;s not a lot of key combinations: personally, I simply want buttons for this.</p>



<h2 class="wp-block-heading">Multiple independent sessions</h2>



<p class="wp-block-paragraph">Besides the freely splittable terminal panes, Rutile supports multiple separate sessions. Each session has its own window layout and its own working context. That way you can keep different projects or tasks neatly apart without having to open several program windows.</p>



<p class="wp-block-paragraph">You switch between sessions either with a keyboard shortcut or through a sidebar. The sidebar shows small thumbnails of each working environment and is hidden by default. If you need it, just show it from the toolbar, and you&#8217;ll find it easier to keep track of things even with lots of open sessions.</p>



<h2 class="wp-block-heading">Synchronized input</h2>



<p class="wp-block-paragraph">One feature I find especially handy is synchronized input. When you enable it, Rutile sends every keystroke to several terminal panes in a session at the same time. That saves a lot of time when you need to run identical commands on several servers or virtual machines.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16242f33f6&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16242f33f6" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/07/rutile-02-1280x817.webp" alt="Two terminal windows side by side showing Linux commands and file listings, with a dropdown menu in the left window offering options for splitting horizontally and vertically as well as synchronized input." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Synchronized input lets you run identical commands on several servers, containers, or virtual machines at the same time. You can exclude individual panes.</figcaption></figure>



<p class="wp-block-paragraph">You can exclude individual terminal panes from the shared input at any time. That way, specific systems can get different commands without you having to turn off synchronization completely. Still, a bit of caution is a good idea, because a faulty command will otherwise run on all connected systems at the same time, too.</p>



<h2 class="wp-block-heading">Familiar Controls</h2>



<p class="wp-block-paragraph">The keyboard shortcuts also follow the original closely. With <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>O</kbd> and <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>E</kbd> you split the window horizontally or vertically. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>W</kbd> closes the active pane, while the arrow keys switch between the individual terminal panes.</p>



<p class="wp-block-paragraph">You open new sessions with <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>T</kbd>. To switch between existing sessions, press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>Page Up</kbd> or <kbd>Page Down</kbd>. If you prefer working with the mouse, you can also reach the same functions through the toolbar or the context menu of each terminal pane.</p>



<h2 class="wp-block-heading">Still in an early stage of development</h2>



<p class="wp-block-paragraph">Rutile is still at the very beginning of its development. The first version deliberately focuses on the most important features. Things like a Quake mode, saving complete sessions, desktop notifications, or Nautilus integration are meant to come later, once the existing features work reliably.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16243014f0&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16243014f0" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/07/rutile-03-1280x817.webp" alt="Screenshot of the Rutile terminal with an ASCII art logo and an open settings window showing the text 'Coming later' and hints at future theme variants." class="wp-image-45273" style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Many features are already there. According to the roadmap, though, some settings and convenience features won&#8217;t be added until later versions.</figcaption></figure>



<p class="wp-block-paragraph">I think this is a sensible approach. Instead of shipping as many features as possible early on, the project first concentrates on a stable core. Especially with tools that many users rely on every day, reliability and a consistent way of working matter more than a long feature list.</p>



<p class="wp-block-paragraph">What is really missing right now are translations. Some dialogs currently show up only in French. You also can&#8217;t change the terminal colors directly in the settings yet. The default color scheme makes programs like Midnight Commander hard to read in places. That said, the current version of Rutile was only released a few days ago, so I expect something will happen here soon.</p>



<h2 class="wp-block-heading">Installation</h2>



<p class="wp-block-paragraph">On Arch Linux, Rutile is available in the AUR both as a source package and as a precompiled version. For Debian, Ubuntu, and Fedora, the developers provide ready-made DEB and RPM packages. You can also download a standalone binary, as long as the required GTK4 components are already installed. All the installation details are on the <a href="https://github.com/yatoub/Rutile#installation" data-type="link" data-id="https://github.com/yatoub/Rutile#installation">project&#8217;s GitHub page</a>.</p>



<p class="wp-block-paragraph">If you have been using Tilix for years and want to move to a modern GTK4 foundation, you should keep an eye on Rutile. A few features are still missing, but what I have seen of its development so far looks very promising. The project has a clear focus and could grow into a worthy successor to Tilix.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/gnu-linux/rutile-0-2-2-a-modern-alternative-to-tilix/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Spotify on GNOME: How to Fix the Blue Window Border</title>
		<link>https://linuxundich.de/en/gnu-linux/spotify-on-gnome-how-to-fix-the-blue-window-border/</link>
					<comments>https://linuxundich.de/en/gnu-linux/spotify-on-gnome-how-to-fix-the-blue-window-border/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Fri, 28 Nov 2025 14:01:59 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=58</guid>

					<description><![CDATA[A blue frame around Spotify on GNOME ruins the look, even though everything still works as it should. On Arch Linux, the fix is easy: either go through Flatpak or use a launch flag for the client from the AUR.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">If you use Spotify on Linux with <a href="https://linuxundich.de/tag/gnome/" data-type="post_tag" data-id="1734">GNOME</a>, you may have noticed an ugly blue border around the app window over the last few days. I&#8217;m seeing the problem here on my machine under <a href="https://linuxundich.de/tag/arch/" data-type="post_tag" data-id="1762">Arch Linux</a>, but it should affect all distributions.</p>



<p class="wp-block-paragraph">The culprit is an update to the official Electron-based Linux client that messed up the GTK-style window decoration. <a href="https://linuxundich.de/tag/spotify/" data-type="post_tag" data-id="1480">Spotify</a> itself works just as before, but visually it looks anything but nice.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624303026&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624303026" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/spotify-aur-blue-1280x780.webp" alt="Spotify with a blue border. An update to the Linux client broke the GTK-style window decoration, so the window is framed in an ugly blue and isn't displayed correctly." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Spotify with a blue border. An update to the Linux client broke the GTK-style window decoration, so the window is framed in an ugly blue and isn&#8217;t displayed correctly.</figcaption></figure>



<h2 class="wp-block-heading">Solutions for Spotify</h2>



<p class="wp-block-paragraph">There are two easy ways to fix the problem. The most convenient one is to install Spotify as a <a href="https://flathub.org/en/apps/com.spotify.Client">Flatpak</a>. The Flatpak version doesn&#8217;t show the blue frame, and you don&#8217;t have to worry about anything. No configuration changes are needed.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16243034ca&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16243034ca" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/spotify-flatpak-1280x780.webp" alt="The Flatpak version of Spotify doesn't show the blue frame. The GTK-style window decoration is rendered correctly, and after installation the window looks normal and error-free." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The Flatpak version of Spotify doesn&#8217;t show the blue frame. The GTK-style window decoration is rendered correctly, and after installation the window looks normal and error-free.</figcaption></figure>



<p class="wp-block-paragraph">If you installed Spotify via the <a href="https://github.com/kpcyrd/spotify-launcher">Spotify Launcher</a> (the <em>spotify-launcher</em> package from Arch&#8217;s extra repository) or directly from the <a href="https://aur.archlinux.org/packages/spotify">AUR</a> (the <em>spotify</em> entry), you need to set the launch flag <code>--ozone-platform=x11</code> instead. That makes the GTK decoration show up correctly. Depending on how you installed it, add the flag like this:</p>



<p class="wp-block-paragraph"><strong>For AUR Spotify</strong> in the file <code>~/.config/spotify-flags.conf</code>:</p>



<pre class="wp-block-code"><code>--ozone-platform=x11</code></pre>



<p class="wp-block-paragraph"><strong>For Spotify Launcher</strong> in <code>~/.config/spotify-launcher.conf</code>:</p>



<pre class="wp-block-code"><code>&amp;#91;spotify]
extra_arguments = &amp;#91;&quot;--ozone-platform=x11&quot;]</code></pre>



<p class="wp-block-paragraph">You may have to create these files first. After restarting Spotify, the blue frame should be gone and everything should look normal again.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624303a0b&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624303a0b" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/spotify-ozone-platform.webp" alt="The configuration files under ~/.config. You may have to create them first. You only need the file that matches your installation method, not both at the same time." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The configuration files under ~/.config. You may have to create them first. You only need the file that matches your installation method, not both at the same time.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624303d05&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624303d05" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/spotify-flatpak-flags-1280x780.webp" alt="Alternatively, you can set the flag --ozone-platform=x11 if you installed Spotify from the AUR. The window frame is then displayed correctly and normally again." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Alternatively, you can set the flag &#8211;ozone-platform=x11 if you installed Spotify from the AUR. The window frame is then displayed correctly and normally again.</figcaption></figure>



<p class="has-pale-cyan-blue-background-color has-background wp-block-paragraph"><strong>Correction from <a href="https://social.anoxinon.de/@fabiscafe@mstdn.social/115627842495268735">Fabian on Mastodon</a>:</strong> That&#8217;s not quite right. This is solely down to Spotify running natively on Wayland, where under GNOME it needs a client-side decoration (CSD), which it provides through that blue one. Forcing it back to X11 might cause real problems, like blurry fonts, bad (or no) scaling and so on. Also, Spotify isn&#8217;t Electron, it&#8217;s the Chromium Embedded Framework (CEF).</p>



<p class="wp-block-paragraph">Sure, it&#8217;s a crutch, but one that helps right now. And you can undo the change quickly, too. The other options would be to run GNOME under X11 or to make friends with the blue frames. To me, neither is exactly ideal. So for now this is a workaround, and of course you shouldn&#8217;t forget about it in case Spotify starts acting up again at some point.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/gnu-linux/spotify-on-gnome-how-to-fix-the-blue-window-border/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Plattenalbum and Euphonica: MPD clients for GNOME on Linux</title>
		<link>https://linuxundich.de/en/gnu-linux/plattenalbum-and-euphonica-mpd-clients-for-gnome-on-linux/</link>
					<comments>https://linuxundich.de/en/gnu-linux/plattenalbum-and-euphonica-mpd-clients-for-gnome-on-linux/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Sat, 22 Nov 2025 13:26:35 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=60</guid>

					<description><![CDATA[Plattenalbum and Euphonica are two current GTK4 clients for MPD that show how music management and playback can work on the GNOME desktop. The focus is on layout, features, and how they feel in daily use.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">There are plenty of software tools and programs that have been with me for decades. On Windows, that would be Total Commander, Notepad++, or 7-Zip. On Linux, for me it&#8217;s the <a href="https://linuxundich.de/tag/gnome">GNOME desktop</a> with its ecosystem of Evolution, Gedit, and Nautilus. That&#8217;s true even though it has moved far away from the look and feel of the old GNOME 2 days, and despite the often justified criticism of the developers&#8217; &#8220;we remove important features&#8221; policy.</p>



<p class="wp-block-paragraph">Besides these graphical tools, the <a href="https://www.musicpd.org/">Music Player Daemon</a>, MPD for short, has been with me for a long time too. The name sounds cryptic at first, but the concept behind it is simple. MPD is a music player that runs in the background and can be remote-controlled through numerous clients. So you can hook a computer or <a href="https://linuxundich.de/category/raspberry-pi/">Raspberry Pi</a> up to your stereo, add your own music collection, and control playback from anywhere in the house.</p>



<h3 class="wp-block-heading">Music Player Daemon aka MPD</h3>



<p class="wp-block-paragraph">MPD is quite different from streaming servers like <a href="https://jellyfin.org/">Jellyfin</a> or <a href="https://www.navidrome.org/">Navidrome</a>, which are based on the Subsonic protocol. With those, the server streams the music to the clients. With MPD, the client only controls playback, and the service itself plays directly on the server. What I find remarkable is that development on MPD hasn&#8217;t fizzled out even after more than twenty years. The current stable version, MPD 0.24.6, has only just been released.</p>



<p class="wp-block-paragraph">You can tell that MPD is still alive and kicking on the client side as well. Modern Subsonic clients for Linux (especially for the GNOME desktop) have unfortunately become really rare. <a href="https://sublimemusic.app">Sublime Music</a> and <a href="https://github.com/jeffvli/sonixd">Sonixd</a> have been discontinued, and I can&#8217;t warm to <a href="https://github.com/jeffvli/feishin">Feishin</a> or <a href="https://github.com/supersonic-app/supersonic">Supersonic</a>. Around MPD, on the other hand, new projects keep popping up. Lately, more and more apps are appearing based on GTK4 and Libadwaita, which fit perfectly into the current GNOME design and make good use of the desktop&#8217;s features.</p>



<h3 class="wp-block-heading">MPD for GNOME: Plattenalbum</h3>



<p class="wp-block-paragraph"><a href="https://github.com/SoongNoonien/plattenalbum">Plattenalbum</a> (<a href="https://flathub.org/de/apps/de.wagnermartin.Plattenalbum">Flathub</a>) just received an update to version 2.4.0 and uses GTK4 without getting lost in an overly playful design. The album covers are clearly the center of the interface. The layout stays classic: artists on the left, albums in the middle, and on the right the player with the controls for playback.</p>



<p class="wp-block-paragraph">If you want to read the lyrics during playback, use the button above the player to switch to the lyrics view. The lyrics don&#8217;t have to be stored in the ID3 tag. Plattenalbum loads them automatically from the Brazilian service <a href="https://www.letras.com/">Letras</a>, which is especially handy if your own files aren&#8217;t fully tagged. There aren&#8217;t many settings, and honestly, it doesn&#8217;t need many.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac162430544e&quot;}" data-wp-interactive="core/image" data-wp-key="6ac162430544e" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/plattenalbum-mpd-client_01-1280x893.webp" alt="Overview of all albums on the server, neatly arranged with a focus on the covers and MPD controls you can use right away." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Overview of all albums on the server, neatly arranged with a focus on the covers and MPD controls you can use right away.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16243057f2&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16243057f2" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/plattenalbum-mpd-client_02-1280x893.webp" alt="A look at the current playlist, which you can browse freely during playback without interrupting the track that is playing." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">A look at the current playlist, which you can browse freely during playback without interrupting the track that is playing.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624305b71&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624305b71" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/plattenalbum-mpd-client_03-1280x893.webp" alt="The automatically loaded lyrics appear clearly in the window, complemented by information from the external service Letras." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The automatically loaded lyrics appear clearly in the window, complemented by information from the external service Letras.</figcaption></figure>



<h3 class="wp-block-heading">MPD for GNOME: Euphonica</h3>



<p class="wp-block-paragraph">Unlike Plattenalbum, <a href="https://github.com/htkhiem/euphonica">Euphonica</a> (<a href="https://flathub.org/de/apps/io.github.htkhiem.Euphonica">Flathub</a>) relies much more on visual effects. The window background adapts to the colors of the current album, and an animated spectrum moves along the bottom edge. When you switch between the artist and album views or open an album, the individual elements glide smoothly into view, which gives it a modern feel.</p>



<p class="wp-block-paragraph">Euphonica also convinces functionally. You can navigate through artists and albums, and filtering by genre is supposed to come in the future. With MPD 0.24 or newer, you can rate albums. Through MPRIS, Euphonica integrates seamlessly into the desktop, shows notifications when the track changes, and lets you control playback through the desktop&#8217;s own functions as well.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624306030&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624306030" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/euphonica-mpd-client_01-1280x904.webp" alt="The album view shows the whole collection in MPD with a dynamic background that visibly adapts to the album you currently have open." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The album view shows the whole collection in MPD with a dynamic background that visibly adapts to the album you currently have open.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16243063b4&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16243063b4" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/euphonica-mpd-client_02-1280x904.webp" alt="The playlist takes on the colors of the current song's cover and creates a coherent atmosphere during playback." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The playlist takes on the colors of the current song&#8217;s cover and creates a coherent atmosphere during playback.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624306756&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624306756" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/euphonica-mpd-client_03-1280x904.webp" alt="The settings window offers numerous options for adapting the client to your own MPD setup." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The settings window offers numerous options for adapting the client to your own MPD setup.</figcaption></figure>



<p class="wp-block-paragraph">In general, it would be great if a new GTK4/Libadwaita client for Subsonic showed up again. <a href="https://www.navidrome.org/">Navidrome</a> runs very reliably on my small self-hosting server. For Android, there&#8217;s <a href="https://symfonium.app/">Symfonium</a> (proprietary, but worth every cent) and <a href="https://github.com/eddyizm/tempus">Tempus</a>, an actively developed version of the FOSS client <a href="https://github.com/CappielloAntonio/tempo">Tempo</a>. Navidrome&#8217;s web frontend works great too. On the desktop, though, a native app is missing, and right now there&#8217;s a big gap.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/gnu-linux/plattenalbum-and-euphonica-mpd-clients-for-gnome-on-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Yet Another Radio: Simple Internet Radio Right in the GNOME Shell</title>
		<link>https://linuxundich.de/en/gnu-linux/yet-another-radio-simple-internet-radio-right-in-the-gnome-shell/</link>
					<comments>https://linuxundich.de/en/gnu-linux/yet-another-radio-simple-internet-radio-right-in-the-gnome-shell/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Wed, 19 Nov 2025 17:50:59 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=56</guid>

					<description><![CDATA[Easy radio listening in the GNOME Shell: Yet Another Radio lets you play your favorite stations without a separate app, with favorites, your own station list, and quick search via the Radio Browser API. Ideal for hassle-free internet radio.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A quick tip for all <a href="https://linuxundich.de/tag/gnome/" data-type="post_tag" data-id="1734">GNOME users</a> who like listening to internet radio on their computer: Of course, you can use apps like <a href="https://flathub.org/en/apps/de.haeckerfelix.Shortwave">Shortwave</a>, a very full-featured program with plenty of settings and functions. It doesn&#8217;t just play radio, it can also record tracks on the side. Just like back in the day at the good old radio tower, where you had to sprint over to hit &#8220;Record&#8221;, only to throw the recording away in the end because the host had cut into the music for a traffic report.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624307fd7&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624307fd7" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/shortwave-radio-1280x843.webp" alt="Shortwave offers a feature-rich interface with plenty of settings and functions, and makes playing and recording internet radio stations easy." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Shortwave offers a feature-rich interface with plenty of settings and functions, and makes playing and recording internet radio stations easy.</figcaption></figure>



<p class="wp-block-paragraph">But honestly, for the occasional bit of radio you don&#8217;t always need all the bells and whistles. That&#8217;s where <a href="https://extensions.gnome.org/extension/8843/yet-another-radio/">Yet Another Radio</a> comes in: a compact and handy <a href="https://linuxundich.de/tag/gnome-erweiterung/" data-type="post_tag" data-id="2059">extension</a> for the GNOME Shell. It plays your favorite stations without you having to open a separate app. You still get the convenience, too: you don&#8217;t have to hunt down stations and their URLs online yourself, because a database is built right in.</p>



<h2 class="wp-block-heading">What is Yet Another Radio?</h2>



<p class="wp-block-paragraph">The developer <a href="https://www.reddit.com/r/gnome/comments/1p131t2/yet_another_radio_extension/">describes</a> his motivation on Reddit like this:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Hello everyone! Long story short, I recently switched from KDE to GNOME and saw that there is no extension like the popular <a href="https://invent.kde.org/saurov/arp">Advanced Radio Player</a> for GNOME which is simple and easy to use. So I started developing my very first extension.</p>
</blockquote>



<p class="wp-block-paragraph">In short: if you&#8217;re looking for a simple, uncluttered tool to control radio stations right from the GNOME panel, this is exactly what you need. <a href="https://extensions.gnome.org/extension/8843/yet-another-radio/">Here&#8217;s the extension on GNOME Extensions</a>.</p>



<h2 class="wp-block-heading">Features at a Glance</h2>



<p class="wp-block-paragraph">With Yet Another Radio, you can play your favorite stations straight from the panel, without having to open an extra window. Through the <a href="https://www.radio-browser.info/">Radio Browser API</a>, you can search thousands of stations and quickly find whatever you&#8217;re in the mood for. You can mark your favorites so you can play them any time with a single click.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624308c3d&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624308c3d" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/yet-another-radio_01.webp" alt="Yet Another Radio blends nicely into the GNOME panel and lets you play internet radio stations directly, without any extra windows." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Yet Another Radio blends nicely into the GNOME panel and lets you play internet radio stations directly, without any extra windows.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624308f5a&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624308f5a" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/yet-another-radio_02.webp" alt="Favorites, custom stations and other options can be managed and adjusted conveniently in the extension's settings." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Favorites, custom stations and other options can be managed and adjusted conveniently in the extension&#8217;s settings.</figcaption></figure>



<p class="wp-block-paragraph">If you like, you can also add your own stations manually or import and export existing lists. That comes in handy if you use several devices, for example. The extension also displays track information including album covers, although so far I haven&#8217;t found a single station where this feature actually shows up.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624309326&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624309326" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/11/yet-another-radio_03.webp" alt="The search function lets you quickly find thousands of radio stations and add your favorites straight to the favorites list." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The search function lets you quickly find thousands of radio stations and add your favorites straight to the favorites list.</figcaption></figure>



<p class="wp-block-paragraph">So Yet Another Radio is ideal for anyone who wants to listen to internet radio in GNOME without fuss, and without depending on a full-blown app like Shortwave. Just install it, search for stations, set your favorites, done. If you want more, you can import station lists or add your own stations. A small, nice extension that shows how handy GNOME extensions can be.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/gnu-linux/yet-another-radio-simple-internet-radio-right-in-the-gnome-shell/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Chainlane: Bike navigation with Brouter on your smartphone</title>
		<link>https://linuxundich.de/en/android/chainlane-bike-navigation-with-brouter-on-your-smartphone/</link>
					<comments>https://linuxundich.de/en/android/chainlane-bike-navigation-with-brouter-on-your-smartphone/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Fri, 05 Sep 2025 14:26:21 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=21</guid>

					<description><![CDATA[Brouter is considered an insider tip for cyclists who want to plan their routes independently of commercial services. With Chainlane, the tool is now coming to Android – handy when you're out riding, but with one small catch.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Many adventurous cyclists turn to <a href="https://bikerouter.de">Bikerouter</a>, or Brouter for short, when they plan a route. For years, the tool has been the first choice for precise route planning without depending on commercial services like Komoot, Strava, or RideWithGPS. What people appreciate most is that you can tweak the routing profiles down to the smallest detail, whether you ride a road bike, a gravel bike, or something more exotic like a recumbent or a velomobile.</p>



<p class="wp-block-paragraph">On a desktop computer, this works perfectly: you build the route in the browser with plenty of time and patience, export it as GPX, and send it to your bike computer or your favorite navigation app. But what if you need a route on the spot while you&#8217;re out riding? That&#8217;s where <a href="https://play.google.com/store/apps/details?id=dev.skynomads.chainlane">Chainlane</a> comes in. It&#8217;s a new Android app that brings Brouter, and with it navigation based on OpenCycleMap, straight to your smartphone, and it clearly leaves Google Maps behind as a bike navigation tool.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac162430a75b&quot;}" data-wp-interactive="core/image" data-wp-key="6ac162430a75b" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/08/bikerouter-web-1280x954.png" alt="The Bikerouter web interface with the profile list expanded and a planned route on the map." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Bikerouter offers far more profiles for optimal route planning than Strava, Komoot, and the like. That makes it possible to plan routes for velomobiles or recumbent bikes, too.</figcaption></figure>



<h2 class="wp-block-heading">Chainlane: Brouter in your pocket</h2>



<p class="wp-block-paragraph">With Chainlane, you carry Brouter and offline maps right on your phone. You can plan a route on the spur of the moment, without having to export GPX files on your computer first. In my first test, this already worked quite reliably: enter a start and destination or just tap the map, pick a routing profile, and the app spits out a route.</p>



<figure data-wp-context="{&quot;galleryId&quot;:&quot;6ac162430aa43&quot;}" data-wp-interactive="core/gallery" class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16243e25f7&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16243e25f7" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" data-id="45121" src="https://linuxundich.de/wp-content/uploads/2025/08/chainlane-brouter-android_01-461x1024.webp" alt="Chainlane shows a map of the surrounding area with a search field and a bar for Map, Planner, Routes and Settings." class="wp-image-45121" style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16243e4350&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16243e4350" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" data-id="45120" src="https://linuxundich.de/wp-content/uploads/2025/08/chainlane-brouter-android_02-461x1024.webp" alt="A planned route with distance, elevation gain, riding time and elevation profile at the bottom." class="wp-image-45120" style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16243e5d80&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16243e5d80" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" data-id="45124" src="https://linuxundich.de/wp-content/uploads/2025/08/chainlane-brouter-android_03-461x1024.webp" alt="A menu for choosing the routing profile with the entries Gravel, Road and Mountain." class="wp-image-45124" style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16244443f9&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16244443f9" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" data-id="45122" src="https://linuxundich.de/wp-content/uploads/2025/08/chainlane-brouter-android_04-461x1024.webp" alt="The navigation view with turn instruction, remaining distance and the buttons Reroute, Recalculate and Stop." class="wp-image-45122" style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16244474cb&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16244474cb" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" data-id="45123" src="https://linuxundich.de/wp-content/uploads/2025/08/chainlane-brouter-android_05-461x1024.webp" alt="The Android share dialog offers the calculated route to Garmin Connect, Komoot and Wahoo, among others." class="wp-image-45123" style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac162447ed08&quot;}" data-wp-interactive="core/image" data-wp-key="6ac162447ed08" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" data-id="45125" src="https://linuxundich.de/wp-content/uploads/2025/08/chainlane-brouter-android_06-461x1024.webp" alt="The exported route in another app with map, distance, elevation gain and elevation profile." class="wp-image-45125" style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</figure>



<p class="wp-block-paragraph">For navigating on the road, you can use Chainlane with the phone mounted on your handlebars, but you don&#8217;t have to. Since a small update, the calculated routes can also be exported without any trouble, for example to bike computers like the Wahoo Roam or to Garmin devices. That makes the app very flexible, especially if you already have a bike GPS but don&#8217;t like its built-in routing algorithm, or if you&#8217;re riding a &#8220;special&#8221; bike like a velomobile.</p>



<h2 class="wp-block-heading">Features and development status</h2>



<p class="wp-block-paragraph">The app is still in the middle of development. Basic features like route planning and simple navigation are already there. Turn-by-turn hints exist, but so far they only work reliably as long as you stay on the planned route. According to the developer, voice announcements and more robust active routing are still to come.</p>



<p class="wp-block-paragraph">Something interesting for advanced users: you can plug your own BRouter profiles into Chainlane. The interface is still being reworked, but you can already calculate very individual routes with it. You&#8217;ll find more insight into the development process in the <a href="https://www.reddit.com/r/Fahrrad/comments/1n1dy3m/ich_stelle_vor_mobile_fahrradnavigation_mit/">developer&#8217;s introduction post on Reddit</a>. The author of the app is active there under the name <a href="https://www.reddit.com/user/RepulsiveRaisin7/">RepulsiveRaisin7</a> and regularly answers questions.</p>



<h2 class="wp-block-heading">Cost model and future</h2>



<p class="wp-block-paragraph">Right now, Chainlane is free, including all features. A subscription model is planned for later, with around 15 euros per year under discussion. Extra features like points of interest on the map (e.g. water points, cafés, bike shops, shelters) or a power-saving mode are supposed to end up behind that paywall.</p>



<p class="wp-block-paragraph">There&#8217;s a catch for those of us who care about free software: Chainlane is not open source and is currently only available in the <a href="https://play.google.com/store/apps/details?id=dev.skynomads.chainlane">Google Play Store</a>. That&#8217;s a shame, especially because the foundation, Brouter, is a prime example of how powerful and future-proof open source can be. If you have freed your Android phone from Google, you&#8217;ll have to keep relying on <a href="https://f-droid.org/de/packages/net.osmand.plus/">OsmAnd~</a>.</p>



<h2 class="wp-block-heading">A good option with potential</h2>



<p class="wp-block-paragraph">So Chainlane is an exciting addition for anyone who wants to use Brouter flexibly on the road. The app is still in its infancy, but in my testing it already works surprisingly well. If you&#8217;ve been wrestling with GPX exports and imports until now, this gives you a handy tool. If you&#8217;re a Brouter fan anyway, it&#8217;s worth a look. And maybe you can still convince the developer to release Chainlane as free software at some point. That would be a win for all of us.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/android/chainlane-bike-navigation-with-brouter-on-your-smartphone/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Setting up a WireGuard VPN between a Fritzbox and Linux</title>
		<link>https://linuxundich.de/en/gnu-linux/setting-up-a-wireguard-vpn-between-a-fritzbox-and-linux/</link>
					<comments>https://linuxundich.de/en/gnu-linux/setting-up-a-wireguard-vpn-between-a-fritzbox-and-linux/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Fri, 23 May 2025 10:46:32 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/?p=19</guid>

					<description><![CDATA[A new Fritzbox brings official WireGuard support for the first time. That makes VPN access to your home network under Linux especially straightforward. Modern distributions usually ship the necessary tools out of the box.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Now that a new <a href="https://linuxundich.de/hardware/umzug-avm-fritzbox-5690-pro/">Fritzbox 5690 Pro</a> is sitting in my hallway, I can finally try out the (not really so) new WireGuard VPN of the <a href="https://linuxundich.de/tag/fritzbox/" data-type="link" data-id="https://linuxundich.de/tag/fritzbox/">Fritzbox</a>. The VPN protocol itself isn&#8217;t new to me, since you can easily set it up with <a href="https://github.com/wg-easy/wg-easy">wg-easy</a> and similar tools. Still, I find it handy when a feature like this is built right into the router and doesn&#8217;t have to run on a separate server.</p>



<p class="wp-block-paragraph">That way, access to your own network stays possible even on the day the server doesn&#8217;t work the way it should. If something is wrong with the box itself and the internet connection drops out completely, everything is usually lost anyway. On top of that, you need neither port forwarding nor an extra DynDNS service in this case, because AVM takes care of that with its <a href="https://fritz.com/pages/myfritz-net-hilfe">MyFritz service</a>.</p>



<h2 class="wp-block-heading">Setting up WireGuard on the Fritzbox</h2>



<p class="wp-block-paragraph">You set this up in the Fritzbox under <em>Internet</em> » <em>Permit Access</em> (<em>Freigaben</em>) on the <em>VPN (WireGuard)</em> tab. Click <em>Add Connection</em> and then choose <em>Connect single device</em>. You can name the connection whatever you like. Usually it&#8217;s the name of the client machine or of the person who will use the VPN. At the end, you have to confirm the new connection, for example by phone, by pressing a button on the box, or in the Fritz app.</p>



<p class="wp-block-paragraph">The Fritzbox then shows you a page with a QR code. Scan it with your smartphone to import the connection straight into the official <a href="https://play.google.com/store/apps/details?id=com.wireguard.android">WireGuard app</a> for Android. Alternatively, you can use the open-source app <a href="https://web.archive.org/web/20250720165257/https://f-droid.org/de/packages/com.zaneschepke.wireguardautotunnel/">WG Tunnel</a>, which offers a lot more features than the “official” WireGuard client for Android. Personally, I use WG Tunnel, which I installed via F-Droid.</p>



<h2 class="wp-block-heading">WireGuard configuration in NetworkManager</h2>



<p class="wp-block-paragraph">For Linux (and desktop PCs in general), the Fritzbox lets you download the configuration. Click the button and save the file to your hard drive. By default, the file is saved as <code>wg_config.conf</code> in the <code>Downloads</code> folder. The name matters a bit, because some WireGuard clients automatically use it to name the interface.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16244832e7&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16244832e7" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/05/fritzbox-wireguard_01-1280x856.webp" alt="The Fritzbox generates the configuration automatically. All you have to do is download it or use the QR code. After that, the VPN is ready to use right away." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The Fritzbox generates the configuration automatically. All you have to do is download it or use the QR code. After that, the VPN is ready to use right away.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16244835d3&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16244835d3" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/05/fritzbox-wireguard_02-1280x856.webp" alt="Choose the single device option to set up a connection between a mobile device or laptop and your home network. Site-to-site needs different settings." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Choose the single device option to set up a connection between a mobile device or laptop and your home network. Site-to-site needs different settings.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624483887&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624483887" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/05/fritzbox-wireguard_03-1280x856.webp" alt="The QR code is ideal for smartphones. On Linux, though, it's usually more convenient to work with the exported configuration file, which is easy to import into NetworkManager." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The QR code is ideal for smartphones. On Linux, though, it&#8217;s usually more convenient to work with the exported configuration file, which is easy to import into NetworkManager.</figcaption></figure>



<p class="wp-block-paragraph">You can import it directly through NetworkManager on the desktop or from the command line. On <a href="https://linuxundich.de/tag/gnome/" data-type="post_tag" data-id="1734">GNOME</a>, open <em>Settings</em>, go to <em>Network</em>, click the plus icon and choose <em>Import from file …</em> [CHECK: label]. Then select the file <code>wg_config.conf</code> and import it. You can rename the connection however you like in the settings afterwards, but I recommend setting the interface name to <code>wg0</code>.</p>



<pre class="wp-block-code"><code>$ &lt;strong&gt;nmcli connection import type wireguard file ~/Downloads/wg_config.conf&lt;/strong&gt;
Verbindung »wg_config« (39724859-b102-4446-bdb2-1ec60f501360) erfolgreich hinzugefügt.</code></pre>



<p class="wp-block-paragraph">That&#8217;s it. You can now activate the VPN directly from the Quick Settings in GNOME. Other desktop environments like KDE offer similar options as well. If you want to check whether the connection is up, install the <a href="https://extensions.gnome.org/extension/2983/ip-finder/">IP Finder</a> extension on GNOME. It shows you your public IP address along with a country flag. As soon as the flag of your home country shows up instead of the one for where you currently are (for example, abroad on vacation), the VPN is up and running.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624483d07&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624483d07" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/05/networkmanager-wireguard_01-1280x856.webp" alt="The GNOME interface lets you import VPN configurations in just a few clicks. That makes the tunnel ready to use in no time, and without a terminal." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The GNOME interface lets you import VPN configurations in just a few clicks. That makes the tunnel ready to use in no time, and without a terminal.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac1624483fe4&quot;}" data-wp-interactive="core/image" data-wp-key="6ac1624483fe4" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/05/networkmanager-wireguard_02-1280x856.webp" alt="After the import, you can still change the name of the connection. The interface can be renamed too, for example to the classic wg0." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">After the import, you can still change the name of the connection. The interface can be renamed too, for example to the classic wg0.</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ac16244842e5&quot;}" data-wp-interactive="core/image" data-wp-key="6ac16244842e5" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2025/05/networkmanager-wireguard_03-1280x822.webp" alt="Once the configuration is imported, you can switch on the VPN connection at any time from the quick settings. That keeps your system connected to your home network whenever you need it." style="width:100%"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Once the configuration is imported, you can switch on the VPN connection at any time from the quick settings. That keeps your system connected to your home network whenever you need it.</figcaption></figure>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/spendiere-einen-kaffee/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/gnu-linux/setting-up-a-wireguard-vpn-between-a-fritzbox-and-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
