diff --git a/apps/frontend/public/favicon.svg b/apps/frontend/public/favicon.svg
index 988cd35b..7a4918fb 100644
--- a/apps/frontend/public/favicon.svg
+++ b/apps/frontend/public/favicon.svg
@@ -1,5 +1,6 @@
diff --git a/apps/frontend/src/components/AppShell.tsx b/apps/frontend/src/components/AppShell.tsx
index 62eea958..558aaff7 100644
--- a/apps/frontend/src/components/AppShell.tsx
+++ b/apps/frontend/src/components/AppShell.tsx
@@ -27,6 +27,7 @@ import {
useCommandMenuShortcut,
} from "@/components/CommandMenu";
import { BrandMark } from "@/components/BrandMark";
+import { BrandWordmark } from "@/components/BrandWordmark";
import { DemoBanner } from "@/components/DemoBanner";
import { HeaderBell } from "@/components/HeaderBell";
import { LanguageToggle } from "@/components/LanguageToggle";
@@ -214,7 +215,7 @@ function SidebarNav({
) : (
- {t("app.name")}
+
)}
diff --git a/apps/frontend/src/components/BrandLockup.tsx b/apps/frontend/src/components/BrandLockup.tsx
new file mode 100644
index 00000000..5904ed4b
--- /dev/null
+++ b/apps/frontend/src/components/BrandLockup.tsx
@@ -0,0 +1,31 @@
+/**
+ * BrandLockup — the full TRUSCA logo: mark + "TRUSCA" wordmark + the
+ * "TrustedOSS SCA" tagline (the SCA tool of the TrustedOSS initiative).
+ *
+ * Used where there is vertical room (the auth gateway, brand showcase).
+ * Tight surfaces — the 48 px sidebar / header — use the reduced lockup
+ * (BrandMark + BrandWordmark, no tagline). See docs/brand-trusca.md.
+ *
+ * The tagline is a brand string (not translated) and is NOT uppercased —
+ * the umbrella name "TrustedOSS" keeps its camel casing. Its colour uses the
+ * theme's muted-foreground token (passes WCAG AA), while the mark gradient
+ * and the teal wordmark are fixed brand colours.
+ */
+import { BrandMark } from "@/components/BrandMark";
+import { BrandWordmark } from "@/components/BrandWordmark";
+
+export function BrandLockup() {
+ return (
+
+
+
+
+
+
+
+ TrustedOSS SCA
+
+
+
+ );
+}
diff --git a/apps/frontend/src/components/BrandMark.tsx b/apps/frontend/src/components/BrandMark.tsx
index d29d84c8..182928ab 100644
--- a/apps/frontend/src/components/BrandMark.tsx
+++ b/apps/frontend/src/components/BrandMark.tsx
@@ -3,15 +3,19 @@
* check), picked in the W1 rebrand (see docs/brand-trusca.md).
*
* Canonical in-app rendering of the mark (the same geometry ships as
- * public/favicon.svg and the docs-site logo). Used by the AppShell collapsed
- * rail; reuse this component anywhere the symbol is needed instead of
- * re-inlining the paths.
+ * public/favicon.svg and the docs-site logo). Reuse this component anywhere
+ * the symbol is needed instead of re-inlining the paths.
*
- * Palette is fixed brand ink/paper (not theme tokens) so the tile reads
- * identically on any surface, matching the favicon.
+ * Palette is fixed brand colour (not theme tokens) so the tile reads
+ * identically on any surface: a teal gradient tile (#2dd4bf → #0f766e) with
+ * the hexagon + check in paper (#fafafa). Teal is the TRUSCA brand colour;
+ * the wordmark (BrandWordmark) uses the same teal. The gradient id is
+ * per-instance (useId) so multiple marks on one page never collide.
*/
+import { useId } from "react";
export function BrandMark({ size = 24 }: { size?: number }) {
+ const gradId = useId();
return (