Skip to content

AI Assistant

An agent product’s working surface: transcript, reasoning, tool calls and the approval card, with sign-in and settings around it. Wiring a model in is your half.

4 routes4 pages · 14 blocks29 files · 4,161 lineslucide-reactAdded 13 Aug 2026

What's included

  • app/globals.css
  • app/layout.tsx
  • app/login/page.tsx
  • app/not-found.tsx
  • app/page.tsx
  • app/settings/page.tsx
  • and 8 more files
  • 4 pages it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab init ai-assistant ./my-app

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Every screen

Q3 churn review

Started 14 minutes ago · 4 tools used · reading 3 sources

Why did churn spike in Q3?

Thought for 5.1 seconds5 steps
  1. Dropping the largest single cancellation moves the under-20 figure from 6.1% to 5.4%. The pattern holds, so it is a cohort effect and not an outlier.
Answer complete

Churn concentrated in accounts under 20 seats, which lost 6.1% of ARR against 1.4% in the rest of the book 1 — see source 1. The common thread is activation rather than price: teams that never connected a second data source churned at roughly four times the rate of those that did 2 — see source 2. Only 11% of the cancellations cited cost in their exit survey, and most of those had already downgraded once 3 — see source 3.

3 sources

Ask next

Waiting on you

Who should receive the retention offer?

I scored 214 accounts as at-risk for Q4. 38 of them cleared the high-confidence threshold. Sending to the full segment reaches more real churn but also more accounts that were never going to leave.

If you approve

  • Sends from retention@acme.com via the production Postmark key
  • Writes a "save offer sent" activity to each CRM account
  • Cannot be recalled once dispatched
Choose one

This sends real email from a production account.

  • Q3-forecast.xlsx

Enter to send · Shift↵ for a new line

Live components in your current theme — switch routes, or the phone icon to check the mobile layout. Colours are this template’s Orchid palette, which ships in app/globals.css. Purple with the blue taken out of it, on soft corners. Reads as a product that talks back — which is the one thing an assistant has to look like.

Get it

29 files · .zip · nothing to configure · Pro

then

cd ai-assistant
npm install
npm run dev

The archive contains the whole project — routes, blocks, theme tokens, Tailwind and PostCSS config, tsconfig and a .gitignore. One runtime dependency, and no Hoverlab dependency at all: it is your code from the moment it unzips.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

Routes

PathPageFile
/AI Assistant Screenapp/page.tsx
/settingsAccount Settingsapp/settings/page.tsx
/loginSign-In Screenapp/login/page.tsx
404404 Pageapp/not-found.tsx

What you get

project root(8 files)

  • GETTING-STARTED.md
  • gitignore
  • next.config.ts
  • package.json
  • postcss.config.mjs
  • README.md
  • tailwind.config.ts
  • tsconfig.json

app/(6 files)

  • globals.css
  • layout.tsx
  • login/page.tsx
  • not-found.tsx
  • page.tsx
  • settings/page.tsx

components/(15 files)

  • agent-thinking-trace.tsx
  • ai-insight-cards.tsx
  • approval-request-card.tsx
  • auth-login-card.tsx
  • chat-prompt-bar.tsx
  • chat-streaming-answer.tsx
  • dashboard-shell.tsx
  • knowledge-source-picker.tsx
  • not-found-404.tsx
  • settings-api-keys.tsx
  • settings-danger-zone.tsx
  • settings-nav-layout.tsx
  • settings-profile-form.tsx
  • settings-team-members.tsx
  • theme-provider.tsx

Every file is listed. The 14 files in components/ are the blocks the pages import — each one has its own page if you want to read it on its own.

Project files

Everything except the blocks. Opens on app/globals.css — the file that makes the rest look right, since every block styles itself with bg-card and text-muted-foreground rather than literal colours.

app/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;

/**
 * Design tokens — the Orchid palette.
 *
 * Purple with the blue taken out of it, on soft corners. Reads as a product that talks back — which is the one thing an assistant has to look like.
 *
 * This file is the reason a pasted block looks right. Every block and page
 * styles itself with semantic classes — `bg-card`, `text-muted-foreground`,
 * `border-border` — rather than literal colours, so they inherit whatever
 * you define here instead of fighting it. Change a value below and every
 * section in the project moves with it. Change the hue on `--primary` and
 * `--ring` together and you have rebranded the site.
 *
 * Values are bare HSL channels, not `hsl(...)` calls. That is what lets
 * Tailwind compose them with an alpha suffix: `bg-primary/10` expands to
 * `hsl(var(--primary) / 0.1)`, which is impossible if the variable already
 * carries its own function wrapper.
 *
 * Every foreground/background pair below clears WCAG AA (4.5:1) in both
 * themes. If you retune one, check the pair rather than trusting the eye —
 * mid-lightness accents are the ones that fail.
 */

@layer base {
  :root {
    --background: 287 35% 99%;
    --foreground: 287 35% 10%;
    --card: 0 0% 100%;
    --card-foreground: 287 35% 10%;
    --popover: 0 0% 100%;
    --popover-foreground: 287 35% 10%;
    --primary: 287 62% 42%;
    --primary-foreground: 0 0% 100%;
    --secondary: 287 30% 96%;
    --secondary-foreground: 287 35% 20%;
    --muted: 287 24% 95%;
    --muted-foreground: 287 12% 40%;
    --accent: 262 45% 93%;
    --accent-foreground: 262 45% 20%;
    --destructive: 0 72% 47%;
    --destructive-foreground: 0 0% 100%;
    --border: 287 20% 90%;
    --input: 287 20% 90%;
    --ring: 287 62% 42%;

    --radius: 1rem;
  }

  .dark {
    --background: 287 32% 5%;
    --foreground: 287 15% 97%;
    --card: 287 26% 8%;
    --card-foreground: 287 15% 97%;
    --popover: 287 26% 8%;
    --popover-foreground: 287 15% 97%;
    --primary: 287 75% 68%;
    --primary-foreground: 287 42% 7%;
    --secondary: 287 20% 15%;
    --secondary-foreground: 287 15% 97%;
    --muted: 287 22% 15%;
    --muted-foreground: 287 10% 68%;
    --accent: 262 26% 18%;
    --accent-foreground: 262 45% 88%;
    --destructive: 0 62% 52%;
    --destructive-foreground: 0 0% 100%;
    --border: 287 18% 19%;
    --input: 287 18% 19%;
    --ring: 287 75% 68%;
  }
}

@layer base {
  * {
    @apply border-border;
  }

  body {
    @apply bg-background text-foreground antialiased;
  }

  /**
   * Global motion opt-out.
   *
   * Blocks guard their own animations with Tailwind's `motion-safe:`, but
   * third-party CSS and anything you add later will not. This is the
   * backstop: it neutralises every animation and transition on the page
   * for users who have asked the OS for reduced motion, rather than
   * relying on each author to remember.
   */
  @media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

More Full Product

Pro
Open the full page for this template

SaaS Starter

The signed-in half

The whole thing: marketing site, sign-in, dashboard, customer list, settings and billing. Eight routes, one runtime dependency.

8 routes8 pages30 blocksIris
Pro
Open the full page for this template

Agent Console

The approval queue, with its run trace

The operator’s half of an agent product: the approval queue it opens on, a run trace with tool calls, retries and cost, and the chat surface behind them.

6 routes6 pages20 blocksSlate