No, this blog wasn’t hijacked. This comes from the author of 😾 30 Years Defending Linux — Until I Called It Quits. But this is a public service to those who want to install and use a lightweight Linux distro, at their risks and perils. As to what happened and what will happen with my laptops, in a future installment.

Yes, I’m not senile, I know I criticized the Ubuntu 25.10 family, but Lubuntu was one of the best flavors of the season (Kubuntu 25.10 also worked fine, even with Wayland, but it’s heavier). All things considered, Lubuntu 25.10 should be rather fine to keep a ten-year-old laptop running.

1. The rationale

I happened to learn that version 2.2.0 of PCManFM-Qt has some improvements, of which the shortcuts Ctrl+Shift+NUMBER to change the view mode have been requested in 2017 (to match the behavior of the original PCManFM) and rejected by the same developer that implemented them in April 2025!

The problem? Lubuntu 24.04 LTS will stick to PCManFM-Qt 1.4.1 forever, as nobody’s going to backport a newer LXQt from universe! Debian 13, despite featuring the newer version 2.1.0, lacks the improvements brought by 2.2.0. The Fedora 43 LXQt spin, to be released soon, has 2.2.0, but let’s face it: the same way MATE looks the best in Ubuntu MATE, LXQt looks the best in Lubuntu. Only XFCE looks like shit in Xubuntu, mostly because Sean Davis never had good taste (XFCE looks much better in Manjaro and in Mint).

The idea is for you to install Lubuntu 25.10, get used to LXQt 2.2.0, then upgrade to Lubuntu 26.04 LTS and stay with it until your old computer dies, unless you decide to upgrade to the next LTS after 2, 4, or 6 years. On any LTS release, should you enable Ubuntu Pro (free for up to 5 computers per account), you got 10 years of security updates!

In Ubuntu Pro lingo, “esm-infra” refers to the security updates provided for packages in main and restricted; “esm-apps” are the security updates provided for universe and multiverse packages. Non-GNOME desktop environments are in universe. Ubuntu Pro extends this support from 5 to 10 years for “esm-infra” and from “best effort by the community” to 10 years for “esm-apps”! This means even LXQt should, in theory, receive security updates for 10 years! But only for Lubuntu 26.04 LTS, once you upgrade to it and activate Ubuntu Pro, for which you need an account, just like you do with Microsoft 🙂

Of course, Liam Proven, despite being an IT veteran, never learns and doesn’t understand how Ubuntu Pro works. To my surprise, the poor communication on Canonical’s side, combined with the mass functional illiteracy, led to confusion even among Ubuntu aficionados! It’s not reassuring to see them using “perhaps,” “it should,” and “I believe”! An ecosystem of incompetents, just like with the Linux Mint gang!

But I didn’t say that you should use Linux instead of Windows; I said you could use Lubuntu 25.10 (then 26.04 LTS) on older hardware, despite Win11-capable laptops starting at about €400 (VAT-included). In the case of Lenovo, they might have soldered RAM (Apple-like) and a single NVMe slot. In the case of Acer, they would have 2 RAM slots and 2 NVMe slots, but you might end up with a problematic MediaTek Wi-Fi/BT chip.

Still, in my experience, Ubuntu LTS receives security updates with the highest priority.

2. An interlude

In a Reddit thread started by someone looking for a stable, modern-looking Linux distro, among the various recommendations (Debian, Fedora KDE or GNOME, Mint, Kubuntu, Ubuntu LTS Pro, Aurora, Ultramarine, CachyOS, elementary OS, MX Linux, openSUSE Leap, Pop!_OS), there was this interesting opinion:

Why I wouldn’t recommend others [than Pop!_OS]:

  1. Not having .deb support is a 99% dealbreaker in my opinion. Ubuntu is still dominant and most private software adapted to Linux is gonna be packaged as a .deb. A fully compatible workstation requires Debian-based. This means no Arch-based and no Fedora-based.
  2. Many Debian-based distros go all-in on “anti-bloat” and “FOSS-only” and while that’s not really your aim here, you want an “it just works” distro. This means no Debian, no elementary OS, and so on.
  3. Ubuntu is the devil. Do not use Ubuntu and if possible stay away from snaps.
  4. I’ve heard MX Linux works, haven’t tried it. Might interest you.
  5. Linux Mint Debian Edition is good. I think it’d work for you, but it’s a bit more aimed at casual users than devs. It’s kinda messy inside if you look hard into it, but it works fine.

While Pop!_OS is a shitty choice because of the COSMIC desktop environment that’s clearly not for everyone (and it’s still in the alpha stage), there are points of agreement with this guy:

  1. There is so much software, and not just proprietary ones, that, in the eventuality they offer a Linux edition, they only offer a .deb or, in some cases, also a .rpm. It can happen for them to offer a “universal” installer (usually a huge script that embeds the binary) in case it’s an Electron app or some really self-contained binary. AppImages are far from being the best choice, and Flatpaks are rare in the world of commercial software. In my experience, .deb is the most likely format to be offered. Often, only builds for LTS versions of Ubuntu are offered, which restricts the choice even more. But indeed, choosing a Debian-based distro is the safest choice. A flavor of Ubuntu LTS is even better.
  2. No elementary OS, no Devuan, no Zorin, and so on. Keep it mainstream.
  3. Snaps or no snaps, Ubuntu is not the devil. Snaps can be completely removed from most, if not all flavors (Ubuntu MATE 21.04 had the theming from snaps, but this is no longer the case).
  4. MX Linux is “a better Debian” and a sound choice, despite its debatable default theming (with different layouts in XFCE and KDE).
  5. All editions of Mint are depressingly ugly, IMO, and, with all their pluses, are quite messy indeed under the hood. Mint adds bugs to Ubuntu or Debian (LMDE) by breaking some packages that cannot be installed or don’t work anymore as intended (at least mate-tweak and xfce4-panel-profiles, but there are more of them). LMDE is probably more “pristine” than the Ubuntu-based editions, but it is Cinnamon-only.

Either way, I suppose Debian-based distros still have some leverage over, say, Fedora. However, for bleeding-edge packages of open-source software, I’d say that Arch-based EndeavourOS (with AUR) or maybe Manjaro, openSUSE Tumbleweed, and even Fedora are much more suited.

Most “normal” people don’t need bleeding-edge packages, except for up-to-date web browsers. They also don’t need “modern” desktop environments based on retarded GNOME or hipsterish tiling window managers! Something that preserves the desktop metaphor introduced by Win95 should be just fine.

Oh, Ubuntu Pro doesn’t apply to Linux Mint, which is not a “genuine” Ubuntu OS.

3. What I suggest you to configure in a freshly installed Lubuntu 25.10

❶ Select a faster server

LXQt Configuration Center (or Preferences), Software Sources, Download from:, Other…, Select Best Server. Confirm your choice.

Alternatively, just select a server from your country.

❷ A minor Openbox improvement

I had issues with double-clicking on titlebars to maximize them, and I thought that I should go to Preferences, Openbox Settings, Mouse, Double click on the titlebar, and set the unconfigured action (Customs actions) to Maximizes the window.

The real culprit was the too restricted interval, set to 200 ms. I prefer to set it to 500-600 ms.

It makes sense once you notice that a “normal” double-click is set to 400 ms! Why should a double-click on a titlebar be more frantic than that?

❸ Desktop improvements

Right-click on the desktop, Desktop Preferences, check Make all items stick to their positions. Otherwise, they’ll start moving around each time a new icon is added to the desktop because they’d start sorting themselves alphabetically.

If you want to put the Trash icon in the bottom right of the screen, but it refuses to stay close enough to the right side, adjust in the same Desktop Preferences dialog box the spacing: set Margins of work area to 4px on all four sides. You could also decrease the Minimum item margins.

❹ More Openbox improvements

In Lubuntu, active windows have a blue frame. Would you like to have it disabled? Should the answer be positive, read on and act accordingly.

Preferences, Openbox Settings, Theme. Suppose you stick to Lubuntu Arc.

mkdir -p ~/.local/share/themes
cp -r /usr/share/themes/Lubuntu\ Arc/ ~/.local/share/themes/
featherpad ~/.local/share/themes/Lubuntu\ Arc/openbox-3/themerc

Change

window.active.border.color: #5294e2

to

window.active.border.color: #00000000

Save the file, then run:

openbox --reconfigure

Or log out and back in. Either way, the local theme will be loaded instead of the homonymous global one.

❺ Replace qps with the much better mate-system-monitor

sudo apt update
sudo apt install mate-system-monitor
sudo featherpad /usr/share/applications/mate-system-monitor.desktop

Delete the line that contains OnlyShowIn, and save the file.

sudo update-desktop-database /usr/share/applications

MATE System Monitor will show up in System Tools. But you need an easy way to invoke it.

LXQt Settings, Shortcut Keys, Add. Click on Shortcut, then press the combination Ctrl+Shift+Esc.

Set Type: to Command. Under Command:, enter:

mate-system-monitor

Hit OK. Hit Close.

❻ Install the non-snap versions of Firefox and Thunderbird

sudo apt remove firefox thunderbird
sudo snap remove firefox thunderbird
sudo add-apt-repository ppa:mozillateam/ppa
sudo featherpad /etc/apt/preferences.d/mozilla

Add inside:

Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 1000

Now block the fake packages that install snaps from being considered by apt or Synaptic:

sudo featherpad /etc/apt/preferences.d/block-snaps

Add inside:

Package: firefox*
Pin: release o=Ubuntu
Pin-Priority: -1

Package: thunderbird*
Pin: release o=Ubuntu
Pin-Priority: -1

Now, knowing that add-apt-repository automatically performs an apt update, the last step:

sudo apt install firefox thunderbird

❼ Get rid of the remaining snaps

What do we lose if we remove the snap support completely? Just like in Kubuntu, practically nothing! If you selected a full install, you’ll have Krita installed as a snap, but it also exists as a true package!

What we really lose is firmware-updater, a GUI app (from GNOME) that is not necessary! What you need is fwupdmgr, part of the fwupd package. At the CLI:

fwupdmgr get-updates

But Lubuntu can apply firmware updates via the already installed combination Discover + plasma-discover-backend-fwupd + fwupd! So just use Discover:

So we can get rid of the devil:

sudo apt autoremove --purge snapd
sudo apt-mark hold snapd
rm -rf ~/snap

❽ Increase the contrast in GTK apps, including Firefox

In LXQt Settings, Appearance, GTK Style, set GTK 2 Theme and GTK 3 Theme to Adwaita or Adwaita-dark instead of the inconsistent defaults, which are Arc-Darker for GTK 2 and Breeze for GTK 3.

❾ Install the restricted codecs

sudo apt install ubuntu-restricted-extras gstreamer1.0-plugins-bad gstreamer1.0-libav libavcodec-extra

If libavcodec61 is already installed, it will be removed and replaced by libavcodec-extra61.

ubuntu-restricted-extras will also retrieve ttf-mscorefonts-installer.

❶⓿ Clipboard shortcuts and QTerminal

There is the X11/Linux way of using the clipboard, and there is “the other way” of doing things.

Inheriting from UNIX, there is a “clipboard dualism”:

  • The PRIMARY selection (“paste the selection”): This is the “select to copy, middle-mouse-click to paste” mechanism. Just highlighting text automatically copies it to the PRIMARY selection, and you paste it with a middle-mouse-click or via Shift+Ins. No explicit copy action is needed!
  • The CLIPBOARD (“paste from clipboard”): This is the traditional Ctrl+C/Ctrl+V clipboard known to Windows users.

Frankly, more than 30 years into UNIX-like OSes, I still find this schizophrenia dumb. My muscle memory has formed around Ctrl+Ins (copy) and Shift+Ins (paste) from the age of Windows 3.1 and even earlier, as these keyboard shortcuts are inherited from IBM’s Common User Access (CUA) standard from the late 1980s. (Motif and CDE used CUA bindings and the CUA-style clipboard, whereas Open Look/XView/OLWM went the way of mouse-based selection and paste from the so-called PRIMARY selection. Fuck them.) Then, Windows 95 standardized Ctrl+C and Ctrl+V, although they were already available in software such as Microsoft Word 2.0 for Windows 3.1 (for 3.0, actually).

Nowadays, Ctrl+Ins and Shift+Ins are impractical on TKL keyboards that lack the Ins key (Fn+Del), but I have a long-standing asymmetrical habit when the keyboard allows for it:

  • Ctrl+C to copy (with the left hand).
  • Shift+Ins to paste (with the right hand); only when Ins is missing (and requires Fn+Del), Ctrl+V to paste.

And QTerminal (alongside other terminal apps) occasionally breaks it. It doesn’t do anything on Ctrl+V, and it might paste from the wrong clipboard on Shift+Ins.

Say I copied a text from a web page using Ctrl+C. In QTerminal, I cannot use Ctrl+V to paste it (Ctrl+C and Ctrl+V are not used to avoid conflicting with whatever CLI app is launched, especially as Ctrl+C would interrupt or kill a process), and Shift+Ins might not always do what I want. The last time I used the pattern “let’s select with the mouse and paste with the mouse (middle button)” was around 1996, I guess. Occasionally, I remember I could use the middle mouse button, but that’s the scrolling button to me. I just hate so much this concept! QTerminal defaults to:

  • Ctrl+Shift+C (copy the selection to clipboard)
  • Ctrl+Shift+V (paste from clipboard)
  • Shift+Ins (paste the selection)

So I select something, then copy with Ctrl+C, then I might accidentally select something else without pressing any other key, and on Shift+Ins… it’s “shit insert”! Because the UNIX idea of automatically keeping the selection ready to paste is something I never asked for, and, really, who the fuck does anything else than scrolling with the middle mouse button that’s actually a wheel?! This is the worst thing inherited from UNIX! I bet macOS users hate it even more than I do, because they don’t even have a middle button.

I prefer to map my CUA shortcuts and to ignore “the non-clipboard clipboard.” (Pasting with the mouse will still work!)

In QTerminal’s Session, Preferences, Shortcuts, you can add, e.g., Ctrl+Ins and Shift-Ins. But how to add them instead of replacing the existing shortcuts? I can see some “|” that separate 2 shortcuts for the same command, but I can’t do the same. Unfortunately, for multiple shortcuts, you need to edit the config file:

featherpad ~/.config/qterminal.org/qterminal.ini

Navigate to [Shortcuts], then to

Copy%20Selection=Ctrl+Shift+C

Change it to

Copy%20Selection=Ctrl+Shift+C|Ctrl+Ins

Now, go to

Paste%20Clipboard=Ctrl+Shift+V
Paste%20Selection=Shift+Ins

Change them to

Paste%20Clipboard=Ctrl+Shift+V|Shift+Ins
Paste%20Selection=

This effectively disables “Paste Selection,” even if in most cases it’s the same as the contents in the “true clipboard,” but one cannot assign the same shortcut to two different actions.

OK, now close QTerminal and open it again.

⓫ Improve the shell’s aesthetics and ergonomics

featherpad ~/.bashrc

Paste this at the very end:

# Colored ls
alias ls='LC_COLLATE=C ls -h --group-directories-first --color=auto'

# Colored manpages
export LESS_TERMCAP_mb=$'\e[1;32m'
export LESS_TERMCAP_md=$'\e[1;32m'
export LESS_TERMCAP_me=$'\e[0m'
export LESS_TERMCAP_se=$'\e[0m'
export LESS_TERMCAP_so=$'\e[01;33m'
export LESS_TERMCAP_ue=$'\e[0m'
export LESS_TERMCAP_us=$'\e[1;4;31m'
export GROFF_NO_SGR=1

# Custom prompt
export PS1="\[\e[1;31m\][\u@\h \[\e[1;32m\]\W\[\e[1;31m\]]\$ \[\e[m\]"

# Because it's the best software ever written
fortune

For the last one:

sudo apt install fortunes

Let’s make you smarter:

Color codes explained:

  • \[\e[1;31m\]Bold red (the brackets and username@hostname)
  • \[\e[1;32m\]Bold green (the working directory \W)
  • \[\e[1;31m\] – Back to bold red (closing bracket and $)
  • \[\e[m\]Reset to default color

Standard ANSI color codes:

30 – Black
31 – Red
32 – Green
33 – Yellow
34 – Blue
35 – Magenta
36 – Cyan
37 – White

The 1; prefix makes them bold/bright.

For a more orange (albeit non-ANSI) color:
export PS1="[\e[1;38;5;214m][\u@\h [\e[1;32m]\W[\e[1;38;5;214m]]\$ [\e[m]"

256-color orange (or amber) shades: 208 (darker) or 214 (lighter). I prefer 214.

38;5 enables 256-color mode in terminal escape sequences:

\e[1;38;5;214m
│ │ │ └── Color number (214 = orange)
│ │ └───── 5: Use 256-color mode
│ └─────── 38: Set foreground color
└────────── 1: Bold/bright attribute

Make sure you don’t screw something up: bash needs to know which characters are visible (count toward line length) vs. invisible (color codes). With mismatched brackets (been there, done that!):

  • bash miscalculates prompt width.
  • Text overwrites itself when using long commands.
  • Cursor positioning gets messed up.

And there are three different types of brackets:

  • \[ and \] = Bash wrappers (must be paired).
  • \e[ and m = ANSI escape codes (the [ here is part of \e[, and m closes it).
  • [ and ] = Literal brackets you want to display in your prompt.

For the ANSI escape codes, blame the 1970s and LSD.

⓬ Filesystem tuning

We need to change relatime (which is by default) into noatime. Who needs nowadays to know when a file has been accessed in reading? A file should only be stamped with the time of the last modification! Most file managers just ignore the time of the last read.

You should adapt the following to your actual partitions, but here’s my case:

$ mount|grep ext4
/dev/nvme1n1p3 on / type ext4 (rw,relatime)
/dev/nvme0n1p1 on /home type ext4 (rw,relatime)
$ cat /etc/fstab|grep ext4
UUID=9321e439-5fa9-49e4-965f-f4626a96a884 /home          ext4    defaults   0 2
UUID=9671d1d2-b5e1-43f1-a304-050250ed0fb6 /              ext4    defaults   0 1

Run

sudo featherpad /etc/fstab

and add noatime after a comma after defaults to the ext4 partitions. Save the file and check the result:

$ cat /etc/fstab|grep ext4
UUID=9321e439-5fa9-49e4-965f-f4626a96a884 /home          ext4    defaults,noatime   0 2
UUID=9671d1d2-b5e1-43f1-a304-050250ed0fb6 /              ext4    defaults,noatime   0 1

Now, run something like this (in my case, /home is a separate partition), or just reboot:

sudo mount -o remount /
sudo mount -o remount /home
sudo systemctl daemon-reload

Check again:

$ mount|grep ext4
/dev/nvme1n1p3 on / type ext4 (rw,noatime)
/dev/nvme0n1p1 on /home type ext4 (rw,noatime)

⓭ Adjust the kernel

Setting vm.swappiness to 10 or 20 will make the kernel prefer keeping data as much as possible in RAM, only swapping when absolutely necessary. The traditional /etc/sysctl.conf  is legacy, so we do this:

sudo featherpad /etc/sysctl.d/10-vm.conf

Add inside:

vm.swappiness=10

Obviously, “the sysadmin way” would have been a one-liner:

echo "vm.swappiness = 10" | sudo tee /etc/sysctl.d/10-vm.conf

To avoid rebooting, reapply all system settings, and check to see if “10” is printed:

sudo sysctl --system
cat /proc/sys/vm/swappiness

⓮ Magic SysRq

A last tweak concerns the Magic SysRq shortcuts, of which REISUB is the most famous combination:

  • R – Switch to XLATE (ASCII) mode
  • E – Send SIGTERM to all processes except for init
  • I – Send SIGKILL to all processes except for init
  • S – Sync all mounted filesystems
  • U – Remount file-systems as read-only
  • B – Reboot

What we actually need is SUB, to be used in an absolute emergency when the system is frozen and needs to be rebooted while still trying not to screw up the filesystems:

  • Alt+SysRq+S – in practice Alt+PrtSc+S (or Alt+Fn+PrtSc+S on older ThinkPads)
  • Alt+SysRq+U – in practice Alt+PrtSc+U (or Alt+Fn+PrtSc+U on older ThinkPads)
  • Alt+SysRq+B – in practice Alt+PrtSc+B (or Alt+Fn+PrtSc+B on older ThinkPads)

In some newer ThinkPads, SysRq is not exposed at all (the firmware simply doesn’t generate the SysRq scancode). In some older ones, SyRq is Fn+S, hence Alt+SysRq+S is impossible: Alt+Fn+S+S. Tell me again how great ThinkPads are!

Fortunately, there isn’t anything you need to do in Lubuntu 25.10:

$ cat /usr/lib/sysctl.d/55-magic-sysrq.conf 
# The magic SysRq key enables certain keyboard combinations to be
# interpreted by the kernel to help with debugging. The kernel will respond
# to these keys regardless of the current running applications.
#
# In general, the magic SysRq key is not needed for the average Ubuntu
# system, and having it enabled by default can lead to security issues on
# the console such as being able to dump memory or to kill arbitrary
# processes including the running screen lock.
#
# Here is the list of possible values:
#   0 - disable sysrq completely
#   1 - enable all functions of sysrq
#  >1 - enable certain functions by adding up the following values:
#          2 - enable control of console logging level
#          4 - enable control of keyboard (SAK, unraw)
#          8 - enable debugging dumps of processes etc.
#         16 - enable sync command
#         32 - enable remount read-only
#         64 - enable signalling of processes (term, kill, oom-kill)
#        128 - allow reboot/poweroff
#        256 - allow nicing of all RT tasks
#
#   For example, to enable both control of console logging level and
#   debugging dumps of processes: kernel.sysrq = 10
#
kernel.sysrq = 176

As it happens, S + U + B = 16 + 32 + 128 = 176. Case closed.

⓯ FSearch – voidtools’s Everything equivalent for Linux

I’m a big fan of Everything, so I need FSearch. This is what I needed to to in Ubuntu 24.04:

sudo add-apt-repository ppa:christian-boxdoerfer/fsearch-stable
sudo apt install fsearch

Now, guess what? Since 25.04, fsearch is included in universe, so only the 2nd line is needed!

What’s kind of worrisome is that the last release on GitHub took place on Aug. 5, 2023. This app is frozen. Oh, well, at least it works. It’s not perfect, but it’s OK.

⓰ Bulky from Linux Mint

From the many Mint tools and XApps used in Linux Mint, I rarely used Warpinator, and Hypnotix is junk. But Bulky is a great bulk file renamer, and it’s regex-aware!

Here, too, I’ll tell you what I used to do in 24.04:

sudo add-apt-repository ppa:kelebek333/mint-tools
sudo apt install bulky

Unfortunately, the mint-tools PPA is literally abandoned: the last update took place 58 weeks ago, and the last Ubuntu release that’s supported is 24.04. Apparently, Mint’s goodies are only for Linux Mint and LMDE these days.

Nonetheless, Bulky can be installed on Ubuntu 25.10, regardless of the flavor! Go on GitHub on its release for LMDE 7, and grab packages.tar.gz. Inside, you’ll find bulky_3.9_all.deb. Install it (you can use Discover to keep it “the GUI way”), and you’re done!

Amazing.

⓱ Flatpaks, the other evil

Instead of Canonical’s maleficence, Red Hat’s mischief, eh? Well, sometimes an app isn’t available as a package. And exploring apps more like you do it under Android and iOS, only with a less strict containerization, can be quite practical.

Note that right after all Ubuntu flavors were launched, it was reported that Flatpak installations are completely broken on Ubuntu’s latest interim release.

If you look at the corresponding Bug #2122161, you’ll notice that it was fixed on Oct. 10 by updating apparmor to version 5.0.0~alpha1-0ubuntu8.1. On Oct. 14, the bug for flatpak had the status Confirmed → Invalid, because the status for apparmor went Fix Committed → Fix Released.

Let’s enable Flatpak:

sudo apt install flatpak
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

At this point, it’s useful for you to know the general CLI commands:

flatpak search app-name
flatpak install app-id
flatpak list
flatpak update
flatpak run app-id
flatpak uninstall app-id
flatpak info app-id

Generally, you should prefer to explore Flathub to search for and to discover new apps. A few must-haves:

  • Flatseal, a graphical utility to review and modify permissions from your Flatpak applications.
  • Warehouse, a graphical utility to manage other aspects of them or to uninstall them.
  • Gapless, a music player.

How do you install such apps? If you expand the “Install” button on each app’s page, you’ll find “Manual Install” commands.

flatpak install flathub com.github.tchx84.Flatseal
flatpak install flathub io.github.flattool.Warehouse
flatpak install flathub com.github.neithern.g4music

Launchers for Flatpak apps should show up in your desktop environment’s menu, but this doesn’t happen by default in any flavor of Ubuntu.

And no, this doesn’t help:

sudo update-desktop-database /usr/share/applications

The corresponding .desktop files are created by Flatpaks in one of these two folders:

~/.local/share/applications/
/var/lib/flatpak/exports/share/applications/

The global one seems to be preferred by most developers.

But it’s highly unpractical to run this after having installed a new Flatpak:

update-desktop-database ~/.local/share/applications
sudo update-desktop-database /var/lib/flatpak/exports/share/applications

As a matter of fact, in all Ubuntu flavors, running any flatpak command at the CLI includes such a warning in the output:

Note that the directories 

'/var/lib/flatpak/exports/share'
'/home/ludditus/.local/share/flatpak/exports/share'

are not in the search path set by the XDG_DATA_DIRS environment variable, so
applications installed by Flatpak may not appear on your desktop until the
session is restarted.

This can be fixed by running:

echo 'export XDG_DATA_DIRS="/var/lib/flatpak/exports/share:/home/$USER/.local/share/flatpak/exports/share:$XDG_DATA_DIRS"' >> ~/.bashrc

Now you really have to log out and log back in.

Not only will that warning never be displayed again, but the Flatpak apps you just installed, as well as those you’ll install from now on, will show up in the menus!

⓲ A note on mixing apps

Some people have a strong preference for KDE or at least Qt apps if they use KDE, or for GNOME or GTK apps if they use GNOME. Users of Cinnamon, MATE, and XFCE typically add GTK apps to those provided by their desktop environment. XFCE, being eternally half-baked, is usually “enhanced” with, say, Atril from MATE, Cheese from GNOME, and so on. Its image viewer, Ristretto, being at version 0.13.3, literally screams to be replaced by gThumb (which I love!), eom (Eye of MATE), or eog (Eye of GNOME). BTW, eog has been replaced by Loupe and Cheese by Snapshot because GNOME’s “modernization” efforts are a mess.

The important thing to know is that, despite their association with a major desktop environment or with a different UI toolkit, some such apps don’t pull heavy dependencies. A few examples on an installed Lubuntu 25.10:

  • gThumb: “Space needed: 31.0 MB” (despite being a GTK app)
  • Haruna: “Space needed: 34.4 MB” (despite being associated with KDE)

Believe it or not, I prefer Haruna to VLC.

⓳ Extra fonts

I have a maniacal fixation on fonts. It can be seen in the long list of fonts I suggested back in the day for AlmaLinux 9.4 KDE. Most people would simply use the preinstalled fonts, possibly with additions from the official repositories.

If I were to only make two suggestions of extra fonts, here’s what they would be:

  • For a sans serif, I believe Inter makes a great font. (You can try it on Google Fonts.) Go to their GitHub, grab the ZIP from Assets, extract it, and then install the TTFs from “extras/ttf”. There are several variants to play with; I tend to prefer Inter Display Medium or Inter Medium.
  • For a monospaced font, Iosevka Fixed (or, with ligatures, Iosekva Term).

By installing, I mean copying them locally in ~/.local/share/fonts/ or globally in /usr/local/share/fonts/. Then don’t forget to register them:

sudo fc-cache -fv

To view or manage fonts, install either font-manager or font-viewer (each has the other one as a dependency).

You should be aware that fonts can be customized in Lubuntu in several places:

  • The default global font: in LXQt Settings, Appearance, Font.
  • The elements managed by the window manager (window titles, menus): in Preferences, Openbox Settings, Font.
  • In certain apps (QTerminal, FeatherPad, etc.).

⓴ Touchpad and NumLock issues

Laptop users who really use the touchpad (I always use the mouse these days) usually complain when it’s not properly configured out of the box.

Go to LXQt Settings, Keyboard and Mouse, scroll down to Mouse and Touchpad, and then select from the Device: drop-down list the real touchpad (such a device usually has two entries: one ending in “Mouse” and one ending in “Touchpad”).

Enable “Tap to click” and, should you have the same old muscle memory like I do, select Scrolling: at the Edge instead of the more modern Two-Finger crap.

An even more popular complaint is NumLock defaulting to off:

There is a very good reason for this deliberate choice. Some laptops that lack a numerical pad nonetheless have a NumLock button (Fn+F11 in the picture below) that, once activated, transforms the keys UIOJKLM into 4561230, respectively. When NumLock is off, only Fn makes those letter keys behave as numerical ones. This is why activating NumLock by default can be a very bad choice on some laptops.

On the other hand, many more laptops do have a numerical pad, but they lack the keys Home, End, PgUp, PgDn. Some people prefer to use the numpad for navigation, especially as it also has larger ArrowUp and ArrowDn than the ridiculously packed normal ones.

4. Wayland: thinking about the future

Wayland isn’t something we should worry about too soon, but it would eventually become mandatory.

Currently, LXQt can use KWin or Openbox. In Lubuntu, it uses Openbox by default. If it were to support Wayland, that could only happen via KWin (from KDE), which is slightly heavier. When they fully support Wayland, they’ll probably call that release 3.0. 🙂

Here’s what Copilot had to comment on the above statement. And something from the LXQt team, on Sept. 22, 1025: The Two Ways of Wayland.

However, even if LXQt 2.3 releases in November 2025, the chances for it to land in Ubuntu 26.04 LTS (April 2026) are rather slim. Unless Debian and Ubuntu both move unusually fast, LXQt 2.3 in Ubuntu 26.04 LTS is unlikely. A Wayland‑ready LXQt would probably target Ubuntu 28.04 LTS.

I just hate the AI-generated wallpapers!

5. Hibernation, maybe?

Hilariously enough, while a new Linux kernel patch aims to let you cancel hibernation mid-process, the kernel team and the maintainers of most distros actively try to discourage you from using hibernation. I know since 2006-2008 how fragile Linux drivers can be and how resuming from suspend-to-disk can leave important peripherals in limbo: network, Bluetooth, even video. I know since 2006-2008 how fragile Linux drivers can be and how resuming from suspend-to-disk can leave important peripherals in limbo: network, Bluetooth, even video. With poorly written drivers, device firmware often doesn’t cooperate, and sometimes a long wait after a shutdown is required to “clear” the status. Many Linux drivers aren’t even able to fully control a device: I remember from my dual-boot years how hibernating from Windows and resuming from Linux led to dead network, and the only fix was to boot into Windows again. Linux just couldn’t bring that device back to life! That’s beyond pathetic.

Meanwhile, hibernation always works in Windows, except that Microsoft wants to fake it: fake hibernation (hybrid sleep), fake shutdown (partial hibernation with fast startup), fake reboot (warm, not cold).

This being said, there are so-called “legitimate” reasons to avoid hibernation. Even if you don’t work for the CIA or MOSSAD, if the swap isn’t encrypted, oh, my, hibernation would be a vulnerability. But Secure Boot and encrypted partitions could also prevent Linux from properly resuming. So they decided to tell you that “you don’t need it because you have sleep (suspend-to-RAM).”

Except that power can be lost in a PC, and a laptop’s battery can’t power the RAM and the SSD indefinitely. Hibernation was at some point perceived by some as the second-best invention since sliced bread, especially as HDDs were slow. Now it’s forbidden territory.

What’s also true is that modern desktop environments can save the session and reopen those programs on logon. Unfortunately, not all software would reopen the same files or projects, scroll the document to where it was, select the same tools as before, and so on. This is not Android or iOS, and most apps weren’t designed to serialize and restore the entire state.

For all I know, MX Linux does not have hibernation enabled by default, and their wiki is outdated, but it’s the only distro that has a tool specially designed to help you enable it once you have a large enough swap! (Is this the reason they’re so popular on DistroWatch?! CachyOS and Mint are more popular these days, but MX Linux consistently ranks 3rd.)

From memory and notes, there were unofficial guides to help people enable hibernation in distros such as Mint 19.x, Mint 20.x, Ubuntu 20.04 LTS, Ubuntu 21.10, and so on.

But Ubuntu actively even disables the “Hibernate” button in desktop environments! H8ers.

At the other end, Fedora doesn’t care at all, so it enables all the buttons in XFCE’s logout screen, but the hibernation and the hybrid sleep don’t work even if the buttons are shown. I was able to make hibernation work in Fedora 34 and 35 (I never used ZRAM, another stupid fad) on a 1-liter HP ProDesk 400 G6 mini-PC (USFF). On the same system, I also successfully enabled hibernation in Manjaro XFCE.

On the newer laptop, with MT7663-based Wi-Fi and BT, I had hibernation technically working in 2023 under openSUSE Leap 15.5 (kernel 5.14.21 only supported Wi-Fi, but not BT), then under openSUSE Tumbleweed, and eventually in AlmaLinux 9.3 KDE (but using a 6.1 kernel from ELRepo). Unfortunately, no kernel can resume from hibernation without breaking both Wi-Fi and BT in MT7663 (or only Wi-Fi if BT wasn’t supported). Well, typical Linux driver quality. So I called it quits and forgot about hibernation.

I will not bother you with the steps I used to attempt to make hibernation work in Lubuntu 25.10 on my laptop. I did everything I could, everything that made sense, and adapted to the newest changes I could identify. For instance, I didn’t miss the two sections from /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla. But the Hibernate button was still disabled, and resuming from a hibernation triggered by sudo systemctl hibernate failed without any given reason, just like it did under Ubuntu MATE 24.04 LTS:

[ludditus@grumpy Desktop]$ sudo dmesg | grep -i resume
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.17.0-5-generic root=UUID=9671d1d2-b5e1-43f1-a304-050250ed0fb6 ro quiet splash resume=UUID=17d1248a-f93b-48c9-ae97-ca2c2aff33f5 vt.handoff=7
[    0.025601] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.17.0-5-generic root=UUID=9671d1d2-b5e1-43f1-a304-050250ed0fb6 ro quiet splash resume=UUID=17d1248a-f93b-48c9-ae97-ca2c2aff33f5 vt.handoff=7
[    1.303702] systemd-hibernate-resume-generator[137]: Reported hibernation image: ID=ubuntu VERSION_ID=25.10 kernel=6.17.0-5-generic UUID=17d1248a-f93b-48c9-ae97-ca2c2aff33f5 offset=0
[    2.397227] PM: hibernation: resume from hibernation
[    2.561410] PM: hibernation: resume failed (-1)

Hibernation worked (if we ignore the quality of some drivers) in the past under other distros on the same machine and with the exact same disk layout (I reuse /home and reformat /boot/efi, swap, and /).

The Linux kernel is garbage.

6. SCRIPTS: Win95-style on-demand tiling!

As I wrote here, while I just cannot understand the utility of automatic tiling window managers, I’m a big fan of the old-school on-demand tiling, as experienced in Win3.1 and improved in Win95.

Grumpy Ludditus has a semantic objection. Here’s the “official” tiling terminology:

They call “vertical tiling” the arrangement like books in a shelf and “horizontal tiling” the arrangement like piled pancakes. But I always used the reverse terminology and considered that horizontal tiling is when items range from left to right, like so:

My “horizontal tiling” or “lay vertically”

To make sense semantically, they should have called their arrangements “lay vertically” (like laundry on a clothesline) and “lay horizontally” (like pancakes)! But I guess it’s too late to start using “pancake layout” and “clothesline layout,” so I’ll stick to what we have, just with swapped definitions.

If you disagree with my definitions, you’re free to swap the key bindings for the script I’ll present later below, but you’re also free to go fuck yourself.

Now, let me go back in time to Win3.1 and show you how it tiled 2-3 windows (“horizontally” in my view, “vertically” in theirs):

For exactly 4 windows, the tiling was both horizontal and vertical, so to speak:

Win95 added the choice of horizontal or vertical tiling, plus cascading windows:

Later developments are of lesser interest to me.

So, say I want to implement this behavior in Openbox under Lubuntu.

Say we start with 3 non-minimized windows:

We should be able to “tile horizontally” or “vertically”:

Then we should be able to restore the original layout, also on demand.

Should we have exactly 4 windows, the tiling should be symmetrical (2×2, not 1×4 or 4×1):

To get this behavior in Lubuntu 25.10, follow these steps.

① The second package is most likely already on your system:

sudo apt install wmctrl x11-utils

② Create ~/bin/tile-auto and paste inside:

#!/bin/bash
# tile-auto: EXACT Windows 95 "Tile Horizontally" and "Tile Vertically"
# Usage: tile-auto h  → Horizontal (default Win95 "Tile")
#        tile-auto v  → Vertical
# 4 windows → 2x2 grid in BOTH modes

mode="$1"  # h or v

w=$(xwininfo -root | grep 'Width:' | awk '{print $2}')
h=$(xwininfo -root | grep 'Height:' | awk '{print $2}')

current_desktop=$(wmctrl -d | grep '\*' | awk '{print $1}')

potential_ids=$(wmctrl -l -x | \
  grep " $current_desktop " | \
  grep -v "lxqt-panel.lxqt-panel" | \
  grep -v "pcmanfm-desktop0" | \
  grep -v "Desktop" | \
  awk '{print $1}')

ids=()
for id in $potential_ids; do
  if ! xprop -id $id _NET_WM_STATE | grep -q "_NET_WM_STATE_HIDDEN"; then
    ids+=("$id")
  fi
done

[ ${#ids[@]} -lt 2 ] && exit

count=${#ids[@]}
state_file="/tmp/openbox_tile_state"
> "$state_file"

# === 4 WINDOWS → 2x2 GRID (Win95 special case for BOTH H and V) ===
if [ "$count" -eq 4 ]; then
  half_w=$((w / 2))
  half_h=$((h / 2))
  positions=(
    "0,0,$half_w,$half_h"
    "$half_w,0,$half_w,$half_h"
    "0,$half_h,$half_w,$half_h"
    "$half_w,$half_h,$half_w,$half_h"
  )
  for i in "${!ids[@]}"; do
    id="${ids[i]}"
    geo=$(wmctrl -lG | grep "^$id " | awk '{print $3","$4","$5","$6}')
    has_vert=0; has_horz=0
    xprop -id "$id" _NET_WM_STATE | grep -q "_NET_WM_STATE_MAXIMIZED_VERT" && has_vert=1
    xprop -id "$id" _NET_WM_STATE | grep -q "_NET_WM_STATE_MAXIMIZED_HORZ" && has_horz=1
    echo "$id:$has_vert:$has_horz:$geo" >> "$state_file"
    wmctrl -ir "$id" -b remove,maximized_vert,maximized_horz
    wmctrl -ir "$id" -e 0,${positions[i]}
  done
  exit
fi

# === HORIZONTAL MODE (1 row) ===
if [ "$mode" = "h" ]; then
  width=$((w / count))
  for i in "${!ids[@]}"; do
    id="${ids[i]}"
    geo=$(wmctrl -lG | grep "^$id " | awk '{print $3","$4","$5","$6}')
    has_vert=0; has_horz=0
    xprop -id "$id" _NET_WM_STATE | grep -q "_NET_WM_STATE_MAXIMIZED_VERT" && has_vert=1
    xprop -id "$id" _NET_WM_STATE | grep -q "_NET_WM_STATE_MAXIMIZED_HORZ" && has_horz=1
    echo "$id:$has_vert:$has_horz:$geo" >> "$state_file"
    wmctrl -ir "$id" -b remove,maximized_vert,maximized_horz
    x=$((i * width))
    this_w=$width
    [ $i -eq $((count - 1)) ] && this_w=$((w - x))
    wmctrl -ir "$id" -e 0,$x,0,$this_w,$h
  done
  exit
fi

# === VERTICAL MODE (1 column) ===
if [ "$mode" = "v" ]; then
  height=$((h / count))
  for i in "${!ids[@]}"; do
    id="${ids[i]}"
    geo=$(wmctrl -lG | grep "^$id " | awk '{print $3","$4","$5","$6}')
    has_vert=0; has_horz=0
    xprop -id "$id" _NET_WM_STATE | grep -q "_NET_WM_STATE_MAXIMIZED_VERT" && has_vert=1
    xprop -id "$id" _NET_WM_STATE | grep -q "_NET_WM_STATE_MAXIMIZED_HORZ" && has_horz=1
    echo "$id:$has_vert:$has_horz:$geo" >> "$state_file"
    wmctrl -ir "$id" -b remove,maximized_vert,maximized_horz
    y=$((i * height))
    this_h=$height
    [ $i -eq $((count - 1)) ] && this_h=$((h - y))
    wmctrl -ir "$id" -e 0,0,$y,$w,$this_h
  done
  exit
fi

③ Create ~/bin/untile and paste inside:

#!/bin/bash
# untile: restore original positions, sizes, and maximized states

state_file="/tmp/openbox_tile_state"

if [ -f "$state_file" ]; then
  while IFS= read -r line; do
    [ -z "$line" ] && continue
    id=$(echo "$line" | cut -d':' -f1)
    has_vert=$(echo "$line" | cut -d':' -f2)
    has_horz=$(echo "$line" | cut -d':' -f3)
    geo=$(echo "$line" | cut -d':' -f4-)
    x=$(echo "$geo" | cut -d',' -f1)
    y=$(echo "$geo" | cut -d',' -f2)
    w=$(echo "$geo" | cut -d',' -f3)
    h=$(echo "$geo" | cut -d',' -f4)

    wmctrl -ir "$id" -b remove,maximized_vert,maximized_horz
    wmctrl -ir "$id" -e 0,$x,$y,$w,$h

    add=""
    if [ "$has_vert" = "1" ]; then
      add="maximized_vert"
    fi
    if [ "$has_horz" = "1" ]; then
      if [ -n "$add" ]; then
        add="$add,maximized_horz"
      else
        add="maximized_horz"
      fi
    fi
    if [ -n "$add" ]; then
      wmctrl -ir "$id" -b add,$add
    fi
  done < "$state_file"
  rm "$state_file"
else
  # Fallback: unmaximize all visible windows
  current_desktop=$(wmctrl -d | grep '\*' | awk '{print $1}')
  potential_ids=$(wmctrl -l -x | \
    grep " $current_desktop " | \
    grep -v "lxqt-panel.lxqt-panel" | \
    grep -v "pcmanfm-desktop0" | \
    grep -v "Desktop" | \
    awk '{print $1}')
  for id in $potential_ids; do
    if ! xprop -id $id _NET_WM_STATE | grep -q "_NET_WM_STATE_HIDDEN"; then
      wmctrl -ir "$id" -b remove,maximized_vert,maximized_horz
    fi
  done
fi

④ Make them executable:

chmod +x ~/bin/tile-auto ~/bin/untile

⑤ Add key bindings to Openbox in ~/.config/openbox/rc.xml. What you need to do is to insert the 3 blocks after <keyboard> and before </keyboard>, so don’t just blindly paste everything you see below!

<keyboard>

  <!-- Tile Horizontally (Ctrl + Alt + H) -->
  <keybind key="C-A-h">
    <action name="Execute">
      <command>/home/ludditus/bin/tile-auto h</command>
    </action>
  </keybind>

  <!-- Tile Vertically (Ctrl + Alt + J) -->
  <keybind key="C-A-j">
    <action name="Execute">
      <command>/home/ludditus/bin/tile-auto v</command>
    </action>
  </keybind>

  <!-- Untile / Restore (Ctrl + Alt + K) -->
  <keybind key="C-A-k">
    <action name="Execute">
      <command>/home/ludditus/bin/untile</command>
    </action>
  </keybind>

  <!-- (Keep all your other keybinds below) -->
</keyboard>

The chosen key bindings (keyboard shortcuts, hotkeys, accelerators, whatever you call them) aren’t very practical, but it’s not easy to find combinations that are not used for something else or that are just not reaching this code!

⑥ Reload Openbox:

openbox --reconfigure

⑦ You should now get this behavior:

  • Ctrl + Alt + H → Tiles windows side-by-side
  • Ctrl + Alt + J → Tiles windows top-to-bottom
  • Ctrl + Alt + K → Restores the windows to their previous positions

Aspects that needed to be taken into account:

  • Minimized windows are to be ignored.
  • lxqt-panel needs to be ignored.
  • The instance of pcmanfm-qt that manages the desktop should be ignored, but other instances are valid windows.
  • It needs to handle 2, 3, 4+ windows.
  • 4 windows should go into a 2×2 grid.
  • Any other number of windows should be tiled in 1 row (horizontally or vertically).

Known limitations:

  • It only works on the active desktop (workspace).
  • It only works on the first monitor (display).
  • If you trigger a second tiling operation before an untiling takes place, restoring the original layout is impossible. Also, restoring from a tiling to a previous tiling is not accurate.
Or should I have said, “with your old computer”?