diff --git a/web/app.js b/web/app.js
index bdb4013..a1334f8 100644
--- a/web/app.js
+++ b/web/app.js
@@ -2638,6 +2638,19 @@ renderPeriod();
fetch('/auth/me').then((res) => (res.ok ? res.json() : null)).then((me) => {
if (!me) return;
if (me.mode === 'none' && store.get('authWarnHidden') !== '1') $('#authWarn').hidden = false;
+ const who = $('#whoami');
+ if (me.mode === 'none') {
+ who.classList.add('none');
+ who.querySelector('.who-name').textContent = '(no auth)';
+ who.hidden = false;
+ } else if (me.user) {
+ who.querySelector('.who-name').textContent = me.user;
+ who.title = me.user;
+ const badge = who.querySelector('.who-badge');
+ badge.textContent = me.mode === 'oidc' ? 'OIDC' : 'local';
+ badge.classList.add(me.mode);
+ who.hidden = false;
+ }
if (me.role === 'viewer') {
document.body.classList.add('read-only');
for (const p of document.querySelectorAll('[data-panel="filters"], [data-panel="sources"], [data-panel="data"]')) {
diff --git a/web/index.html b/web/index.html
index 38d0c4b..30ddba7 100644
--- a/web/index.html
+++ b/web/index.html
@@ -41,6 +41,7 @@
+
diff --git a/web/style.css b/web/style.css
index 812b6b7..3172a2d 100644
--- a/web/style.css
+++ b/web/style.css
@@ -189,6 +189,16 @@ svg { fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round;
.chip.on { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
.actions { display: flex; align-items: center; gap: 6px; margin-left: auto; }
+/* Logged-in user, with how they logged in (OIDC / local) */
+.whoami { display: flex; align-items: center; gap: 6px; min-width: 0; margin-left: 6px; font-size: 13px; color: var(--muted); }
+.whoami .who-name { font-weight: 600; color: var(--text); max-width: 18ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.whoami .who-badge {
+ flex: none; border: 1px solid var(--border); border-radius: 6px;
+ padding: 1px 6px; font-size: 10.5px; font-weight: 650; letter-spacing: .02em;
+}
+.whoami .who-badge.oidc { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
+.whoami .who-badge:empty { display: none; }
+.whoami.none .who-name { font-weight: 400; color: var(--muted); }
.icon-btn {
width: 36px; height: 36px; display: grid; place-items: center;
border: 1px solid transparent; background: transparent; border-radius: 9px; color: var(--muted);
@@ -750,6 +760,7 @@ input.switch:focus-visible { outline: 2px solid var(--accent); outline-offset: 2
.topbar { flex-wrap: wrap; padding: 8px 16px; gap: 8px 10px; }
.search { order: 3; flex-basis: 100%; max-width: none; }
.live .lbl { display: none; }
+ .whoami .who-name { max-width: 12ch; }
.filters { padding: 10px 16px 6px; }
.filters select { flex: 1 1 calc(50% - 8px); max-width: none; min-width: 0; }
.view-mode { flex: 1 1 100%; }