diff --git a/CHANGELOG.md b/CHANGELOG.md
index 740c0f9ab..7b2807d72 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,10 @@ scheme restriction) live in `UPGRADE-NOTES.md` and are auto-appended to every
1.4.6+ / 1.5.x release's notes by `scripts/append-upgrade-notes.mjs` (wired into
`release-cut.yml`). Update that file — not this comment — when the notes change. -->
+### Changed
+
+- **Refreshed the drydock whale logo across the app, website, demo, and docs.** A new master render replaces the brand mark everywhere — the in-app logo and favicons, the website/demo favicons, PWA icons, and OpenGraph cards, and the README/docs logos (including the dark-mode variant). All brand assets are now regenerated from a single master (`drydock.png`) via `scripts/regenerate-brand-assets.sh`. Filenames are unchanged, so the Home Assistant `entity_picture` URL contract is preserved.
+
### Security
- **Documentation site (`apps/web`) js-yaml pinned to 4.2.0 ([GHSA-h67p-54hq-rp68](https://github.com/advisories/GHSA-h67p-54hq-rp68)).** `fumadocs-mdx` pulled js-yaml 4.1.1 transitively; an override forces the patched 4.2.0. Build-time dependency of the website only — not part of the shipped drydock image.
diff --git a/apps/demo/public/apple-touch-icon.png b/apps/demo/public/apple-touch-icon.png
index 839ad65bd..fc7b0aafa 100644
Binary files a/apps/demo/public/apple-touch-icon.png and b/apps/demo/public/apple-touch-icon.png differ
diff --git a/apps/demo/public/favicon-96x96.png b/apps/demo/public/favicon-96x96.png
index 900cd78da..ac944f5c4 100644
Binary files a/apps/demo/public/favicon-96x96.png and b/apps/demo/public/favicon-96x96.png differ
diff --git a/apps/demo/public/favicon.ico b/apps/demo/public/favicon.ico
index 52972c7fa..35bedb285 100644
Binary files a/apps/demo/public/favicon.ico and b/apps/demo/public/favicon.ico differ
diff --git a/apps/demo/public/favicon.svg b/apps/demo/public/favicon.svg
index 363c7f2df..4f279219f 100644
--- a/apps/demo/public/favicon.svg
+++ b/apps/demo/public/favicon.svg
@@ -1,17 +1,7 @@
-
\ No newline at end of file
+
+
+
+
diff --git a/apps/demo/public/og-image.png b/apps/demo/public/og-image.png
index 7bbb6ab41..e3e8fc1e9 100644
Binary files a/apps/demo/public/og-image.png and b/apps/demo/public/og-image.png differ
diff --git a/apps/demo/public/web-app-manifest-192x192.png b/apps/demo/public/web-app-manifest-192x192.png
index 86d606a2b..deff8f6e9 100644
Binary files a/apps/demo/public/web-app-manifest-192x192.png and b/apps/demo/public/web-app-manifest-192x192.png differ
diff --git a/apps/demo/public/web-app-manifest-512x512.png b/apps/demo/public/web-app-manifest-512x512.png
index bd6910ded..c254b9c1d 100644
Binary files a/apps/demo/public/web-app-manifest-512x512.png and b/apps/demo/public/web-app-manifest-512x512.png differ
diff --git a/apps/web/public/apple-touch-icon.png b/apps/web/public/apple-touch-icon.png
index 839ad65bd..3a2aa2d81 100644
Binary files a/apps/web/public/apple-touch-icon.png and b/apps/web/public/apple-touch-icon.png differ
diff --git a/apps/web/public/docs/assets/assets/whale-logo.png b/apps/web/public/docs/assets/assets/whale-logo.png
index 06fc326be..e2ad60c55 100644
Binary files a/apps/web/public/docs/assets/assets/whale-logo.png and b/apps/web/public/docs/assets/assets/whale-logo.png differ
diff --git a/apps/web/public/docs/assets/whale-logo.png b/apps/web/public/docs/assets/whale-logo.png
index 06fc326be..e2ad60c55 100644
Binary files a/apps/web/public/docs/assets/whale-logo.png and b/apps/web/public/docs/assets/whale-logo.png differ
diff --git a/apps/web/public/favicon-96x96.png b/apps/web/public/favicon-96x96.png
index 900cd78da..e60397683 100644
Binary files a/apps/web/public/favicon-96x96.png and b/apps/web/public/favicon-96x96.png differ
diff --git a/apps/web/public/favicon.ico b/apps/web/public/favicon.ico
index 52972c7fa..35bedb285 100644
Binary files a/apps/web/public/favicon.ico and b/apps/web/public/favicon.ico differ
diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg
index 363c7f2df..4f279219f 100644
--- a/apps/web/public/favicon.svg
+++ b/apps/web/public/favicon.svg
@@ -1,17 +1,7 @@
-
\ No newline at end of file
+
+
+
+
diff --git a/apps/web/public/og-image.png b/apps/web/public/og-image.png
index 7bbb6ab41..e3e8fc1e9 100644
Binary files a/apps/web/public/og-image.png and b/apps/web/public/og-image.png differ
diff --git a/apps/web/public/web-app-manifest-192x192.png b/apps/web/public/web-app-manifest-192x192.png
index 86d606a2b..6bdd3e58f 100644
Binary files a/apps/web/public/web-app-manifest-192x192.png and b/apps/web/public/web-app-manifest-192x192.png differ
diff --git a/apps/web/public/web-app-manifest-512x512.png b/apps/web/public/web-app-manifest-512x512.png
index bd6910ded..f5c15f79e 100644
Binary files a/apps/web/public/web-app-manifest-512x512.png and b/apps/web/public/web-app-manifest-512x512.png differ
diff --git a/apps/web/public/whale-logo.png b/apps/web/public/whale-logo.png
index 06fc326be..c1e58594c 100644
Binary files a/apps/web/public/whale-logo.png and b/apps/web/public/whale-logo.png differ
diff --git a/docs/assets/whale-logo-dark.png b/docs/assets/whale-logo-dark.png
index d7a180bdd..bd2c4ca2d 100644
Binary files a/docs/assets/whale-logo-dark.png and b/docs/assets/whale-logo-dark.png differ
diff --git a/docs/assets/whale-logo.png b/docs/assets/whale-logo.png
index 06fc326be..c1e58594c 100644
Binary files a/docs/assets/whale-logo.png and b/docs/assets/whale-logo.png differ
diff --git a/drydock.png b/drydock.png
new file mode 100644
index 000000000..eb9740230
Binary files /dev/null and b/drydock.png differ
diff --git a/scripts/regenerate-brand-assets.sh b/scripts/regenerate-brand-assets.sh
new file mode 100755
index 000000000..5b20ea72a
--- /dev/null
+++ b/scripts/regenerate-brand-assets.sh
@@ -0,0 +1,109 @@
+#!/usr/bin/env bash
+#
+# Regenerate every drydock brand asset (logo marks, favicons, PWA icons, OG cards)
+# from a single master logo. Run after dropping a new master at the repo root.
+#
+# bash scripts/regenerate-brand-assets.sh [path-to-master.png]
+#
+# Defaults to ./drydock.png. Requires ImageMagick 7 (`magick`).
+#
+# Filenames are intentionally preserved in place — never rename. docs/assets/whale-logo.png
+# in particular is an external URL contract (Home Assistant entity_picture, app/triggers/
+# providers/mqtt/Hass.ts); renaming it broke HASS once (CHANGELOG #138).
+#
+# NOT touched here (different brand / not the logo): the CodesWhat org logo
+# (codeswhat-logo*), the selfhst/* third-party service icons, and app screenshots.
+set -euo pipefail
+
+ROOT="$(cd "$(dirname "$0")/.." && pwd)"
+cd "$ROOT"
+SRC="${1:-drydock.png}"
+[ -f "$SRC" ] || {
+ echo "master logo not found: $SRC" >&2
+ exit 1
+}
+command -v magick >/dev/null 2>&1 || {
+ echo "ImageMagick 'magick' is required" >&2
+ exit 1
+}
+
+TMP="$(mktemp -d)"
+trap 'rm -rf "$TMP"' EXIT
+
+# 1. Wide transparent marks — preserve aspect, ~1041px wide (display size set by markup).
+WIDE_MARKS=(
+ ui/public/drydock-logo.png
+ ui/src/assets/drydock.png
+ apps/web/public/whale-logo.png
+ docs/assets/whale-logo.png
+ apps/web/public/docs/assets/whale-logo.png
+ apps/web/public/docs/assets/assets/whale-logo.png
+)
+for f in "${WIDE_MARKS[@]}"; do
+ [ -f "$f" ] || {
+ echo "skip (absent): $f"
+ continue
+ }
+ magick "$SRC" -resize 1041x -background none "$f"
+ echo "wide $f"
+done
+
+# Small inline UI mark (imported with ?inline → base64 in the bundle, keep it light).
+if [ -f ui/src/assets/whale-logo.png ]; then
+ magick "$SRC" -resize 256x -background none ui/src/assets/whale-logo.png
+ echo "inline ui/src/assets/whale-logo.png"
+fi
+
+# 2. Dark-mode logo variant — negate RGB (blue→orange) preserving alpha, mirroring the
+# favicon.svg @media-dark invert(1). Derived from the one master, not a separate asset.
+if [ -f docs/assets/whale-logo-dark.png ]; then
+ magick "$SRC" -resize 1041x -channel RGB -negate +channel docs/assets/whale-logo-dark.png
+ echo "dark docs/assets/whale-logo-dark.png"
+fi
+
+# 3. Square icons — whale centered on white, ~8% padding (matches the apple-touch look).
+make_square() { # size out
+ local size="$1" out="$2" inner=$(($1 * 84 / 100))
+ magick "$SRC" -resize "${inner}x${inner}" -background white -gravity center \
+ -extent "${size}x${size}" "$out"
+}
+for base in ui/public apps/web/public apps/demo/public; do
+ [ -f "$base/favicon-96x96.png" ] && make_square 96 "$base/favicon-96x96.png" && echo "sq96 $base/favicon-96x96.png"
+ [ -f "$base/apple-touch-icon.png" ] && make_square 180 "$base/apple-touch-icon.png" && echo "apple $base/apple-touch-icon.png"
+ [ -f "$base/web-app-manifest-192x192.png" ] && make_square 192 "$base/web-app-manifest-192x192.png" && echo "pwa192 $base/web-app-manifest-192x192.png"
+ [ -f "$base/web-app-manifest-512x512.png" ] && make_square 512 "$base/web-app-manifest-512x512.png" && echo "pwa512 $base/web-app-manifest-512x512.png"
+ if [ -f "$base/favicon.ico" ]; then
+ make_square 256 "$TMP/ico.png"
+ magick "$TMP/ico.png" -define icon:auto-resize=16,32,48 "$base/favicon.ico"
+ echo "ico $base/favicon.ico"
+ fi
+done
+
+# 4. OG social cards — whale centered on white, preserve aspect.
+for f in apps/web/public/og-image.png apps/demo/public/og-image.png; do
+ [ -f "$f" ] || continue
+ magick "$SRC" -resize 1120x520 -background white -gravity center -extent 1280x640 "$f"
+ echo "og $f"
+done
+
+# 5. favicon.svg — base64-wrapped square raster, keeping the dark-mode invert filter.
+make_svg() { # out
+ make_square 256 "$TMP/svg.png"
+ local b64
+ b64="$(base64 <"$TMP/svg.png" | tr -d '\n')"
+ cat >"$1" <
+
+
+
+SVG
+ echo "svg $1"
+}
+for f in ui/public/favicon.svg apps/web/public/favicon.svg apps/demo/public/favicon.svg; do
+ [ -f "$f" ] && make_svg "$f"
+done
+
+echo "Done."
diff --git a/ui/public/apple-touch-icon.png b/ui/public/apple-touch-icon.png
index 839ad65bd..3a2aa2d81 100644
Binary files a/ui/public/apple-touch-icon.png and b/ui/public/apple-touch-icon.png differ
diff --git a/ui/public/drydock-logo.png b/ui/public/drydock-logo.png
index 06fc326be..c432aa545 100644
Binary files a/ui/public/drydock-logo.png and b/ui/public/drydock-logo.png differ
diff --git a/ui/public/favicon-96x96.png b/ui/public/favicon-96x96.png
index 900cd78da..e60397683 100644
Binary files a/ui/public/favicon-96x96.png and b/ui/public/favicon-96x96.png differ
diff --git a/ui/public/favicon.ico b/ui/public/favicon.ico
index 52972c7fa..35bedb285 100644
Binary files a/ui/public/favicon.ico and b/ui/public/favicon.ico differ
diff --git a/ui/public/favicon.svg b/ui/public/favicon.svg
index 4d33bb8d0..0dc11c346 100644
--- a/ui/public/favicon.svg
+++ b/ui/public/favicon.svg
@@ -1,9 +1,7 @@
-
+
-
+
diff --git a/ui/public/web-app-manifest-192x192.png b/ui/public/web-app-manifest-192x192.png
index 86d606a2b..6bdd3e58f 100644
Binary files a/ui/public/web-app-manifest-192x192.png and b/ui/public/web-app-manifest-192x192.png differ
diff --git a/ui/public/web-app-manifest-512x512.png b/ui/public/web-app-manifest-512x512.png
index bd6910ded..f5c15f79e 100644
Binary files a/ui/public/web-app-manifest-512x512.png and b/ui/public/web-app-manifest-512x512.png differ
diff --git a/ui/src/assets/drydock.png b/ui/src/assets/drydock.png
index 06fc326be..c1e58594c 100644
Binary files a/ui/src/assets/drydock.png and b/ui/src/assets/drydock.png differ
diff --git a/ui/src/assets/whale-logo.png b/ui/src/assets/whale-logo.png
index 9a7850b73..26dbf6282 100644
Binary files a/ui/src/assets/whale-logo.png and b/ui/src/assets/whale-logo.png differ