in ♥️ with linux

After 20 years with macOS, I returned to Linux many days ago, including some days without hopping on Debian Stable.

Now that I'm four months into my one-year “Don't Distrohop” Debian challenge, I can say that it continues to prove (to me) that choosing “stable” was the right decision. Basically, though, this applies to every LTS version. Instead of constantly chasing after the latest version (as in a rolling release) and putting my energy into updates and “pimping” the UI, I’d rather learn how to use the “old” version properly.

still stable with a bit of frankendebian

Debian stable, combined with backports and Flatpak, is still enough for me.

I’ve only broken the golden rule that stable and testing must never be mixed (FrankenDebian) for one package: framework-tool

This tool is handy for managing my frame.work 12 from the terminal... the charging limit and stuff like that.

But apt configuration does allow you to set the priority of the sources, so only this one package is installed from the testing repository.

more and more love for GNOME

Even after four months, it’s clear to me that there’s no better desktop environment than GNOME.

Sometimes I feel like the system was built just for me. Sure, there are one or two things I’ve tweaked, but basically, the system is perfect.

The only thing is, it would be nice if GTK3 and GTK4 were a bit more consistent… but it’s fine as it is.

understanding systemd (a bit)

I understand systemd more and more. Whether it's creating services or reading logs. I don't know where the hate comes from. I find it quite practical.

A quick disclaimer: I'm not entirely sure what I'm doing here. This weekend was my first time working with podman. So... try this at your own risk!

a little background first

On the mac, Devonthink has always been—and still is—the best program ever. Simply because all documents are managed locally on the computer. In other words, the app doesn’t require the cloud. When I switched to Linux, it really bothered me that I couldn't find a suitable alternative. Paperwork, for example, also manages documents locally on the computer, but its design was too basic (in my opinion), and I just couldn't get into it.

paperless-ngx

Paperless-ngx is a community-supported open-source document management system that transforms your physical documents into a searchable online archive so you can keep, well, less paper.

This quote from the homepage describes paperless-ngx pretty well, though the “online” part bothered me a bit. I don't want to store my files online on a server, and keeping them on a local NAS doesn't make sense either, because then I wouldn't have them with me when I'm on the go.

solution: local paperless-ngx

Podman comes to the rescue. Thanks to Podman, I can run Paperless locally on my computers (running debian) using containers. It was surprisingly easy (I only wasted an entire Saturday experimenting with it).

installation

preparation

Well, you need podman ...

sudo apt install podman-compose

container setup

First, you need to create a container using Podman. To do this, you’ll need three files in a folder (in my case, paperless-ngx). This folder is simply located in the user’s home directory.

I mainly followed these instructions on linuxguides.de (thanks for the tip Christian!) and the output of the paperless-ngx installer.

.env (hidden file):

COMPOSE_PROJECT_NAME=paperless

docker-compose.env:

PAPERLESS_TIME_ZONE=Europe/Berlin
PAPERLESS_OCR_LANGUAGE=deu+eng
USERMAP_UID=0
USERMAP_GID=0

docker-compose.yml:

name: paperless
services:
  broker:
    image: docker.io/library/redis:8
    restart: unless-stopped
    volumes:
      - redisdata:/data
  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    restart: unless-stopped
    depends_on:
      - broker
    ports:
      - "8000:8000"
    volumes:
      - ~/Dokumente/Paperless/Data:/usr/src/paperless/data
      - ~/Dokumente/Paperless/Media:/usr/src/paperless/media
      - ~/Dokumente/Paperless/Export:/usr/src/paperless/export
      - ~/Dokumente/Paperless/Import:/usr/src/paperless/consume
    env_file: docker-compose.env
    environment:
      PAPERLESS_REDIS: redis://broker:6379
volumes:
  redisdata:

I decided to use SQLite as the database because it will allow me to easily sync it between my computers later using Synthing.

It is important to adjust the volumes. These are located in my “Documents” folder under “paperless.”

Data: the database

Media: all the files

Export: Export Folder

Import: Drop documents in this folder for adding them

The “paperless” folder contains the entire contents of paperless-ngx, making it very easy to back up or sync.

container compose

In that folder, just run

podman compose up

and everything will be installed.

start and stop the container

The paperless-ngx container doesn't need to run all the time—only when I need to access it. So I wrote a little Bash script to start or stop the container. Just a quick heads-up: I'm a novice and like to keep things colorful ;)

paperless.sh:

#!/bin/bash

set -euo pipefail

# Colors
readonly BLUE='\033[0;34m'
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly NC='\033[0m'

BROKER="paperless_broker_1"
WEBSERVER="paperless_webserver_1"

# Check, if container are running
both_running() {
    [ "$(/usr/bin/podman inspect -f '{{.State.Running}}' "$BROKER" 2>/dev/null)" = "true" ] &&
    [ "$(/usr/bin/podman inspect -f '{{.State.Running}}' "$WEBSERVER" 2>/dev/null)" = "true" ]
}

# Start Containers
start_containers() {
    echo -e "${YELLOW}🟡 Starting $BROKER${NC}"
    /usr/bin/podman start "$BROKER" >/dev/null 2>&1
    sleep 2
    echo -e "${YELLOW}🟡 Starting $WEBSERVER${NC}"
    /usr/bin/podman start "$WEBSERVER" >/dev/null 2>&1
    echo -e "${GREEN}🟢 Both Containers running.${NC}"
}

# Stop Containers
stop_containers() {
    echo -ne "${YELLOW}⚠️  Stop Container? ${NC}"
    read -p "(j/n) [n]: " answer
    echo
    if [ "$answer" = "j" ]; then
        echo -e "${YELLOW}🟡 Stopping $WEBSERVER${NC}"
        /usr/bin/podman stop "$WEBSERVER" >/dev/null 2>&1
        sleep 2
        echo -e "${YELLOW}🟡 Stopping $BROKER${NC}"
        /usr/bin/podman stop "$BROKER" >/dev/null 2>&1
        echo
        echo -e "${GREEN}🟢 Both Containers are stopped.${NC}"
    else
        echo -e "${RED}🔴 Cancel: Containers still running.${NC}"
    fi
}

# Main
echo
echo "### Paperless-ngx - Podman ###"
echo
if both_running; then
    stop_containers
else
    start_containers
fi

Access Paperless

Just go to http://localhost:8000 in your browser, and everything works perfectly.

Sync and backup

As mentioned earlier, the “Paperless” folder in “Documents” contains everything and can be synced between computers using Syncthing, for example. This folder is also very easy to back up.

Manage podman

Of course, you can also do this via the CLI, but I like the simplicity of cockpit, which can also be used on Debian. Cockpit has a handy module for managing Podman.

The largest part of my life, I’ve bought and listened to music locally—first on vinyl, then on cassette, later on CD, and as purchases on iTunes. My music collection is accordingly large, and a small fortune has been invested in building it. Accordingly, I can’t just switch to streaming, and I also want to own my music. So, important albums are on vinyl, but I also like to buy them as MP3s, for example from Bandcamp.

Hardware

At 14, owning a stereo system was the biggest thing – even at almost 50, it still is. I run two 1980s Magnat speakers through a Rotel A12MKII amplifier.

The amplifier supports Bluetooth, but somehow it’s just easier to run 15 meters of audio cable across the room.

Software

You’ve tried music players on Linux, and so much of it is either very ugly or too bloated.

But there’s one highly praised option: Amberol.

Amberol is simple and looks good. You just open a folder with files, and they play—no database or other unnecessary bells and whistles.

Now there’s still the issue that changing the audio output in GNOME is cumbersome and has to be done through Settings. But the Audio Switch Shortcuts extension solves this problem—with keyboard shortcuts, you can easily switch between devices.

GNOME 50 ... not yet

I had a brief window—okay, a few days—to distro-hop again after GNOME 50 was released, but then I realized ... I can just wait another 1.5 years for Forky. So it is still GNOME 48 for me :)

Testing laptop

Because I have a fantastic ThinkPad T460 sitting on my desk as a third machine, I’ve chosen it as the test machine for the upcoming Debian 14 (testing). This gives me a good preview of what’s coming, and honestly, I don’t quite dare to run Testing or Unstable in production. It’s supposed to work well, but Stable just runs too smoothly to switch.

Freeze solved

After my desktop (AMP Ryzen 5 CPU with Radeon RX 6500 XT GPU) kept freezing unpredictably for a while, the problem appears to have been resolved thanks to a newer kernel, AMD firmware and MESA from the backports repo.

More backports stuff

Recently, I also experimented with building backports for personal use, thanks to these instructions: SimpleBackportCreation. Works surprisingly simple. However, since the GNOME app ecosystem is focusing on Flatpak, installing software via Flatpak is more convenient.

Homelab

Now that my fiber optic connection is finally arriving soon, my server (also running Trixie) will take on entirely new tasks. I’m hoping my 'homelab' will grow a bit, and I’ll dive into something I currently know nothing about: containers. I’d therefore appreciate any tips, guides, or recommendations! Docker, Podman ... what to choose? Tips are more than welcome!

One thing that really bothered me was the difference in corner radius between GTK3 and GTK4 apps in GNOME.

GTK4 (Adwaita) has a 15px radius on all corners, while GTK3 has a smaller radius only on the top corners.

Fortunately, this can be customized with a little CSS. This way, everything looks great even with the default Adwaita theme.

Solution: .config/gtk-3.0/gtk.css

Just add this to the gtk.css in .config/gtk-3.0 (in your homefolder).

/* Rounded corners */
headerbar {
  border-radius: 15px 15px 0 0;
}
window decoration {
  border-radius: 15px;
}
window, window.background {
  border-radius: 0 0 15px 15px;
}
menuitem decoration {
  border-radius: 0;
}
/* Rounded corners */

Firefox and Thunderbird

In Firefox and Thunderbird, a few more steps are required, as the bottom corners need to be explicitly enabled.

Firefox

Enter about:config in the address bar to access the settings. Here, set the value widget.gtk.rounded-bottom-corners.enabled to true.

Thunderbird

You can access the same setting via Settings > General > Config Editor. Set the value to widget.gtk.rounded-bottom-corners.enabled and true here as well.

QT? BUGS?

That's the next thing to do is tune qt-apps... and there a still a few dialogs that doesn't work....

This is the second month of my one-year challenge: No distrohopping ... only use Debian stable.

That's why this post, like the next 10, is more of a diary and reflection on the last month with Debian.

Even in the second month, I can only say that I am very happy. I consider the fact that I am not necessarily using the latest software to be a huge advantage.

Everything works and I can continue to focus on optimizing workflows. Examples include syncing KeepassXC / KeepassDX to a smartphone via gsconnect / kdeconnect.

Everything works, and I can continue to focus on optimizing workflows. Examples include syncing Keepass to my smartphone via gsconnect (kdeconnect) or backing up/sharing important family documents with Cryptomator.

GNOME is increasingly becoming my favorite desktop, and floating suits me better than tiling.

But I've also realized that dark mode isn't for me. I felt the same way with macOS. Only the editor and terminal are dark.

I also like the Papirus icon set more than Adwaita. Basically, Adwaita isn't really an icon set, since many apps come with their own icons. Some are good, some aren't to my taste. Papirus provides consistency.

Unfortunately, not all apps are included in Papirus: Tuba and Newsflash are still missing (I built something myself for Tuba, let's see if Newsflash is still missing).

What I'm really getting more and more excited about is dotdrop. It now syncs not only my dotfiles, but also dconf settings, i.e. my Gnome settings between my PC and laptop. Here, too, everything is packaged in a Bash script, so the operator only has to select export or import.

Currently, I’m tinkering with this blog because I’ve switched from hosting with write.as to self-hosting Writefreely on Uberspace.

Basically, Writefreely is the foundation for write.as, but now that I have direct access to all the files – thanks to it being open-source – I can customize it even more.

However, this means I had to reset a few things first to integrate them better – I no longer need to rely on JavaScript workarounds, only using them for cosmetic fun. Everything will work without javascript.

So if something occasionally appears twice in the RSS feed or the Fediverse... sorry about that. I’m still tinkering!

I’ve completed one month with Debian stable. It sounds dramatic, but it’s actually been a positive experience.

Switching from a rolling release like openSUSE Tumbleweed was quite a change, but I’ve really come to like the stable foundation Debian offers.

Some software is a few versions older—which isn’t a big deal—but there are also things that aren’t (or aren’t yet) available in the Debian repositories.

But for that, there’s Flatpak, which I trust more than random third-party repositories.

Right now, my only issue is that my custom-built AMD PC occasionally and very rarely freezes. I’m on the case, though, and I actually suspect it’s a third-party program that doesn’t come from the Debian repo.

On the bright side of committing to Debian for a year, I’ve now got a solid backup strategy in place with Déjà Dup, Timeshift, and Dotdrop. Thanks to that, reinstalling the system is a breeze – especially helpful since I tend to tinker more than a lot!

Since I’ve still got 11 months with Debian ahead of me, one of my current projects is learning how to create .deb packages. The Debian documentation is excellent—but also quite complex!

But my first attempt with rofi 2.0 was a success—so maybe in 11 months, I’ll have my own repo! ;)

All in all: A positive experience in the first month and a happy outlook for the next 11 months with Debian. Beyond the technical aspects, there’s also the good feeling of being on the right side.

#debian #gnome

Lately, I've been doing a lot of distro hopping: openSUSE, Debian, openSUSE, Debian, Fedora, openSUSE, and Debian again.

At least it's relatively limited. But Arch and nixOS also keep tempting me.

However, I believe that I need to get to know one distro really well. So in 2026, I will only use Debian Stable on my two main computers (PC and laptop).

No more distro hopping until 2027.

Of course, anything goes on my hobby Thinkpad. So that you can check up on me, the header of this page counts (Javascript must be enabled).

#debian

I've been a fan of the Speeddial since the early days of Opera. For me, a browser must have Speeddial. Unfortunately, Firefox (or Librewolf, in my case) has something similar, but it’s not the same. So you need something of your own.

Solution 1: HTML / Javascript

The simple solution is an HTML file that is set as the startpage in the browser.

It works somehow. I saved the URLs and images in a JavaScript file that is synced with chezmoi.

Solution 2: Bookmarks in Rofi

There is a great Python script for Rofi that uses Firefox's bookmark database. Since I sync my bookmarks with floccus, this is quite handy.

The script can also be easily adapted to Librewolf. I have also replaced Firefox with xdg-open so that I don't have to change the script, when changing browsers. This way I can easily use the bookmarks from Librewolf in Epiphany.

I store the script in .local/bin and start it in niri via

Ctrl+Alt+B { spawn-sh "rofi -theme bookmarks -modi 'Bookmarks: ':'rofi-bookmarks.py' -show";}

But those are bookmarks, not a Speeddial!

Link: rofi-bookmarks

Solution 3: Speeddial in rofi

Rofi is great. The launcher (drun, dmenu, etc.) is so flexible and can be scripted wonderfully.

At this point, I have to be honest:

Yes, I had help from AI (in my case, Kagi). My programming experience dates back to the 90s with Turbo Pascal. So, in long dialogues, I got the AI to code something useful. Maybe not great, but it's not rocket science either. If anyone wants to look at the code and, above all, improve it: feel free!

The result is based on three components:

Part 1: Rofi theme

This GitHub repository is a great source of inspiration and a basis for creating your own themes: https://github.com/adi1090x/rofi

I made use of it, but quickly turned the basis into something of my own.

I have a base theme (launcher.rasi) on which the theme for Speeddial (speeddial.rasi) is based. Accordingly, only changes are entered in speeddial.rasi.

Files: launcher.rasi and speeddial.rasi

Part 2: Bash-Script

The magic happens in speeddial.sh. This reads a JSON file containing the URL and location of the image for each tile. Both files are stored in ~/.speeddial

A simple function is also built in whereby entering +k search term triggers a search with Kagi.

Files: speeddial.sh and links.json

Part 3: Bash-Script for editing tiles

Another Bash script (also called speeddial.sh out of laziness) can edit the links.json file.

It basically has three functions: list, change, and convert.

The latter converts the json file into a Javascript file so that it can also be used in the HTML version (Solution 1).

When Speeddial +e is entered in Rofi, this script starts in the terminal (kitty).

File: speeddial.sh

Download:

All the files can be found in my dotfiles at codeberg: https://codeberg.org/Nasendackel/dotfiles