SVG icon set
git clone https://git.lucas.co/cce-icons.git
apps: cce's own icons for every third-party app the launcher lists
54 glyphs under svg/apps/, in the house language (white, back layers at
0.55, lighting facets at 0.7/0.42, dark accents at 0.35), installed into
hicolor/scalable/apps under 75 names. Most are named for the entry's Icon=
value and so beat the vendor icon in /usr/share for any lookup; the ones
whose Icon= is an absolute path, missing or generic (Houdini, Raindrop,
the Avahi browsers, qt5ct/qt6ct, ...) are named for the desktop-file ID,
which cce-cloud checks first. The README says which is which and why.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hicolor/README.md | 29 ++++++++++++++++++++++
hicolor/scalable/apps/1password.svg | 1 +
hicolor/scalable/apps/CMakeSetup.svg | 1 +
hicolor/scalable/apps/Zoom.svg | 1 +
hicolor/scalable/apps/antigravity.svg | 1 +
hicolor/scalable/apps/assistant.svg | 1 +
hicolor/scalable/apps/avahi-discover.svg | 1 +
hicolor/scalable/apps/betterbird.svg | 1 +
hicolor/scalable/apps/bssh.svg | 1 +
hicolor/scalable/apps/btop.svg | 1 +
hicolor/scalable/apps/bvnc.svg | 1 +
...me-kajebgjangihfbkjfejcanhanjmmbcfd-Default.svg | 1 +
hicolor/scalable/apps/claude-desktop.svg | 1 +
hicolor/scalable/apps/com.mitchellh.ghostty.svg | 1 +
.../scalable/apps/com.sidefx.houdini22.0.429.svg | 1 +
hicolor/scalable/apps/cups.svg | 1 +
hicolor/scalable/apps/designer.svg | 1 +
hicolor/scalable/apps/dropbox.svg | 1 +
hicolor/scalable/apps/electron36.svg | 1 +
hicolor/scalable/apps/firefox.svg | 1 +
hicolor/scalable/apps/foot.svg | 1 +
hicolor/scalable/apps/gammastep.svg | 1 +
hicolor/scalable/apps/gimp.svg | 1 +
hicolor/scalable/apps/google-chrome.svg | 1 +
hicolor/scalable/apps/gucharmap.svg | 1 +
hicolor/scalable/apps/houdini-nvidia.svg | 1 +
hicolor/scalable/apps/houdini.svg | 1 +
hicolor/scalable/apps/htop.svg | 1 +
hicolor/scalable/apps/hwloc.svg | 1 +
hicolor/scalable/apps/keepassxc.svg | 1 +
hicolor/scalable/apps/linguist.svg | 1 +
hicolor/scalable/apps/mpv.svg | 1 +
hicolor/scalable/apps/nnn.svg | 1 +
hicolor/scalable/apps/nordvpn-gui.svg | 1 +
hicolor/scalable/apps/nvidia-settings.svg | 1 +
hicolor/scalable/apps/nvim.svg | 1 +
hicolor/scalable/apps/nvtop.svg | 1 +
hicolor/scalable/apps/obsidian.svg | 1 +
hicolor/scalable/apps/org.fontforge.FontForge.svg | 1 +
hicolor/scalable/apps/org.inkscape.Inkscape.svg | 1 +
hicolor/scalable/apps/pacseek.svg | 1 +
hicolor/scalable/apps/protontricks.svg | 1 +
hicolor/scalable/apps/qdbusviewer.svg | 1 +
hicolor/scalable/apps/qt5ct.svg | 1 +
hicolor/scalable/apps/qt6ct.svg | 1 +
hicolor/scalable/apps/qutebrowser.svg | 1 +
hicolor/scalable/apps/qv4l2.svg | 1 +
hicolor/scalable/apps/qvidcap.svg | 1 +
hicolor/scalable/apps/raindropio.svg | 1 +
hicolor/scalable/apps/sidefx-launcher.svg | 1 +
hicolor/scalable/apps/steam.svg | 1 +
hicolor/scalable/apps/ubisoft-connect.svg | 1 +
hicolor/scalable/apps/uxplay.svg | 1 +
hicolor/scalable/apps/winetricks.svg | 1 +
hicolor/scalable/apps/xgps.svg | 1 +
hicolor/scalable/apps/xgpsspeed.svg | 1 +
hicolor/scalable/apps/xscreensaver.svg | 1 +
hicolor/scalable/apps/zed.svg | 1 +
hicolor/scalable/apps/zellij.svg | 1 +
svg/apps/1password.svg | 5 ++++
svg/apps/airplay.svg | 5 ++++
svg/apps/antigravity.svg | 5 ++++
svg/apps/anvil.svg | 6 +++++
svg/apps/betterbird.svg | 7 ++++++
svg/apps/book.svg | 5 ++++
svg/apps/btop.svg | 5 ++++
svg/apps/character-map.svg | 5 ++++
svg/apps/claude.svg | 18 ++++++++++++++
svg/apps/cmake.svg | 8 ++++++
svg/apps/dropbox.svg | 10 ++++++++
svg/apps/electron.svg | 9 +++++++
svg/apps/firefox.svg | 6 +++++
svg/apps/foot.svg | 11 ++++++++
svg/apps/form-designer.svg | 10 ++++++++
svg/apps/ghostty.svg | 5 ++++
svg/apps/gimp.svg | 6 +++++
svg/apps/google-chrome.svg | 11 ++++++++
svg/apps/gpu.svg | 13 ++++++++++
svg/apps/houdini.svg | 4 +++
svg/apps/htop.svg | 5 ++++
svg/apps/inkscape.svg | 6 +++++
svg/apps/key.svg | 10 ++++++++
svg/apps/mpv.svg | 6 +++++
svg/apps/neovim.svg | 8 ++++++
svg/apps/nnn.svg | 6 +++++
svg/apps/nordvpn.svg | 5 ++++
svg/apps/nvidia.svg | 6 +++++
svg/apps/obsidian.svg | 9 +++++++
svg/apps/package-search.svg | 10 ++++++++
svg/apps/password-field.svg | 9 +++++++
svg/apps/printer.svg | 8 ++++++
svg/apps/protontricks.svg | 8 ++++++
svg/apps/qutebrowser.svg | 9 +++++++
svg/apps/raindrop.svg | 5 ++++
svg/apps/satellite.svg | 15 +++++++++++
svg/apps/screensaver.svg | 10 ++++++++
svg/apps/speedometer.svg | 6 +++++
svg/apps/steam.svg | 7 ++++++
svg/apps/sunset.svg | 16 ++++++++++++
svg/apps/theme-settings.svg | 13 ++++++++++
svg/apps/topology.svg | 12 +++++++++
svg/apps/translate.svg | 7 ++++++
svg/apps/tree.svg | 9 +++++++
svg/apps/ubisoft.svg | 6 +++++
svg/apps/video-camera.svg | 5 ++++
svg/apps/video-capture.svg | 6 +++++
svg/apps/webcam.svg | 7 ++++++
svg/apps/winetricks.svg | 8 ++++++
svg/apps/zed.svg | 5 ++++
svg/apps/zellij.svg | 8 ++++++
svg/apps/zeroconf-ssh.svg | 9 +++++++
svg/apps/zeroconf-vnc.svg | 9 +++++++
svg/apps/zeroconf.svg | 8 ++++++
113 files changed, 517 insertions(+)
diff --git a/hicolor/README.md b/hicolor/README.md
index f1b1282..ca79eb4 100644
--- a/hicolor/README.md
+++ b/hicolor/README.md
@@ -35,3 +35,32 @@ dereferences it and writes a real file to the destination.
2. `ln -s ../../../svg/<glyph>.svg cce-<app>.svg` — or add a new glyph to `svg/`
first if none fits.
3. `ccebuild install` picks it up with no edit to the installer.
+
+## Third-party apps (`svg/apps/`)
+
+cce also draws its own icons for apps it does not ship — Firefox, Steam,
+Houdini, every entry the launcher lists — so the launcher and the Super-Tab
+switcher read as one set rather than a wall of vendor logos. Their glyphs live
+in `svg/apps/`, kept out of `svg/` itself because that directory is the flat
+widget-glyph namespace `cce_ui::upload_icon` reads by bare name. They follow
+the same language as the rest: white, 40×40, back layers at 0.55, lighting
+facets at 0.7/0.42, dark accents in `#282a36` at 0.35.
+
+Each is installed under one of two names, and which one matters:
+
+- **The entry's `Icon=` value** when that is an app-specific theme name
+ (`Icon=steam` ⇒ `steam.svg`). `$XDG_DATA_HOME/icons` is the first base dir
+ every lookup searches, so this wins over the vendor's icon in
+ `/usr/share/icons` for any consumer, not just cce's.
+- **The desktop-file ID** (the `.desktop` file's stem) when `Icon=` cannot be
+ overridden by name: an absolute path (`houdini.svg` for
+ `Icon=/opt/hfs/houdini_logo.png`), missing (`raindropio.svg`), or a generic
+ name several apps share (`avahi-discover`, `bssh` and `bvnc` all say
+ `Icon=network-wired`; `qt5ct`/`qt6ct` say `preferences-desktop-theme`).
+ Only cce-cloud honours these — it checks for
+ `hicolor/scalable/apps/<id>.svg` before reading `Icon=` (`icon_override`) —
+ so a new ID-named icon reaches the launcher and switcher and nothing else.
+
+A versioned ID (`com.sidefx.houdini22.0.429.svg`) goes stale on the next
+upgrade; re-point it when the entry is renamed. Several names can share one
+glyph (all four Houdini entries do), and the links say so.
diff --git a/hicolor/scalable/apps/1password.svg b/hicolor/scalable/apps/1password.svg
new file mode 120000
index 0000000..8b4c620
--- /dev/null
+++ b/hicolor/scalable/apps/1password.svg
@@ -0,0 +1 @@
+../../../svg/apps/1password.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/CMakeSetup.svg b/hicolor/scalable/apps/CMakeSetup.svg
new file mode 120000
index 0000000..27b233f
--- /dev/null
+++ b/hicolor/scalable/apps/CMakeSetup.svg
@@ -0,0 +1 @@
+../../../svg/apps/cmake.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/Zoom.svg b/hicolor/scalable/apps/Zoom.svg
new file mode 120000
index 0000000..d575182
--- /dev/null
+++ b/hicolor/scalable/apps/Zoom.svg
@@ -0,0 +1 @@
+../../../svg/apps/video-camera.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/antigravity.svg b/hicolor/scalable/apps/antigravity.svg
new file mode 120000
index 0000000..28397c4
--- /dev/null
+++ b/hicolor/scalable/apps/antigravity.svg
@@ -0,0 +1 @@
+../../../svg/apps/antigravity.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/assistant.svg b/hicolor/scalable/apps/assistant.svg
new file mode 120000
index 0000000..afafaac
--- /dev/null
+++ b/hicolor/scalable/apps/assistant.svg
@@ -0,0 +1 @@
+../../../svg/apps/book.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/avahi-discover.svg b/hicolor/scalable/apps/avahi-discover.svg
new file mode 120000
index 0000000..b6b361b
--- /dev/null
+++ b/hicolor/scalable/apps/avahi-discover.svg
@@ -0,0 +1 @@
+../../../svg/apps/zeroconf.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/betterbird.svg b/hicolor/scalable/apps/betterbird.svg
new file mode 120000
index 0000000..146d39a
--- /dev/null
+++ b/hicolor/scalable/apps/betterbird.svg
@@ -0,0 +1 @@
+../../../svg/apps/betterbird.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/bssh.svg b/hicolor/scalable/apps/bssh.svg
new file mode 120000
index 0000000..b6f2c93
--- /dev/null
+++ b/hicolor/scalable/apps/bssh.svg
@@ -0,0 +1 @@
+../../../svg/apps/zeroconf-ssh.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/btop.svg b/hicolor/scalable/apps/btop.svg
new file mode 120000
index 0000000..b9c35af
--- /dev/null
+++ b/hicolor/scalable/apps/btop.svg
@@ -0,0 +1 @@
+../../../svg/apps/btop.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/bvnc.svg b/hicolor/scalable/apps/bvnc.svg
new file mode 120000
index 0000000..06a81ba
--- /dev/null
+++ b/hicolor/scalable/apps/bvnc.svg
@@ -0,0 +1 @@
+../../../svg/apps/zeroconf-vnc.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/chrome-kajebgjangihfbkjfejcanhanjmmbcfd-Default.svg b/hicolor/scalable/apps/chrome-kajebgjangihfbkjfejcanhanjmmbcfd-Default.svg
new file mode 120000
index 0000000..3dc4353
--- /dev/null
+++ b/hicolor/scalable/apps/chrome-kajebgjangihfbkjfejcanhanjmmbcfd-Default.svg
@@ -0,0 +1 @@
+../../../svg/apps/password-field.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/claude-desktop.svg b/hicolor/scalable/apps/claude-desktop.svg
new file mode 120000
index 0000000..74aa0bf
--- /dev/null
+++ b/hicolor/scalable/apps/claude-desktop.svg
@@ -0,0 +1 @@
+../../../svg/apps/claude.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/com.mitchellh.ghostty.svg b/hicolor/scalable/apps/com.mitchellh.ghostty.svg
new file mode 120000
index 0000000..a40180b
--- /dev/null
+++ b/hicolor/scalable/apps/com.mitchellh.ghostty.svg
@@ -0,0 +1 @@
+../../../svg/apps/ghostty.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/com.sidefx.houdini22.0.429.svg b/hicolor/scalable/apps/com.sidefx.houdini22.0.429.svg
new file mode 120000
index 0000000..acc91ac
--- /dev/null
+++ b/hicolor/scalable/apps/com.sidefx.houdini22.0.429.svg
@@ -0,0 +1 @@
+../../../svg/apps/houdini.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/cups.svg b/hicolor/scalable/apps/cups.svg
new file mode 120000
index 0000000..53b3216
--- /dev/null
+++ b/hicolor/scalable/apps/cups.svg
@@ -0,0 +1 @@
+../../../svg/apps/printer.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/designer.svg b/hicolor/scalable/apps/designer.svg
new file mode 120000
index 0000000..9c3fcbd
--- /dev/null
+++ b/hicolor/scalable/apps/designer.svg
@@ -0,0 +1 @@
+../../../svg/apps/form-designer.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/dropbox.svg b/hicolor/scalable/apps/dropbox.svg
new file mode 120000
index 0000000..6385859
--- /dev/null
+++ b/hicolor/scalable/apps/dropbox.svg
@@ -0,0 +1 @@
+../../../svg/apps/dropbox.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/electron36.svg b/hicolor/scalable/apps/electron36.svg
new file mode 120000
index 0000000..c7ec57e
--- /dev/null
+++ b/hicolor/scalable/apps/electron36.svg
@@ -0,0 +1 @@
+../../../svg/apps/electron.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/firefox.svg b/hicolor/scalable/apps/firefox.svg
new file mode 120000
index 0000000..b177f29
--- /dev/null
+++ b/hicolor/scalable/apps/firefox.svg
@@ -0,0 +1 @@
+../../../svg/apps/firefox.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/foot.svg b/hicolor/scalable/apps/foot.svg
new file mode 120000
index 0000000..38d5137
--- /dev/null
+++ b/hicolor/scalable/apps/foot.svg
@@ -0,0 +1 @@
+../../../svg/apps/foot.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/gammastep.svg b/hicolor/scalable/apps/gammastep.svg
new file mode 120000
index 0000000..5614f62
--- /dev/null
+++ b/hicolor/scalable/apps/gammastep.svg
@@ -0,0 +1 @@
+../../../svg/apps/sunset.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/gimp.svg b/hicolor/scalable/apps/gimp.svg
new file mode 120000
index 0000000..f77c0b2
--- /dev/null
+++ b/hicolor/scalable/apps/gimp.svg
@@ -0,0 +1 @@
+../../../svg/apps/gimp.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/google-chrome.svg b/hicolor/scalable/apps/google-chrome.svg
new file mode 120000
index 0000000..bab6bc8
--- /dev/null
+++ b/hicolor/scalable/apps/google-chrome.svg
@@ -0,0 +1 @@
+../../../svg/apps/google-chrome.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/gucharmap.svg b/hicolor/scalable/apps/gucharmap.svg
new file mode 120000
index 0000000..b0acab7
--- /dev/null
+++ b/hicolor/scalable/apps/gucharmap.svg
@@ -0,0 +1 @@
+../../../svg/apps/character-map.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/houdini-nvidia.svg b/hicolor/scalable/apps/houdini-nvidia.svg
new file mode 120000
index 0000000..acc91ac
--- /dev/null
+++ b/hicolor/scalable/apps/houdini-nvidia.svg
@@ -0,0 +1 @@
+../../../svg/apps/houdini.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/houdini.svg b/hicolor/scalable/apps/houdini.svg
new file mode 120000
index 0000000..acc91ac
--- /dev/null
+++ b/hicolor/scalable/apps/houdini.svg
@@ -0,0 +1 @@
+../../../svg/apps/houdini.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/htop.svg b/hicolor/scalable/apps/htop.svg
new file mode 120000
index 0000000..dcde31a
--- /dev/null
+++ b/hicolor/scalable/apps/htop.svg
@@ -0,0 +1 @@
+../../../svg/apps/htop.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/hwloc.svg b/hicolor/scalable/apps/hwloc.svg
new file mode 120000
index 0000000..07a954b
--- /dev/null
+++ b/hicolor/scalable/apps/hwloc.svg
@@ -0,0 +1 @@
+../../../svg/apps/topology.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/keepassxc.svg b/hicolor/scalable/apps/keepassxc.svg
new file mode 120000
index 0000000..a014ac1
--- /dev/null
+++ b/hicolor/scalable/apps/keepassxc.svg
@@ -0,0 +1 @@
+../../../svg/apps/key.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/linguist.svg b/hicolor/scalable/apps/linguist.svg
new file mode 120000
index 0000000..6cf3e29
--- /dev/null
+++ b/hicolor/scalable/apps/linguist.svg
@@ -0,0 +1 @@
+../../../svg/apps/translate.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/mpv.svg b/hicolor/scalable/apps/mpv.svg
new file mode 120000
index 0000000..f6e21f4
--- /dev/null
+++ b/hicolor/scalable/apps/mpv.svg
@@ -0,0 +1 @@
+../../../svg/apps/mpv.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/nnn.svg b/hicolor/scalable/apps/nnn.svg
new file mode 120000
index 0000000..f69f75f
--- /dev/null
+++ b/hicolor/scalable/apps/nnn.svg
@@ -0,0 +1 @@
+../../../svg/apps/nnn.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/nordvpn-gui.svg b/hicolor/scalable/apps/nordvpn-gui.svg
new file mode 120000
index 0000000..27d67a2
--- /dev/null
+++ b/hicolor/scalable/apps/nordvpn-gui.svg
@@ -0,0 +1 @@
+../../../svg/apps/nordvpn.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/nvidia-settings.svg b/hicolor/scalable/apps/nvidia-settings.svg
new file mode 120000
index 0000000..f696a39
--- /dev/null
+++ b/hicolor/scalable/apps/nvidia-settings.svg
@@ -0,0 +1 @@
+../../../svg/apps/nvidia.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/nvim.svg b/hicolor/scalable/apps/nvim.svg
new file mode 120000
index 0000000..2145716
--- /dev/null
+++ b/hicolor/scalable/apps/nvim.svg
@@ -0,0 +1 @@
+../../../svg/apps/neovim.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/nvtop.svg b/hicolor/scalable/apps/nvtop.svg
new file mode 120000
index 0000000..ab5d093
--- /dev/null
+++ b/hicolor/scalable/apps/nvtop.svg
@@ -0,0 +1 @@
+../../../svg/apps/gpu.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/obsidian.svg b/hicolor/scalable/apps/obsidian.svg
new file mode 120000
index 0000000..517b351
--- /dev/null
+++ b/hicolor/scalable/apps/obsidian.svg
@@ -0,0 +1 @@
+../../../svg/apps/obsidian.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/org.fontforge.FontForge.svg b/hicolor/scalable/apps/org.fontforge.FontForge.svg
new file mode 120000
index 0000000..ca26778
--- /dev/null
+++ b/hicolor/scalable/apps/org.fontforge.FontForge.svg
@@ -0,0 +1 @@
+../../../svg/apps/anvil.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/org.inkscape.Inkscape.svg b/hicolor/scalable/apps/org.inkscape.Inkscape.svg
new file mode 120000
index 0000000..b4fa7a5
--- /dev/null
+++ b/hicolor/scalable/apps/org.inkscape.Inkscape.svg
@@ -0,0 +1 @@
+../../../svg/apps/inkscape.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/pacseek.svg b/hicolor/scalable/apps/pacseek.svg
new file mode 120000
index 0000000..3e159d1
--- /dev/null
+++ b/hicolor/scalable/apps/pacseek.svg
@@ -0,0 +1 @@
+../../../svg/apps/package-search.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/protontricks.svg b/hicolor/scalable/apps/protontricks.svg
new file mode 120000
index 0000000..0aeddde
--- /dev/null
+++ b/hicolor/scalable/apps/protontricks.svg
@@ -0,0 +1 @@
+../../../svg/apps/protontricks.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/qdbusviewer.svg b/hicolor/scalable/apps/qdbusviewer.svg
new file mode 120000
index 0000000..3b17837
--- /dev/null
+++ b/hicolor/scalable/apps/qdbusviewer.svg
@@ -0,0 +1 @@
+../../../svg/apps/tree.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/qt5ct.svg b/hicolor/scalable/apps/qt5ct.svg
new file mode 120000
index 0000000..511d36a
--- /dev/null
+++ b/hicolor/scalable/apps/qt5ct.svg
@@ -0,0 +1 @@
+../../../svg/apps/theme-settings.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/qt6ct.svg b/hicolor/scalable/apps/qt6ct.svg
new file mode 120000
index 0000000..511d36a
--- /dev/null
+++ b/hicolor/scalable/apps/qt6ct.svg
@@ -0,0 +1 @@
+../../../svg/apps/theme-settings.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/qutebrowser.svg b/hicolor/scalable/apps/qutebrowser.svg
new file mode 120000
index 0000000..361271e
--- /dev/null
+++ b/hicolor/scalable/apps/qutebrowser.svg
@@ -0,0 +1 @@
+../../../svg/apps/qutebrowser.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/qv4l2.svg b/hicolor/scalable/apps/qv4l2.svg
new file mode 120000
index 0000000..62bf8e5
--- /dev/null
+++ b/hicolor/scalable/apps/qv4l2.svg
@@ -0,0 +1 @@
+../../../svg/apps/webcam.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/qvidcap.svg b/hicolor/scalable/apps/qvidcap.svg
new file mode 120000
index 0000000..5f4bdb1
--- /dev/null
+++ b/hicolor/scalable/apps/qvidcap.svg
@@ -0,0 +1 @@
+../../../svg/apps/video-capture.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/raindropio.svg b/hicolor/scalable/apps/raindropio.svg
new file mode 120000
index 0000000..110a192
--- /dev/null
+++ b/hicolor/scalable/apps/raindropio.svg
@@ -0,0 +1 @@
+../../../svg/apps/raindrop.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/sidefx-launcher.svg b/hicolor/scalable/apps/sidefx-launcher.svg
new file mode 120000
index 0000000..acc91ac
--- /dev/null
+++ b/hicolor/scalable/apps/sidefx-launcher.svg
@@ -0,0 +1 @@
+../../../svg/apps/houdini.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/steam.svg b/hicolor/scalable/apps/steam.svg
new file mode 120000
index 0000000..d1ef319
--- /dev/null
+++ b/hicolor/scalable/apps/steam.svg
@@ -0,0 +1 @@
+../../../svg/apps/steam.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/ubisoft-connect.svg b/hicolor/scalable/apps/ubisoft-connect.svg
new file mode 120000
index 0000000..e141533
--- /dev/null
+++ b/hicolor/scalable/apps/ubisoft-connect.svg
@@ -0,0 +1 @@
+../../../svg/apps/ubisoft.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/uxplay.svg b/hicolor/scalable/apps/uxplay.svg
new file mode 120000
index 0000000..f89d75c
--- /dev/null
+++ b/hicolor/scalable/apps/uxplay.svg
@@ -0,0 +1 @@
+../../../svg/apps/airplay.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/winetricks.svg b/hicolor/scalable/apps/winetricks.svg
new file mode 120000
index 0000000..e2a2c03
--- /dev/null
+++ b/hicolor/scalable/apps/winetricks.svg
@@ -0,0 +1 @@
+../../../svg/apps/winetricks.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/xgps.svg b/hicolor/scalable/apps/xgps.svg
new file mode 120000
index 0000000..91612a1
--- /dev/null
+++ b/hicolor/scalable/apps/xgps.svg
@@ -0,0 +1 @@
+../../../svg/apps/satellite.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/xgpsspeed.svg b/hicolor/scalable/apps/xgpsspeed.svg
new file mode 120000
index 0000000..369fbd2
--- /dev/null
+++ b/hicolor/scalable/apps/xgpsspeed.svg
@@ -0,0 +1 @@
+../../../svg/apps/speedometer.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/xscreensaver.svg b/hicolor/scalable/apps/xscreensaver.svg
new file mode 120000
index 0000000..f9aff9d
--- /dev/null
+++ b/hicolor/scalable/apps/xscreensaver.svg
@@ -0,0 +1 @@
+../../../svg/apps/screensaver.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/zed.svg b/hicolor/scalable/apps/zed.svg
new file mode 120000
index 0000000..a63f2b8
--- /dev/null
+++ b/hicolor/scalable/apps/zed.svg
@@ -0,0 +1 @@
+../../../svg/apps/zed.svg
\ No newline at end of file
diff --git a/hicolor/scalable/apps/zellij.svg b/hicolor/scalable/apps/zellij.svg
new file mode 120000
index 0000000..7cf2032
--- /dev/null
+++ b/hicolor/scalable/apps/zellij.svg
@@ -0,0 +1 @@
+../../../svg/apps/zellij.svg
\ No newline at end of file
diff --git a/svg/apps/1password.svg b/svg/apps/1password.svg
new file mode 100644
index 0000000..01cb497
--- /dev/null
+++ b/svg/apps/1password.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- 1Password: a solid disc with a dark keyhole slot down its centre. -->
+<circle cx="20" cy="20" r="15" fill="#ffffff" />
+ <rect x="17.75" y="11" width="4.5" height="18" rx="2.25" fill="#282a36" opacity="0.35" />
+</svg>
diff --git a/svg/apps/airplay.svg b/svg/apps/airplay.svg
new file mode 100644
index 0000000..9cc4308
--- /dev/null
+++ b/svg/apps/airplay.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- AirPlay (UxPlay): a wireframe screen whose bottom edge opens for a solid round-joined triangle. -->
+<path d="M13.5 28 L11.75 28 C7.25 28 5 25.75 5 21.25 L5 12.75 C5 8.25 7.25 6 11.75 6 L28.25 6 C32.75 6 35 8.25 35 12.75 L35 21.25 C35 25.75 32.75 28 28.25 28 L26.5 28" fill="none" stroke="#ffffff" stroke-width="4" stroke-linecap="round" />
+ <path d="M20 24 L27 34 L13 34 Z" fill="#ffffff" stroke="#ffffff" stroke-width="3" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/antigravity.svg b/svg/apps/antigravity.svg
new file mode 100644
index 0000000..c22f33a
--- /dev/null
+++ b/svg/apps/antigravity.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Antigravity: a thick rounded arch standing on two feet, with a dot floating free under its crown. -->
+<path d="M8 33 L8 21 C8 12 13 7 20 7 C27 7 32 12 32 21 L32 33" fill="none" stroke="#ffffff" stroke-width="5.5" stroke-linecap="round" />
+ <circle cx="20" cy="22" r="3.5" fill="#ffffff" opacity="0.55" />
+</svg>
diff --git a/svg/apps/anvil.svg b/svg/apps/anvil.svg
new file mode 100644
index 0000000..7a430dd
--- /dev/null
+++ b/svg/apps/anvil.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Anvil (FontForge): a solid anvil - horn to the left, face across the top - on a foot. -->
+<path fill="#ffffff" stroke="#ffffff" stroke-width="2" stroke-linejoin="round" d="M4 11 L35 11 L35 18 C31 18.5 27 20 25.5 23 L25.5 27 L14.5 27 L14.5 23 C13 20 10 18 5 17 C4.5 15 4 13 4 11 Z" />
+ <rect x="9" y="27" width="22" height="6.5" rx="2" fill="#ffffff" />
+ <path d="M14.5 15 L25 15" stroke-width="2.5" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/betterbird.svg b/svg/apps/betterbird.svg
new file mode 100644
index 0000000..f06b29a
--- /dev/null
+++ b/svg/apps/betterbird.svg
@@ -0,0 +1,7 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Betterbird: a full-white bird in profile, wing as a dark crease, over the envelope at 0.55 back-layer opacity. -->
+<path fill="#ffffff" opacity="0.55" d="M14 25.0 C14 21.0 16.0 19 20.0 19 L31.0 19 C35.0 19 37 21.0 37 25.0 L37 30.0 C37 34.0 35.0 36 31.0 36 L20.0 36 C16.0 36 14 34.0 14 30.0 Z" />
+ <path fill="#ffffff" d="M3 23 C8 22.5 11.5 20 14 16.5 C17 12 21 8.5 26.5 8.5 C30 8.5 32.5 10.5 33.5 12.5 L37.5 14 L33.5 15.5 C33 21 28.5 25.5 22 27.5 C17 29 12 28.5 8 26.5 L2.5 29.5 Z" />
+ <path d="M14.5 21 C19 23 24 21.5 26.5 17" stroke-width="2.5" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <circle cx="29.5" cy="12.5" r="1.4" fill="#282a36" opacity="0.35" />
+</svg>
diff --git a/svg/apps/book.svg b/svg/apps/book.svg
new file mode 100644
index 0000000..cb63921
--- /dev/null
+++ b/svg/apps/book.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Open book (Qt Assistant): two pages lit like cube.svg's faces - left full, right at 0.55 - meeting at a spine that dips. -->
+<path fill="#ffffff" d="M19 10 C14.5 7.5 9 7.5 4.5 9 L4.5 31 C9 29.5 14.5 29.5 19 32 Z" />
+ <path fill="#ffffff" opacity="0.55" d="M21 10 C25.5 7.5 31 7.5 35.5 9 L35.5 31 C31 29.5 25.5 29.5 21 32 Z" />
+</svg>
diff --git a/svg/apps/btop.svg b/svg/apps/btop.svg
new file mode 100644
index 0000000..b6b0ce8
--- /dev/null
+++ b/svg/apps/btop.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- btop: a terminal panel (terminal.svg's) carrying a dark line graph. -->
+<path fill="#ffffff" d="M4 14.75 C4 10.25 6.25 8 10.75 8 L29.25 8 C33.75 8 36 10.25 36 14.75 L36 25.25 C36 29.75 33.75 32 29.25 32 L10.75 32 C6.25 32 4 29.75 4 25.25 Z" />
+ <path d="M9 26 L14 20 L18 23 L23 14 L27 19 L31 16" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/character-map.svg b/svg/apps/character-map.svg
new file mode 100644
index 0000000..c684303
--- /dev/null
+++ b/svg/apps/character-map.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Character map: a solid squircle panel holding a dark omega. -->
+<path fill="#ffffff" d="M5 12.5 C5 7.5 7.5 5 12.5 5 L27.5 5 C32.5 5 35 7.5 35 12.5 L35 27.5 C35 32.5 32.5 35 27.5 35 L12.5 35 C7.5 35 5 32.5 5 27.5 Z" />
+ <path d="M11.5 28.5 L16 28.5 C12.5 26 11.5 22.5 12 19 C12.8 14.2 16 11.5 20 11.5 C24 11.5 27.2 14.2 28 19 C28.5 22.5 27.5 26 24 28.5 L28.5 28.5" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/claude.svg b/svg/apps/claude.svg
new file mode 100644
index 0000000..7946d2f
--- /dev/null
+++ b/svg/apps/claude.svg
@@ -0,0 +1,18 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Claude: a twelve-ray starburst, alternating long and short rays, on a small hub. -->
+<g fill="#ffffff">
+ <rect x="18.4" y="4" width="3.2" height="16" rx="1.6" transform="rotate(0 20 20)" />
+ <rect x="18.4" y="7.5" width="3.2" height="12.5" rx="1.6" transform="rotate(30 20 20)" />
+ <rect x="18.4" y="4" width="3.2" height="16" rx="1.6" transform="rotate(60 20 20)" />
+ <rect x="18.4" y="7.5" width="3.2" height="12.5" rx="1.6" transform="rotate(90 20 20)" />
+ <rect x="18.4" y="4" width="3.2" height="16" rx="1.6" transform="rotate(120 20 20)" />
+ <rect x="18.4" y="7.5" width="3.2" height="12.5" rx="1.6" transform="rotate(150 20 20)" />
+ <rect x="18.4" y="4" width="3.2" height="16" rx="1.6" transform="rotate(180 20 20)" />
+ <rect x="18.4" y="7.5" width="3.2" height="12.5" rx="1.6" transform="rotate(210 20 20)" />
+ <rect x="18.4" y="4" width="3.2" height="16" rx="1.6" transform="rotate(240 20 20)" />
+ <rect x="18.4" y="7.5" width="3.2" height="12.5" rx="1.6" transform="rotate(270 20 20)" />
+ <rect x="18.4" y="4" width="3.2" height="16" rx="1.6" transform="rotate(300 20 20)" />
+ <rect x="18.4" y="7.5" width="3.2" height="12.5" rx="1.6" transform="rotate(330 20 20)" />
+ <circle cx="20" cy="20" r="3.5" />
+ </g>
+</svg>
diff --git a/svg/apps/cmake.svg b/svg/apps/cmake.svg
new file mode 100644
index 0000000..b38a928
--- /dev/null
+++ b/svg/apps/cmake.svg
@@ -0,0 +1,8 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- CMake: the triangle in three facets lit like cube.svg - full, 0.7, 0.42 - with no outline; the tonal steps are the edges. -->
+<g fill="#ffffff">
+ <path d="M20 4 L22 26 L4 34 Z" />
+ <path d="M20 4 L36 34 L22 26 Z" opacity="0.7" />
+ <path d="M4 34 L22 26 L36 34 Z" opacity="0.42" />
+ </g>
+</svg>
diff --git a/svg/apps/dropbox.svg b/svg/apps/dropbox.svg
new file mode 100644
index 0000000..d52e7bc
--- /dev/null
+++ b/svg/apps/dropbox.svg
@@ -0,0 +1,10 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Dropbox: the open box as four rhombi with the fifth folded under, all solid, packed corner to corner. -->
+<g fill="#ffffff" stroke="#ffffff" stroke-width="1.5" stroke-linejoin="round">
+ <path d="M12.5 5.9 L19.5 10.5 L12.5 15.1 L5.5 10.5 Z" />
+ <path d="M27.5 5.9 L34.5 10.5 L27.5 15.1 L20.5 10.5 Z" />
+ <path d="M12.5 15.9 L19.5 20.5 L12.5 25.1 L5.5 20.5 Z" />
+ <path d="M27.5 15.9 L34.5 20.5 L27.5 25.1 L20.5 20.5 Z" />
+ <path d="M20 25.9 L27 30.5 L20 35.1 L13 30.5 Z" />
+ </g>
+</svg>
diff --git a/svg/apps/electron.svg b/svg/apps/electron.svg
new file mode 100644
index 0000000..bbea29c
--- /dev/null
+++ b/svg/apps/electron.svg
@@ -0,0 +1,9 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Electron: three wireframe orbit ellipses, 60 degrees apart, around a solid nucleus. -->
+<g fill="none" stroke="#ffffff" stroke-width="2.5">
+ <ellipse cx="20" cy="20" rx="15" ry="5.5" />
+ <ellipse cx="20" cy="20" rx="15" ry="5.5" transform="rotate(60 20 20)" />
+ <ellipse cx="20" cy="20" rx="15" ry="5.5" transform="rotate(120 20 20)" />
+ </g>
+ <circle cx="20" cy="20" r="3.75" fill="#ffffff" />
+</svg>
diff --git a/svg/apps/firefox.svg b/svg/apps/firefox.svg
new file mode 100644
index 0000000..4dd0a53
--- /dev/null
+++ b/svg/apps/firefox.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Firefox: the globe at 0.55 back-layer opacity, held by the fox - a full-white crescent, heaviest at the lower left, opening to the upper right where its ear pricks up. -->
+<circle cx="23" cy="17" r="9.5" fill="#ffffff" opacity="0.55" />
+ <path fill="#ffffff" fill-rule="evenodd" d="M20 5 A15 15 0 1 0 35 20 A15 15 0 0 0 20 5 Z M24.5 5.5 A11 11 0 1 1 24.49 5.5 Z" />
+ <path fill="#ffffff" stroke="#ffffff" stroke-width="2" stroke-linejoin="round" d="M12 8 L11 2.5 L17 5.5 Z" />
+</svg>
diff --git a/svg/apps/foot.svg b/svg/apps/foot.svg
new file mode 100644
index 0000000..9036825
--- /dev/null
+++ b/svg/apps/foot.svg
@@ -0,0 +1,11 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Foot: a footprint - a tilted sole with five toes stepping down in size. -->
+<g fill="#ffffff">
+ <ellipse cx="19" cy="26.5" rx="7.5" ry="9.5" transform="rotate(-12 19 26.5)" />
+ <circle cx="14.5" cy="10" r="3.6" />
+ <circle cx="21" cy="8.5" r="2.7" />
+ <circle cx="26" cy="10" r="2.3" />
+ <circle cx="29.5" cy="13.5" r="2" />
+ <circle cx="31.5" cy="18" r="1.7" />
+ </g>
+</svg>
diff --git a/svg/apps/form-designer.svg b/svg/apps/form-designer.svg
new file mode 100644
index 0000000..e222091
--- /dev/null
+++ b/svg/apps/form-designer.svg
@@ -0,0 +1,10 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Form designer (Qt Widgets Designer): a wireframe window with a title-bar seam, a full-white widget block and two back-layer ones laid out under it. -->
+<path d="M5 12.75 C5 8.25 7.25 6 11.75 6 L28.25 6 C32.75 6 35 8.25 35 12.75 L35 27.25 C35 31.75 32.75 34 28.25 34 L11.75 34 C7.25 34 5 31.75 5 27.25 Z" fill="none" stroke="#ffffff" stroke-width="4" />
+ <path d="M5 13 L35 13" fill="none" stroke="#ffffff" stroke-width="3" />
+ <rect x="10" y="17.5" width="20" height="5" rx="2" fill="#ffffff" />
+ <g fill="#ffffff" opacity="0.55">
+ <rect x="10" y="25" width="9" height="5" rx="2" />
+ <rect x="21" y="25" width="9" height="5" rx="2" />
+ </g>
+</svg>
diff --git a/svg/apps/ghostty.svg b/svg/apps/ghostty.svg
new file mode 100644
index 0000000..e93486a
--- /dev/null
+++ b/svg/apps/ghostty.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Ghostty: a ghost with a scalloped hem and a dark prompt for a face. -->
+<path fill="#ffffff" stroke="#ffffff" stroke-width="2" stroke-linejoin="round" d="M8 34 L8 18 C8 10 13 5 20 5 C27 5 32 10 32 18 L32 34 L28 31 L24 34 L20 31 L16 34 L12 31 Z" />
+ <path d="M13 15 L17 18.5 L13 22 M20 22 L26 22" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/gimp.svg b/svg/apps/gimp.svg
new file mode 100644
index 0000000..4f9fcf1
--- /dev/null
+++ b/svg/apps/gimp.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- GIMP: a paintbrush - handle at 0.55, a solid ferrule, and a loaded bristle tip curling into a stroke. -->
+<path d="M34 6 L23.5 16.5" fill="none" stroke="#ffffff" stroke-width="4.5" stroke-linecap="round" opacity="0.55" />
+ <path d="M24 16 L19.5 20.5" fill="none" stroke="#ffffff" stroke-width="7" stroke-linecap="round" />
+ <path fill="#ffffff" d="M18.5 19 C22 22 21.5 26.5 18 30 C14 34 8.5 34.5 4.5 35.5 C5.5 31.5 6 26 10 22 C12.5 19.5 16 17.5 18.5 19 Z" />
+</svg>
diff --git a/svg/apps/google-chrome.svg b/svg/apps/google-chrome.svg
new file mode 100644
index 0000000..3b0d8a9
--- /dev/null
+++ b/svg/apps/google-chrome.svg
@@ -0,0 +1,11 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Chrome: the solid disc with its three segment seams and the hub ring in the dark crease treatment; the hub itself stays white. -->
+<circle cx="20" cy="20" r="15" fill="#ffffff" />
+ <g fill="none" stroke="#282a36" stroke-width="2.5" stroke-linecap="round" opacity="0.35">
+ <circle cx="20" cy="20" r="6.5" />
+ <path d="M20 13.5 L33.5 13.5" transform="rotate(0 20 20)" />
+ <path d="M20 13.5 L33.5 13.5" transform="rotate(120 20 20)" />
+ <path d="M20 13.5 L33.5 13.5" transform="rotate(240 20 20)" />
+ </g>
+ <circle cx="20" cy="20" r="5" fill="#ffffff" />
+</svg>
diff --git a/svg/apps/gpu.svg b/svg/apps/gpu.svg
new file mode 100644
index 0000000..358232e
--- /dev/null
+++ b/svg/apps/gpu.svg
@@ -0,0 +1,13 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- GPU card (nvtop): a solid card with two dark fan rings, its bracket and edge connector as stubs. -->
+<path fill="#ffffff" d="M4 15.0 C4 11.0 6.0 9 10.0 9 L30.0 9 C34.0 9 36 11.0 36 15.0 L36 22.0 C36 26.0 34.0 28 30.0 28 L10.0 28 C6.0 28 4 26.0 4 22.0 Z" />
+ <path d="M9 28 L9 33 M14 28 L14 31 M19 28 L19 31 M24 28 L24 31" fill="none" stroke="#ffffff" stroke-width="2.5" stroke-linecap="round" />
+ <g fill="none" stroke="#282a36" stroke-width="2.5" opacity="0.35">
+ <circle cx="13.5" cy="18.5" r="5" />
+ <circle cx="26.5" cy="18.5" r="5" />
+ </g>
+ <g fill="#282a36" opacity="0.35">
+ <circle cx="13.5" cy="18.5" r="1.5" />
+ <circle cx="26.5" cy="18.5" r="1.5" />
+ </g>
+</svg>
diff --git a/svg/apps/houdini.svg b/svg/apps/houdini.svg
new file mode 100644
index 0000000..afcbb02
--- /dev/null
+++ b/svg/apps/houdini.svg
@@ -0,0 +1,4 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Houdini: the SideFX spiral as five growing half-turns, wireframe at stroke 2.75 so the turns stay open at row size. -->
+<path d="M20 17.5 A2.6 2.6 0 0 1 20 22.7 A5.2 5.2 0 0 1 20 12.3 A7.8 7.8 0 0 1 20 27.9 A10.4 10.4 0 0 1 20 7.1 A13 13 0 0 1 20 33.1" fill="none" stroke="#ffffff" stroke-width="2.75" stroke-linecap="round" />
+</svg>
diff --git a/svg/apps/htop.svg b/svg/apps/htop.svg
new file mode 100644
index 0000000..4312641
--- /dev/null
+++ b/svg/apps/htop.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- htop: a terminal panel carrying three dark meter bars of different fill. -->
+<path fill="#ffffff" d="M4 14.75 C4 10.25 6.25 8 10.75 8 L29.25 8 C33.75 8 36 10.25 36 14.75 L36 25.25 C36 29.75 33.75 32 29.25 32 L10.75 32 C6.25 32 4 29.75 4 25.25 Z" />
+ <path d="M9.5 14 L28 14 M9.5 20 L20 20 M9.5 26 L24 26" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/inkscape.svg b/svg/apps/inkscape.svg
new file mode 100644
index 0000000..2bbd709
--- /dev/null
+++ b/svg/apps/inkscape.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Inkscape: a solid peak whose base drips in three runs, with the snowcap marked by a dark crease zigzag. -->
+<path fill="#ffffff" stroke="#ffffff" stroke-width="2" stroke-linejoin="round" d="M20 4 L34 22 L29 22 L29 27 A2 2 0 0 1 25 27 L25 22 L22 22 L22 31 A2 2 0 0 1 18 31 L18 22 L15 22 L15 25.5 A2 2 0 0 1 11 25.5 L11 22 L6 22 Z" />
+ <path d="M14.5 13 L17.5 15.5 L20 13 L22.5 15.5 L25.5 13" stroke-width="2.5" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <circle cx="20" cy="36" r="2" fill="#ffffff" opacity="0.55" />
+</svg>
diff --git a/svg/apps/key.svg b/svg/apps/key.svg
new file mode 100644
index 0000000..d180fe9
--- /dev/null
+++ b/svg/apps/key.svg
@@ -0,0 +1,10 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Key (KeePassXC): a solid bow with a dark hole, a shaft, and two bit teeth. -->
+<circle cx="12" cy="20" r="8" fill="#ffffff" />
+ <circle cx="10.5" cy="20" r="2.75" fill="#282a36" opacity="0.35" />
+ <path fill="#ffffff" d="M18 17.5 L34 17.5 Q36 17.5 36 19.5 L36 20.5 Q36 22.5 34 22.5 L18 22.5 Z" />
+ <g fill="#ffffff">
+ <rect x="26" y="21" width="3.5" height="7" rx="1.5" />
+ <rect x="31.5" y="21" width="3.5" height="5" rx="1.5" />
+ </g>
+</svg>
diff --git a/svg/apps/mpv.svg b/svg/apps/mpv.svg
new file mode 100644
index 0000000..16e44b9
--- /dev/null
+++ b/svg/apps/mpv.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- mpv: a 0.55 back disc with a solid inner disc carrying a dark play mark. -->
+<circle cx="20" cy="20" r="15" fill="#ffffff" opacity="0.55" />
+ <circle cx="20" cy="20" r="10.5" fill="#ffffff" />
+ <path d="M17.25 15 L25 20 L17.25 25 Z" stroke-width="1.5" stroke="#282a36" stroke-linejoin="round" fill="#282a36" opacity="0.35" />
+</svg>
diff --git a/svg/apps/neovim.svg b/svg/apps/neovim.svg
new file mode 100644
index 0000000..653b213
--- /dev/null
+++ b/svg/apps/neovim.svg
@@ -0,0 +1,8 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Neovim: the N as two posts lit like cube.svg's side faces (0.7 and 0.42) with the full-white diagonal between them. -->
+<g fill="#ffffff">
+ <path d="M6 10 L13 5.5 L13 34.5 L6 30 Z" opacity="0.7" />
+ <path d="M27 5.5 L34 10 L34 30 L27 34.5 Z" opacity="0.42" />
+ <path d="M13 5.5 L18.5 5.5 L27 34.5 L21.5 34.5 Z" />
+ </g>
+</svg>
diff --git a/svg/apps/nnn.svg b/svg/apps/nnn.svg
new file mode 100644
index 0000000..c683eee
--- /dev/null
+++ b/svg/apps/nnn.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- nnn: folder.svg's back panel and front flap, with a dark prompt chevron on the flap. -->
+<path fill="#ffffff" opacity="0.55" d="M4 13.75 C4 9.25 6.25 7 10.75 7 L15.5 7 Q17.6 7 18.9 8.7 L20.8 11.2 Q21.7 12.4 23.2 12.4 L29.25 12.4 C33.75 12.4 36 14.65 36 19.15 L36 27.25 C36 31.75 33.75 34 29.25 34 L10.75 34 C6.25 34 4 31.75 4 27.25 Z" />
+ <path fill="#ffffff" d="M4 23.75 C4 19.25 6.25 17 10.75 17 L29.25 17 C33.75 17 36 19.25 36 23.75 L36 27.25 C36 31.75 33.75 34 29.25 34 L10.75 34 C6.25 34 4 31.75 4 27.25 Z" />
+ <path d="M11 21.5 L15 25.5 L11 29.5 M18.5 29.5 L24 29.5" stroke-width="2.75" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/nordvpn.svg b/svg/apps/nordvpn.svg
new file mode 100644
index 0000000..8f6c140
--- /dev/null
+++ b/svg/apps/nordvpn.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- NordVPN: a solid disc with the dark mountain line across it. -->
+<circle cx="20" cy="20" r="15" fill="#ffffff" />
+ <path d="M9.5 28 L18 13 L22.5 21 L25 17 L30.5 28" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/nvidia.svg b/svg/apps/nvidia.svg
new file mode 100644
index 0000000..3c52ea2
--- /dev/null
+++ b/svg/apps/nvidia.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- NVIDIA: a solid eye with a dark open iris ring and pupil. -->
+<path fill="#ffffff" d="M3 20 C8 11 14 8 20 8 C26 8 32 11 37 20 C32 29 26 32 20 32 C14 32 8 29 3 20 Z" />
+ <path d="M26 20 A6 6 0 1 1 20 14" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <circle cx="20" cy="20" r="2.25" fill="#282a36" opacity="0.35" />
+</svg>
diff --git a/svg/apps/obsidian.svg b/svg/apps/obsidian.svg
new file mode 100644
index 0000000..7e5f0ac
--- /dev/null
+++ b/svg/apps/obsidian.svg
@@ -0,0 +1,9 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Obsidian: a crystal in four facets at descending opacity around an off-centre seam point, no outline. -->
+<g fill="#ffffff">
+ <path d="M20 3.5 L18 21 L8.5 21.5 Z" />
+ <path d="M20 3.5 L31.5 13 L18 21 Z" opacity="0.7" />
+ <path d="M8.5 21.5 L18 21 L16 36.5 Z" opacity="0.55" />
+ <path d="M18 21 L31.5 13 L28.5 31.5 L16 36.5 Z" opacity="0.42" />
+ </g>
+</svg>
diff --git a/svg/apps/package-search.svg b/svg/apps/package-search.svg
new file mode 100644
index 0000000..a88c8e7
--- /dev/null
+++ b/svg/apps/package-search.svg
@@ -0,0 +1,10 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Package search (pacseek): cube.svg's lit box, shrunk to the upper left, under preview.svg's magnifier. -->
+<g fill="#ffffff">
+ <path d="M16 4 L27 10 L16 16 L5 10 Z" />
+ <path d="M5 10 L16 16 L16 28 L5 22 Z" opacity="0.7" />
+ <path d="M27 10 L27 22 L16 28 L16 16 Z" opacity="0.42" />
+ </g>
+ <circle cx="27.5" cy="27.5" r="6" fill="none" stroke="#ffffff" stroke-width="4" />
+ <path d="M32 32 L36 36" fill="none" stroke="#ffffff" stroke-width="4" stroke-linecap="round" />
+</svg>
diff --git a/svg/apps/password-field.svg b/svg/apps/password-field.svg
new file mode 100644
index 0000000..fc3c69d
--- /dev/null
+++ b/svg/apps/password-field.svg
@@ -0,0 +1,9 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Password field: a wireframe input well holding three masked characters - a password manager's glyph without borrowing a lock (secrets has that). -->
+<path d="M5 17.0 C5 13.0 7.0 11 11.0 11 L29.0 11 C33.0 11 35 13.0 35 17.0 L35 23.0 C35 27.0 33.0 29 29.0 29 L11.0 29 C7.0 29 5 27.0 5 23.0 Z" fill="none" stroke="#ffffff" stroke-width="4" />
+ <g fill="#ffffff">
+ <circle cx="13" cy="20" r="2.75" />
+ <circle cx="20" cy="20" r="2.75" />
+ <circle cx="27" cy="20" r="2.75" />
+ </g>
+</svg>
diff --git a/svg/apps/printer.svg b/svg/apps/printer.svg
new file mode 100644
index 0000000..17ecfed
--- /dev/null
+++ b/svg/apps/printer.svg
@@ -0,0 +1,8 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Printer (CUPS): the feed sheet at 0.55 behind a solid body, a dark slot, and the printed sheet coming out with two dark lines. -->
+<rect x="11" y="5" width="18" height="12" rx="2" fill="#ffffff" opacity="0.55" />
+ <path fill="#ffffff" d="M4 19.0 C4 15.0 6.0 13 10.0 13 L30.0 13 C34.0 13 36 15.0 36 19.0 L36 23.0 C36 27.0 34.0 29 30.0 29 L10.0 29 C6.0 29 4 27.0 4 23.0 Z" />
+ <path d="M10 24 L30 24" stroke-width="2.5" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <rect x="11" y="25.5" width="18" height="10" rx="1.5" fill="#ffffff" />
+ <path d="M14.5 29.5 L25.5 29.5 M14.5 32.5 L22 32.5" stroke-width="1.75" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/protontricks.svg b/svg/apps/protontricks.svg
new file mode 100644
index 0000000..c6a7bc5
--- /dev/null
+++ b/svg/apps/protontricks.svg
@@ -0,0 +1,8 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Protontricks: winetricks' glass standing in front of a 0.55 disc - the Steam runtime behind it. -->
+<circle cx="25" cy="15" r="11" fill="#ffffff" opacity="0.55" />
+ <path fill="#ffffff" d="M8 7 L24 7 C25 16 22.5 21.5 16 22.5 C9.5 21.5 7 16 8 7 Z" />
+ <path d="M9.5 13 L22.5 13" stroke-width="2.5" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <path d="M16 22 L16 32" fill="none" stroke="#ffffff" stroke-width="3.5" />
+ <rect x="8" y="31.5" width="16" height="4" rx="2" fill="#ffffff" />
+</svg>
diff --git a/svg/apps/qutebrowser.svg b/svg/apps/qutebrowser.svg
new file mode 100644
index 0000000..71f2e89
--- /dev/null
+++ b/svg/apps/qutebrowser.svg
@@ -0,0 +1,9 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- qutebrowser: globe.svg's disc and crease lines with a q's tail struck out of its lower right. -->
+<circle cx="19" cy="19" r="14" fill="#ffffff" />
+ <g fill="none" stroke="#282a36" stroke-width="3" stroke-linecap="round" opacity="0.35">
+ <ellipse cx="19" cy="19" rx="6.25" ry="12" />
+ <path d="M7 19 L31 19" />
+ </g>
+ <path d="M29 27 L35.5 35.5" fill="none" stroke="#ffffff" stroke-width="5" stroke-linecap="round" />
+</svg>
diff --git a/svg/apps/raindrop.svg b/svg/apps/raindrop.svg
new file mode 100644
index 0000000..9c6d124
--- /dev/null
+++ b/svg/apps/raindrop.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Raindrop.io: a solid drop with a dark highlight crease on its lower left. -->
+<path fill="#ffffff" d="M20 4 C16 10 9 17.5 9 24.5 A11 11 0 0 0 31 24.5 C31 17.5 24 10 20 4 Z" />
+ <path d="M14 24.5 A6 6 0 0 0 19 30.5" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/satellite.svg b/svg/apps/satellite.svg
new file mode 100644
index 0000000..be2405a
--- /dev/null
+++ b/svg/apps/satellite.svg
@@ -0,0 +1,15 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Satellite (xgps): a solid body between two 0.55 solar wings on its diagonal, a dark seam across each wing, and two signal arcs to the lower left. -->
+<g transform="rotate(-45 21 19)">
+ <rect x="16.5" y="14.5" width="9" height="9" rx="2" fill="#ffffff" />
+ <g fill="#ffffff" opacity="0.55">
+ <rect x="3.5" y="12.5" width="11" height="13" rx="1.5" />
+ <rect x="27.5" y="12.5" width="11" height="13" rx="1.5" />
+ </g>
+ <path d="M9 13.5 L9 24.5 M33 13.5 L33 24.5" stroke-width="2" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ </g>
+ <g fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round">
+ <path d="M4.5 27 A9 9 0 0 0 13 35.5" />
+ <path d="M9.5 28 A4 4 0 0 0 12 30.5" />
+ </g>
+</svg>
diff --git a/svg/apps/screensaver.svg b/svg/apps/screensaver.svg
new file mode 100644
index 0000000..520e463
--- /dev/null
+++ b/svg/apps/screensaver.svg
@@ -0,0 +1,10 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Screensaver (XScreenSaver): monitor.svg with a dark crescent moon and a star on its screen. -->
+<g fill="#ffffff">
+ <path d="M4 12.0 C4 8.0 6.0 6 10.0 6 L30.0 6 C34.0 6 36 8.0 36 12.0 L36 22.0 C36 26.0 34.0 28 30.0 28 L10.0 28 C6.0 28 4 26.0 4 22.0 Z" />
+ <rect x="17" y="28" width="6" height="5" />
+ <rect x="11" y="32" width="18" height="4" rx="2" />
+ </g>
+ <path fill="#282a36" opacity="0.35" d="M16.51 10.02 A7 7 0 1 0 23.45 19.73 A6 6 0 0 1 16.51 10.02 Z" />
+ <circle cx="28" cy="12" r="1.75" fill="#282a36" opacity="0.35" />
+</svg>
diff --git a/svg/apps/speedometer.svg b/svg/apps/speedometer.svg
new file mode 100644
index 0000000..b8ae45c
--- /dev/null
+++ b/svg/apps/speedometer.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Speedometer (xgpsspeed): a wireframe gauge arc with 0.55 ticks and a solid needle on a hub. -->
+<path d="M8.7 30.5 A15 15 0 1 1 31.3 30.5" fill="none" stroke="#ffffff" stroke-width="4" stroke-linecap="round" />
+ <path d="M20 22 L28 13" fill="none" stroke="#ffffff" stroke-width="3.5" stroke-linecap="round" />
+ <circle cx="20" cy="22" r="3.75" fill="#ffffff" />
+</svg>
diff --git a/svg/apps/steam.svg b/svg/apps/steam.svg
new file mode 100644
index 0000000..9e998ab
--- /dev/null
+++ b/svg/apps/steam.svg
@@ -0,0 +1,7 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Steam: a solid disc with the piston in the dark treatment - a ring up right, a hub down left, the rod between. -->
+<circle cx="20" cy="20" r="15" fill="#ffffff" />
+ <circle cx="25" cy="15" r="5" stroke-width="2.75" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <path d="M21.5 18.5 L13.5 26" stroke-width="4" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <circle cx="13" cy="26.5" r="3.5" fill="#282a36" opacity="0.35" />
+</svg>
diff --git a/svg/apps/sunset.svg b/svg/apps/sunset.svg
new file mode 100644
index 0000000..cc03771
--- /dev/null
+++ b/svg/apps/sunset.svg
@@ -0,0 +1,16 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Sunset (Gammastep): a half sun on the horizon, rays and reflection lines at 0.55 back-layer opacity. -->
+<path fill="#ffffff" d="M10 24 A10 10 0 0 1 30 24 Z" />
+ <g fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" opacity="0.55">
+ <path d="M20 10 L20 6" transform="rotate(-60 20 24)" />
+ <path d="M20 10 L20 6" transform="rotate(-30 20 24)" />
+ <path d="M20 10 L20 6" transform="rotate(0 20 24)" />
+ <path d="M20 10 L20 6" transform="rotate(30 20 24)" />
+ <path d="M20 10 L20 6" transform="rotate(60 20 24)" />
+ </g>
+ <path d="M4 27 L36 27" fill="none" stroke="#ffffff" stroke-width="3.5" stroke-linecap="round" />
+ <g fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" opacity="0.55">
+ <path d="M11 32 L29 32" />
+ <path d="M15 36.5 L25 36.5" />
+ </g>
+</svg>
diff --git a/svg/apps/theme-settings.svg b/svg/apps/theme-settings.svg
new file mode 100644
index 0000000..b0df2e8
--- /dev/null
+++ b/svg/apps/theme-settings.svg
@@ -0,0 +1,13 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Theme settings (qt5ct/qt6ct): three slider tracks at 0.55 with solid knobs set at different points. -->
+<g fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" opacity="0.55">
+ <path d="M6 10 L34 10" />
+ <path d="M6 20 L34 20" />
+ <path d="M6 30 L34 30" />
+ </g>
+ <g fill="#ffffff">
+ <circle cx="25" cy="10" r="4.5" />
+ <circle cx="13" cy="20" r="4.5" />
+ <circle cx="21" cy="30" r="4.5" />
+ </g>
+</svg>
diff --git a/svg/apps/topology.svg b/svg/apps/topology.svg
new file mode 100644
index 0000000..68ce591
--- /dev/null
+++ b/svg/apps/topology.svg
@@ -0,0 +1,12 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Hardware topology (lstopo): a wireframe package holding two back-layer cores, each with two solid units. -->
+<path d="M5 11.0 C5 7.0 7.0 5 11.0 5 L29.0 5 C33.0 5 35 7.0 35 11.0 L35 29.0 C35 33.0 33.0 35 29.0 35 L11.0 35 C7.0 35 5 33.0 5 29.0 Z" fill="none" stroke="#ffffff" stroke-width="3" />
+ <g fill="#ffffff" opacity="0.55">
+ <rect x="10" y="10" width="9" height="20" rx="2" />
+ <rect x="21" y="10" width="9" height="20" rx="2" />
+ </g>
+ <g fill="#ffffff">
+ <rect x="11.5" y="22" width="6" height="6" rx="1.5" />
+ <rect x="22.5" y="22" width="6" height="6" rx="1.5" />
+ </g>
+</svg>
diff --git a/svg/apps/translate.svg b/svg/apps/translate.svg
new file mode 100644
index 0000000..d2611ec
--- /dev/null
+++ b/svg/apps/translate.svg
@@ -0,0 +1,7 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Translation (Qt Linguist): two speech bubbles, the back one at 0.55, the front one solid with a dark crease line of text. -->
+<path fill="#ffffff" opacity="0.55" d="M15 11.0 C15 7.0 17.0 5 21.0 5 L30.0 5 C34.0 5 36 7.0 36 11.0 L36 14.0 C36 18.0 34.0 20 30.0 20 L21.0 20 C17.0 20 15 18.0 15 14.0 Z M30 19 L33 24 L25 19 Z" />
+ <path fill="#ffffff" d="M4 20.0 C4 16.0 6.0 14 10.0 14 L20.0 14 C24.0 14 26 16.0 26 20.0 L26 24.0 C26 28.0 24.0 30 20.0 30 L10.0 30 C6.0 30 4 28.0 4 24.0 Z" />
+ <path fill="#ffffff" d="M9 29 L7 35 L15 29 Z" />
+ <path d="M9.5 22 L20.5 22" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/tree.svg b/svg/apps/tree.svg
new file mode 100644
index 0000000..faca0a6
--- /dev/null
+++ b/svg/apps/tree.svg
@@ -0,0 +1,9 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Object tree (Qt D-Bus Viewer): a root node with two elbow branches to child nodes, the children at 0.55. -->
+<path d="M10 12 L10 29 L22 29 M10 20 L22 20" fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" />
+ <rect x="4" y="5" width="12" height="9" rx="3" fill="#ffffff" />
+ <g fill="#ffffff" opacity="0.55">
+ <rect x="22" y="16" width="14" height="8" rx="3" />
+ <rect x="22" y="25" width="14" height="8" rx="3" />
+ </g>
+</svg>
diff --git a/svg/apps/ubisoft.svg b/svg/apps/ubisoft.svg
new file mode 100644
index 0000000..104eea5
--- /dev/null
+++ b/svg/apps/ubisoft.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Ubisoft Connect: the swirl - a solid disc with a three-quarter dark ring and an off-centre dot. -->
+<circle cx="20" cy="20" r="15" fill="#ffffff" />
+ <path d="M28.5 20 A8.5 8.5 0 1 1 20 11.5" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <circle cx="21.5" cy="18.5" r="2.5" fill="#282a36" opacity="0.35" />
+</svg>
diff --git a/svg/apps/video-camera.svg b/svg/apps/video-camera.svg
new file mode 100644
index 0000000..cc69da6
--- /dev/null
+++ b/svg/apps/video-camera.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Video camera (Zoom): squircle body with the lens hood as a round-joined trapezoid off its right side. -->
+<path fill="#ffffff" d="M4 17.75 C4 13.25 6.25 11 10.75 11 L19.25 11 C23.75 11 26 13.25 26 17.75 L26 22.25 C26 26.75 23.75 29 19.25 29 L10.75 29 C6.25 29 4 26.75 4 22.25 Z" />
+ <path fill="#ffffff" stroke="#ffffff" stroke-width="3" stroke-linejoin="round" d="M29 17.5 L35 13.5 L35 26.5 L29 22.5 Z" />
+</svg>
diff --git a/svg/apps/video-capture.svg b/svg/apps/video-capture.svg
new file mode 100644
index 0000000..02b54ae
--- /dev/null
+++ b/svg/apps/video-capture.svg
@@ -0,0 +1,6 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Video capture (Qt V4L2 capture utility): a solid screen panel with a dark record dot and play mark. -->
+<path fill="#ffffff" d="M4 14.75 C4 10.25 6.25 8 10.75 8 L29.25 8 C33.75 8 36 10.25 36 14.75 L36 25.25 C36 29.75 33.75 32 29.25 32 L10.75 32 C6.25 32 4 29.75 4 25.25 Z" />
+ <circle cx="13" cy="20" r="4" fill="#282a36" opacity="0.35" />
+ <path d="M21 14.5 L29 20 L21 25.5 Z" fill="#282a36" opacity="0.35" />
+</svg>
diff --git a/svg/apps/webcam.svg b/svg/apps/webcam.svg
new file mode 100644
index 0000000..e592bc5
--- /dev/null
+++ b/svg/apps/webcam.svg
@@ -0,0 +1,7 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Webcam (Qt V4L2 test utility): a solid head with a dark lens ring, on a neck and foot. -->
+<circle cx="20" cy="17" r="12" fill="#ffffff" />
+ <circle cx="20" cy="17" r="5" stroke-width="3" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <path d="M20 29 L20 33" fill="none" stroke="#ffffff" stroke-width="4" />
+ <rect x="11" y="32" width="18" height="4" rx="2" fill="#ffffff" />
+</svg>
diff --git a/svg/apps/winetricks.svg b/svg/apps/winetricks.svg
new file mode 100644
index 0000000..580d49a
--- /dev/null
+++ b/svg/apps/winetricks.svg
@@ -0,0 +1,8 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Winetricks: a solid wine glass, its wine line a dark crease, with a sparkle off the rim. -->
+<path fill="#ffffff" d="M11 5 L29 5 C30 15 27 21.5 20 22.5 C13 21.5 10 15 11 5 Z" />
+ <path d="M12.5 11.5 L27.5 11.5" stroke-width="2.5" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+ <path d="M20 22 L20 32" fill="none" stroke="#ffffff" stroke-width="3.5" />
+ <rect x="12" y="31.5" width="16" height="4" rx="2" fill="#ffffff" />
+ <path fill="#ffffff" d="M33 4 Q33.6 7.4 37 8 Q33.6 8.6 33 12 Q32.4 8.6 29 8 Q32.4 7.4 33 4 Z" />
+</svg>
diff --git a/svg/apps/zed.svg b/svg/apps/zed.svg
new file mode 100644
index 0000000..2dd11f9
--- /dev/null
+++ b/svg/apps/zed.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Zed: a solid squircle panel with a dark Z. -->
+<path fill="#ffffff" d="M5 12.5 C5 7.5 7.5 5 12.5 5 L27.5 5 C32.5 5 35 7.5 35 12.5 L35 27.5 C35 32.5 32.5 35 27.5 35 L12.5 35 C7.5 35 5 32.5 5 27.5 Z" />
+ <path d="M12.5 12.5 L27.5 12.5 L12.5 27.5 L27.5 27.5" stroke-width="3.5" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/zellij.svg b/svg/apps/zellij.svg
new file mode 100644
index 0000000..cddb004
--- /dev/null
+++ b/svg/apps/zellij.svg
@@ -0,0 +1,8 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Zellij: three tiled panes lit like cube.svg's faces - the tall left pane full, the right pair 0.7 and 0.42. -->
+<g fill="#ffffff">
+ <path d="M5 10.25 C5 6.75 6.75 5 10.25 5 L13.75 5 C17.25 5 19 6.75 19 10.25 L19 29.75 C19 33.25 17.25 35 13.75 35 L10.25 35 C6.75 35 5 33.25 5 29.75 Z" />
+ <path d="M21 10.25 C21 6.75 22.75 5 26.25 5 L29.75 5 C33.25 5 35 6.75 35 10.25 L35 13.75 C35 17.25 33.25 19 29.75 19 L26.25 19 C22.75 19 21 17.25 21 13.75 Z" opacity="0.7" />
+ <path d="M21 26.25 C21 22.75 22.75 21 26.25 21 L29.75 21 C33.25 21 35 22.75 35 26.25 L35 29.75 C35 33.25 33.25 35 29.75 35 L26.25 35 C22.75 35 21 33.25 21 29.75 Z" opacity="0.42" />
+ </g>
+</svg>
diff --git a/svg/apps/zeroconf-ssh.svg b/svg/apps/zeroconf-ssh.svg
new file mode 100644
index 0000000..dab9dc6
--- /dev/null
+++ b/svg/apps/zeroconf-ssh.svg
@@ -0,0 +1,9 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Zeroconf SSH browser (Avahi): discovery arcs over a small terminal panel with a dark prompt. -->
+<g fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round">
+ <path d="M15.88 13.37 A5.5 5.5 0 0 1 24.12 13.37" />
+ <path d="M11.75 9.74 A11 11 0 0 1 28.25 9.74" />
+ </g>
+ <path fill="#ffffff" d="M7 24.0 C7 20.0 9.0 18 13.0 18 L27.0 18 C31.0 18 33 20.0 33 24.0 L33 30.0 C33 34.0 31.0 36 27.0 36 L13.0 36 C9.0 36 7 34.0 7 30.0 Z" />
+ <path d="M12.5 23 L16.5 27 L12.5 31 M19.5 31 L25 31" stroke-width="2.5" fill="none" stroke="#282a36" opacity="0.35" stroke-linecap="round" stroke-linejoin="round" />
+</svg>
diff --git a/svg/apps/zeroconf-vnc.svg b/svg/apps/zeroconf-vnc.svg
new file mode 100644
index 0000000..e9d619c
--- /dev/null
+++ b/svg/apps/zeroconf-vnc.svg
@@ -0,0 +1,9 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Zeroconf VNC browser (Avahi): discovery arcs over a small monitor, its screen solid. -->
+<g fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round">
+ <path d="M15.88 13.37 A5.5 5.5 0 0 1 24.12 13.37" />
+ <path d="M11.75 9.74 A11 11 0 0 1 28.25 9.74" />
+ </g>
+ <path fill="#ffffff" d="M7 24.0 C7 20.0 9.0 18 13.0 18 L27.0 18 C31.0 18 33 20.0 33 24.0 L33 26.0 C33 30.0 31.0 32 27.0 32 L13.0 32 C9.0 32 7 30.0 7 26.0 Z" />
+ <rect x="14" y="33" width="12" height="3" rx="1.5" fill="#ffffff" />
+</svg>
diff --git a/svg/apps/zeroconf.svg b/svg/apps/zeroconf.svg
new file mode 100644
index 0000000..3d0b8b9
--- /dev/null
+++ b/svg/apps/zeroconf.svg
@@ -0,0 +1,8 @@
+<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
+ <!-- Zeroconf browser (Avahi): a beacon dot broadcasting two arcs of service discovery. -->
+<circle cx="20" cy="29" r="4" fill="#ffffff" />
+ <g fill="none" stroke="#ffffff" stroke-width="3.5" stroke-linecap="round">
+ <path d="M12.5 22.4 A10 10 0 0 1 27.5 22.4" />
+ <path d="M7.25 17.78 A17 17 0 0 1 32.75 17.78" />
+ </g>
+</svg>