+
+
+
+
OpenIPC Viewer
diff --git a/src/OpenIPC.Viewer.Web.Client/public/apple-touch-icon.png b/src/OpenIPC.Viewer.Web.Client/public/apple-touch-icon.png
new file mode 100644
index 0000000..b6542f0
Binary files /dev/null and b/src/OpenIPC.Viewer.Web.Client/public/apple-touch-icon.png differ
diff --git a/src/OpenIPC.Viewer.Web.Client/public/favicon.svg b/src/OpenIPC.Viewer.Web.Client/public/favicon.svg
new file mode 100644
index 0000000..de113be
--- /dev/null
+++ b/src/OpenIPC.Viewer.Web.Client/public/favicon.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/OpenIPC.Viewer.Web.Client/src/components/Logo.tsx b/src/OpenIPC.Viewer.Web.Client/src/components/Logo.tsx
new file mode 100644
index 0000000..8cf8069
--- /dev/null
+++ b/src/OpenIPC.Viewer.Web.Client/src/components/Logo.tsx
@@ -0,0 +1,27 @@
+// The OpenIPC aperture mark, ported from the desktop SplashAperture.axaml
+// (same 100x100 geometry, same stroke widths) so the web console wears the same
+// logo as the app icon. Inline SVG rather than the 512px PNG: it stays crisp at
+// 18px in the sidebar, and `currentColor` lets the mark follow the theme.
+export function Logo({ size = 18, className }: { size?: number; className?: string }) {
+ return (
+
+ )
+}
diff --git a/src/OpenIPC.Viewer.Web.Client/src/components/Shell.tsx b/src/OpenIPC.Viewer.Web.Client/src/components/Shell.tsx
index cf9540c..3f122c2 100644
--- a/src/OpenIPC.Viewer.Web.Client/src/components/Shell.tsx
+++ b/src/OpenIPC.Viewer.Web.Client/src/components/Shell.tsx
@@ -1,6 +1,7 @@
import { NavLink, Outlet, useNavigate } from 'react-router-dom'
import { useAuth } from '../auth'
import { useI18n } from '../i18n'
+import { Logo } from './Logo'
import type { ReactNode } from 'react'
// The persistent app frame: fixed left sidebar + routed content. Markup/skin
@@ -20,7 +21,7 @@ export function Shell() {