diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1734e30..df2abd7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,10 @@ All notable changes to Primora. Format follows [Keep a Changelog](https://keepac
## [Unreleased]
+### Added
+
+- **Slugs auto-derive from names** — typing an organization, project, bucket, or collection name now fills its slug (`TDvorak` → `tdvorak`); hand-editing the slug stops the derivation, and manual edits are sanitized as you type. Edit forms stay manual.
+
## [0.8.3] - 2026-09-28
### Added
diff --git a/apps/frontend/src/App.tsx b/apps/frontend/src/App.tsx
index d25f05d..880ffa2 100644
--- a/apps/frontend/src/App.tsx
+++ b/apps/frontend/src/App.tsx
@@ -28,6 +28,7 @@ import { Show, createEffect, createMemo, createResource, createSignal, onCleanup
import { authClient, fetchApiToken } from "./lib/auth-client";
import { configureApiToken, errorMessage } from "./lib/api";
import { isDemoMode, disableDemoMode, enableDemoMode, demoSession, demoService } from "./lib/demo-mode";
+import { applySlugField } from "./lib/slug";
import {
AgentSetupModal,
AppShell,
@@ -1670,14 +1671,14 @@ export default function App() {
label="Organization name"
placeholder="Acme Corporation"
value={organizationInput().name}
- onInput={(e) => setOrganizationInput((c) => ({ ...c, name: e.currentTarget.value }))}
+ onInput={(e) => setOrganizationInput((c) => applySlugField(c, "name", e.currentTarget.value))}
required
/>
setOrganizationInput((c) => ({ ...c, slug: e.currentTarget.value }))}
+ onInput={(e) => setOrganizationInput((c) => applySlugField(c, "slug", e.currentTarget.value))}
required
/>