diff --git a/Makefile b/Makefile index d26df428e8..45f0963199 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,6 @@ # Directories BACKEND_DIR := apps/backend WEB_DIR := apps/web -LANDING_DIR := apps/landing APPS_DIR := apps # Tools @@ -46,20 +45,18 @@ help: @echo " dev Run backend + web via CLI (auto ports)" @echo " dev-backend Run backend in development mode (port 8080)" @echo " dev-web Run web app in development mode (port 3000)" - @echo " dev-landing Run landing page in development mode (port 3001)" @echo " dev Note: Uses apps/cli launcher (auto ports)" @echo "" @echo "Production Commands:" @echo " start Install deps, build, and start backend + web in production mode" @echo "" @echo "Build Commands:" - @echo " build Build backend, web app, and landing page" + @echo " build Build backend and web app" @echo " build-backend Build backend binary" @echo " build-web Build web app for production" - @echo " build-landing Build landing page for production" @echo "" @echo "Installation:" - @echo " install Install all dependencies (backend + web + landing)" + @echo " install Install all dependencies (backend + web)" @echo " install-backend Install backend dependencies" @echo " install-web Install web dependencies (uses pnpm workspace)" @echo "" @@ -103,17 +100,12 @@ dev-web: @echo "Starting web app on http://localhost:3000" @cd $(APPS_DIR) && $(PNPM) --filter @kandev/web dev -.PHONY: dev-landing -dev-landing: - @echo "Starting landing page on http://localhost:3001" - @cd $(APPS_DIR) && $(PNPM) --filter @kandev/landing dev - # # Build # .PHONY: build -build: build-backend build-web build-landing +build: build-backend build-web @printf "\n$(GREEN)$(BOLD)✓ Build complete!$(RESET)\n" # @@ -153,16 +145,6 @@ build-web-quiet: @printf " $(DIM)Web app$(RESET)\n" @cd $(APPS_DIR) && $(PNPM) --filter @kandev/web build 2>&1 | grep -v "Warning:" | grep -v "parseLineType" | grep -v "^$$" || true -.PHONY: build-landing -build-landing: - @printf "$(CYAN)Building landing page...$(RESET)\n" - @cd $(APPS_DIR) && $(PNPM) --filter @kandev/landing build - -.PHONY: build-landing-quiet -build-landing-quiet: - @printf " $(DIM)Landing page$(RESET)\n" - @cd $(APPS_DIR) && $(PNPM) --filter @kandev/landing build 2>&1 | grep -v "Warning:" | grep -v "parseLineType" | grep -v "^$$" || true - # # Installation # @@ -178,7 +160,7 @@ install-backend: .PHONY: install-web install-web: - @printf "$(CYAN)Installing web and landing dependencies...$(RESET)\n" + @printf "$(CYAN)Installing web dependencies...$(RESET)\n" @cd $(APPS_DIR) && $(PNPM) install --silent 2>/dev/null || cd $(APPS_DIR) && $(PNPM) install # @@ -256,8 +238,8 @@ clean-backend: .PHONY: clean-web clean-web: - @printf "$(CYAN)Cleaning web and landing artifacts...$(RESET)\n" - @rm -rf $(WEB_DIR)/.next $(LANDING_DIR)/.next $(APPS_DIR)/node_modules + @printf "$(CYAN)Cleaning web artifacts...$(RESET)\n" + @rm -rf $(WEB_DIR)/.next $(APPS_DIR)/node_modules @rm -rf $(APPS_DIR)/packages/*/node_modules .PHONY: clean-db diff --git a/apps/landing/app/about/page.tsx b/apps/landing/app/about/page.tsx deleted file mode 100644 index b436f2329d..0000000000 --- a/apps/landing/app/about/page.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@kandev/ui/card'; -import { IconTarget, IconRocket, IconHeartHandshake } from '@tabler/icons-react'; - -const values = [ - { - icon: IconTarget, - title: 'Developer First', - description: 'Built by developers, for developers. We understand your workflow because we live it every day.', - }, - { - icon: IconRocket, - title: 'Ship Fast, Ship Safe', - description: 'Speed without sacrificing security. AI-powered automation with human oversight and approval.', - }, - { - icon: IconHeartHandshake, - title: 'Open & Transparent', - description: 'Open source at heart. We believe in building in public and learning from the community.', - }, -]; - -const timeline = [ - { - year: '2026', - title: 'The Beginning', - description: 'kandev.ai is born from the need to combine visual task management with AI-assisted development.', - }, -]; - -export default function AboutPage() { - return ( -
-
-

About kandev.ai

-

- We're building the future of development workflows. -

-
- -
-

Our Mission

-

- kandev.ai exists to make software development more visual, more collaborative, and more efficient. - We believe that combining Kanban methodology with AI-assisted coding creates a workflow that's - greater than the sum of its parts. -

-

- Traditional development tools force you to context switch between project management, coding, - and deployment. We're building a unified experience where your Kanban board is the control center - for AI agents working in isolated, secure environments. -

-
- -
-

Our Values

-
- {values.map((value) => { - const Icon = value.icon; - return ( - - - - {value.title} - - - {value.description} - - - ); - })} -
-
- -
-

Our Journey

-
- {timeline.map((item) => ( - - -
{item.year}
- {item.title} -
- -

{item.description}

-
-
- ))} -
-
- -
-

Why Kanban + Development + AI?

-

- Kanban boards provide visual clarity. Development tools provide execution. AI provides automation. - Together, they create a workflow where you can see all your work, execute it in parallel, and - automate the routine parts while maintaining full control. -

-

- We're just getting started. As we grow, we'll continue to focus on making development more - intuitive, more powerful, and more enjoyable. -

-
-
- ); -} diff --git a/apps/landing/app/blog/page.tsx b/apps/landing/app/blog/page.tsx deleted file mode 100644 index ef9aecc3fd..0000000000 --- a/apps/landing/app/blog/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { redirect } from 'next/navigation'; - -export default function BlogPage() { - redirect('/changelog'); -} diff --git a/apps/landing/app/changelog/[slug]/page.tsx b/apps/landing/app/changelog/[slug]/page.tsx deleted file mode 100644 index 057c8ce834..0000000000 --- a/apps/landing/app/changelog/[slug]/page.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { notFound } from 'next/navigation'; -import { MDXRemote } from 'next-mdx-remote/rsc'; -import { getChangelogEntry, getChangelogSlugs } from '@/lib/changelog'; -import { mdxComponents } from '@/components/mdx-components'; - -function formatDate(date: string) { - if (!date) return ''; - return new Intl.DateTimeFormat('en-US', { - month: 'long', - day: 'numeric', - year: 'numeric', - }).format(new Date(date)); -} - -export async function generateStaticParams() { - const slugs = await getChangelogSlugs(); - return slugs.map((slug) => ({ slug })); -} - -export default async function ChangelogEntryPage({ - params, -}: { - params: { slug?: string } | Promise<{ slug?: string }>; -}) { - const resolvedParams = await Promise.resolve(params); - const slug = resolvedParams.slug; - - if (!slug) { - notFound(); - } - const entry = await getChangelogEntry(slug); - - if (!entry) { - notFound(); - } - - return ( -
-
-
-
-

{entry.surface}

-

{entry.title}

-

{formatDate(entry.date)}

-
- -
- {entry.summary.map((line) => ( -

- {line} -

- ))} -
- -
- -
-
-
- ); -} diff --git a/apps/landing/app/changelog/page.tsx b/apps/landing/app/changelog/page.tsx deleted file mode 100644 index b41513c643..0000000000 --- a/apps/landing/app/changelog/page.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import Link from 'next/link'; -import { getChangelogEntries } from '@/lib/changelog'; - -function formatDate(date: string) { - if (!date) return ''; - return new Intl.DateTimeFormat('en-US', { - month: 'long', - day: 'numeric', - year: 'numeric', - }).format(new Date(date)); -} - -export default async function ChangelogPage() { - const entries = await getChangelogEntries(); - - return ( -
-
-
-
-

Changelog

-

Product updates

-

- A running log of kandev.ai releases, shipped features, and operational improvements. -

-
- -
- {entries.map((entry, index) => ( -
-
-

{entry.surface}

-

{formatDate(entry.date)}

- {index === 0 ? ( - - Latest - - ) : null} -
- -
-

- - {entry.title} - -

-
- {entry.summary.map((line) => ( -

{line}

- ))} -
-
- - Read full update → - -
-
-
- ))} -
-
-
- ); -} diff --git a/apps/landing/app/docs/agents/page.tsx b/apps/landing/app/docs/agents/page.tsx deleted file mode 100644 index 8d02066c1f..0000000000 --- a/apps/landing/app/docs/agents/page.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { DocsShell } from '@/components/docs-shell'; -import { DocsCard } from '@/components/docs-card'; -import { DocsCode } from '@/components/docs-code'; - -export default function AgentsDocsPage() { - return ( - -
- -
    -
  1. Container starts with agentctl on port 9999.
  2. -
  3. Backend calls initialize and session/new.
  4. -
  5. Tasks are sent via session/prompt.
  6. -
  7. Agent streams session/update notifications.
  8. -
-
- -
    -
  • Read and edit files inside the worktree
  • -
  • Run shell commands with approval gates
  • -
  • Stream progress updates to the UI
  • -
-
-
- - - {`{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"1.0"}}`} - -
- ); -} diff --git a/apps/landing/app/docs/boards/page.tsx b/apps/landing/app/docs/boards/page.tsx deleted file mode 100644 index 7e531db73a..0000000000 --- a/apps/landing/app/docs/boards/page.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { DocsShell } from '@/components/docs-shell'; -import { DocsCard } from '@/components/docs-card'; -import { DocsCode } from '@/components/docs-code'; - -const stages = [ - { title: 'Backlog', desc: 'Collect ideas and future work.' }, - { title: 'In Progress', desc: 'Active tasks owned by agents.' }, - { title: 'Review', desc: 'Approvals and QA before merge.' }, - { title: 'Done', desc: 'Completed and shipped items.' }, -]; - -export default function BoardsDocsPage() { - return ( - -
- {stages.map((stage) => ( - -

{stage.desc}

-
- ))} -
- - -

Keep columns minimal and apply WIP limits where review capacity is tight.

- {`board: - name: "Product Roadmap" - columns: - - name: "Backlog" - wipLimit: null - - name: "In Progress" - wipLimit: 4 - - name: "Review" - wipLimit: 2 - - name: "Done" - wipLimit: null`} -
- - -
    -
  • Use a single “Review” column so approvals are centralized.
  • -
  • Keep WIP limits low to prevent agent overload.
  • -
  • Archive finished tasks weekly to keep focus on active work.
  • -
-
-
- ); -} diff --git a/apps/landing/app/docs/docker/page.tsx b/apps/landing/app/docs/docker/page.tsx deleted file mode 100644 index b719665017..0000000000 --- a/apps/landing/app/docs/docker/page.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { DocsShell } from '@/components/docs-shell'; -import { DocsCard } from '@/components/docs-card'; -import { DocsCode } from '@/components/docs-code'; - -export default function DockerDocsPage() { - return ( - -
- -
    -
  • /workspace — your repository worktree
  • -
  • /root/.augment/sessions — agent session storage (when enabled)
  • -
-
- -
    -
  1. Consistent, reproducible environments
  2. -
  3. Security boundaries for file and network access
  4. -
  5. Easy cleanup after task completion
  6. -
-
-
- - - {`docker run -it --rm \ - -v /path/to/repo:/workspace \ - -e TASK_DESCRIPTION="Fix the login bug" \ - kandev/augment-agent:latest`} - -
- ); -} diff --git a/apps/landing/app/docs/installation/page.tsx b/apps/landing/app/docs/installation/page.tsx deleted file mode 100644 index 868bc61c5c..0000000000 --- a/apps/landing/app/docs/installation/page.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { DocsShell } from '@/components/docs-shell'; -import { DocsCard } from '@/components/docs-card'; -import { DocsCode } from '@/components/docs-code'; - -export default function InstallationDocsPage() { - return ( - -
- -
    -
  • Docker Desktop (or Docker Engine)
  • -
  • Git 2.30+
  • -
  • Node.js 20+
  • -
-
- - {`git clone https://github.com/kdlbs/kandev.git -cd kandev -pnpm install`} - -
- - -

Start the backend, app, and landing site in separate terminals.

- {`pnpm --filter @kandev/backend dev -pnpm --filter @kandev/web dev -pnpm --filter @kandev/landing dev`} -
- - -

- Open the UI and create a test workspace. The system should start an agent container on demand and stream - progress back over WebSocket. -

-
-
- ); -} diff --git a/apps/landing/app/docs/layout.tsx b/apps/landing/app/docs/layout.tsx deleted file mode 100644 index c4a742812c..0000000000 --- a/apps/landing/app/docs/layout.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { DocsSidebar } from '@/components/docs-sidebar'; - -export default function DocsLayout({ children }: { children: React.ReactNode }) { - return ( -
-
- -
{children}
-
-
- ); -} diff --git a/apps/landing/app/docs/page.tsx b/apps/landing/app/docs/page.tsx deleted file mode 100644 index fdb06a91ed..0000000000 --- a/apps/landing/app/docs/page.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { DocsShell } from '@/components/docs-shell'; -import { DocsCard } from '@/components/docs-card'; -import { DocsCode } from '@/components/docs-code'; - -export default function DocsPage() { - return ( - -
- -

- kandev.ai is a WebSocket-first platform that pairs Kanban task management with AI-assisted execution. - Every task runs inside a dedicated git worktree and a Docker container, with approvals for sensitive - operations. -

-
- -
    -
  • Ship in parallel without branch conflicts.
  • -
  • Keep execution auditable and reviewable.
  • -
  • Stream progress updates in real time.
  • -
-
-
- - -

From task creation to approval, kandev.ai follows a consistent loop.

- {`1. Create task on the board -2. Start agent container via agentctl -3. Initialize ACP session -4. Stream progress over WebSocket -5. Review and approve output`} -
- -
- -

Group repositories, boards, and team settings.

-
- -

Model your workflow with Kanban columns.

-
- -

Define the scope, constraints, and agent requirements.

-
-
-
- ); -} diff --git a/apps/landing/app/docs/quick-start/page.tsx b/apps/landing/app/docs/quick-start/page.tsx deleted file mode 100644 index bf570d91d4..0000000000 --- a/apps/landing/app/docs/quick-start/page.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { DocsShell } from '@/components/docs-shell'; -import { DocsCard } from '@/components/docs-card'; -import { DocsCode } from '@/components/docs-code'; - -const steps = [ - { - step: '1. Create a workspace', - body: 'Create a workspace for the repository you want to manage.', - }, - { - step: '2. Add a board and task', - body: 'Add a board with columns, then create a task that describes the desired change.', - }, - { - step: '3. Run an agent', - body: 'Start an agent from the task. The UI should stream progress updates as the agent works.', - }, - { - step: '4. Review and merge', - body: 'Review the diff, approve any gated actions, and merge the worktree.', - }, -]; - -export default function QuickStartDocsPage() { - return ( - -
- {steps.map((item) => ( - -

{item.body}

-
- ))} -
- - - {`Task: Update onboarding copy -Constraints: Touch only apps/landing -Acceptance: Copy updated and passes lint`} - -
- ); -} diff --git a/apps/landing/app/docs/tasks/page.tsx b/apps/landing/app/docs/tasks/page.tsx deleted file mode 100644 index 9e9874bdd5..0000000000 --- a/apps/landing/app/docs/tasks/page.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { DocsShell } from '@/components/docs-shell'; -import { DocsCard } from '@/components/docs-card'; -import { DocsCode } from '@/components/docs-code'; - -export default function TasksDocsPage() { - return ( - -
- -
    -
  • Title and description
  • -
  • Priority and due date
  • -
  • Repository and base branch
  • -
  • Agent type and environment
  • -
  • Approval requirements
  • -
-
- -
    -
  1. State the outcome, not the steps.
  2. -
  3. Call out sensitive files or commands.
  4. -
  5. Include acceptance criteria.
  6. -
-
-
- - - {`Title: Add changelog page -Repo: github.com/kdlbs/kandev -Branch: main -Agent: augment-agent -Goal: Replace blog with changelog -Constraints: Keep existing navbar/footer -Output: New route + MDX entries`} - -
- ); -} diff --git a/apps/landing/app/docs/workspaces/page.tsx b/apps/landing/app/docs/workspaces/page.tsx deleted file mode 100644 index 0090bea1d3..0000000000 --- a/apps/landing/app/docs/workspaces/page.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { DocsShell } from '@/components/docs-shell'; -import { DocsCard } from '@/components/docs-card'; -import { DocsCode } from '@/components/docs-code'; - -export default function WorkspacesDocsPage() { - return ( - -
- -
    -
  • Boards that define workflow stages
  • -
  • Repositories connected to those boards
  • -
  • Default agent settings and approvals
  • -
  • Member roles and permissions
  • -
-
- -
    -
  1. Use one workspace per product or client.
  2. -
  3. Keep board naming consistent across teams.
  4. -
  5. Set approvals at the workspace level.
  6. -
-
-
- - -

A workspace keeps everything organized in one place.

- {`Workspace: "Core Platform" -Boards: - - Product Roadmap - - Incident Response -Repositories: - - github.com/kdlbs/kandev - - github.com/kdlbs/kandev-docs`} -
-
- ); -} diff --git a/apps/landing/app/docs/worktrees/page.tsx b/apps/landing/app/docs/worktrees/page.tsx deleted file mode 100644 index 4055eb9972..0000000000 --- a/apps/landing/app/docs/worktrees/page.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { DocsShell } from '@/components/docs-shell'; -import { DocsCard } from '@/components/docs-card'; -import { DocsCode } from '@/components/docs-code'; - -const benefits = [ - { title: 'Parallel tasks', desc: 'Multiple agents can work without branch collisions.' }, - { title: 'Clean diffs', desc: 'Each task produces an isolated patch.' }, - { title: 'Fast setup', desc: 'No extra clones required.' }, -]; - -export default function WorktreesDocsPage() { - return ( - -
- {benefits.map((item) => ( - -

{item.desc}

-
- ))} -
- - - {`/repos/kandev - /main (primary checkout) - /.worktrees/task-123 - /.worktrees/task-124`} - - - -

- When a task is completed and merged, the worktree can be safely removed without affecting the main checkout. -

-
-
- ); -} diff --git a/apps/landing/app/global-error.tsx b/apps/landing/app/global-error.tsx deleted file mode 100644 index 6841c83961..0000000000 --- a/apps/landing/app/global-error.tsx +++ /dev/null @@ -1,62 +0,0 @@ -'use client'; - -export default function GlobalError({ - error, - reset, -}: { - error: Error & { digest?: string }; - reset: () => void; -}) { - return ( - - - Error - kandev.ai - - -
-

- Something went wrong! -

-

- We're sorry, but something unexpected happened. -

- -
- - - ); -} diff --git a/apps/landing/app/globals.css b/apps/landing/app/globals.css deleted file mode 100644 index 2591006301..0000000000 --- a/apps/landing/app/globals.css +++ /dev/null @@ -1,155 +0,0 @@ -@import "tailwindcss"; -@import "tw-animate-css"; -@import "shadcn/tailwind.css"; -@import "@kandev/theme/fonts.css"; - -@source "../components/**/*.{js,ts,jsx,tsx}"; -@source "../../packages/ui/src/**/*.{js,ts,jsx,tsx}"; - -@custom-variant dark (&:is(.dark *)); - -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-sans); - --font-mono: var(--font-geist-mono); - --color-sidebar-ring: var(--sidebar-ring); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar: var(--sidebar); - --color-chart-5: var(--chart-5); - --color-chart-4: var(--chart-4); - --color-chart-3: var(--chart-3); - --color-chart-2: var(--chart-2); - --color-chart-1: var(--chart-1); - --color-ring: var(--ring); - --color-input: var(--input); - --color-border: var(--border); - --color-destructive: var(--destructive); - --color-accent-foreground: var(--accent-foreground); - --color-accent: var(--accent); - --color-muted-foreground: var(--muted-foreground); - --color-muted: var(--muted); - --color-secondary-foreground: var(--secondary-foreground); - --color-secondary: var(--secondary); - --color-primary-foreground: var(--primary-foreground); - --color-primary: var(--primary); - --color-popover-foreground: var(--popover-foreground); - --color-popover: var(--popover); - --color-card-foreground: var(--card-foreground); - --color-card: var(--card); - --radius-sm: var(--radius); - --radius-md: var(--radius); - --radius-lg: var(--radius); - --radius-xl: var(--radius); - --radius-2xl: var(--radius); - --radius-3xl: var(--radius); - --radius-4xl: var(--radius); -} - -:root { - --font-geist-sans: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; - --font-sans: "Figtree", "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", - sans-serif; - --font-geist-mono: "Geist Mono", ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas, - "Liberation Mono", "Courier New", monospace; - --background: oklch(1 0 0); - --foreground: oklch(0.145 0 0); - --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.51 0.23 277); - --primary-foreground: oklch(0.96 0.02 272); - --secondary: oklch(0.967 0.001 286.375); - --secondary-foreground: oklch(0.21 0.006 285.885); - --muted: oklch(0.97 0 0); - --muted-foreground: oklch(0.556 0 0); - --accent: oklch(0.68 0.18 276); - --accent-foreground: oklch(0.98 0 0); - --destructive: oklch(0.58 0.22 27); - --border: oklch(0.922 0 0); - --input: oklch(0.922 0 0); - --ring: oklch(0.708 0 0); - --chart-1: oklch(0.79 0.10 275); - --chart-2: oklch(0.68 0.16 277); - --chart-3: oklch(0.59 0.20 277); - --chart-4: oklch(0.51 0.23 277); - --chart-5: oklch(0.46 0.21 277); - --radius: 0.375rem; - --sidebar: oklch(0.985 0 0); - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.51 0.23 277); - --sidebar-primary-foreground: oklch(0.96 0.02 272); - --sidebar-accent: oklch(0.97 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); -} - -.dark { - --background: oklch(0.145 0 0); - --foreground: oklch(0.985 0 0); - --card: oklch(0.205 0 0); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.205 0 0); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.59 0.20 277); - --primary-foreground: oklch(0.96 0.02 272); - --secondary: oklch(0.274 0.006 286.033); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.269 0 0); - --muted-foreground: oklch(0.708 0 0); - --accent: oklch(0.62 0.18 276); - --accent-foreground: oklch(0.98 0 0); - --destructive: oklch(0.704 0.191 22.216); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); - --ring: oklch(0.556 0 0); - --chart-1: oklch(0.79 0.10 275); - --chart-2: oklch(0.68 0.16 277); - --chart-3: oklch(0.59 0.20 277); - --chart-4: oklch(0.51 0.23 277); - --chart-5: oklch(0.46 0.21 277); - --sidebar: oklch(0.205 0 0); - --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.68 0.16 277); - --sidebar-primary-foreground: oklch(0.96 0.02 272); - --sidebar-accent: oklch(0.269 0 0); - --sidebar-accent-foreground: oklch(0.985 0 0); - --sidebar-border: oklch(1 0 0 / 10%); - --sidebar-ring: oklch(0.556 0 0); -} - -@layer base { - * { - @apply border-border outline-ring/50; - } - html { - scrollbar-gutter: stable; - } - body { - @apply bg-background text-foreground; - } -} - -@layer utilities { - .animate-pulse-slow { - animation: pulse-slow 8s ease-in-out infinite; - } -} - -@keyframes pulse-slow { - 0%, 100% { - transform: scale(1); - opacity: 0.6; - } - 50% { - transform: scale(1.1); - opacity: 0.8; - } -} diff --git a/apps/landing/app/layout.tsx b/apps/landing/app/layout.tsx deleted file mode 100644 index b2ac53504c..0000000000 --- a/apps/landing/app/layout.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type { Metadata } from 'next'; -import './globals.css'; -import { ThemeProvider } from '@/components/theme-provider'; -import { Navbar } from '@/components/navbar'; -import { Footer } from '@/components/footer'; - -export const dynamic = 'force-dynamic'; - -export const metadata: Metadata = { - title: 'kandev.ai - AI-powered Kanban for Developers', - description: 'Kanban meets AI development. Manage tasks with isolated worktrees, Docker containers, and AI agents.', -}; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - - -
- {children} -
-