diff --git a/Justfile b/Justfile
index 9bbf3d5..a70f4fd 100644
--- a/Justfile
+++ b/Justfile
@@ -226,6 +226,24 @@ ladle:
screenshots:
cd client && node screenshots.mjs
+# Rasterises client/public/icon.svg (the source of truth) into the PWA any +
+# maskable PNGs, the apple-touch-icon, and packaging/macos/deckd.icns. Uses
+# the e2e Chromium, so client/node_modules must be installed; the .icns step
+# is macOS-only (iconutil) and is skipped elsewhere.
+#
+# Regenerate all app icons from the brand SVG
+icons:
+ #!/usr/bin/env bash
+ set -euo pipefail
+ cd client && node render-icons.mjs
+ cd ..
+ if command -v iconutil >/dev/null 2>&1; then
+ iconutil -c icns build/deckd.iconset -o packaging/macos/deckd.icns
+ echo "Wrote packaging/macos/deckd.icns"
+ else
+ echo "iconutil not found (not macOS); skipped .icns, PNGs are up to date."
+ fi
+
# Run the full verification ladder (docs/ONBOARDING.md) in order:
# typechecks first (cheap gates), then Python unit/integration, then
# TypeScript compile, client unit tests, Playwright e2e, the daemon
diff --git a/assets/deckd-logo-light.svg b/assets/deckd-logo-light.svg
new file mode 100644
index 0000000..9cdfb24
--- /dev/null
+++ b/assets/deckd-logo-light.svg
@@ -0,0 +1,56 @@
+
diff --git a/assets/deckd-logo.svg b/assets/deckd-logo.svg
new file mode 100644
index 0000000..289b75b
--- /dev/null
+++ b/assets/deckd-logo.svg
@@ -0,0 +1,60 @@
+
diff --git a/assets/deckd-mark-2x2.png b/assets/deckd-mark-2x2.png
new file mode 100644
index 0000000..ace1f8b
Binary files /dev/null and b/assets/deckd-mark-2x2.png differ
diff --git a/assets/deckd-mark-2x2.svg b/assets/deckd-mark-2x2.svg
new file mode 100644
index 0000000..10651ff
--- /dev/null
+++ b/assets/deckd-mark-2x2.svg
@@ -0,0 +1,37 @@
+
diff --git a/assets/deckd-mark-3x2.png b/assets/deckd-mark-3x2.png
new file mode 100644
index 0000000..bbdb297
Binary files /dev/null and b/assets/deckd-mark-3x2.png differ
diff --git a/assets/deckd-mark-mono.svg b/assets/deckd-mark-mono.svg
new file mode 100644
index 0000000..9cc91a2
--- /dev/null
+++ b/assets/deckd-mark-mono.svg
@@ -0,0 +1,13 @@
+
diff --git a/assets/deckd-mark.png b/assets/deckd-mark.png
new file mode 100644
index 0000000..d6b7d87
Binary files /dev/null and b/assets/deckd-mark.png differ
diff --git a/assets/deckd-mark.svg b/assets/deckd-mark.svg
new file mode 100644
index 0000000..d37bacd
--- /dev/null
+++ b/assets/deckd-mark.svg
@@ -0,0 +1,47 @@
+
diff --git a/client/index.html b/client/index.html
index 3f5a7a1..e857e10 100644
--- a/client/index.html
+++ b/client/index.html
@@ -10,7 +10,8 @@
(root in dev, /deckd/ on Project Pages). -->
-
+
+
diff --git a/client/public/apple-touch-icon.png b/client/public/apple-touch-icon.png
new file mode 100644
index 0000000..f066cec
Binary files /dev/null and b/client/public/apple-touch-icon.png differ
diff --git a/client/public/icon-192.png b/client/public/icon-192.png
new file mode 100644
index 0000000..bc2011d
Binary files /dev/null and b/client/public/icon-192.png differ
diff --git a/client/public/icon-512.png b/client/public/icon-512.png
new file mode 100644
index 0000000..7104993
Binary files /dev/null and b/client/public/icon-512.png differ
diff --git a/client/public/icon-maskable-192.png b/client/public/icon-maskable-192.png
new file mode 100644
index 0000000..31c28d9
Binary files /dev/null and b/client/public/icon-maskable-192.png differ
diff --git a/client/public/icon-maskable-512.png b/client/public/icon-maskable-512.png
new file mode 100644
index 0000000..0499884
Binary files /dev/null and b/client/public/icon-maskable-512.png differ
diff --git a/client/public/icon-maskable.svg b/client/public/icon-maskable.svg
new file mode 100644
index 0000000..5bb482c
--- /dev/null
+++ b/client/public/icon-maskable.svg
@@ -0,0 +1,35 @@
+
diff --git a/client/public/icon.svg b/client/public/icon.svg
index b286fa1..10651ff 100644
--- a/client/public/icon.svg
+++ b/client/public/icon.svg
@@ -1,12 +1,37 @@
-