Note
This branch contains the rewrite of the Kerything project. The code for Kerything v1 can be found in the v1-legacy branch.
Kerything is a fast Linux file search application built with C++26 and Qt 6.
Inspired by the Windows utility "Everything" by Voidtools, Kerything bypasses standard directory crawling where possible by reading the NTFS Master File Table (MFT) or scanning EXT4 inodes directly. This allows it to quickly index Linux block devices which use these filesystems.
For other mounted filesystems, Kerything can use Linux filesystem APIs to build an index without requiring filesystem-specific low-level scanner support.
Search is powered by fast in-memory trigram indexes to provide real-time results as you type.
Kerything currently supports indexing:
- EXT4
- NTFS
- Other mounted Linux filesystems through the generic mounted filesystem scanner
Low-level offline (unmounted) scanning is currently available for:
- EXT4
- NTFS
The name is a nod to the iconic "Everything" utility, while the 'K' prefix follows the long-standing naming tradition of the KDE community.
Kerything is a community project and is not affiliated with Voidtools.
Kerything can be built in two modes:
| Build mode | CMake flag | Description |
|---|---|---|
| KDE Frameworks 6 | -DKERYTHING_WITH_KF6=ON |
Recommended for KDE Plasma desktop users. Enables KDE integration such as richer file opening, “Show in File Manager”, “Open With”, and terminal launching. |
| Qt-only | -DKERYTHING_WITH_KF6=OFF |
Recommended for non-KDE desktops. Uses Qt and freedesktop-compatible fallbacks where possible. |
The KDE build is recommended if you are using KDE Plasma.
Kerything is designed for Linux systems using systemd.
The backend daemon uses libudev to monitor block device changes, such as devices
being created, removed, plugged in, unplugged, mounted, or unmounted. Because of
this, Kerything is intended for systemd-based Linux distributions.
Kerything consists of two executables:
kerything— the graphical applicationkerythingd— the privileged backend daemon responsible for device discovery and indexing
Kerything also installs two systemd system units:
kerythingd.socket— creates the local IPC socket and starts the daemon on demandkerythingd.service— runs the backend daemon when activated by the socket
The daemon is socket-activated. This means kerythingd.service does not need to
be enabled to start at boot. Instead, kerythingd.socket should be enabled. When
the GUI connects to /run/kerythingd/kerythingd.sock, systemd starts the daemon
automatically if it is not already running.
The daemon exits automatically after it has had no GUI clients connected for 30 seconds. The socket remains active, so the next GUI connection starts the daemon again.
- Blazing Fast Indexing: Uses low-level disk partition scanning for EXT4 and NTFS where available.
- Broader Filesystem Support: Indexes other mounted Linux filesystems supported by the generic mounted scanner.
- Offline Indexing: Supports scanning NTFS and EXT4 partitions even when they are not mounted in Linux.
- Instant Search: Uses trigram indexing for real-time search results as you type.
- Live Updates: Tracks filesystem changes for mounted devices in real time using Linux
fanotify, keeping the in-memory index updated. (Note: filesystems mounted usingfuseblkare not expected to work. See note below for more info.) - Extension Filters: Narrow searches by file extension using queries such as
ext:mp4orext:wav;mp3, or use saved filters from the Filter menu. - Full Unicode Support: Search for filenames containing any UTF-8 character, including international scripts, emojis and symbols.
- Zero Bloat: Simple, lightning-fast keyword search. By foregoing file-content scanning, regular expressions and other complex patterns, Kerything stays lightweight and responsive.
- Multithreaded: Leverages Intel OneTBB for parallel trigram generation and sorting.
- Rich Context Actions: Right-click menu integration to open, copy, or manage files directly from the results. (Note: Most context actions are only available if the drive was mounted at the time it was scanned.)
- Drag-and-Drop Support: Easily copy or attach files by dragging them from the search results into Dolphin or other applications. (Note: Currently not supported for Flatpak or other sandboxed applications due to portal limitations.)
- Low Overhead: The index is stored in memory with an emphasis on efficiency. By using string pooling (e.g., storing a folder path only once even if it contains thousands of files), Kerything maintains a surprisingly small memory footprint even for massive partitions.
Note
Live file system updates are supported for mounted filesystems using
Linux fanotify. Kerything keeps indexed devices updated for common
operations such as creates, deletes, metadata changes, symlinks, and renames.
Live update watching is enabled for mounted filesystems by default, and can be toggled via the device configuration dialog. Support depends on the filesystem and mount driver.
Live updates for devices mounted using fuseblk are not expected to work,
including NTFS mounted using ntfs-3g. NTFS mounted using either ntfs3
or the newer ntfs driver added in Linux kernel version 7.1 have been tested
to work successfully.
Live updates currently require the filesystem to be mounted and are provided
by the privileged kerythingd daemon.
If the live update stream becomes unreliable, for example due to a fanotify queue overflow or an unsupported edge case, Kerything may mark the index as potentially stale and a full refresh can be performed by pressing F5.
Native KDE Integration (Optional):
Kerything can be built with KDE Frameworks 6 for better integration on KDE Plasma desktops, including:
- Additional right-click context actions (similar to Dolphin) such as "Open With", share, compress, etc.
- "Show in File Manager" not only opens the folder, but also directly highlights the selected file.
- Group files by mime type when opening multiple files. This means when you select 4 music files and 3 images and press Open, you get a playlist containing the selected 4 songs open in your music player, and the selected 3 images open in your image viewer.
- Better "Open Terminal Here" integration.
- About box uses KDE Plasma's standard about box style.
Kerything searches indexed file names as you type. Searches are case-insensitive and use the in-memory trigram index for fast matching.
You can narrow results by file extension using ext::
ext:mp4
Multiple extensions can be separated with semicolons:
ext:wav;mp3
Extension filters can be combined with normal search terms:
holiday ext:jpg;png
ubuntu ext:iso
The leading dot is optional, so these are equivalent:
ext:mp4
ext:.mp4
Additionally, multiple uses of ext: are combined, so these are equivalent:
ext:mp4 ext:mkv
ext:mp4;mkv
Extension matching is case-insensitive. For example, ext:jpg matches .jpg,
.JPG, and .Jpg.
Kerything matches only the final extension after the last dot. For example,
archive.tar.gz would be matched with the following filter:
ext:gz
This means that currently no results will be returned if you attempt to use a compound extension, such as:
ext:tar.gz
Note
File type filters are based on filename extensions. Kerything does not inspect file contents or perform MIME-type sniffing.
The Filter menu provides reusable filter presets such as Audio, Images, Videos, Documents, Archives, and Code. Selecting a filter narrows the current search without changing the text in the search box.
For example, selecting Filter → Images and searching for:
holiday
searches for image files matching holiday.
Filters can be edited from:
Filter → Manage Filters...
or:
Settings → Configure Kerything... → Filters
Saved filters are stored as query fragments. For example, an Images filter may contain:
ext:apng;avif;bmp;gif;heic;heif;ico;jpeg;jpg;jxl;png;svg;tif;tiff;webp
Custom filters can be added, duplicated, removed, or restored to the default presets.
You can narrow results to only folders using folder:, or any of the below aliases:
folder:
folders:
type:folder
type:folders
The following keyboard shortcuts are available in Kerything:
| Shortcut | Action |
|---|---|
Ctrl + L or Alt + D or Ctrl+F |
Focus search bar and select all text |
Esc |
Focus search bar and clear all text |
Down / Up |
Move focus from search bar to the results table |
Return |
Open selected file(s) with default applications |
Ctrl + Return |
Open the folder containing the selected file |
Ctrl + C |
Copy selected file(s) to clipboard (for pasting into another application) |
Ctrl + Shift + C |
Copy selected file(s) file name(s) to clipboard |
Ctrl + Alt + C |
Copy selected file(s) full absolute path(s) to clipboard |
Alt + Shift + F4 |
Open your default terminal in the folder of the selected file |
F5 |
Refresh indexes |
Ctrl + N |
Open a new window |
Ctrl + W |
Close window |
Ctrl + Shift + , |
Open preferences |
Ctrl + Q |
Exit the application (closes all windows) |
Warning
Kerything v2 is a full rewrite of the application. If you previously had Kerything v1 installed, you will need to uninstall it first before installing Kerything v2.
To do this, follow the uninstallation instructions in the v1-legacy branch.
Kerything can be installed in two main ways:
- using the included Arch Linux
PKGBUILD - building and installing manually with CMake
After installing with either method, complete the shared Post-install setup steps so the GUI can talk to the privileged backend daemon.
If you already have Kerything installed, before upgrading:
- Close the GUI application first. If you update while the GUI is open, the socket may re-activate the daemon during installation.
- Stop both the daemon service and socket before installing the new build:
sudo systemctl stop kerythingd.service
sudo systemctl stop kerythingd.socket
sudo rm -rf /run/kerythingdAfter installing the new version, reload systemd and start the socket again:
sudo systemctl daemon-reload
sudo systemctl enable --now kerythingd.socketFor Arch Linux there are two installation options. You can either install the KDE Frameworks 6 build using the included PKGBUILD, or you can manually build and install either the KF6 or Qt-only builds using CMake.
The KDE Frameworks 6 build is recommended for KDE Plasma desktop users. The Qt-only build is recommended for non-KDE desktops.
If you already have Kerything installed, see Upgrading first.
# Clone the repository
git clone --branch v2.3.0 --depth 1 https://github.com/Reikooters/kerything.git
# Enter the source code directory
cd kerything
# Build and install the package
makepkg -si -f -cThis builds Kerything with KDE Frameworks 6 integration enabled.
After installation, complete Post-install setup.
If you already have Kerything installed, see Upgrading first.
Recommended for KDE Plasma users.
This includes the KDE dependencies and uses the -DKERYTHING_WITH_KF6=ON
build flag.
# Install dependencies
sudo pacman -S --needed \
base-devel \
cmake \
extra-cmake-modules \
pkgconf \
qt6-base \
onetbb \
e2fsprogs \
util-linux-libs \
systemd-libs \
kcoreaddons \
ki18n \
kio \
kxmlgui
# Clone the repository
git clone --branch v2.3.0 --depth 1 https://github.com/Reikooters/kerything.git
# Enter the source code directory
cd kerything
# Build and install
cmake -B build -S . \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DKERYTHING_WITH_KF6=ON
cmake --build build --parallel
sudo cmake --install buildAfter installation, complete Post-install setup.
Important
Use -DCMAKE_BUILD_TYPE=Release for normal use. Debug builds are significantly
slower and are intended for development only.
Recommended for non-KDE desktops.
This excludes the KDE dependencies and uses the -DKERYTHING_WITH_KF6=OFF
build flag.
sudo pacman -S --needed \
base-devel \
cmake \
pkgconf \
qt6-base \
onetbb \
e2fsprogs \
util-linux-libs \
systemd-libs
# Clone the repository
git clone --branch v2.3.0 --depth 1 https://github.com/Reikooters/kerything.git
# Enter the source code directory
cd kerything
cmake -B build -S . \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DKERYTHING_WITH_KF6=OFF
cmake --build build --parallel
sudo cmake --install buildAfter installation, complete Post-install setup.
Important
Use -DCMAKE_BUILD_TYPE=Release for normal use. Debug builds are significantly
slower and are intended for development only.
Install the equivalent development packages using your package manager for:
- CMake
- a C++26-capable compiler
- Qt 6 Core, Widgets, and Network
- oneTBB
- e2fsprogs development files, including
ext2fsandcom_err - util-linux development files, including
blkidandmount - libudev development files
- libsystemd development files
- pkg-config / pkgconf
For KDE Frameworks 6 integration, also install the development packages for:
- Extra CMake Modules
- KF6 CoreAddons
- KF6 I18n
- KF6 KIO
- KF6 XmlGui
Clone the repo:
# Clone the repository
git clone --branch v2.3.0 --depth 1 https://github.com/Reikooters/kerything.git
# Enter the source code directory
cd kerythingThen build either the KDE version:
cmake -B build -S . \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DKERYTHING_WITH_KF6=ON
cmake --build build --parallel
sudo cmake --install buildOr the Qt-only version:
cmake -B build -S . \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DKERYTHING_WITH_KF6=OFF
cmake --build build --parallel
sudo cmake --install buildAfter installation, complete Post-install setup.
Important
Use -DCMAKE_BUILD_TYPE=Release for normal use. Debug builds are significantly
slower and are intended for development only.
Kerything uses a privileged backend daemon for low-level device access. The GUI talks to the daemon over a Unix socket at:
/run/kerythingd/kerythingd.sock
Access to this socket is controlled by the kerything group. Create the group,
add your user to it, reload systemd, and enable the socket unit:
sudo groupadd -r kerything
sudo usermod -aG kerything "$USER"
sudo systemctl daemon-reload
sudo systemctl enable --now kerythingd.socketRestart your computer, or log out and back in, for the group change to take effect.
If you are upgrading and already created the group and assigned your user to it in the past, you don't need to reboot, but you still need to perform the steps to reload systemd and enable the socket unit using the commands above.
Important
Enable kerythingd.socket, not kerythingd.service. The service is started
automatically by systemd when the GUI connects to the socket.
After installing and refreshing your login session, launch Kerything from your application menu or run:
kerythingOn first run, Kerything will ask which detected devices you want to index.
By default, Kerything installs its systemd system units to:
${CMAKE_INSTALL_LIBDIR}/systemd/system
With -DCMAKE_INSTALL_PREFIX=/usr, this is usually:
/usr/lib/systemd/system
Some distributions use a different systemd system unit directory, such as:
/lib/systemd/system
or:
/usr/local/lib/systemd/system
You can override the unit installation directory with:
-DKERYTHING_SYSTEMD_SYSTEM_UNIT_DIR=/path/to/systemd/systemFor example:
cmake -B build -S . \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DKERYTHING_SYSTEMD_SYSTEM_UNIT_DIR=/usr/lib/systemd/system \
-DKERYTHING_WITH_KF6=ONAfter installing changed systemd units, reload systemd:
sudo systemctl daemon-reloadKerything uses systemd socket activation.
The GUI does not start the daemon directly and should not need administrator authentication during normal use. Instead:
- systemd creates
/run/kerythingd/kerythingd.sock - the socket is owned by
root:kerything - members of the
kerythinggroup can connect to it - connecting to the socket starts
kerythingd.serviceon demand
If you did not already do this during setup, create the kerything group and add
your user to it:
sudo groupadd -r kerything
sudo usermod -aG kerything "$USER"Restart your computer, or log out and back in, for the group change to take effect.
Then enable and start the socket:
sudo systemctl enable --now kerythingd.socketCheck the socket status with:
systemctl status kerythingd.socketCheck the daemon status with:
systemctl status kerythingd.serviceIt is normal for kerythingd.service to be inactive when the GUI is not running.
The socket should remain active.
To uninstall, first close the GUI application. Then stop the daemon and socket:
sudo systemctl stop kerythingd.service
sudo systemctl stop kerythingd.socket
sudo rm -rf /run/kerythingdFrom the same build directory used to install Kerything, run:
sudo cmake --build build --target uninstall
sudo systemctl daemon-reloadIf you installed Kerything using the included PKGBUILD, uninstall it with:
sudo pacman -Runs kerything
sudo systemctl daemon-reloadPackage removal does not necessarily remove local user data, preferences,
or the kerything group.
If you no longer want the access group, you can remove your user from it or remove the group entirely. Only do this if no other local installation of Kerything uses it:
sudo gpasswd -d "$USER" kerything
sudo groupdel kerythingYou may need to log out and back in for group membership changes to be fully reflected in your session.
To remove the preferences file:
rm ~/.config/Reikooters/Kerything.confFor development, you can run kerythingd manually instead of through systemd.
When no systemd socket is passed to the daemon, it falls back to creating and
listening on /run/kerythingd/kerythingd.sock itself.
The daemon still needs sufficient privileges to inspect block devices and create
the socket under /run, so development runs commonly require root privileges:
sudo ./build/kerythingdMake sure the systemd socket is stopped first, otherwise the socket path may already be in use:
sudo systemctl stop kerythingd.service
sudo systemctl stop kerythingd.socketWhen switching back to normal installed usage:
sudo systemctl daemon-reload
sudo systemctl enable --now kerythingd.socketFor development, live updates can be tested with a mounted filesystem, including a loop device.
A loop device formatted as EXT4 could be created like so:
IMG="$HOME/kerything-test/ext4-test.img"
MNT="/mnt/kerything-test"
mkdir -p "$(dirname "$IMG")"
truncate -s 256M "$IMG"
mkfs.ext4 -F -L KERYTEST "$IMG"
LOOPDEV="$(sudo losetup --find --show "$IMG")"
echo "Loop device: $LOOPDEV"
sudo mkdir -p "$MNT"
sudo mount "$LOOPDEV" "$MNT"
echo "Mounted at: $MNT"
findmnt "$MNT"And later removed with:
sudo umount $MNT
sudo losetup -d $LOOPDEVAfter indexing the mounted device in Kerything, verify:
# Create file
sudo touch /mnt/kerything-test/live-file.txt
# Modify file metadata/content
sudo sh -c 'echo hello >> /mnt/kerything-test/live-file.txt'
# Rename file
sudo mv /mnt/kerything-test/live-file.txt /mnt/kerything-test/live-file-renamed.txt
# Delete file
sudo rm /mnt/kerything-test/live-file-renamed.txt
# Create directory and children
sudo mkdir /mnt/kerything-test/live-dir
sudo touch /mnt/kerything-test/live-dir/a.txt
sudo touch /mnt/kerything-test/live-dir/b.txt
# Rename directory with children
sudo mv /mnt/kerything-test/live-dir /mnt/kerything-test/live-dir-renamed
# Recursive delete
sudo rm -r /mnt/kerything-test/live-dir-renamed
# Symlink
sudo ln -s /mnt/kerything-test /mnt/kerything-test/live-symlink
sudo rm /mnt/kerything-test/live-symlinkExpected behavior:
- New files and folders appear without pressing F5.
- Modified size and timestamp update immediately.
- Renamed files and directories update without losing children.
- Deleted files and recursive directory contents disappear.
- Symlinks are shown with symlink icon and metadata.
- If a live update stream becomes unreliable, Kerything warns that the index may be stale.
sudo touch /mnt/kerything-test/a.txt
sudo mv /mnt/kerything-test/a.txt /mnt/kerything-test/b.txt
sudo mv /mnt/kerything-test/b.txt /mnt/kerything-test/c.txtExpected:
a.txtgoneb.txtgonec.txtpresent
sudo mkdir -p /mnt/kerything-test/one /mnt/kerything-test/two
sudo touch /mnt/kerything-test/one/move-me.txt
sudo mv /mnt/kerything-test/one/move-me.txt /mnt/kerything-test/two/move-me.txtExpected:
oneandtwodirectories createdmove-me.txtexists undertwodirectory, not underonedirectory
sudo mkdir -p /mnt/kerything-test/parent/sub
sudo touch /mnt/kerything-test/parent/sub/child.txt
sudo mv /mnt/kerything-test/parent /mnt/kerything-test/parent-renamedExpected:
child.txtstill appears- its containing path resolves under
parent-renamed/sub
sudo touch /mnt/kerything-test/original-hardlink.txt
sudo ln /mnt/kerything-test/original-hardlink.txt /mnt/kerything-test/second-hardlink.txtExpected:
- Both
original-hardlink.txtandsecond-hardlink.txtshould appear
sudo rm /mnt/kerything-test/second-hardlink.txtExpected:
- Only
second-hardlink.txtshould disappear original-hardlink.txtshould remain
sudo rm /mnt/kerything-test/second-hardlink.txtExpected:
original-hardlink.txtshould disappear
sudo sh -c 'for i in $(seq 1 10000); do echo "$i" >> /mnt/kerything-test/live-growing.txt; done'Generate many creates/deletes:
sudo mkdir -p /mnt/kerything-test/stress
sudo sh -c 'for i in $(seq 1 10000); do touch /mnt/kerything-test/stress/file-$i.txt; done'
sudo sh -c 'for i in $(seq 1 10000); do rm /mnt/kerything-test/stress/file-$i.txt; done'Expected:
stressfolder should appearfile-{number|files should appear then all disappear
Warning
This test writes to your home directory.
TESTROOT="$HOME/kerything-delete-test"
rm -rf "$TESTROOT"
mkdir -p "$TESTROOT/wide"
for i in $(seq 1 10000); do
: > "$TESTROOT/wide/file-$i.tmp"
done
sync
sleep 5
time rm -rf "$TESTROOT/wide"Test CPU utilization:
pidstat -p "$(pidof kerything),$(pidof kerythingd)" 1List loop devices:
losetup -aShow block devices:
lsblk -fWatch mount changes:
findmnt --pollWatch udev events:
udevadm monitor --kernel --udev --subsystem-match=blockEnable KDE Frameworks 6 integration:
-DKERYTHING_WITH_KF6=ONDisable KDE Frameworks 6 integration and use the Qt-only fallback implementation:
-DKERYTHING_WITH_KF6=OFFWhen no flag is specified, it defaults to ON.
Verbose logging is disabled by default.
To enable verbose console logging for debugging, add:
-DKERYTHING_ENABLE_LOGGING=ONFor example:
cmake -B build -S . \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DKERYTHING_WITH_KF6=ON \
-DKERYTHING_ENABLE_LOGGING=ON
cmake --build build --parallelContributions are welcome! Whether it's bug reports, feature requests, or code:
- Fork the repository.
- Create your feature branch (
git checkout -b feature/AmazingFeature). - Commit your changes (
git commit -m 'Add some AmazingFeature'). - Push to the branch (
git push origin feature/AmazingFeature). - Open a Pull Request.
- Additional Quality of Life Improvements: Enhancing user experience and usability with additional searching and filtering options.
- Live Update Expansion: Improve live updates with more advanced recovery behavior.
- Additional Low-Level Scanning Support: Expanding low-level and offline file scanning support to other file systems such as Btrfs and F2FS.
Kerything makes use of the following open-source libraries and frameworks:
- Qt: Cross-platform application framework used for the GUI, IPC, and core application functionality.
- KDE Frameworks: Optional KDE integration for file actions, application launching, file manager integration, and desktop behavior.
- oneTBB: Intel's oneAPI Threading Building Blocks library for parallelism.
- e2fsprogs: Linux filesystem tools and libraries used for EXT4 support.
- util-linux: Provides libraries such as
blkidandmountused for block device and mount information. - systemd / libudev: Used by the daemon to monitor block device changes.
- utfcpp: A simple, portable and lightweight library for handling UTF-8 encoded strings in C++.
This project is licensed under the GPL-3.0-or-later License. See the LICENSE file for details.
