in ♥️ with linux

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

Small disclaimer: Since I'm using Debian Stable, I'm still on GNOME 48. Some of my issues might already be fixed in the latest version...

Personally, I think libadwaita's design language is the best thing that could happen to a UI. Kind of like Apple back in the day. I just love the look of GTK4 and Adwaita.

adw-gtk3

Since many great apps still use GTK3, adw-gtk3 is a good theme to make those apps look more similar to GTK4. It doesn’t quite work because GTK3 only has rounded corners at the top of the window, while GTK4 has all corners rounded. You could tweak it to match, but it wouldn’t make sense since GTK3 apps often have a status bar at the bottom of the window.

Geany in stock Gtk3

Geany in adw-gtk3

I just installed the gtk-3.0 files, because I have no need for tweaking GTK4.

tweaking Firefox (or Librewolf)

Firefox (or in my case, Librewolf) also still uses GTK3 but can have rounded corners at the bottom as well. You just need to enable it via about:config. Just set widget.gtk.rounded-bottom-corners.enabled to true.

Firefox in stock GTK3

Firefox in adw-gtk3

fixing glitches

Since adw-gtk3 isn’t designed with this in mind (round corners in the bottom), we still need to do a bit of manual tweaking to avoid display issues.

corner glitch

I also have a scaling glitch. On my laptop with 125% UI scaling, Firefox looks good, but on my desktop with 150%, I unfortunately often get a display glitch when moving the window. A dark line appears at the top of the window. This, as mentioned, is under GNOME 48 and only happens with Firefox/Librewolf on my setup (but maybe on yours too).

The solution is both complicated and simple at the same time:

Firefox gets its own GTK theme, which modifies adw-gtk3.

The theme add border-radius and disables the 1px border that causes the glitch.

The “theme” uses a gtk.css file, and for me, it's located in ~/.local/share/themes/gtk-3.0/.

It assumes that adw-gtk3 is also in ~/.local/share/themes. Otherwise, the path needs to be adjusted.

@import url("../../adw-gtk3/gtk-3.0/gtk.css");
decoration {
  border-radius: 15px;
  box-shadow:
    0 3px 8px 0 rgba(0, 0, 0, 0.3),
    0 0 0 0 @headerbar_bg_color;
}

Now we just need to start Firefox individually with this theme. That works with

env GTK_THEME=rounded firefox

For a permanent fix, we copy the relevant .desktop file from /usr/share/applications/ to ~/.local/share/applications/ an adjust the Exec entries to

Exec=env GTK_THEME=rounded /usr/lib/firefox-esr/firefox-esr %u

For Librewolf, of course, the corresponding launcher needs to be adjusted.

Firefox fixed

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