Skip to content

Comments

feat: editor overhaul, Linear integration, KB sync & UI improvements#830

Merged
MODSetter merged 99 commits intomainfrom
dev
Feb 21, 2026
Merged

feat: editor overhaul, Linear integration, KB sync & UI improvements#830
MODSetter merged 99 commits intomainfrom
dev

Conversation

@MODSetter
Copy link
Owner

@MODSetter MODSetter commented Feb 21, 2026

Description

  • Overhauled the PlateJS editor with a fixed toolbar, drag-and-drop, autoformat, save/leave flow, read-only mode, and dark mode support
  • Added Linear integration (create/update/delete issues, KB sync, tool UIs) and improved Notion KB sync
  • Enhanced report generation with source strategies, length constraints, and markdown handling
  • Improved LLM model selector, PostHog tracking, live connector citations, and Docker/Watchtower docs
  • Various bug fixes: double file dialog, chat streaming depth tracking, icon updates, and linting cleanup

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 replaces the BlockNote editor with a new Plate.js-based editor that stores content as markdown (source_markdown) instead of JSON, adds Linear integration with create/update/delete issue capabilities and knowledge base sync, implements Notion KB sync after page updates, enhances report generation with internal KB search strategies, section-level revision, and length constraints, improves the LLM model selector with a dynamic catalogue from OpenRouter, introduces live connector citations for web search results, fixes web scraping to work across all event loops, adds automatic Docker migrations and Watchtower update docs, and includes various UI/UX improvements such as improved PostHog tracking, announcement system refinements, and bug fixes for double file dialogs and chat streaming depth tracking.

⏱️ Estimated Review Time: 3+ hours

💡 Review Order Suggestion
Order File Path
1 surfsense_backend/alembic/versions/101_add_source_markdown_to_documents.py
2 surfsense_backend/app/db.py
3 surfsense_backend/app/utils/blocknote_to_markdown.py
4 surfsense_backend/app/utils/blocknote_converter.py
5 surfsense_web/components/editor/plate-editor.tsx
6 surfsense_web/components/editor/presets.ts
7 surfsense_web/components/editor/plugins/basic-nodes-kit.tsx
8 surfsense_web/components/editor/plugins/fixed-toolbar-kit.tsx
9 surfsense_web/components/ui/editor.tsx
10 surfsense_web/app/dashboard/[search_space_id]/editor/[documentId]/page.tsx
11 surfsense_backend/app/routes/editor_routes.py
12 surfsense_backend/app/routes/notes_routes.py
13 surfsense_backend/app/tasks/celery_tasks/document_reindex_tasks.py
14 surfsense_backend/app/tasks/document_processors/file_processors.py
15 surfsense_backend/app/tasks/document_processors/extension_processor.py
16 surfsense_backend/app/tasks/document_processors/youtube_processor.py
17 surfsense_backend/app/tasks/document_processors/markdown_processor.py
18 surfsense_backend/app/tasks/document_processors/circleback_processor.py
19 surfsense_backend/app/agents/new_chat/tools/linear/__init__.py
20 surfsense_backend/app/connectors/linear_connector.py
21 surfsense_backend/app/services/linear/__init__.py
22 surfsense_backend/app/services/linear/tool_metadata_service.py
23 surfsense_backend/app/services/linear/kb_sync_service.py
24 surfsense_backend/app/agents/new_chat/tools/linear/create_issue.py
25 surfsense_backend/app/agents/new_chat/tools/linear/update_issue.py
26 surfsense_backend/app/agents/new_chat/tools/linear/delete_issue.py
27 surfsense_web/components/tool-ui/linear/create-linear-issue.tsx
28 surfsense_web/components/tool-ui/linear/update-linear-issue.tsx
29 surfsense_web/components/tool-ui/linear/delete-linear-issue.tsx
30 surfsense_backend/app/services/notion/kb_sync_service.py
31 surfsense_backend/app/connectors/notion_history.py
32 surfsense_backend/app/agents/new_chat/tools/notion/update_page.py
33 surfsense_backend/app/agents/new_chat/tools/notion/create_page.py
34 surfsense_backend/app/agents/new_chat/tools/notion/delete_page.py
35 surfsense_web/components/tool-ui/notion/update-notion-page.tsx
36 surfsense_backend/app/agents/new_chat/tools/report.py
37 surfsense_backend/app/agents/new_chat/system_prompt.py
38 surfsense_backend/app/routes/reports_routes.py
39 surfsense_backend/app/schemas/reports.py
40 surfsense_web/components/report-panel/report-panel.tsx
41 surfsense_backend/app/tasks/chat/stream_new_chat.py
42 surfsense_backend/app/agents/new_chat/tools/knowledge_base.py
43 surfsense_web/components/assistant-ui/inline-citation.tsx
44 surfsense_web/components/assistant-ui/markdown-text.tsx
45 surfsense_backend/app/routes/model_list_routes.py
46 surfsense_backend/app/services/model_list_service.py
47 surfsense_backend/app/config/model_list_fallback.json
48 surfsense_web/atoms/new-llm-config/new-llm-config-query.atoms.ts
49 surfsense_web/components/shared/llm-config-form.tsx
50 surfsense_backend/app/connectors/webcrawler_connector.py
51 surfsense_backend/app/agents/new_chat/tools/link_preview.py
52 README.md
53 scripts/docker/entrypoint-allinone.sh
54 surfsense_web/content/docs/docker-installation.mdx
55 surfsense_web/instrumentation-client.ts
56 surfsense_web/app/globals.css
57 surfsense_web/components/homepage/hero-section.tsx
58 surfsense_web/components/announcements/AnnouncementToastProvider.tsx
59 surfsense_web/app/(home)/announcements/page.tsx
60 surfsense_web/lib/announcements/announcements-data.ts
61 surfsense_web/lib/announcements/announcements-utils.ts
62 surfsense_web/hooks/use-announcements.ts
63 surfsense_web/components/assistant-ui/thread.tsx
64 surfsense_backend/pyproject.toml
65 .vscode/launch.json

Need help? Join our Discord

Analyze latest changes

AnishSarkar22 and others added 30 commits February 16, 2026 00:11
…r, refactor list handling and update dependencies
… and Subscript options to InsertToolbarButton for cleaner toolbar functionality
…ton based on read-only state, and adjust dropdown menu styles for better usability
…improved styling for dark mode and better layout management
…out and accessibility, including enhanced styling and conditional rendering
… logic for existing records using a pure-Python BlockNote JSON to Markdown converter
…s with blocknote_document data, ensuring lazy population for others
…atches to reduce memory usage and improve performance
Add a ref-based guard to handleUploadClick that prevents the native file
picker from being triggered a second time when the browser re-dispatches
a click event after the dialog closes. This matches the existing pattern
used in document-upload-popup.tsx for the Upload Documents dialog.
AnishSarkar22 and others added 23 commits February 20, 2026 02:31
- Added startTime and endTime properties to announcements for time-bound visibility.
- Introduced audience targeting to control who sees announcements (all, users, web_visitors).
- Updated related components and hooks to support new announcement features.
- Removed unused state tracking for dismissed announcements to streamline functionality.
- Adjusted padding in the hero section for improved spacing.
- Enhanced text content for clarity and engagement, including updates to the description and call-to-action.
- Commented out the ContactSalesButton for future consideration.
feat: introduce platejs and remove blocknote editor
…the-loop-for-linear-sensitive

[Feat] Add human in the loop for linear sensitive actions
fix: improve report artifact & enhance revision handling
Simplified Announcements and made minor updates to homepage
fix: run alembic migrations unconditionally on startup & add update docs
…apabilities with real-time web query support
@vercel
Copy link

vercel bot commented Feb 21, 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 Feb 21, 2026 6:46am

Request Review

Copy link

@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 b915ae6..4c8a70c

✨ No bugs found, your code is sparkling clean

✅ Files analyzed, no issues (49)

.vscode/launch.json
README.md
scripts/docker/entrypoint-allinone.sh
surfsense_backend/app/agents/new_chat/chat_deepagent.py
surfsense_backend/app/agents/new_chat/system_prompt.py
surfsense_backend/app/agents/new_chat/tools/knowledge_base.py
surfsense_backend/app/agents/new_chat/tools/linear/__init__.py
surfsense_backend/app/agents/new_chat/tools/linear/create_issue.py
surfsense_backend/app/agents/new_chat/tools/linear/delete_issue.py
surfsense_backend/app/agents/new_chat/tools/linear/update_issue.py
surfsense_backend/app/agents/new_chat/tools/link_preview.py
surfsense_backend/app/agents/new_chat/tools/notion/create_page.py
surfsense_backend/app/agents/new_chat/tools/notion/delete_page.py
surfsense_backend/app/agents/new_chat/tools/notion/update_page.py
surfsense_backend/app/agents/new_chat/tools/registry.py
surfsense_backend/app/agents/new_chat/tools/report.py
surfsense_backend/app/celery_app.py
surfsense_backend/app/connectors/linear_connector.py
surfsense_backend/app/connectors/notion_history.py
surfsense_backend/app/connectors/webcrawler_connector.py
surfsense_backend/app/db.py
surfsense_backend/app/routes/__init__.py
surfsense_backend/app/routes/editor_routes.py
surfsense_backend/app/routes/model_list_routes.py
surfsense_backend/app/routes/notes_routes.py
surfsense_backend/app/routes/reports_routes.py
surfsense_backend/app/schemas/__init__.py
surfsense_backend/app/schemas/reports.py
surfsense_backend/app/services/linear/__init__.py
surfsense_backend/app/services/linear/kb_sync_service.py
surfsense_backend/app/services/linear/tool_metadata_service.py
surfsense_backend/app/services/llm_service.py
surfsense_backend/app/services/model_list_service.py
surfsense_backend/app/services/notion/__init__.py
surfsense_backend/app/services/notion/kb_sync_service.py
surfsense_backend/app/tasks/celery_tasks/blocknote_migration_tasks.py
surfsense_backend/app/tasks/celery_tasks/document_reindex_tasks.py
surfsense_backend/app/tasks/chat/stream_new_chat.py
surfsense_backend/app/tasks/connector_indexers/notion_indexer.py
surfsense_backend/app/tasks/document_processors/circleback_processor.py
surfsense_backend/app/tasks/document_processors/extension_processor.py
surfsense_backend/app/tasks/document_processors/file_processors.py
surfsense_backend/app/tasks/document_processors/markdown_processor.py
surfsense_backend/app/tasks/document_processors/youtube_processor.py
surfsense_backend/app/utils/blocknote_converter.py
surfsense_backend/app/utils/blocknote_to_markdown.py
surfsense_backend/app/utils/notion_utils.py
surfsense_backend/pyproject.toml
surfsense_web/.vscode/launch.json

⏭️ Files skipped (123)
  Locations  
surfsense_backend/app/config/model_list_fallback.json
surfsense_backend/uv.lock
surfsense_web/app/(home)/announcements/page.tsx
surfsense_web/app/api/convert-to-blocknote/route.ts
surfsense_web/app/api/convert-to-markdown/route.ts
surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/RowActions.tsx
surfsense_web/app/dashboard/[search_space_id]/editor/[documentId]/page.tsx
surfsense_web/app/dashboard/[search_space_id]/new-chat/[[...chat_id]]/page.tsx
surfsense_web/app/globals.css
surfsense_web/atoms/new-llm-config/new-llm-config-query.atoms.ts
surfsense_web/components.json
surfsense_web/components/BlockNoteEditor.tsx
surfsense_web/components/DynamicBlockNoteEditor.tsx
surfsense_web/components/announcements/AnnouncementToastProvider.tsx
surfsense_web/components/assistant-ui/connector-popup.tsx
surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/baidu-search-api-connect-form.tsx
surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/circleback-connect-form.tsx
surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/elasticsearch-connect-form.tsx
surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/linkup-api-connect-form.tsx
surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/luma-connect-form.tsx
surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/searxng-connect-form.tsx
surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/tavily-api-connect-form.tsx
surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-connect-view.tsx
surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts
surfsense_web/components/assistant-ui/inline-citation.tsx
surfsense_web/components/assistant-ui/markdown-text.tsx
surfsense_web/components/assistant-ui/thread.tsx
surfsense_web/components/editor/editor-save-context.tsx
surfsense_web/components/editor/plate-editor.tsx
surfsense_web/components/editor/plugins/autoformat-kit.tsx
surfsense_web/components/editor/plugins/basic-blocks-kit.tsx
surfsense_web/components/editor/plugins/basic-marks-kit.tsx
surfsense_web/components/editor/plugins/basic-nodes-kit.tsx
surfsense_web/components/editor/plugins/callout-kit.tsx
surfsense_web/components/editor/plugins/code-block-kit.tsx
surfsense_web/components/editor/plugins/dnd-kit.tsx
surfsense_web/components/editor/plugins/fixed-toolbar-kit.tsx
surfsense_web/components/editor/plugins/floating-toolbar-kit.tsx
surfsense_web/components/editor/plugins/indent-kit.tsx
surfsense_web/components/editor/plugins/link-kit.tsx
surfsense_web/components/editor/plugins/list-kit.tsx
surfsense_web/components/editor/plugins/math-kit.tsx
surfsense_web/components/editor/plugins/selection-kit.tsx
surfsense_web/components/editor/plugins/slash-command-kit.tsx
surfsense_web/components/editor/plugins/table-kit.tsx
surfsense_web/components/editor/plugins/toggle-kit.tsx
surfsense_web/components/editor/presets.ts
surfsense_web/components/editor/transforms.ts
surfsense_web/components/editor/utils/escape-mdx.ts
surfsense_web/components/homepage/hero-section.tsx
surfsense_web/components/homepage/navbar.tsx
surfsense_web/components/layout/hooks/useSidebarState.ts
surfsense_web/components/layout/ui/sidebar/SidebarCollapseButton.tsx
surfsense_web/components/markdown-viewer.tsx
surfsense_web/components/new-chat/chat-share-button.tsx
surfsense_web/components/providers/PostHogIdentify.tsx
surfsense_web/components/report-panel/report-panel.tsx
surfsense_web/components/shared/llm-config-form.tsx
surfsense_web/components/tool-ui/index.ts
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/index.ts
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/index.ts
surfsense_web/components/tool-ui/notion/update-notion-page.tsx
surfsense_web/components/ui/block-draggable.tsx
surfsense_web/components/ui/block-list.tsx
surfsense_web/components/ui/block-selection.tsx
surfsense_web/components/ui/blockquote-node.tsx
surfsense_web/components/ui/callout-node.tsx
surfsense_web/components/ui/checkbox.tsx
surfsense_web/components/ui/code-block-node.tsx
surfsense_web/components/ui/code-node.tsx
surfsense_web/components/ui/dropdown-menu.tsx
surfsense_web/components/ui/editor.tsx
surfsense_web/components/ui/equation-node.tsx
surfsense_web/components/ui/fixed-toolbar-buttons.tsx
surfsense_web/components/ui/fixed-toolbar.tsx
surfsense_web/components/ui/floating-toolbar-buttons.tsx
surfsense_web/components/ui/floating-toolbar.tsx
surfsense_web/components/ui/heading-node.tsx
surfsense_web/components/ui/highlight-node.tsx
surfsense_web/components/ui/hr-node.tsx
surfsense_web/components/ui/inline-combobox.tsx
surfsense_web/components/ui/insert-toolbar-button.tsx
surfsense_web/components/ui/link-node.tsx
surfsense_web/components/ui/link-toolbar-button.tsx
surfsense_web/components/ui/link-toolbar.tsx
surfsense_web/components/ui/mark-toolbar-button.tsx
surfsense_web/components/ui/mode-toolbar-button.tsx
surfsense_web/components/ui/paragraph-node.tsx
surfsense_web/components/ui/resize-handle.tsx
surfsense_web/components/ui/separator.tsx
surfsense_web/components/ui/sidebar.tsx
surfsense_web/components/ui/slash-node.tsx
surfsense_web/components/ui/table-icons.tsx
surfsense_web/components/ui/table-node.tsx
surfsense_web/components/ui/toggle-node.tsx
surfsense_web/components/ui/toolbar.tsx
surfsense_web/components/ui/tooltip.tsx
surfsense_web/components/ui/turn-into-toolbar-button.tsx
surfsense_web/content/docs/docker-installation.mdx
surfsense_web/contracts/enums/llm-models.ts
surfsense_web/contracts/enums/llm-providers.ts
surfsense_web/contracts/types/announcement.types.ts
surfsense_web/contracts/types/new-llm-config.types.ts
surfsense_web/hooks/use-announcements.ts
surfsense_web/hooks/use-debounce.ts
surfsense_web/hooks/use-mounted.ts
surfsense_web/hooks/use-platform-shortcut.ts
surfsense_web/instrumentation-client.ts
surfsense_web/lib/announcements/announcements-data.ts
surfsense_web/lib/announcements/announcements-storage.ts
surfsense_web/lib/announcements/announcements-utils.ts
surfsense_web/lib/apis/new-llm-config-api.service.ts
surfsense_web/lib/apis/notes-api.service.ts
surfsense_web/lib/query-client/cache-keys.ts
surfsense_web/next.config.ts
surfsense_web/package-lock.json
surfsense_web/package.json
surfsense_web/pnpm-lock.yaml

@MODSetter MODSetter merged commit 14ab1e4 into main Feb 21, 2026
4 of 7 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.

5 participants