diff --git a/src/dashboard/templates/base.html b/src/dashboard/templates/base.html
index 3ce1ee4..70800be 100644
--- a/src/dashboard/templates/base.html
+++ b/src/dashboard/templates/base.html
@@ -327,7 +327,11 @@
.then(function(data) {
var list = document.getElementById('notif-list');
if (!data.length) {
- list.innerHTML = '
-
${label}
- ${desc ? `
${desc}
` : ''}
-
- ${time}
- ${evt.source || 'system'}
-
-
- `;
+ // Build DOM safely using createElement and textContent
+ var iconDiv = document.createElement('div');
+ iconDiv.className = 'activity-icon';
+ iconDiv.textContent = icon;
+
+ var contentDiv = document.createElement('div');
+ contentDiv.className = 'activity-content';
+
+ var labelDiv = document.createElement('div');
+ labelDiv.className = 'activity-label';
+ labelDiv.textContent = label;
+ contentDiv.appendChild(labelDiv);
+
+ if (desc) {
+ var descDiv = document.createElement('div');
+ descDiv.className = 'activity-desc';
+ descDiv.textContent = desc;
+ contentDiv.appendChild(descDiv);
+ }
+
+ var metaDiv = document.createElement('div');
+ metaDiv.className = 'activity-meta';
+
+ var timeSpan = document.createElement('span');
+ timeSpan.className = 'activity-time';
+ timeSpan.textContent = time;
+
+ var sourceSpan = document.createElement('span');
+ sourceSpan.className = 'activity-source';
+ sourceSpan.textContent = evt.source || 'system';
+
+ metaDiv.appendChild(timeSpan);
+ metaDiv.appendChild(sourceSpan);
+ contentDiv.appendChild(metaDiv);
+
+ item.appendChild(iconDiv);
+ item.appendChild(contentDiv);
// Add to top
container.insertBefore(item, container.firstChild);