v2.1.0

reacherhq/check-if-email-existsv2.1.0Oct 4, 2026by CREDO23

Upgrading?

AI Summary

This release focuses on UI polish, local model enhancements, and the planning of a plugin system. It includes marketing site improvements, direct Anthropic API connections, and various fixes for document handling and chat errors.

Key Highlights

  • Added wordmark, Windows overlay scrollbars, and marketing site polish
  • Connected to Anthropic directly with just an API key
  • Documented and planned the plugin lifecycle
  • Improved document reading and chat error handling

New Features

  • Plugin SDK and lifecycle execution
  • Render thinking trace as markdown
  • Voice podcasts with server audio models
  • Send images to vision chat models

Full Release Notes

## What's Changed
* feat(web,local): add wordmark, Windows overlay scrollbars, and marketing site polish by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/1935
* fix(local): delete an artifact's files when it is deleted as a document by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/1934
* fix(indexing): keep a table's last row when it ends the document by @MohammadHijjawi97 in https://github.com/MODSetter/SurfSense/pull/1936
* fix(export): number nested BlockNote lists on their own by @MohammadHijjawi97 in https://github.com/MODSetter/SurfSense/pull/1937
* feat(local): connect to Anthropic directly with just an API key by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/1933
* docs(architecture): delete Known gaps that v2.0.3 closed by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2014
* docs(documents): record that deleting an artifact document removes its files by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2015
* fix(local): don't offer Retry for model_cannot_run / context_too_long chat errors by @biggdawg320 in https://github.com/MODSetter/SurfSense/pull/2016
* docs(local): propose sending images to vision models in chat by @vintcessun in https://github.com/MODSetter/SurfSense/pull/2031
* [Docs|Plugins] Plan the plugin lifecycle by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2043
* [Docs|Plugins] Release plugins with the app by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2048
* fix(license): answer 503 before Keygen when SMTP config is invalid by @mehul2409 in https://github.com/MODSetter/SurfSense/pull/2047
* feat(local): read one document with its body by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2045
* fix(local): open the issue dialog from About's Report an issue by @MannXo in https://github.com/MODSetter/SurfSense/pull/2026
* fix(local): withdraw a host's egress grant when its last connection is deleted by @8rulerstar in https://github.com/MODSetter/SurfSense/pull/2027
* fix(release): refuse to publish a prerelease desktop version by @MannXo in https://github.com/MODSetter/SurfSense/pull/2025
* fix(local): read a stored license issued ahead of the clock as clock_untrusted by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2019
* fix(local-catalog): log why a broken manifest falls back to empty by @GhostCoder6969 in https://github.com/MODSetter/SurfSense/pull/2017
* fix(models): explain searched build fit failures by @fukalous in https://github.com/MODSetter/SurfSense/pull/2042
* fix(studio): trust the server format catalog by @fukalous in https://github.com/MODSetter/SurfSense/pull/2038
* fix(local): stop a cancelled podcast or office job at the next boundary by @vintcessun in https://github.com/MODSetter/SurfSense/pull/2030
* feat(local): pass a JSON schema from run_model, starting with the quiz by @vintcessun in https://github.com/MODSetter/SurfSense/pull/2032
* fix(studio): translate unavailable reasons as sentences by @fukalous in https://github.com/MODSetter/SurfSense/pull/2036
* fix(local): discard a chat turn that ends with no answer text by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2037
* fix(chat): send no citation rules when retrieval finds nothing by @MONISMALIK1 in https://github.com/MODSetter/SurfSense/pull/2028
* fix(local): read the size in a Featherless-shaped listing row's id by @jamalkamaladdin in https://github.com/MODSetter/SurfSense/pull/2029
* fix(sunset): gate the web redirect on DEPLOYMENT_MODE by @MannXo in https://github.com/MODSetter/SurfSense/pull/2023
* fix(sunset): pause hosted recurring user work by @sb123sb123 in https://github.com/MODSetter/SurfSense/pull/2020
* ci(web): run the surfsense_web unit tests on pull requests by @MannXo in https://github.com/MODSetter/SurfSense/pull/2024
* fix(sunset): include sunset_url in the 410 export-only body by @MannXo in https://github.com/MODSetter/SurfSense/pull/2022
* test(sunset): cover hosted account purge guards by @fukalous in https://github.com/MODSetter/SurfSense/pull/2040
* fix(local): inspect llama.cpp model size at selection by @fukalous in https://github.com/MODSetter/SurfSense/pull/2034
* test(local): run the frontend tests in UTC by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2050
* fix(local): lint formatMessage values that are not written as a literal by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2054
* fix(ui): connect tooltip descriptions to screen readers with role and aria-describedby by @AdamMagued in https://github.com/MODSetter/SurfSense/pull/2018
* fix(local): link license settings to the trial and pricing pages by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2052
* fix(local): keep a model the manifest cannot call out of the pickers and the selection by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2059
* fix(local): give a loopback connection's unknown model the compact prompt by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2051
* fix(local): refuse a curated install that will not fit before any bytes move by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2056
* fix(local): record an install file by file, so a cut-off one is never called installed by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2058
* fix(local): say once on the chat model screen that the runtime is down by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2057
* feat(local): render the thinking trace as markdown by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2049
* test(local): cover a chat reply the client hangs up on by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2041
* fix(local): cap a chat question at its share of the window by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2053
* feat(local): send images to vision chat models, keep upload filenames, drop sources into the panel by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2060
* [Plugins|Manifest] Validate manifest.json by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2069
* [Plugins|Manifest] Accept the stamped version, explain name rules by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2070
* [Plugins|SDK] Add the plugin SDK by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2073
* [Plugins|CLI] Design the author commands by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2075
* [Plugins|SDK] Test the SDK against the real app by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2076
* [Plugins|CLI] Add the author commands by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2079
* [Local|Sources] Reload Sources on document events by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2081
* feat(local): voice podcasts with server audio models by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2083
* [Plugins|Runtime] Run a plugin in its own process by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2082
* [Plugins|Runtime] Stop a run the plugin does not end by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2084
* refactor(local): name the curated fit refusal in llama.cpp's check by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2071
* feat(local): constrain the flashcards reply with a JSON schema by @vintcessun in https://github.com/MODSetter/SurfSense/pull/2074
* feat(local): ground a large Studio selection on every document, by prompt where it has one by @vintcessun in https://github.com/MODSetter/SurfSense/pull/2078
* fix(chat): preserve pre-stream error details by @fukalous in https://github.com/MODSetter/SurfSense/pull/2035
* fix(chat): shield disconnect cleanup by @fukalous in https://github.com/MODSetter/SurfSense/pull/2062
* fix(local-models): refuse gated repo installs by @fukalous in https://github.com/MODSetter/SurfSense/pull/2063
* fix(local-models): skip unchanged preset writes by @fukalous in https://github.com/MODSetter/SurfSense/pull/2064
* fix(desktop): report sidecar crashes by @fukalous in https://github.com/MODSetter/SurfSense/pull/2065
* fix(local-models): explain unpaired projectors by @fukalous in https://github.com/MODSetter/SurfSense/pull/2066
* fix(local-models): reconcile copied gguf files by @fukalous in https://github.com/MODSetter/SurfSense/pull/2067
* fix(local): ask before fetching an image URL from a host the endpoint names by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2072
* docs(proposals): preview source files in the desktop app by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2088
* ci(coderabbit): review pull requests against dev automatically by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2091
* feat(local): show live CPU, RAM and GPU usage above Studio by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2092
* fix(desktop): recommend the Vulkan loader in the Linux deb by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2090
* fix(local): send a curated chat model's publisher temperature by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2085
* fix(license): let support correct a trial's address by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2086
* fix(license): suspend only the license a fully refunded charge paid for by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2087
* fix(license): refuse trial emails on the disposable-email-domains list by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2095
* fix(local): parse images offline, cut OCR errors and speed up Docling by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2096
* docs(proposals): GPU for the document parser by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2097
* fix(export): give each exported document its own path by @MohammadHijjawi97 in https://github.com/MODSetter/SurfSense/pull/2093
* docs(proposals): run the desktop stack in Docker, with CPU and CUDA images by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2098
* docs(proposals): order the Docker work as fourteen runnable steps by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2099
* fix(mcp): bump anyio, cryptography and pyjwt for security advisories by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2115
* fix(sandbox): bump fast-uri, js-yaml and undici in the remotion lockfile by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2116
* fix(whatsapp-bridge): bump sharp, protobufjs, qs and body-parser by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2117
* fix(local): patch pdfjs-dist, undici, urllib3 and other dependency advisories by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2118
* fix(web): patch next, pdfjs-dist and vulnerable transitive dependencies by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2119
* fix(backend): patch dependency advisories with lock bumps and floor raises by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2120
* fix(backend): lift the starlette and pyarrow caps, move transformers to 5 by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2121
* feat(local-backend): read CORS origins from SURFSENSE_LOCAL_CORS_ORIGINS by @qwist1233-cpu in https://github.com/MODSetter/SurfSense/pull/2122
* fix(plugins): stop failing runs queued in the worker's first second by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2129
* feat(desktop): preview PDF sources in-app by @kaaloo in https://github.com/MODSetter/SurfSense/pull/2128
* feat(local): move resource usage into Settings › Resources by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2130
* [Docs|Agent] Settle how opencode runs inside SurfSense by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2133
* [Agent|opencode] Let the agent answer a chat thread by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2135
* docs(sunset): say in both runbooks that the flag needs DEPLOYMENT_MODE=cloud by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2125
* perf(local): reload the Studio list on workspace events instead of polling every 1.5s by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2126
* fix(local): say whether the chosen image model's server is running by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2127
* feat(local): fall back to VITE_API_BASE for the API base by @MannXo in https://github.com/MODSetter/SurfSense/pull/2134
* docs(license): say Keygen ignores the case of metadata keys by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2139
* docs(local): record that the workspace stream leaks a listener per retry by @MODSetter in https://github.com/MODSetter/SurfSense/pull/2140
* fix(workspaces): clean up abort listener on retry timer and return early when aborted by @DYNOSuprovo in https://github.com/MODSetter/SurfSense/pull/2142
* fix(web): state the 18 October 2026 deletion date on /sunset by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2138
* feat(local): show how far the model has read a long prompt by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2144
* feat(local): choose the embedding model in onboarding by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2136
* [Agent|Engine] Give the agent only to models that can call tools by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2150
* feat(local): use a ChatGPT Plus or Pro plan as a chat model by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2151
* [Agent|Engine] Let the developer switch try models newer than the catalog by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2153
* [Agent|Tools] Give the agent SurfSense's search and Studio by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2152
* fix(local): keep a rename or note edit made while a document ingests by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2148
* feat(local): write notes and rename sources from the sources panel by @Cedric921 in https://github.com/MODSetter/SurfSense/pull/2132
* fix(local): stop Chromium's spellchecker from downloading dictionaries by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2145
* feat(local): add a switch to turn thinking off for chat answers by @ybai08 in https://github.com/MODSetter/SurfSense/pull/2143
* feat(local): source preview in the sidebar, grouped settings, Report issue tab, composer add menu by @AnishSarkar22 in https://github.com/MODSetter/SurfSense/pull/2160
* [Agent|Release] Keep opencode off until a model passes the agent test by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2163
* [Web|Lint] Format the files Biome flags on dev by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2165
* [CI|Node] Build the website and the installers on Node 24 by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2162
* [Local|Release] Set the desktop version to 2.1.0 by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2164
* [CI|Release] Run the artifact actions on Node 24 by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2166
* [Local|Release] Release desktop 2.1.0 by @CREDO23 in https://github.com/MODSetter/SurfSense/pull/2167

## New Contributors
* @Cedric921 made their first contribution in https://github.com/MODSetter/SurfSense/pull/1934
* @MohammadHijjawi97 made their first contribution in https://github.com/MODSetter/SurfSense/pull/1936
* @biggdawg320 made their first contribution in https://github.com/MODSetter/SurfSense/pull/2016
* @vintcessun made their first contribution in https://github.com/MODSetter/SurfSense/pull/2031
* @mehul2409 made their first contribution in https://github.com/MODSetter/SurfSense/pull/2047
* @ybai08 made their first contribution in https://github.com/MODSetter/SurfSense/pull/2045
* @MannXo made their first contribution in https://github.com/MODSetter/SurfSense/pull/2026
* @8rulerstar made their first contribution in https://github.com/MODSetter/SurfSense/pull/2027
* @GhostCoder6969 made their first contribution in https://github.com/MODSetter/SurfSense/pull/2017
* @fukalous made their first contribution in https://github.com/MODSetter/SurfSense/pull/2042
* @MONISMALIK1 made their first contribution in https://github.com/MODSetter/SurfSense/pull/2028
* @jamalkamaladdin made their first contribution in https://github.com/MODSetter/SurfSense/pull/2029
* @sb123sb123 made their first contribution in https://github.com/MODSetter/SurfSense/pull/2020
* @AdamMagued made their first contribution in https://github.com/MODSetter/SurfSense/pull/2018
* @qwist1233-cpu made their first contribution in https://github.com/MODSetter/SurfSense/pull/2122
* @kaaloo made their first contribution in https://github.com/MODSetter/SurfSense/pull/2128
* @DYNOSuprovo made their first contribution in https://github.com/MODSetter/SurfSense/pull/2142

**Full Changelog**: https://github.com/MODSetter/SurfSense/compare/v2.0.3...v2.1.0

Related Repositories