- Implemented IPC channels for managing auto-launch settings.
- Enhanced main process to handle auto-launch behavior on startup.
- Updated UI components to allow users to configure launch options.
- Integrated analytics tracking for auto-launch events.
This commit introduces the ability for users to enable or disable the application launching at system startup, along with options for starting minimized to the tray.
Closes#1247.
toggleTheme's previous implementation read isDark from the closure via
setIsDark(!isDark), which forced isDark into the useCallback dependency
array. As a result toggleTheme's reference changed on every click,
invalidating any downstream memoization.
Switched to the functional updater setIsDark((prev) => !prev) and
dropped isDark from the dependency list. The sibling setCrazyLightTheme
and setCrazyDarkTheme callbacks already use this pattern (they pass
concrete values to setIsDark without listing isDark in deps), so this
keeps the three theme callbacks consistent.
No observable behavior change — clicking the theme toggle still flips
isDark. The callback reference is now stable between clicks, which is
also safer under concurrent updates per React's standard guidance.
- Added event tracking for desktop app activation and quitting.
- Introduced analytics bridge in preload script to handle user identification and event capturing.
- Updated IPC channels to support analytics-related actions.
- Enhanced analytics functionality in the main process to track user interactions and application updates.
- Integrated analytics tracking for folder watching and deep link handling.
- Improved connector setup tracking in the web application.
This commit enhances the overall analytics capabilities of the application, ensuring better user behavior insights and event tracking across both desktop and web environments.
The useState was declared but its value was never read in render
(only the setter was called). Each setter call scheduled a re-render
that changed nothing visible.
The actual scroll/highlight behavior is driven by hasScrolledRef
and setActiveChunkIndex; this state was effectively dead.
Closes#1249
The (home)/layout.tsx already wraps children in <main>. Having another
<main> inside each child page produces nested landmarks, which is
invalid HTML and confuses screen readers.
Changed the outermost wrapper from <main> → <div> in:
- surfsense_web/app/(home)/page.tsx (homepage)
- surfsense_web/app/(home)/free/page.tsx (free AI chat landing)
Other (home) descendants (login/register/privacy/terms/changelog/
announcements/blog/contact/free/[model_slug]) were already using <div>.
Closes#1191
- Introduced AI File Sorting functionality to automatically organize documents into a smart folder hierarchy based on source, date, and topic.
- Updated README.md to include the new feature.
- Enhanced homepage components with new illustrations and descriptions for AI File Sorting.
- Refactored rate limiting logic to extract real client IPs more accurately.
- Enhanced Azure Document Intelligence parser to raise an error for empty or whitespace-only content.
- Updated LLMRouterService to log premium model strings more clearly.
- Added automatic encoding detection for file reading in document processors.
- Improved error handling for empty markdown content extraction in file processors.
- Refactored DocumentUploadTab component for better accessibility and user interaction.
Store setTimeout IDs in a ref and clear them when the source detail
panel closes or unmounts, preventing state updates on unmounted
components.
Fixes#1092
The cleanup for the announcement-toast effect only cleared the outer
1500ms timer, leaving the per-announcement stagger timers (i * 800ms)
untracked. If the root layout unmounts during the stagger window, those
timers fire after cleanup and attempt to toast against a dead tree.
Track the inner timer ids in an array and clear them alongside the outer
timer in the effect cleanup.
Fixes#1094.
Wrap the opts object and derived context in useMemo so ZeroReactProvider
receives stable references across parent re-renders. Before this change
opts was rebuilt on every render of ZeroProvider, which can cause the
Rocicorp Zero client to churn its internal state / reconnect if it
compares props by reference.
Fixes#1097.
Replace ReactDOMServer.renderToString with a tiny createRoot + flushSync
helper so react-dom/server is no longer pulled into the client bundle on
every chat page load. react-dom is already in the bundle (React itself
uses it), so this adds zero new runtime weight.
Fixes#1189.
Move the duplicated TYPE_ICONS record from citation.tsx and
citation-list.tsx into a new type-icons.ts module so the mapping lives
in one place and both components import from the same source.
Resolves#1190
- Introduced a `ProcessingMode` enum to differentiate between basic and premium processing modes.
- Updated `EtlRequest` to include a `processing_mode` field, defaulting to basic.
- Enhanced ETL pipeline services to utilize the selected processing mode for Azure Document Intelligence and LlamaCloud parsing.
- Modified various routes and services to handle processing mode, affecting document upload and indexing tasks.
- Improved error handling and logging to include processing mode details.
- Added tests to validate processing mode functionality and its impact on ETL operations.