diff --git a/.changeset/admin-logo-branding.md b/.changeset/admin-logo-branding.md
new file mode 100644
index 0000000..11f1598
--- /dev/null
+++ b/.changeset/admin-logo-branding.md
@@ -0,0 +1,6 @@
+---
+"@emdash-cms/admin": patch
+"emdash": patch
+---
+
+Replace placeholder text branding with proper EmDash logo SVGs in admin UI
diff --git a/packages/admin/src/components/LoginPage.tsx b/packages/admin/src/components/LoginPage.tsx
index 3236b21..6d028a7 100644
--- a/packages/admin/src/components/LoginPage.tsx
+++ b/packages/admin/src/components/LoginPage.tsx
@@ -21,6 +21,7 @@ import * as React from "react";
import { apiFetch, fetchManifest } from "../lib/api";
import { sanitizeRedirectUrl } from "../lib/url";
import { PasskeyLogin } from "./auth/PasskeyLogin";
+import { LogoLockup } from "./Logo.js";
// ============================================================================
// Types
@@ -256,7 +257,7 @@ export function LoginPage({ redirectUrl = "/_emdash/admin" }: LoginPageProps) {
return (
@@ -268,7 +269,7 @@ export function LoginPage({ redirectUrl = "/_emdash/admin" }: LoginPageProps) {
{/* Header */}
-
— EmDash
+
{method === "passkey" && "Sign in to your site"}
{method === "magic-link" && "Sign in with email"}
diff --git a/packages/admin/src/components/Logo.tsx b/packages/admin/src/components/Logo.tsx
new file mode 100644
index 0000000..88f82e5
--- /dev/null
+++ b/packages/admin/src/components/Logo.tsx
@@ -0,0 +1,148 @@
+import type * as React from "react";
+
+/**
+ * EmDash icon mark — the rounded-rect em dash symbol.
+ * Used in the sidebar brand and as favicon.
+ */
+export function LogoIcon(props: React.SVGProps) {
+ return (
+
+ );
+}
+
+/**
+ * Full logo lockup — icon + "EmDash" wordmark.
+ * Renders both dark-text and light-text variants, switching via CSS `light-dark()`.
+ */
+export function LogoLockup({ className, ...props }: React.SVGProps) {
+ return (
+
+ );
+}
diff --git a/packages/admin/src/components/SetupWizard.tsx b/packages/admin/src/components/SetupWizard.tsx
index 4ab9043..ed5a0f3 100644
--- a/packages/admin/src/components/SetupWizard.tsx
+++ b/packages/admin/src/components/SetupWizard.tsx
@@ -16,6 +16,7 @@ import * as React from "react";
import { apiFetch, parseApiResponse } from "../lib/api/client";
import { PasskeyRegistration } from "./auth/PasskeyRegistration";
+import { LogoLockup } from "./Logo.js";
// ============================================================================
// Types
@@ -481,7 +482,7 @@ export function SetupWizard() {
{/* Header */}
-
— EmDash
+
{currentStep === "site" && "Set up your site"}
{currentStep === "admin" && "Create your account"}
diff --git a/packages/admin/src/components/Sidebar.tsx b/packages/admin/src/components/Sidebar.tsx
index 4779b6e..63592f6 100644
--- a/packages/admin/src/components/Sidebar.tsx
+++ b/packages/admin/src/components/Sidebar.tsx
@@ -24,6 +24,7 @@ import { fetchCommentCounts } from "../lib/api/comments";
import { useCurrentUser } from "../lib/api/current-user";
import { usePluginAdmins } from "../lib/plugin-context";
import { cn } from "../lib/utils";
+import { LogoIcon } from "./Logo.js";
// Re-export for Shell.tsx and Header.tsx
export { KumoSidebar as Sidebar, useSidebar };
@@ -346,9 +347,7 @@ export function SidebarNav({ manifest }: SidebarNavProps) {
to="/"
className="emdash-brand-link flex w-full min-w-0 items-center gap-2 px-3 py-1"
>
-
- —
-
+
EmDash
diff --git a/packages/admin/src/components/SignupPage.tsx b/packages/admin/src/components/SignupPage.tsx
index 377e855..b1b1227 100644
--- a/packages/admin/src/components/SignupPage.tsx
+++ b/packages/admin/src/components/SignupPage.tsx
@@ -16,6 +16,7 @@ import * as React from "react";
import { requestSignup, verifySignupToken, type SignupVerifyResult } from "../lib/api";
import { PasskeyRegistration } from "./auth/PasskeyRegistration";
+import { LogoLockup } from "./Logo.js";
// ============================================================================
// Types
@@ -388,7 +389,7 @@ export function SignupPage() {
{/* Header */}
-
— EmDash
+
{step === "email" && "Create an account"}
{step === "check-email" && "Check your email"}
diff --git a/packages/admin/src/components/WelcomeModal.tsx b/packages/admin/src/components/WelcomeModal.tsx
index db31a35..a2a6547 100644
--- a/packages/admin/src/components/WelcomeModal.tsx
+++ b/packages/admin/src/components/WelcomeModal.tsx
@@ -5,12 +5,12 @@
*/
import { Button, Dialog } from "@cloudflare/kumo";
-import { Sparkle } from "@phosphor-icons/react";
import { X } from "@phosphor-icons/react";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import * as React from "react";
import { apiFetch, throwResponseError } from "../lib/api/client";
+import { LogoIcon } from "./Logo.js";
interface WelcomeModalProps {
open: boolean;
@@ -87,8 +87,8 @@ export function WelcomeModal({ open, onClose, userName, userRole }: WelcomeModal
/>
-
-
+
+
Welcome to EmDash{userName ? `, ${userName.split(" ")[0]}` : ""}!
diff --git a/packages/core/src/astro/routes/admin.astro b/packages/core/src/astro/routes/admin.astro
index 9b5709b..eb72d54 100644
--- a/packages/core/src/astro/routes/admin.astro
+++ b/packages/core/src/astro/routes/admin.astro
@@ -20,7 +20,7 @@ export const prerender = false;
EmDash Admin