"use client"; import { ChevronDown, Clock, CornerDownLeft, Download, Lightbulb, Monitor, Sparkles, } from "lucide-react"; import { AnimatePresence, motion, useReducedMotion } from "motion/react"; import Link from "next/link"; import React, { memo, useCallback, useEffect, useRef, useState } from "react"; import Balancer from "react-wrap-balancer"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Empty, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, } from "@/components/ui/empty"; import { ExpandedMediaOverlay, useExpandedMedia } from "@/components/ui/expanded-gif-overlay"; import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; import { Separator } from "@/components/ui/separator"; import { Skeleton } from "@/components/ui/skeleton"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { GITHUB_RELEASES_URL, getAssetLabel, usePrimaryDownload, } from "@/lib/desktop-download-utils"; import { AUTH_TYPE, BACKEND_URL } from "@/lib/env-config"; import { trackLoginAttempt } from "@/lib/posthog/events"; import { cn } from "@/lib/utils"; const GoogleLogo = ({ className }: { className?: string }) => ( ); type HeroUseCase = { id: string; title: string; description: string; src: string | null; comingSoon?: boolean; examples?: string[]; }; type HeroCategory = { id: string; label: string; desktopOnly?: boolean; useCases: HeroUseCase[]; }; const HERO_TUTORIAL = "/homepage/hero_tutorial"; const HERO_REALTIME = "/homepage/hero_realtime"; const CATEGORIES: HeroCategory[] = [ { id: "desktop", label: "Desktop App", desktopOnly: true, useCases: [ { id: "general", title: "General Assist", description: "Launch SurfSense instantly from any application with a global shortcut.", src: `${HERO_TUTORIAL}/general_assist.mp4`, }, { id: "quick", title: "Quick Assist", description: "Select text anywhere, then ask AI to explain, rewrite, or act on it.", src: `${HERO_TUTORIAL}/quick_assist.mp4`, }, { id: "screenshot", title: "Screenshot Assist", description: "Capture any region of your screen and ask AI about what’s in it.", src: `${HERO_TUTORIAL}/screenshot_assist.mp4`, }, { id: "watch-folder", title: "Watch Local Folder", description: "Auto-sync a local folder to your knowledge base. Great for Obsidian vaults.", src: `${HERO_TUTORIAL}/folder_watch.mp4`, }, ], }, { id: "deliverables", label: "Deliverable Studio", useCases: [ { id: "report", title: "AI Report Generator", description: "Generate cited research reports from your documents, then export to PDF or Markdown.", src: `${HERO_TUTORIAL}/ReportGenGif_compressed.mp4`, }, { id: "podcast", title: "AI Podcast Generator", description: "Turn any document or folder into a two-host AI podcast in under 20 seconds.", src: `${HERO_TUTORIAL}/PodcastGenGif.mp4`, }, { id: "presentation", title: "AI Presentation & Video Maker", description: "Create editable slide decks and narrated video overviews from your sources.", src: `${HERO_TUTORIAL}/video_gen_surf.mp4`, }, { id: "image", title: "AI Image Generator", description: "Generate high-quality images straight from your chats and documents.", src: `${HERO_TUTORIAL}/ImageGenGif.mp4`, }, { id: "resume", title: "AI Resume Builder", description: "Tailor your existing resume to any job description and beat the ATS.", src: null, comingSoon: true, examples: [ "Tailor my resume to this job description so it gets past ATS and lands an interview.", "Optimize my resume for ATS by matching the keywords in this job posting.", "Rewrite my resume bullet points to highlight the skills this role is asking for.", "Compare my resume against this job description and list the gaps to fix.", "Write a matching cover letter from my resume and this job description.", ], }, ], }, { id: "automations", label: "Automations", useCases: [ { id: "schedule", title: "Scheduled AI Workflows", description: "Run an agent on a schedule: daily briefs, weekly digests, recurring reports.", src: null, comingSoon: true, examples: [ "Email me a daily brief of new documents in my knowledge base every morning.", "Generate a weekly status report from my Slack and Gmail every Friday.", "Run a monthly competitor analysis report and save it to my workspace.", "Summarize my GitHub and Linear activity into a daily standup update.", "Create a recurring weekly research report on the topics I track.", ], }, { id: "event", title: "Event-Triggered Automations", description: "Fire an agent the moment a document lands in a folder, then post the result to your tools.", src: null, comingSoon: true, examples: [ "When a PDF lands in my Research folder, generate a cited AI summary.", "When new meeting notes are added, turn them into meeting minutes with action items.", "When an invoice is uploaded, extract the vendor, total, and due date into a table.", "When a contract enters my Legal folder, flag key terms and renewal dates.", "When a resume is added to Candidates, screen it against the job description.", ], }, { id: "chat-built", title: "Chat-Built Automations", description: "Describe an automation in plain English and SurfSense builds it for you.", src: null, comingSoon: true, examples: [ "Build an AI agent that emails me a summary of new Notion pages each morning.", "Create a no-code automation that posts a weekly research digest to Slack.", "Set up an AI note taker that turns new meeting notes into minutes.", "Make a workflow that extracts action items from meeting notes and assigns owners.", "Automate a daily email brief from my Gmail and Google Drive.", ], }, ], }, { id: "search-chat", label: "Search & Chat", useCases: [ { id: "chat-docs", title: "Chat With Your PDFs & Docs", description: "Ask questions across all your files and get answers with inline citations.", src: `${HERO_TUTORIAL}/BQnaGif_compressed.mp4`, }, { id: "search", title: "AI Search With Citations", description: "Hybrid semantic and keyword search across your entire knowledge base.", src: `${HERO_TUTORIAL}/BSNCGif.mp4`, }, { id: "collab", title: "Collaborative AI Chat", description: "Work on AI conversations with your team in real time.", src: `${HERO_REALTIME}/RealTimeChatGif.mp4`, }, { id: "comments", title: "Comments & Mentions", description: "Comment and tag teammates on any AI message.", src: `${HERO_REALTIME}/RealTimeCommentsFlow.mp4`, }, ], }, { id: "connectors", label: "Connectors & Integrations", useCases: [ { id: "connect", title: "Connect & Sync Your Tools", description: "Sync Notion, Slack, Google Drive, Gmail, GitHub, Linear and 25+ sources into one searchable corpus.", src: `${HERO_TUTORIAL}/ConnectorFlowGif.mp4`, }, { id: "upload", title: "Chat With Uploaded Files", description: "Drop in PDFs, Office docs, images and audio. Instantly searchable.", src: `${HERO_TUTORIAL}/DocUploadGif.mp4`, }, { id: "write-back", title: "Connector Write-Back", description: "Let the agent post results back to Notion, Slack, Linear and Drive.", src: null, comingSoon: true, examples: [ "Post this research summary to my Notion workspace.", "Send these meeting action items to our team Slack channel.", "Create a Jira ticket from this bug report.", "Open a Linear issue from this feature request.", "Save this generated report to Google Drive as a doc.", ], }, ], }, ]; export function HeroSection() { return (
A free, open source NotebookLM alternative for teams with no data limits. Use ChatGPT, Claude AI, and any AI model for free.
Try prompts like these today
{useCase.description}