From 2690fe1196bffd6a5951f1869b326c6206e5e91a Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Sun, 31 May 2026 19:22:50 -0700 Subject: [PATCH] feat(pricing): update pricing page and add AI automations details - Revised the pricing page title and description to reflect new features including AI workspace, automations, and agents. - Enhanced the FAQ section with detailed information about AI automations and agents, including scheduling and event-triggered workflows. - Updated demo plans to include features related to AI automations and agents, ensuring clarity on capabilities and costs. - Added a new automation illustration to the homepage features grid, emphasizing the automation capabilities of SurfSense. --- surfsense_web/app/(home)/pricing/page.tsx | 4 +- .../components/assistant-ui/thread.tsx | 11 + .../homepage/features-bento-grid.tsx | 239 ++++++++++++++++++ .../components/homepage/why-surfsense.tsx | 5 + .../new-chat/chat-example-prompts.tsx | 75 ++++++ .../components/pricing/pricing-section.tsx | 33 ++- surfsense_web/components/seo/json-ld.tsx | 3 + surfsense_web/lib/chat/example-prompts.ts | 66 +++++ 8 files changed, 433 insertions(+), 3 deletions(-) create mode 100644 surfsense_web/components/new-chat/chat-example-prompts.tsx create mode 100644 surfsense_web/lib/chat/example-prompts.ts diff --git a/surfsense_web/app/(home)/pricing/page.tsx b/surfsense_web/app/(home)/pricing/page.tsx index b343a3853..5b0f98905 100644 --- a/surfsense_web/app/(home)/pricing/page.tsx +++ b/surfsense_web/app/(home)/pricing/page.tsx @@ -3,9 +3,9 @@ import PricingBasic from "@/components/pricing/pricing-section"; import { BreadcrumbNav } from "@/components/seo/breadcrumb-nav"; export const metadata: Metadata = { - title: "Pricing | SurfSense - Free AI Search Plans", + title: "Pricing | SurfSense - Free AI Workspace, Automations & Agents", description: - "Explore SurfSense plans and pricing. Start free with 500 pages & $5 in premium credits. Use ChatGPT, Claude AI, and premium AI models. Pay as you go at provider cost.", + "Explore SurfSense plans and pricing. Start free with 500 pages & $5 in premium credits. Run AI automations and agents, use ChatGPT, Claude AI, and premium AI models, and pay as you go at provider cost.", alternates: { canonical: "https://www.surfsense.com/pricing", }, diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx index 0336ffd35..5748b441c 100644 --- a/surfsense_web/components/assistant-ui/thread.tsx +++ b/surfsense_web/components/assistant-ui/thread.tsx @@ -67,6 +67,7 @@ import { } from "@/components/assistant-ui/inline-mention-editor"; import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button"; import { UserMessage } from "@/components/assistant-ui/user-message"; +import { ChatExamplePrompts } from "@/components/new-chat/chat-example-prompts"; import { ComposerSuggestionPopoverContent } from "@/components/new-chat/composer-suggestion-popup"; import { PromptPicker, type PromptPickerRef } from "@/components/new-chat/prompt-picker"; import { Avatar, AvatarFallback, AvatarGroup } from "@/components/ui/avatar"; @@ -657,6 +658,15 @@ const Composer: FC = () => { [actionQuery, aui] ); + const handleExampleSelect = useCallback( + (prompt: string) => { + editorRef.current?.setText(prompt); + aui.composer().setText(prompt); + editorRef.current?.focus(); + }, + [aui] + ); + const handleQuickAskSelect = useCallback( (action: { name: string; prompt: string; mode: "transform" | "explore" }) => { if (!clipboardInitialText) return; @@ -916,6 +926,7 @@ const Composer: FC = () => { isThreadEmpty={isThreadEmpty} onVisibleChange={setConnectToolsTrayVisible} /> + {isThreadEmpty && } ); diff --git a/surfsense_web/components/homepage/features-bento-grid.tsx b/surfsense_web/components/homepage/features-bento-grid.tsx index 7406223de..49884bf28 100644 --- a/surfsense_web/components/homepage/features-bento-grid.tsx +++ b/surfsense_web/components/homepage/features-bento-grid.tsx @@ -1,5 +1,6 @@ import { IconBinaryTree, + IconBolt, IconMessage, IconMicrophone, IconSearch, @@ -709,6 +710,236 @@ const AiSortIllustration = () => ( ); +const AutomationIllustration = () => ( +
+ + + AI automation flow illustration showing a trigger starting an AI agent that acts across + connectors + + + {/* Animated flow connectors */} + + + + + + + + + + + + + + {/* Trigger node */} + + + + Trigger + + {/* Schedule chip */} + + + + + + + Cron + + + {/* Event chip */} + + + + + Event + + + + + {/* AI Agent core */} + + + + AI Agent + + {/* Sparkle */} + + + + + + + + + + + {/* Actions across connectors */} + + + + Act on Connectors + + + + + + + + 25+ + + + + + {/* Sparkle accents */} + + + + + + + + + +
+); + const items = [ { title: "Find, Ask, Act", @@ -749,4 +980,12 @@ const items = [ className: "md:col-span-1", icon: , }, + { + title: "Automate Your Workflows", + description: + "Describe an AI agent in plain English and SurfSense builds it. Run it on a schedule or trigger it when a document lands, acting across all your connectors hands-free.", + header: , + className: "md:col-span-3", + icon: , + }, ]; diff --git a/surfsense_web/components/homepage/why-surfsense.tsx b/surfsense_web/components/homepage/why-surfsense.tsx index 8eeaf9874..38f19559b 100644 --- a/surfsense_web/components/homepage/why-surfsense.tsx +++ b/surfsense_web/components/homepage/why-surfsense.tsx @@ -348,6 +348,11 @@ const comparisonRows: { notebookLm: false, surfSense: true, }, + { + feature: "AI Automations & Agents", + notebookLm: false, + surfSense: "Scheduled & event-triggered", + }, { feature: "AI File Sorting", notebookLm: false, diff --git a/surfsense_web/components/new-chat/chat-example-prompts.tsx b/surfsense_web/components/new-chat/chat-example-prompts.tsx new file mode 100644 index 000000000..95d7a0eaa --- /dev/null +++ b/surfsense_web/components/new-chat/chat-example-prompts.tsx @@ -0,0 +1,75 @@ +"use client"; + +import { CornerDownLeft, Lightbulb } from "lucide-react"; +import { memo, useCallback } from "react"; +import { Button } from "@/components/ui/button"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { CHAT_EXAMPLE_CATEGORIES } from "@/lib/chat/example-prompts"; + +interface ChatExamplePromptsProps { + /** Called with the chosen prompt text; the caller prefills the composer. */ + onSelect: (prompt: string) => void; +} + +const ExamplePromptButton = memo(function ExamplePromptButton({ + prompt, + onSelect, +}: { + prompt: string; + onSelect: (prompt: string) => void; +}) { + const handleClick = useCallback(() => onSelect(prompt), [prompt, onSelect]); + + return ( + + ); +}); + +export function ChatExamplePrompts({ onSelect }: ChatExamplePromptsProps) { + return ( +
+
+
+ +
+ + {CHAT_EXAMPLE_CATEGORIES.map((category) => ( + + {category.label} + + ))} + +
+ {CHAT_EXAMPLE_CATEGORIES.map((category) => ( + + +
    + {category.prompts.map((prompt) => ( +
  • + +
  • + ))} +
+
+
+ ))} +
+
+ ); +} diff --git a/surfsense_web/components/pricing/pricing-section.tsx b/surfsense_web/components/pricing/pricing-section.tsx index b2eef2778..46ceee694 100644 --- a/surfsense_web/components/pricing/pricing-section.tsx +++ b/surfsense_web/components/pricing/pricing-section.tsx @@ -4,6 +4,7 @@ import { AnimatePresence, motion } from "motion/react"; import type React from "react"; import { useEffect, useRef, useState } from "react"; import { Pricing } from "@/components/pricing"; +import { FAQJsonLd } from "@/components/seo/json-ld"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; @@ -19,6 +20,8 @@ const demoPlans = [ "500 pages included to start", "$5 in premium credits for paid AI models and premium AI features", "Includes access to OpenAI text, audio and image models", + "AI automations and agents: scheduled and event-triggered workflows", + "Desktop app: Quick, General and Screenshot Assist plus local folder sync", "Realtime Collaborative Group Chats with teammates", "Community support on Discord", ], @@ -37,6 +40,7 @@ const demoPlans = [ "Everything in Free", "Buy 1,000-page packs or $1 in premium credits at $1 each", "Use premium AI models like GPT-5.4, Claude Sonnet 4.6, Gemini 2.5 Pro & 100+ more via OpenRouter", + "Connector write-back to Notion, Slack, Linear & Jira", "Priority support on Discord", ], description: "", @@ -52,6 +56,7 @@ const demoPlans = [ billingText: "", features: [ "Everything in Pay As You Go", + "Custom automation and agent workflows", "On-prem or VPC deployment", "Audit logs and compliance", "SSO, OIDC & SAML", @@ -158,6 +163,31 @@ const faqData: FAQSection[] = [ }, ], }, + { + title: "Automations & Agents", + items: [ + { + question: "What can AI automations and agents do?", + answer: + "AI automations let you run agents on your knowledge base without writing code. You can schedule recurring workflows like daily briefs, weekly status reports, and competitor analysis, or trigger an agent the moment a document lands in a folder. Agents can read across your connected tools, generate summaries and reports, and write results back to Notion, Slack, Linear, and Jira.", + }, + { + question: "Do automations and agents cost extra?", + answer: + "No. There is no separate subscription or add-on fee for automations. Agents use the same page credits and premium credits as the rest of SurfSense. Indexing documents consumes page credits, and premium AI model usage during a workflow consumes premium credits at provider cost. If a workflow only uses free models, it does not touch your premium credits.", + }, + { + question: "How do event-triggered automations work?", + answer: + "Event-triggered automations fire when something happens in your knowledge base, most commonly when a new document enters a folder you are watching. For example, when a PDF lands in your Research folder you can auto-generate a cited summary, or when an invoice is uploaded you can extract the vendor, total, and due date. The agent runs automatically and can post the result to your connected tools.", + }, + { + question: "Can I build an automation without code?", + answer: + "Yes. You can describe the workflow automation you want in plain English in chat, and SurfSense builds the automation for you. For example, ask it to email you a summary of new Notion pages each morning, or post a weekly research digest to Slack, and it sets up the scheduled or event-triggered agent without any code.", + }, + ], + }, { title: "Self-Hosting", items: [ @@ -250,6 +280,7 @@ function PricingFAQ() { return (
+ section.items)} />

Frequently Asked Questions @@ -341,7 +372,7 @@ function PricingBasic() { diff --git a/surfsense_web/components/seo/json-ld.tsx b/surfsense_web/components/seo/json-ld.tsx index 03f3293c3..abfb49f0a 100644 --- a/surfsense_web/components/seo/json-ld.tsx +++ b/surfsense_web/components/seo/json-ld.tsx @@ -77,6 +77,9 @@ export function SoftwareApplicationJsonLd() { "Free access to ChatGPT, Claude AI, and any AI model", "AI-powered semantic search across all connected tools", "Federated search across Slack, Google Drive, Notion, Confluence, GitHub", + "AI automations and agents (scheduled and event-triggered workflows)", + "Connector write-back to Notion, Slack, Linear, Jira", + "Native desktop app with Quick, General, and Screenshot Assist", "No data limits with open source self-hosting", "Real-time collaborative team chats", "Document Q&A with citations", diff --git a/surfsense_web/lib/chat/example-prompts.ts b/surfsense_web/lib/chat/example-prompts.ts new file mode 100644 index 000000000..76b64b2ba --- /dev/null +++ b/surfsense_web/lib/chat/example-prompts.ts @@ -0,0 +1,66 @@ +/** + * Curated example chat prompts shown on the empty new-chat screen. + * + * These mirror the homepage hero's "use case" concept but with runnable chat + * queries, grouped into a few broad categories. Bracketed slots like `[topic]` + * are intentional: clicking a prompt prefills the composer so the user can fill + * them in before sending. + * + * This is a module-scope constant so it is created once, not per render. + */ + +export interface ChatExampleCategory { + /** Stable id used as the Tabs value */ + id: string; + /** Short, human-readable tab label */ + label: string; + /** Runnable example queries for this category */ + prompts: string[]; +} + +export const CHAT_EXAMPLE_CATEGORIES: ChatExampleCategory[] = [ + { + id: "search", + label: "Search & Summarize", + prompts: [ + "Summarize the key points across all the documents in this space.", + "What do my files say about [topic]? Answer with citations.", + "Find every mention of [keyword] and list the sources.", + "Give me a cited briefing on the documents I added this week.", + "Compare these two documents and highlight the differences.", + ], + }, + { + id: "create", + label: "Create", + prompts: [ + "Write a cited research report on [topic] from my documents.", + "Turn this folder into a two-host podcast I can listen to.", + "Create a slide deck and a narrated video overview from these sources.", + "Generate an image to illustrate [concept] for my report.", + "Tailor my resume to this job description so it gets past ATS and lands an interview.", + ], + }, + { + id: "automate", + label: "Automate", + prompts: [ + "Email me a daily brief of new documents in my knowledge base every morning.", + "When a PDF lands in my Research folder, generate a cited AI summary.", + "Generate a weekly status report from my Slack and Gmail every Friday.", + "Build an automation that turns new meeting notes into minutes with action items.", + "Run a monthly competitor analysis report and save it to my workspace.", + ], + }, + { + id: "tools", + label: "Across your tools", + prompts: [ + "Search across my Notion, Slack, Google Drive and Gmail for [topic].", + "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.", + ], + }, +];