git: 670212fe204e - main - net/teddycloud: Update 0.6.4 => 0.6.7

From: Vladimir Druzenko <vvd_at_FreeBSD.org>
Date: Sun, 25 Jan 2026 19:33:33 UTC
The branch main has been updated by vvd:

URL: https://cgit.FreeBSD.org/ports/commit/?id=670212fe204e0601bdbea8eed8326ec05fce8651

commit 670212fe204e0601bdbea8eed8326ec05fce8651
Author:     Michael Pape <freebsd@pe82.de>
AuthorDate: 2026-01-25 19:01:30 +0000
Commit:     Vladimir Druzenko <vvd@FreeBSD.org>
CommitDate: 2026-01-25 19:33:26 +0000

    net/teddycloud: Update 0.6.4 => 0.6.7
    
    Changelogs:
    https://github.com/toniebox-reverse-engineering/teddycloud/releases/tag/tc_v0.6.5
    https://github.com/toniebox-reverse-engineering/teddycloud/releases/tag/tc_v0.6.6
    https://github.com/toniebox-reverse-engineering/teddycloud/releases/tag/tc_v0.6.7
    
    Improve port:
    - Un-bundle libcjson, libogg and opus.
    - Replace "BUILD_DEPENDS+=" with "BUILD_DEPENDS=".
    - Add USES+=dos2unix - source files use DOS end-of-line characters.
    - Use ETCDIR instead of ${PREFIX}/etc/teddycloud.
    - Optimize do-install - remove duplicates, merge COPYTREE_SHARE, remove
      unnecessary MKDIR.
    - Remove empty post-extract.
    
    PR:             292663
    Co-authored-by: Vladimir Druzenko <vvd@FreeBSD.org>
---
 net/teddycloud/Makefile                            |  50 ++--
 net/teddycloud/distinfo                            |  40 ++-
 net/teddycloud/files/patch-Makefile                | 163 +++++++++++
 .../files/patch-cyclone_common_compiler__port.h    |  13 -
 net/teddycloud/files/patch-include_json__helper.h  |  11 +
 net/teddycloud/files/patch-src_contentJson.c       |  13 +
 net/teddycloud/files/patch-src_handler__api.c      |  18 ++
 net/teddycloud/files/patch-src_home__assistant.c   |  19 ++
 net/teddycloud/files/patch-src_main.c              |  14 +
 .../files/patch-src_tonie__audio__playlist.c       |  14 +
 net/teddycloud/files/patch-src_toniefile.c         |  11 +
 net/teddycloud/files/patch-src_toniesJson.c        |  15 +
 net/teddycloud/pkg-plist                           | 311 ++++++++++++++++++++-
 13 files changed, 614 insertions(+), 78 deletions(-)

diff --git a/net/teddycloud/Makefile b/net/teddycloud/Makefile
index a1750d0242a9..c969558188ca 100644
--- a/net/teddycloud/Makefile
+++ b/net/teddycloud/Makefile
@@ -1,11 +1,10 @@
 PORTNAME=	teddycloud
 DISTVERSIONPREFIX=	tc_v
-DISTVERSION=	0.6.4
-PORTREVISION=	2
+DISTVERSION=	0.6.7
 CATEGORIES=	net
 # Get the latest commit hashes here: https://github.com/toniebox-reverse-engineering/tonies-json/commits/release/
 # NOTE: remove the existing tonies.json and tonieboxes.json from DISTDIR before you do a `make makesum`
-MASTER_SITES=	https://raw.githubusercontent.com/toniebox-reverse-engineering/tonies-json/c874ca0c33eb929ee1c94983f53f3f8a55445c6b/:toniesjson
+MASTER_SITES=	https://raw.githubusercontent.com/toniebox-reverse-engineering/tonies-json/cd5f06d9183470867822d0773ddc0de519d3d46e/:toniesjson
 DISTFILES=	tonies.json:toniesjson \
 		tonieboxes.json:toniesjson
 EXTRACT_ONLY=	${DISTFILES:N*\:toniesjson:C/\:.*//}
@@ -19,63 +18,56 @@ LICENSE=	GPLv2+
 NOT_FOR_ARCHS=		armv6 armv7 i386 powerpc powerpcspe
 NOT_FOR_ARCHS_REASON=	32bit targets do not build due to type issues. Upstream library assumes FreeBSD to be 64bit.
 
-BUILD_DEPENDS+=	curl:ftp/curl \
+BUILD_DEPENDS=	curl:ftp/curl \
 		protoc-c:devel/protobuf-c
 
-USES=		gmake
+LIB_DEPENDS=	libcjson.so:devel/libcjson \
+		libogg.so:audio/libogg \
+		libopus.so:audio/opus
+
+USES=		dos2unix gmake
 USE_GCC=	yes
 USE_GITHUB=	yes
 GH_ACCOUNT=	toniebox-reverse-engineering:DEFAULT,teddycloud_web \
-		DaveGamble:cJSON \
-		xiph:ogg,opus \
 		Oryx-Embedded:cyclone_common,cyclone_crypto,cyclone_ssl,cyclone_tcp
-GH_PROJECT=	cJSON:cJSON ogg:ogg opus:opus teddycloud_web:teddycloud_web \
+GH_PROJECT=	teddycloud_web:teddycloud_web \
 		Common:cyclone_common CycloneCRYPTO:cyclone_crypto \
 		CycloneSSL:cyclone_ssl CycloneTCP:cyclone_tcp
-GH_SUBDIR=	cJSON:cJSON ogg:ogg opus:opus teddycloud_web:teddycloud_web \
+GH_SUBDIR=	teddycloud_web:teddycloud_web \
 		cyclone/common:cyclone_common cyclone/cyclone_crypto:cyclone_crypto \
 		cyclone/cyclone_ssl:cyclone_ssl cyclone/cyclone_tcp:cyclone_tcp
 # find versions here clone the repository and switch to tag
 # git submodule update
 # git submodule
-GH_TAGNAME=	v1.7.18:cJSON \
-		v1.3.5-9-gdb5c7a4:ogg \
-		v1.4-7-g101a71e0:opus \
-		tcw_v${DISTVERSION}:teddycloud_web \
-		v2.3.2:cyclone_common,cyclone_crypto,cyclone_ssl,cyclone_tcp
+GH_TAGNAME=	tcw_v${DISTVERSION}:teddycloud_web \
+		v2.4.4:cyclone_common,cyclone_crypto,cyclone_ssl,cyclone_tcp
 
 USE_RC_SUBR=	teddycloudd
 MAKE_ENV+=	CONFIG_RUNTIME_BASE_PATH=${PREFIX}/etc/teddycloud \
 		RUNTIME_BASE_PATH=${PREFIX}/share/teddycloud \
 		NO_SANITIZERS=1 \
 		GIT_DIRTY=0 \
-		GIT_BUILD_TIME="2025-03-05 08:01:37 +0000" \
-		GIT_SHORT_SHA=f13703a \
-		GIT_SHA=f13703ad110b6c42f693d35b7ac211e487d37c83 \
+		GIT_BUILD_TIME="2026-01-11 11:47:28 +0000" \
+		GIT_SHORT_SHA=5b59a82 \
+		GIT_SHA=5b59a82ae6c2fd8d8501ea0fe1da2e775fb8eff0 \
 		GIT_TAG=tc_v${DISTVERSION} \
 		WEB_GIT_DIRTY=0 \
-		WEB_GIT_BUILD_TIME="2025-03-03 18:54:08 +0000" \
-		WEB_GIT_SHORT_SHA=d24276e \
-		WEB_GIT_SHA=d24276e8d0972477d988449c566879974795d02a \
+		WEB_GIT_BUILD_TIME="2026-01-11 12:46:00 +0100" \
+		WEB_GIT_SHORT_SHA=fa6babd \
+		WEB_GIT_SHA=fa6babd8487afba90e391f23714d8435574562a5 \
 		WEB_GIT_TAG=tcw_v${DISTVERSION}
 # This did reliably fail due to some unknown deps when using parallel build
 MAKE_JOBS_UNSAFE=	yes
 ALL_TARGET=	preinstall
 
-post-extract:
-
 pre-install:
 	@${CP} ${DISTFILES:M*\:toniesjson:C/\:.*//:S,^,${_DISTDIR}/,} ${WRKSRC}/install/pre/config/
 
 do-install:
 	${INSTALL_PROGRAM} ${WRKSRC}/install/pre/teddycloud ${STAGEDIR}${PREFIX}/bin
-	@${MKDIR} ${STAGEDIR}${DATADIR}/certs
-	@(cd ${WRKSRC}/install/pre/certs && ${COPYTREE_SHARE} . ${STAGEDIR}${DATADIR}/certs)
-	@${MKDIR} ${STAGEDIR}${DATADIR}/data
-	@(cd ${WRKSRC}/install/pre/data && ${COPYTREE_SHARE} . ${STAGEDIR}${DATADIR}/data)
-	@${MKDIR} ${STAGEDIR}${DATADIR}/certs
-	@(cd ${WRKSRC}/install/pre/certs && ${COPYTREE_SHARE} . ${STAGEDIR}${DATADIR}/certs)
-	@${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
+	@(cd ${WRKSRC}/install/pre && \
+		${COPYTREE_SHARE} "certs data" ${STAGEDIR}${DATADIR})
 	@(cd ${WRKSRC}/install/pre/config && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})
+	${MKDIR} ${STAGEDIR}${ETCDIR}
 
 .include <bsd.port.mk>
diff --git a/net/teddycloud/distinfo b/net/teddycloud/distinfo
index 191670013747..3122b91b7814 100644
--- a/net/teddycloud/distinfo
+++ b/net/teddycloud/distinfo
@@ -1,23 +1,17 @@
-TIMESTAMP = 1748811239
-SHA256 (tonies.json) = 074396727ba9738c5061bb3e22bb2e505af255adecd00b07444465ee7083156e
-SIZE (tonies.json) = 5035861
-SHA256 (tonieboxes.json) = de50e30f844dcf743617337ba158b67498117f9c459b9ca4d26097aa3cb6b36f
-SIZE (tonieboxes.json) = 2736
-SHA256 (toniebox-reverse-engineering-teddycloud-tc_v0.6.4_GH0.tar.gz) = bb77ff1f4557d02a74e275eeafcf1dfa545c3adeb017794a964113b3d36a62bd
-SIZE (toniebox-reverse-engineering-teddycloud-tc_v0.6.4_GH0.tar.gz) = 14073530
-SHA256 (toniebox-reverse-engineering-teddycloud_web-tcw_v0.6.4_GH0.tar.gz) = 60c865919d2a6c455a844a45204524c77985891e08147537e7eed28d1866cbf6
-SIZE (toniebox-reverse-engineering-teddycloud_web-tcw_v0.6.4_GH0.tar.gz) = 9308251
-SHA256 (DaveGamble-cJSON-v1.7.18_GH0.tar.gz) = 3aa806844a03442c00769b83e99970be70fbef03735ff898f4811dd03b9f5ee5
-SIZE (DaveGamble-cJSON-v1.7.18_GH0.tar.gz) = 354726
-SHA256 (xiph-ogg-v1.3.5-9-gdb5c7a4_GH0.tar.gz) = fac013405bc8ac0e1754b2de64455bc2d73c06ef181df8eb3b48d6addecd69c1
-SIZE (xiph-ogg-v1.3.5-9-gdb5c7a4_GH0.tar.gz) = 251955
-SHA256 (xiph-opus-v1.4-7-g101a71e0_GH0.tar.gz) = d6410f6fb6334672a8b4d1441a8549a6e972a811509b61b77c349a4ef553ac14
-SIZE (xiph-opus-v1.4-7-g101a71e0_GH0.tar.gz) = 855253
-SHA256 (Oryx-Embedded-Common-v2.3.2_GH0.tar.gz) = 0a251e8a3674f777e33f01a825be0f55b2092bedbedd058b579b0e00d1b0119d
-SIZE (Oryx-Embedded-Common-v2.3.2_GH0.tar.gz) = 45692
-SHA256 (Oryx-Embedded-CycloneCRYPTO-v2.3.2_GH0.tar.gz) = a37d72648d3e551a9d02106ed42fca5622a3b27d3f7f8540117fe1eb9bfde3cf
-SIZE (Oryx-Embedded-CycloneCRYPTO-v2.3.2_GH0.tar.gz) = 886577
-SHA256 (Oryx-Embedded-CycloneSSL-v2.3.2_GH0.tar.gz) = 6a9aabf7a50e5546eeab94bd70e10ba908c68dff4ebf993013dc05f36eb1acbe
-SIZE (Oryx-Embedded-CycloneSSL-v2.3.2_GH0.tar.gz) = 226189
-SHA256 (Oryx-Embedded-CycloneTCP-v2.3.2_GH0.tar.gz) = 30755eba3b96518e325c19b23279560572c7a55135af4378146ac762212a158c
-SIZE (Oryx-Embedded-CycloneTCP-v2.3.2_GH0.tar.gz) = 2149879
+TIMESTAMP = 1769203899
+SHA256 (tonies.json) = bcf1633744f731998b26249b59b37f57905af533739ec24227e19169fe7b33cd
+SIZE (tonies.json) = 5854525
+SHA256 (tonieboxes.json) = 64ef4f28973d410e49274efc22e70ffb26ddb8e54b1750332bb853b273410439
+SIZE (tonieboxes.json) = 3022
+SHA256 (toniebox-reverse-engineering-teddycloud-tc_v0.6.7_GH0.tar.gz) = 6afd7f7b430b68cbfb01a146c5e48a6d3557e4ca46601a7d4904e63d5412dfb9
+SIZE (toniebox-reverse-engineering-teddycloud-tc_v0.6.7_GH0.tar.gz) = 15462180
+SHA256 (toniebox-reverse-engineering-teddycloud_web-tcw_v0.6.7_GH0.tar.gz) = a99b63eefe8df4d9881df0c59a778010abf129c0b578adee5ee8b298c3585d94
+SIZE (toniebox-reverse-engineering-teddycloud_web-tcw_v0.6.7_GH0.tar.gz) = 10479749
+SHA256 (Oryx-Embedded-Common-v2.4.4_GH0.tar.gz) = a94348845ce224fe825086bb0fa7a1598897e532d5088e3af1145314ff01945d
+SIZE (Oryx-Embedded-Common-v2.4.4_GH0.tar.gz) = 50454
+SHA256 (Oryx-Embedded-CycloneCRYPTO-v2.4.4_GH0.tar.gz) = b61a06eedd3c71c4d5b66273682717ceb52b7dda2db51d1e156babb501f6fe79
+SIZE (Oryx-Embedded-CycloneCRYPTO-v2.4.4_GH0.tar.gz) = 1002666
+SHA256 (Oryx-Embedded-CycloneSSL-v2.4.4_GH0.tar.gz) = 2c157a27facb550ff455025439cec47df7ee187e19a52588fa20415c104c10b9
+SIZE (Oryx-Embedded-CycloneSSL-v2.4.4_GH0.tar.gz) = 234959
+SHA256 (Oryx-Embedded-CycloneTCP-v2.4.4_GH0.tar.gz) = e334aadacbd6ddcc7a17f2a1dd0d03b8029c7ba23fd789f2397b04284fee37a0
+SIZE (Oryx-Embedded-CycloneTCP-v2.4.4_GH0.tar.gz) = 2361810
diff --git a/net/teddycloud/files/patch-Makefile b/net/teddycloud/files/patch-Makefile
new file mode 100644
index 000000000000..4d0f1df6b9e5
--- /dev/null
+++ b/net/teddycloud/files/patch-Makefile
@@ -0,0 +1,163 @@
+--- Makefile.orig	2026-01-11 11:47:28 UTC
++++ Makefile
+@@ -142,7 +142,7 @@ else
+ 	SEP         = \$(strip)
+ else
+ 	MKDIR       = mkdir -p
+-	ECHO        = echo -e
++	ECHO        = echo
+ 	RM          = rm -f
+ 	RM_R        = rm -rf
+ 	CP          = cp
+@@ -199,7 +199,7 @@ CFLAGS_linux += -DFFMPEG_DECODING
+ endif
+ CFLAGS_linux += -ggdb
+ CFLAGS_linux += -DFFMPEG_DECODING
+-LFLAGS_linux += -pthread -lm
++LFLAGS_linux += -pthread -lm -lcjson -logg -lopus
+ 
+ ifeq ($(NO_SANITIZERS),2)
+ # Workaround for broken libasan (disable it for now)
+@@ -242,30 +242,17 @@ INCLUDES = \
+ 	-Icyclone/cyclone_crypto/pkix \
+ 	-Icyclone/cyclone_crypto/pkc \
+ 	-Icyclone/cyclone_crypto/rng \
+-	-IcJSON \
+-	-Ifat/source \
+-	-Iogg/include \
+-	-Iogg/src \
+-	-Iopus/include \
+-	-Iopus/celt \
+-	-Iopus/silk \
+-	-Iopus/silk/float
++	-Ifat/source
+ 
+ SOURCES = \
+ 	$(wildcard $(SRC_DIR)/*.c) \
+ 	$(wildcard $(SRC_DIR)/proto/*.c) \
+ 	$(CYCLONE_SOURCES) \
+-	$(LIBOPUS_SOURCES) \
+-	$(LIBOGG_SOURCES) \
+-	$(CJSON_SOURCES) \
+ 	$(FAT_SOURCES)
+ 
+ HEADERS = \
+ 	$(wildcard include/*.h) \
+ 	$(CYCLONE_HEADERS) \
+-	$(LIBOPUS_HEADERS) \
+-	$(LIBOGG_HEADERS) \
+-	$(CJSON_HEADERS) \
+ 	$(FAT_HEADERS)
+ 
+ 
+@@ -286,45 +273,6 @@ FAT_HEADERS =\
+ FAT_HEADERS =\
+ 	fat/source/ff.h
+ 
+-CJSON_SOURCES = \
+-	cJSON/cJSON.c \
+-	cJSON/cJSON_Utils.c
+-
+-CJSON_HEADERS = \
+-	cJSON/cJSON.h \
+-	cJSON/cJSON_Utils.h 
+-
+-LIBOGG_SOURCES = \
+-	ogg/src/framing.c \
+-	ogg/src/bitwise.c \
+-
+-include opus/silk_sources.mk
+-include opus/celt_sources.mk
+-include opus/opus_sources.mk
+-include opus/silk_headers.mk
+-include opus/celt_headers.mk
+-include opus/opus_headers.mk
+-
+-LIBOPUS_SOURCES = \
+-	$(addprefix opus/,$(SILK_SOURCES)) \
+-	$(addprefix opus/,$(SILK_SOURCES_FLOAT)) \
+-	$(addprefix opus/,$(CELT_SOURCES)) \
+-	$(addprefix opus/,$(OPUS_SOURCES)) \
+-	$(addprefix opus/,$(OPUS_SOURCES_FLOAT)) 
+-
+-LIBOPUS_SOURCES := \
+-	$(filter-out \
+-	opus/src/repacketizer.c \
+-	, $(LIBOPUS_SOURCES))
+-
+-LIBOPUS_SOURCES += \
+-	src/opus/src/repacketizer.c
+-
+-LIBOPUS_HEADERS = \
+-	$(addprefix opus/,$(SILK_HEAD)) \
+-	$(addprefix opus/,$(CELT_HEAD)) \
+-	$(addprefix opus/,$(OPUS_HEAD)) \
+-
+ CYCLONE_SOURCES = \
+ 	cyclone/common/cpu_endian.c \
+ 	cyclone/common/date_time.c \
+@@ -446,10 +394,6 @@ CFLAGS += $(INCLUDES)
+ CFLAGS += ${CFLAGS_VERSION}
+ CFLAGS += $(INCLUDES)
+ 
+-# for opus encoder
+-CFLAGS += -DUSE_ALLOCA -DOPUS_BUILD
+-CFLAGS_linux += -Wno-error=stringop-overflow= -Wno-error=stringop-overread
+-
+ THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST))
+ 
+ # Location of your .proto files
+@@ -476,19 +420,11 @@ CLEAN_FILES += $(OBJECTS) $(LINK_LO_FILE)
+ OBJECTS = $(foreach C,$(SOURCES),$(addprefix $(OBJ_DIR)/,$(C:.c=$(OBJ_EXT))))
+ CLEAN_FILES += $(OBJECTS) $(LINK_LO_FILE)
+ 
+-ifeq ($(OS),Windows_NT)
+-	CYAN=
+-	RED=
+-	YELLOW=
+-	GREEN=
+-	NC=
+-else
+-	CYAN=\033[0;36m
+-	RED=\033[0;31m
+-	YELLOW=\033[0;33m
+-	GREEN=\033[0;32m
+-	NC=\033[0m
+-endif
++CYAN=
++RED=
++YELLOW=
++GREEN=
++NC=
+ 
+ ifeq ($(VERBOSE),1)
+ 	QUIET=
+@@ -560,26 +496,17 @@ TAF_ENCODER_SOURCES = \
+ 	wasm/taf_encoder_minimal.c \
+ 	wasm/sha1_standalone.c \
+ 	src/proto/proto/toniebox.pb.taf-header.pb-c.c \
+-	src/proto/protobuf-c.c \
+-	$(LIBOPUS_SOURCES) \
+-	$(LIBOGG_SOURCES)
++	src/proto/protobuf-c.c
+ 
+ # Common include paths for TAF encoder
+ TAF_ENCODER_INCLUDES = \
+ 	-Isrc/proto \
+ 	-Iinclude/protobuf-c \
+ 	-Iwasm/include \
+-	-Iinclude \
+-	-Iogg/include \
+-	-Iogg/src \
+-	-Iopus/include \
+-	-Iopus/celt \
+-	-Iopus/silk \
+-	-Iopus/silk/float
++	-Iinclude
+ 
+ # Common compiler flags for TAF encoder
+ TAF_ENCODER_CFLAGS = \
+-	-DOPUS_BUILD \
+ 	-DHAVE_LRINT \
+ 	-DHAVE_LRINTF \
+ 	-DFLOATING_POINT \
diff --git a/net/teddycloud/files/patch-cyclone_common_compiler__port.h b/net/teddycloud/files/patch-cyclone_common_compiler__port.h
deleted file mode 100644
index 985ff2f920a1..000000000000
--- a/net/teddycloud/files/patch-cyclone_common_compiler__port.h
+++ /dev/null
@@ -1,13 +0,0 @@
---- cyclone/common/compiler_port.h.orig	2024-01-17 21:26:40 UTC
-+++ cyclone/common/compiler_port.h
-@@ -105,8 +105,8 @@ typedef unsigned int uint_t;
-    #define PRIuSIZE "u"
-    #define PRIXSIZE "X"
-    #define PRIuTIME "lu"
--//Linux GCC compiler
--#elif defined(__linux__)
-+//Linux/FreeBSD GCC compiler
-+#elif defined(__linux__) || defined(__FreeBSD__)
-    #define PRIuSIZE "zu"
-    #define PRIXSIZE "zX"
-    #define PRIuTIME "lu"
diff --git a/net/teddycloud/files/patch-include_json__helper.h b/net/teddycloud/files/patch-include_json__helper.h
new file mode 100644
index 000000000000..992e2c82f071
--- /dev/null
+++ b/net/teddycloud/files/patch-include_json__helper.h
@@ -0,0 +1,11 @@
+--- include/json_helper.h.orig	2026-01-23 20:45:38 UTC
++++ include/json_helper.h
+@@ -1,6 +1,7 @@
+ #pragma once
+ 
+-#include "cJSON.h"
++#include <cjson/cJSON.h>
++
+ #include "debug.h"
+ 
+ char *jsonGetString(cJSON *jsonElement, char *name);
diff --git a/net/teddycloud/files/patch-src_contentJson.c b/net/teddycloud/files/patch-src_contentJson.c
new file mode 100644
index 000000000000..b169baabb18a
--- /dev/null
+++ b/net/teddycloud/files/patch-src_contentJson.c
@@ -0,0 +1,13 @@
+--- src/contentJson.c.orig	2026-01-23 20:44:06 UTC
++++ src/contentJson.c
+@@ -1,8 +1,9 @@
++#include <cjson/cJSON.h>
++
+ #include "contentJson.h"
+ 
+ #include "settings.h"
+ #include "debug.h"
+-#include "cJSON.h"
+ #include "net_config.h"
+ #include "server_helpers.h"
+ #include "toniesJson.h"
diff --git a/net/teddycloud/files/patch-src_handler__api.c b/net/teddycloud/files/patch-src_handler__api.c
new file mode 100644
index 000000000000..654979580a67
--- /dev/null
+++ b/net/teddycloud/files/patch-src_handler__api.c
@@ -0,0 +1,18 @@
+--- src/handler_api.c.orig	2026-01-23 20:46:20 UTC
++++ src/handler_api.c
+@@ -5,6 +5,7 @@
+ #include <stdint.h>
+ #include <string.h>
+ #include <stdio.h>
++#include <cjson/cJSON.h>
+ 
+ #include "path.h"
+ #include "path_ext.h"
+@@ -16,7 +17,6 @@
+ #include "settings.h"
+ #include "stats.h"
+ #include "returncodes.h"
+-#include "cJSON.h"
+ #include "toniefile.h"
+ #include "toniesJson.h"
+ #include "fs_ext.h"
diff --git a/net/teddycloud/files/patch-src_home__assistant.c b/net/teddycloud/files/patch-src_home__assistant.c
new file mode 100644
index 000000000000..c5fb4fc3cc35
--- /dev/null
+++ b/net/teddycloud/files/patch-src_home__assistant.c
@@ -0,0 +1,19 @@
+--- src/home_assistant.c.orig	2026-01-23 20:47:15 UTC
++++ src/home_assistant.c
+@@ -1,6 +1,7 @@
+ 
+ #include <string.h>
+ #include <math.h>
++#include <cjson/cJSON.h>
+ 
+ #include "platform.h"
+ #include "debug.h"
+@@ -8,8 +9,6 @@
+ #include "home_assistant.h"
+ #include "macros.h"
+ #include "mqtt.h"
+-
+-#include "cJSON.h"
+ 
+ static int32_t coerce_int32(float value, int32_t min, int32_t max)
+ {
diff --git a/net/teddycloud/files/patch-src_main.c b/net/teddycloud/files/patch-src_main.c
new file mode 100644
index 000000000000..55666d94b88c
--- /dev/null
+++ b/net/teddycloud/files/patch-src_main.c
@@ -0,0 +1,14 @@
+--- src/main.c.orig	2026-01-23 20:47:56 UTC
++++ src/main.c
+@@ -7,10 +7,10 @@
+ #include <stdint.h>
+ #include <math.h>
+ #include <getopt.h>
++#include <cjson/cJSON.h>
+ 
+ #include "error.h"
+ #include "debug.h"
+-#include "cJSON.h"
+ #include "esp32.h"
+ 
+ #include "version.h"
diff --git a/net/teddycloud/files/patch-src_tonie__audio__playlist.c b/net/teddycloud/files/patch-src_tonie__audio__playlist.c
new file mode 100644
index 000000000000..d26eb2e097de
--- /dev/null
+++ b/net/teddycloud/files/patch-src_tonie__audio__playlist.c
@@ -0,0 +1,14 @@
+--- src/tonie_audio_playlist.c.orig	2026-01-23 20:51:18 UTC
++++ src/tonie_audio_playlist.c
+@@ -1,9 +1,10 @@
++#include <cjson/cJSON.h>
++
+ #include "tonie_audio_playlist.h"
+ 
+ #include "fs_port.h"
+ #include "toniefile.h"
+ #include "server_helpers.h"
+-#include "cJSON.h"
+ #include "json_helper.h"
+ #include "handler.h"
+ 
diff --git a/net/teddycloud/files/patch-src_toniefile.c b/net/teddycloud/files/patch-src_toniefile.c
new file mode 100644
index 000000000000..abcf81298842
--- /dev/null
+++ b/net/teddycloud/files/patch-src_toniefile.c
@@ -0,0 +1,11 @@
+--- src/toniefile.c.orig	2026-01-23 21:17:26 UTC
++++ src/toniefile.c
+@@ -17,7 +17,7 @@
+ #include "os_port.h"
+ #include "os_ext.h"
+ #include "debug.h"
+-#include "opus.h"
++#include "opus/opus.h"
+ #include "ogg/ogg.h"
+ #include "server_helpers.h"
+ #include "version.h"
diff --git a/net/teddycloud/files/patch-src_toniesJson.c b/net/teddycloud/files/patch-src_toniesJson.c
new file mode 100644
index 000000000000..40ae0955ac69
--- /dev/null
+++ b/net/teddycloud/files/patch-src_toniesJson.c
@@ -0,0 +1,15 @@
+--- src/toniesJson.c.orig	2026-01-23 20:52:16 UTC
++++ src/toniesJson.c
+@@ -1,10 +1,11 @@
++#include <cjson/cJSON.h>
++
+ #include "toniesJson.h"
+ #include "fs_port.h"
+ #include "os_port.h"
+ #include "settings.h"
+ #include "cache.h"
+ #include "debug.h"
+-#include "cJSON.h"
+ #include "handler.h"
+ #include "cloud_request.h"
+ #include "server_helpers.h"
diff --git a/net/teddycloud/pkg-plist b/net/teddycloud/pkg-plist
index 4b357f18a1c3..7f5676f69908 100644
--- a/net/teddycloud/pkg-plist
+++ b/net/teddycloud/pkg-plist
@@ -15,6 +15,10 @@ bin/teddycloud
 %%DATADIR%%/data/www/library/react-dom.development.js
 %%DATADIR%%/data/www/library/react.development.js
 %%DATADIR%%/data/www/robots.txt
+%%DATADIR%%/data/www/web/apple-touch-icon-120x120.png
+%%DATADIR%%/data/www/web/apple-touch-icon-152x152.png
+%%DATADIR%%/data/www/web/apple-touch-icon-167x167.png
+%%DATADIR%%/data/www/web/apple-touch-icon.png
 %%DATADIR%%/data/www/web/assets/01_CH341A_programmer_1-BWh6CFRm.png
 %%DATADIR%%/data/www/web/assets/01_CH341A_programmer_2-DLQkFrYM.png
 %%DATADIR%%/data/www/web/assets/02_CH341A_sop8_1-B7nvMxlQ.jpg
@@ -25,6 +29,265 @@ bin/teddycloud
 %%DATADIR%%/data/www/web/assets/3200_pcb_preview-BvQM-e4R.png
 %%DATADIR%%/data/www/web/assets/3235_pcb-BE0vs2bl.png
 %%DATADIR%%/data/www/web/assets/3235_pcb_preview-DkVKgZS0.png
+%%DATADIR%%/data/www/web/assets/AC-DvzLgDzl.js
+%%DATADIR%%/data/www/web/assets/AD-0YtvGfyJ.js
+%%DATADIR%%/data/www/web/assets/AE-ChB4l_EO.js
+%%DATADIR%%/data/www/web/assets/AF-BnD1yvCV.js
+%%DATADIR%%/data/www/web/assets/AG-BN5I_8HM.js
+%%DATADIR%%/data/www/web/assets/AI-DyA8M_FU.js
+%%DATADIR%%/data/www/web/assets/AL-BXVQWRZ5.js
+%%DATADIR%%/data/www/web/assets/AM-NLP3P44N.js
+%%DATADIR%%/data/www/web/assets/AO-DkPrV7zY.js
+%%DATADIR%%/data/www/web/assets/AQ-D3w7peYS.js
+%%DATADIR%%/data/www/web/assets/AR-CrCDb1gb.js
+%%DATADIR%%/data/www/web/assets/AS-BS3RTvVP.js
+%%DATADIR%%/data/www/web/assets/AT-1HWBUNPr.js
+%%DATADIR%%/data/www/web/assets/AU-DAwXtpdW.js
+%%DATADIR%%/data/www/web/assets/AW-CXzIUnmX.js
+%%DATADIR%%/data/www/web/assets/AX-rE6718Yf.js
+%%DATADIR%%/data/www/web/assets/AZ-Bznf-Mlc.js
+%%DATADIR%%/data/www/web/assets/BA-D2NrufK3.js
+%%DATADIR%%/data/www/web/assets/BB-DFQPCNz6.js
+%%DATADIR%%/data/www/web/assets/BD-B-QQw3jj.js
+%%DATADIR%%/data/www/web/assets/BE-DkBmiD2O.js
+%%DATADIR%%/data/www/web/assets/BF-MtzYbWUR.js
+%%DATADIR%%/data/www/web/assets/BG-Buxx41RI.js
+%%DATADIR%%/data/www/web/assets/BH-BKAvWpJ-.js
+%%DATADIR%%/data/www/web/assets/BI-DRM3gEDF.js
+%%DATADIR%%/data/www/web/assets/BJ-DQaHbLmo.js
+%%DATADIR%%/data/www/web/assets/BL-bG469lsP.js
+%%DATADIR%%/data/www/web/assets/BM-BLcb1PfF.js
+%%DATADIR%%/data/www/web/assets/BN-8lYlT0x_.js
+%%DATADIR%%/data/www/web/assets/BO-BU5jLhT5.js
+%%DATADIR%%/data/www/web/assets/BQ-D6AcQS69.js
+%%DATADIR%%/data/www/web/assets/BR-C6APLMWa.js
+%%DATADIR%%/data/www/web/assets/BS-D0c45f7-.js
+%%DATADIR%%/data/www/web/assets/BT-DtFaEhK8.js
+%%DATADIR%%/data/www/web/assets/BV-Bse7Z5R3.js
+%%DATADIR%%/data/www/web/assets/BW-Bx2saQws.js
+%%DATADIR%%/data/www/web/assets/BY-CA5NyMFR.js
+%%DATADIR%%/data/www/web/assets/BZ-CYhxcbH0.js
+%%DATADIR%%/data/www/web/assets/CA-CWAdRSSD.js
+%%DATADIR%%/data/www/web/assets/CC-1Vu5MNVk.js
+%%DATADIR%%/data/www/web/assets/CD-CMPwi19S.js
+%%DATADIR%%/data/www/web/assets/CF-D9_q27iA.js
+%%DATADIR%%/data/www/web/assets/CG-DTOQvq8q.js
+%%DATADIR%%/data/www/web/assets/CH-C_aVYgel.js
+%%DATADIR%%/data/www/web/assets/CI-mTXBVsLR.js
+%%DATADIR%%/data/www/web/assets/CK-H328ZC8P.js
+%%DATADIR%%/data/www/web/assets/CL-B5mM_kkr.js
+%%DATADIR%%/data/www/web/assets/CM-CvApswQi.js
+%%DATADIR%%/data/www/web/assets/CN-BKvdkL53.js
+%%DATADIR%%/data/www/web/assets/CO-ByrhQGvM.js
+%%DATADIR%%/data/www/web/assets/CR-BI09HFuL.js
+%%DATADIR%%/data/www/web/assets/CU-C4C68jfb.js
+%%DATADIR%%/data/www/web/assets/CV-DyZ6Ezk0.js
+%%DATADIR%%/data/www/web/assets/CW-D7IcpiXF.js
+%%DATADIR%%/data/www/web/assets/CX-DHs8nS10.js
+%%DATADIR%%/data/www/web/assets/CY-BTPkyMMF.js
+%%DATADIR%%/data/www/web/assets/CZ-UAdIkg68.js
+%%DATADIR%%/data/www/web/assets/DE-BwSz4lTD.js
+%%DATADIR%%/data/www/web/assets/DJ-BobvE7TL.js
+%%DATADIR%%/data/www/web/assets/DK-COwVG_7G.js
+%%DATADIR%%/data/www/web/assets/DM-DOv9-8d0.js
+%%DATADIR%%/data/www/web/assets/DO-CXxjIPve.js
+%%DATADIR%%/data/www/web/assets/DZ-D731vN-p.js
+%%DATADIR%%/data/www/web/assets/EC-CLkxbsC9.js
+%%DATADIR%%/data/www/web/assets/EE-Dg3eKw7r.js
+%%DATADIR%%/data/www/web/assets/EG-CS47I1Hw.js
+%%DATADIR%%/data/www/web/assets/EH-D0ou060S.js
+%%DATADIR%%/data/www/web/assets/ER-BGi3XKA_.js
+%%DATADIR%%/data/www/web/assets/ES-NqXMpDNV.js
+%%DATADIR%%/data/www/web/assets/ET-PTudKHL-.js
+%%DATADIR%%/data/www/web/assets/EU-FjcjwKp1.js
+%%DATADIR%%/data/www/web/assets/FI-CG4d9Fw7.js
+%%DATADIR%%/data/www/web/assets/FJ-C139PzvB.js
+%%DATADIR%%/data/www/web/assets/FK-XPS_Mxep.js
+%%DATADIR%%/data/www/web/assets/FM-CNgebryG.js
+%%DATADIR%%/data/www/web/assets/FO-CRzpKO1m.js
+%%DATADIR%%/data/www/web/assets/FR-B8vDbpLB.js
+%%DATADIR%%/data/www/web/assets/GA-BuCnHBt1.js
+%%DATADIR%%/data/www/web/assets/GB-0aslyXWB.js
+%%DATADIR%%/data/www/web/assets/GD-CNPbqtuI.js
+%%DATADIR%%/data/www/web/assets/GE-AB-B-TJLLyi.js
+%%DATADIR%%/data/www/web/assets/GE-DjP-hqxH.js
+%%DATADIR%%/data/www/web/assets/GE-OS-MSYyBHb5.js
+%%DATADIR%%/data/www/web/assets/GF-BcpM6KXB.js
+%%DATADIR%%/data/www/web/assets/GG-CO0w39Uo.js
+%%DATADIR%%/data/www/web/assets/GH-BlaRl2y7.js
+%%DATADIR%%/data/www/web/assets/GI-LhWzDkoL.js
+%%DATADIR%%/data/www/web/assets/GL-TZYWPNiS.js
+%%DATADIR%%/data/www/web/assets/GM-BbEKdS0A.js
+%%DATADIR%%/data/www/web/assets/GN-mVJu0smG.js
+%%DATADIR%%/data/www/web/assets/GP-B8vDbpLB.js
+%%DATADIR%%/data/www/web/assets/GQ-CC129jXh.js
+%%DATADIR%%/data/www/web/assets/GR-CFpIyJBR.js
+%%DATADIR%%/data/www/web/assets/GS-IFDbLNwE.js
+%%DATADIR%%/data/www/web/assets/GT-Dw6YDROG.js
+%%DATADIR%%/data/www/web/assets/GU-DzR4EhPy.js
+%%DATADIR%%/data/www/web/assets/GW-DULDgb9f.js
+%%DATADIR%%/data/www/web/assets/GY-DFiRqyUV.js
+%%DATADIR%%/data/www/web/assets/HK-CjKIxoZ0.js
+%%DATADIR%%/data/www/web/assets/HM-iT-MxlIG.js
+%%DATADIR%%/data/www/web/assets/HN-DHepbgm0.js
+%%DATADIR%%/data/www/web/assets/HR-DSd-JLbR.js
+%%DATADIR%%/data/www/web/assets/HT-CqkxwVFz.js
+%%DATADIR%%/data/www/web/assets/HU-Cy7u9-qp.js
+%%DATADIR%%/data/www/web/assets/IC-CJJhkl-n.js
+%%DATADIR%%/data/www/web/assets/ID-Cc4MKPAt.js
+%%DATADIR%%/data/www/web/assets/IE-Bs5eJbrt.js
+%%DATADIR%%/data/www/web/assets/IL-x3uCxx9g.js
+%%DATADIR%%/data/www/web/assets/IM-Ck6NBcbK.js
+%%DATADIR%%/data/www/web/assets/IN-BWYcDrrm.js
+%%DATADIR%%/data/www/web/assets/IO-B3uMKo7N.svg
+%%DATADIR%%/data/www/web/assets/IO-Dez4wQyI.js
+%%DATADIR%%/data/www/web/assets/IQ-BVBBmvCn.js
+%%DATADIR%%/data/www/web/assets/IR-nDyIXGna.js
+%%DATADIR%%/data/www/web/assets/IS-DQY00ZsH.js
+%%DATADIR%%/data/www/web/assets/IT-BUw142lt.js
+%%DATADIR%%/data/www/web/assets/JE-fiJ0wm8X.js
+%%DATADIR%%/data/www/web/assets/JM-BJbXA2bB.js
+%%DATADIR%%/data/www/web/assets/JO-B77LxlWU.js
+%%DATADIR%%/data/www/web/assets/JP-CK8eanJQ.js
+%%DATADIR%%/data/www/web/assets/KE-BlFf5Qxr.js
+%%DATADIR%%/data/www/web/assets/KG-JN6XM7Fd.js
+%%DATADIR%%/data/www/web/assets/KH-X6EC4OiB.js
+%%DATADIR%%/data/www/web/assets/KI-CaTWAqLF.js
+%%DATADIR%%/data/www/web/assets/KM-mjEvtiuf.js
+%%DATADIR%%/data/www/web/assets/KN-HuXJxu2q.js
+%%DATADIR%%/data/www/web/assets/KP-BItPmeJA.js
+%%DATADIR%%/data/www/web/assets/KR-UUuMeJgj.js
+%%DATADIR%%/data/www/web/assets/KW-B-eZYjjt.js
+%%DATADIR%%/data/www/web/assets/KY-DjI8pk7A.js
+%%DATADIR%%/data/www/web/assets/KZ-BnuTjtd_.js
+%%DATADIR%%/data/www/web/assets/LA-CmcseVwR.js
+%%DATADIR%%/data/www/web/assets/LB-BpyBkLFs.js
+%%DATADIR%%/data/www/web/assets/LC-CPVriPlN.js
+%%DATADIR%%/data/www/web/assets/LI-BVF18f1m.js
+%%DATADIR%%/data/www/web/assets/LK-BKGOo40_.js
+%%DATADIR%%/data/www/web/assets/LR-VHPWKhMT.js
+%%DATADIR%%/data/www/web/assets/LS-DX59LbSJ.js
+%%DATADIR%%/data/www/web/assets/LT-DcerJVZ9.js
+%%DATADIR%%/data/www/web/assets/LU-BIADZ7Kd.js
+%%DATADIR%%/data/www/web/assets/LV-juKXMjFv.js
+%%DATADIR%%/data/www/web/assets/LY-TIoWIPnH.js
+%%DATADIR%%/data/www/web/assets/MA-CZmTf-jk.js
+%%DATADIR%%/data/www/web/assets/MC-Bso14psQ.js
+%%DATADIR%%/data/www/web/assets/MD-D2eZyWDH.js
+%%DATADIR%%/data/www/web/assets/ME-wp0w9F0r.js
+%%DATADIR%%/data/www/web/assets/MF-PWAfddVX.js
+%%DATADIR%%/data/www/web/assets/MG-BsrX5eXa.js
+%%DATADIR%%/data/www/web/assets/MH-PVMgcMHB.js
+%%DATADIR%%/data/www/web/assets/MK-D7lVQ6Xv.js
+%%DATADIR%%/data/www/web/assets/ML-BRfUtvar.js
+%%DATADIR%%/data/www/web/assets/MM-CpVOGWRF.js
+%%DATADIR%%/data/www/web/assets/MN-CQwi_XVk.js
+%%DATADIR%%/data/www/web/assets/MO-DHDZ3oiK.js
+%%DATADIR%%/data/www/web/assets/MP-CU5duFcA.js
+%%DATADIR%%/data/www/web/assets/MQ-CpyZfYzn.js
+%%DATADIR%%/data/www/web/assets/MR-NNsjUd7R.js
+%%DATADIR%%/data/www/web/assets/MS-n7Kko3dd.js
+%%DATADIR%%/data/www/web/assets/MT-CiOjyn-B.js
+%%DATADIR%%/data/www/web/assets/MU-D6rXnPWB.js
+%%DATADIR%%/data/www/web/assets/MV-B6jQ1h-J.js
+%%DATADIR%%/data/www/web/assets/MW-Bkt-ik9T.js
+%%DATADIR%%/data/www/web/assets/MX-Bkiy8r7B.js
+%%DATADIR%%/data/www/web/assets/MY-BFzIdmmk.js
+%%DATADIR%%/data/www/web/assets/MZ-BAvMPWrT.js
+%%DATADIR%%/data/www/web/assets/NA-BkrHacIf.js
+%%DATADIR%%/data/www/web/assets/NC-r8ApqwCV.js
+%%DATADIR%%/data/www/web/assets/NE-AJ9IgbM3.js
+%%DATADIR%%/data/www/web/assets/NF-B0iiiYkw.js
+%%DATADIR%%/data/www/web/assets/NG-BhTYQwGB.js
+%%DATADIR%%/data/www/web/assets/NI-A6xbs1JT.js
+%%DATADIR%%/data/www/web/assets/NL-DjFJb2xH.js
+%%DATADIR%%/data/www/web/assets/NO-86L4EYt1.js
+%%DATADIR%%/data/www/web/assets/NP-CxKDc5-T.js
+%%DATADIR%%/data/www/web/assets/NR-B8su_64b.js
+%%DATADIR%%/data/www/web/assets/NU-DSI7JMI9.js
+%%DATADIR%%/data/www/web/assets/NZ-C41L_I5d.js
+%%DATADIR%%/data/www/web/assets/OM-RQlFI4YB.js
+%%DATADIR%%/data/www/web/assets/PA-DMeK60Qa.js
+%%DATADIR%%/data/www/web/assets/PE-Ca2Jsjoe.js
+%%DATADIR%%/data/www/web/assets/PF-D1Ug4IAP.js
+%%DATADIR%%/data/www/web/assets/PG-8qXqEB3s.js
+%%DATADIR%%/data/www/web/assets/PH-BqKXRPqE.js
+%%DATADIR%%/data/www/web/assets/PK-D6ZT-Hcu.js
+%%DATADIR%%/data/www/web/assets/PL-DFBDuqRs.js
+%%DATADIR%%/data/www/web/assets/PM-B8vDbpLB.js
+%%DATADIR%%/data/www/web/assets/PN-W09zPp77.js
+%%DATADIR%%/data/www/web/assets/PR-DNh0l7ve.js
+%%DATADIR%%/data/www/web/assets/PS-BxHJsNeL.js
+%%DATADIR%%/data/www/web/assets/PT-CoJFuCLx.js
+%%DATADIR%%/data/www/web/assets/PW-BI3CWBTN.js
+%%DATADIR%%/data/www/web/assets/PY-CNXBcYnq.js
+%%DATADIR%%/data/www/web/assets/QA-DmWWreP8.js
+%%DATADIR%%/data/www/web/assets/RE-B8vDbpLB.js
+%%DATADIR%%/data/www/web/assets/RO-DWS7w99F.js
+%%DATADIR%%/data/www/web/assets/RS-Bh3OKS_i.js
+%%DATADIR%%/data/www/web/assets/RU-DuF-s0U5.js
+%%DATADIR%%/data/www/web/assets/RW-jsvhnRfd.js
+%%DATADIR%%/data/www/web/assets/SA-DSeUIsx_.js
+%%DATADIR%%/data/www/web/assets/SB-BtQG2ulB.js
+%%DATADIR%%/data/www/web/assets/SC-MyYKZ2WK.js
+%%DATADIR%%/data/www/web/assets/SD-cXXsGHLB.js
+%%DATADIR%%/data/www/web/assets/SE-CtVAMbcV.js
+%%DATADIR%%/data/www/web/assets/SG-CE2UisIC.js
+%%DATADIR%%/data/www/web/assets/SH-B5zpDzMq.js
+%%DATADIR%%/data/www/web/assets/SI-9a5HBiTQ.js
+%%DATADIR%%/data/www/web/assets/SJ-86L4EYt1.js
+%%DATADIR%%/data/www/web/assets/SK-BwOc2pOo.js
+%%DATADIR%%/data/www/web/assets/SL-Bxnx4vlW.js
+%%DATADIR%%/data/www/web/assets/SM-BJATjMbx.js
+%%DATADIR%%/data/www/web/assets/SN-B8j9XDTv.js
+%%DATADIR%%/data/www/web/assets/SO-8TW9h6yL.js
+%%DATADIR%%/data/www/web/assets/SR-BdANUAN1.js
+%%DATADIR%%/data/www/web/assets/SS-BqQGR0F0.js
+%%DATADIR%%/data/www/web/assets/ST-BQVf8PHB.js
+%%DATADIR%%/data/www/web/assets/SV-CxOhSw-7.js
+%%DATADIR%%/data/www/web/assets/SX-7FIfwi5n.js
+%%DATADIR%%/data/www/web/assets/SY-BkbbbGV4.js
+%%DATADIR%%/data/www/web/assets/SZ-Nsmpk1ta.js
+%%DATADIR%%/data/www/web/assets/TA-DF1AlPKL.js
+%%DATADIR%%/data/www/web/assets/TC-BTPPVZng.js
+%%DATADIR%%/data/www/web/assets/TD-CSh8i59s.js
+%%DATADIR%%/data/www/web/assets/TF-BPFEFMdK.js
+%%DATADIR%%/data/www/web/assets/TG-Oa56GPmf.js
+%%DATADIR%%/data/www/web/assets/TH-BJX0syoz.js
+%%DATADIR%%/data/www/web/assets/TJ-DtjFN_iR.js
+%%DATADIR%%/data/www/web/assets/TK-CaxH436f.js
+%%DATADIR%%/data/www/web/assets/TL-BPeBNRvt.js
+%%DATADIR%%/data/www/web/assets/TM-DT_5zC_0.js
+%%DATADIR%%/data/www/web/assets/TN-Cl0B51zJ.js
+%%DATADIR%%/data/www/web/assets/TO-BVPa4Mpa.js
+%%DATADIR%%/data/www/web/assets/TR-Bi14AjTg.js
+%%DATADIR%%/data/www/web/assets/TT-fwwKejP_.js
+%%DATADIR%%/data/www/web/assets/TV-_2T_W9_n.js
+%%DATADIR%%/data/www/web/assets/TW-DyIUquWk.js
+%%DATADIR%%/data/www/web/assets/TZ-_Cd0rEzL.js
+%%DATADIR%%/data/www/web/assets/UA-DewlWFPj.js
+%%DATADIR%%/data/www/web/assets/UG-1AXaIxpM.js
+%%DATADIR%%/data/www/web/assets/UM-hrHxDpNe.js
+%%DATADIR%%/data/www/web/assets/UNKNOWN-DIN2B7u2.js
+%%DATADIR%%/data/www/web/assets/US-hrHxDpNe.js
+%%DATADIR%%/data/www/web/assets/UY-D3PEaFKJ.js
+%%DATADIR%%/data/www/web/assets/UZ-DbF9PNiH.js
+%%DATADIR%%/data/www/web/assets/VA-XPVDV5gM.js
+%%DATADIR%%/data/www/web/assets/VC-BDghloKL.js
+%%DATADIR%%/data/www/web/assets/VE-BD6sp8D2.js
+%%DATADIR%%/data/www/web/assets/VG-JWeMT2dO.js
+%%DATADIR%%/data/www/web/assets/VI-BLcpEKX1.js
+%%DATADIR%%/data/www/web/assets/VN-88OylpOb.js
+%%DATADIR%%/data/www/web/assets/VU-B3o2l031.js
+%%DATADIR%%/data/www/web/assets/WF-Bv7MkmLx.js
+%%DATADIR%%/data/www/web/assets/WS-Cxo8EBUY.js
+%%DATADIR%%/data/www/web/assets/XK-DHuA0EV5.js
+%%DATADIR%%/data/www/web/assets/YE-By8P38Ye.js
+%%DATADIR%%/data/www/web/assets/YT-DbhRoF51.js
+%%DATADIR%%/data/www/web/assets/ZA-DsWnrAmj.js
+%%DATADIR%%/data/www/web/assets/ZM-CdkX6WZ3.js
+%%DATADIR%%/data/www/web/assets/ZW-B1PpRcC0.js
+%%DATADIR%%/data/www/web/assets/browser-ponyfill-touFzT30.js
 %%DATADIR%%/data/www/web/assets/cc3200-B-jSkbsy.jpg
 %%DATADIR%%/data/www/web/assets/cc3200_debugPort-CUfuhKbo.jpg
 %%DATADIR%%/data/www/web/assets/cc3200_installCfwFlashUpload-D3jB7q0q.png
@@ -33,24 +296,25 @@ bin/teddycloud
 %%DATADIR%%/data/www/web/assets/cc3235-Cr21bWbC.jpg
 %%DATADIR%%/data/www/web/assets/cc3235_flash-D2YMWv70.jpg
 %%DATADIR%%/data/www/web/assets/cc3235_smd_grippers-MdbEjaZo.jpg
-%%DATADIR%%/data/www/web/assets/esp32-BPYaDt9v.js
 %%DATADIR%%/data/www/web/assets/esp32-B_b6hCjy.jpg
+%%DATADIR%%/data/www/web/assets/esp32-BhDgbdPM.js
+%%DATADIR%%/data/www/web/assets/esp32_j100-BMdNkIk7.png
 %%DATADIR%%/data/www/web/assets/esp32_pcb-CWEYHEzm.png
 %%DATADIR%%/data/www/web/assets/esp32_pcb_clamp-Cw2o3uco.png
 %%DATADIR%%/data/www/web/assets/esp32_pcb_preview-Bh1UGQPK.png
 %%DATADIR%%/data/www/web/assets/esp32_write_patched_image_with_esptools-DmsBlrjp.png
-%%DATADIR%%/data/www/web/assets/esp32c2-CVPL8n1g.js
-%%DATADIR%%/data/www/web/assets/esp32c3-I3vXmsVg.js
-%%DATADIR%%/data/www/web/assets/esp32c5-CAGCiNY4.js
-%%DATADIR%%/data/www/web/assets/esp32c6-C93uIFil.js
-%%DATADIR%%/data/www/web/assets/esp32c61-Qo5S0GG2.js
-%%DATADIR%%/data/www/web/assets/esp32h2-Cf8JbGZQ.js
-%%DATADIR%%/data/www/web/assets/esp32p4-DfBdIAkh.js
-%%DATADIR%%/data/www/web/assets/esp32s2-3nCAg6Ct.js
-%%DATADIR%%/data/www/web/assets/esp32s3-mu2zzjDN.js
-%%DATADIR%%/data/www/web/assets/esp8266-8VKmCx7J.js
-%%DATADIR%%/data/www/web/assets/index-DUW332vS.js
-%%DATADIR%%/data/www/web/assets/index-Dljhv4sL.css
+%%DATADIR%%/data/www/web/assets/esp32c2-CuDNJqQ0.js
+%%DATADIR%%/data/www/web/assets/esp32c3-D6PQO2EJ.js
+%%DATADIR%%/data/www/web/assets/esp32c5-D376rjyX.js
+%%DATADIR%%/data/www/web/assets/esp32c6-CcSzi6cJ.js
+%%DATADIR%%/data/www/web/assets/esp32c61-s_w6ZLOx.js
+%%DATADIR%%/data/www/web/assets/esp32h2-L83WRn7D.js
+%%DATADIR%%/data/www/web/assets/esp32p4-BQNWBb2f.js
+%%DATADIR%%/data/www/web/assets/esp32s2-NL0-Ytlx.js
+%%DATADIR%%/data/www/web/assets/esp32s3-wh7ZIwIl.js
+%%DATADIR%%/data/www/web/assets/esp8266-DjSL4SI8.js
+%%DATADIR%%/data/www/web/assets/index-ChpkR0Rj.js
+%%DATADIR%%/data/www/web/assets/index-zRaEDlqF.css
 %%DATADIR%%/data/www/web/assets/logo-aw46LCqE.png
 %%DATADIR%%/data/www/web/assets/openTB_step1_1-4vwQGflo.png
 %%DATADIR%%/data/www/web/assets/openTB_step1_2-DIZc5DI4.png
@@ -59,13 +323,26 @@ bin/teddycloud
 %%DATADIR%%/data/www/web/assets/openTB_step4-Bj5i-Kw_.png
 %%DATADIR%%/data/www/web/assets/openTB_step5-DTGOEBgD.png
 %%DATADIR%%/data/www/web/assets/rom-Caghk6Eh.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32-DIlGCCSz.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32c2-B8dsLG7-.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32c3-LInKOK0z.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32c5-DYguqfJK.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32c6-BMffPMCp.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32c61-Dm89Jp02.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32h2-DKTWdQO2.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32p4-77EG6B-R.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32s2-DLJQYVPj.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_32s3-B0-qH3ON.js
+%%DATADIR%%/data/www/web/assets/stub_flasher_8266-Bxnk_IeY.js
 %%DATADIR%%/data/www/web/assets/tb-esp32-uart-BDPWj6EB.png
 %%DATADIR%%/data/www/web/assets/tb-esp32-uart-clamp-D_86EMpu.png
 %%DATADIR%%/data/www/web/assets/uart_3v3-5V_jumper_black-BW2kS97B.jpg
 %%DATADIR%%/data/www/web/assets/uart_3v3-5V_jumper_switch-Cl7yHFlu.jpg
 %%DATADIR%%/data/www/web/assets/uart_3v3-5V_jumper_yellow-d4JFD7jo.jpg
 %%DATADIR%%/data/www/web/assets/unknown_box-xU178mnG.png
+%%DATADIR%%/data/www/web/favicon-96x96.png
 %%DATADIR%%/data/www/web/favicon.ico
+%%DATADIR%%/data/www/web/favicon.svg
 %%DATADIR%%/data/www/web/index.html
 %%DATADIR%%/data/www/web/manifest.json
 %%DATADIR%%/data/www/web/robots.txt
@@ -73,7 +350,14 @@ bin/teddycloud
 %%DATADIR%%/data/www/web/translations/en.json
 %%DATADIR%%/data/www/web/translations/es.json
 %%DATADIR%%/data/www/web/translations/fr.json
+%%DATADIR%%/data/www/web/wasm/taf_encoder.js
+%%DATADIR%%/data/www/web/wasm/taf_encoder.wasm
+%%DATADIR%%/data/www/web/web-app-manifest-dark-192.png
+%%DATADIR%%/data/www/web/web-app-manifest-dark-512.png
+%%DATADIR%%/data/www/web/web-app-manifest-light-192.png
+%%DATADIR%%/data/www/web/web-app-manifest-light-512.png
 %%DATADIR%%/data/www/web/web_version.json
+@dir %%ETCDIR%%
 @dir %%DATADIR%%/certs/client
 @dir %%DATADIR%%/certs/server
 @dir %%DATADIR%%/data/content/default
@@ -82,3 +366,4 @@ bin/teddycloud
 @dir %%DATADIR%%/data/firmware/ota/esp32
 @dir %%DATADIR%%/data/library
 @dir %%DATADIR%%/data/www/custom_img
+@dir %%DATADIR%%/data/www/plugins