Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
331 commits
Select commit Hold shift + click to select a range
6878122
Merge branch 'dev' of github.com:MODSetter/SurfSense into docs/chat-m…
Cedric921 Oct 22, 2026
4916db0
fix(egress): say an update check reads the releases feed and GitHub's…
MODSetter Oct 22, 2026
f5ff0c8
test(updates): pin the install-ID override through electron-updater's…
MODSetter Oct 22, 2026
2685581
docs(plugin-host): say which web addresses the log redaction cuts
MODSetter Oct 22, 2026
183b562
fix(web): say on the activation guide that the paid plugins send the …
MODSetter Oct 22, 2026
6dcead7
fix(privacy): say each update request sends the IP address, not both
MODSetter Oct 22, 2026
f802bb9
fix(usage): ask again for consent just before a usage report is posted
MODSetter Oct 22, 2026
804bd05
fix(updates): say only which update hosts failed, so Settings does no…
MODSetter Oct 22, 2026
e128589
test(usage): pin the local summary request and its silent failures
MODSetter Oct 22, 2026
7cbaa5d
docs(electron): say Check now is refused while a policy turns updates…
MODSetter Oct 22, 2026
a361ba5
fix(web): send download links to Latest while their tag is unpublished
MODSetter Oct 22, 2026
22bec95
fix(updates): retry a day's automatic check that read no manifest
MODSetter Oct 22, 2026
471ccba
build(desktop): freeze the API and the worker into one backend binary
MODSetter Oct 22, 2026
d85db88
docs(privacy): say which server counts carry the channel, and that th…
MODSetter Oct 22, 2026
51c34e3
fix(web): say Stripe checkout also asks for payment details
MODSetter Oct 22, 2026
bc79ba5
fix(pricing): drop the passed early-bird window and limit build reque…
MODSetter Oct 22, 2026
774e55b
fix(web): give a new-tab checkout the channel checkout_started counted
MODSetter Oct 22, 2026
81bc227
docs(license): record the Payment Link settings the checkout page rel…
MODSetter Oct 22, 2026
2df4406
fix(updates): show the User-Agent in the last request and send no Acc…
MODSetter Oct 22, 2026
703ef6f
feat(usage-statistics): count agent turns, plugin calls and answering…
MODSetter Oct 22, 2026
28636ec
feat(usage-statistics): add the local usage summary endpoint
MODSetter Oct 22, 2026
73b0e6e
feat(links): say which place in the app a surfsense.com visit came from
MODSetter Oct 22, 2026
2aa3a45
feat(privacy-choices): show and switch update checks and usage statis…
MODSetter Oct 22, 2026
1e43478
feat(onboarding): ask a new install about update checks and usage sta…
MODSetter Oct 22, 2026
fa3ed27
docs(adr): 0068, record opt-in, ID-less update checks and usage stati…
MODSetter Oct 22, 2026
a141c90
fix(web): say what the app's opt-in update checks and usage statistic…
MODSetter Oct 22, 2026
d440994
build(desktop): smaller updates, a trimmed eSpeak and a lighter dmg a…
MODSetter Oct 22, 2026
2c2c516
fix(desktop): strip Linux symbols around the libraries auditwheel rew…
MODSetter Oct 22, 2026
bfffd27
fix(usage-statistics): count an answer only once a reply has text
MODSetter Oct 22, 2026
4a5981d
fix(privacy-choices): name every host an update reaches, and the user…
MODSetter Oct 22, 2026
d42d159
fix(onboarding): go on past the privacy step when its state cannot be…
MODSetter Oct 22, 2026
2a17bdf
fix(web): scope the new update checks to 2.2.4 and stop overstating a…
MODSetter Oct 22, 2026
912b03c
docs(usage-statistics): say what can single an install out, and list …
MODSetter Oct 22, 2026
95550cd
Merge branch 'feat/desktop-telemetry-main' into feat/desktop-telemetry
MODSetter Oct 22, 2026
557a538
Merge origin/dev into feat/desktop-telemetry
MODSetter Oct 22, 2026
b34dfc4
docs(plugin-host): list the meter's tests beside the plugins' tests
MODSetter Oct 22, 2026
31356d1
docs(license): keep the cohort report's tests and gap apart from the …
MODSetter Oct 22, 2026
96dcf45
fix(desktop): keep library asserts, name extensions by their import path
MODSetter Oct 22, 2026
908f5b2
fix(desktop): keep the installed version's own update blockmap on Win…
MODSetter Oct 22, 2026
4b538a0
docs(updates): say a check that reads no manifest is tried again that…
MODSetter Oct 22, 2026
d6b48e4
fix(usage-statistics): count a plugin call only once it reaches the p…
MODSetter Oct 22, 2026
dd9e796
fix(plugin-host): keep a URL's query hidden when it holds an apostrophe
MODSetter Oct 22, 2026
694fb51
Merge branch 'fix/privacy-claims' into feat/desktop-telemetry
MODSetter Oct 22, 2026
3ddcdbe
fix(usage-statistics): count a plugin call once the plugin first answ…
MODSetter Oct 22, 2026
c601323
fix(desktop): keep a Linux library unstripped when strip would misali…
MODSetter Oct 22, 2026
0edb839
build(desktop): set installer budgets to this branch's measured sizes
MODSetter Oct 22, 2026
997ec54
build(desktop): a minimal OpenCV, checked call for call against PyPI's
MODSetter Oct 22, 2026
b475895
build(desktop): build OpenCV for Windows on windows-2022
MODSetter Oct 22, 2026
b087776
build(desktop): lower installer budgets to the minimal OpenCV's sizes
MODSetter Oct 22, 2026
d63dcac
docs(proposals): move the agent's runtime to opencode 2.x
AnishSarkar22 Oct 22, 2026
0524ccb
ci: skip every tsconfig*.json in the JSON check
MODSetter Oct 22, 2026
f86b675
Merge branch 'chore/installer-size' into chore/installer-size-opencv
MODSetter Oct 22, 2026
eab133d
docs: name the bundle inputs where proposals still named the old specs
MODSetter Oct 22, 2026
69016f8
Merge branch 'chore/installer-size' into chore/installer-size-opencv
MODSetter Oct 22, 2026
86cfdee
docs(proposals): add sources from the web through SurfSense's plugins
CREDO23 Oct 22, 2026
8c0ad2a
Merge pull request #2325 from CREDO23/feat/local-web-sources
CREDO23 Oct 22, 2026
6d8b66e
feat(local): let the API call a tool on SurfSense's own plugins
CREDO23 Oct 22, 2026
7a07114
feat(local): pull a link through the plugin that knows its site
CREDO23 Oct 22, 2026
5a3fb58
feat(local): search Google, open links and add them as sources in the…
CREDO23 Oct 22, 2026
b1f1c78
feat(local): add sources from the web from one box in the sources menu
CREDO23 Oct 22, 2026
23d0cd2
docs(local): describe sources from the web, and retire its proposal
CREDO23 Oct 22, 2026
df6e81a
docs(proposals): settle the opencode engine's tool policy
AnishSarkar22 Oct 22, 2026
5b931ba
docs(proposals): size the opencode agent's tools by measured retrieval
AnishSarkar22 Oct 22, 2026
d6aa122
docs(proposals): use opencode's runtime MCP route and todo key on pur…
AnishSarkar22 Oct 22, 2026
0aff5c4
docs(proposals): show loaded tools as agent steps, never as errors
AnishSarkar22 Oct 22, 2026
60771e6
docs(proposals): drop SSE entirely and move installed SSE plugins to …
AnishSarkar22 Oct 22, 2026
0f9bf6d
docs(proposals): accept the opencode 2.x proposal
AnishSarkar22 Oct 22, 2026
1f4c092
Merge pull request #2326 from AnishSarkar22/feat/opencode-v2
AnishSarkar22 Oct 22, 2026
756a840
feat(agent): stage and launch opencode 2.1.2
AnishSarkar22 Oct 22, 2026
e4f5bb9
feat(agent): speak opencode 2.x's server API
AnishSarkar22 Oct 22, 2026
58bd4c6
feat(agent): write opencode's configuration in 2.x's own keys
AnishSarkar22 Oct 22, 2026
6e6bea6
fix(local): give the plugins queue its own worker, so links get pulled
CREDO23 Oct 22, 2026
5efb981
fix(local): show each list as its own panel and keep Show more in reach
CREDO23 Oct 22, 2026
54445f9
feat(local): keep a YouTube video's likes, and record its transcript gap
CREDO23 Oct 22, 2026
d923f97
fix(local): show a list's item once when the list moved between pages
CREDO23 Oct 22, 2026
d1fcef6
feat(agent): give plugins to opencode 2.x and drop SSE
AnishSarkar22 Oct 22, 2026
0411bfe
fix(agent): name Claude Code's file steps as 2.x does, and move the a…
AnishSarkar22 Oct 22, 2026
03aa3cf
feat(agent): keep opencode 2.x from retrying SurfSense's own refusals
AnishSarkar22 Oct 22, 2026
e47703e
feat(agent): read threads from opencode 1.x on 2.x
AnishSarkar22 Oct 22, 2026
0f99af5
fix(local): fail a pull whose plugin answer cannot be read
CREDO23 Oct 22, 2026
930e8c4
fix(local): answer license_refused when the host refuses a list's lic…
CREDO23 Oct 22, 2026
37945be
fix(local): list links added together newest first
CREDO23 Oct 22, 2026
ffb006e
fix(local): let a list be opened again after a new search
CREDO23 Oct 22, 2026
55fecde
fix(local): drop a list that answers after a new search
CREDO23 Oct 22, 2026
2c85dfb
fix(local): let a list that failed to open be tried again
CREDO23 Oct 22, 2026
317c1a5
fix(local): ignore a page of a list that answers after a new search
CREDO23 Oct 22, 2026
b0136c8
docs(local): list the pull task and plugin list in the worker's packa…
CREDO23 Oct 22, 2026
05b0306
docs(local): say the plugins worker sends document events
CREDO23 Oct 22, 2026
cd19a06
feat(agent): hold the plugin tools an opencode turn needs, and grow t…
AnishSarkar22 Oct 22, 2026
e4b863a
docs(agent): fold opencode 2.x into architecture and record its tool …
AnishSarkar22 Oct 22, 2026
0f068bb
fix(agent): rank plugin tools without example requests
AnishSarkar22 Oct 22, 2026
29b9790
refactor(agent): name a step that loaded a plugin by a field, not its…
AnishSarkar22 Oct 22, 2026
9193d6a
Merge pull request #2328 from CREDO23/feat/local-web-sources-build
CREDO23 Oct 22, 2026
9d8cbff
Merge origin/dev into feat/desktop-telemetry; renumber the telemetry …
MODSetter Oct 22, 2026
2fcb14a
Merge remote-tracking branch 'origin/dev' into chore/installer-size
MODSetter Oct 22, 2026
ee1ac31
Merge branch 'chore/installer-size' into chore/installer-size-opencv
MODSetter Oct 22, 2026
2577899
fix(agent): a plugin call holds the rest of its plugin and no other
AnishSarkar22 Oct 22, 2026
fb13785
test(desktop): bound every frozen-binary subprocess in packaging tests
MODSetter Oct 22, 2026
96169c6
Merge branch 'chore/installer-size' into chore/installer-size-opencv
MODSetter Oct 22, 2026
9cfcf03
docs(usage-statistics): say what the counts count, where mirrored ins…
MODSetter Oct 22, 2026
491d901
Merge remote-tracking branch 'upstream/dev' into feat/opencode-v2
AnishSarkar22 Oct 22, 2026
a046838
docs(agent): renumber the opencode tool policy ADR to 0069
AnishSarkar22 Oct 22, 2026
97faf49
fix(plugins): refuse SSE addresses, and never move an SSE plugin behi…
AnishSarkar22 Oct 22, 2026
fa6e20a
test(agent): give the run folder's refused render opencode 2.x's tool…
AnishSarkar22 Oct 22, 2026
ae3d37b
Merge pull request #2329 from AnishSarkar22/feat/opencode-v2
AnishSarkar22 Oct 22, 2026
06b807d
Merge remote-tracking branch 'origin/dev' into chore/installer-size
MODSetter Oct 22, 2026
e0df275
Merge branch 'chore/installer-size' into chore/installer-size-opencv
MODSetter Oct 22, 2026
81fded6
Merge origin/dev into feat/desktop-telemetry; renumber the telemetry …
MODSetter Oct 22, 2026
d30ccd4
docs(agent): point at ADR 0069 after the merge renumbered it
AnishSarkar22 Oct 22, 2026
72cf1ad
fix(reddit): read Reddit's logged-out pages over plain HTTP
AnishSarkar22 Oct 22, 2026
44ec9bb
feat(reddit): read a post and its comment tree from the post's page
AnishSarkar22 Oct 22, 2026
8649d9c
feat(reddit): read a subreddit's details from its top post's page
AnishSarkar22 Oct 22, 2026
4a40a12
feat(reddit): read a user's overview, posts and comments from their p…
AnishSarkar22 Oct 22, 2026
4fc29d5
feat(plugins): list Reddit in the app's first-party plugins again
AnishSarkar22 Oct 22, 2026
be7dd49
fix(instagram): move to a fresh exit when a login redirect is a rate …
AnishSarkar22 Oct 22, 2026
64ea2f1
feat(instagram): read profiles from the pages a logged-out visitor sees
AnishSarkar22 Oct 22, 2026
79818bf
feat(plugins): list Instagram in the app's first-party plugins again
AnishSarkar22 Oct 22, 2026
ee926dc
fix(reddit): read search results shown with a preview of their text
AnishSarkar22 Oct 22, 2026
c3cb1ed
feat(reddit): order a search by relevance unless a sort is asked for
AnishSarkar22 Oct 22, 2026
b355d59
perf(instagram): stop asking a reels feed for the profile's embed
AnishSarkar22 Oct 22, 2026
18d6e44
fix(instagram): fill what the embed's copy of a post lacks from the p…
AnishSarkar22 Oct 22, 2026
f97f71a
feat(instagram): tell the agent to fetch a video's URL from its post …
AnishSarkar22 Oct 22, 2026
9aa1491
docs(plugins): move Instagram's on-demand video URL out of Known gaps
AnishSarkar22 Oct 22, 2026
75b5654
feat(web): list Reddit and Instagram on the plugins page again
AnishSarkar22 Oct 22, 2026
e1188ee
Merge remote-tracking branch 'upstream/dev' into fix/reddit-instagram…
AnishSarkar22 Oct 22, 2026
37613c8
build(desktop): budgets on top of opencode 2.1.2, dmg checks before them
MODSetter Oct 22, 2026
7824bd0
Merge branch 'chore/installer-size' into chore/installer-size-opencv
MODSetter Oct 22, 2026
6aa16fe
Merge pull request #2330 from AnishSarkar22/fix/reddit-instagram-anon…
AnishSarkar22 Oct 22, 2026
f7448cb
Merge remote-tracking branch 'origin/dev' into chore/installer-size
MODSetter Oct 22, 2026
c66e7ed
Merge branch 'chore/installer-size' into chore/installer-size-opencv
MODSetter Oct 22, 2026
a05e0ca
Merge remote-tracking branch 'origin/dev' into fix/privacy-claims
MODSetter Oct 22, 2026
502109e
Merge branch 'fix/privacy-claims' into feat/desktop-telemetry
MODSetter Oct 22, 2026
996ad4e
Merge remote-tracking branch 'origin/dev' into feat/plugin-usage-meter
MODSetter Oct 22, 2026
647d268
Merge pull request #2318 from MODSetter/feat/desktop-telemetry-endpoints
MODSetter Oct 22, 2026
480b376
Merge pull request #2319 from MODSetter/feat/web-funnel-checkout
MODSetter Oct 22, 2026
fa8c918
docs(plugin-host): name the usage meter's purposes as the privacy pol…
MODSetter Oct 22, 2026
3abca65
fix(plugin-host): give each rollup event a fixed uuid so a day sent a…
MODSetter Oct 22, 2026
726e93f
fix(plugin-host): hide a URL's query past an apostrophe, an upper-cas…
MODSetter Oct 22, 2026
782cf23
docs(translate): say the app sends the license key to SurfSense's plu…
MODSetter Oct 22, 2026
7602d65
fix(release-stats): send the token only to the GitHub API's own origin
MODSetter Oct 22, 2026
3b08d28
fix(license): withhold a second kind so a withheld one cannot be subt…
MODSetter Oct 22, 2026
3fb9074
fix(plugin-host): keep a query's encoded space or path after an apost…
MODSetter Oct 22, 2026
1140d8b
fix(local): keep a parent's count when a Studio Word list nests past …
MohammadHijjawi97 Oct 22, 2026
a416da8
fix(release-stats): refuse a redirect off the API's origin
MODSetter Oct 22, 2026
662027e
build(desktop): lower installer budgets to the minimal OpenCV's sizes
MODSetter Oct 22, 2026
342d91a
fix(license): withhold cohort cells so no small one can be worked out
MODSetter Oct 22, 2026
adc2cc0
docs(plugin-host): say a resent rollup replaces the earlier copy in P…
MODSetter Oct 22, 2026
a5284e0
Merge remote-tracking branch 'origin/fix/privacy-claims' into feat/de…
MODSetter Oct 22, 2026
9f5c75d
Merge pull request #2317 from MODSetter/fix/privacy-claims
MODSetter Oct 22, 2026
70d5557
Merge pull request #2320 from MODSetter/feat/plugin-usage-meter
MODSetter Oct 22, 2026
fcaa909
Merge pull request #2321 from MODSetter/chore/telemetry-ops
MODSetter Oct 22, 2026
30e4933
Merge pull request #2322 from MODSetter/feat/desktop-telemetry
MODSetter Oct 22, 2026
8a0e8b9
perf(reddit): read a subreddit call's pages on one held session
AnishSarkar22 Oct 22, 2026
f05a5b0
perf(instagram): read a page without warming the exit on the home pag…
AnishSarkar22 Oct 22, 2026
b396959
Merge remote-tracking branch 'origin/dev' into chore/installer-size
MODSetter Oct 22, 2026
fd70a52
Merge branch 'chore/installer-size' into chore/installer-size-opencv
MODSetter Oct 22, 2026
c324ac4
perf(instagram): read a feed's post pages on up to three exits at once
AnishSarkar22 Oct 22, 2026
f18ceee
fix(reddit): close a stopped stream before the call returns
AnishSarkar22 Oct 22, 2026
659ed39
fix(reddit): ask a 404 once more on a fresh exit before it reads as gone
AnishSarkar22 Oct 22, 2026
fa6d0ad
Merge pull request #2323 from MODSetter/chore/installer-size
MODSetter Oct 22, 2026
6ca2a6e
Merge remote-tracking branch 'origin/dev' into chore/installer-size-o…
MODSetter Oct 22, 2026
67fd891
docs(proposals): split the legacy stack, license routes and homepage
AnishSarkar22 Oct 22, 2026
69f9fce
build(desktop): gate OpenCV's libstdc++ symbols too, and on cached wh…
MODSetter Oct 22, 2026
edd3430
build(desktop): pin every OpenCV build tool
MODSetter Oct 22, 2026
7216476
docs(proposals): move the legacy stack to a legacy branch
AnishSarkar22 Oct 22, 2026
498c6d9
docs(proposals): build legacy images from legacy-v tags
AnishSarkar22 Oct 22, 2026
d1a2e77
docs(desktop): say which pip each OpenCV build image carries
MODSetter Oct 22, 2026
35d9279
Merge pull request #2332 from AnishSarkar22/docs/legacy-split-proposal
AnishSarkar22 Oct 22, 2026
9ed9871
Merge pull request #2324 from MODSetter/chore/installer-size-opencv
MODSetter Oct 22, 2026
84e736c
feat(local): let each puller search its own site
CREDO23 Oct 23, 2026
7d2912c
feat(local): search a site's own search, and show more of any search
CREDO23 Oct 23, 2026
2043a33
feat(local): choose the site a search runs on, beside the box
CREDO23 Oct 23, 2026
d666b01
docs(local): describe searching a site's own search
CREDO23 Oct 23, 2026
260777a
fix(local): name the default search Google Search
CREDO23 Oct 23, 2026
4a8d2f7
docs(proposals): make backend/ the one backend for the plugins and th…
CREDO23 Oct 23, 2026
9d286f6
Merge pull request #2335 from CREDO23/docs/one-backend
CREDO23 Oct 23, 2026
e301d97
Merge pull request #2334 from CREDO23/feat/local-web-search-sites
CREDO23 Oct 23, 2026
1f40695
refactor(backend): move plugins/ into backend/, run by server/
CREDO23 Oct 23, 2026
6f1693c
feat(backend): serve the license portal from backend/license/
CREDO23 Oct 23, 2026
618d74d
fix(desktop): settle an update check the updater could not run
MODSetter Oct 24, 2026
729effc
feat(desktop): leave updates to the package manager that installed th…
MODSetter Oct 24, 2026
fa2225a
build(desktop): build an rpm, prepare a snap, and declare what the Li…
MODSetter Oct 24, 2026
4498bbe
feat(desktop): one-line install scripts for macOS, Linux and Windows
MODSetter Oct 24, 2026
315a21c
ci(release): attach install scripts, a signed apt repository and SHA2…
MODSetter Oct 24, 2026
123fcb2
feat(desktop): render Homebrew, winget, Scoop and AUR manifests from …
MODSetter Oct 24, 2026
1e1ce07
feat(web): redirect install.sh and install.ps1, and offer the rpm
MODSetter Oct 24, 2026
c1e16fa
feat(analytics): count the rpm, install scripts, apt index and checksums
MODSetter Oct 24, 2026
aeb6948
docs: describe the install channels and record ADR 0071
MODSetter Oct 24, 2026
36f9e00
Merge remote-tracking branch 'origin/dev' into feat/install-channels
MODSetter Oct 24, 2026
7dfbf45
Merge pull request #2338 from MODSetter/feat/install-channels
MODSetter Oct 24, 2026
e14d2a1
Merge pull request #2266 from Cedric921/docs/chat-modes-adr
MODSetter Oct 24, 2026
b5d4d90
Merge pull request #2331 from MohammadHijjawi97/fix/studio-word-deep-…
MODSetter Oct 24, 2026
b606856
Merge pull request #2337 from MODSetter/feat/one-backend
AnishSarkar22 Oct 24, 2026
a89f6e8
chore(registry): sign the plugin list
github-actions[bot] Oct 24, 2026
8850a6c
ci(legacy-split): remove the self-hosted image workflows from dev
AnishSarkar22 Oct 24, 2026
261edd6
Merge pull request #2340 from AnishSarkar22/ci/drop-legacy-docker-build
AnishSarkar22 Oct 24, 2026
8298fd2
docs(legacy-split): drop sunset, rename homepage to website, keep no …
AnishSarkar22 Oct 24, 2026
c1a3ba8
chore(legacy-split): delete the self-hosted stack from dev
AnishSarkar22 Oct 24, 2026
a2c00d4
chore(legacy-split): point the repo at the legacy branch for the self…
AnishSarkar22 Oct 24, 2026
145d48c
refactor(website): move surfsense_web to website, without the hosted app
AnishSarkar22 Oct 24, 2026
4fbafd5
feat(website): trim the site to what it serves, and point the repo at…
AnishSarkar22 Oct 24, 2026
9bade10
docs(website): name 0.0.41 as the legacy version, under SurfSense Legacy
AnishSarkar22 Oct 24, 2026
7ace7d4
feat(website): show the global banner at the top of every page, in an…
AnishSarkar22 Oct 24, 2026
e13d33e
refactor(website): keep only the referral event from the hosted app's…
AnishSarkar22 Oct 24, 2026
b3eaec2
refactor(website): drop the hosted app's settings, error classes, toa…
AnishSarkar22 Oct 24, 2026
7439851
refactor(website): drop the hosted app's CSS and packages, and draw e…
AnishSarkar22 Oct 24, 2026
c166702
refactor(website): replace the Tabler icons with Hugeicons and the si…
AnishSarkar22 Oct 24, 2026
38b0171
chore(website): drop ESLint, keeping Biome as the one linter and form…
AnishSarkar22 Oct 24, 2026
8376994
refactor(website): drop the announcements read tracking the hosted ap…
AnishSarkar22 Oct 24, 2026
e71b9be
refactor(website): drop the unused release constants, clipboard helpe…
AnishSarkar22 Oct 24, 2026
94c8bd5
refactor(website): drop the retired desktop app's Electron check from…
AnishSarkar22 Oct 24, 2026
571ade2
fix(website): give every page the site font, and drop the hosted app'…
AnishSarkar22 Oct 24, 2026
c6efa5d
feat(website): use the site's buttons on the 404 page
AnishSarkar22 Oct 24, 2026
d4ffac6
refactor(website): make HomeButton the site's only button, and set sh…
AnishSarkar22 Oct 24, 2026
ee9edc0
docs(legacy-split): record what #2339 and #2341 shipped, and what is …
AnishSarkar22 Oct 24, 2026
ad36e5c
fix(website): mark the MCP snippets' API key placeholder as a known f…
AnishSarkar22 Oct 24, 2026
5ae457c
docs(legacy-split): remove www.surfsense.com/mcp-server once mcp.surf…
AnishSarkar22 Oct 24, 2026
06edfce
feat(desktop): drop the cloud-import link to /sunset, keeping the ZIP…
AnishSarkar22 Oct 24, 2026
52bb69e
ci(desktop): start desktop releases only on v[1-9]* tags
AnishSarkar22 Oct 24, 2026
55ac6ff
docs(legacy-split): delete the sunset docs now the wind-down is over
AnishSarkar22 Oct 24, 2026
64eaffa
docs(legacy-split): keep the install URLs for the new Docker stack
AnishSarkar22 Oct 24, 2026
9cf3398
Merge pull request #2341 from AnishSarkar22/feat/legacy-split
AnishSarkar22 Oct 24, 2026
7186216
refactor(website): colocate route code and share the rest from features/
AnishSarkar22 Oct 24, 2026
a643adc
refactor(www): rename website/ to www/
AnishSarkar22 Oct 24, 2026
7a7e456
docs(www): point comments at the moved announcements and site paths
AnishSarkar22 Oct 24, 2026
8207664
docs: point the packaging and legacy-split docs at the www paths
AnishSarkar22 Oct 24, 2026
3e519b2
fix(www): make tsc pass and run it before each commit
AnishSarkar22 Oct 24, 2026
93985c1
Merge pull request #2342 from AnishSarkar22/refactor/website-feature-…
AnishSarkar22 Oct 24, 2026
b674321
feat(sources): rework the add-from-web dialog around one search box
AnishSarkar22 Oct 24, 2026
13d98aa
style(sources): polish the add-from-web results
AnishSarkar22 Oct 24, 2026
5e6df1c
fix(agent): name a thread after up to 100 characters of its first mes…
AnishSarkar22 Oct 24, 2026
429a232
fix(chat): keep the composer's controls out of the text's scroll
AnishSarkar22 Oct 24, 2026
b6acbf7
Merge pull request #2343 from AnishSarkar22/feat/web-search-composer
AnishSarkar22 Oct 25, 2026
8c85200
docs(readme): add the web-to-web-page demo and caption both videos
AnishSarkar22 Oct 25, 2026
f151dec
Merge pull request #2344 from AnishSarkar22/docs/readme-demo-videos
AnishSarkar22 Oct 25, 2026
fb53d58
feat(onboarding): make Privacy choices a counted step with one-line c…
AnishSarkar22 Oct 25, 2026
61807c8
fix(onboarding): label the privacy links Show exactly what’s sent, as…
AnishSarkar22 Oct 25, 2026
1d55460
fix(about): put the Open folder button on the right, as Updates does
AnishSarkar22 Oct 25, 2026
d923aae
docs(docker): one core with two entries, docker/surfsense/, and one C…
AnishSarkar22 Oct 25, 2026
59c83bd
docs(docker): the network picture, why Caddy, and the CUDA driver floor
AnishSarkar22 Oct 25, 2026
31bb1a8
docs(docker): Claude subscriptions in the container
AnishSarkar22 Oct 25, 2026
d58b88e
docs(docker): sign-ins land on the browser's own origin
AnishSarkar22 Oct 25, 2026
e05923c
feat(updates): show a download and a ready update as a pill in the ti…
AnishSarkar22 Oct 25, 2026
6cb2bab
Merge pull request #2346 from AnishSarkar22/feat/docker-local
AnishSarkar22 Oct 25, 2026
ff48393
test(updates): give the downloading state its percent
AnishSarkar22 Oct 25, 2026
497248a
Merge pull request #2347 from AnishSarkar22/feat/privacy-choices-ui
AnishSarkar22 Oct 25, 2026
7ea6661
docs(changelog): v2.2.4
AnishSarkar22 Oct 25, 2026
4278aa0
Merge pull request #2349 from AnishSarkar22/docs/changelog-v2.2.4
AnishSarkar22 Oct 25, 2026
221d404
chore(local): release 2.2.4
AnishSarkar22 Oct 25, 2026
9f07631
Merge pull request #2350 from AnishSarkar22/chore/release-2.2.4
AnishSarkar22 Oct 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
2 changes: 1 addition & 1 deletion .agents/skills/fastapi
4 changes: 2 additions & 2 deletions .agents/skills/frontend-workflow/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
name: frontend-workflow
description: Frontend and UI work in surfsense_web and surfsense_local/frontend — building, refactoring, styling, animating, or reviewing React and Next.js components, shadcn/ui, color tokens and themes, visual polish, and motion. Load this first for any UI task, including adding or changing a shadcn/ui component (dialog, button, dropdown, form, sidebar, table) in a tree with components.json — it owns the color palette, polish rules, and the precedence order, then routes to the separate shadcn skill for component wiring and the CLI. Use for any frontend component, page, style, animation, hover state, icon, layout, or UI review task.
description: Frontend and UI work in www and surfsense_local/frontend — building, refactoring, styling, animating, or reviewing React and Next.js components, shadcn/ui, color tokens and themes, visual polish, and motion. Load this first for any UI task, including adding or changing a shadcn/ui component (dialog, button, dropdown, form, sidebar, table) in a tree with components.json — it owns the color palette, polish rules, and the precedence order, then routes to the separate shadcn skill for component wiring and the CLI. Use for any frontend component, page, style, animation, hover state, icon, layout, or UI review task.
---

# Frontend Workflow

Single entry point for frontend work in `surfsense_web` and
Single entry point for frontend work in `www` and
`surfsense_local/frontend`. Both are React + Tailwind + shadcn/ui with their own
`components.json`. Detect which tree the task touches, and treat that tree's
`package.json`, `components.json`, and styling setup as authoritative. All
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/frontend-workflow/base-ui.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Base UI in the desktop frontend

`surfsense_local/frontend` builds its `components/ui/` on Base UI (shadcn
`base-nova`). `surfsense_web` is still on Radix (`new-york`): none of this
`base-nova`). `www` is still on Radix (`new-york`): none of this
applies there.

These are the rules that compile fine and still break. Check
Expand Down
6 changes: 5 additions & 1 deletion .agents/skills/translate/glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ One term per concept, so the app says the same thing everywhere. Terms marked wi

## Stays in English

SurfSense, Studio, Markdown, llama.cpp, GGUF, Hugging Face, API, MCP, the HTTP sign-in schemes Bearer and Basic, and every model and provider name.
SurfSense, Studio, Markdown, llama.cpp, GGUF, Hugging Face, API, MCP, MCP's transports SSE and Streamable HTTP, the HTTP sign-in schemes Bearer and Basic, the package managers Scoop, AUR, Snap Store, Flatpak, Nix and apt, and every model and provider name.

`workspace` is the one product word languages disagree on, and each keeps its own habit: German and Brazilian Portuguese write Workspace, because both say it routinely and the translation is three times as wide in the sidebar; Japanese writes ワークスペース, since `マイWorkspace` reads as a mistake; the rest translate it.

Expand Down Expand Up @@ -61,6 +61,8 @@ SurfSense, Studio, Markdown, llama.cpp, GGUF, Hugging Face, API, MCP, the HTTP s
| server (a model server) | サーバー | 서버 | 服务器 | सर्वर | Server | servidor | serveur | servidor | сервер |
| provider | プロバイダー | 제공업체 | 提供商 | प्रोवाइडर | Anbieter | proveedor | fournisseur | provedor | провайдер |
| this computer | このコンピューター | 이 컴퓨터 | 这台电脑 | यह कंप्यूटर | dieser Computer | este equipo | cet ordinateur | este computador | этот компьютер |
| license key (the user’s key, which the app sends to SurfSense’s plugin service to be checked) | ライセンスキー | 라이선스 키 | 许可证密钥 | लाइसेंस कुंजी | Lizenzschlüssel | clave de licencia | clé de licence | chave de licença | лицензионный ключ |
| usage statistics (the opt-in daily and weekly report of counts in ranges) | 利用統計 | 사용 통계 | 使用统计 | उपयोग आंकड़े | Nutzungsstatistiken | estadísticas de uso | statistiques d’utilisation | estatísticas de uso | статистика использования |
| retry | 再試行 | 다시 시도 | 重试 | फिर से कोशिश करें | Erneut versuchen | Reintentar | Réessayer | Tentar novamente | Повторить |
| plugin (an MCP server whose tools the agent can use) | プラグイン | 플러그인 | 插件 | प्लगइन | Plugin | plugin | plugin | plugin | плагин |
| third-party (a plugin SurfSense does not publish) | サードパーティ | 서드파티 | 第三方 | थर्ड-पार्टी | Drittanbieter- | de terceros | tiers | de terceiros | сторонний |
Expand All @@ -76,8 +78,10 @@ SurfSense, Studio, Markdown, llama.cpp, GGUF, Hugging Face, API, MCP, the HTTP s
| subscription (using a ChatGPT plan instead of a key) | サブスクリプション | 구독 | 订阅 | सब्सक्रिप्शन | Abo | suscripción | abonnement | assinatura | подписка |
| terminal (where the user runs `claude`, the command that stays in English) | ターミナル | 터미널 | 终端 | टर्मिनल | Terminal | terminal (una) | terminal | terminal | терминал |
| header (an HTTP header a plugin's server reads, such as its key in `x-api-key`) | ヘッダー | 헤더 | 请求头 | हेडर | Header | encabezado | en-tête | cabeçalho | заголовок |
| package manager (installs and updates SurfSense in place of its own updater) | パッケージマネージャー | 패키지 관리자 | 软件包管理器 | पैकेज मैनेजर | Paketmanager | gestor de paquetes | gestionnaire de paquets | gerenciador de pacotes | менеджер пакетов |
| OAuth app (a user's own, registered with a provider) | OAuthアプリ | OAuth 앱 | OAuth 应用 | OAuth ऐप | OAuth-App | app OAuth | app OAuth | app OAuth | приложение OAuth |
| client ID (of an OAuth app) | クライアントID | 클라이언트 ID | 客户端 ID | क्लाइंट आईडी | Client-ID | ID de cliente | ID client | ID do cliente | ID клиента |
| link (a web address the user adds as a source) | リンク | 링크 | 链接 | लिंक | Link | enlace | lien | link | ссылка |
| client secret (of an OAuth app) | クライアントシークレット | 클라이언트 시크릿 | 客户端密钥 | क्लाइंट सीक्रेट | Client-Secret | secreto de cliente | secret client | segredo do cliente | секрет клиента |
| scope (an OAuth permission) | スコープ | 범위 | 权限范围 | स्कोप | Scope | ámbito | portée | escopo | область доступа |
| callback address (where a provider sends the browser back) | コールバックアドレス | 콜백 주소 | 回调地址 | कॉलबैक पता | Callback-Adresse | dirección de callback | adresse de rappel | endereço de callback | адрес обратного вызова |
Expand Down
15 changes: 5 additions & 10 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,9 @@
/surfsense_local/RELEASE.md @CREDO23 @AnishSarkar22
/.github/workflows/release-local.yml @CREDO23 @AnishSarkar22

/surfsense_backend/app/license/ @CREDO23
/surfsense_backend/app/mailer/ @CREDO23
/surfsense_backend/app/payments/ @CREDO23
/surfsense_backend/app/sunset.py @CREDO23
/surfsense_backend/app/capabilities/ @AnishSarkar22 @MODSetter
/surfsense_backend/app/proprietary/ @AnishSarkar22 @MODSetter
/plugins/remote/proprietary/ @AnishSarkar22 @MODSetter
/plugins/registry/ @AnishSarkar22 @MODSetter
/backend/license/ @CREDO23
/backend/mailer/ @CREDO23
/backend/plugins/proprietary/ @AnishSarkar22 @MODSetter
/backend/plugins/registry/ @AnishSarkar22 @MODSetter

/surfsense_web/ @AnishSarkar22
/surfsense_mcp/ @CREDO23
/www/ @AnishSarkar22
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/plugin-submit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ body:
Fill this in and a bot checks your server, then comments with what to fix or what happens next. To fix something, edit the issue and it checks again.

**We support** remote MCP servers on a public HTTPS address:
- **Transport:** Streamable HTTP, or the older HTTP+SSE.
- **Transport:** Streamable HTTP only. Servers on the older HTTP+SSE can't be listed.
- **Sign-in:** none, a key each user pastes, or OAuth.

Local (stdio) servers can't be listed yet.
Expand Down
10 changes: 6 additions & 4 deletions .github/workflows/build-audiocpp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ jobs:
uses: actions/cache@v5
with:
path: surfsense_local/electron/audiocpp
key: audiocpp-${{ runner.os }}-${{ hashFiles('surfsense_local/electron/scripts/audiocpp/*.mjs', 'surfsense_local/electron/scripts/msvc-runtime.mjs', 'surfsense_local/electron/scripts/pinned-download.mjs') }}
key: audiocpp-${{ runner.os }}-${{ hashFiles('surfsense_local/electron/scripts/audiocpp/**/*.mjs', 'surfsense_local/electron/scripts/msvc-runtime.mjs', 'surfsense_local/electron/scripts/pinned-download.mjs') }}

- name: Install GCC 13
# audio.cpp requires it, and 22.04 has GCC 11. This job, not the
Expand All @@ -88,9 +88,11 @@ jobs:
- name: Gate on the app's Linux floor
if: runner.os == 'Linux' && steps.cache.outputs.cache-hit != 'true'
working-directory: surfsense_local/electron/audiocpp
# The floor is glibc 2.34, RHEL 9, whose libgcc_s is GCC 11's: nothing
# after GCC_7.0.0. The runner's libstdc++ is the PPA's, newer than a
# user's, so only this gate, not the voicing test, catches a dynamic one.
# glibc 2.34 and RHEL 9's GCC 11 libgcc_s, nothing after GCC_7.0.0:
# stricter than the app's Linux floor, glibc 2.35 and GCC 12's libstdc++,
# which the backend and llama.cpp set (docs/architecture/packaging.md).
# The runner's libstdc++ is the PPA's, newer than a user's, so only this
# gate, not the voicing test, catches a dynamic one.
run: |
files=$(for f in audiocpp_server *.so*; do [ -L "$f" ] || echo "$f"; done)
too_new=$(for f in $files; do objdump -T "$f"; done | grep -oE '(GLIBC|GCC)_[0-9.]+[0-9]' | sort -Vu | while read -r v; do
Expand Down
152 changes: 152 additions & 0 deletions .github/workflows/build-opencv.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
# Build opencv-python-headless with only the modules the app calls, from the
# sdist uv.lock pins and the switches in surfsense_local/backend/scripts/opencv/,
# check that every cv2 call the app and its parsers make answers byte for byte
# as PyPI's wheel does, and hand the wheel to the desktop release as an
# artifact. PyPI's wheel adds video, DNN and the other modules, FFmpeg (Homebrew's
# GPL build on macOS) and, on Linux, OpenBLAS, none of which the app runs. A pull
# request that changes the scripts or the lock runs it too.
name: Build OpenCV

on:
workflow_call:
pull_request:
paths:
- surfsense_local/backend/scripts/opencv/**
- surfsense_local/backend/uv.lock
- .github/workflows/build-opencv.yml

permissions:
contents: read

jobs:
build:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# Pinned: opencv-python's setup.py names Visual Studio 2022's generator,
# and windows-latest moved to Visual Studio 2026.
- os: windows-2022
name: Windows x64
- os: macos-15
name: macOS arm64
# Hosts upstream's manylinux_2_28 image (pins.py), which builds it.
- os: ubuntu-22.04
name: Linux x64
defaults:
run:
shell: bash
working-directory: surfsense_local/backend
env:
# As the release: uv's own Python, never one found on PATH.
UV_PYTHON_PREFERENCE: only-managed
steps:
- uses: actions/checkout@v6
with:
# Nothing after the checkout talks to git; the build runs in a container.
persist-credentials: false

- name: Setup uv
uses: astral-sh/setup-uv@v8.1.0
with:
enable-cache: true
python-version: "3.12"

- id: pin
name: Read the pinned sdist
run: uv run --no-project scripts/opencv/pins.py >> "$GITHUB_OUTPUT"

# A release that changes neither the pin nor the build reuses the last checked wheel.
- id: cache
uses: actions/cache@v5
with:
path: ${{ runner.temp }}/opencv/dist
key: opencv-${{ runner.os }}-${{ steps.pin.outputs.sha256 }}-${{ hashFiles('surfsense_local/backend/scripts/opencv/pins.py', 'surfsense_local/backend/scripts/opencv/recipe.py', 'surfsense_local/backend/scripts/opencv/build_wheel.py', 'surfsense_local/backend/scripts/opencv/setup_patch.py') }}

- name: Install NASM
# libjpeg-turbo's x86 SIMD needs it, and the recipe refuses to build without.
if: runner.os == 'Windows' && steps.cache.outputs.cache-hit != 'true'
run: |
choco install nasm --no-progress -y
echo "C:/Program Files/NASM" >> "$GITHUB_PATH"

- name: Build (Windows, macOS)
if: runner.os != 'Linux' && steps.cache.outputs.cache-hit != 'true'
run: uv run --no-project scripts/opencv/build_wheel.py "$RUNNER_TEMP/opencv"

- name: Build (Linux)
# Upstream's own image: its compiler built PyPI's wheel, and its glibc
# 2.28 sits under the app's floor. As root, since the image's own user
# cannot write the runner's folders.
if: runner.os == 'Linux' && steps.cache.outputs.cache-hit != 'true'
run: |
docker run --rm -u root -v "$GITHUB_WORKSPACE:/io:ro" -v "$RUNNER_TEMP:/work" \
"${{ steps.pin.outputs.linux_image }}" \
/opt/python/cp312-cp312/bin/python /io/surfsense_local/backend/scripts/opencv/build_wheel.py /work/opencv
sudo chown -R "$(id -u):$(id -g)" "$RUNNER_TEMP/opencv"

# Cheap, so a cached wheel is checked again too: the cache key does not
# cover this workflow, where a floor can move.
- name: Gate on the app's Linux floor
if: runner.os == 'Linux'
working-directory: ${{ runner.temp }}
# glibc 2.34 and RHEL 9's GCC 11 libgcc_s and libstdc++, nothing after
# GCC_7.0.0, GLIBCXX_3.4.29 or CXXABI_1.3.13: stricter than the app's
# Linux floor, glibc 2.35 and GCC 12's libstdc++, which the backend and
# llama.cpp set (docs/architecture/packaging.md).
# The module links only the C and C++ runtimes and, as upstream's does,
# the system's zlib.
run: |
rm -rf opencv-gate && unzip -q opencv/dist/*.whl -d opencv-gate
files=$(find opencv-gate -name '*.so*' -type f)
too_new=$(for f in $files; do objdump -T "$f"; done | grep -oE '(GLIBC|GLIBCXX|CXXABI|GCC)_[0-9.]+[0-9]' | sort -Vu | while read -r v; do
case "$v" in
GLIBC_*) floor=GLIBC_2.34 ;;
GLIBCXX_*) floor=GLIBCXX_3.4.29 ;;
CXXABI_*) floor=CXXABI_1.3.13 ;;
GCC_*) floor=GCC_7.0.0 ;;
esac
[ "$(printf '%s\n%s\n' "$v" "$floor" | sort -V | tail -1)" = "$floor" ] || echo "$v"
done)
if [ -n "$too_new" ]; then
for f in $files; do objdump -T "$f" | grep -wF "$too_new" | sed "s|^|$f: |"; done
exit 1
fi
needs=$(for f in $files; do objdump -p "$f" | awk '$1 == "NEEDED" {print $2}'; done | sort -u)
echo "$needs"
outside=$(echo "$needs" | grep -vE '^(libc|libm|libdl|libpthread|librt|libstdc\+\+|libgcc_s|libz|ld-linux-x86-64)\.so' || true)
if [ -n "$outside" ]; then echo "links $outside"; exit 1; fi

- name: Gate on the app's macOS floor
if: runner.os == 'macOS'
working-directory: ${{ runner.temp }}
# 13.3, as the native runtimes; upstream's wheel says 13.0. Every library
# it loads is the system's: no Homebrew, so no FFmpeg.
run: |
rm -rf opencv-gate && unzip -q opencv/dist/*.whl -d opencv-gate
bad=0
for f in $(find opencv-gate -name '*.so' -o -name '*.dylib'); do
minos=$(otool -l "$f" | awk '$1 == "minos" {print $2; exit}')
if [ "$(printf '%s\n%s\n' "$minos" 13.3 | sort -V | tail -1)" != "13.3" ]; then
echo "$f needs macOS $minos"; bad=1
fi
outside=$(otool -L "$f" | tail -n +2 | awk '{print $1}' | grep -vE '^(/usr/lib/|/System/Library/)' || true)
if [ -n "$outside" ]; then echo "$f links $outside"; bad=1; fi
done
exit $bad

# Under PyPI's wheel and then this one, with the backend's locked numpy,
# RapidOCR and onnxruntime: every call site's cv2 call on fixed images,
# and RapidOCR reading rendered text as the app configures it. Run on a
# cached wheel too: the lock can move numpy or RapidOCR without it.
- name: Gate on every call answering as PyPI's wheel does
run: uv run --no-project scripts/opencv/check_same_outputs.py "$RUNNER_TEMP/opencv/dist" "$RUNNER_TEMP/opencv-check"

- uses: actions/upload-artifact@v7
with:
name: opencv-${{ runner.os }}
path: ${{ runner.temp }}/opencv/dist/*.whl
if-no-files-found: error
retention-days: 7
8 changes: 5 additions & 3 deletions .github/workflows/build-sdcpp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,11 @@ jobs:
- name: Gate on the app's Linux floor
if: runner.os == 'Linux' && steps.cache.outputs.cache-hit != 'true'
working-directory: surfsense_local/electron/sdcpp
# The floor is glibc 2.34, RHEL 9, whose libgcc_s is GCC 11's: nothing
# after GCC_7.0.0. Only the Vulkan backend may need the system's Vulkan
# loader, which comes with the GPU driver.
# glibc 2.34 and RHEL 9's GCC 11 libgcc_s, nothing after GCC_7.0.0:
# stricter than the app's Linux floor, glibc 2.35 and GCC 12's libstdc++,
# which the backend and llama.cpp set (docs/architecture/packaging.md).
# Only the Vulkan backend may need the system's Vulkan loader, which
# comes with the GPU driver.
run: |
files=$(for f in sd-server *.so*; do [ -L "$f" ] || echo "$f"; done)
too_new=$(for f in $files; do objdump -T "$f"; done | grep -oE '(GLIBC|GCC)_[0-9.]+[0-9]' | sort -Vu | while read -r v; do
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/code-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Code Quality Checks
# Checks that belong to no product, on every PR: file hygiene, docs and
# secrets. A PR touching only docs/, .github/ or scripts/ starts neither
# product workflow, so these must not live in one. Each product lints, scans
# and tests itself: docker-tests.yml and desktop-tests.yml.
# and tests itself in its own workflow, such as desktop-tests.yml.

on:
pull_request:
Expand Down Expand Up @@ -98,7 +98,7 @@ jobs:
pre-commit-security-

# Secrets are a leak wherever they land, so this scans every PR. bandit
# is per product: docker-tests.yml and desktop-tests.yml run their own.
# is per product: desktop-tests.yml runs its own.
- name: Scan changed files for secrets
run: |
if git show-ref --verify --quiet refs/heads/${{ github.base_ref }}; then
Expand Down Expand Up @@ -129,7 +129,7 @@ jobs:
# The checkout is the pull request merged into its base, its first parent.
- name: Refuse changes to proprietary code
run: |
changed=$(git diff --name-only HEAD^1 HEAD -- surfsense_backend/app/proprietary plugins/remote/proprietary)
changed=$(git diff --name-only HEAD^1 HEAD -- backend/plugins/proprietary)
if [ -n "$changed" ]; then
echo "::error::Only SurfSense's maintainers change proprietary/ (Business Source License 1.1). See CONTRIBUTING.md."
echo "$changed"
Expand Down
Loading
Loading