diff -pruN 2.1.1-1/CMakeLists.txt 2.2-1/CMakeLists.txt
--- 2.1.1-1/CMakeLists.txt	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/CMakeLists.txt	2025-06-15 17:56:34.000000000 +0000
@@ -5,6 +5,7 @@ project(btrfs-assistant VERSION 1.5 LANG
 include(GNUInstallDirs)
 
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 
 set(CMAKE_AUTOUIC ON)
 set(CMAKE_AUTOMOC ON)
diff -pruN 2.1.1-1/changelog 2.2-1/changelog
--- 2.1.1-1/changelog	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/changelog	2025-06-15 17:56:34.000000000 +0000
@@ -1,5 +1,13 @@
 ### Btrfs Assistant
 
+2.2 - 2025-06-15
+* Fix overwriting permissions on xdg-runtime-dir(Contributed by Luan Vitor Simião Oliveira)
+* Fix free space percentage calculations
+* Fix a regression that blocked restoring when booted from an ISO
+* Replace the mount library call with the mount command to avoid corrupting lsblk output
+* Fix issues when DISPLAY is not set(Contributed by Austin Horstman)
+
+
 2.1.1 - 2024-05-11
 * Fix btrfs-assistant script regression impacting wlroots
 
diff -pruN 2.1.1-1/debian/changelog 2.2-1/debian/changelog
--- 2.1.1-1/debian/changelog	2024-06-05 10:52:45.000000000 +0000
+++ 2.2-1/debian/changelog	2025-12-04 15:57:21.000000000 +0000
@@ -1,3 +1,11 @@
+btrfs-assistant (2.2-1) unstable; urgency=medium
+
+  * New upstream version 2.2.
+  * Bump Standards-Version to 4.7.2, no changes needed.
+  * Bump copyright year.
+
+ -- Dale Richards <dale@dalerichards.net>  Thu, 04 Dec 2025 15:57:21 +0000
+
 btrfs-assistant (2.1.1-1) unstable; urgency=medium
 
   * New upstream version 2.1.1
diff -pruN 2.1.1-1/debian/control 2.2-1/debian/control
--- 2.1.1-1/debian/control	2024-06-05 10:51:21.000000000 +0000
+++ 2.2-1/debian/control	2025-12-04 15:54:53.000000000 +0000
@@ -9,7 +9,7 @@ Build-Depends:
  qt6-base-dev,
  qt6-tools-dev,
  libbtrfsutil-dev,
-Standards-Version: 4.6.2
+Standards-Version: 4.7.2
 Homepage: https://gitlab.com/btrfs-assistant/btrfs-assistant
 Vcs-Browser: https://salsa.debian.org/doge-tech/btrfs-assistant
 Vcs-Git: https://salsa.debian.org/doge-tech/btrfs-assistant.git
diff -pruN 2.1.1-1/debian/copyright 2.2-1/debian/copyright
--- 2.1.1-1/debian/copyright	2024-04-25 12:41:01.000000000 +0000
+++ 2.2-1/debian/copyright	2025-12-04 15:57:21.000000000 +0000
@@ -4,11 +4,11 @@ Upstream-Name: btrfs-assistant
 Upstream-Contact: dalto <https://gitlab.com/dalto.8>
 
 Files: *
-Copyright: 2023 dalto
+Copyright: 2023-2025 dalto
 License: GPL-3+
 
 Files: src/btrfs-assistant.metainfo.xml
-Copyright: 2023 dalto
+Copyright: 2023-2025 dalto
 License: CC0-1.0
  To the extent possible under law, the author(s) have dedicated all
  copyright and related and neighboring rights to this software to the
@@ -23,7 +23,7 @@ License: CC0-1.0
  Dedication can be found in "/usr/share/common-licenses/CC0-1.0".
 
 Files: debian/*
-Copyright: 2023 Dale Richards <dale@dalerichards.net>
+Copyright: 2023-2025 Dale Richards <dale@dalerichards.net>
 License: GPL-3+
 
 License: GPL-3+
diff -pruN 2.1.1-1/src/btrfs-assistant-launcher 2.2-1/src/btrfs-assistant-launcher
--- 2.1.1-1/src/btrfs-assistant-launcher	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/btrfs-assistant-launcher	2025-06-15 17:56:34.000000000 +0000
@@ -1,7 +1,7 @@
 #!/usr/bin/env bash
 
 # Define the base command with common options
-command="pkexec btrfs-assistant --xdg-runtime=\"${XDG_RUNTIME_DIR}\""
+command="pkexec btrfs-assistant"
 
 # Add xdg-desktop option if XDG_CURRENT_DESKTOP is set
 if [[ -n ${XDG_CURRENT_DESKTOP} ]]; then
@@ -10,10 +10,13 @@ fi
 
 # Add platform and display options when using Wayland
 if [[ -n "${WAYLAND_DISPLAY}" ]]; then
-    command="${command} --display=\"${WAYLAND_DISPLAY}\""
+    command="${command} --display=\"${XDG_RUNTIME_DIR}/${WAYLAND_DISPLAY}\""
     if [[ -n "${QT_QPA_PLATFORM}" ]]; then
         command="${command} --platform=\"${QT_QPA_PLATFORM}\""
     fi
+else
+    # only needed for X session
+    command="${command} --xdg-runtime=\"${XDG_RUNTIME_DIR}\""
 fi
 
 # Add platformtheme option if QT_QPA_PLATFORMTHEME is set
diff -pruN 2.1.1-1/src/main.cpp 2.2-1/src/main.cpp
--- 2.1.1-1/src/main.cpp	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/main.cpp	2025-06-15 17:56:34.000000000 +0000
@@ -52,8 +52,9 @@ int main(int argc, char *argv[])
         snapper = new Snapper(&btrfs, snapperPath);
     }
 
-    // If $DISPLAY is not empty, launch in GUI mode; else launch in CLI mode
-    if (!qEnvironmentVariableIsEmpty("DISPLAY")) {
+    // If $DISPLAY or $WAYLAND_DISPLAY is not empty, launch in GUI mode; else launch in CLI mode
+    if (!qEnvironmentVariableIsEmpty("DISPLAY") || !qEnvironmentVariableIsEmpty("WAYLAND_DISPLAY")) {
+        qDebug() << "DISPLAY / WAYLAND_DISPLAY variable is set, launching in GUI mode";
         QApplication app(argc, argv);
 
         app.setWindowIcon(QIcon(":/icons/btrfs-assistant.svg"));
diff -pruN 2.1.1-1/src/ui/Cli.cpp 2.2-1/src/ui/Cli.cpp
--- 2.1.1-1/src/ui/Cli.cpp	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/ui/Cli.cpp	2025-06-15 17:56:34.000000000 +0000
@@ -13,8 +13,13 @@ static QStringList getSnapperSnapshotLis
         std::sort(subvols.begin(), subvols.end(),
                   [](const SnapperSubvolume &a, const SnapperSubvolume &b) { return a.snapshotNum < b.snapshotNum; });
         for (const SnapperSubvolume &subvol : std::as_const(subvols)) {
-            output.append(target + "\t" + QString::number(subvol.snapshotNum) + "\t" + subvol.time.toString() + "\t" + subvol.type + "\t" +
-                          subvol.subvol + "\t" + subvol.uuid);
+            output.append(QStringLiteral("%1\t%2\t%3\t%4\t%5\t%6")
+                              .arg(target)
+                              .arg(subvol.snapshotNum)
+                              .arg(subvol.time.toString())
+                              .arg(subvol.type)
+                              .arg(subvol.subvol)
+                              .arg(subvol.uuid));
         }
     }
     return output;
@@ -88,7 +93,7 @@ int Cli::restore(Btrfs *btrfs, Snapper *
         return 1;
     }
 
-    QTextStream(stdout) << tr(QString("Restoring snapshot %1").arg(subvolume).toUtf8()) << Qt::endl;
+    QTextStream(stdout) << tr("Restoring snapshot %1").arg(subvolume) << Qt::endl;
 
     // Everything checks out, time to do the restore
     RestoreResult restoreResult = btrfs->restoreSubvol(uuid, subvolId, targetId);
diff -pruN 2.1.1-1/src/ui/DiffViewer.cpp 2.2-1/src/ui/DiffViewer.cpp
--- 2.1.1-1/src/ui/DiffViewer.cpp	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/ui/DiffViewer.cpp	2025-06-15 17:56:34.000000000 +0000
@@ -52,9 +52,10 @@ void DiffViewer::LoadSnapshots(const QSt
     static QRegularExpression re("\\/[0-9]*\\/snapshot$");
     const QStringList subvolSplit = rootPath.split(re);
     const QDir stemPath(subvolSplit.at(0));
-    const QString wildcardPath = QDir::cleanPath(stemPath.canonicalPath() + "/*/snapshot/" + relPath).replace(" ", "\\ ");
+    const QString wildcardPath =
+        QDir::cleanPath(QStringLiteral("%1/*/snapshot/%2").arg(stemPath.canonicalPath(), relPath)).replace(" ", "\\ ");
 
-    const QStringList resultList = System::runCmd("ls " + wildcardPath, false).output.split("\n");
+    const QStringList resultList = System::runCmd(QStringLiteral("ls %1").arg(wildcardPath), false).output.split("\n");
 
     // Clear the table and set the headers
     m_twSnapshot->clear();
@@ -79,7 +80,8 @@ void DiffViewer::LoadSnapshots(const QSt
         const QString snapshotNum = endPath.split("/").at(0);
 
         // Find the rootPath
-        const QString thisRootPath = QDir::cleanPath(stemPath.canonicalPath() + QDir::separator() + endPath.split(relPath).at(0));
+        const QString thisRootPath =
+            QDir::cleanPath(QStringLiteral("%1%2%3").arg(stemPath.canonicalPath(), QDir::separator(), endPath.split(relPath).at(0)));
 
         // Get the date
         const QString metaFileName =
diff -pruN 2.1.1-1/src/ui/MainWindow.cpp 2.2-1/src/ui/MainWindow.cpp
--- 2.1.1-1/src/ui/MainWindow.cpp	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/ui/MainWindow.cpp	2025-06-15 17:56:34.000000000 +0000
@@ -297,23 +297,25 @@ void MainWindow::populateBtrfsUi(const Q
     // The information section
     const auto allocatedPercent = static_cast<double>(filesystem.allocatedSize) / static_cast<double>(filesystem.totalSize) * 100.0;
     m_ui->label_btrfsAllocatedValue->setText(
-        QString("%1 (%2%)").arg(System::toHumanReadable(filesystem.allocatedSize)).arg(allocatedPercent, 0, 'f', 2));
+        QStringLiteral("%1 (%2%)").arg(System::toHumanReadable(filesystem.allocatedSize)).arg(allocatedPercent, 0, 'f', 2));
     const auto usagePercent = static_cast<double>(filesystem.usedSize) / static_cast<double>(filesystem.totalSize) * 100.0;
-    m_ui->label_btrfsUsedValue->setText(QString("%1 (%2%)").arg(System::toHumanReadable(filesystem.usedSize)).arg(usagePercent, 0, 'f', 2));
+    m_ui->label_btrfsUsedValue->setText(
+        QStringLiteral("%1 (%2%)").arg(System::toHumanReadable(filesystem.usedSize)).arg(usagePercent, 0, 'f', 2));
     m_ui->label_btrfsSizeValue->setText(System::toHumanReadable(filesystem.totalSize));
-    double freePercent = (double)filesystem.allocatedSize / (double)filesystem.totalSize;
-    if (freePercent < 0.70) {
+    double usedPercent = (double)filesystem.usedSize / (double)filesystem.totalSize;
+    if (usedPercent < 0.70) {
         m_ui->label_btrfsMessage->setText(tr("You have lots of free space, did you overbuy?"));
-    } else if (freePercent > 0.95) {
+    } else if (usedPercent > 0.95) {
         m_ui->label_btrfsMessage->setText(tr("Situation critical!  Time to delete some data or buy more disk"));
     } else {
         m_ui->label_btrfsMessage->setText(tr("Your disk space is well utilized"));
     }
+    double freePercent = static_cast<double>(filesystem.freeSize) / static_cast<double>(filesystem.totalSize);
     m_ui->label_btrfsFreeValue->setText(
-        QString("%1 (%2%)").arg(System::toHumanReadable(filesystem.freeSize)).arg((1.0 - freePercent) * 100.0, 0, 'f', 2));
+        QStringLiteral("%1 (%2%)").arg(System::toHumanReadable(filesystem.freeSize)).arg((freePercent) * 100.0, 0, 'f', 2));
     double freeMinPercent = static_cast<double>(filesystem.freeSizeMin) / static_cast<double>(filesystem.totalSize);
     m_ui->label_btrfsFreeMinValue->setText(
-        QString("%1 (%2%)").arg(System::toHumanReadable(filesystem.freeSizeMin)).arg((freeMinPercent) * 100.0, 0, 'f', 2));
+        QStringLiteral("%1 (%2%)").arg(System::toHumanReadable(filesystem.freeSizeMin)).arg((freeMinPercent) * 100.0, 0, 'f', 2));
 
     // filesystems operation section
     btrfsBalanceStatusUpdateUI();
@@ -1120,7 +1122,7 @@ void MainWindow::on_toolButton_subvolume
 
     auto fb = new FileBrowser(QDir::cleanPath(mountpoint + QDir::separator() + subvolPath), uuid, this);
     // Prefix the window title with target and snapshot number, so user can make sense of multiple windows
-    fb->setWindowTitle(QString("%1 - %2").arg(subvolPath, fb->windowTitle()));
+    fb->setWindowTitle(QStringLiteral("%1 - %2").arg(subvolPath, fb->windowTitle()));
     fb->setAttribute(Qt::WA_DeleteOnClose, true);
     fb->show();
 }
@@ -1277,7 +1279,7 @@ void MainWindow::on_toolButton_snapperBr
 
     auto fb = new FileBrowser(m_snapper, QDir::cleanPath(mountpoint + QDir::separator() + subvolPath), uuid, this);
     // Prefix the window title with target and snapshot number, so user can make sense of multiple windows
-    fb->setWindowTitle(QString("%1:%2 - %3").arg(target, QString::number(snapshotNumber), fb->windowTitle()));
+    fb->setWindowTitle(QStringLiteral("%1:%2 - %3").arg(target, QString::number(snapshotNumber), fb->windowTitle()));
     fb->setAttribute(Qt::WA_DeleteOnClose, true);
     fb->show();
 }
diff -pruN 2.1.1-1/src/util/Btrfs.cpp 2.2-1/src/util/Btrfs.cpp
--- 2.1.1-1/src/util/Btrfs.cpp	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/util/Btrfs.cpp	2025-06-15 17:56:34.000000000 +0000
@@ -1,6 +1,5 @@
 #include "util/Btrfs.h"
 #include "util/System.h"
-#include <sys/mount.h>
 
 #include <QDebug>
 #include <QDir>
@@ -98,7 +97,8 @@ std::pair<QString, std::optional<Subvolu
     std::optional<Subvolume> ret;
     if (m_filesystems.contains(uuid) && m_filesystems.value(uuid).subvolumes.contains(subvolId)) {
         const QString mountpoint = mountRoot(uuid);
-        const QString subvolPath = QDir::cleanPath(mountpoint + QDir::separator() + subvolumeName(uuid, subvolId).name);
+        const QString subvolPath =
+            QDir::cleanPath(QStringLiteral("%1%2%3").arg(mountpoint, QDir::separator(), subvolumeName(uuid, subvolId).name));
 
         btrfs_util_error returnCode = createSnapshot(subvolPath, dest, readOnly);
         if (returnCode == BTRFS_UTIL_OK) {
@@ -124,7 +124,7 @@ bool Btrfs::deleteSubvol(const QString &
             QString mountpoint = mountRoot(uuid);
 
             // Everything checks out, lets delete the subvol
-            const QString subvolPath = QDir::cleanPath(mountpoint + QDir::separator() + subvol.subvolName);
+            const QString subvolPath = QDir::cleanPath(QStringLiteral("%1%2%3").arg(mountpoint, QDir::separator(), subvol.subvolName));
             btrfs_util_error returnCode = btrfs_util_delete_subvolume(subvolPath.toLocal8Bit(), 0);
             if (returnCode == BTRFS_UTIL_OK) {
                 return true;
@@ -166,7 +166,7 @@ bool Btrfs::isSubvolumeBackup(QString su
 bool Btrfs::isMounted(const QString &uuid, const uint64_t subvolid)
 {
     const QStringList outputList =
-        System::runCmd("findmnt -nO subvolid=" + QString::number(subvolid) + " -o uuid", false).output.trimmed().split("\n");
+        System::runCmd(QStringLiteral("findmnt -nO subvolid=%1 -o uuid").arg(subvolid), false).output.trimmed().split("\n");
     return uuid == outputList.at(0).trimmed();
 }
 
@@ -300,7 +300,8 @@ void Btrfs::loadVolumes()
         if (!mountpoint.isEmpty()) {
             BtrfsFilesystem btrfs;
             btrfs.isPopulated = true;
-            QStringList usageLines = System::runCmd("LANG=C ; btrfs fi usage -b \"" + mountpoint + "\"", false).output.split('\n');
+            QStringList usageLines =
+                System::runCmd(QStringLiteral("LANG=C ; btrfs fi usage -b \"%1\"").arg(mountpoint), false).output.split('\n');
             for (const QString &line : std::as_const(usageLines)) {
                 const QStringList &cols = line.split(':');
                 QString type = cols.at(0).trimmed();
@@ -334,7 +335,7 @@ QString Btrfs::mountRoot(const QString &
 {
     // Check to see if it is already mounted
     QStringList findmntOutput =
-        System::runCmd("findmnt", {"-nO", "subvolid=" + QString::number(BTRFS_ROOT_ID), "-o", "uuid,target"}, false).output.split('\n');
+        System::runCmd("findmnt", {"-nO", QStringLiteral("subvolid=%1").arg(BTRFS_ROOT_ID), "-o", "uuid,target"}, false).output.split('\n');
     QString mountpoint;
     for (const QString &line : std::as_const(findmntOutput)) {
         if (!line.isEmpty() && line.split(' ').at(0).trimmed() == uuid)
@@ -350,10 +351,10 @@ QString Btrfs::mountRoot(const QString &
 
         // Create the mountpoint and mount the volume if successful
         QDir tempMount;
-        const QString device = QDir::cleanPath(QStringLiteral("/dev/disk/by-uuid/") + uuid);
-        const QString options = "subvolid=" + QString::number(BTRFS_ROOT_ID);
+        const QString device = QDir::cleanPath(QStringLiteral("/dev/disk/by-uuid/%1").arg(uuid));
+        const QString options = QStringLiteral("subvolid=%1").arg(BTRFS_ROOT_ID);
         if (!(tempMount.mkpath(mountpoint) &&
-              mount(device.toLocal8Bit(), mountpoint.toLocal8Bit(), "btrfs", 0, options.toLocal8Bit()) == 0)) {
+              System::runCmd("mount", {"-t", "btrfs", "-o", options, device, mountpoint}, true).exitCode == 0)) {
             return QString();
         }
     }
@@ -389,7 +390,7 @@ RestoreResult Btrfs::restoreSubvol(const
     QString mountpoint = mountRoot(uuid);
 
     // We are out of excuses, time to do the restore....carefully
-    QString targetBackup = targetName + "_backup_" + QDateTime::currentDateTimeUtc().toString(Qt::ISODateWithMs);
+    QString targetBackup = QStringLiteral("%1_backup_%2").arg(targetName, QDateTime::currentDateTimeUtc().toString(Qt::ISODateWithMs));
 
     if (!customName.trimmed().isEmpty()) {
         targetBackup += "_" + customName.trimmed();
@@ -435,8 +436,9 @@ RestoreResult Btrfs::restoreSubvol(const
         childSubvolPath = childSubvol.right(childSubvol.length() - (targetName.length() + 1));
 
         // rename snapshot
-        QString sourcePath = QDir::cleanPath(mountpoint + QDir::separator() + targetBackup + QDir::separator() + childSubvolPath);
-        QString destinationPath = QDir::cleanPath(mountpoint + QDir::separator() + childSubvol);
+        QString sourcePath =
+            QDir::cleanPath(QStringLiteral("%1%2%3%2%4").arg(mountpoint, QDir::separator(), targetBackup, childSubvolPath));
+        QString destinationPath = QDir::cleanPath(QStringLiteral("%1%2%3").arg(mountpoint, QDir::separator(), childSubvol));
         if (!Btrfs::renameSubvolume(sourcePath, destinationPath)) {
             // If this fails, not much can be done except let the user know
             restoreResult.failureMessage = tr("The restore was successful but the migration of the nested subvolumes failed") + "\n\n" +
@@ -472,7 +474,7 @@ uint64_t Btrfs::subvolId(const QString &
     if (mountpoint.isEmpty()) {
         return 0;
     }
-    const QString subvolPath = QDir::cleanPath(mountpoint + QDir::separator() + subvolName);
+    const QString subvolPath = QDir::cleanPath(QStringLiteral("%1%2%3").arg(mountpoint, QDir::separator(), subvolName));
     uint64_t id;
     btrfs_util_error returnCode = btrfs_util_subvolume_id(subvolPath.toLocal8Bit(), &id);
     if (returnCode == BTRFS_UTIL_OK) {
@@ -534,7 +536,7 @@ bool Btrfs::setSubvolumeReadOnly(const Q
     if (m_filesystems.contains(uuid) && m_filesystems.value(uuid).subvolumes.contains(subvolId)) {
         Subvolume &subvol = m_filesystems[uuid].subvolumes[subvolId];
         const QString mountpoint = mountRoot(uuid);
-        const QString subvolPath = QDir::cleanPath(mountpoint + QDir::separator() + subvol.subvolName);
+        const QString subvolPath = QDir::cleanPath(QStringLiteral("%1%2%3").arg(mountpoint, QDir::separator(), subvol.subvolName));
 
         ret = setSubvolumeReadOnly(subvolPath, readOnly);
         if (ret) {
@@ -614,7 +616,10 @@ void Btrfs::stopScrubRoot(const QString
 void Btrfs::unmountFilesystems()
 {
     for (const QString &mountpoint : std::as_const(m_tempMountpoints)) {
-        umount2(mountpoint.toLocal8Bit(), MNT_DETACH);
+        auto retCode = System::runCmd("umount", {mountpoint}, true).exitCode;
+        if (retCode != 0) {
+            qWarning() << "Failed to unmount" << mountpoint;
+        }
     }
 }
 
diff -pruN 2.1.1-1/src/util/Snapper.cpp 2.2-1/src/util/Snapper.cpp
--- 2.1.1-1/src/util/Snapper.cpp	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/util/Snapper.cpp	2025-06-15 17:56:34.000000000 +0000
@@ -107,7 +107,7 @@ void Snapper::load()
     m_snapshots.clear();
     const SnapperResult result = runSnapper("list-configs --columns config");
 
-    if (result.exitCode != 0 || result.outputList.isEmpty()) {
+    if (result.exitCode != 0) {
         return;
     }
 
@@ -365,7 +365,7 @@ bool Snapper::restoreFile(const QString
 
 SnapperResult Snapper::setCleanupAlgorithm(const QString &config, const uint number, const QString &cleanupAlg) const
 {
-    return runSnapper("modify -c \"" + cleanupAlg + "\" " + QString::number(number), config);
+    return runSnapper(QStringLiteral("modify -c \"%1\" %2").arg(cleanupAlg).arg(number), config);
 }
 
 SnapperResult Snapper::setConfig(const QString &name, const Config &configMap)
diff -pruN 2.1.1-1/src/util/Snapper.h 2.2-1/src/util/Snapper.h
--- 2.1.1-1/src/util/Snapper.h	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/util/Snapper.h	2025-06-15 17:56:34.000000000 +0000
@@ -100,14 +100,20 @@ class Snapper : public QObject {
      * @param name - The name of the new config
      * @param path - The absolute path to the mountpoint of the subvolume that will be snapshotted by the config
      */
-    SnapperResult createConfig(const QString &name, const QString &path) const { return runSnapper("create-config " + path, name); }
+    SnapperResult createConfig(const QString &name, const QString &path) const
+    {
+        return runSnapper(QStringLiteral("create-config %1").arg(path), name);
+    }
 
     /**
      * @brief Creates a new manual snapshot with the given description
      * @param name - The name of the Snapper config
      * @param description - A string holding the description to be saved
      */
-    SnapperResult createSnapshot(const QString &name, const QString &desc) const { return runSnapper("create -d '" + desc + "'", name); }
+    SnapperResult createSnapshot(const QString &name, const QString &desc) const
+    {
+        return runSnapper(QStringLiteral("create -d '%1'").arg(desc), name);
+    }
 
     /**
      * @brief Reads the list of subvols to create mapping between the snapshot subvolume and the source subvolume
@@ -125,7 +131,10 @@ class Snapper : public QObject {
      * @param name - The name of the config that contains the snapshot to delete
      * @param num - The number of the snapshot to delete
      */
-    SnapperResult deleteSnapshot(const QString &name, const int num) const { return runSnapper("delete " + QString::number(num), name); }
+    SnapperResult deleteSnapshot(const QString &name, const int num) const
+    {
+        return runSnapper(QStringLiteral("delete %1").arg(num), name);
+    }
 
     /**
      * @brief Changes the description of a given Snapper snapshot
@@ -141,7 +150,7 @@ class Snapper : public QObject {
         // Escape Single quotes since they are used to delimit the description
         asciiDesc.replace("'", "'\\''");
 
-        return runSnapper("modify --description '" + asciiDesc + "' " + QString::number(num), name);
+        return runSnapper(QStringLiteral("modify --description '%1' %2").arg(asciiDesc).arg(num), name);
     }
 
     /**
diff -pruN 2.1.1-1/src/util/System.cpp 2.2-1/src/util/System.cpp
--- 2.1.1-1/src/util/System.cpp	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/util/System.cpp	2025-06-15 17:56:34.000000000 +0000
@@ -70,7 +70,10 @@ bool System::isSubvolidInFstab()
 
 Result System::runCmd(const QString &cmd, bool includeStderr, milliseconds timeout)
 {
-    return runCmd("/bin/bash", QStringList() << "-c" << cmd, includeStderr, timeout);
+    return runCmd("/usr/bin/env",
+                  QStringList() << "bash"
+                                << "-c" << cmd,
+                  includeStderr, timeout);
 }
 
 Result System::runCmd(const QString &cmd, const QStringList &args, bool includeStderr, milliseconds timeout)
@@ -96,5 +99,5 @@ QString System::toHumanReadable(const ui
         result /= 1024;
         i++;
     }
-    return QString::number(result, 'f', 2) + " " + units[i];
+    return QStringLiteral("%1 %2").arg(result, 0, 'f', 2).arg(units[i]);
 }
diff -pruN 2.1.1-1/src/widgets/FilterLineEdit.cpp 2.2-1/src/widgets/FilterLineEdit.cpp
--- 2.1.1-1/src/widgets/FilterLineEdit.cpp	2024-05-19 22:54:42.000000000 +0000
+++ 2.2-1/src/widgets/FilterLineEdit.cpp	2025-06-15 17:56:34.000000000 +0000
@@ -16,7 +16,7 @@ FilterLineEdit::FilterLineEdit(QWidget *
     connect(this, &FilterLineEdit::textChanged, this, &FilterLineEdit::updateButton);
 
     int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
-    setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(m_clearButton->sizeHint().width() + frameWidth + 1));
+    setStyleSheet(QStringLiteral("QLineEdit { padding-right: %1px; } ").arg(m_clearButton->sizeHint().width() + frameWidth + 1));
     QSize msz = minimumSizeHint();
     setMinimumSize(qMax(msz.width(), m_clearButton->sizeHint().height() + frameWidth * 2 + 2),
                    qMax(msz.height(), m_clearButton->sizeHint().height() + frameWidth * 2 + 2));
