diff --git a/public/analytics.js b/public/analytics.js
index 986aef5..c7e26b3 100644
--- a/public/analytics.js
+++ b/public/analytics.js
@@ -783,12 +783,14 @@
${data.subpaths.map((s, i) => {
const barW = Math.max(2, Math.round(s.count / maxCount * 100));
- return `
+ const hops = s.path.split(' → ');
+ const hasSelfLoop = hops.some((h, j) => j > 0 && h === hops[j - 1]);
+ return `
| ${i + 1} |
- ${escapeHtml(s.path)} |
+ ${esc(s.path)}${hasSelfLoop ? ' 🔄' : ''} |
${s.count.toLocaleString()} |
${s.pct}% |
- |
+ |
`;
}).join('')}
`;
diff --git a/public/style.css b/public/style.css
index e60389b..31fc9f4 100644
--- a/public/style.css
+++ b/public/style.css
@@ -1146,3 +1146,7 @@ button.ch-item.ch-item-encrypted .ch-badge { filter: grayscale(0.6); }
/* Ambiguous hop indicator */
.hop-ambiguous { border-bottom: 1px dashed #f59e0b; }
.hop-warn { font-size: 0.7em; margin-left: 2px; vertical-align: super; }
+
+/* Self-loop subpath rows */
+.subpath-selfloop { opacity: 0.6; }
+.subpath-selfloop td:first-child::after { content: ''; }