Repository navigation
Releases
v2.3.1
Known issues
- Mac users on 2.3.0 or earlier: Your current version can't install this update. Download 2.3.1 from the downloads page and install it. Your data stays as it is. After that, updates install in the app as usual.
- Windows and Linux update in the app as before.
What's Changed
- fix(www): load the homepage without a white band or a heavy footer by @AnishSarkar22 in #2384
- docs(www): write the SurfSense 2.0 user docs on Fumadocs' Spacious layout by @AnishSarkar22 in #2383
- docs(www): ship the 2.0 user docs and the homepage loading fixes by @AnishSarkar22 in #2385
- fix(desktop): install Mac updates over 1 GiB with Electron 44.10.1 by @AnishSarkar22 in #2387
- docs(changelog): v2.3.1 by @AnishSarkar22 in #2388
- chore(local): release 2.3.1 by @AnishSarkar22 in #2389
- [Local|Release] Release desktop 2.3.1 by @AnishSarkar22 in #2390
Full Changelog: v2.3.0...v2.3.1
v2.3.0
Known issues
- Image edits are slow on a processor. Editing an image locally without a graphics card took 11 to 16 minutes in testing, about twice as long as drawing one.
- No GPU in Docker yet. The Docker image runs local models on the processor only.
- A DRM-protected EPUB is not refused at upload. MOBI and AZW3 books with DRM, and KFX books, are refused; an EPUB is not checked for DRM.
What's Changed
- docs(readme): drop the sunset callout and list Reddit and Instagram by @AnishSarkar22 in #2363
- docs(readme): drop the sunset callout and list Reddit and Instagram by @AnishSarkar22 in #2364
- feat(docker): the CPU image with compose and Caddy, its tests, CI and release by @AnishSarkar22 in #2365
- feat(local): send a too-long rewrite's numbers beside its code by @ybai08 in #2290
- fix(local): pull a YouTube live link as its video by @MohammadHijjawi97 in #2359
- test(local): hold a 7B model to the capable prompt by @Trenyx in #2354
- feat(docker): local models, a password set up on first visit, and HTTPS in the image by @AnishSarkar22 in #2368
- fix(local): keep folder uploads going and sign Windows native libraries by @MODSetter in #2367
- feat(sources): MOBI and AZW3 books as sources by @AnishSarkar22 in #2370
- fix(sources): Kindle review follow-ups for the KFX check and HUFF/CDIC code size by @AnishSarkar22 in #2376
- feat(studio): edit an image or infographic into its next version by @AnishSarkar22 in #2377
- fix(studio): images need no egress step, keep an edit's base, fail an unqueued job by @AnishSarkar22 in #2378
- feat(updates): the title bar offers a check for updates on every platform by @AnishSarkar22 in #2379
- chore(local): release 2.3.0 by @AnishSarkar22 in #2380
- test(local): two waits no longer fail on a Windows runner by @AnishSarkar22 in #2381
- [Local|Release] Release desktop 2.3.0 by @AnishSarkar22 in #2382
New Contributors
Full Changelog: v2.2.5...v2.3.0
v2.2.5
Known issues
- Going back to v2.2.4 needs no restore. This release does not change the database.
- Instagram shows what a logged-out visitor sees. A profile or its reels page lists its latest 12, with no Show more, and a post is added without its comments.
What's Changed
- feat(www): license pages in the site design, confetti on a trial or purchase, and v2.2.4 follow-ups by @AnishSarkar22 in #2352
- refactor(local): one core with two entries, and the headless entry for Docker by @AnishSarkar22 in #2353
- feat(usage): see an install's first week and a GPU the runtime cannot reach (usage report 1.1) by @MODSetter in #2355
- fix(local): 14-day trial, dev-only capability summary, and Reddit and Instagram in Add from the web by @AnishSarkar22 in #2356
- chore(local): release 2.2.5 by @AnishSarkar22 in #2357
- fix(analytics): count the 0.0.x rpm as an installer, and name the proxy's refreshes in stable*.yml by @MODSetter in #2360
- [Local|Release] Release desktop 2.2.5 by @AnishSarkar22 in #2358
- fix(release): retry the Mac staple when Apple's ticket service drops the connection by @MODSetter in #2361
- [Local|Release] Release desktop 2.2.5 (Mac staple retry) by @MODSetter in #2362
Full Changelog: v2.2.4...v2.2.5
v2.2.4
Known issues
- The update to v2.2.4 is a full download. Earlier versions download every update whole; updates after this one download only what changed.
- SSE plugins stop working. opencode 2.x speaks Streamable HTTP only. Remove an SSE plugin and add the provider's
/mcpaddress instead.
What's Changed
- docs(changelog): v2.2.3 by @AnishSarkar22 in #2308
- feat(web): a page for every plugin, replacing the scraper pages by @AnishSarkar22 in #2309
- feat(web): v2.2.3 changelog and a page for every plugin by @AnishSarkar22 in #2310
- docs(registry): simpler plugin submission form by @AnishSarkar22 in #2311
- docs(registry): simpler plugin submission form by @AnishSarkar22 in #2312
- docs(proposals): web pages the model writes, for the agent and Studio by @AnishSarkar22 in #2313
- feat(agent): web pages the model writes, for the agent and Studio by @AnishSarkar22 in #2314
- docs: redo the B2B research for file jobs and ship the questionnaire first by @MODSetter in #2315
- docs: ship SurfSense's B2B jobs as paid plugins (ADR 0067) by @MODSetter in #2316
- docs(proposals): add sources from the web through SurfSense's plugins by @CREDO23 in #2325
- docs(proposals): move the agent's runtime to opencode 2.x by @AnishSarkar22 in #2326
- feat(local): add sources from the web through SurfSense's plugins by @CREDO23 in #2328
- feat(agent): move the agent's runtime to opencode 2.1.2 by @AnishSarkar22 in #2329
- fix(plugins): read Reddit and Instagram from their logged-out pages, and list them again by @AnishSarkar22 in #2330
- feat(web): update feed and usage endpoints for the desktop app by @MODSetter in #2318
- feat(web): Individual checkout page, feature build request and a counted download, trial and purchase funnel by @MODSetter in #2319
- fix(privacy): make update, licence and plugin claims match what the app sends by @MODSetter in #2317
- feat(plugin-host): count plugin calls per licence by @MODSetter in #2320
- chore(analytics): daily GitHub release stats and a licence cohort report by @MODSetter in #2321
- feat(desktop): opt-in, ID-less update checks and usage statistics (ADR 0070) by @MODSetter in #2322
- build(desktop): smaller installers and update downloads, with nothing users get changed by @MODSetter in #2323
- docs(proposals): split the legacy stack, license routes and homepage by @AnishSarkar22 in #2332
- build(desktop): a minimal OpenCV, checked call for call against PyPI's by @MODSetter in #2324
- docs(proposals): make backend/ the one backend for the plugins and the license by @CREDO23 in #2335
- feat(local): search a site's own search from Add from the web by @CREDO23 in #2334
- feat(desktop): ship through package managers and one-line install scripts by @MODSetter in #2338
- docs(adr): record the chat-modes decision by @Cedric921 in #2266
- fix(local): keep a parent's count when a Studio Word list nests past level three by @MohammadHijjawi97 in #2331
- feat(backend): one backend for the plugins and the license portal by @CREDO23 in #2337
- ci(legacy-split): remove the self-hosted image workflows from dev by @AnishSarkar22 in #2340
- chore(legacy-split): move the self-hosted stack off dev and split surfsense_web into website by @AnishSarkar22 in #2341
- refactor(www): colocate route code and rename website/ to www/ by @AnishSarkar22 in #2342
- feat(sources): rework the add-from-web dialog around one search box by @AnishSarkar22 in #2343
- docs(readme): add the web-to-web-page demo and caption both videos by @AnishSarkar22 in #2344
- docs(docker): one core with two entries, one CUDA variant, and sign-ins for the Docker image by @AnishSarkar22 in #2346
- feat(desktop): privacy choices as an onboarding step, and updates in the title bar by @AnishSarkar22 in #2347
- docs(changelog): v2.2.4 by @AnishSarkar22 in #2349
- chore(local): release 2.2.4 by @AnishSarkar22 in #2350
- [Local|Release] Release desktop 2.2.4 by @AnishSarkar22 in #2351
Full Changelog: v2.2.3...v2.2.4
v2.2.3
Known issues
- The first start needs free disk space. 2.2.3 upgrades your library database on its first start (migrations 0031 and 0032) and saves a copy of it first. It needs free space about the size of
~/.surfsense/surfsense.db. If there isn't enough, SurfSense closes without a message. Free some space and start it again. - Going back to 2.2.2 needs a manual restore. 2.2.2 can't open a database that 2.2.3 has upgraded. Before you reinstall 2.2.2, quit SurfSense and replace
~/.surfsense/surfsense.dbwith the copy saved at the upgrade,~/.surfsense/backups/0030-0032.db. Ifsurfsense.db-walorsurfsense.db-shmis still there, delete it too. Anything you added after updating won't be in the copy, and that includes sources, chats and notes. If you updated straight from 2.2.1, the copy is0029-0032.db.
What's Changed
- feat(local): use a Claude plan in chat and Agentic mode by @AnishSarkar22 in #2294
- docs(proposals): render Mermaid diagrams in the desktop app by @Cedric921 in #2296
- perf(local): scans and photos read by OCR alone before Docling: RapidOCR, Vision on a Mac by @MODSetter in #2295
- ci(local): keep the macOS certificate off Windows and check Apple's credentials before every build by @Cedric921 in #2265
- feat(local): show where SurfSense keeps its data in Settings › About by @Cedric921 in #2298
- fix(plugins): say why a sign-in failed by @samuelmbabhazi in #2267
- fix(local): count each numbered list in a Studio Word file from 1 by @MohammadHijjawi97 in #2287
- fix(local): sort llama.cpp's shared-cache overflow as runtime_busy by @MohammadHijjawi97 in #2299
- feat(plugins): connect any remote MCP server, through SurfSense's gateway by @AnishSarkar22 in #2302
- chore(registry): mark Notion as verified by @AnishSarkar22 in #2303
- feat(web): press feedback on marketing buttons by @AnishSarkar22 in #2304
- ci(registry): open submission pull requests with GITHUB_TOKEN and start their checks by @AnishSarkar22 in #2306
- [Local|Release] Release desktop 2.2.3 by @AnishSarkar22 in #2307
New Contributors
- @samuelmbabhazi made their first contribution in #2267
Full Changelog: v2.2.2...v2.2.3
v2.2.2
2.2.2 makes sources usable seconds after you add them, and adds speech recognition that runs on this computer: recordings become sources, and a mic in the composer turns your voice into text. PDFs with a text layer and Word files no longer wait on Docling, and on x64 Windows and Linux the bundled embedder runs at full precision, about 6 times as fast on our Windows test PC. In our tests on one Windows PC, the mean time from adding a file to it being ready fell from 476 s to 44 s across 231 real files. In Agentic chats, plugins get ready sooner, one plugin that hangs no longer takes the others with it, and each tool's permission is a choice of three. This release upgrades the library database, so read Known issues before updating.
Highlights
- Sources are ready in seconds. A PDF made on a computer is read from its own text layer, and Docling reads only a PDF's scanned or picture pages. A 46-page budget PDF was ready in about 9 s instead of about 2 minutes. Word files have their own reader, about 9 times as fast, with numbering that matches Word and searchable footnotes. On x64 Windows and Linux the bundled embedding model runs at full precision, about 6 times as fast on our Windows test PC. Long scans give way to new uploads and notes, and Cancel stops them within 8 pages. (#2289)
- Speech recognition on this computer. Add
.wav,.mp3,.flac,.oggor.ogarecordings as sources, and SurfSense transcribes them, with a time at the start of each passage. A mic beside Send in every chat turns your voice into text, and nothing goes to an online service. Settings › Speech recognition offers Nemotron 3.5 ASR Streaming 0.6B (931 MB, 26 languages, detects the language) and Canary 180M Flash (249 MB, English, German and French). (#2264, #2273) - Plugins get ready sooner, and one bad plugin no longer stops the rest. Plugins are prepared while your sources sync, where a cold chat with 8 plugins used to spend about 2 to 9 s on them first. A plugin that hangs shows "Couldn't reach" with its name after 25 s, and the others keep working. SurfSense's own plugins are faster and give the agent each result's data, and Amazon search returns products again. (#2260, #2291, #2262)
- Three permissions per tool, and plugin search. In a plugin's details each tool is Always allowed, Needs approval or Blocked, and each group has a menu that sets every tool at once. Settings › Plugins has a Search plugins box that looks through Yours and Browse together. (#2270, #2256)
- License status updates at once. Importing, replacing or removing a license updates SurfSense's paid plugins right away, and a plugin your license doesn't unlock is no longer offered after
@or given to the agent. (#2261) - Use your ChatGPT plan in one click. A new row below Use a server, in Settings › Text gen › Add model and in onboarding, signs in with a ChatGPT Plus or Pro plan. (#2259)
- Podcasts as MP3. Studio's Podcast saves the episode as MP3, about a sixth of the size of the WAV it used to be. (#2183)
- Failures that say so. A reply that the model's server cuts off with an error now fails with Retry instead of being saved as a finished answer. An agent that keeps crashing is retried after 10 s and 20 s, then stops with one "The agent stopped" notification, and Agentic chats fail at once instead of after a minute. (#2170, #2235)
Known issues
- The first start needs free disk space. 2.2.2 upgrades your library database on its first start and saves a copy of it first. It needs free space about the size of
~/.surfsense/surfsense.db. If there isn't enough, SurfSense closes without a message. Free some space and start it again. - Going back to 2.2.1 needs a manual restore. 2.2.1 can't open a database that 2.2.2 has upgraded. Before you reinstall 2.2.1, quit SurfSense and replace
~/.surfsense/surfsense.dbwith the copy saved at the upgrade,~/.surfsense/backups/0029-0030.db. Ifsurfsense.db-walorsurfsense.db-shmis still there, delete it too. Anything you added after updating won't be in the copy, and that includes sources, recordings, chats and notes. If you updated straight from 2.2.0, the copy is0027-0030.db. To get back the speech model's disk space, delete the model in Settings › Speech recognition first. - Sources you already have aren't read again. PDF and Word sources added before 2.2.2 keep their earlier reading, and nothing is re-indexed. To get the new reading, delete the source and add it again.
- Figures come after the text. A PDF read from its text layer, or a Word file with images, gets its figures in a background pass after it shows as ready. A PDF over 40 pages, or one whose charts are drawn as lines, gets them only when the agent or Studio asks. Until then the agent is told to ask again in a minute, and a Studio draft places no figures from that source. The pass keeps the CPU busy for a few minutes after your sources are ready, and a model running on this computer shares the CPU with it.
- PDFs read from their text layer are plain text. They have no headings, and a table becomes lines of values without columns, which is what citations show.
- Scans are as slow as before. A scanned PDF is still read by Docling, so a 20-page scan takes about as long as it did, and a long reading shows no progress in Sources.
- No faster embedding on Macs. The macOS build is arm64 only, and its embedding model runs as before. The new PDF and Word readers still apply.
- Some recording formats can't be added yet. Opus (in
.ogg,.ogaor.opusfiles),.m4a,.aacand.webmaren't supported, and many apps save voice notes as Opus. A file can be up to 500 MB. A recording can't be played, and a citation can't open it at its time. - Speech recognition needs a download and free memory. The model is a one-time download of 931 MB or 249 MB. Loading it needs about 2.9 GB of free memory for Nemotron or 1.9 GB for Canary, which a busy 8 GB computer may not have.
- Tell Canary the language you speak. Canary can't detect the language, and set to the wrong one it may write English instead of a transcript. It doesn't offer Spanish yet. One Spoken language covers both recordings and voice input.
- Voice input uses your default microphone, with no choice of device. If the speech recognition engine crashes, the notice reads "A background service stopped" and asks you to restart, though SurfSense restarts it by itself.
- Three plugin tools turn off once. With the plugin host update, YouTube's
scrapeandcommentsand TikTok'sscrapehave new descriptions, so they're marked Changed and stay off until you allow them again in the plugin's details. This happens in 2.2.1 too. Google Search now returns 4 to 9 People Also Ask questions instead of 9 to 12. - Notion has more tools than a chat gives the agent. Notion lists 39 tools, and a chat gives the agent the first 24 plugin tools plus every tool of a plugin you mention. Type
@notionwhen you want the agent to use it.
Turning the new readers off
Each is an environment variable with no setting in the app. Set one and restart SurfSense.
SURFSENSE_LOCAL_PDF_TEXT_LAYER=offsends every PDF to Docling whole again.SURFSENSE_LOCAL_DOCX_READER=doclingreads Word files with Docling again, which keeps their figures at ingest.SURFSENSE_LOCAL_EMBED_PRECISION=fp16runs the bundled embedder as shipped, without the FP32 speed-up.
What's Changed
- docs(proposals): local speech recognition by @MODSetter in #2254
- docs(plugins): remote plugins move from proposal to architecture, with a guide to listing one by @AnishSarkar22 in #2255
- feat(plugins): search connected and listed plugins together by @AnishSarkar22 in #2256
- feat(registry): Verified by maintainers, and CI connects to each new or changed plugin by @AnishSarkar22 in #2257
- feat(registry): DeepWiki as Verified, and Notion listed by @AnishSarkar22 in #2258
- feat(models): sign in with a ChatGPT plan in one click, beside Use a server by @AnishSarkar22 in #2259
- fix(plugins): a paid plugin's license verdict shows at once, from the plugin host by @AnishSarkar22 in #2261
- feat(web): redesign the marketing site by @AnishSarkar22 in #2263
- feat(local): local speech recognition, for recordings as sources and voice input by @MODSetter in #2264
- perf(plugins): make the scraper plugins fast, and let the agent read their results by @MODSetter in #2262
- perf(agent): get plugins ready beside the sync, and stop waiting on the plugin check by @MODSetter in #2260
- feat(local): give a refine's refusals codes the interface can translate by @ybai08 in #2247
- ci(desktop): run desktop tests on pushes to dev, and on Windows and macOS by @MannXo in #2240
- feat(local): generate third-party notices at build time by @Cedric921 in #2185
- feat(local): three-way tool permissions, one shared Button, nested dialogs that block by @AnishSarkar22 in #2270
- fix(local): name Visual Studio's generator when compiling audio.cpp on Windows by @MODSetter in #2271
- docs(import): align thread recovery documentation by @fukalous in #2248
- feat(local): encode a podcast episode as MP3 by @Cedric921 in #2183
- fix(local): ...
v2.2.1
Highlights
- Plugins in Agentic chats. In Settings › Plugins you can connect three kinds of plugin: SurfSense's own (Google Search, Web Crawl, YouTube, TikTok, Google Maps, Amazon, Walmart and Indeed, which need a SurfSense license), third-party ones from a signed list once you allow them, or any remote MCP server by its URL. You choose which tools the agent may use and which ones ask first. (#2234, #2245, #2249)
- Interrupted imports get their chats back. Importing a SurfSense cloud export again now adds the chats an interrupted import missed. (#2068)
- Agentic chats stay in their own folders, even when your data folder sits inside a git repository. (#2239)
- Studio builds PowerPoint and Excel files in the script runner, as it already did for Word and PDF, so Stop now ends a running script. (#2184)
- The Word viewer refits when you resize its panel. (#2233)
- More messages in your language: Studio jobs that can't start, run again or stop, and the reason an embedding model can't be used. (#2241, #2209, #2217)
Known issues
- The first start needs free disk space. 2.2.1 upgrades your library database on its first start and saves a copy of it first. It needs free space about the size of
~/.surfsense/surfsense.db. If there isn't enough, SurfSense closes without a message. Free some space and start it again. - Going back to 2.2.0 needs a manual restore. 2.2.0 can't open a database that 2.2.1 has upgraded. Before you reinstall 2.2.0, quit SurfSense and replace
~/.surfsense/surfsense.dbwith the copy saved at the upgrade,~/.surfsense/backups/0027-0029.db. Anything you added after updating won't be in it, and that includes connected plugins. - Plugins work only in Agentic chats. Pick Agentic when you start the chat. Chats on a model that runs on this computer start in Basic (Q&A), and Basic chats don't use plugins.
- SurfSense's own plugins need a SurfSense license. Google Search, Web Crawl, YouTube, TikTok, Google Maps, Amazon, Walmart and Indeed run on plugins.surfsense.com. Without a license they still connect but show "Needs a license". A chat that can't use one of them says it needs sign-in, not a license.
- Reddit and Instagram aren't offered. Both sites now refuse anonymous reads, so their plugins are left out for now.
- Some plugin results are unreliable. TikTok's user search works only some of the time. When Amazon, Walmart or YouTube blocks a request, the plugin doesn't report a failure, so the agent may say nothing was found. A deep Web Crawl, or a Google Search over many queries or pages, can time out.
- Third-party and custom plugins are early. They stay off until you turn on Allow third-party plugins in Settings › Plugins. So far the list holds one Community plugin, DeepWiki. Signing in to a plugin with an account (OAuth) hasn't been tried with a real provider yet, and when a sign-in fails the app doesn't say why. You can't add a plugin that runs as a local command, such as
npxoruvx. - Importing again won't add chats to a workspace you imported before 2.2.1. 2.2.1 brings back the chats an interrupted import missed (#1958). In a workspace that already holds chats from an earlier version's import, though, importing again only matches the chats that are already there. To get the rest, keep your export ZIP, delete that workspace and import the ZIP again.
What's Changed
- docs(plugins): one plugin host, two plugin lists, bundle code moved aside by @AnishSarkar22 in #2216
- refactor(sidecars): move boot and the watchers out of index.ts by @llwand1 in #2215
- feat(local): give an embedder repo's refusal a code the interface can translate by @ybai08 in #2209
- fix(local): run Studio's PowerPoint and Excel scripts in the script runner by @Cedric921 in #2184
- docs: cover the work since 2.1.0, and commit the sweep's input by @MODSetter in #2231
- feat(plugins): remote MCP plugins, SurfSense's scraper plugins and the third-party registry by @AnishSarkar22 in #2234
- feat(local): give an embedder's failed search check a code the interface can translate by @ybai08 in #2217
- ci(release): run the frozen document-script test against the worker each OS ships by @MannXo in #2238
- fix(studio): refit the Word viewer when its panel is resized by @MannXo in #2233
- feat(plugins): browse, connect and manage plugins, with Verified or Community publishers by @AnishSarkar22 in #2245
- test(local): hold host memory still where repricing must leave the preset alone by @ybai08 in #2242
- fix(import): resume missing chat threads by @fukalous in #2068
- fix(agent): keep a git repository above the data folder from becoming opencode's project by @MannXo in #2239
- fix(local): ship llama.cpp's own licence on Windows, and OpenMP's under its name by @MODSetter in #2246
- feat(local): give Studio's job refusals codes the interface can translate by @ybai08 in #2241
- docs(local): propose keyword search for Japanese and Chinese by @vintcessun in #2147
- fix(plugins): get the plugin host ready for plugins.surfsense.com by @MODSetter in #2249
- fix(registry): trust a new signing key, one the maintainer holds by @MODSetter in #2250
- fix(plugins): keep a log record's arguments when redacting it by @MODSetter in #2251
- fix(plugins): read the first-party list as UTF-8 on every system by @MODSetter in #2253
- [Local|Release] Release desktop 2.2.1 by @MODSetter in #2252
New Contributors
Full Changelog: v2.2.0...v2.2.1
v2.2.0
Known issues
- The first start needs free disk space. 2.2.0 upgrades your library database on its first start and saves a copy of it first, so it needs free space about the size of
~/.surfsense/surfsense.db. If there isn't enough, SurfSense closes without a message. Free some space and start it again. - Going back to 2.1.0 needs a manual restore. 2.1.0 can't open a database that 2.2.0 has upgraded. Before reinstalling 2.1.0, quit SurfSense and replace
~/.surfsense/surfsense.dbwith the copy saved at the upgrade,~/.surfsense/backups/0023-0027.db. - An interrupted import from the hosted web app can miss chats. If an import stops part-way, importing the same export again doesn't bring in the chats it missed (#1958). Keep your export ZIP, delete the imported workspace, and import the ZIP again.
What's Changed
- fix(export): strip every citation marker form from exported chats by @MohammadHijjawi97 in #2094
- test(license): cover the portal routes, their rate limits and Keygen by @Cedric921 in #2123
- fix(local): keep a model installed when a server still holds its file open by @ybai08 in #2124
- fix(local): announce a finished reply and name the conversation by @Cedric921 in #2131
- fix(local): tell a dead pin and a checksum mismatch apart in installs by @DidusOleh in #2137
- feat(local): give a Studio format's unavailable reason a code to translate by @ybai08 in #2146
- fix(desktop): retry the staging rename while Windows holds the folder by @DevSchretl in #2161
- docs(local): say the bundled embedder is FP16, with its measured size and speed by @ybai08 in #2158
- fix(local): refuse a chat turn whose images outgrow the model's window by @Cedric921 in #2154
- fix(local): revoke the ChatGPT refresh token on sign-out and delete by @Cedric921 in #2156
- test(local): cover how host memory is read from the OS by @Cedric921 in #2157
- feat(local): give install events a code the interface can translate by @ybai08 in #2168
- File agent: folders, PowerPoint and Excel, templates, per-chat folders, inline previews and model capability levels by @MODSetter in #2177
- feat(chat): keep chat and agent replies running in the background by @AnishSarkar22 in #2179
- feat(sources): tidy the sources panel and rebuild its drag and drop by @AnishSarkar22 in #2180
- [Local|Cache] Let the model reuse the start of every prompt by @CREDO23 in #2178
- feat(studio): downloadable Markdown documents and a floating Refine box by @AnishSarkar22 in #2190
- refactor(local): drop the disk-space error wrapper nothing sends a body for by @ybai08 in #2169
- test(local): keep the PDF letters test passing on a computer with no CJK font by @ybai08 in #2186
- fix(local): say the database copy failed when removing its partial file fails too by @ybai08 in #2187
- test(local): upload each file under its own name when its path uses backslashes by @ybai08 in #2188
- fix(agent): commit before a sync waits for its thread's lock by @ybai08 in #2189
- fix(local): offer a new chat when an agent thread's model cannot run it by @Cedric921 in #2175
- feat(local): send a curated chat model's publisher top_p, top_k and min_p by @Cedric921 in #2182
- refactor(local): hold the Studio list in TanStack Query so open artifacts refresh too by @Cedric921 in #2176
- feat(local): call each remote model on its own route, and run the agent on a ChatGPT plan by @AnishSarkar22 in #2192
- feat(local): add Qwen3.8 27B to the curated chat models by @AnishSarkar22 in #2193
- File agent: edit users' files as tracked changes, Office support, PDF tools and data analysis by @MODSetter in #2194
- Resizable sidebars, comments in the Word viewer, and small models reading the ticked file by @MODSetter in #2195
- Smooth streaming: render only the live reply, and stop the code-highlight leak by @MODSetter in #2197
- ci(local): gate build-sdcpp on the staged sd-server generating an image by @ybai08 in #2159
- perf(models): debounce model search and cache Hugging Face results by @Ehaan-Dadarkar in #2198
- feat(local): give a fit badge a code the interface can translate by @ybai08 in #2191
- fix(local): retire the pre-host egress grants in revision 0027 by @8rulerstar in #2061
- test(local): do not count what macOS gives every process as a leak into a script by @ybai08 in #2199
- feat(proxy): add NodeMaven provider by @alkaz-nodemaven in #2196
- Basic (Q&A) and Agentic modes, a 270-model tested list, and the agent in installers by @MODSetter in #2207
- test(local): wait for the error tooltip to close, not for its text to change by @ybai08 in #2201
- docs(local): name the 0027 migration test in data-model.md by @8rulerstar in #2202
- fix(local): offer no thinking switch in an agent thread by @Cedric921 in #2173
- fix(local): revoke the grant a ChatGPT sign-in replaces by @Cedric921 in #2174
- feat(local): give a model that cannot run a code the interface can translate by @ybai08 in #2200
- perf(models): follow-ups to search debounce and cache by @Ehaan-Dadarkar in #2204
- feat(desktop): route main process warnings into the session log by @Ehaan-Dadarkar in #2205
- test(local): find the office pack's staging folder on macOS too by @ybai08 in #2208
- docs(plugins): redesign plugins as MCP servers behind one tool gateway by @AnishSarkar22 in #2206
- feat(chat): simplify the composer's mode menus and hide model capability tags in production by @AnishSarkar22 in #2211
- docs(readme): a shorter README led by the format table, translated into ten languages by @MODSetter in #2212
- [Local|Release] Release desktop 2.2.0 by @MODSetter in #2214
New Contributors
- @DidusOleh made their first contribution in #2137
- @DevSchretl made their first contribution in #2161
- @Ehaan-Dadarkar made their first contribution in #2198
- @alkaz-nodemaven made their first contribution in #2196
Full Changelog: v2.1.0...v2.2.0
v2.1.0
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 https://github.com/MODSet...
v2.0.3
What's Changed
- fix(sunset): gate sunset mode on cloud deployment and keep PATs working through the wind-down by @AnishSarkar22 in #1815
- Release 2.0.2: move Latest to 2.x, bridge legacy updaters, permalink downloads by @MODSetter in #1816
- [Docs|Plugins] Plan the plugin system by @CREDO23 in #1817
- feat(local): replace Ollama with a bundled llama.cpp runtime, a curated GGUF catalog, and a hardware-aware fit estimator by @AnishSarkar22 in #1819
- feat(llm): llama.cpp runtime: warm loads, per-layer KV pricing, one Hugging Face consent, manifest order over ranks by @AnishSarkar22 in #1820
- [Docs|Models] Plan the model catalog by @CREDO23 in #1899
- [Docs|Models] Mark what the model catalog replaces by @CREDO23 in #1900
- refactor(llm): one model catalog, starting with the remote side by @CREDO23 in #1901
- feat(llm): rework the local model catalog around pinned builds and one row shape by @AnishSarkar22 in #1902
- feat(local-ui): rebuild model settings as per-type sections with local and server models grouped together by @AnishSarkar22 in #1904
- [LLM|Models] Serve image models from the local catalog by @CREDO23 in #1903
- feat(local): run sd-server in dev and give image models chat's download states by @AnishSarkar22 in #1905
- feat(local-ui): add chat and image model steps to onboarding, with server dialogs and a logo loader by @AnishSarkar22 in #1906
- [LLM|Audio] Voice podcasts on audio.cpp by @CREDO23 in #1907
- feat(local-ui): bring audio models in line with chat and image, and add an audio onboarding step by @AnishSarkar22 in #1908
- [LLM|Models] Ship the local model manifest in the Studio worker by @CREDO23 in #1910
- [LLM|Audio] Ship Kokoro as the default podcast voice by @CREDO23 in #1909
- feat(local): translate the desktop app into Japanese and German, open without a broken chat model, and add a dev app identity by @AnishSarkar22 in #1911
- feat(local): add the chat eval, judge its runs, and fix the compact chat prompt by @MODSetter in #1912
- feat(local): measure retrieval, then rank on both legs by @MODSetter in #1913
- fix(local): keep a word's combining marks when the keyword index splits text by @MODSetter in #1915
- fix(search): score every candidate on its own cosine by @MODSetter in #1916
- [LLM|Models] Add image editing, video and more image models by @CREDO23 in #1914
- ci: split CI into one workflow per product and keep only repo-wide checks shared by @AnishSarkar22 in #1917
- fix(local): renumber the sd.cpp migration to 0018 by @AnishSarkar22 in #1918
- feat(local): reorder onboarding and Settings model steps, and fix clipped UI in longer languages by @AnishSarkar22 in #1919
- [LLM|Chat] Show a thinking model's reasoning while it answers by @CREDO23 in #1920
- [LLM|Studio] Stop the model on cancel and turn thinking off by @CREDO23 in #1921
- refactor(local-ui): move the desktop frontend from Radix UI to Base UI by @AnishSarkar22 in #1922
- feat(local): podcast voice and language pickers, scroll-fade and checkbox polish by @AnishSarkar22 in #1923
- feat(local): add an About section to settings and re-sync UI components to base-nova by @AnishSarkar22 in #1924
- fix(local): make room for local image and podcast generation by @MODSetter in #1925
- feat(local): report issues with this session's log by @MODSetter in #1926
- feat(local): macOS Help menu, update check, window restore and thinking header redesign by @AnishSarkar22 in #1927
- fix(local): fade dialogs out with their content, nest app-wide dialogs, hide servers for audio by @AnishSarkar22 in #1929
- feat(local): make model installs jobs the API owns by @AnishSarkar22 in #1930
- [Local|Packaging] Fail pnpm dist on a missing toolchain, with the install command by @CREDO23 in #1928
- fix(local): read the model manifests as UTF-8 on Windows by @AnishSarkar22 in #1931
- [Local|Release] Release desktop 2.0.3 by @CREDO23 in #1932
Full Changelog: v2.0.2...v2.0.3