Common Errors
This appendix catalogs the most common errors you'll encounter while building a Quickshell shell, along with their causes and solutions.
QML Errors
"module "Quickshell" is not installed"
qrc:/shell.qml:1:1: module "Quickshell" is not installedCause: Quickshell is not installed, or the QML import path doesn't include Quickshell.
Solution: Install Quickshell:
# From source
cmake --build build && cmake --install build
# Arch Linux
yay -S quickshell-git
# Nix
nix profile install github:outfoxxed/quickshell"Cannot assign to non-existent property"
qrc:/components/bar.qml:42: ReferenceError: foo is not definedCause: Typo in property name, or property doesn't exist on the object.
Solution: Check the property name in the Quickshell documentation. Common typos: visibile → visible, postition → position, backgrund → background.
"TypeError: Property 'volume' of object AudioService is not a function"
qrc:/services/audio.qml:15: TypeError: Property 'volume' of object AudioService is not a functionCause: Calling a property as a function.
Solution: Read properties, call methods:
// Correct
var vol = AudioService.volume
// Incorrect
var vol = AudioService.volume()"Maximum call stack size exceeded"
qrc:/components/top-bar.qml:15: RangeError: Maximum call stack size exceededCause: Circular binding or infinite recursion.
Solution: Avoid bindings that reference themselves directly or indirectly:
// Bad: circular binding
property int a: b + 1
property int b: a + 1
// Good: independent properties
property int a: 5
property int b: a + 1Runtime Errors
PopupWindow not showing
Cause: Missing anchor.window or incorrect anchor configuration.
Solution:
PopupWindow {
anchor.window: topBar // Must reference a valid Window
visible: true
}Process execution fails silently
Cause: Command not found, or process exits with error but output is not checked.
Solution:
Qt.process(["which", "swww"]).onExit.connect(function(code) {
if (code !== 0) {
console.warn("swww not available, using fallback")
}
})Timer not firing
Cause: Timer is not running, or interval is 0.
Solution:
Timer {
interval: 1000 // Must be > 0
running: true // Must be set to true
repeat: true
onTriggered: { /* your code */ }
}Configuration Errors
config.json not found
Cause: Shell starts but config file is missing.
Solution: Provide defaults:
property var config: ({})
Component.onCompleted: {
Qt.process(["cat", Quickshell.configPath("config.json")])
.onStdout.connect(function(data) {
config = JSON.parse(data)
})
}Duplicate import paths
Cause: Same path added multiple times to QML2_IMPORT_PATH.
Solution: Check for duplicates:
echo $QML2_IMPORT_PATH | tr ':' '\n' | sort -uDebugging Checklist
When something doesn't work:
- Check the terminal for error messages
- Verify Quickshell is installed:
which quickshell - Check the import path:
echo $QML2_IMPORT_PATH - Test with a minimal
shell.qmlthat only shows a window - Add
console.log()statements to narrow down the issue - Check the Quickshell GitHub issues for similar problems
- Ask in the Quickshell Discord (#help channel)
Exercises
- Most QML errors are typos or incorrect property names
- Check Process exit codes — failures often go silent
- Verify Timer has interval > 0 and running: true
- Debug with minimal reproductions before asking for help