A modern Qt6/QML GUI application for managing Btrfs/Snapper filesystem snapshots on Linux.
qSnapper is a graphical user interface for the Snapper snapshot management tool. It provides an intuitive way to create, browse, and manage filesystem snapshots on Btrfs and other supported filesystems.
- Snapshot Management:
Create, view, and delete filesystem snapshots - Snapshot Types:
Support for Single, Pre, and Post snapshots - Cleanup Policies:
Configure automatic cleanup using Number or Timeline algorithms - File Comparison: View changes between snapshots with detailed diff preview
- Pre/Post Snapshot Comparison: Switch between Pre and Post snapshot diffs against the current system, and restore from either snapshot independently
- Restore Preview: Preview files before restoring from snapshots
- Fast Restore: Two restore modes — Direct Copy (fast, btrfs reflink-aware) and YaST compatible — with configurable batch size and real-time progress logging
- Theme Support:
Light/Dark mode switching - Internationalization: Multi-language support (English, Japanese, German)
- Modern UI:
Built with Qt6 Quick/QML for a responsive user experience - Secure Operations:
Uses D-Bus and PolicyKit for privilege escalation
The main window displays all available snapshots with detailed information including snapshot number, type, timestamp, and description.
Create new snapshots with customizable options including snapshot type (Single/Pre/Post),
description, and cleanup algorithm.
View detailed information about a specific snapshot,
including file changes, metadata, and available actions.
Preview file changes before restoring from a snapshot.
This helps you understand what will be modified.
Configure the restore method (Direct Copy or YaST compatible) and batch size before restoring files.
Confirm snapshot deletion with a safety dialog that shows which snapshot will be removed.
- Linux operating system (required)
- Qt6 (>= 6.2)
- Qt6 Core
- Qt6 GUI
- Qt6 Quick
- Qt6 QuickControls2
- Qt6 Qml
- Qt6 DBus
- Snapper (>= 0.8.0)
- PolicyKit (polkit)
- D-Bus
- CMake (>= 3.16)
- C++17 compatible compiler (GCC, Clang)
- Qt6 development packages
- PolicyKit-Qt6 development files
- Snapper development headers
openSUSE Leap 16 / SUSE Linux Enterprise 16
sudo zypper install cmake gcc-c++ \
qt6-base-devel qt6-declarative-devel qt6-quickcontrols2-devel qt6-linguist-devel \
polkit-devel libpolkit-qt6-1-devel \
libsnapper-develRHEL 9 / 10
sudo dnf install cmake gcc-c++ \
qt6-qtbase-devel qt6-qtdeclarative-devel qt6-qtquickcontrols2-devel qt6-linguist-devel \
polkit-devel polkit-qt6-1-devel \
snapper-develgit clone https://github.com/presire/qSnapper.git
cd qSnapper
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make -j$(nproc)
sudo make installBuild Options:
-
SELinux Support (Optional, disabled by default):
cmake -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_SELINUX=ON ..
Enables SELinux Mandatory Access Control (MAC) policy module installation.
Requirements for SELinux:
- openSUSE / SUSE Linux Enterprise:
sudo zypper install selinux-policy-devel policycoreutils
- RHEL 9 / 10:
sudo dnf install selinux-policy-devel policycoreutils-python-utils
See selinux/README.md for detailed SELinux configuration.
- openSUSE / SUSE Linux Enterprise:
-
Log Directory (Optional, default:
/var/log/qsnapper):cmake -DCMAKE_INSTALL_PREFIX=/usr -DQSNAPPER_LOG_DIR=/path/to/log/dir ..
Changes the directory where the D-Bus service writes log files. The log filename (
qsnapper-dbus.log) cannot be changed. If not specified, logs are written to/var/log/qsnapper.
The installation process automatically installs:
- D-Bus service files to
/usr/share/dbus-1/system-services/ - D-Bus configuration to
/usr/share/dbus-1/system.d/ - PolicyKit policy to
/usr/share/polkit-1/actions/ - Desktop entry to
/usr/share/applications/ - Application icon to
/usr/share/icons/hicolor/128x128/apps/
Reload D-Bus and PolicyKit:
sudo systemctl reload dbusYou can launch qSnapper from:
- Application menu (System Tools category)
- Command line:
qsnapper
- Click the "Create Snapshot" button
- Select snapshot type (Single, Pre, or Post)
- Enter a description
- Choose cleanup algorithm (optional)
- Click "Create"
The main window displays a list of all snapshots with:
- Snapshot number
- Type (Single, Pre, Post)
- Date and time
- User who created it
- Description
Select a snapshot to view:
- Files that were added, modified, or deleted
- Detailed file differences
- Select a snapshot
- Click "Show Changes" to open the Snapshot Overview
- Review the file changes in the tree view and diff panel
- Check the files/directories you want to restore
- Click "Restore Selected" to restore the checked items
For Pre/Post snapshot pairs, you can:
- Switch between Pre and Post snapshot diffs using radio buttons
- Restore from either the Pre or Post snapshot independently using dedicated buttons
qSnapper offers two restore methods, selectable from the restore confirmation dialog:
-
Direct Copy (fast) (default):
Copies files directly from the mounted snapshot usingcp -a --reflink=auto.
On Btrfs, reflink enables near-instant copy-on-write regardless of file size. -
YaST compatible:
Uses the same restore approach as YaST's "Filesystem Snapshots" module (cp -awithout reflink).
Use this mode if you experience compatibility issues with the Direct Copy method.
- Batch size (1–1000, default: 100):
Number of files processed per batch. Larger values may improve throughput; smaller values provide more granular progress feedback.
During restoration, a real-time progress log displays each file as it is restored, with automatic scrolling.
Warning:
Restoring snapshots may overwrite current data. Always review changes before confirming.
qSnapper uses your existing Snapper configuration.
To configure Snapper for your root filesystem:
sudo snapper -c root create-config /For other filesystems:
sudo snapper -c <config-name> create-config <mount-point>Application settings are stored in:
~/.config/Presire/qSnapper.conf
Settings include:
- Theme mode (Light or Dark)
- Window geometry and state
- Restore method (Direct Copy or YaST compatible)
- Restore batch size (1–1000)
- User preferences
qSnapper supports theme switching through the built-in ThemeManager:
- Light Mode:
Optimized light color scheme with Material Design colors - Dark Mode:
Comfortable dark color scheme for low-light environments
The theme setting is automatically persisted in the application configuration and can be toggled through the UI.
If you see D-Bus connection errors:
-
Check if the D-Bus service file is installed:
ls /usr/share/dbus-1/system-services/com.presire.qsnapper.Operations.service
-
Verify D-Bus configuration:
ls /usr/share/dbus-1/system.d/com.presire.qsnapper.Operations.conf
-
Check D-Bus service status:
systemctl status dbus
If operations fail with permission errors:
-
Verify PolicyKit policy is installed:
ls /usr/share/polkit-1/actions/com.presire.qsnapper.policy
-
Ensure your user is in the required groups (implementation-specific)
If Snapper is not configured:
s
sudo snapper list-configsIf no configurations exist, create one as shown in the Configuration section.
mkdir build-debug && cd build-debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j$(nproc)qSnapper/
├── CMakeLists.txt # Build configuration
├── src/ # C++ source files
│ ├── main.cpp # Application entry point
│ ├── fssnapshot.cpp # Snapshot data model
│ ├── fssnapshotstore.cpp # Snapshot data store
│ ├── snapperservice.cpp # Snapper service interface
│ ├── snapshotlistmodel.cpp # Snapshot list model
│ ├── snapshotgroupmodel.cpp # Pre/Post snapshot grouping model
│ ├── filechangemodel.cpp # File change tree model
│ ├── thememanager.cpp # Theme management (Light/Dark mode)
│ └── dbusservice/ # D-Bus service implementation
│ ├── main.cpp # D-Bus service entry point
│ └── snapshotoperations.cpp # D-Bus method implementations
├── include/ # Header files
├── qml/ # QML user interface
│ ├── Main.qml # Main window with theme support
│ ├── pages/ # Page components
│ │ └── SnapshotListPage.qml
│ └── components/ # Reusable components
│ ├── SnapshotItem.qml
│ ├── SnapshotDetailDialog.qml
│ ├── RestorePreviewDialog.qml
│ ├── SnapshotTableHeader.qml
│ ├── SnapshotTableRow.qml
│ ├── AboutqSnapperDialog.qml
│ └── AboutQtDialog.qml
├── cmake/ # CMake modules
│ └── packaging.cmake # CPack packaging configuration
├── icons/ # Application icons
├── dbus/ # D-Bus configuration files
├── polkit/ # PolicyKit policy files
├── selinux/ # SELinux policy module
│ ├── qsnapper.te # Type enforcement rules
│ ├── qsnapper.if # Interface definitions
│ └── qsnapper.fc.in # File context definitions
├── Licenses/ # Third-party licenses
│ ├── Qt.md
│ ├── D-Bus.md
│ ├── PolicyKit.md
│ ├── Polkit-Qt.md
│ └── Snapper.md
└── translations/ # Translation files
├── qsnapper_ja.ts # Japanese translation
└── qsnapper_de.ts # German translation
Contributions are welcome! Please feel free to submit issues and pull requests.
- Follow the existing code style
- Test your changes thoroughly
- Update documentation as needed
- Ensure all commits are signed
This project is licensed under the GNU General Public License v3.0 or later - see the LICENSE.md file for details.
- Snapper - The snapshot management tool
- Qt Project - The cross-platform framework
- PolicyKit - Authorization framework
- GitHub Repository: https://github.com/presire/qSnapper
- Issue Tracker: https://github.com/presire/qSnapper/issues
- Snapper Documentation: http://snapper.io/documentation.html
Presire
- GitHub: @presire





