+
+
+ {ACTOR_FILTERS.map((filter) => (
+ handleFilterSelect(filter.value)}
+ >
+ {filter.label}
+
+ ))}
+
+
+ {OUTCOME_FILTERS.map((filter) => (
+ handleOutcomeSelect(filter.value)}
+ >
+ {filter.label}
+
+ ))}
+
+
+ {/* Deliberately not "every change": this records configuration and
+ access changes plus refused attempts, not reads or telemetry. */}
+
+ Configuration and access changes, from the dashboard, API, and MCP.
+
+
+
+
+ {view === null && Result.isFailure(pageResult) ? (
+
+
+
+
+
+ Couldn't load the audit log
+
+ Something went wrong while loading audit log entries.
+
+
+
+
+ ) : view === null ? (
+
+
+
+
+
+ ) : view.entries.length === 0 ? (
+
+
+
+
+
+ No audit log entries
+
+ Actions performed by users, API keys, and agents will appear here.
+
+
+
+ ) : (
+
+
+ Time
+ Actor
+ Action
+ Resource
+ Source
+
+ {view.entries.map((entry) => (
+
+ ))}
+
+ )}
+
+
+ {view !== null && view.hasMore && view.nextCursor !== null && (
+
+ Showing {view.entries.length} entries — more available
+
+
+ )}
+
+ )
+}
+
+function FilterTab({
+ active,
+ onClick,
+ children,
+}: {
+ active: boolean
+ onClick: () => void
+ children: ReactNode
+}) {
+ return (
+
+
+ {formatRelativeTime(entry.occurred_at)}
+
+
+
+ {badge.label}
+
+
+ {actorLabel}
+
+
+
+
+
+ {entry.action}
+
+ {entry.outcome === "denied" && (
+
+ Denied
+
+ )}
+
+ {entry.outcome === "denied" && entry.denial_reason !== null && (
+
+ {entry.denial_reason}
+
+ )}
+ {entry.changes !== null && entry.changes.fields.length > 0 && (
+
+ {entry.changes.fields.join(", ")}
+
+ )}
+
+
+ {entry.resource_type !== null || entry.resource_id !== null ? (
+
+ {entry.resource_type !== null && (
+
+ {entry.resource_type}
+
+ )}
+ {entry.resource_id !== null && (
+
+ {entry.resource_id}
+
+ )}
+
+ ) : (
+
—
+ )}
+
+
+ {entry.source}
+ {entry.origin_country !== null && (
+ · {entry.origin_country}
+ )}
+
+
+ )
+}
diff --git a/apps/web/src/components/settings/settings-nav.tsx b/apps/web/src/components/settings/settings-nav.tsx
index 1efc11c9b..db51b7bf2 100644
--- a/apps/web/src/components/settings/settings-nav.tsx
+++ b/apps/web/src/components/settings/settings-nav.tsx
@@ -14,6 +14,7 @@ import {
DatabaseIcon,
GearIcon,
GridIcon,
+ HistoryIcon,
KeyIcon,
ServerIcon,
ShieldIcon,
@@ -26,6 +27,7 @@ import { SettingsNavShell } from "@/components/settings/settings-nav-shell"
export const settingsTabValues = [
"organization",
"members",
+ "audit-log",
"setup-audit",
"ingestion",
"api-keys",
@@ -41,6 +43,7 @@ export type SettingsTab = (typeof settingsTabValues)[number]
export const settingsTabLabels: Record