${name}
diff --git a/containers/libreportal/frontend/js/utils/data-loader.js b/containers/libreportal/frontend/js/utils/data-loader.js
index 0e7b54b..e2ea11d 100755
--- a/containers/libreportal/frontend/js/utils/data-loader.js
+++ b/containers/libreportal/frontend/js/utils/data-loader.js
@@ -118,7 +118,7 @@ let categories = [];
function getCategoryIcon(categoryId) {
const category = categories.find(cat => cat.id === categoryId);
- return category ? category.icon : 'icons/categories/misc.svg';
+ return category ? category.icon : '/icons/categories/misc.svg';
}
function getCategoryName(categoryId) {
diff --git a/containers/libreportal/frontend/js/utils/ui-helpers.js b/containers/libreportal/frontend/js/utils/ui-helpers.js
index 6d7eca3..b3b0c96 100755
--- a/containers/libreportal/frontend/js/utils/ui-helpers.js
+++ b/containers/libreportal/frontend/js/utils/ui-helpers.js
@@ -5,7 +5,7 @@
function getAppIcon(appName, appIconUrl) {
const cleanAppName = appName.replace('install_', '').replace(' ', '');
// Use icon URL from JSON if available, otherwise fall back to default
- return appIconUrl || `icons/apps/${cleanAppName}.svg`;
+ return appIconUrl || `/icons/apps/${cleanAppName}.svg`;
}
function getAppStatus(installed) {
diff --git a/scripts/webui/data/generators/apps/webui_config.sh b/scripts/webui/data/generators/apps/webui_config.sh
index 1d82ee3..1c254a5 100644
--- a/scripts/webui/data/generators/apps/webui_config.sh
+++ b/scripts/webui/data/generators/apps/webui_config.sh
@@ -212,7 +212,7 @@ EOF
fields+=(" \"backup_live_capable\": $backup_live_capable")
[[ -n "$url" ]] && fields+=(" \"url\": \"$url\"")
[[ -n "$description" ]] && fields+=(" \"description\": \"$description\"")
- [[ -n "$icon_file" ]] && fields+=(" \"icon\": \"icons/apps/$icon_file\"")
+ [[ -n "$icon_file" ]] && fields+=(" \"icon\": \"/icons/apps/$icon_file\"")
[[ -n "$services_json" ]] && fields+=(" \"services\": [$services_json]")
if [[ -n "$config_vars" ]]; then
fields+=(" \"config\": {"$'\n'"${config_vars%,}"$'\n'" }")
diff --git a/scripts/webui/data/generators/categories/webui_create_app_categories.sh b/scripts/webui/data/generators/categories/webui_create_app_categories.sh
index 567f63e..e22188b 100755
--- a/scripts/webui/data/generators/categories/webui_create_app_categories.sh
+++ b/scripts/webui/data/generators/categories/webui_create_app_categories.sh
@@ -26,67 +26,67 @@ webuiCreateAppsCategories() {
{
"id": "recommended",
"name": "Recommended",
- "icon": "icons/categories/recommended.svg",
+ "icon": "/icons/categories/recommended.svg",
"description": "Hand-picked apps to round out your install"
},
{
"id": "communication",
"name": "Communication",
- "icon": "icons/categories/communication.svg",
+ "icon": "/icons/categories/communication.svg",
"description": "Communication and collaboration tools"
},
{
"id": "development",
"name": "Development",
- "icon": "icons/categories/development.svg",
+ "icon": "/icons/categories/development.svg",
"description": "Development tools and version control"
},
{
"id": "knowledge",
"name": "Knowledge",
- "icon": "icons/categories/knowledge.svg",
+ "icon": "/icons/categories/knowledge.svg",
"description": "Knowledge management and wikis"
},
{
"id": "media",
"name": "Media",
- "icon": "icons/categories/media.svg",
+ "icon": "/icons/categories/media.svg",
"description": "Media streaming and entertainment"
},
{
"id": "monitoring",
"name": "Monitoring",
- "icon": "icons/categories/monitoring.svg",
+ "icon": "/icons/categories/monitoring.svg",
"description": "Metrics, dashboards and observability"
},
{
"id": "networking",
"name": "Networking",
- "icon": "icons/categories/networking.svg",
+ "icon": "/icons/categories/networking.svg",
"description": "Network tools and services"
},
{
"id": "productivity",
"name": "Productivity",
- "icon": "icons/categories/productivity.svg",
+ "icon": "/icons/categories/productivity.svg",
"description": "Productivity and business tools"
},
{
"id": "security",
"name": "Security",
- "icon": "icons/categories/security.svg",
+ "icon": "/icons/categories/security.svg",
"description": "Security and privacy tools"
},
{
"id": "storage",
"name": "Storage",
- "icon": "icons/categories/storage.svg",
+ "icon": "/icons/categories/storage.svg",
"description": "File storage and sharing solutions"
},
{
"id": "system",
"name": "System",
- "icon": "icons/categories/system.svg",
+ "icon": "/icons/categories/system.svg",
"description": "LibrePortal itself and platform-level services"
}
]
diff --git a/scripts/webui/data/utils/webui_app_icons.sh b/scripts/webui/data/utils/webui_app_icons.sh
index 3f14ccb..20aa552 100755
--- a/scripts/webui/data/utils/webui_app_icons.sh
+++ b/scripts/webui/data/utils/webui_app_icons.sh
@@ -2,7 +2,7 @@
# Sync app icons from container template dirs to the LibrePortal frontend.
#
-# apps.json references icons/apps/
. unconditionally (see
+# apps.json references /icons/apps/. unconditionally (see
# webui_config.sh), so the icon file must physically exist in the frontend
# icons dir or the apps page falls back to the default icon.
diff --git a/scripts/webui/data/utils/webui_container_setup.sh b/scripts/webui/data/utils/webui_container_setup.sh
index 6f6047d..0d9d38a 100755
--- a/scripts/webui/data/utils/webui_container_setup.sh
+++ b/scripts/webui/data/utils/webui_container_setup.sh
@@ -22,7 +22,7 @@ webuiContainerSetup()
webuiGenerateLibrePortalConfig
fi
# The patch path rewrites apps.json (which references
- # icons/apps/.svg) but doesn't place the icon file — sync it here
+ # /icons/apps/.svg) but doesn't place the icon file — sync it here
# so the apps page never points at a missing icon. The full regen
# copies icons itself; this is cheap and idempotent regardless.
if declare -F webuiSyncAppIcon >/dev/null 2>&1; then