Skip to content

feat: various fixes and streamlined versioning#1187

Merged
MODSetter merged 83 commits intomainfrom
dev
Apr 9, 2026
Merged

feat: various fixes and streamlined versioning#1187
MODSetter merged 83 commits intomainfrom
dev

Conversation

@MODSetter
Copy link
Copy Markdown
Owner

@MODSetter MODSetter commented Apr 8, 2026

Description

Motivation and Context

FIX #

Screenshots

API Changes

  • This PR includes API changes

Change Type

  • Bug fix
  • New feature
  • Performance improvement
  • Refactoring
  • Documentation
  • Dependency/Build system
  • Breaking change
  • Other (specify):

Testing Performed

  • Tested locally
  • Manual/QA verification

Checklist

  • Follows project coding standards and conventions
  • Documentation updated as needed
  • Dependencies updated as needed
  • No lint/build errors or new warnings
  • All relevant tests are passing

High-level PR Summary

This PR introduces centralized version management through a new VERSION file and automated bump scripts, streamlines local folder syncing in the desktop app by replacing filesystem-based indexing with an upload-based approach that works across all deployment modes, and includes various fixes including database relationship improvements, performance optimizations through code splitting and dynamic imports, UI/UX enhancements, and accessibility improvements across the web frontend.

⏱️ Estimated Review Time: 30-90 minutes

💡 Review Order Suggestion
Order File Path
1 VERSION
2 scripts/bump-version.sh
3 scripts/bump-version.ps1
4 .github/workflows/desktop-release.yml
5 .github/workflows/docker-build.yml
6 surfsense_backend/pyproject.toml
7 surfsense_browser_extension/package.json
8 surfsense_desktop/package.json
9 surfsense_web/package.json
10 surfsense_desktop/src/ipc/channels.ts
11 surfsense_desktop/src/modules/folder-watcher.ts
12 surfsense_desktop/src/ipc/handlers.ts
13 surfsense_desktop/src/preload.ts
14 surfsense_web/types/window.d.ts
15 surfsense_web/lib/folder-sync-upload.ts
16 surfsense_backend/app/routes/documents_routes.py
17 surfsense_backend/app/tasks/celery_tasks/document_tasks.py
18 surfsense_backend/app/tasks/connector_indexers/local_folder_indexer.py
19 surfsense_backend/app/indexing_pipeline/connector_document.py
20 surfsense_backend/app/indexing_pipeline/indexing_pipeline_service.py
21 surfsense_web/lib/apis/documents-api.service.ts
22 surfsense_web/hooks/use-folder-sync.ts
23 surfsense_web/components/sources/FolderWatchDialog.tsx
24 surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx
25 surfsense_web/components/documents/FolderNode.tsx
26 surfsense_web/components/documents/FolderTreeView.tsx
27 surfsense_web/zero/schema/folders.ts
28 surfsense_backend/app/db.py
29 surfsense_backend/tests/integration/indexing_pipeline/test_local_folder_pipeline.py
30 surfsense_desktop/src/modules/auto-updater.ts
31 surfsense_web/components/assistant-ui/thread.tsx
32 surfsense_web/components/assistant-ui/assistant-message.tsx
33 surfsense_web/app/dashboard/[search_space_id]/new-chat/[[...chat_id]]/page.tsx
34 surfsense_web/components/assistant-ui/connector-popup/connector-configs/index.tsx
35 surfsense_web/components/assistant-ui/connector-popup/connect-forms/index.tsx
36 surfsense_web/components/settings/search-space-settings-dialog.tsx
37 surfsense_web/components/settings/user-settings-dialog.tsx
38 surfsense_web/components/public-chat/public-thread.tsx
39 surfsense_web/contexts/LocaleContext.tsx
40 surfsense_web/app/dashboard/[search_space_id]/logs/(manage)/page.tsx
41 surfsense_web/app/dashboard/[search_space_id]/logs/loading.tsx
42 surfsense_web/components/layout/ui/dialogs/CreateSearchSpaceDialog.tsx
43 surfsense_web/components/layout/ui/sidebar/SidebarSlideOutPanel.tsx
44 surfsense_web/components/layout/ui/sidebar/Sidebar.tsx
45 surfsense_web/components/layout/ui/tabs/DocumentTabContent.tsx
46 surfsense_web/components/UserDropdown.tsx
47 surfsense_web/app/(home)/login/page.tsx
48 surfsense_web/components/assistant-ui/tooltip-icon-button.tsx
49 surfsense_web/components/new-chat/model-selector.tsx
50 surfsense_web/components/new-chat/chat-share-button.tsx
51 surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx
52 surfsense_web/components/settings/image-model-manager.tsx
53 surfsense_web/components/settings/model-config-manager.tsx
54 surfsense_web/components/ui/animated-tabs.tsx
55 surfsense_web/components/homepage/navbar.tsx
56 surfsense_web/app/(home)/login/LocalLoginForm.tsx
57 surfsense_web/app/(home)/register/page.tsx
58 surfsense_web/app/dashboard/[search_space_id]/user-settings/components/ProfileContent.tsx
59 surfsense_web/app/desktop/suggestion/page.tsx
60 surfsense_web/components/assistant-ui/document-upload-popup.tsx
61 surfsense_web/components/sources/DocumentUploadTab.tsx
62 surfsense_web/components/assistant-ui/connector-popup/components/connector-dialog-header.tsx
63 surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx
64 surfsense_web/components/assistant-ui/connector-popup/utils/connector-document-mapping.ts
65 surfsense_web/components/homepage/hero-section.tsx
66 surfsense_web/components/homepage/why-surfsense.tsx
67 surfsense_web/components/pricing/pricing-section.tsx
68 surfsense_web/components/markdown-viewer.tsx
69 surfsense_web/contracts/types/folder.types.ts
70 surfsense_web/instrumentation-client.ts
71 surfsense_web/components/tool-ui/audio.tsx
72 surfsense_web/components/tool-ui/confluence/create-confluence-page.tsx
73 surfsense_web/components/tool-ui/confluence/delete-confluence-page.tsx
74 surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx
75 surfsense_web/components/tool-ui/dropbox/create-file.tsx
76 surfsense_web/components/tool-ui/dropbox/trash-file.tsx
77 surfsense_web/components/tool-ui/generate-report.tsx
78 surfsense_web/components/tool-ui/gmail/create-draft.tsx
79 surfsense_web/components/tool-ui/gmail/send-email.tsx
80 surfsense_web/components/tool-ui/gmail/trash-email.tsx
81 surfsense_web/components/tool-ui/gmail/update-draft.tsx
82 surfsense_web/components/tool-ui/google-calendar/create-event.tsx
83 surfsense_web/components/tool-ui/google-calendar/delete-event.tsx
84 surfsense_web/components/tool-ui/google-calendar/update-event.tsx
85 surfsense_web/components/tool-ui/google-drive/create-file.tsx
86 surfsense_web/components/tool-ui/google-drive/trash-file.tsx
87 surfsense_web/components/tool-ui/jira/create-jira-issue.tsx
88 surfsense_web/components/tool-ui/jira/delete-jira-issue.tsx
89 surfsense_web/components/tool-ui/jira/update-jira-issue.tsx
90 surfsense_web/components/tool-ui/linear/create-linear-issue.tsx
91 surfsense_web/components/tool-ui/linear/delete-linear-issue.tsx
92 surfsense_web/components/tool-ui/linear/update-linear-issue.tsx
93 surfsense_web/components/tool-ui/notion/create-notion-page.tsx
94 surfsense_web/components/tool-ui/notion/delete-notion-page.tsx
95 surfsense_web/components/tool-ui/notion/update-notion-page.tsx
96 surfsense_web/components/tool-ui/onedrive/create-file.tsx
97 surfsense_web/components/tool-ui/onedrive/trash-file.tsx
98 surfsense_web/components/tool-ui/video-presentation/generate-video-presentation.tsx
99 surfsense_web/public/homepage/hero_tutorial/extreme_assist.gif
100 surfsense_web/public/homepage/hero_tutorial/general_assist.gif
101 surfsense_web/public/homepage/hero_tutorial/quick_assist.gif
102 surfsense_backend/uv.lock

Need help? Join our Discord

Analyze latest changes

AnishSarkar22 and others added 30 commits March 8, 2026 02:57
testing backend test CI workflow
…gation

- Replace window.location.href with router.push() + router.refresh() in UserDropdown logout
- Replace window.location.href with router.push() in CreateSearchSpaceDialog
- Replace window.location.reload() with router.refresh() in login page retry action
- Prevents full page reloads and preserves React state during in-app navigation
- Remove 'use client' from connector-document-mapping.ts (only exports constants and pure functions)
- Remove 'use client' from sidebar-separator.tsx (purely presentational component)
- Remove 'use client' and Framer Motion from logs/loading.tsx, replace with Tailwind animations
- Reduces client bundle size by moving server-compatible code to server components
- Add autoComplete="username" and "current-password" to login form
- Add autoComplete="email" and "new-password" to register form inputs
- Add autoComplete="name" to profile display name input
- Add autoComplete="off" to connector search input
- Enables browser password managers and autofill functionality
- Add local state for message filter input with 300ms debounce
- Use useDebouncedValue hook to delay table filter updates
- Prevents full filtering pipeline from running on every keystroke
- Improves responsiveness for large log datasets
- Remove forceMount prop from DropdownMenuContent
- Allows Radix to mount content only when dropdown is open
- Reduces unnecessary DOM nodes when dropdown is closed
- Improves performance by using default Radix behavior
- Store viewport element in ref instead of repeated querySelector calls
- Move getBoundingClientRect calls from render to useLayoutEffect
- Use ResizeObserver to update picker positions reactively
- Eliminates 120+ querySelector calls during message submit polling
- Prevents forced layout during React render phase
- Replace width animation with translateX for GPU acceleration
- Set fixed width on panel and animate x position instead
- Prevents layout recalculation on every animation frame
- Runs on compositor thread without triggering reflow
…etter performance

- Replace transition-all with transition-[width] in Sidebar.tsx for width animations
- Replace transition-all with specific properties in animated-tabs.tsx for hover/active indicators
- Replace transition-all with transition-[background-color,border-color,box-shadow] in navbar.tsx
- Replace transition-all with transition-[width] in audio.tsx volume bar
- Replace transition-all with transition-[background-color,border-color,color] in thread.tsx
- Replace transition-all with transition-[box-shadow] in all tool-ui status cards (28+ files)

This reduces unnecessary browser layout/paint work by only animating the specific
properties that change, avoiding expensive recalculations for properties like
width, height, margin, and padding that don't need animation.

Fixes #1147
Convert MobileEditorPanel, MobileHitlEditPanel, and MobileReportPanel from
static imports to dynamic imports with ssr: false. These panels pull in heavy
dependencies (PlateEditor, MarkdownViewer) that are only needed when users
interact with them on mobile.

Benefits:
- Reduces initial bundle size for chat page
- Mobile panels load only when opened by user
- Faster initial page load and Time to Interactive
- Heavy editor dependencies are code-split into separate chunks

Fixes #1146
Convert GenerateVideoPresentationToolUI from static import to dynamic import
with ssr: false in public-thread.tsx. This prevents Remotion and @babel/standalone
from being bundled in the public chat page.

The main app's assistant-message.tsx already correctly lazy-loads this component,
but the public thread was still using a static import, unnecessarily increasing
the bundle size for public shared chats.

Benefits:
- Removes Remotion and @babel/standalone from public chat bundle
- Reduces initial bundle size for public shared chats
- Video presentations still render correctly when present
- Faster page load for users viewing public chats

Fixes #1145
Remove unused 'is' import from drizzle-orm in markdown-viewer.tsx (line 5).
This import was never used in the file and unnecessarily dragged ORM code
into the UI component's bundle chunk.

Benefits:
- Removes drizzle-orm from markdown-viewer bundle chunk
- Reduces bundle size for components using MarkdownViewer
- Cleaner imports with no unused dependencies
- Markdown viewer functionality unchanged

Fixes #1144
Replace static imports of all 5 locale JSON files with dynamic imports.
Only English is bundled by default, other locales (es, hi, pt, zh) load
on demand when the user switches languages.

Also removes unused 'set' import from zod (line 5) that was dragging
Zod surface into this module unnecessarily.

Changes:
- Removed static imports for es, hi, pt, zh locale files
- Removed unused zod import
- Added loadMessages() function for dynamic locale loading
- Updated setLocale() to load messages asynchronously
- Added useEffect to load non-English locale on mount if stored

Benefits:
- Only active locale's JSON in initial bundle (English default)
- 80% reduction in locale data in initial bundle
- Other locale files load on demand (~50-100KB each)
- Removed unnecessary zod dependency from module
- Locale switching still works seamlessly
- Faster initial page load

Fixes #1143
- Replace 23 static connector config imports with dynamic imports
- Replace 10 static connect form imports with dynamic imports
- Add component caching to avoid recreating dynamic components
- Significantly reduces connector popup chunk size
- Only selected connector components load on demand
- Replace 6 static imports in user-settings-dialog with dynamic imports
- Replace 8 static imports in search-space-settings-dialog with dynamic imports
- Each settings tab loads content only when selected
- Reduces initial settings dialog bundle size
- All tab functionality preserved
- Replace 20+ static tool UI imports with dynamic imports
- Dynamically load: Confluence, Dropbox, Gmail, Google Calendar, Google Drive, OneDrive, Jira, Linear, Notion, Generate Image, Generate Report, Generate Podcast, Generate Video Presentation, Sandbox Execute, User Memory
- Dramatically reduces chat page initial bundle size
- Tool UIs load on demand when assistant uses them
- ToolFallback remains synchronous as fallback component
- Added a check in the desktop release workflow to ensure version tags follow semantic versioning (semver) format.
- Enhanced the auto-updater to log a message and skip updates if the app version is not valid semver.
- Improved type definitions for event handlers in the auto-updater for better TypeScript support.
- Changed the method of retrieving the app version in the Docker build workflow from the pyproject.toml file to the VERSION file for improved consistency and reliability.
- Updated error messaging to reflect the new source of the app version.
…essary-use-client-directives

fix: remove unnecessary use client directives
…lete-attributes

Fix/add autocomplete attributes
…s-message-filter

fix: debounce logs message filter
…mount-from-user-dropdown

fix: remove forcemount from user dropdown
AnishSarkar22 and others added 23 commits April 8, 2026 15:46
…hance watched folder ID retrieval in DocumentsSidebar
…val and optimizing empty folder cleanup process
…and enhance UI component styling for folder selection
…or document upload and folder watch functionalities
fix: harden folder watch feature with file hash dedup, mtime seeding, and stable spinner
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 8, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
surf-sense-frontend Ready Ready Preview, Comment Apr 8, 2026 11:44pm

Request Review

Copy link
Copy Markdown

@recurseml recurseml Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review by RecurseML

🔍 Review performed on c77098a..edd226c

✨ No bugs found, your code is sparkling clean

✅ Files analyzed, no issues (49)

.github/workflows/desktop-release.yml
.github/workflows/docker-build.yml
VERSION
scripts/bump-version.ps1
scripts/bump-version.sh
surfsense_backend/app/db.py
surfsense_backend/app/indexing_pipeline/connector_document.py
surfsense_backend/app/indexing_pipeline/indexing_pipeline_service.py
surfsense_backend/app/routes/documents_routes.py
surfsense_backend/app/tasks/celery_tasks/document_tasks.py
surfsense_backend/app/tasks/connector_indexers/local_folder_indexer.py
surfsense_backend/pyproject.toml
surfsense_backend/tests/integration/indexing_pipeline/test_local_folder_pipeline.py
surfsense_browser_extension/package.json
surfsense_desktop/package.json
surfsense_desktop/src/ipc/channels.ts
surfsense_desktop/src/ipc/handlers.ts
surfsense_desktop/src/modules/auto-updater.ts
surfsense_desktop/src/modules/folder-watcher.ts
surfsense_desktop/src/preload.ts
surfsense_web/app/(home)/login/LocalLoginForm.tsx
surfsense_web/app/(home)/login/page.tsx
surfsense_web/app/(home)/register/page.tsx
surfsense_web/app/dashboard/[search_space_id]/logs/(manage)/page.tsx
surfsense_web/app/dashboard/[search_space_id]/logs/loading.tsx
surfsense_web/app/dashboard/[search_space_id]/user-settings/components/ProfileContent.tsx
surfsense_web/app/desktop/suggestion/page.tsx
surfsense_web/components/UserDropdown.tsx
surfsense_web/components/assistant-ui/assistant-message.tsx
surfsense_web/components/assistant-ui/connector-popup/components/connector-dialog-header.tsx
surfsense_web/components/assistant-ui/connector-popup/connect-forms/index.tsx
surfsense_web/components/assistant-ui/connector-popup/connector-configs/index.tsx
surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx
surfsense_web/components/assistant-ui/connector-popup/utils/connector-document-mapping.ts
surfsense_web/components/assistant-ui/document-upload-popup.tsx
surfsense_web/components/assistant-ui/thread.tsx
surfsense_web/components/assistant-ui/tooltip-icon-button.tsx
surfsense_web/components/documents/FolderNode.tsx
surfsense_web/components/documents/FolderTreeView.tsx
surfsense_web/components/homepage/hero-section.tsx
surfsense_web/components/homepage/navbar.tsx
surfsense_web/components/homepage/why-surfsense.tsx
surfsense_web/components/layout/ui/dialogs/CreateSearchSpaceDialog.tsx
surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx
surfsense_web/components/layout/ui/sidebar/Sidebar.tsx
surfsense_web/components/layout/ui/sidebar/SidebarSlideOutPanel.tsx
surfsense_web/components/layout/ui/tabs/DocumentTabContent.tsx
surfsense_web/components/markdown-viewer.tsx
surfsense_web/components/new-chat/chat-share-button.tsx

⏭️ Files skipped (52)
  Locations  
surfsense_backend/uv.lock
surfsense_web/components/new-chat/model-selector.tsx
surfsense_web/components/pricing/pricing-section.tsx
surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx
surfsense_web/components/public-chat/public-thread.tsx
surfsense_web/components/settings/image-model-manager.tsx
surfsense_web/components/settings/model-config-manager.tsx
surfsense_web/components/settings/search-space-settings-dialog.tsx
surfsense_web/components/settings/user-settings-dialog.tsx
surfsense_web/components/sources/DocumentUploadTab.tsx
surfsense_web/components/sources/FolderWatchDialog.tsx
surfsense_web/components/tool-ui/audio.tsx
surfsense_web/components/tool-ui/confluence/create-confluence-page.tsx
surfsense_web/components/tool-ui/confluence/delete-confluence-page.tsx
surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx
surfsense_web/components/tool-ui/dropbox/create-file.tsx
surfsense_web/components/tool-ui/dropbox/trash-file.tsx
surfsense_web/components/tool-ui/generate-report.tsx
surfsense_web/components/tool-ui/gmail/create-draft.tsx
surfsense_web/components/tool-ui/gmail/send-email.tsx
surfsense_web/components/tool-ui/gmail/trash-email.tsx
surfsense_web/components/tool-ui/gmail/update-draft.tsx
surfsense_web/components/tool-ui/google-calendar/create-event.tsx
surfsense_web/components/tool-ui/google-calendar/delete-event.tsx
surfsense_web/components/tool-ui/google-calendar/update-event.tsx
surfsense_web/components/tool-ui/google-drive/create-file.tsx
surfsense_web/components/tool-ui/google-drive/trash-file.tsx
surfsense_web/components/tool-ui/jira/create-jira-issue.tsx
surfsense_web/components/tool-ui/jira/delete-jira-issue.tsx
surfsense_web/components/tool-ui/jira/update-jira-issue.tsx
surfsense_web/components/tool-ui/linear/create-linear-issue.tsx
surfsense_web/components/tool-ui/linear/delete-linear-issue.tsx
surfsense_web/components/tool-ui/linear/update-linear-issue.tsx
surfsense_web/components/tool-ui/notion/create-notion-page.tsx
surfsense_web/components/tool-ui/notion/delete-notion-page.tsx
surfsense_web/components/tool-ui/notion/update-notion-page.tsx
surfsense_web/components/tool-ui/onedrive/create-file.tsx
surfsense_web/components/tool-ui/onedrive/trash-file.tsx
surfsense_web/components/tool-ui/video-presentation/generate-video-presentation.tsx
surfsense_web/components/ui/animated-tabs.tsx
surfsense_web/contexts/LocaleContext.tsx
surfsense_web/contracts/types/folder.types.ts
surfsense_web/hooks/use-folder-sync.ts
surfsense_web/instrumentation-client.ts
surfsense_web/lib/apis/documents-api.service.ts
surfsense_web/lib/folder-sync-upload.ts
surfsense_web/package.json
surfsense_web/public/homepage/hero_tutorial/extreme_assist.gif
surfsense_web/public/homepage/hero_tutorial/general_assist.gif
surfsense_web/public/homepage/hero_tutorial/quick_assist.gif
surfsense_web/types/window.d.ts
surfsense_web/zero/schema/folders.ts

@MODSetter MODSetter merged commit f47e7a8 into main Apr 9, 2026
15 of 17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants