aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-18 10:35:42 +0200
committerDanilo M. <danix@danix.xyz>2026-10-18 10:35:42 +0200
commita120bb98a809a60d81cf0aed4e81ed39e085fe2b (patch)
tree4e661da5a8830a3ce51c3b4d66f1d84bcc1c98f8
parent0c08bffaca0b4b3b94d4c5484a86e8856f5e000a (diff)
downloadquickshell-a120bb98a809a60d81cf0aed4e81ed39e085fe2b.tar.gz
quickshell-a120bb98a809a60d81cf0aed4e81ed39e085fe2b.zip
Name the project Keystone, and move its paths and namespaces
The repository had no name of its own, only the framework's. It is now Keystone, in the README, AGENTS.md, the settings window, notes commit messages, calctl's PRODID and the user page's User-Agent. Its files move off quickshell's name too: ~/.config/quickshell/greetings -> ~/.config/keystone/ ~/.config/quickshell/obs-scene-icons.json -> ~/.config/keystone/ $XDG_STATE_HOME/quickshell/desktop.json -> $XDG_STATE_HOME/keystone/ ~/.config/quickshell is Quickshell's own default config directory (a bare qs loads its shell.qml), so sharing it was a collision rather than a home. There is no fallback to the old paths: the files are moved once. The layer namespaces become keystone-*, and the Hyprland blur rules in hypr-theme are renamed to match in the same change. A running shell keeps its old namespaces until restarted. Left alone: the retired standalone mail and vm shells' namespaces, which their READMEs keep as history; Quickshell's own app id, binary and process name; and the repository directory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
-rw-r--r--AGENTS.md10
-rw-r--r--README.md9
-rw-r--r--desktop/Drawer.qml2
-rw-r--r--desktop/Prefs.qml2
-rw-r--r--desktop/README.md6
-rw-r--r--desktop/assistant/Assistant.qml2
-rw-r--r--desktop/island/Island.qml2
-rw-r--r--desktop/island/README.md6
-rw-r--r--desktop/island/SceneIcons.qml2
-rwxr-xr-xdesktop/island/calendar/calctl2
-rw-r--r--desktop/modules/appearance/StepsWindow.qml2
-rw-r--r--desktop/modules/mail/README.md2
-rw-r--r--desktop/modules/notes/NotesModule.qml6
-rw-r--r--desktop/modules/obs/README.md2
-rw-r--r--desktop/modules/perf/README.md2
-rw-r--r--desktop/modules/sound/Osd.qml2
-rw-r--r--desktop/modules/sound/README.md4
-rw-r--r--desktop/modules/user/README.md2
-rw-r--r--desktop/modules/user/User.js2
-rw-r--r--desktop/modules/user/UserPage.qml2
-rw-r--r--desktop/modules/user/UserRow.qml2
-rw-r--r--desktop/modules/vm/README.md2
-rw-r--r--keybinds/Keybinds.qml2
-rw-r--r--keybinds/README.md2
-rw-r--r--notifications/Balloons.qml2
-rw-r--r--notifications/README.md2
-rw-r--r--window-switcher/HotCorner.qml2
-rw-r--r--window-switcher/README.md2
-rw-r--r--window-switcher/Switcher.qml2
29 files changed, 44 insertions, 43 deletions
diff --git a/AGENTS.md b/AGENTS.md
index 65f66a9..eb35dfe 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -4,7 +4,7 @@ Guidance for agents working in this repository.
## What this is
-Quickshell components for a Hyprland desktop. The repo is a hybrid: `desktop/`
+Keystone: Quickshell components for a Hyprland desktop. The repo is a hybrid: `desktop/`
is the integrated process, hosting the parts that need to talk to each other,
the drawer, which is the control center, the island, and the assistant
canvas. The other directories stay separate shells, each complete on its own:
@@ -166,8 +166,8 @@ changing that component. The ones that generalise:
drawer.
- **`FileView.setText` creates missing parent directories**, so `Prefs.qml`
has no mkdir step. `Quickshell.stateDir` is a per-shell hashed directory
- (`by-shell/<hash>`), not `~/.local/state/quickshell`, which is why the
- preferences path is built from `XDG_STATE_HOME` instead.
+ (`by-shell/<hash>`), not a plain directory, which is why the preferences
+ path, `$XDG_STATE_HOME/keystone/desktop.json`, is built by hand instead.
- **`FileView.setText("")` on a path that view has not loaded writes no file at
all and reports no error**, with or without `atomicWrites` (measured).
`Prefs.qml` never hits it because JSON is never empty; a note body can be, and
@@ -439,9 +439,9 @@ backdrop never dimmed it. Waybar is gone, so the `desktop` drawer now starts at
the top edge of DP-1 and keeps `Normal` so a bar added later is respected.
Components that cover the whole screen use `ExclusionMode.Ignore`.
-`window-switcher` has namespace `quickshell-window-switcher` and a
+`window-switcher` has namespace `keystone-window-switcher` and a
`blur-window-switcher` rule of its own. The island has namespace
-`quickshell-island` and a `blur-island` rule.
+`keystone-island` and a `blur-island` rule.
## Reloading
diff --git a/README.md b/README.md
index 1141645..d06723c 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,9 @@
-# quickshell
+# Keystone
-Quickshell components for a Hyprland desktop, each one self-contained in its
-own directory. `desktop/` is the integrated one: a single process hosting the
-drawer and the island, and later a control panel, which its own README covers.
+Keystone is a set of Quickshell components for a Hyprland desktop, each one
+self-contained in its own directory. `desktop/` is the integrated one: a single
+process hosting the drawer and the island, and later a control panel, which its
+own README covers.
The rest are separate shells: any of them can run alone, and running one does
not require the others.
diff --git a/desktop/Drawer.qml b/desktop/Drawer.qml
index 0458418..93493cc 100644
--- a/desktop/Drawer.qml
+++ b/desktop/Drawer.qml
@@ -124,7 +124,7 @@ Scope {
exclusionMode: ExclusionMode.Normal
WlrLayershell.layer: WlrLayer.Overlay
- WlrLayershell.namespace: "quickshell-desktop"
+ WlrLayershell.namespace: "keystone-desktop"
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
// The click-outside catcher. It covers the whole surface, and the
diff --git a/desktop/Prefs.qml b/desktop/Prefs.qml
index ba567c4..0ed6ee9 100644
--- a/desktop/Prefs.qml
+++ b/desktop/Prefs.qml
@@ -26,7 +26,7 @@ Singleton {
readonly property string path:
(Quickshell.env("XDG_STATE_HOME") || Quickshell.env("HOME") + "/.local/state")
- + "/quickshell/desktop.json"
+ + "/keystone/desktop.json"
// The public IP the user pinned from the performance panel; "" for none.
property string pinnedIp: ""
diff --git a/desktop/README.md b/desktop/README.md
index aa105a9..bffd9b1 100644
--- a/desktop/README.md
+++ b/desktop/README.md
@@ -185,18 +185,18 @@ the clipboard does after a copy; `back` returns to the grid.
## Hyprland
Nothing here is in the repo's control, and the drawer works without it. Frosting is the compositor's, matched on the namespace this window sets. The
-drawer sets `quickshell-desktop`, so it needs:
+drawer sets `keystone-desktop`, so it needs:
hl.layer_rule({
name = "blur-desktop",
- match = { namespace = "^(quickshell-desktop)$" },
+ match = { namespace = "^(keystone-desktop)$" },
blur = true,
xray = false,
ignore_alpha = 0.1,
})
The sound module's OSD owns its own window and keeps its old
-`quickshell-volume-osd` namespace, so the existing `blur-volume-osd` rule still
+`keystone-volume-osd` namespace, so the existing `blur-volume-osd` rule still
matches and stays. Without these the surfaces still render, just flat
translucent.
diff --git a/desktop/assistant/Assistant.qml b/desktop/assistant/Assistant.qml
index cc1d3d5..340c0cf 100644
--- a/desktop/assistant/Assistant.qml
+++ b/desktop/assistant/Assistant.qml
@@ -414,7 +414,7 @@ Scope {
color: Qt.alpha(Theme.crust, 0.35)
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Overlay
- WlrLayershell.namespace: "quickshell-assistant"
+ WlrLayershell.namespace: "keystone-assistant"
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
MouseArea { anchors.fill: parent; onClicked: root.close() }
diff --git a/desktop/island/Island.qml b/desktop/island/Island.qml
index 04a6350..754a3d0 100644
--- a/desktop/island/Island.qml
+++ b/desktop/island/Island.qml
@@ -39,7 +39,7 @@ PanelWindow {
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Overlay
- WlrLayershell.namespace: "quickshell-island"
+ WlrLayershell.namespace: "keystone-island"
WlrLayershell.keyboardFocus: panel !== "" ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
// "", "sound", "calendar" or "obs".
diff --git a/desktop/island/README.md b/desktop/island/README.md
index 7bd7b10..9c33f41 100644
--- a/desktop/island/README.md
+++ b/desktop/island/README.md
@@ -88,7 +88,7 @@ four columns of icon tiles, current one highlighted, click to switch. In a
scene whose only source is a PipeWire capture (the window scene), a Window
button opens that source's properties, where OBS's portal picker chooses the
window. The scene glyphs come from
-`~/.config/quickshell/obs-scene-icons.json`, watched and edited from the
+`~/.config/keystone/obs-scene-icons.json`, watched and edited from the
settings window's "OBS scenes" page; an unmapped scene shows `?`. While
recording the sliver pulses red, and holds dim while paused.
@@ -144,12 +144,12 @@ because udt can snap the accent to the same colour as a capture kind.
## Blur
-The window sets namespace `quickshell-island`. For frosting, add to
+The window sets namespace `keystone-island`. For frosting, add to
`~/.config/hypr/sections/decorations.lua`:
hl.layer_rule({
name = "blur-island",
- match = { namespace = "^(quickshell-island)$" },
+ match = { namespace = "^(keystone-island)$" },
blur = true,
xray = false,
ignore_alpha = 0.1,
diff --git a/desktop/island/SceneIcons.qml b/desktop/island/SceneIcons.qml
index b8fe6b8..ebacca6 100644
--- a/desktop/island/SceneIcons.qml
+++ b/desktop/island/SceneIcons.qml
@@ -23,7 +23,7 @@ Singleton {
readonly property string path:
(Quickshell.env("XDG_CONFIG_HOME") || Quickshell.env("HOME") + "/.config")
- + "/quickshell/obs-scene-icons.json"
+ + "/keystone/obs-scene-icons.json"
property var map: Icons.defaults
diff --git a/desktop/island/calendar/calctl b/desktop/island/calendar/calctl
index e9cfb93..ce98098 100755
--- a/desktop/island/calendar/calctl
+++ b/desktop/island/calendar/calctl
@@ -413,7 +413,7 @@ def cmd_new(text):
p = parse_payload(text, cals)
uid = str(uuid.uuid4())
ics = icalendar.Calendar()
- ics.add("PRODID", "-//quickshell//calctl//EN")
+ ics.add("PRODID", "-//keystone//calctl//EN")
ics.add("VERSION", "2.0")
ev = icalendar.Event()
ev.add("UID", uid)
diff --git a/desktop/modules/appearance/StepsWindow.qml b/desktop/modules/appearance/StepsWindow.qml
index 7349fcd..aeb77fe 100644
--- a/desktop/modules/appearance/StepsWindow.qml
+++ b/desktop/modules/appearance/StepsWindow.qml
@@ -59,7 +59,7 @@ Scope {
color: "transparent"
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Top
- WlrLayershell.namespace: "quickshell-steps"
+ WlrLayershell.namespace: "keystone-steps"
WlrLayershell.keyboardFocus: WlrKeyboardFocus.OnDemand
Rectangle {
diff --git a/desktop/modules/mail/README.md b/desktop/modules/mail/README.md
index b6a3159..2349da6 100644
--- a/desktop/modules/mail/README.md
+++ b/desktop/modules/mail/README.md
@@ -5,7 +5,7 @@
> from the drawer, or deep-link with `qs -p desktop ipc call drawer open mail`.
> The scripts live under `desktop/modules/mail/`. See `desktop/README.md`; the
> `blur-mail` namespace in the Theme section below is historical, since this
-> page now rides the drawer's `quickshell-desktop` surface.
+> page now rides the drawer's `keystone-desktop` surface.
Unread mail across every account, as a tile and a page in the drawer.
Opening the page shows the accounts; Escape or a click outside closes it.
diff --git a/desktop/modules/notes/NotesModule.qml b/desktop/modules/notes/NotesModule.qml
index 992cbfa..3066c8a 100644
--- a/desktop/modules/notes/NotesModule.qml
+++ b/desktop/modules/notes/NotesModule.qml
@@ -326,9 +326,9 @@ Module {
}
function msg(kind, id) {
- if (kind === "create") return "quickshell - adding note from " + mod.client;
- if (kind === "edit") return "quickshell - " + mod.client + " note edited.";
- return "quickshell - " + mod.client + " removing note ID " + id + ".";
+ if (kind === "create") return "keystone - adding note from " + mod.client;
+ if (kind === "edit") return "keystone - " + mod.client + " note edited.";
+ return "keystone - " + mod.client + " removing note ID " + id + ".";
}
// The second click of Save or Delete: stage everything, commit when there
diff --git a/desktop/modules/obs/README.md b/desktop/modules/obs/README.md
index c114192..ee29307 100644
--- a/desktop/modules/obs/README.md
+++ b/desktop/modules/obs/README.md
@@ -1,7 +1,7 @@
# OBS scenes
The settings page for the island's OBS pill. It edits
-`~/.config/quickshell/obs-scene-icons.json`, the same watched file the pill
+`~/.config/keystone/obs-scene-icons.json`, the same watched file the pill
reads, so saving recolours the scene grid with no restart.
One row per scene: the scene name and a field holding its glyph. Find an icon
diff --git a/desktop/modules/perf/README.md b/desktop/modules/perf/README.md
index bd9ebfb..236f5b4 100644
--- a/desktop/modules/perf/README.md
+++ b/desktop/modules/perf/README.md
@@ -20,7 +20,7 @@ The tile shows CPU and RAM, and a dot for the worst of these, yellow or red:
CPU load is left out, since spikes would flicker it. There is no hysteresis,
so a sensor sitting on its threshold can toggle the dot. The pin beside the
public IP stores the address shown as `perf.pinnedIp` in
-`$XDG_STATE_HOME/quickshell/desktop.json`; the check exists because the VPN
+`$XDG_STATE_HOME/keystone/desktop.json`; the check exists because the VPN
into the LAN depends on the ISP's fixed address. The fetch is
`curl -4 https://ipinfo.io/ip` every 30 minutes from the last attempt, into
`~/.cache/udt/pubip.txt`, the file conky's sampler used. A failed fetch is
diff --git a/desktop/modules/sound/Osd.qml b/desktop/modules/sound/Osd.qml
index 8f7b477..f60f5ce 100644
--- a/desktop/modules/sound/Osd.qml
+++ b/desktop/modules/sound/Osd.qml
@@ -68,7 +68,7 @@ Scope {
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Overlay
- WlrLayershell.namespace: "quickshell-volume-osd"
+ WlrLayershell.namespace: "keystone-volume-osd"
// Still no keyboard focus: the transport buttons are pointer targets,
// and the OSD must never take keys from the window being typed in.
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
diff --git a/desktop/modules/sound/README.md b/desktop/modules/sound/README.md
index 365be4a..c3ada08 100644
--- a/desktop/modules/sound/README.md
+++ b/desktop/modules/sound/README.md
@@ -129,11 +129,11 @@ unified-desktop-theme already installs, covers them.
The panel is drawn translucent (65% over the Macchiato base) and the blur
behind it comes from the compositor, not from QML. Hyprland blurs a layer
surface only when a rule says to, matched on the namespace this window sets
-(`quickshell-volume-osd`):
+(`keystone-volume-osd`):
hl.layer_rule({
name = "blur-volume-osd",
- match = { namespace = "^(quickshell-volume-osd)$" },
+ match = { namespace = "^(keystone-volume-osd)$" },
blur = true,
xray = false,
ignore_alpha = 0.1,
diff --git a/desktop/modules/user/README.md b/desktop/modules/user/README.md
index 0100da1..38cc43a 100644
--- a/desktop/modules/user/README.md
+++ b/desktop/modules/user/README.md
@@ -21,7 +21,7 @@ shows the name and email git will get, read-only, and the signing key;
(`../git/`).
The greeting is picked at random on each drawer open, never the same one
-twice running, from `~/.config/quickshell/greetings`: one per line, `{user}`
+twice running, from `~/.config/keystone/greetings`: one per line, `{user}`
for the login name, `#` comments and blank lines skipped. Without the file,
five built-in ones.
diff --git a/desktop/modules/user/User.js b/desktop/modules/user/User.js
index dc48209..b96437d 100644
--- a/desktop/modules/user/User.js
+++ b/desktop/modules/user/User.js
@@ -63,7 +63,7 @@ function places(text) {
return out;
}
-// The drawer's greeting, from ~/.config/quickshell/greetings: one per line,
+// The drawer's greeting, from ~/.config/keystone/greetings: one per line,
// {user} for the login name, blank lines and # comments skipped. A missing or
// empty file is the built-in set. The row is rebuilt on every drawer open, so
// the last pick lives here, in the shared library, to never show the same one
diff --git a/desktop/modules/user/UserPage.qml b/desktop/modules/user/UserPage.qml
index 1cc0c1e..abcb116 100644
--- a/desktop/modules/user/UserPage.qml
+++ b/desktop/modules/user/UserPage.qml
@@ -177,7 +177,7 @@ Column {
const seq = ++form.placeSeq;
const lang = (Quickshell.env("LANG") || "en").slice(0, 2);
form.run(["curl", "-sf", "--max-time", "5",
- "-A", "quickshell-drawer/1.0 (user details page)",
+ "-A", "keystone-drawer/1.0 (user details page)",
"https://nominatim.openstreetmap.org/search?format=jsonv2&addressdetails=1&limit=6"
+ "&accept-language=" + lang + "&q=" + encodeURIComponent(form.placeQuery)],
out => { if (seq === form.placeSeq) form.places = U.places(out); });
diff --git a/desktop/modules/user/UserRow.qml b/desktop/modules/user/UserRow.qml
index 311c6df..f9833e4 100644
--- a/desktop/modules/user/UserRow.qml
+++ b/desktop/modules/user/UserRow.qml
@@ -42,7 +42,7 @@ Rectangle {
// shows on the next one with no watch.
property string greeting: "Hello " + Quickshell.env("USER")
FileView {
- path: (Quickshell.env("XDG_CONFIG_HOME") || Quickshell.env("HOME") + "/.config") + "/quickshell/greetings"
+ path: (Quickshell.env("XDG_CONFIG_HOME") || Quickshell.env("HOME") + "/.config") + "/keystone/greetings"
printErrors: false
onLoaded: row.greeting = U.greeting(text(), Quickshell.env("USER"))
onLoadFailed: row.greeting = U.greeting("", Quickshell.env("USER"))
diff --git a/desktop/modules/vm/README.md b/desktop/modules/vm/README.md
index ae656e3..43a3271 100644
--- a/desktop/modules/vm/README.md
+++ b/desktop/modules/vm/README.md
@@ -5,7 +5,7 @@
> from the drawer, or deep-link with `qs -p desktop ipc call drawer open vm`.
> See `desktop/README.md`; the `blur-vm-manager` namespace in the Theme section
> below is historical, since this page now rides the drawer's
-> `quickshell-desktop` surface.
+> `keystone-desktop` surface.
A drawer for libvirt virtual machines: state, live statistics, the actions
that make sense in the current state, and the snapshot list. It replaces the
diff --git a/keybinds/Keybinds.qml b/keybinds/Keybinds.qml
index 11f0430..2b50093 100644
--- a/keybinds/Keybinds.qml
+++ b/keybinds/Keybinds.qml
@@ -78,7 +78,7 @@ Scope {
color: "transparent"
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Overlay
- WlrLayershell.namespace: "quickshell-keybinds"
+ WlrLayershell.namespace: "keystone-keybinds"
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
// Keys reach a focused item, not a window.
diff --git a/keybinds/README.md b/keybinds/README.md
index 11244d5..ef383b9 100644
--- a/keybinds/README.md
+++ b/keybinds/README.md
@@ -39,7 +39,7 @@ Optional, in the Hyprland config:
hl.layer_rule({
name = "blur-keybinds",
- match = { namespace = "^(quickshell-keybinds)$" },
+ match = { namespace = "^(keystone-keybinds)$" },
blur = true,
xray = false,
ignore_alpha = 0.1,
diff --git a/notifications/Balloons.qml b/notifications/Balloons.qml
index d22e4a1..0a48510 100644
--- a/notifications/Balloons.qml
+++ b/notifications/Balloons.qml
@@ -86,7 +86,7 @@ Scope {
color: "transparent"
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Overlay
- WlrLayershell.namespace: "quickshell-notifications"
+ WlrLayershell.namespace: "keystone-notifications"
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
Column {
diff --git a/notifications/README.md b/notifications/README.md
index 91fb758..36df6da 100644
--- a/notifications/README.md
+++ b/notifications/README.md
@@ -23,7 +23,7 @@ draw but close and actions do nothing.
## Blur
Hyprland blurs a layer surface only when a rule names its namespace. This
-component sets `quickshell-notifications`; the rule is in
+component sets `keystone-notifications`; the rule is in
`~/.config/hypr/sections/decorations.lua`.
## History rows
diff --git a/window-switcher/HotCorner.qml b/window-switcher/HotCorner.qml
index eebcf05..4031c3c 100644
--- a/window-switcher/HotCorner.qml
+++ b/window-switcher/HotCorner.qml
@@ -33,7 +33,7 @@ PanelWindow {
color: "transparent"
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Overlay
- WlrLayershell.namespace: "quickshell-hot-corner"
+ WlrLayershell.namespace: "keystone-hot-corner"
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
// Off while a game runs. Read straight from the status registry's file:
diff --git a/window-switcher/README.md b/window-switcher/README.md
index 66e6f69..a0e72f4 100644
--- a/window-switcher/README.md
+++ b/window-switcher/README.md
@@ -192,7 +192,7 @@ Frosting is Hyprland's, matched on this window's namespace:
hl.layer_rule({
name = "blur-window-switcher",
- match = { namespace = "^(quickshell-window-switcher)$" },
+ match = { namespace = "^(keystone-window-switcher)$" },
blur = true,
xray = false,
ignore_alpha = 0.1,
diff --git a/window-switcher/Switcher.qml b/window-switcher/Switcher.qml
index bd5c607..e6eb792 100644
--- a/window-switcher/Switcher.qml
+++ b/window-switcher/Switcher.qml
@@ -76,7 +76,7 @@ Scope {
color: "transparent"
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Overlay
- WlrLayershell.namespace: "quickshell-window-switcher"
+ WlrLayershell.namespace: "keystone-window-switcher"
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
// Keys reach a focused item, not a window: Keys.onEscapePressed on