diff --git a/README.md b/README.md
index 5419dd0..0003222 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,98 @@
# llm-multiverse-ui
-Web frontend for the llm-multiverse orchestration system
+Web frontend for the **llm-multiverse** orchestration system. Built with SvelteKit 5, TypeScript, Tailwind CSS v4, and gRPC-Web (Connect).
+
+## Prerequisites
+
+- Node.js 20+
+- A running llm-multiverse gRPC backend (the UI proxies requests through Vite/your production reverse proxy)
+
+## Getting Started
+
+```bash
+# Install dependencies
+npm install
+
+# Generate protobuf TypeScript definitions (only needed after .proto changes)
+npm run generate
+
+# Start the dev server
+npm run dev
+```
+
+The app starts at `http://localhost:5173` by default.
+
+## Scripts
+
+| Command | Description |
+| ------------------- | ------------------------------------------------ |
+| `npm run dev` | Start Vite dev server with HMR |
+| `npm run build` | Production build |
+| `npm run preview` | Preview the production build locally |
+| `npm run check` | Run svelte-check for TypeScript/Svelte errors |
+| `npm run lint` | Run ESLint |
+| `npm run format` | Format code with Prettier |
+| `npm run generate` | Regenerate protobuf TypeScript from `.proto` files |
+
+## Using the UI
+
+### Landing Page
+
+The root page (`/`) links to every section of the app.
+
+### Chat (`/chat`)
+
+The main interface for interacting with the orchestrator.
+
+- **Sessions** are listed in the left sidebar. Click **+ New Chat** to start a session, or select an existing one. On mobile, tap the hamburger menu to open the sidebar.
+- Type a message and press **Enter** (or the **Send** button) to send it. While the orchestrator is processing, a progress indicator and thinking section show the current state.
+- **Session Config** (gear icon / "Config" button) opens a right sidebar where you can adjust the override level, disable specific tools, grant permissions, and save/load presets.
+- If a request fails, an error banner appears with a **Retry** button.
+- Navigation links to Lineage, Memory, and Audit are in the header (hidden on small screens).
+
+### Agent Lineage (`/lineage`)
+
+Visualizes the agent spawn tree as an interactive SVG diagram.
+
+- Click a node to view agent details (ID, type, depth, children) in a side panel.
+- A legend at the bottom shows agent type colors.
+- Supports dark mode with theme-aware SVG colors.
+
+### Memory Candidates (`/memory`)
+
+Lists memory candidates captured during orchestration, grouped by session.
+
+- **Source filter** — filter by Tool Output, Model Knowledge, or Web.
+- **Confidence slider** — set a minimum confidence threshold.
+- Each card shows the candidate content, source badge, and a confidence bar.
+
+### Audit Log (`/audit`)
+
+Timeline view of orchestration events for each session.
+
+- Select a session from the dropdown, then optionally filter by event type (State Change, Tool, Error, Message).
+- Events are displayed chronologically with date separators and color-coded badges.
+
+### Theme
+
+Use the theme toggle (sun/moon icon in any header) to cycle between **System**, **Light**, and **Dark** modes. The preference is persisted in localStorage.
+
+## Project Structure
+
+```
+src/
+ lib/
+ components/ Svelte components (Backdrop, PageHeader, MessageInput, ...)
+ composables/ Reactive composables (useOrchestration)
+ data/ Sample/demo data generators
+ proto/ Generated protobuf TypeScript
+ services/ gRPC client (orchestrator)
+ stores/ Svelte 5 reactive stores (sessions, audit, memory, theme, ...)
+ types/ TypeScript types and helpers (lineage, resultSource)
+ utils/ Shared utilities (date formatting, session config)
+ routes/
+ chat/ Chat page
+ lineage/ Agent lineage visualization
+ memory/ Memory candidates browser
+ audit/ Audit log timeline
+```
diff --git a/src/lib/components/AuditTimeline.svelte b/src/lib/components/AuditTimeline.svelte
index c782f7c..d07e91b 100644
--- a/src/lib/components/AuditTimeline.svelte
+++ b/src/lib/components/AuditTimeline.svelte
@@ -1,5 +1,6 @@
@@ -70,18 +51,19 @@
{#each events as event, i (event.id)}
- {@const showDate = i === 0 || formatDate(event.timestamp) !== formatDate(events[i - 1].timestamp)}
+ {@const showDate = i === 0 || formatShortDate(event.timestamp) !== formatShortDate(events[i - 1].timestamp)}
+ {@const config = getEventConfig(event.eventType)}
{#if showDate}