diff --git a/README.es.md b/README.es.md
index dea86a793..ea7623617 100644
--- a/README.es.md
+++ b/README.es.md
@@ -41,6 +41,7 @@ NotebookLM es una de las mejores y más útiles plataformas de IA que existen, p
- **Sin Dependencia de Proveedores** - Configura cualquier modelo LLM, de imagen, TTS y STT.
- **25+ Fuentes de Datos Externas** - Agrega tus fuentes desde Google Drive, OneDrive, Dropbox, Notion y muchos otros servicios externos.
- **Soporte Multijugador en Tiempo Real** - Trabaja fácilmente con los miembros de tu equipo en un notebook compartido.
+- **Automatizaciones y Agentes de IA** - Ejecuta agentes de IA según una programación o actívalos en el momento en que un documento llega a una carpeta, y luego escribe los resultados de vuelta en Notion, Slack, Linear y Drive. Crea automatizaciones sin código solo describiéndolas en el chat.
- **Aplicación de Escritorio** - Obtén asistencia de IA en cualquier aplicación con Quick Assist, General Assist, Screenshot Assist y sincronización de carpetas locales.
...y más por venir.
@@ -76,48 +77,118 @@ https://github.com/user-attachments/assets/a0a16566-6967-4374-ac51-9b3e07fbecd7
4. Una vez que todo esté indexado, pregunta lo que quieras (Casos de uso):
- - Aplicación de Escritorio — General Assist
+ **Aplicación de Escritorio** (extras nativos, además de todo lo de abajo, no un conjunto aparte)
+
+ - General Assist: abre SurfSense al instante desde cualquier aplicación con un atajo global.
- - Aplicación de Escritorio — Quick Assist
+ - Quick Assist: selecciona texto en cualquier lugar y pide a la IA que lo explique, reescriba o actúe sobre él.
- - Aplicación de Escritorio — Screenshot Assist
+ - Screenshot Assist: captura cualquier región de tu pantalla y pregunta a la IA sobre lo que contiene.
- - Aplicación de Escritorio — Watch Local Folder
+ - Watch Local Folder: sincroniza automáticamente una carpeta local con tu base de conocimiento. Ideal para bóvedas de Obsidian.
- - Generación de videos
+ **Estudio de Entregables**
-
+ - AI Report Generator: genera informes de investigación con citas y expórtalos a PDF, DOCX, HTML, LaTeX, EPUB, ODT o texto plano.
- - Búsqueda básica y citaciones
+
-
+ - AI Podcast Generator: convierte cualquier documento o carpeta en un pódcast de IA con dos presentadores en menos de 20 segundos.
- - QNA con mención de documentos
+
-
-
+ - AI Presentation & Video Maker: crea presentaciones editables y videos narrados a partir de tus fuentes.
- - Generación de informes y exportaciones (PDF, DOCX, HTML, LaTeX, EPUB, ODT, texto plano)
+
-
+ - AI Image Generator: genera imágenes de alta calidad directamente desde tus chats y documentos.
- - Generación de podcasts
+
-
+ - AI Resume Builder: adapta tu currículum existente a cualquier descripción de empleo y supera el ATS.
+ Prueba indicaciones como estas:
- - Generación de imágenes
+ - "Adapta mi currículum a esta descripción de empleo para superar el ATS y conseguir una entrevista."
+ - "Optimiza mi currículum para ATS haciendo coincidir las palabras clave de esta oferta."
+ - "Reescribe los puntos de mi currículum para resaltar las habilidades que pide este puesto."
+ - "Compara mi currículum con esta descripción de empleo y enumera las carencias a corregir."
+ - "Escribe una carta de presentación a juego con mi currículum y esta descripción de empleo."
-
+ **Búsqueda y Chat**
- - Y más próximamente.
+ - Chat With Your PDFs & Docs: haz preguntas sobre todos tus archivos y obtén respuestas con citas en línea.
+
+
+
+ - AI Search With Citations: búsqueda híbrida semántica y por palabras clave en toda tu base de conocimiento.
+
+
+
+ - Collaborative AI Chat: trabaja en conversaciones de IA con tu equipo en tiempo real.
+
+
+
+ - Comments & Mentions: comenta y menciona a tus compañeros en cualquier mensaje de IA.
+
+
+
+ **Conectores e Integraciones**
+
+ - Connect & Sync Your Tools: sincroniza Notion, Slack, Google Drive, Gmail, GitHub, Linear y más de 25 fuentes en un único corpus consultable.
+
+
+
+ - Chat With Uploaded Files: sube PDFs, documentos de Office, imágenes y audio. Consultables al instante.
+
+
+
+ - Connector Write-Back: deja que el agente publique los resultados de vuelta en Notion, Slack, Linear y Drive.
+ Prueba indicaciones como estas:
+
+ - "Publica este resumen de investigación en mi espacio de Notion."
+ - "Envía estos elementos de acción de la reunión a nuestro canal de Slack."
+ - "Crea un ticket de Jira a partir de este informe de error."
+ - "Abre una incidencia en Linear a partir de esta solicitud de función."
+ - "Guarda este informe generado en Google Drive como un documento."
+
+ - Obsidian & Knowledge Base Sync: mantén tu bóveda de Obsidian y tu base de conocimiento personal sincronizadas.
+
+ **Automatizaciones**
+
+ - Scheduled AI Workflows: ejecuta un agente según una programación: resúmenes diarios, boletines semanales, informes recurrentes.
+ Prueba indicaciones como estas:
+
+ - "Envíame cada mañana un resumen diario de los nuevos documentos en mi base de conocimiento."
+ - "Genera un informe de estado semanal a partir de mi Slack y Gmail cada viernes."
+ - "Ejecuta un informe mensual de análisis de la competencia y guárdalo en mi espacio de trabajo."
+ - "Resume mi actividad de GitHub y Linear en una actualización diaria de standup."
+ - "Crea un informe de investigación semanal recurrente sobre los temas que sigo."
+
+ - Event-Triggered Automations: lanza un agente en el momento en que un documento llega a una carpeta y publica el resultado en tus herramientas.
+ Prueba indicaciones como estas:
+
+ - "Cuando llegue un PDF a mi carpeta de Investigación, genera un resumen de IA con citas."
+ - "Cuando se añadan nuevas notas de reunión, conviértelas en actas con elementos de acción."
+ - "Cuando se suba una factura, extrae el proveedor, el total y la fecha de vencimiento en una tabla."
+ - "Cuando entre un contrato en mi carpeta Legal, señala los términos clave y las fechas de renovación."
+ - "Cuando se añada un currículum a Candidatos, evalúalo frente a la descripción del empleo."
+
+ - Chat-Built Automations: describe una automatización en lenguaje sencillo y SurfSense la crea por ti.
+ Prueba indicaciones como estas:
+
+ - "Crea un agente de IA que me envíe cada mañana un resumen de las nuevas páginas de Notion."
+ - "Crea una automatización sin código que publique un resumen de investigación semanal en Slack."
+ - "Configura un tomador de notas con IA que convierta las nuevas notas de reunión en actas."
+ - "Crea un flujo que extraiga los elementos de acción de las notas de reunión y asigne responsables."
+ - "Automatiza un resumen diario por correo a partir de mi Gmail y Google Drive."
### Auto-Hospedado
@@ -199,6 +270,7 @@ Todas las funciones operan contra tu espacio de búsqueda elegido, por lo que tu
| **Generación de Videos** | Resúmenes en video cinemáticos vía Veo 3 (solo Ultra) | Disponible (NotebookLM es mejor aquí, mejorando activamente) |
| **Generación de Presentaciones** | Diapositivas más atractivas pero no editables | Crea presentaciones editables basadas en diapositivas |
| **Generación de Podcasts** | Resúmenes de audio con hosts e idiomas personalizables | Disponible con múltiples proveedores TTS (NotebookLM es mejor aquí, mejorando activamente) |
+| **Automatizaciones y Agentes de IA** | No | Flujos de trabajo de IA programados, disparadores por eventos en documentos nuevos y automatizaciones sin código creadas por chat con escritura de vuelta a Notion, Slack, Linear y Jira |
| **Aplicación de Escritorio** | No | Aplicación nativa con General Assist, Quick Assist, Screenshot Assist y sincronización de carpetas locales |
| **Extensión de Navegador** | No | Extensión multi-navegador para guardar cualquier página web, incluyendo páginas protegidas por autenticación |
diff --git a/README.hi.md b/README.hi.md
index 43e24c3ee..10b246385 100644
--- a/README.hi.md
+++ b/README.hi.md
@@ -41,6 +41,7 @@ NotebookLM वहाँ उपलब्ध सबसे अच्छे और
- **कोई विक्रेता लॉक-इन नहीं** - किसी भी LLM, इमेज, TTS और STT मॉडल को कॉन्फ़िगर करें।
- **25+ बाहरी डेटा स्रोत** - Google Drive, OneDrive, Dropbox, Notion और कई अन्य बाहरी सेवाओं से अपने स्रोत जोड़ें।
- **रीयल-टाइम मल्टीप्लेयर सपोर्ट** - एक साझा notebook में अपनी टीम के सदस्यों के साथ आसानी से काम करें।
+- **AI ऑटोमेशन और एजेंट** - AI एजेंट को शेड्यूल पर चलाएं या जैसे ही कोई दस्तावेज़ किसी फ़ोल्डर में आए उसे ट्रिगर करें, फिर परिणाम वापस Notion, Slack, Linear और Drive में लिखें। चैट में बस वर्णन करके बिना-कोड ऑटोमेशन बनाएं।
- **डेस्कटॉप ऐप** - Quick Assist, General Assist, Screenshot Assist और लोकल फ़ोल्डर सिंक के साथ किसी भी एप्लिकेशन में AI सहायता प्राप्त करें।
...और भी बहुत कुछ आने वाला है।
@@ -76,48 +77,118 @@ https://github.com/user-attachments/assets/a0a16566-6967-4374-ac51-9b3e07fbecd7
4. सब कुछ इंडेक्स हो जाने के बाद, कुछ भी पूछें (उपयोग के मामले):
- - डेस्कटॉप ऐप — General Assist
+ **डेस्कटॉप ऐप** (नीचे दी गई सभी सुविधाओं के अलावा नेटिव एक्स्ट्रा, कोई अलग सेट नहीं)
+
+ - General Assist: किसी भी ऐप्लिकेशन से ग्लोबल शॉर्टकट के ज़रिए SurfSense तुरंत खोलें।
- - डेस्कटॉप ऐप — Quick Assist
+ - Quick Assist: कहीं भी टेक्स्ट चुनें और AI से उसे समझाने, दोबारा लिखने या उस पर कार्रवाई करने को कहें।
- - डेस्कटॉप ऐप — Screenshot Assist
+ - Screenshot Assist: अपनी स्क्रीन का कोई भी हिस्सा कैप्चर करें और AI से उसमें मौजूद चीज़ों के बारे में पूछें।
- - डेस्कटॉप ऐप — Watch Local Folder
+ - Watch Local Folder: किसी लोकल फ़ोल्डर को अपने नॉलेज बेस के साथ अपने-आप सिंक करें। Obsidian vaults के लिए बढ़िया।
- - वीडियो जनरेशन
+ **डिलीवरेबल स्टूडियो**
-
+ - AI Report Generator: उद्धरण सहित रिसर्च रिपोर्ट बनाएं और PDF, DOCX, HTML, LaTeX, EPUB, ODT या सादे टेक्स्ट में एक्सपोर्ट करें।
- - बेसिक सर्च और उद्धरण
+
-
+ - AI Podcast Generator: किसी भी दस्तावेज़ या फ़ोल्डर को 20 सेकंड से भी कम में दो-होस्ट वाले AI पॉडकास्ट में बदलें।
- - दस्तावेज़ मेंशन QNA
+
-
-
+ - AI Presentation & Video Maker: अपने स्रोतों से एडिट करने योग्य स्लाइड डेक और नैरेटेड वीडियो बनाएं।
- - रिपोर्ट जनरेशन और एक्सपोर्ट (PDF, DOCX, HTML, LaTeX, EPUB, ODT, सादा टेक्स्ट)
+
-
+ - AI Image Generator: अपनी चैट और दस्तावेज़ों से सीधे उच्च-गुणवत्ता वाली इमेज बनाएं।
- - पॉडकास्ट जनरेशन
+
-
+ - AI Resume Builder: अपने मौजूदा रिज़्यूमे को किसी भी जॉब डिस्क्रिप्शन के अनुसार ढालें और ATS को पार करें।
+ इस तरह के प्रॉम्प्ट आज़माएं:
- - इमेज जनरेशन
+ - "मेरे रिज़्यूमे को इस जॉब डिस्क्रिप्शन के अनुसार ढालें ताकि वह ATS पार करे और इंटरव्यू दिलाए।"
+ - "इस जॉब पोस्टिंग के कीवर्ड्स से मिलान करके मेरे रिज़्यूमे को ATS के लिए ऑप्टिमाइज़ करें।"
+ - "इस भूमिका के लिए ज़रूरी स्किल्स को उभारने के लिए मेरे रिज़्यूमे के बुलेट पॉइंट फिर से लिखें।"
+ - "मेरे रिज़्यूमे की तुलना इस जॉब डिस्क्रिप्शन से करें और सुधारने योग्य कमियों की सूची दें।"
+ - "मेरे रिज़्यूमे और इस जॉब डिस्क्रिप्शन से मेल खाता एक कवर लेटर लिखें।"
-
+ **सर्च और चैट**
- - और भी बहुत कुछ जल्द आ रहा है।
+ - Chat With Your PDFs & Docs: अपनी सभी फ़ाइलों पर सवाल पूछें और इनलाइन उद्धरणों के साथ जवाब पाएं।
+
+
+
+ - AI Search With Citations: अपने पूरे नॉलेज बेस में हाइब्रिड सेमांटिक और कीवर्ड सर्च।
+
+
+
+ - Collaborative AI Chat: अपनी टीम के साथ रियल टाइम में AI बातचीत पर काम करें।
+
+
+
+ - Comments & Mentions: किसी भी AI संदेश पर टिप्पणी करें और टीम के साथियों को टैग करें।
+
+
+
+ **कनेक्टर्स और इंटीग्रेशन**
+
+ - Connect & Sync Your Tools: Notion, Slack, Google Drive, Gmail, GitHub, Linear और 25+ स्रोतों को एक खोजने योग्य कॉर्पस में सिंक करें।
+
+
+
+ - Chat With Uploaded Files: PDF, Office दस्तावेज़, इमेज और ऑडियो अपलोड करें। तुरंत खोजने योग्य।
+
+
+
+ - Connector Write-Back: एजेंट को परिणाम वापस Notion, Slack, Linear और Drive में पोस्ट करने दें।
+ इस तरह के प्रॉम्प्ट आज़माएं:
+
+ - "इस रिसर्च सारांश को मेरे Notion वर्कस्पेस में पोस्ट करें।"
+ - "इन मीटिंग एक्शन आइटम्स को हमारे टीम Slack चैनल पर भेजें।"
+ - "इस बग रिपोर्ट से एक Jira टिकट बनाएं।"
+ - "इस फ़ीचर अनुरोध से Linear में एक इश्यू खोलें।"
+ - "इस जनरेट की गई रिपोर्ट को Google Drive में एक डॉक के रूप में सेव करें।"
+
+ - Obsidian & Knowledge Base Sync: अपने Obsidian vault और व्यक्तिगत नॉलेज बेस को सिंक रखें।
+
+ **ऑटोमेशन**
+
+ - Scheduled AI Workflows: किसी एजेंट को शेड्यूल पर चलाएं: रोज़ाना ब्रीफ़, साप्ताहिक डाइजेस्ट, आवर्ती रिपोर्ट।
+ इस तरह के प्रॉम्प्ट आज़माएं:
+
+ - "हर सुबह मेरे नॉलेज बेस में जुड़े नए दस्तावेज़ों का रोज़ाना ब्रीफ़ मुझे ईमेल करें।"
+ - "हर शुक्रवार मेरे Slack और Gmail से एक साप्ताहिक स्टेटस रिपोर्ट बनाएं।"
+ - "एक मासिक प्रतिस्पर्धी विश्लेषण रिपोर्ट चलाएं और उसे मेरे वर्कस्पेस में सेव करें।"
+ - "मेरी GitHub और Linear गतिविधि को एक रोज़ाना standup अपडेट में सारांशित करें।"
+ - "मैं जिन विषयों को ट्रैक करता हूं उन पर एक आवर्ती साप्ताहिक रिसर्च रिपोर्ट बनाएं।"
+
+ - Event-Triggered Automations: जैसे ही कोई दस्तावेज़ किसी फ़ोल्डर में आता है, एजेंट को चलाएं और परिणाम अपने टूल में पोस्ट करें।
+ इस तरह के प्रॉम्प्ट आज़माएं:
+
+ - "जब मेरे Research फ़ोल्डर में कोई PDF आए, तो उद्धरण सहित एक AI सारांश बनाएं।"
+ - "जब नई मीटिंग नोट्स जुड़ें, तो उन्हें एक्शन आइटम्स के साथ मीटिंग मिनट्स में बदलें।"
+ - "जब कोई इनवॉइस अपलोड हो, तो विक्रेता, कुल राशि और देय तिथि को एक तालिका में निकालें।"
+ - "जब मेरे Legal फ़ोल्डर में कोई अनुबंध आए, तो मुख्य शर्तों और नवीनीकरण तिथियों को चिह्नित करें।"
+ - "जब Candidates में कोई रिज़्यूमे जुड़े, तो उसे जॉब डिस्क्रिप्शन के विरुद्ध स्क्रीन करें।"
+
+ - Chat-Built Automations: सरल भाषा में किसी ऑटोमेशन का वर्णन करें और SurfSense उसे आपके लिए बना देगा।
+ इस तरह के प्रॉम्प्ट आज़माएं:
+
+ - "एक AI एजेंट बनाएं जो हर सुबह नई Notion पेजों का सारांश मुझे ईमेल करे।"
+ - "एक नो-कोड ऑटोमेशन बनाएं जो हर सप्ताह एक रिसर्च डाइजेस्ट Slack पर पोस्ट करे।"
+ - "एक AI नोट-टेकर सेट करें जो नई मीटिंग नोट्स को मिनट्स में बदल दे।"
+ - "एक वर्कफ़्लो बनाएं जो मीटिंग नोट्स से एक्शन आइटम्स निकाले और ज़िम्मेदार सौंपे।"
+ - "मेरे Gmail और Google Drive से एक रोज़ाना ईमेल ब्रीफ़ को ऑटोमेट करें।"
### सेल्फ-होस्टेड
@@ -199,6 +270,7 @@ SurfSense एक डेस्कटॉप ऐप भी प्रदान क
| **वीडियो जनरेशन** | Veo 3 के माध्यम से सिनेमैटिक वीडियो ओवरव्यू (केवल Ultra) | उपलब्ध (NotebookLM यहाँ बेहतर है, सक्रिय रूप से सुधार हो रहा है) |
| **प्रेजेंटेशन जनरेशन** | बेहतर दिखने वाली स्लाइड्स लेकिन संपादन योग्य नहीं | संपादन योग्य, स्लाइड आधारित प्रेजेंटेशन बनाएं |
| **पॉडकास्ट जनरेशन** | कस्टमाइज़ेबल होस्ट और भाषाओं के साथ ऑडियो ओवरव्यू | कई TTS प्रदाताओं के साथ उपलब्ध (NotebookLM यहाँ बेहतर है, सक्रिय रूप से सुधार हो रहा है) |
+| **AI ऑटोमेशन और एजेंट** | नहीं | शेड्यूल किए गए AI वर्कफ़्लो, नए दस्तावेज़ों पर इवेंट ट्रिगर, और चैट से बने बिना-कोड ऑटोमेशन, Notion, Slack, Linear और Jira में कनेक्टर राइट-बैक के साथ |
| **डेस्कटॉप ऐप** | नहीं | General Assist, Quick Assist, Screenshot Assist और लोकल फ़ोल्डर सिंक के साथ नेटिव ऐप |
| **ब्राउज़र एक्सटेंशन** | नहीं | किसी भी वेबपेज को सहेजने के लिए क्रॉस-ब्राउज़र एक्सटेंशन, प्रमाणीकरण सुरक्षित पेज सहित |
diff --git a/README.md b/README.md
index ab9f9e221..a75122892 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,7 @@ NotebookLM is one of the best and most useful AI platforms out there, but once y
- **25+ External Data Sources** - Add your sources from Google Drive, OneDrive, Dropbox, Notion, and many other external services.
- **Real-Time Multiplayer Support** - Work easily with your team members in a shared notebook.
- **AI File Sorting** - Automatically organize your documents into a smart folder hierarchy using AI-powered categorization by source, date, and topic.
+- **AI Automations & Agents** - Run AI agents on a schedule or trigger them the moment a document lands in a folder, then write results back to Notion, Slack, Linear, and Drive. Build no-code automations just by describing them in chat.
- **Desktop App** - Get AI assistance in any application with Quick Assist, General Assist, Screenshot Assist, and local folder sync.
...and more to come.
@@ -77,48 +78,118 @@ https://github.com/user-attachments/assets/a0a16566-6967-4374-ac51-9b3e07fbecd7
4. Once everything is indexed, Ask Away (Use Cases):
- - Desktop App — General Assist
+ **Desktop App** (native extras on top of everything below, not a separate feature set)
+
+ - General Assist: launch SurfSense instantly from any application with a global shortcut.
- - Desktop App — Quick Assist
+ - Quick Assist: select text anywhere, then ask AI to explain, rewrite, or act on it.
- - Desktop App — Screenshot Assist
+ - Screenshot Assist: capture any region of your screen and ask AI about what's in it.
- - Desktop App — Watch Local Folder
+ - Watch Local Folder: auto-sync a local folder to your knowledge base. Great for Obsidian vaults.
- - Video Generation
+ **Deliverable Studio**
-
+ - AI Report Generator: generate cited research reports and export to PDF, DOCX, HTML, LaTeX, EPUB, ODT, or plain text.
- - Basic search and citation
+
-
+ - AI Podcast Generator: turn any document or folder into a two-host AI podcast in under 20 seconds.
- - Document Mention QNA
+
-
-
+ - AI Presentation & Video Maker: create editable slide decks and narrated video overviews from your sources.
- - Report Generations and Exports (PDF, DOCX, HTML, LaTeX, EPUB, ODT, Plain Text)
+
-
+ - AI Image Generator: generate high-quality images straight from your chats and documents.
- - Podcast Generations
+
-
+ - AI Resume Builder: tailor your existing resume to any job description and beat the ATS.
+ Try prompts like these:
- - Image Generations
+ - "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."
-
+ **Search & Chat**
- - And more coming soon.
+ - Chat With Your PDFs & Docs: ask questions across all your files and get answers with inline citations.
+
+
+
+ - AI Search With Citations: hybrid semantic and keyword search across your entire knowledge base.
+
+
+
+ - Collaborative AI Chat: work on AI conversations with your team in real time.
+
+
+
+ - Comments & Mentions: comment and tag teammates on any AI message.
+
+
+
+ **Connectors & Integrations**
+
+ - Connect & Sync Your Tools: sync Notion, Slack, Google Drive, Gmail, GitHub, Linear and 25+ sources into one searchable corpus.
+
+
+
+ - Chat With Uploaded Files: drop in PDFs, Office docs, images and audio. Instantly searchable.
+
+
+
+ - Connector Write-Back: let the agent post results back to Notion, Slack, Linear and Drive.
+ Try prompts like these:
+
+ - "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."
+
+ - Obsidian & Knowledge Base Sync: keep your Obsidian vault and personal knowledge base in sync.
+
+ **Automations**
+
+ - Scheduled AI Workflows: run an agent on a schedule: daily briefs, weekly digests, recurring reports.
+ Try prompts like these:
+
+ - "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."
+
+ - Event-Triggered Automations: fire an agent the moment a document lands in a folder, then post the result to your tools.
+ Try prompts like these:
+
+ - "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."
+
+ - Chat-Built Automations: describe an automation in plain English and SurfSense builds it for you.
+ Try prompts like these:
+
+ - "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."
### Self Hosted
@@ -201,6 +272,7 @@ All features operate against your chosen search space, so your answers are alway
| **Presentation Generation** | Better looking slides but not editable | Create editable, slide-based presentations |
| **Podcast Generation** | Audio Overviews with customizable hosts and languages | Available with multiple TTS providers (NotebookLM is better here, actively improving) |
| **AI File Sorting** | No | LLM-powered auto-categorization into source, date, category, and subcategory folders |
+| **AI Automations & Agents** | No | Scheduled AI workflows, event triggers on new documents, and chat-built no-code automations with connector write-back to Notion, Slack, Linear & Jira |
| **Desktop App** | No | Native app with General Assist, Quick Assist, Screenshot Assist, and local folder sync |
| **Browser Extension** | No | Cross-browser extension to save any webpage, including auth-protected pages |
diff --git a/README.pt-BR.md b/README.pt-BR.md
index fcb004cd6..db77e5132 100644
--- a/README.pt-BR.md
+++ b/README.pt-BR.md
@@ -41,6 +41,7 @@ O NotebookLM é uma das melhores e mais úteis plataformas de IA disponíveis, m
- **Sem Dependência de Fornecedor** - Configure qualquer modelo LLM, de imagem, TTS e STT.
- **25+ Fontes de Dados Externas** - Adicione suas fontes do Google Drive, OneDrive, Dropbox, Notion e muitos outros serviços externos.
- **Suporte Multiplayer em Tempo Real** - Trabalhe facilmente com os membros da sua equipe em um notebook compartilhado.
+- **Automações e Agentes de IA** - Execute agentes de IA em uma programação ou dispare-os no momento em que um documento chega a uma pasta, e escreva os resultados de volta no Notion, Slack, Linear e Drive. Crie automações sem código apenas descrevendo-as no chat.
- **Aplicativo Desktop** - Obtenha assistência de IA em qualquer aplicativo com Quick Assist, General Assist, Screenshot Assist e sincronização de pastas locais.
...e mais por vir.
@@ -76,48 +77,118 @@ https://github.com/user-attachments/assets/a0a16566-6967-4374-ac51-9b3e07fbecd7
4. Quando tudo estiver indexado, pergunte o que quiser (Casos de uso):
- - Aplicativo Desktop — General Assist
+ **Aplicativo Desktop** (extras nativos, além de tudo o que está abaixo, não um conjunto separado)
+
+ - General Assist: abra o SurfSense instantaneamente de qualquer aplicativo com um atalho global.
- - Aplicativo Desktop — Quick Assist
+ - Quick Assist: selecione um texto em qualquer lugar e peça à IA para explicar, reescrever ou agir sobre ele.
- - Aplicativo Desktop — Screenshot Assist
+ - Screenshot Assist: capture qualquer região da tela e pergunte à IA sobre o que está nela.
- - Aplicativo Desktop — Watch Local Folder
+ - Watch Local Folder: sincronize automaticamente uma pasta local com sua base de conhecimento. Ótimo para cofres do Obsidian.
- - Geração de vídeos
+ **Estúdio de Entregáveis**
-
+ - AI Report Generator: gere relatórios de pesquisa com citações e exporte para PDF, DOCX, HTML, LaTeX, EPUB, ODT ou texto simples.
- - Busca básica e citações
+
-
+ - AI Podcast Generator: transforme qualquer documento ou pasta em um podcast de IA com dois apresentadores em menos de 20 segundos.
- - QNA com menção de documentos
+
-
-
+ - AI Presentation & Video Maker: crie apresentações editáveis e vídeos narrados a partir das suas fontes.
- - Geração de relatórios e exportações (PDF, DOCX, HTML, LaTeX, EPUB, ODT, texto simples)
+
-
+ - AI Image Generator: gere imagens de alta qualidade diretamente das suas conversas e documentos.
- - Geração de podcasts
+
-
+ - AI Resume Builder: adapte seu currículo atual a qualquer descrição de vaga e supere o ATS.
+ Experimente prompts como estes:
- - Geração de imagens
+ - "Adapte meu currículo a esta descrição de vaga para passar pelo ATS e conseguir uma entrevista."
+ - "Otimize meu currículo para o ATS combinando as palavras-chave desta vaga."
+ - "Reescreva os tópicos do meu currículo para destacar as habilidades que esta vaga exige."
+ - "Compare meu currículo com esta descrição de vaga e liste as lacunas a corrigir."
+ - "Escreva uma carta de apresentação combinando com meu currículo e esta descrição de vaga."
-
+ **Busca e Chat**
- - E mais em breve.
+ - Chat With Your PDFs & Docs: faça perguntas sobre todos os seus arquivos e receba respostas com citações inline.
+
+
+
+ - AI Search With Citations: busca híbrida semântica e por palavra-chave em toda a sua base de conhecimento.
+
+
+
+ - Collaborative AI Chat: trabalhe em conversas de IA com sua equipe em tempo real.
+
+
+
+ - Comments & Mentions: comente e marque colegas em qualquer mensagem de IA.
+
+
+
+ **Conectores e Integrações**
+
+ - Connect & Sync Your Tools: sincronize Notion, Slack, Google Drive, Gmail, GitHub, Linear e mais de 25 fontes em um único acervo pesquisável.
+
+
+
+ - Chat With Uploaded Files: envie PDFs, documentos do Office, imagens e áudio. Pesquisáveis instantaneamente.
+
+
+
+ - Connector Write-Back: deixe o agente publicar os resultados de volta no Notion, Slack, Linear e Drive.
+ Experimente prompts como estes:
+
+ - "Publique este resumo de pesquisa no meu espaço do Notion."
+ - "Envie estes itens de ação da reunião para o nosso canal do Slack."
+ - "Crie um ticket no Jira a partir deste relatório de bug."
+ - "Abra uma issue no Linear a partir desta solicitação de funcionalidade."
+ - "Salve este relatório gerado no Google Drive como um documento."
+
+ - Obsidian & Knowledge Base Sync: mantenha seu cofre do Obsidian e sua base de conhecimento pessoal sincronizados.
+
+ **Automações**
+
+ - Scheduled AI Workflows: execute um agente em uma programação: resumos diários, boletins semanais, relatórios recorrentes.
+ Experimente prompts como estes:
+
+ - "Envie-me todas as manhãs um resumo diário dos novos documentos na minha base de conhecimento."
+ - "Gere um relatório de status semanal a partir do meu Slack e Gmail toda sexta-feira."
+ - "Execute um relatório mensal de análise da concorrência e salve-o no meu espaço de trabalho."
+ - "Resuma minha atividade no GitHub e Linear em uma atualização diária de standup."
+ - "Crie um relatório de pesquisa semanal recorrente sobre os temas que acompanho."
+
+ - Event-Triggered Automations: dispare um agente no momento em que um documento chega a uma pasta e publique o resultado nas suas ferramentas.
+ Experimente prompts como estes:
+
+ - "Quando um PDF chegar à minha pasta de Pesquisa, gere um resumo com IA e citações."
+ - "Quando novas notas de reunião forem adicionadas, transforme-as em atas com itens de ação."
+ - "Quando uma fatura for enviada, extraia o fornecedor, o total e a data de vencimento em uma tabela."
+ - "Quando um contrato entrar na minha pasta Jurídica, sinalize os termos-chave e as datas de renovação."
+ - "Quando um currículo for adicionado a Candidatos, avalie-o em relação à descrição da vaga."
+
+ - Chat-Built Automations: descreva uma automação em linguagem simples e o SurfSense a cria para você.
+ Experimente prompts como estes:
+
+ - "Crie um agente de IA que me envie todas as manhãs um resumo das novas páginas do Notion."
+ - "Crie uma automação sem código que publique um resumo de pesquisa semanal no Slack."
+ - "Configure um anotador com IA que transforme as novas notas de reunião em atas."
+ - "Crie um fluxo que extraia os itens de ação das notas de reunião e atribua responsáveis."
+ - "Automatize um resumo diário por e-mail a partir do meu Gmail e Google Drive."
### Auto-Hospedado
@@ -199,6 +270,7 @@ Todos os recursos operam no espaço de busca escolhido, para que suas respostas
| **Geração de Vídeos** | Visões gerais cinemáticas via Veo 3 (apenas Ultra) | Disponível (NotebookLM é melhor aqui, melhorando ativamente) |
| **Geração de Apresentações** | Slides mais bonitos mas não editáveis | Cria apresentações editáveis baseadas em slides |
| **Geração de Podcasts** | Visões gerais em áudio com hosts e idiomas personalizáveis | Disponível com múltiplos provedores TTS (NotebookLM é melhor aqui, melhorando ativamente) |
+| **Automações e Agentes de IA** | Não | Fluxos de trabalho de IA agendados, gatilhos por eventos em novos documentos e automações sem código criadas por chat com escrita de volta no Notion, Slack, Linear e Jira |
| **Aplicativo Desktop** | Não | Aplicativo nativo com General Assist, Quick Assist, Screenshot Assist e sincronização de pastas locais |
| **Extensão de Navegador** | Não | Extensão multi-navegador para salvar qualquer página web, incluindo páginas protegidas por autenticação |
diff --git a/README.zh-CN.md b/README.zh-CN.md
index a07f4afdc..d3d5330f6 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -41,6 +41,7 @@ NotebookLM 是目前最好、最实用的 AI 平台之一,但当你开始经
- **无供应商锁定** - 配置任何 LLM、图像、TTS 和 STT 模型。
- **25+ 外部数据源** - 从 Google Drive、OneDrive、Dropbox、Notion 和许多其他外部服务添加你的来源。
- **实时多人协作支持** - 在共享笔记本中轻松与团队成员协作。
+- **AI 自动化与智能体** - 按计划运行 AI 智能体,或在文档进入文件夹的那一刻触发它们,然后将结果回写到 Notion、Slack、Linear 和 Drive。只需在聊天中描述即可创建无代码自动化。
- **桌面应用** - 通过 Quick Assist、General Assist、Screenshot Assist 和本地文件夹同步在任何应用程序中获得 AI 助手。
...更多功能即将推出。
@@ -76,48 +77,118 @@ https://github.com/user-attachments/assets/a0a16566-6967-4374-ac51-9b3e07fbecd7
4. 一切索引完成后,尽管提问(使用场景):
- - 桌面应用 — General Assist
+ **桌面应用**(在以下所有功能之外的原生附加功能,并非独立的功能集)
+
+ - General Assist:通过全局快捷键,从任意应用中即刻打开 SurfSense。
Cron schedule triggers backed by croniter and a Celery beat tick task
+
Sandboxed template engine with an allowlisted filter and test set for safe workflow templating
+
Automations reorganized into a vertical-slice architecture (actions and triggers grouped by domain)
+
Extensive new test coverage locking automation schemas, dispatch, runtime, triggers, and templating
+
Model eligibility checks when creating automations, so only valid models are selectable
+
+
+
+
+
+v0.0.26 turns SurfSense from a place you ask questions into a place that does the work for you. Whether you want **scheduled AI workflows**, **event-driven document automation**, or a **self-hosted, open source AI agent** you fully control, this release lets you build it from a single sentence.
+
+SurfSense connects all your knowledge sources in one place.
diff --git a/surfsense_web/components/announcements/AnnouncementCard.tsx b/surfsense_web/components/announcements/AnnouncementCard.tsx
index ea0288b43..83a0e09b8 100644
--- a/surfsense_web/components/announcements/AnnouncementCard.tsx
+++ b/surfsense_web/components/announcements/AnnouncementCard.tsx
@@ -1,6 +1,7 @@
"use client";
import { Bell, ExternalLink, Info, type LucideIcon, Rocket, Wrench, Zap } from "lucide-react";
+import Image from "next/image";
import Link from "next/link";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
@@ -49,7 +50,18 @@ export function AnnouncementCard({ announcement }: { announcement: AnnouncementW
const Icon = config.icon;
return (
-
+
+ {announcement.image && (
+
+
+
+ )}
diff --git a/surfsense_web/components/announcements/AnnouncementSpotlight.tsx b/surfsense_web/components/announcements/AnnouncementSpotlight.tsx
new file mode 100644
index 000000000..794a3c1cf
--- /dev/null
+++ b/surfsense_web/components/announcements/AnnouncementSpotlight.tsx
@@ -0,0 +1,101 @@
+"use client";
+
+import { ExternalLink } from "lucide-react";
+import Image from "next/image";
+import Link from "next/link";
+import { useEffect, useMemo, useState } from "react";
+import { Button } from "@/components/ui/button";
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogTitle,
+} from "@/components/ui/dialog";
+import { useAnnouncements } from "@/hooks/use-announcements";
+
+/**
+ * Proactively shows important "spotlight" announcements in a blocking dialog.
+ *
+ * Behaviour:
+ * - On load, the first active, audience-matched, unread spotlight announcement
+ * is shown automatically.
+ * - The user must explicitly acknowledge it ("Got it" or the CTA link), which
+ * marks it as read so it never shows again.
+ * - Closing via the X / Escape / outside-click only hides it for the current
+ * session; it reappears on the next load until the user marks it as seen.
+ */
+export function AnnouncementSpotlight() {
+ const { announcements, markRead } = useAnnouncements();
+ const [sessionDismissed, setSessionDismissed] = useState>(() => new Set());
+ const [ready, setReady] = useState(false);
+
+ // Short delay so the spotlight doesn't flash during initial hydration/layout.
+ useEffect(() => {
+ const timer = setTimeout(() => setReady(true), 800);
+ return () => clearTimeout(timer);
+ }, []);
+
+ const current = useMemo(
+ () =>
+ announcements.find(
+ (a) => a.spotlight && a.isImportant && !a.isRead && !sessionDismissed.has(a.id)
+ ) ?? null,
+ [announcements, sessionDismissed]
+ );
+
+ if (!current) return null;
+
+ const handleAcknowledge = () => {
+ markRead(current.id);
+ };
+
+ const handleOpenChange = (next: boolean) => {
+ if (!next) {
+ setSessionDismissed((prev) => {
+ const updated = new Set(prev);
+ updated.add(current.id);
+ return updated;
+ });
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/surfsense_web/components/announcements/AnnouncementToastProvider.tsx b/surfsense_web/components/announcements/AnnouncementToastProvider.tsx
index 3e99f5c32..5578eba17 100644
--- a/surfsense_web/components/announcements/AnnouncementToastProvider.tsx
+++ b/surfsense_web/components/announcements/AnnouncementToastProvider.tsx
@@ -70,8 +70,10 @@ export function AnnouncementToastProvider() {
const outerTimer = setTimeout(() => {
const authed = isAuthenticated();
const active = getActiveAnnouncements(announcements, authed);
+ // Spotlight announcements are handled by the blocking spotlight dialog,
+ // so skip them here to avoid double-notifying the user.
const importantUntoasted = active.filter(
- (a) => a.isImportant && !isAnnouncementToasted(a.id)
+ (a) => a.isImportant && !a.spotlight && !isAnnouncementToasted(a.id)
);
for (let i = 0; i < importantUntoasted.length; i++) {
diff --git a/surfsense_web/components/assistant-ui/inline-citation.tsx b/surfsense_web/components/assistant-ui/inline-citation.tsx
index cbf3c82d6..6a8f2e035 100644
--- a/surfsense_web/components/assistant-ui/inline-citation.tsx
+++ b/surfsense_web/components/assistant-ui/inline-citation.tsx
@@ -51,7 +51,9 @@ export const InlineCitation: FC = ({ chunkId, isDocsChunk =
doc
- {isDocsChunk ? "Documentation reference" : "Uploaded document"}
+
+ {isDocsChunk ? "Documentation reference" : "Uploaded document"}
+
);
}
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/free-chat/free-chat-page.tsx b/surfsense_web/components/free-chat/free-chat-page.tsx
index 927eaef87..2ee026cc3 100644
--- a/surfsense_web/components/free-chat/free-chat-page.tsx
+++ b/surfsense_web/components/free-chat/free-chat-page.tsx
@@ -15,6 +15,7 @@ import {
type TokenUsageData,
TokenUsageProvider,
} from "@/components/assistant-ui/token-usage-context";
+import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { useAnonymousMode } from "@/contexts/anonymous-mode";
import { TimelineDataUI } from "@/features/chat-messages/timeline";
import {
@@ -101,11 +102,16 @@ export function FreeChatPage() {
const anonMode = useAnonymousMode();
const modelSlug = anonMode.isAnonymous ? anonMode.modelSlug : "";
const resetKey = anonMode.isAnonymous ? anonMode.resetKey : 0;
+ const webSearchEnabled = anonMode.isAnonymous ? anonMode.webSearchEnabled : true;
const [messages, setMessages] = useState([]);
const [isRunning, setIsRunning] = useState(false);
const [tokenUsageStore] = useState(() => createTokenUsageStore());
const abortControllerRef = useRef(null);
+ // Mirror the latest messages into a ref so onNew stays a stable callback
+ // (it reads history on demand instead of depending on the array).
+ const messagesRef = useRef([]);
+ messagesRef.current = messages;
// Turnstile CAPTCHA state
const [captchaRequired, setCaptchaRequired] = useState(false);
@@ -152,6 +158,7 @@ export function FreeChatPage() {
model_slug: modelSlug,
messages: messageHistory,
};
+ if (!webSearchEnabled) reqBody.disabled_tools = ["web_search"];
if (turnstileToken) reqBody.turnstile_token = turnstileToken;
const response = await fetch(`${BACKEND_URL}/api/v1/public/anon-chat/stream`, {
@@ -301,7 +308,7 @@ export function FreeChatPage() {
throw err;
}
},
- [modelSlug, tokenUsageStore]
+ [modelSlug, tokenUsageStore, webSearchEnabled]
);
const onNew = useCallback(
@@ -345,7 +352,7 @@ export function FreeChatPage() {
},
]);
- const messageHistory = messages
+ const messageHistory = messagesRef.current
.filter((m) => m.role === "user" || m.role === "assistant")
.map((m) => {
let text = "";
@@ -395,7 +402,7 @@ export function FreeChatPage() {
abortControllerRef.current = null;
}
},
- [messages, doStream]
+ [modelSlug, anonMode, doStream]
);
/** Called when Turnstile resolves successfully. Stores the token and auto-retries. */
@@ -481,19 +488,21 @@ export function FreeChatPage() {
);
diff --git a/surfsense_web/components/free-chat/quota-warning-banner.tsx b/surfsense_web/components/free-chat/quota-warning-banner.tsx
index 828e8006e..e6aa89d42 100644
--- a/surfsense_web/components/free-chat/quota-warning-banner.tsx
+++ b/surfsense_web/components/free-chat/quota-warning-banner.tsx
@@ -3,6 +3,7 @@
import { OctagonAlert, Orbit, X } from "lucide-react";
import Link from "next/link";
import { useState } from "react";
+import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
@@ -27,61 +28,46 @@ export function QuotaWarningBanner({
if (isExceeded) {
return (
-
-
-
-
-
- Free token limit reached
-
-
- You've used all {limit.toLocaleString()} free tokens. Create a free account to
- get $5 of premium credit and access to all models.
-
-
-
+
+
+ Free token limit reached
+
+
+ You've used all {limit.toLocaleString()} free tokens. Create a free account to get
+ $5 of premium credit and access to all models.
+
+
-
-
+
+
+
);
}
return (
-
-
-
-
- You've used {used.toLocaleString()} of {limit.toLocaleString()} free tokens.{" "}
-
- Create an account
- {" "}
- for $5 of premium credit.
-
-
-
-
+
+
+ Running low on free tokens
+
+ You've used {used.toLocaleString()} of {limit.toLocaleString()} free tokens.{" "}
+
+ Create an account
+ {" "}
+ for $5 of premium credit.
+
+
+
);
}
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 = () => (
+
+
+
+);
+
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/hero-section.tsx b/surfsense_web/components/homepage/hero-section.tsx
index c0abd927f..0641d4e4e 100644
--- a/surfsense_web/components/homepage/hero-section.tsx
+++ b/surfsense_web/components/homepage/hero-section.tsx
@@ -1,6 +1,14 @@
"use client";
-import { ChevronDown, Download, Monitor } from "lucide-react";
-import { AnimatePresence, motion } from "motion/react";
+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";
@@ -11,7 +19,18 @@ import {
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,
@@ -50,96 +69,215 @@ const GoogleLogo = ({ className }: { className?: string }) => (
);
-const TAB_ITEMS = [
+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[] = [
{
- title: "General Assist",
- description: "Launch SurfSense instantly from any application.",
- src: "/homepage/hero_tutorial/general_assist.mp4",
- featured: true,
+ 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`,
+ },
+ ],
},
{
- title: "Quick Assist",
- description: "Select text anywhere, then ask AI to explain, rewrite, or act on it.",
- src: "/homepage/hero_tutorial/quick_assist.mp4",
- featured: true,
+ 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.",
+ ],
+ },
+ ],
},
{
- title: "Screenshot Assist",
- description:
- "Use a global shortcut to select a region on your screen and attach it to your chat message.",
- src: "/homepage/hero_tutorial/screenshot_assist.mp4",
- featured: true,
+ 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.",
+ ],
+ },
+ ],
},
{
- title: "Watch Local Folder",
- description:
- "Watch a local folder and automatically sync file changes to your knowledge base. Works great with Obsidian vaults.",
- src: "/homepage/hero_tutorial/folder_watch.mp4",
- featured: true,
- },
- // {
- // title: "Connect & Sync",
- // description:
- // "Connect data sources like Notion, Drive and Gmail. Automatically sync to keep them updated.",
- // src: "/homepage/hero_tutorial/ConnectorFlowGif.mp4",
- // featured: true,
- // },
- // {
- // title: "Upload Documents",
- // description: "Upload documents directly, from images to massive PDFs.",
- // src: "/homepage/hero_tutorial/DocUploadGif.mp4",
- // featured: true,
- // },
- {
- title: "Video & Presentations",
- description:
- "Create short videos and editable presentations with AI-generated visuals and narration from your sources.",
- src: "/homepage/hero_tutorial/video_gen_surf.mp4",
- featured: false,
+ 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`,
+ },
+ ],
},
{
- title: "Search & Citation",
- description: "Ask questions and get cited responses from your knowledge base.",
- src: "/homepage/hero_tutorial/BSNCGif.mp4",
- featured: false,
+ 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.",
+ ],
+ },
+ ],
},
- {
- title: "Document Q&A",
- description: "Mention specific documents in chat for targeted answers.",
- src: "/homepage/hero_tutorial/BQnaGif_compressed.mp4",
- featured: false,
- },
- {
- title: "Reports",
- description: "Generate reports from your sources in many formats.",
- src: "/homepage/hero_tutorial/ReportGenGif_compressed.mp4",
- featured: false,
- },
- {
- title: "Podcasts",
- description: "Turn anything into a podcast in under 20 seconds.",
- src: "/homepage/hero_tutorial/PodcastGenGif.mp4",
- featured: false,
- },
- {
- title: "Image Generation",
- description: "Generate high-quality images easily from your conversations.",
- src: "/homepage/hero_tutorial/ImageGenGif.mp4",
- featured: false,
- },
- {
- title: "Collaborative Chat",
- description: "Collaborate on AI-powered conversations in realtime with your team.",
- src: "/homepage/hero_realtime/RealTimeChatGif.mp4",
- featured: false,
- },
- {
- title: "Comments",
- description: "Add comments and tag teammates on any message.",
- src: "/homepage/hero_realtime/RealTimeCommentsFlow.mp4",
- featured: false,
- },
-] as const;
+];
export function HeroSection() {
return (
@@ -279,117 +417,15 @@ function DownloadButton() {
);
}
-const BrowserWindow = () => {
- const [selectedIndex, setSelectedIndex] = useState(0);
- const selectedItem = TAB_ITEMS[selectedIndex];
- const { expanded, open, close } = useExpandedMedia();
-
- return (
- <>
-
-
+ );
+}
diff --git a/surfsense_web/components/new-chat/document-mention-picker.tsx b/surfsense_web/components/new-chat/document-mention-picker.tsx
index 769327e1e..43a5cad74 100644
--- a/surfsense_web/components/new-chat/document-mention-picker.tsx
+++ b/surfsense_web/components/new-chat/document-mention-picker.tsx
@@ -220,13 +220,7 @@ export const DocumentMentionPicker = forwardRef<
DocumentMentionPickerRef,
DocumentMentionPickerProps
>(function DocumentMentionPicker(
- {
- searchSpaceId,
- onSelectionChange,
- onDone,
- initialSelectedDocuments = [],
- externalSearch = "",
- },
+ { searchSpaceId, onSelectionChange, onDone, initialSelectedDocuments = [], externalSearch = "" },
ref
) {
const search = externalSearch;
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/components/ui/empty.tsx b/surfsense_web/components/ui/empty.tsx
new file mode 100644
index 000000000..79145502f
--- /dev/null
+++ b/surfsense_web/components/ui/empty.tsx
@@ -0,0 +1,94 @@
+import { cva, type VariantProps } from "class-variance-authority";
+
+import { cn } from "@/lib/utils";
+
+function Empty({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function EmptyHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+const emptyMediaVariants = cva(
+ "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default: "bg-transparent",
+ icon: "flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+);
+
+function EmptyMedia({
+ className,
+ variant = "default",
+ ...props
+}: React.ComponentProps<"div"> & VariantProps) {
+ return (
+
+ );
+}
+
+function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function EmptyDescription({ className, ...props }: React.ComponentProps<"p">) {
+ return (
+
a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
+ className
+ )}
+ {...props}
+ />
+ );
+}
+
+function EmptyContent({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+export { Empty, EmptyHeader, EmptyTitle, EmptyDescription, EmptyContent, EmptyMedia };
diff --git a/surfsense_web/contexts/anonymous-mode.tsx b/surfsense_web/contexts/anonymous-mode.tsx
index eaf0996c3..c24a5cb1b 100644
--- a/surfsense_web/contexts/anonymous-mode.tsx
+++ b/surfsense_web/contexts/anonymous-mode.tsx
@@ -9,6 +9,8 @@ export interface AnonymousModeContextValue {
setModelSlug: (slug: string) => void;
uploadedDoc: { filename: string; sizeBytes: number } | null;
setUploadedDoc: (doc: { filename: string; sizeBytes: number } | null) => void;
+ webSearchEnabled: boolean;
+ setWebSearchEnabled: (enabled: boolean) => void;
resetKey: number;
resetChat: () => void;
}
@@ -34,6 +36,7 @@ export function AnonymousModeProvider({
const [uploadedDoc, setUploadedDoc] = useState<{ filename: string; sizeBytes: number } | null>(
null
);
+ const [webSearchEnabled, setWebSearchEnabled] = useState(true);
const [resetKey, setResetKey] = useState(0);
const resetChat = () => setResetKey((k) => k + 1);
@@ -56,10 +59,12 @@ export function AnonymousModeProvider({
setModelSlug,
uploadedDoc,
setUploadedDoc,
+ webSearchEnabled,
+ setWebSearchEnabled,
resetKey,
resetChat,
}),
- [modelSlug, uploadedDoc, resetKey]
+ [modelSlug, uploadedDoc, webSearchEnabled, resetKey]
);
return {children};
diff --git a/surfsense_web/contracts/types/announcement.types.ts b/surfsense_web/contracts/types/announcement.types.ts
index 6c5206d9d..05cf14d21 100644
--- a/surfsense_web/contracts/types/announcement.types.ts
+++ b/surfsense_web/contracts/types/announcement.types.ts
@@ -35,6 +35,20 @@ export interface Announcement {
audience: AnnouncementAudience;
/** If true, the user will see a toast notification for this announcement */
isImportant: boolean;
+ /**
+ * If true, this announcement is shown in a blocking spotlight dialog that the
+ * user must explicitly acknowledge ("Got it"). Until acknowledged it keeps
+ * reappearing; once acknowledged it never shows again. Spotlight announcements
+ * are skipped by the lightweight toast provider to avoid double notifications.
+ */
+ spotlight?: boolean;
+ /** Optional head/banner image shown at the top of the announcement */
+ image?: {
+ /** Image source (public path or absolute URL) */
+ src: string;
+ /** Accessible alt text */
+ alt: string;
+ };
/** Optional CTA link */
link?: {
label: string;
diff --git a/surfsense_web/lib/announcements/announcements-data.ts b/surfsense_web/lib/announcements/announcements-data.ts
index ce44ec539..e5f3f0fce 100644
--- a/surfsense_web/lib/announcements/announcements-data.ts
+++ b/surfsense_web/lib/announcements/announcements-data.ts
@@ -13,6 +13,27 @@ import type { Announcement } from "@/contracts/types/announcement.types";
* This file can be replaced with an API call in the future.
*/
export const announcements: Announcement[] = [
+ {
+ id: "2026-05-31-ai-automations",
+ title: "Introducing AI Automations",
+ description:
+ "Turn prompts into hands-off AI agent workflows. Describe an automation in plain English and SurfSense builds it, run it on a schedule, or trigger it the moment a document lands in a folder. Automations work across Notion, Slack, Google Drive, Gmail, GitHub, Linear, Jira and more.",
+ category: "feature",
+ date: "2026-05-31T00:00:00Z",
+ startTime: "2026-05-31T00:00:00Z",
+ endTime: "2026-07-15T00:00:00Z",
+ audience: "users",
+ isImportant: true,
+ spotlight: true,
+ image: {
+ src: "/announcements/automations.png",
+ alt: "Connector tiles flowing into a central AI core that triggers scheduled and event-driven automations.",
+ },
+ link: {
+ label: "See what's new",
+ url: "/changelog",
+ },
+ },
{
id: "announcement-1",
title: "Introducing What's New",
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.",
+ ],
+ },
+];
diff --git a/surfsense_web/package.json b/surfsense_web/package.json
index 6ac32160b..cc55d0d5d 100644
--- a/surfsense_web/package.json
+++ b/surfsense_web/package.json
@@ -1,6 +1,6 @@
{
"name": "surfsense_web",
- "version": "0.0.25",
+ "version": "0.0.26",
"private": true,
"packageManager": "pnpm@10.26.0",
"description": "SurfSense Frontend",
diff --git a/surfsense_web/public/announcements/automations.png b/surfsense_web/public/announcements/automations.png
new file mode 100644
index 000000000..39eb35837
Binary files /dev/null and b/surfsense_web/public/announcements/automations.png differ