diff --git a/CLAUDE.md b/CLAUDE.md
index 0da39a8a8..f5af33cb6 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,5 +1,10 @@
# Arc
+## Dev servers
+
+1. `arc serve --demo` — starts the Rust API server in demo mode
+2. `cd apps/arc-web && bun run dev` — starts the React dev server
+
## API workflow
The OpenAPI spec at `openapi/arc-api.yaml` is the source of truth for the arc-api HTTP interface.
diff --git a/apps/arc-web/app/components/auth-layout.tsx b/apps/arc-web/app/components/auth-layout.tsx
new file mode 100644
index 000000000..9cb3cc160
--- /dev/null
+++ b/apps/arc-web/app/components/auth-layout.tsx
@@ -0,0 +1,38 @@
+import type { ReactNode } from "react";
+
+function ArcLogo({ className }: { className?: string }) {
+ return (
+
+ );
+}
+
+export function AuthLayout({
+ children,
+ footer,
+}: {
+ children: ReactNode;
+ footer?: ReactNode;
+}) {
+ return (
+
+
+
+
+ {children}
+
+ {footer && (
+
+ {footer}
+
+ )}
+
+
+ );
+}
diff --git a/apps/arc-web/app/routes/auth-login.tsx b/apps/arc-web/app/routes/auth-login.tsx
index ffc57a0bc..9ab33715a 100644
--- a/apps/arc-web/app/routes/auth-login.tsx
+++ b/apps/arc-web/app/routes/auth-login.tsx
@@ -1,4 +1,5 @@
import { redirect } from "react-router";
+import { AuthLayout } from "../components/auth-layout";
import { getGitHubOAuth, generateState } from "../lib/github.server";
import type { Route } from "./+types/auth-login";
@@ -16,21 +17,30 @@ export function action({ request }: Route.ActionArgs) {
export default function AuthLogin() {
return (
-
-
-
Sign in to Arc
-
- Authenticate with your GitHub account to continue.
-
-
-
-
+
+
+ Sign in to Arc
+
+
+ Authenticate with your GitHub account to continue.
+
+
+
+ );
+}
+
+function GitHubMark() {
+ return (
+
);
}
diff --git a/apps/arc-web/app/routes/setup.tsx b/apps/arc-web/app/routes/setup.tsx
index 1433a599b..8a16d1766 100644
--- a/apps/arc-web/app/routes/setup.tsx
+++ b/apps/arc-web/app/routes/setup.tsx
@@ -1,4 +1,5 @@
import { redirect } from "react-router";
+import { AuthLayout } from "../components/auth-layout";
import { isGitHubAppConfigured } from "../lib/github.server";
import type { Route } from "./+types/setup";
@@ -35,26 +36,35 @@ export default function Setup({ loaderData }: Route.ComponentProps) {
const { manifest } = loaderData;
return (
-
-
-
Set up Arc
-
- Register a GitHub App to enable OAuth login and repository access.
-
-
-
-
+
+ Register GitHub App
+
+
+
+ );
+}
+
+function GitHubMark() {
+ return (
+
);
}