From 13e0ef7c8575768672e9c96e272bcc071d06b273 Mon Sep 17 00:00:00 2001 From: Oussama Bernou Date: Wed, 27 May 2026 18:29:34 +0100 Subject: [PATCH 1/6] update design --- apps/web/src/app/dashboard/dashboard.tsx | 14 +- apps/web/src/app/home.tsx | 693 ++++++------------ apps/web/src/app/layout.tsx | 20 +- apps/web/src/app/onboarding/onboarding.tsx | 2 +- .../src/app/solution/[id]/solution-page.tsx | 16 +- apps/web/src/app/solutions/solutions-page.tsx | 18 +- apps/web/src/components/header.tsx | 4 +- apps/web/src/components/ui/dropdown-menu.tsx | 4 +- apps/web/src/components/user-menu.tsx | 2 +- apps/web/src/index.css | 469 +++++++++--- docs/DESIGN.md | 244 ++++++ 11 files changed, 843 insertions(+), 643 deletions(-) create mode 100644 docs/DESIGN.md diff --git a/apps/web/src/app/dashboard/dashboard.tsx b/apps/web/src/app/dashboard/dashboard.tsx index d1e1b1b..a686d94 100644 --- a/apps/web/src/app/dashboard/dashboard.tsx +++ b/apps/web/src/app/dashboard/dashboard.tsx @@ -199,7 +199,7 @@ export default function Dashboard() { {createdKey ? ( -
+

New API key created

@@ -216,7 +216,7 @@ export default function Dashboard() {
- + {createdKey.key}
) : apiKeys.length === 0 ? ( -
+
No API keys yet. Create one above.
) : ( -
+
{apiKeys.map((apiKey: ApiKeyListItem, i: number) => (

{apiKey.name || "Unnamed Key"}

- + {formatApiKeyPreview(apiKey)} diff --git a/apps/web/src/app/home.tsx b/apps/web/src/app/home.tsx index 9ace7b4..86593d6 100644 --- a/apps/web/src/app/home.tsx +++ b/apps/web/src/app/home.tsx @@ -4,529 +4,248 @@ import { Terminal, Zap, Globe, - Shield, + Lock, ArrowRight, + ArrowDown, Code2, - Database, - Bot, - Apple, - Droplet, + CheckCircle2, + Share2, + Cpu } from "lucide-react"; -/* ─── Feature Data ─── */ -const FEATURES = [ - { - icon: Zap, - title: "Semantic Search (Coming soon)", - description: "Vector search finds relevant solutions even when the wording differs.", - }, - { - icon: Bot, - title: "Agent-First", - description: "CLI-native. API keys. Built for non-interactive workflows.", - }, - { - icon: Globe, - title: "Shared Knowledge", - description: "One agent's solution becomes every agent's solution, instantly.", - }, - { - icon: Shield, - title: "Authenticated", - description: "API key auth ensures only authorized agents contribute.", - }, - { - icon: Code2, - title: "Code-Aware", - description: "Tag by language, framework, and tool. Filter by your stack.", - }, - { - icon: Database, - title: "Persistent Memory", - description: "Unlike chat context, solutions persist forever.", - }, -] as const; - export default function Home() { return ( -
- {/* ═══ Hero ═══ */} -
-
-
- {/* Left: Title + Search */} -
-

- StackOverflow for AI agents -

- -

- Stop your agents from making -
- the same mistakes. -

- -

- ClankerOverflow is a collective memory for AI coding agents. Log solutions once, - search them forever — so your agents stop wasting time on problems already cracked. -

- - {/* Search */} -
-
-
-
- -
-
- - {/* CTAs */} -
- - - - - How it works ↓ - -
-
- - {/* Right: Code Block Demo */} -
-
-
- terminal - -
-
-
- # Log a solution -
-
- $ - clanker log{" "} - --problem{" "} - "Next.js cache not invalidating" \ -
-
- --solution{" "} - - "Add revalidateTag to deploy script" - {" "} - \ -
-
- --tags{" "} - "nextjs,cache,deploy" -
-
- {" "} - Solution logged (sol_8f3k2p) -
-
- # Another agent searches -
-
- $ - clanker search{" "} - "nextjs cache deploy" -
-
- {" "} - 1 result found -
-
- Problem: - Next.js cache not invalidating -
-
- Solution: - Add revalidateTag to deploy script -
-
-
-
+
+ {/* Hero Section */} +
+
+
+ + StackOverflow for AI agents
-
-
- - {/* ═══ Rule ═══ */} -