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