From 7621f88fead6ec0626bb48bf98c0eb678b0e6ef6 Mon Sep 17 00:00:00 2001 From: Zac Gaetano Date: Sun, 3 May 2026 13:14:41 +0000 Subject: [PATCH] feat(ui): Wild Dragon reskin overlay on the Restreamer UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Layers Wild Dragon branding on top of upstream restreamer-ui v1.14.0 without forking the whole repo — keeps upstream UI updates flowing in when we bump RESTREAMER_UI_REF. Overlay (deploy/truenas/core/ui-overlay/): public/index.html Wild Dragon title, theme color #0d0e12 public/manifest.json PWA name/short_name/colors public/favicon.ico multi-res ICO (16/32/64) generated from a 'WD' monogram in orange #ff6633 on dark public/logo192.png Apple touch icon public/logo512.png PWA install icon src/misc/Logo/images/ rs-logo.svg (square mark, used in the Header) and logo.svg (wordmark, used in the Footer) — both Wild-Dragon-themed src/misc/Logo/{index,rsLogo}.js link the logos to forge.wilddragon.net instead of datarhei.com apply-overlay.sh runs in the Docker ui-builder stage just after the upstream git clone and just before yarn install. Two phases: 1. rsync the overlay's public/ and src/ on top of the cloned upstream tree 2. Targeted in-place patches for one-line UI strings (header title, two welcome captions). Each patch is anchored to a unique surrounding context and the script fails loudly if the anchor isn't present — so a future upstream rename surfaces immediately rather than silently shipping un-rebranded UI. Image size: ~+50KB (the overlay assets), no measurable build-time delta. PWA installs and OS bookmarks now show Wild Dragon. The remaining 'Restreamer'/'datarhei' references in views/Welcome.js, views/Login.js, views/Settings.js, etc. are deeper-page strings that aren't worth a one-off overlay; they'll go away when we fork the UI repo properly for the WebRTC tab milestone. Co-Authored-By: Claude Opus 4.7 --- deploy/truenas/core/Dockerfile | 15 +++- .../truenas/core/ui-overlay/apply-overlay.sh | 70 ++++++++++++++++++ .../core/ui-overlay/public/favicon.ico | Bin 0 -> 22382 bytes .../truenas/core/ui-overlay/public/index.html | 17 +++++ .../core/ui-overlay/public/logo192.png | Bin 0 -> 5619 bytes .../core/ui-overlay/public/logo512.png | Bin 0 -> 16291 bytes .../core/ui-overlay/public/manifest.json | 13 ++++ .../ui-overlay/src/misc/Logo/images/logo.svg | 24 ++++++ .../src/misc/Logo/images/rs-logo.svg | 19 +++++ .../core/ui-overlay/src/misc/Logo/index.js | 24 ++++++ .../core/ui-overlay/src/misc/Logo/rsLogo.js | 24 ++++++ 11 files changed, 204 insertions(+), 2 deletions(-) create mode 100755 deploy/truenas/core/ui-overlay/apply-overlay.sh create mode 100644 deploy/truenas/core/ui-overlay/public/favicon.ico create mode 100644 deploy/truenas/core/ui-overlay/public/index.html create mode 100644 deploy/truenas/core/ui-overlay/public/logo192.png create mode 100644 deploy/truenas/core/ui-overlay/public/logo512.png create mode 100644 deploy/truenas/core/ui-overlay/public/manifest.json create mode 100644 deploy/truenas/core/ui-overlay/src/misc/Logo/images/logo.svg create mode 100644 deploy/truenas/core/ui-overlay/src/misc/Logo/images/rs-logo.svg create mode 100644 deploy/truenas/core/ui-overlay/src/misc/Logo/index.js create mode 100644 deploy/truenas/core/ui-overlay/src/misc/Logo/rsLogo.js diff --git a/deploy/truenas/core/Dockerfile b/deploy/truenas/core/Dockerfile index 0e51269..f1f9166 100644 --- a/deploy/truenas/core/Dockerfile +++ b/deploy/truenas/core/Dockerfile @@ -39,9 +39,20 @@ FROM node:21-alpine3.20 AS ui-builder ARG RESTREAMER_UI_REF=v1.14.0 RUN apk add --no-cache git WORKDIR /ui + +# 1. Pull upstream restreamer-ui at the pinned tag. RUN git clone --depth=1 --branch ${RESTREAMER_UI_REF} \ - https://github.com/datarhei/restreamer-ui.git . \ - && yarn install --frozen-lockfile --network-timeout 600000 \ + https://github.com/datarhei/restreamer-ui.git . + +# 2. Layer Wild Dragon overlays on top of the upstream tree before the +# build runs. apply-overlay.sh does the rsync + targeted seds; see +# deploy/truenas/core/ui-overlay/apply-overlay.sh for the contract. +COPY deploy/truenas/core/ui-overlay /overlay +RUN OVERLAY=/overlay UI=/ui /overlay/apply-overlay.sh + +# 3. Install + build. PUBLIC_URL=./ keeps asset references relative so +# the bundle is portable across mount paths. +RUN yarn install --frozen-lockfile --network-timeout 600000 \ && PUBLIC_URL="./" GENERATE_SOURCEMAP=false yarn build # ---- runtime ---- diff --git a/deploy/truenas/core/ui-overlay/apply-overlay.sh b/deploy/truenas/core/ui-overlay/apply-overlay.sh new file mode 100755 index 0000000..02e2343 --- /dev/null +++ b/deploy/truenas/core/ui-overlay/apply-overlay.sh @@ -0,0 +1,70 @@ +#!/bin/sh +# apply-overlay.sh — Wild Dragon reskin patches applied to a freshly +# cloned datarhei/restreamer-ui tree. Two phases: +# +# 1. File overlay: rsync the contents of $OVERLAY/{public,src} on top +# of the upstream working tree. Whole-file replacements only — +# simple and idempotent. +# +# 2. Targeted in-place sed for one-line UI strings that aren't worth +# a whole-file overlay (the header title, a few welcome strings). +# Each pattern is anchored to a unique surrounding context so a +# future upstream rename doesn't silently rewrite the wrong line. +# +# Caller: the Dockerfile's ui-builder stage. Expects: +# $OVERLAY = /overlay (the COPY destination) +# $UI = /ui (the cloned upstream source root) +# +# Idempotent on a single source tree (rerunning is a no-op). + +set -eu + +OVERLAY="${OVERLAY:-/overlay}" +UI="${UI:-/ui}" + +echo "wilddragon-overlay: layering $OVERLAY -> $UI" + +# Phase 1 — file copies. -L follows any future symlinks, -p preserves +# perms, -R recursive. We deliberately avoid --delete: the upstream +# tree must stay intact except for the files we override. +for sub in public src; do + if [ -d "$OVERLAY/$sub" ]; then + cp -RLp "$OVERLAY/$sub/." "$UI/$sub/" + fi +done + +# Phase 2 — targeted seds. Each replacement is wrapped in a check so +# the script fails loudly if upstream changed the line we're patching +# (rather than silently no-op'ing and shipping un-rebranded UI). +patch_line() { + file="$1"; needle="$2"; replacement="$3" + if ! grep -qF "$needle" "$file"; then + echo "wilddragon-overlay: ERROR — pattern not found in $file:" + echo " $needle" + exit 1 + fi + # Use awk for safe literal substitution (sed's regex would mishandle + # special chars in the replacement). + tmp="$(mktemp)" + awk -v n="$needle" -v r="$replacement" ' + index($0, n) { sub(n, r); } + { print } + ' "$file" > "$tmp" + mv "$tmp" "$file" + echo "wilddragon-overlay: patched $(basename "$file") — $needle -> $replacement" +} + +patch_line "$UI/src/Header.js" \ + 'Restreamer' \ + 'Wild Dragon' + +# Welcome view top-of-page card. +patch_line "$UI/src/views/Welcome.js" \ + 'title="Welcome to Restreamer v2"' \ + 'title="Welcome to Wild Dragon"' + +patch_line "$UI/src/views/Settings.js" \ + 'title="Welcome to Restreamer v2"' \ + 'title="Welcome to Wild Dragon"' + +echo "wilddragon-overlay: done." diff --git a/deploy/truenas/core/ui-overlay/public/favicon.ico b/deploy/truenas/core/ui-overlay/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c5bf58976731d18cca5e04882706b33ec454d829 GIT binary patch literal 22382 zcmeHPXKWlr6kY^>u^nIW`OZGyozGW&=Q}%b5)zV2Cy9xj-kVbh?I)s&E{c#4AViVq zq9Y*$Nc0X8Rg?e%L?}X{Bbq1zl3~8FXEM7td-9!6BoWWjYG!BOeDA$^-_Fe5zO`i? zW*u%dHCeojSi6p}tbWU~B9W2vyLtOfyscCkIZw^Dtoc66N^u!}iT4<3=Y?f)Ip<$< z!;y@RgJBFBSYgvQEV zBKmhPf1S0ZRo2bk9r;{BgsU8QTv`bQ?6%2LPN$CC5z5Hi5%-S&s* zqxyT>__ZgE{nG=Fu#VzMES%pd?DRBwSogA5SX+9v&@b&z4?JqLpE!76IOv=Ysy)X% z6X8dRADExSA0{5hAI0~;#FxgM#+^7o95@&`5Sw~|*wP27peB#>i1MT ze8{bOM_udNv6mIM{KRrA-)5cDE*5*0YW&O$KC7^FJ-~uZBga1G^F@>mQh##6JE{(+bK^<ba`emY?TeVx^x#`FLRmRNc zk12UK{WA86xwi`0p7oz|ZoSKSbcw)ejh0v_v1Al;AM^S;gq)lHYW&w@AI@(VxXF39 zb6xvbZuR>j_RWn=%rn8SIM9|^>#ASGf9=P@*0IE2kG(&T61d@>U8BA-vHzFjwx0td z&kVZ%h;yKQvV;E#fhYT$%Kfq5qh$T98Kplu`E1p$IKc05U`hRmHJ*`*TYluvId8Jq zQ5RKx|C?;1Hd-r*1H=L1Kz%vj_&MM|KgI79C4QXC5A{0*8XSKV_xi@2#*@aAI6xdA z4iE>31H=L10C9jgKpY?r5C@0@!~x;}aez2L93T!HnjFZl`9Qt5mG9sCcKjo9SWPhv z=Z4GW`MX@acQ?t)HoT`-_*`Dqxh~{U6gGX$-wp2;@1pU3xuvbIBA&z@Pl>z`yt7xf zXm*7XgGT*{**6&FvqR4r<)wYD{%bm&c4P*h=HoE2BCf=*r9@7GQ>Q$4izo6Mq>Nr7 zhR9=Zv!fROf!{m)8*A_0>Wb^8Z!GQc8CMy7f!^%U^JO}{-Y}Op^96m7bK<7g7JpV-ZC%^V1+j(nrmQ7!L#+B-N&xS8l{+Gl^ zFM7x(uiG(J|3x33J7kIt^7wVk@ziCWmb4vZWa25Txb+w1qf=k^^4HWgd}ojydO@9| ze_``?uJ%>sKhF~~%}vlh9-sBT$T!k`M?Dap$}&ryQtikKlzsGEF393riOy-4Dp`ru z66#fbWM7ok`VX#S9hSJFvJeM zWWzw8j>3s`@gHM`d(7rP$HzRWk83S;%rRJ3bZq2H0xK9_Y-^Y6ug;gk=I@0pzVmU$ z2zh`eo2rdJFidN0pkulb-=x#6tu->!<|D=-Hu)TZTh8;7MZ3-yeV)s$e9MM~d{C3# zTKqS~za^MA;+u53wM8eLX0sXo2V?UTu5F&1f0x+T=zNLxpP^*&EtbwB)P4TAx-M;~ z)_>gR$d9yP*XjOGFM801i|@odO#_D>-IjLBQtrcboAYZv zER%!0>A5H|_cpt%czzDp#-Nh_m~%0&b@Uu>-2Y=92zAwG|DT+Hr^D90JnuSavsJ`v z&MkI1?mPT9Js0b_=W0wH&nqVXrEI0L-p_yd#zWVK^-GVttcQD!v&o4*BCf4v@`#;| zi8{VPkyv6p-G2WV9am?6JZEN>)c5({*ODl+v#WHi%}!~v$tSn5LZ8CMuWZ=(K0{(v z@*m&GAjXA_Uy5%7ur|e}oX_0$(K;s856#~kDQ*-u;s9}gI6xdA4iE>31H=L10C9jg dKpY?r5C@0@!~x;}aiA6sIQ|^~o&L{8;9mn-H3 + + + + + + + + + + Wild Dragon + + + +
+ + diff --git a/deploy/truenas/core/ui-overlay/public/logo192.png b/deploy/truenas/core/ui-overlay/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..89850065b3530320ecc30d653abe6aab5667d4d3 GIT binary patch literal 5619 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 literal 0 HcmV?d00001 diff --git a/deploy/truenas/core/ui-overlay/public/manifest.json b/deploy/truenas/core/ui-overlay/public/manifest.json new file mode 100644 index 0000000..90a0fef --- /dev/null +++ b/deploy/truenas/core/ui-overlay/public/manifest.json @@ -0,0 +1,13 @@ +{ + "short_name": "Wild Dragon", + "name": "Wild Dragon — Live Streaming", + "icons": [ + { "src": "favicon.ico", "sizes": "64x64 32x32 16x16", "type": "image/x-icon" }, + { "src": "logo192.png", "type": "image/png", "sizes": "192x192" }, + { "src": "logo512.png", "type": "image/png", "sizes": "512x512" } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#0d0e12", + "background_color": "#0d0e12" +} diff --git a/deploy/truenas/core/ui-overlay/src/misc/Logo/images/logo.svg b/deploy/truenas/core/ui-overlay/src/misc/Logo/images/logo.svg new file mode 100644 index 0000000..f7d2242 --- /dev/null +++ b/deploy/truenas/core/ui-overlay/src/misc/Logo/images/logo.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + WD + + + + WILD DRAGON + + diff --git a/deploy/truenas/core/ui-overlay/src/misc/Logo/images/rs-logo.svg b/deploy/truenas/core/ui-overlay/src/misc/Logo/images/rs-logo.svg new file mode 100644 index 0000000..5842917 --- /dev/null +++ b/deploy/truenas/core/ui-overlay/src/misc/Logo/images/rs-logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/deploy/truenas/core/ui-overlay/src/misc/Logo/index.js b/deploy/truenas/core/ui-overlay/src/misc/Logo/index.js new file mode 100644 index 0000000..ee3c4e2 --- /dev/null +++ b/deploy/truenas/core/ui-overlay/src/misc/Logo/index.js @@ -0,0 +1,24 @@ +import React from 'react'; + +import makeStyles from '@mui/styles/makeStyles'; + +import company_logo from './images/logo.svg'; + +const useStyles = makeStyles((theme) => ({ + Logo: { + height: 27, + }, +})); + +export default function Logo(props) { + const classes = useStyles(); + + let link = 'https://forge.wilddragon.net/zgaetano/datarhei-dragonfork-core'; + + // eslint-disable-next-line no-useless-escape + return ( + + Wild Dragon logo + + ); +} diff --git a/deploy/truenas/core/ui-overlay/src/misc/Logo/rsLogo.js b/deploy/truenas/core/ui-overlay/src/misc/Logo/rsLogo.js new file mode 100644 index 0000000..be2a60f --- /dev/null +++ b/deploy/truenas/core/ui-overlay/src/misc/Logo/rsLogo.js @@ -0,0 +1,24 @@ +import React from 'react'; + +import makeStyles from '@mui/styles/makeStyles'; + +import company_logo from './images/rs-logo.svg'; + +const useStyles = makeStyles((theme) => ({ + Logo: { + height: 95, + }, +})); + +export default function Logo(props) { + const classes = useStyles(); + + let link = 'https://forge.wilddragon.net/zgaetano/datarhei-dragonfork-core'; + + // eslint-disable-next-line no-useless-escape + return ( + + Wild Dragon mark + + ); +}