diff --git a/apps/web/package.json b/apps/web/package.json
index cbd10bc4..206b8e34 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -61,6 +61,7 @@
"@tripwire/env": "workspace:*",
"@tripwire/feedback": "workspace:*",
"@tripwire/github": "workspace:*",
+ "@tripwire/logger": "workspace:*",
"@tripwire/mcp": "workspace:*",
"@tripwire/ratelimit": "workspace:*",
"@tripwire/research": "workspace:*",
diff --git a/apps/web/public/og.jpg b/apps/web/public/og.jpg
index 8e2c149a..598db554 100644
Binary files a/apps/web/public/og.jpg and b/apps/web/public/og.jpg differ
diff --git a/apps/web/src/components/layout/admin/admin-shell.tsx b/apps/web/src/components/layout/admin/admin-shell.tsx
new file mode 100644
index 00000000..c73e24e7
--- /dev/null
+++ b/apps/web/src/components/layout/admin/admin-shell.tsx
@@ -0,0 +1,178 @@
+import { useEffect } from "react"
+import {
+ Link,
+ Outlet,
+ useNavigate,
+ useRouterState,
+} from "@tanstack/react-router"
+import { useQuery } from "@tanstack/react-query"
+import { FlaskConical, LayoutDashboard, ShieldUser } from "lucide-react"
+import { AuthProvider } from "@tripwire/auth/components"
+import { authClient } from "@tripwire/auth/client"
+import { TripwireLogo } from "@tripwire/ui/icons/tripwire-logo"
+import { useTRPC } from "#/integrations/trpc/react"
+
+/**
+ * Layout for every /admin/* page. Wraps in AuthProvider + AdminGuard
+ * so role enforcement happens client-side with the user's actual
+ * cookies (a `beforeLoad` check would run with the SSR trpc client
+ * which has no cookie context).
+ */
+export function AdminShell() {
+ return (
+
+ What's happening across every repo running Tripwire. +
++ Look up a contributor across repos, edit their counters or score, and + delete events surgically. +
++ Bulk-evaluate a contributor cohort against the rule pipeline. +
+{hint}
+ ) : null} ++ {run?.id} + {run ? ( + <> + · + created {formatRelativeTime(run.createdAt)} + > + ) : null} +
+
+ {run.errorMessage}
+
+ ) : null}
+ >
+ ) : null}
+ + Bulk-score contributor cohorts against the rule pipeline. +
+