Docs

Everything beyond install — build, configure, internals, troubleshooting, contributing. Install + screenshots + FAQ live on the home page.

Build from source

Standard CMake build. Install KDE Frameworks 6 + Qt 6 dev headers first (see Dependencies), then:

git clone https://github.com/xarbit/plasma6-applet-appgrid.git
cd plasma6-applet-appgrid
cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
cmake --build build -j$(nproc)
sudo cmake --install build
kquitapp6 plasmashell && kstart plasmashell

Pass -DAPPGRID_UNIVERSAL_BUILD=ON to compile in the opt-in update checker (only used by the universal-tarball CI build). Pass -DAPPGRID_VERSION_OVERRIDE=<ver> to bake an explicit version string into the binary (see Versioning).

Arch users: a PKGBUILD ships at the repo root. Build a proper pacman package with makepkg -sf, install via sudo pacman -U.

Dependencies (per distro)

Authoritative dep lists live alongside their packaging spec — keep these in sync with what you actually install.

Core runtime: plasma-workspace, libplasma, kservice, ki18n, kio, kpackage, kcoreaddons, kwindowsystem, krunner, kirigami, layer-shell-qt, plasma-activities, qt6-base, qt6-declarative.

CMake build options

Pass with -D<option>=<value> on the cmake -B build invocation.

OptionDefaultEffect
APPGRID_VERSION_OVERRIDE(empty — derived from git)Bake an explicit version string into the binary. CI passes this for every release so the binary self-reports the exact release tag (see Versioning).
APPGRID_UNIVERSAL_BUILDOFFCompile in the opt-in update checker. ON only for the universal-tarball CI job; distro packages leave this OFF so the package manager handles updates.
ENABLE_X11ONCompile X11-specific session support (frameless window flags + manual screen positioning for the Center variant on X11). Turn OFF for Wayland-only builds (Plasma 6.8+).
BUILD_TESTINGOFFBuild the C++ + QML test suite. See Running the test suite.

Standard CMake options also apply: CMAKE_BUILD_TYPE (Release / RelWithDebInfo / Debug / None), CMAKE_INSTALL_PREFIX (default /usr/local — set to /usr for system installs), KDE_INSTALL_QTPLUGINDIR (override the Qt plugin install path — the Universal Package CI pins this to lib/qt6/plugins).

Configuration reference

Right-click the AppGrid panel icon → Configure AppGrid. Settings marked (Center only) apply only to the AppGrid Center variant; the Panel variant uses Plasma’s native popup for those.

SettingDescriptionDefault
IconPanel icon or custom imagestart-here-kde-symbolic
Icons per row (Center)Columns in the grid7
Visible rows (Center)Rows visible before scrolling4
Icon sizeSmall (32 px), medium (48 px), large (64 px)Large
Sort orderAlphabetical, Most Used, By CategoryMost Used
Open on active screenOpen on mouse focus screen or panel screenOn
Show category barShow or hide the category filter barOn
Search all appsSearch across categories regardless of active tabOn
Start with favoritesOpen showing favorites instead of all appsOff
Use system categoriesUse KDE Menu Editor categoriesOff
Terminal shellShell for t: commands/bin/sh
Hide empty categoriesHide categories with no appsOn
Show divider linesDividers between UI sectionsOn
Show scrollbarsScrollbars in grid and searchOff
Show tooltips on hoverApp description + install source on hoverOn
Open/close animation (Center)None, Fade, Scale, Pop, Slide Up/Down, Glide, Buzz, Twist, SlamScale
Background blur (Center)Blur behind the launcherOn
Dim background (Center)Darken the screen behind the launcherOff
Icon animationNone, Shake, Grow, Bounce, Spin, ShuffleShake
Animate icons on openPlay icon animation when launcher opensOn
Show session buttonsPower / session buttons in the bottom rowOn
Show button labelsText labels on session buttonsOff
KRunner pluginsSearch bookmarks, files, websites via KRunnerOn
Background opacity (Center)Launcher background opacity85%
Corner radius (Center)Custom corner radiusOff (uses Plasma theme)

Favorites storage

AppGrid stores favorites in KDE’s activity-aware favorites backend (KAStatsFavoritesModel, backed by KActivitiesStats from KDE Frameworks). Each AppGrid instance writes to its own client namespace (dev.xarbit.appgrid.favorites.instance-<id>).

What that means in practice:

Upgrading from an earlier version? See the migration notes.

Plasmoid variants & IDs

AppGrid ships as two plasmoids sharing a common C++ codebase but with separate metadata + applet IDs so they can be installed and configured independently.

Both share the same grid, search, categories, quick commands, and favorite storage backend. Settings that don’t make sense for the panel variant (window-level blur, opacity, corner radius, open/close animation, multi-monitor screen selection) are managed by Plasma’s native popup instead and don’t appear in its Configure dialog.

Universal package internals

The Universal Package (appgrid-universal-<version>-<arch>.tar.gz) is built once per release against Fedora 42 (oldest mainstream distro shipping Plasma libs at SONAME 7) and runs on any Plasma 6.4+ system with matching SONAMEs. Install layout:

install.py preflight: refuses to run as root, validates $HOME, rejects existing system-wide installs (with the per-distro uninstall command), checks for plasmashell on PATH, runs ldd against the plugin to confirm every required library resolves (prints the per-distro install command for any missing deps), and mandatorily verifies SHA256SUMS over the payload before writing anything. Override --allow-coexist bypasses the system-wide-install refusal at your own risk.

Full guide bundled in every tarball: packages/universal/INSTALL.TXT.

Update checker — technical

The opt-in update checker (universal-tarball builds only — CMake flag APPGRID_UNIVERSAL_BUILD=ON) lives in src/updatechecker.cpp. Distro packages don’t link this in.

Test coverage: 62 cases in tests/test_updatechecker.cpp (version comparison, URL scheme validation, response-size cap, ETag rotation, state persistence).

Versioning scheme

The binary’s self-reported version (shown in the i: system-info view) is computed at build time by CMakeLists.txt in three priority tiers:

  1. If -DAPPGRID_VERSION_OVERRIDE=<ver> was passed, that wins. CI passes this for every release so the binary string matches the tarball filename + release tag exactly.
  2. Otherwise, if HEAD is exactly a release tag, use CMAKE_PROJECT_VERSION unchanged (e.g. "1.8.0").
  3. Otherwise it’s a local dev build between releases — derive {BASE}-dev.{N}+self.g{SHA} (where N is commits since the last tag and SHA is the 7-char short hash). The +self.g… build-metadata suffix flags the binary as hand-built (not a CI artifact). Per semver, build metadata is ignored for ordering — so update behaviour matches the equivalent CI build of the same git state. Useful in bug reports for telling local vs CI binaries apart at a glance.

Translations

Translation files live in po/ as <lang>/dev.xarbit.appgrid.po. To add or update a translation:

  1. Fork the repo, branch from main.
  2. For a new language: copy po/<closest-lang>/dev.xarbit.appgrid.po into a new po/<your-lang>/ directory; edit the msgstr entries.
  3. For an existing one: edit the .po file directly. Mark fuzzy entries with #, fuzzy until reviewed.
  4. Open a PR — keep changes scoped to translation files only; CI runs gettext validation.

Strings to translate are extracted from QML i18nd("dev.xarbit.appgrid", …) calls and C++ i18n(…) macros. Don’t add new msgid entries by hand — they’ll be regenerated on the next string-extraction pass and lost.

State file locations

Where AppGrid stores things on disk. Useful when debugging, wiping state, or migrating a setup to a new machine.

To wipe everything AppGrid wrote: uninstall (system package or ./uninstall.sh for universal), then delete the cache file + remove the AppGrid widget from your panel (this clears the per-applet config). Favorites in KActivitiesStats can be cleared via System Settings → Activities or by removing every favorite manually from the launcher.

Running the test suite

C++ and QML tests live in tests/. Configure with -DBUILD_TESTING=ON and run via ctest:

cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON
cmake --build build -j$(nproc)
ctest --test-dir build --output-on-failure

Covered:

Open a PR with new tests when you fix a bug — CI runs ctest on every push.

Help & troubleshooting

Upgrading from AppGrid 1.7.x

1.8.0 migrates favorites to KDE’s activity-aware backend (KAStatsFavoritesModel — see Favorites storage). On first launch, AppGrid reads your existing legacy favoriteApps list and ports those entries into the new backend. The legacy list is kept as a backup so the migration is non-destructive — the flag favoritesPortedToKAstats in the plasmoid config tracks whether it has run.

If favorites look wrong after upgrading (missing entries, empty, ordering off): type i: in the search bar to open the system-info view. It shows the current migration status — KAStats entry count plus the legacy backup count — and a Re-run migration button. Clicking it clears the migration flag; on next open AppGrid recomputes the favorites list as the union of the legacy backup and current KAStats entries. Nothing is lost — missing legacy items are re-added.

If the entry counts in the i: view themselves look wrong, restart plasmashell to force a fresh model load: kquitapp6 plasmashell && kstart plasmashell.

Switching from a distro package to the Universal Package

Plasma can’t reliably load two copies of the same applet ID — uninstall the system package first, then run the universal installer. The bundled install.py detects the conflict and prints the matching uninstall command for your distro before doing anything.

Override with ./install.sh --allow-coexist at your own risk — Plasma will still load whichever plasmoid wins discovery on next session start, usually the system one.

Switching from the Universal Package back to a distro package

Run the bundled ./uninstall.sh from the tarball directory first — it reads ~/.local/share/appgrid/MANIFEST and removes only the files it placed. Then install the distro package the normal way. The ~/.config/plasma-workspace/env/appgrid-user-local.sh env script is removed too, so you do need one log-out / log-in after the swap.

AppGrid doesn’t show up after installing

  1. Restart plasmashell: kquitapp6 plasmashell && kstart plasmashell
  2. For the Universal Package specifically: log out + back in once on first install (Plasma needs to re-read its session env to pick up the new QT_PLUGIN_PATH).
  3. Right-click your panel launcher → Show Alternatives — AppGrid should appear in the list.
  4. If it’s still missing: check the installer’s ldd probe output for unresolved libraries (Universal Package), or journalctl --user -b | grep -i plasma for load errors.

Getting logs & debugging

AppGrid logs through Qt’s normal channels — there’s no separate log file. All messages surface in plasmashell’s journal. Every message AppGrid emits is prefixed with AppGrid: so it’s easy to filter.

Tail the plasmashell journal live:

journalctl --user -f -t plasmashell

Filter to AppGrid messages only:

journalctl --user -b -t plasmashell | grep AppGrid

Plugin loading problems (plasmoid doesn’t appear, “Couldn’t find plugin” errors): restart plasmashell with verbose Qt plugin logging attached to a terminal — this prints every plugin directory Qt scans and why each candidate is loaded or rejected.

kquitapp6 plasmashell
QT_DEBUG_PLUGINS=1 plasmashell --replace 2>&1 | tee plasmashell.log

For QML import errors specifically, add QML_IMPORT_TRACE=1 too. Both env vars are extremely noisy — only use for one-off debugging sessions.

Universal installer / uninstaller debugging: install.py and uninstall.py print every step to stdout; pass --dry-run to install.py to see what it would do without writing anything. Errors exit with non-zero status — pipe to a file with ./install.sh 2>&1 | tee install.log.

Update checker: inspect the cache file directly to see what the last check stored: cat ~/.cache/plasmashell/dev.xarbit.appgrid.update-checker.json. Force an immediate check by toggling the setting off and on (Configure AppGrid → Check the AppGrid website for new releases).

Test the plasmoid in isolation without restarting your whole Plasma session — useful for QML-only changes:

plasmoidviewer -a dev.xarbit.appgrid

Reporting a bug

Type i: in the search bar to open the system-info view, then click Copy — you’ll get a paste-ready report with your AppGrid version, install type (distro vs universal), Plasma version, Qt version, KF6 version, distro, and architecture. Attach it to the issue.

Open a new issue →