Skip to content

Saturday, 15 March 2025

KDE Mascot
KDE Mascot

Thank you everyone for keeping the lights on for a bit longer. KDE snaps have been restored. I also released 24.12.3! In addition, I have moved “most” snaps to core24. The remaining snaps need newer qt6/kf6, which is a WIP. “The Bad luck girl” has been hit once again with another loss, so with that, I will be reducing my hours on snaps while I consider my options for my future. I am still around, just a bit less.

Thanks again everyone, if you can get me through one more ( lingering broken arm ) surgery I would be forever grateful! https://gofund.me/d5d59582

Dear digiKam fans and users,

After four months of active maintenance and many weeks triaging bugs, the digiKam team is proud to present version 8.6.0 of its open source digital photo manager.

The digiKam team has continued to work on a better Artificial Intelligence integration in digiKam, and many parts have been improved with the 8.6.0 release.

Friday, 14 March 2025

This is a recipe post. I loathe and despise recipe sites, but this is one I regularly need to look up. In Canadian measures, which is what I still do my baking in even after 30 years in Europe.

Mix well and let stand while collecting the rest:

  • 1½ cups rye bran
  • 1 c. milk
  • ½ tsp. salt

Ready:

  • ⅓ c. oil
  • 1 egg

Ready:

  • ⅔ c. brown sugar
  • 1 c. flour
  • 2 tsp. baking powder
  • ½ c. raisins

Mix the wets. Stir in the drys. Fill muffin pan. Bake 25 minutes at 180℃. Makes 11 muffins because my muffin pan has one broken cup. Uses rye bran because the local windmill has that “left over” as animal feed after milling rye – apparently very few people in the Netherlands use bran anyway, and rye bran even less so. Instead of flour and baking powder use zelfrijzend bakmeel.

Edit: reduce sugar to ½ cup and add 1 tbsp. of molasses to improve flavor and color and reduce sweetness.

Let’s go for my web review for the week 2025-11.


Kill your Feeds - Stop letting algorithms dictate how you think

Tags: tech, social-media, criticism

Simple steps to escape the algorithmic social media circus.

https://usher.dev/posts/2025-03-08-kill-your-feeds/


Music labels will regret coming for the Internet Archive, sound historian says

Tags: tech, culture, archive, history, law, copyright

Once again the music labels can’t understand the cultural value of building archives. Let’s hope they loose the lawsuit.

https://arstechnica.com/tech-policy/2025/03/music-labels-will-regret-coming-for-the-internet-archive-sound-historian-says/


What does “PhD-level” AI mean? OpenAI’s rumored $20,000 agent plan explained

Tags: tech, ai, machine-learning, gpt, marketing, business

Here we go for a brand new marketing stunt from OpenAI. You can also tell the pressure is rising since all of this is still operating at a massive loss.

https://arstechnica.com/ai/2025/03/what-does-phd-level-ai-mean-openais-rumored-20000-agent-plan-explained/


Microsoft is reportedly plotting a future without OpenAI

Tags: tech, ai, machine-learning, gpt, microsoft, business

Are we surprised? Not really… This kind of struggle was an obvious outcome from the heavy dependencies between both companies.

https://techstartups.com/2025/03/07/microsoft-is-plotting-a-future-without-openai/


Cognitive Behaviors that Enable Self-Improving Reasoners, or, Four Habits of Highly Effective STaRs

Tags: tech, ai, machine-learning, gpt, cognition, research

I like this kind of research as it also says something about our own cognition. The results comparing two models and improving them are fascinating.

https://arxiv.org/abs/2503.01307


Google’s Gemma 3 is an open source, single-GPU AI with a 128K context window

Tags: tech, ai, machine-learning, gpt

More smaller footprint models are becoming available. This is becoming interesting (even though the open source claim is overrated here).

https://arstechnica.com/gadgets/2025/03/googles-new-gemma-3-ai-model-is-optimized-to-run-on-a-single-gpu/


Why extracting data from PDFs is still a nightmare for data experts

Tags: tech, ai, machine-learning, gpt, ocr, computer-vision

So much data trapped in PDFs indeed… Unfortunately VLM are still not reliable enough to be unleashed without tight validation of the output.

https://arstechnica.com/ai/2025/03/why-extracting-data-from-pdfs-is-still-a-nightmare-for-data-experts/


A Quick Journey Into the Linux Kernel

Tags: tech, linux, kernel, programming

Nice exploration of the important areas in the kernel.

https://www.lucavall.in/blog/a-quick-journey-into-the-linux-kernel


Standards for ANSI escape codes

Tags: tech, unix, command-line, terminal, standard

A nice glimpse into the maze of the escape codes on the terminal.

https://jvns.ca/blog/2025/03/07/escape-code-standards/


Tech Notes: Rust trait object layout

Tags: tech, rust, type-systems, memory

OK more questions than answers I guess… That said, it shows interesting differences in design choices with C++ to support the traits system.

https://neugierig.org/software/blog/2025/03/trait-object-layout.html


When are Rust’s const fns executed?

Tags: tech, rust, compiler, optimization

A quick primer about compile time evaluations in Rust.

https://felixwrt.dev/posts/const-fn/


Why do I find Rust inadequate for codecs?

Tags: tech, rust, c, codec, performance, safety

Interesting reasons to let go of Rust, some spaces indeed can have a safety vs performance tradeoff which would justify using good old C.

https://palaiologos.rocks/posts/rust-codecs/


The Art of Formatting Code

Tags: tech, programming, tools, unicode

Ever wondered how to make a code formatter? This post does a good job showing the main problems you might encounter. The impact of Unicode is especially funny. Very interesting stuff.

https://mcyoung.xyz/2025/03/11/formatters/


Idiomatic Go

Tags: tech, programming, go

An evolving list of how to write idiomatic Go.

https://dmitri.shuralyov.com/idiomatic-go


Building Websites With Lots of Little HTML pages

Tags: tech, web, frontend, css

You can really do a lot with CSS transitions nowadays.

https://blog.jim-nielsen.com/2025/lots-of-little-html-pages/


Post-Processing Shaders as a Creative Medium - Maxime Heckel’s Blog

Tags: tech, gpu, shader, web

Nice set of tricks for post-processing effects all centering around pixelated patterns. Really neat.

https://blog.maximeheckel.com/posts/post-processing-as-a-creative-medium/


What Makes Code Hard To Read: Visual Patterns of Complexity

Tags: tech, programming, maintenance

The whole field is unfortunately a bit fuzzy. That said, this article gives interesting ideas about what to pay attention to when writing code to ease the readability.

https://seeinglogic.com/posts/visual-readability-patterns/


How Long Should Functions Be? - by Kent Beck

Tags: tech, engineering, craftsmanship, quality, tdd, programming

Nice post. Explains well why the answer is not a number to target. You want to impact the distribution.

https://tidyfirst.substack.com/p/how-long-should-functions-be


How to Write Useful Commit Messages

Tags: tech, version-control, codereview

Might be going a bit far if you use everything listed here. That said, it gives lots of good ideas so you might want to decide on what you should adopt on your project.

https://refactoringenglish.com/chapters/commit-messages/


CSS Relative Colors

Tags: tech, web, css, colors

Nice new tricks to specify colours in CSS.

https://ishadeed.com/article/css-relative-colors/


Stewardship over ownership

Tags: tech, engineering, maintenance, leadership

I like this. Sometimes a simple word can make all the difference in the way we behave. Code stewardship is indeed a better word.

https://ntietz.com/blog/stewardship-over-ownership/


The Staff+ Performance Cliff

Tags: tech, leadership, management, learning

It’s indeed not easy to go from individual contributions, to team level leadership, to organisation level leadership. Many things need to be learned or relearned at each step.

https://sylormiller.com/posts/2025/staff-plus-cliff/


There is No Automatic Reset for Engineering

Tags: tech, quality, project-management, product-management

Interesting thinking around a portfolio of activities. You can prioritise differently within it to manage quality vs speed of delivery over time.

https://agileotter.blogspot.com/2025/03/there-is-no-automatic-reset-in.html?m=1


Reducing Power Gradients - Psych Safety

Tags: organization, management, power, psychology

Interesting tips to reduce the power dynamics in organisations.

https://psychsafety.com/reducing-power-gradients/



Bye for now!

Thursday, 13 March 2025

One of the biggest behind-the-scenes changes in the upcoming Plasma 6.4 release is the split of kwin_x11 and kwin_wayland codebases. With this blog post, I would like to delve in what led us to making such a decision and what it means for the future of kwin_x11.

Background

KWin started as an X11 window manager almost two and a half decades ago. Over the course of the years, it transformed drastically. It gained support for compositing on X, and it became a Wayland compositor.

Sharing the same codebase was critical in the early days of kwin_wayland. We already had working window management abstractions, which had been tested for many years, so we could reuse them on Wayland instead of writing new from scratch. Also, if kwin_x11 gained a new feature, then kwin_wayland would likely gain it for free too.

As time went by, kwin_wayland outgrew kwin_x11. They still shared code but they became quite distinct projects with different mental models how things operate, e.g. how pixels get on the screen or how input works. It also didn’t help that many Plasma developers jumped the X11 ship and turned to the Wayland side as part of the “eating your own dog food” practice, which eventually led to the feature freeze in KWin/X11 back in 2018 due to the lack of sufficient testing and various breakages.

Some time around 2020, we started taking a more bold and aggressive approach to Wayland session development because we saw that Plasma Wayland was trailing behind other desktop environments and something had to be changed in order to catch up. Such a policy produced great results, and Plasma is now one of the leading Wayland desktop environments. Unfortunately, it also greatly contributed to the number of regressions in the X11 session.

Another issue was that there were some features that we couldn’t make work as expected on Wayland so we had to drop them for everyone, which understandably made X11 users unhappy.

Goals

A few years ago, we started contemplating the idea of splitting the X11 and Wayland codebases because of the growing list of regressions affecting the X11 session, and architecture restrictions imposed on KWin/Wayland by the way KWin/X11 works.

That would allows us to keep KWin/X11 working as is without it breaking too often and freely change KWin/Wayland in ways that we think are best suited to make the Plasma Wayland session even better. Of course, it is not a silver bullet solution: we replace one problem with another problem (mainly related to maintenance and ensuring interface compatibility between two projects).

Details

After various discussions online and at Akademy and also seeing (impressive) Plasma Wayland usage statistics, we decided that it’s the right time to do such a split. The main kwin repository is going to host KWin/Wayland, while the kwin-x11 repository is going to host KWin/X11.

KWin/X11 and KWin/Wayland are co-installable so users can freely switch between the X11 and Wayland sessions back and forth and also make sure that updating to 6.4 is not a big hassle for distributions. You’ll be able to have only KWin/X11 or only KWin/Wayland on your computer, or both.

The codebase split doesn’t affect Xwayland support in KWin/Wayland. In other words, X11 applications will continue running on Plasma Wayland.

Extensions

Like any other Plasma component, KWin’s functionality can be extended using plugins. There’s good and bad news. The good news is that extensions written in JavaScript and QML (for example, fancy effects that are available at the KDE Store) will continue working both with kwin_x11 and kwin_wayland as expected, so extension developers don’t need to do anything about it. The bad news is that C++ extensions should be specifically targeted for kwin_x11 and kwin_wayland because neither provides API and ABI compatibility guarantees for its C++ API.

As Wayland progress moves forward, it is likely that the scripting API of KWin/Wayland will be further extended.

Future of KWin/X11

KWin/X11 will be still maintained for the foreseeable future. But that maintenance work will boil down to fixing build errors, adapting to new KDE Frameworks and Plasma APIs, and backporting window-related fixes from KWin/Wayland. There are no plans to drop KWin/X11 in the Plasma 6 lifecycle, although it’s highly possible that it will happen in Plasma 7.

KWin/X11 won’t receive new features anymore; until recently, it received new features that had been developed against KWin/Wayland passively (because both lived in the same repository). However, it might be actually a good thing because the X11 session doesn’t receive that much testing nowadays.

Wednesday, 12 March 2025

Qt Contributor’s Summit 2025 is taking place in Munich in May. Unfortunately, I won’t be able to make it this year, so let’s talk about some of my recent contributions to our favorite cross-platform UI toolkit.

KWrite (Text editor) window displaying a snippet of C++ code. Context menu over its right scroll bar containing the standard Qt options (Scroll here, Top, Bottom, Page Up/Down, Scroll Up/Down) and new KWrite-specific entries (Show scrollbar marks, show scorllbar mini-map)
KWrite with quick access to its scrollbar settings

A couple of years ago I added a context menu to the line number bar in KWrite and Kate. Rather than having to go to the menu to toggle automatic line breaks or bookmarks, those options were now accessible from the context menu. I’ve always wanted to do the same to the scrollbar and have a mini-map option there. However, it wasn’t possible to extend the default context menu and I didn’t want to re-implement all of its Up/Down/Pg Up/Pg Down/etc logic. I therefore added a QScrollBar::createStandardContextMenu method similar to what QLineEdit has. As the name implies, it builds the regular context menu and hands it to you, so you can add your own actions to it.

Speaking of menus, I uplifted SH_Menu_SelectionWrap that decides whether menu selection wraps around when using the arrow keys from QStyle to QStyleHints. This allows Qt Quick Controls Menu to behave the same as QMenu. This behavior is off by default on macOS, for instance, and our own Qt Quick Controls 2 Desktop Style currently handles keyboard input itself to implement wrapping.

I’ve talked about it before that I sometimes just fire up a profiler and look at application startup performance. That’s while working on KWrite I noticed that it was spending a good amount of time parsing the shared-mime-info database. It’s basically a huge XML file containing information about all file types there are and how to detect them, either by file extension or by magic bytes within. Now, why would it even load that database when opening a blank new document?

There’s several places where KWrite and the underlying KTextEditor Framework need to know the type of a viewed file: to load the correct syntax highlighter, display the correct file icon in the tab bar and recent documents list, and so on. When the file type isn’t already known it tries to guess from its contents. Qt caches the database of course but the first one to create a QMimeDatabase triggers a load. However, none of this really matters for an empty document so it now assumes an empty document be of type text/plain. The correct type is actually application/x-zerosize but that’s really not what you want here.

Global Shortcuts settings, shortcut “Switch to next keyboard layout”, default Meta+Alt+K and a custom shortcut “Keyboard” pointed at by the mouse cursor
Using the “Keyboard” key to switch keyboard layouts, eh?

My trusty ThinkPad has a “keyboard key” (Fn+F11) which under Windows supposedly opens some keyboard settings page. For the longest time, I thought it just wasn’t supported under Linux because I couldn’t create a global shortcut with it. Recently I noticed in KWin’s Debug Console that it did in fact recognize the key. Turns out Qt just didn’t have a corresponding Qt::Key. Starting from Qt 6.10 there will be a new Qt::Key_Keyboard value.

Qt Wayland Client

Since last time I talked about Qt Wayland, I have done a few more optimizations to its SHM (Shared Memory) backing store. It’s the canvas that Qt provides to software-rendered applications for drawing their user interface.

I finally merged support for scrolling the backing store. This lets an application, such as a text editor or terminal emulator, optimize scrolling through a view by merely moving the pixels and filling in only the small gap that’s now left. Unfortunately, this optimization cannot be provided when using fractional scaling because there’s no integer number of pixels we can just move up or down.

Furthermore, Qt Wayland no longer uses a backing store with alpha channel if the window didn’t request one. Most toplevel application windows are opaque after all. It doesn’t really matter from the compositor’s POV since a wl_surface can carry an “opaque region” that indicates what part of the window is actually opaque and Qt sets it accordingly. ARGB32 and RGB32 are the same in-memory size, too. Nevertheless, not using an alpha channel lets Qt skip certain operations, such as clearing the paint area before starting to draw.

While investigating a performance problem in animations under Wayland, I noticed that StackView’s new pushItem methods didn’t use any animation by default. As part of the effort to give QML tooling, such as qmlcachegen and qmllint, more context, many generic methods were supplemented by proper overloads. For example, StackView.push(var) takes either an Item, a Component, or a URL but you could call it with anything and that’s why it has to be invoked dynamically. StackView.pushItem on the other hand is declared three times with an explicit type which allows to generate more efficient code.

It didn’t make much sense that they would behave differently, of course. Indeed online documentation clearly said “If no operation is provided, PushTransition will be used.” We concluded it was a copy-paste mistake and I changed this for Qt 6.8.3, even though it’s technically a behavior change.

I’ll be jealous of your Weißwurstfrühstück in Munich and am looking forward to attending Qt Contributor’s Summit again in 2026!

Ever wondered how todays apps can scale up so smoothly, bounce back from crashes like its no big deal, and keep running even when everythings going wrong? Well, the secret sauce is probably Kubernetesyep, the magic behind the scenes! Often called as K8s, Kubernetes is this awesome open-source platform thats basically taken over the tech world. But whats actually happening under the hood? How does it pull off all this magic? Lets dig in, take away the mystery, and see what makes Kubernetes so great!

The Rise of the Container Kingdom

Alright, lets begin with a brief overview before delving into Kubernetes. Picture yourself shipping products worldwide. You could simply throw everything onto a ship without any plan, but good luck dealing with that chaosit would be a complete disaster! Thats where containers enter the scene: neat, uniform boxes that enhance shipping efficiency and reliability. In the realm of software, Docker had a similar concept and thought, Lets apply this to applications! Now, developers can enclose their programs into these tidy little containers, including all necessitiessuch as libraries and configurations. Heres the catch: operating a single container? No issue, its extremely straightforward. However, attempting to oversee hundreds or even thousands of them across multiple machines, ensuring theyre all functioning, distributing the load, and remaining updatedthats when it becomes complicated very quickly. Thats where Kubernetes steps in, serving as the ultimate overseer, ensuring this entire container operation runs seamlessly and appears effortless

The Anatomy of Kubernetes

Kubernetes is fundamentally a framework that assists in the administration of containerized applications across various machines. It functions on a cluster architecture, which consists of two main components: the control plane, acting as the operational brain, and the worker nodes, which supply the essential computing resources. Lets explore this further.

The Control Plane: The Central Intelligence

The control plane is the starting point of everything. It encompasses multiple components that supervise the cluster, make crucial decisions, and ensure your applications operate correctly. Heres what it comprises:

  • API Server: The gateway to Kubernetes. Every interactionwhether you are deploying an application using kubectl or a component is assessing the clusters healthoccurs through the API server. It serves as the primary communication hub.

  • etcd: The memory bank of Kubernetes. This distributed key-value store retains the configuration data and state of the cluster. Consider it the definitive source of truth that ensures consistency across the system.

  • Controller Manager: The regulator. It monitors the state of the cluster and guides it towards your specified configurations (for instance, I require 3 replicas of this application). If a pod fails, the controller manager promptly intervenes.

  • Scheduler: The allocator. It decides which worker node will hold your new container by analyzing resource availability, constraints, and policies. It is similar to a game of Tetris, but centered on CPU and memory resources.

The Worker Nodes: The Essential Contributors

The worker nodes serve as the operational environment for your applications. Each node consists of a machine, which may be either physical or virtual, that is equipped with the necessary resources.

  • Kubelet: The local agent. It talks to the control plane and ensures the containers on its node are running as expected. If the scheduler says, Run this pod, the kubelet makes it happen.

  • Container Runtime: The Container Runtime is the software that retrieves images and initiates the containers, like Docker or containerd. It serves as the underlying engine for these operations.

  • Kube-Proxy: Kube-Proxy acts as the networking intermediary. It enables communication between pods and the external world by overseeing network configurations on each node.

To consistently align the desired statewhat you wish to achievewith the actual statewhat is occurringthe control plane and worker nodes collaborate to create a cohesive cluster.

The Magic Trick: Self-Healing and Scaling

Now that weve introduced the characters, lets witness the magic unfold. Two of Kubernetes most impressive abilities are its self-healing and auto-scaling features.

Self-Healing:

Picture this: youve launched a web application with 5 replicas. Suddenly, one pod fails because of a bug. In a conventional setup, you would be hurriedly trying to restart it. With Kubernetes, the controller manager detects the issuedesired state: 5 pods; actual state: 4 podsand directs a node to generate a replacement. Its as if the system has an intrinsic capacity to regenerate, rising from the ashes effortlessly.

Auto-Scaling:

Traffic spiking? Kubernetes has your back. The Horizontal Pod Autoscaler (HPA) watches metrics like CPU usage or custom app metrics. If your apps getting hammered, HPA tells the cluster to deploy more pods. When the storm passes, it scales back down. Its elastic computing at its finestno overprovisioning, no waste

Pods: The Smallest Spell in the Book

Pods are the wizard's tiniest spells, if Kubernetes is the wizard. The fundamental building piece is a pod, which is a wrapper around one or more containers that share network and storage resources. Consider it a comfortable home for the containers in your app. Kubernetes determines where pods reside in the cluster; you manage pods rather than containers directly.

Pods are meant to be transient. The scheduler and controller manager allow them to die and reappear in another part of the cluster. The flexibility of Kubernetes is largely due to this abstraction; pods enable it to rearrange workloads like a pro chess player.

Networking: The Invisible Threads

Containers need to talkto each other, to databases, to the internet. Kubernetes weaves a network thats both simple and powerful:

  • Every pod gets its own IP address, even across nodes, flattening the network and avoiding port conflicts.

  • Services provide stable endpoints for pods, load-balancing traffic across them. If a pod dies and respawns, the service keeps the connection alive.

  • Ingress controllers handle external traffic, routing HTTP requests with finesse.

Its like an enchanted web, ensuring communication flows seamlessly no matter where your pods land.

Why It Feels Like Magic

Kubernetes feels magical because it abstracts away the chaos of distributed systems. You declare what you wantvia YAML files or Helm chartsand Kubernetes makes it happen. Crash recovery? Load balancing? Rolling updates? Its all baked in. Under the hood, its a symphony of components working in concert, but to you, its a single spell: kubectl apply.

The Trade-Off: Complexity vs. Power

Of course, no magic comes without a cost. Kubernetes has a steep learning curveterms like persistent volume claims, CRDs, and RBAC can feel like arcane runes at first. And running it in production demands care: monitoring, logging, and security dont set themselves up. But for those who master it, Kubernetes unlocks unparalleled power to build resilient, scalable systems.

Conclusion: The Wizard Unveiled

Kubernetes isnt just a tool; its a paradigm shift. Under the hood, its a marvel of engineeringdistributed components, clever abstractions, and relentless automation. Whether youre running a small app or a global platform, K8s brings order to the chaos of modern computing. So next time you deploy a pod or scale an app with a single command, tip your hat to the magic happening beneath the surface. The wizardry of Kubernetes is realand its here to stay.

Tuesday, 11 March 2025

Last week I decided to clean up a bit of digital cruft. That is, I moved a few of my websites onto a single VPS, saving quite a bit of monthly server hosting costs.

What I did was that I moved VPSes from Linode (Akamai) to DigitalOcean, but also migrated a full web hotel from One to DigitalOcean (converting email accounts to email forwards).

As this is something that I do very rarely, I decided to document the process here so that I don’t have to look everything up again next time around.

The grunt work was about migrating a number of L*MP services to a LEMP server. There are a couple of tasks involved here, mainly migration of databases and getting WordPress running in a subdirectory using Nginx. The rest of the exercise had to do with the moving of nameservers and waiting for DNS propagation to get certbot to provide certificates for the new location.

Migration of MySQL databases

The migration of a database between machines can be broken down into three stages:

  1. Dumping the old database
  2. Creating a new database and user
  3. Sourcing the database contents into the new database

I choose to do it in these three stages, as I’d like to keep the old database dump as an additional backup. The other option would be to transfer the database contents in a single step, merging steps 1 and 3 into one

Nevertheless, I use mysqldump to dump the database contents, and then bzip2 to reduce the size of the dump. This is efficient since and SQL dump is quite verbose.

mysqldump -u username -p --databases databasename | grep -vE \"^(USE|CREATE DATABASE)\" | bzip2 -c - > dumpname.sql.bz2

This is derived from the answer by Anuboiz over at stack overflow. The resulting file is then transferred to the new server using scp together with the actual website.

The next step is to create a new database and a new database user. Here, I assume MariaDB (using the mysql commands), as my main target is WordPress. For other database engines, e.g. Postgresql, please check the docs for exact grammar, but the SQL commands should be very similar.

sudo mysql
mysql> CREATE DATABASE databasename;
mysql> USE databasename;
mysql> CREATE USER 'username'@'localhost' identified by 'password';
mysql> GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on databasename.* TO 'username'@'localhost' WITH GRANT OPTION;
mysql> EXIT

Check out this digital ocean tutorial for details on the above commands.

The next step is to read the database contents into the new database. For this, we need to unzip the sql dump, e.g. bunzip2 dumpname.sql.bz2, which will result in a file called dumpname.sql. Please notice that bunzip2 unzips the file and removes the original, zipped, file. If you want to keep the original, use the -k option.

Once you have the dumpname.sql file available, you can read it into the database with the newly created user using the source command as shown below.

mysql -u username -p
enter the password here
mysql> USE databasename;
mysql> SOURCE dumpname.sql;
mysql> EXIT

Now you should have a new database with the old database contents on the new server, with an associated database user. For WordPress sites, make sure that you reflect any changes in the associated wp-config.php file.

WordPress in a subdirectory using Nginx

The other piece of the puzzle that was new to me was to run WordPress from a subdirectory, e.g. example.com/blog/, rather than from the root level, e.g. example.com/.

Removing most of the nginx server configuration, the following parts does the magic:

server {
        root /var/www/thelins.se;
        index index.php index.html;

        server_name thelins.se www.thelins.se;

...

# For root
        location / {
                try_files $uri $uri/ /index.php?$args;
        }

# For subdirectory
        location /johan/blog/ {
                try_files $uri $uri/ /johan/blog/index.php$args;
        }

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
        }

...
}

The trick was to ensure that the subdirectory try_files statement refer to the correct index.php. Notice that this has to be done for each WordPress instance, if you happen to have multiple WordPress installations in various subdirectories on the same domain.

Conclusions

Its a bit of hassle to migrate a lot of web sites at once, but the monetary saving from moving the low traffic sites onto a single VPS, and the simplification of the management and monitoring by moving all VPSes to a single provider makes it worth it.

The last maintenance release of the 24.12 cycle is out.

For the full changelog continue reading on kdenlive.org.