Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
305 commits
Select commit Hold shift + click to select a range
da6ae9a
feat(local): add a "Coming soon" badge to the sidebar Plugins button
AnishSarkar22 Sep 14, 2026
d10bfe9
refactor(local): one folder and one pipeline per studio kind, routed …
CREDO23 Sep 14, 2026
8fc94f0
fix(local): never hold a SQLite transaction across a model call or a …
CREDO23 Sep 14, 2026
45eb699
fix(local): enable rich toast colors and drop raw errors from artifac…
AnishSarkar22 Sep 14, 2026
985ad07
feat(local): add an artifact count badge to the Artifacts tab icon
AnishSarkar22 Sep 14, 2026
b0ea4ad
fix(local): swap Network settings icon to ComputerEthernetIcon
AnishSarkar22 Sep 14, 2026
5d506d6
feat(local): voice the podcast through a TextToSpeech protocol, Kokor…
CREDO23 Sep 14, 2026
e1a6146
feat(local): regenerate an artifact, and fail with a reason a person …
CREDO23 Sep 14, 2026
12ed5c0
feat(local): add a per-workspace type filter to the artifacts list
AnishSarkar22 Sep 14, 2026
69ad10d
Merge pull request #1779 from AnishSarkar22/fix/local-app-ui
AnishSarkar22 Sep 14, 2026
f089f5d
feat(local): paint the infographic with the image model from a chat-m…
CREDO23 Sep 15, 2026
9f3315a
feat(local): study viewers for flashcards, quiz and mind map
CREDO23 Sep 15, 2026
c4c8586
chore(local): drop product references from comments
CREDO23 Sep 15, 2026
c77b520
feat(local): kokoro voice catalog per language
CREDO23 Sep 15, 2026
ee17cf7
feat(local): podcast brief checked at job creation
CREDO23 Sep 15, 2026
2d36f7c
feat(local): podcast brief endpoint reopens the last episode
CREDO23 Sep 15, 2026
28e14fc
feat(local): podcast outline sized to the brief
CREDO23 Sep 15, 2026
f792f6f
feat(local): podcast segments drafted with recap and one retry
CREDO23 Sep 15, 2026
e65cb8a
refactor(local): update licensing and Keygen integration details in d…
MODSetter Sep 15, 2026
93c1a1c
feat(local): podcast pipeline runs the reviewed brief end to end
CREDO23 Sep 15, 2026
6e00088
feat(local): podcast brief form reviewed before generating
CREDO23 Sep 15, 2026
28ae63d
feat(local): studio and ingest drain their own queues, studio on 4 th…
CREDO23 Sep 15, 2026
dcc0c02
feat(local): the chat model names images and writes their prompt
CREDO23 Sep 15, 2026
667ade3
feat(local): artifact rows show when they were generated
CREDO23 Sep 15, 2026
ca22721
feat(local): artifact list filters by type
CREDO23 Sep 15, 2026
e292566
feat(local): artifacts tab counts generations in progress
CREDO23 Sep 15, 2026
c145434
Revert "fix(local): never hold a SQLite transaction across a model ca…
CREDO23 Sep 15, 2026
dfbfa0b
Revert "feat(local): artifacts tab counts generations in progress"
CREDO23 Sep 15, 2026
fb8ce2b
fix(local): studio artifact list polish
CREDO23 Sep 15, 2026
97ff90d
fix(local): timestamps leave the API as UTC
CREDO23 Sep 15, 2026
8c7acd1
fix(local): SQLite transactions take the write lock up front and neve…
CREDO23 Sep 15, 2026
aeefaab
feat(pivot): update marketing and SEO strategies for community-local …
MODSetter Sep 15, 2026
ca9d0c4
Merge upstream/dev into the Studio pipelines branch
CREDO23 Sep 15, 2026
90c1fec
Merge pull request #1780 from CREDO23/feat/local-studio-pipelines-and…
CREDO23 Sep 15, 2026
0d1da19
fix(local): claim WAL before the sidecars race for it
CREDO23 Sep 15, 2026
161c10f
Merge pull request #1781 from CREDO23/fix/local-wal-boot-race
CREDO23 Sep 15, 2026
587f822
feat(chat): add error classification module for failed generations
AnishSarkar22 Sep 15, 2026
75af463
feat(chat): classify failed replies, discard empty turns, and defer r…
AnishSarkar22 Sep 15, 2026
48428f9
fix(alert): center icon against wrapped and multi-line content
AnishSarkar22 Sep 15, 2026
423d3b5
feat(chat): type the classified error event from the stream
AnishSarkar22 Sep 15, 2026
3497f24
feat(chat): track generation errors per message with retry support
AnishSarkar22 Sep 15, 2026
f94a37d
feat(chat): add inline error notice component
AnishSarkar22 Sep 15, 2026
addb5df
feat(chat): render the error notice below a failed reply
AnishSarkar22 Sep 15, 2026
3c73b41
refactor(chat): drop the floating error banner for inline errors
AnishSarkar22 Sep 15, 2026
719ed82
Merge pull request #1782 from AnishSarkar22/fix/local-app-ui
AnishSarkar22 Sep 15, 2026
d8cd5da
chore: consolidate skills into .cursor/skills as single source of tru…
AnishSarkar22 Sep 15, 2026
9259e30
chore: move skills from .cursor/skills to .agents/skills for cross-ag…
AnishSarkar22 Sep 15, 2026
778e48d
Merge pull request #1783 from AnishSarkar22/feat/homepage
AnishSarkar22 Sep 15, 2026
08edfc9
chore: remove skills-lock.json, no longer needed
AnishSarkar22 Sep 15, 2026
6d6a4e2
feat(skills): remove emil-design-eng skill
AnishSarkar22 Sep 15, 2026
3779c68
feat(ui): add shared easing tokens and apply deliberate easing and du…
AnishSarkar22 Sep 15, 2026
3f9030d
Revert "feat(ui): add shared easing tokens and apply deliberate easin…
AnishSarkar22 Sep 15, 2026
b985dac
feat(skills): add apple-design skill
AnishSarkar22 Sep 15, 2026
54c32aa
feat(skills): update frontend-workflow skill
AnishSarkar22 Sep 15, 2026
006f6ce
chore(gitignore): ignore the homepage-reference workspace
AnishSarkar22 Sep 15, 2026
452fc42
chore(logos): replace six raster marks with svg
AnishSarkar22 Sep 15, 2026
d817081
style(sunset): reflow to biome formatting
AnishSarkar22 Sep 15, 2026
11a2c39
feat(homepage): add a scoped stylesheet for the landing page
AnishSarkar22 Sep 15, 2026
2b11a2d
feat(homepage): add landing page sections, nav, footer and content
AnishSarkar22 Sep 15, 2026
83919aa
feat(homepage): rebuild the landing page and drop the social proof se…
AnishSarkar22 Sep 15, 2026
85c3858
feat(homepage): render the landing page inside its own nav and footer
AnishSarkar22 Sep 15, 2026
383c58d
refactor(homepage): move shared navbar and footer onto semantic tokens
AnishSarkar22 Sep 15, 2026
8ff36b6
refactor(web): extract a shared site shell and rebuild the pricing pa…
AnishSarkar22 Sep 15, 2026
f4a90b1
feat(keygen): pin Keygen CE web and worker images for Coolify
CREDO23 Sep 15, 2026
318ac20
refactor(web): pare the hero back to one call to action and quiet the…
AnishSarkar22 Sep 15, 2026
03665bc
feat(cta-homepage): add dither homepage for cta background
AnishSarkar22 Sep 15, 2026
03a241c
refactor(web): replace the footer wordmark with a fluted-glass panel
AnishSarkar22 Sep 15, 2026
30ccc1e
perf(homepage): serve the hero dither texture as a 39KB webp and calm…
AnishSarkar22 Sep 15, 2026
6184eba
refactor(web): rebuild the contact page on the shared site design
AnishSarkar22 Sep 15, 2026
56f9958
refactor(web): rename the connectors marketing page to plugins
AnishSarkar22 Sep 15, 2026
7c01dcd
refactor(web): rebuild connector pages on the shared site design, tri…
AnishSarkar22 Sep 15, 2026
da8ec0f
refactor(web): rebuild the blog on the shared site design
AnishSarkar22 Sep 15, 2026
3f0e381
fix(css): remove the hover animation
AnishSarkar22 Sep 15, 2026
6b1e412
chore: added initial readme drafts
MODSetter Sep 15, 2026
895af6e
fix(ratelimit): keep serving when Redis is unreachable
CREDO23 Sep 15, 2026
e7350bc
refactor(license): gather the module into app/license/
CREDO23 Sep 15, 2026
7f1195c
test(license): drop the suites that stood on fakes
CREDO23 Sep 15, 2026
e65b7cc
feat(license): let the Keygen client target a self-hosted instance
CREDO23 Sep 15, 2026
56a902e
refactor(web): unify section headings and spacing across the homepage
AnishSarkar22 Sep 15, 2026
01585d0
fix(keygen-ce): print the policy ids check.py just created
CREDO23 Sep 15, 2026
8ba21ed
refactor(web): rebuild the license page on the shared site design, ti…
AnishSarkar22 Sep 15, 2026
0b148b6
refactor(web): correct the bundled-model homepage copy, match the nav…
AnishSarkar22 Sep 15, 2026
2aac862
refactor(web): add "No cloud in the loop" illustration to the on-your…
AnishSarkar22 Sep 15, 2026
a7265b0
fix(license): ship the real account key, not the public test seed
CREDO23 Sep 15, 2026
0e7ac8a
refactor(web): underline "9 platforms" on the pricing page and add a …
AnishSarkar22 Sep 15, 2026
fec2062
fix(pricing): updated the UI for pricing section
AnishSarkar22 Sep 15, 2026
85fba3c
refactor(web): swap the local-model-or-key illustration for a local/k…
AnishSarkar22 Sep 15, 2026
341bbdb
fix(pricing): correct wording
AnishSarkar22 Sep 15, 2026
cc401c6
feat(ui): add more pages
AnishSarkar22 Sep 15, 2026
02ef7fd
Merge pull request #1786 from AnishSarkar22/feat/homepage
AnishSarkar22 Sep 15, 2026
f0f811c
feat(chat): scope RAG to the sources sent with each message
CREDO23 Sep 15, 2026
3254c5a
refactor(payments): give Stripe its own module and invert the license…
CREDO23 Sep 15, 2026
079b84c
refactor(license): take the license emails back from the mailer
CREDO23 Sep 15, 2026
111b010
refactor(license): split the 615-line service into what it actually did
CREDO23 Sep 16, 2026
e0e9123
Merge pull request #1787 from MODSetter/refactor/license-slice
CREDO23 Sep 16, 2026
803e6ac
feat(chat): let users pick which sources RAG uses
CREDO23 Sep 16, 2026
b23dc24
feat(license): trust a list of signing keys, and let CI enforce it
CREDO23 Sep 16, 2026
c1147b8
Merge branch 'dev' of https://github.com/MODSetter/SurfSense into dev
CREDO23 Sep 16, 2026
a930305
feat(license): put the license and update rows in the sidebar footer
CREDO23 Sep 16, 2026
858aa1c
fix(updates): ask before the sidebar check reaches github.com
CREDO23 Sep 16, 2026
30f20d7
refactor(updates): one switch for update checks, and it lives in Network
CREDO23 Sep 16, 2026
970c509
Merge pull request #1788 from MODSetter/feat/desktop-license-key-rota…
CREDO23 Sep 16, 2026
f9c8ab8
fix(packaging): cut the installer payload below the NSIS 2 GB limit
MODSetter Sep 16, 2026
1b03b8e
Merge pull request #1789 from MODSetter/fix/local-installer-size
CREDO23 Sep 16, 2026
f3d04a7
feat(local): introduce chat testing endpoint and enhance model capabi…
MODSetter Sep 16, 2026
edfac0c
Merge pull request #1790 from MODSetter/fix/remote-model-capabilities
MODSetter Sep 16, 2026
65e9170
refactor(home): standardize badges/pills, drop decorative icons, and …
AnishSarkar22 Sep 16, 2026
bfc2c98
feat(ui): change some homepage UI
AnishSarkar22 Sep 16, 2026
6696e2b
fix(fonts): stop Roboto swap flash and repair broken font-mono fallback
AnishSarkar22 Sep 16, 2026
e908150
feat(home): turn the claims row into a tabbed artifacts/open-source/p…
AnishSarkar22 Sep 16, 2026
f07e34a
feat(home): add HomeFormats section showcasing the twelve artifact types
AnishSarkar22 Sep 16, 2026
9c02dc1
feat(artifacts-section): improve artifacts section ui for homepage
AnishSarkar22 Sep 16, 2026
d91d7e9
refactor(web): swap public pages from lucide-react to hugeicons via a…
AnishSarkar22 Sep 16, 2026
06a5a12
Merge pull request #1791 from AnishSarkar22/feat/homepage
AnishSarkar22 Sep 16, 2026
d09fa7c
feat(home): animate the hero dither shader and set d9aa90 as the shar…
AnishSarkar22 Sep 16, 2026
c3456fb
Merge remote-tracking branch 'origin' into fix/local-app-ui
AnishSarkar22 Sep 16, 2026
56dae5b
refactor(studio): extract artifact viewers into a registry with a sha…
AnishSarkar22 Sep 16, 2026
b4937e2
feat(studio): group image/infographic under a shared MediaViewer with…
AnishSarkar22 Sep 16, 2026
856800a
feat(studio): add an in-panel xlsx table viewer and drop the fill/flo…
AnishSarkar22 Sep 16, 2026
6cb69da
refactor(studio): move stage padding onto flowing-content viewers via…
AnishSarkar22 Sep 16, 2026
55c5875
feat(studio): add a pdfjs-dist PDF viewer with trackpad zoom and a sh…
AnishSarkar22 Sep 16, 2026
16c58b5
feat(studio): add a pptx viewer registered in the artifact viewer reg…
AnishSarkar22 Sep 16, 2026
4c02102
feat(studio): rewrite quiz viewer with review/score screens and add a…
AnishSarkar22 Sep 16, 2026
7fbde63
feat(studio): render quiz explanation/question text as parsed study-t…
AnishSarkar22 Sep 16, 2026
2c6ab23
fix(pdf-viewer): set globalThis.pdfjsLib before loading pdf_viewer.mj…
AnishSarkar22 Sep 16, 2026
0bccc2f
fix(artifact-panel): hide the download button for flashcards and quiz…
AnishSarkar22 Sep 16, 2026
8b1816d
feat(quiz): persist quiz progress server-side with new state routes a…
AnishSarkar22 Sep 16, 2026
6bc7e3f
fix(quiz-ui): made dropdown presentable
AnishSarkar22 Sep 16, 2026
629338c
fix(local): size the Ollama context window to the prompt
CREDO23 Sep 16, 2026
fb985bc
feat(studio): persist flashcard study progress and port the surfsense…
AnishSarkar22 Sep 16, 2026
c252c48
fix(frontend): point the typecheck script at tsc -b instead of the no…
AnishSarkar22 Sep 16, 2026
4380adc
feat(images): generate images on this machine with stable-diffusion.cpp
MODSetter Sep 16, 2026
0effae4
feat(studio): add a docx viewer, rotate the mindmap icon, and switch …
AnishSarkar22 Sep 16, 2026
c3a69f4
feat(studio): add fit-to-width zoom controls and ctrl+scroll zoom to …
AnishSarkar22 Sep 16, 2026
160ffda
fix(images): set sd-server's exec bit after unzip rather than trust t…
MODSetter Sep 16, 2026
f94f0ab
feat(document-artifact): rename Document to Word for better visibility
AnishSarkar22 Sep 16, 2026
43308bb
feat(studio): render summary artifacts as rich markdown via Streamdow…
AnishSarkar22 Sep 16, 2026
d5010c3
feat(studio): render podcast transcripts as markdown and share the St…
AnishSarkar22 Sep 16, 2026
6c9d9ee
feat(local): classify a model into a prompt tier
CREDO23 Sep 16, 2026
540b0a0
feat(local): ask a provider what it knows about one model
CREDO23 Sep 16, 2026
61b1769
Merge pull request #1793 from AnishSarkar22/feat/homepage
AnishSarkar22 Sep 16, 2026
6f8d359
feat(local): record a model's tier when it is chosen
CREDO23 Sep 16, 2026
8fc13bb
Merge pull request #1794 from AnishSarkar22/fix/local-app-ui
AnishSarkar22 Sep 16, 2026
26e1eab
Merge pull request #1792 from MODSetter/feat/local-image-generation
MODSetter Sep 16, 2026
2eae052
feat(local): load the prompt a case ships for one tier
CREDO23 Sep 16, 2026
1f0198a
feat(local): give every Studio case and chat three prompts
CREDO23 Sep 16, 2026
6b48b7d
build(local): bundle every prompt file
CREDO23 Sep 16, 2026
383d7f7
log which prompt tier a model gets
CREDO23 Sep 16, 2026
ce62805
fix(local): show a model the reply it is asked to repair
CREDO23 Sep 16, 2026
551cfcc
feat(worker): stop ingest and studio jobs when they are cancelled
CREDO23 Sep 16, 2026
c32f00d
feat(api): expose cancel routes for ingest and studio jobs
CREDO23 Sep 16, 2026
a581105
feat(ui): cancel running sources and artifacts from the row menu
CREDO23 Sep 16, 2026
73d3deb
Merge upstream/dev into feat/prompt-tiering
CREDO23 Sep 16, 2026
1cc1057
Merge pull request #1795 from CREDO23/feat/prompt-tiering
CREDO23 Sep 16, 2026
1a4d1f0
feat(ui): show how many sources the chat will use
CREDO23 Sep 16, 2026
042af8e
fix(electron): start Linux dev without a setuid chrome-sandbox
CREDO23 Sep 16, 2026
d21c24d
Merge pull request #1796 from CREDO23/feat/local-cancel-jobs
CREDO23 Sep 16, 2026
ea8640f
fix(local): resolve remote model capabilities from a vendored models.…
AnishSarkar22 Sep 16, 2026
46c3460
Merge pull request #1797 from AnishSarkar22/feat/model-capability
AnishSarkar22 Sep 16, 2026
aa6e2cf
feat(alembic): fix migration nos
MODSetter Sep 16, 2026
e55dff9
refactor(dashboard): restructure sidebar layout and rename chat threa…
AnishSarkar22 Sep 16, 2026
889431c
fix(dashboard): align "Sources" and "Artifacts" subheadings with side…
AnishSarkar22 Sep 16, 2026
58a6781
feat(ui): scroll models settings header with content and add deselect…
AnishSarkar22 Sep 16, 2026
f609c6b
fix(studio): use one alert icon for retry rows and reposition tooltip…
AnishSarkar22 Sep 16, 2026
b74faa4
fix(ui): make relative-time snapshot fresh instead of stale cached ti…
AnishSarkar22 Sep 16, 2026
9dfe864
feat(onboarding): add animated dither shader background and refine co…
AnishSarkar22 Sep 16, 2026
ff1aa3e
fix(ui): make source count non-interactive and stabilize composer pos…
AnishSarkar22 Sep 16, 2026
ef02298
feat(chat): title-fade masking and row polish for the chats dialog
AnishSarkar22 Sep 16, 2026
d8b4a7f
fix(chat-dialog-ui): made wider
AnishSarkar22 Sep 16, 2026
c16e1b7
chore(backend): document the licensing env for Stripe, Resend and Keygen
CREDO23 Sep 17, 2026
1b498b9
feat(web): send Individual buyers to the Stripe Payment Link
CREDO23 Sep 17, 2026
870d8c0
fix(model-selection): always confirm before testing a model, with cop…
AnishSarkar22 Sep 17, 2026
52203b9
feat(model-catalog): show installed models first, then image models, …
AnishSarkar22 Sep 17, 2026
4c8e380
Merge pull request #1798 from AnishSarkar22/feat/dashboard-restructure
AnishSarkar22 Sep 17, 2026
746a921
feat(onboarding): update welcome headline to "Air-gapped, open source…
AnishSarkar22 Sep 17, 2026
a1d5893
fix(onboarding): switch dither foreground color to muted-foreground i…
AnishSarkar22 Sep 17, 2026
ebf19e7
fix(marketing): align /sunset with site design system and use muted-f…
AnishSarkar22 Sep 17, 2026
aa20c73
chore(local): set the app version to 2.0.0
CREDO23 Sep 17, 2026
cb0c3cd
feat(license): fold trial form into hero and collapse resend into a d…
AnishSarkar22 Sep 17, 2026
cf2618f
Merge pull request #1799 from AnishSarkar22/feat/dashboard-restructure
AnishSarkar22 Sep 17, 2026
e2c2775
feat(license): send the app download link with the licence, and run t…
CREDO23 Sep 17, 2026
4ec5dd7
Merge remote-tracking branch 'upstream/dev' into licensing-e2e
CREDO23 Sep 17, 2026
47146b7
Merge pull request #1800 from CREDO23/licensing-e2e
CREDO23 Sep 17, 2026
c58b429
Merge branch 'pr-1777' into sunset-fixes
CREDO23 Sep 17, 2026
e0138dc
Merge pull request #1801 from CREDO23/sunset-fixes
CREDO23 Sep 17, 2026
f1d7c3a
feat(sunset): sign in for export in one click on Google deployments
CREDO23 Sep 17, 2026
f83a771
refactor(web): drop Sign in from the site nav and footer
CREDO23 Sep 17, 2026
9102fd3
feat(downloads): offer the trial by email from the download page
CREDO23 Sep 17, 2026
7720a9b
chore(web): carry the desktop release tag in the web tree
CREDO23 Sep 17, 2026
dec4eed
fix(downloads): link the release by tag instead of /releases/latest
CREDO23 Sep 17, 2026
f1c92b6
Merge pull request #1802 from CREDO23/sunset-export-signin
CREDO23 Sep 17, 2026
41062f8
fix(electron): eliminate theme flash on reload via nativeTheme-backed…
AnishSarkar22 Sep 17, 2026
c3ef2bb
copy(onboarding): tighten the "nothing leaves this computer" welcome …
AnishSarkar22 Sep 17, 2026
4aabdae
feat(docs): add spec for llmfit
AnishSarkar22 Sep 17, 2026
f11c123
feat(spec): results from tests for llmfit
AnishSarkar22 Sep 17, 2026
7912a3c
docs(spec): add llmfit model catalog expansion spec with new cross-pl…
AnishSarkar22 Sep 17, 2026
47d3504
docs: add Windows GPU verification results to llmfit catalog spec
AnishSarkar22 Sep 17, 2026
7c34ff5
feat(curated-models): add display metadata to curated model manifest
AnishSarkar22 Sep 17, 2026
d3f58db
refactor(llm): rename recommended catalog bucket to curated
AnishSarkar22 Sep 17, 2026
64733b1
feat(llmfit): cache hardware scans and stop gating explore on ollama_…
AnishSarkar22 Sep 17, 2026
f7de6d3
feat(catalog): serve curated and installed rows without a hardware scan
AnishSarkar22 Sep 17, 2026
72d70f0
test(llm): cover scan caching, curated placeholders, and fallback pulls
AnishSarkar22 Sep 17, 2026
252ab7d
feat(model-catalog): show scan-free curated models with a scan CTA
AnishSarkar22 Sep 17, 2026
73c4b32
chore(model-selection): drop unused installedFirst prop
AnishSarkar22 Sep 17, 2026
c18e861
fix(model-catalog): hide fit badge for unscanned rows
AnishSarkar22 Sep 17, 2026
08cbba5
fix(model-catalog): keep unknown-fit badge visible only after a real …
AnishSarkar22 Sep 17, 2026
014b0ec
Merge pull request #1803 from AnishSarkar22/fix/electron-theme-flash
AnishSarkar22 Sep 17, 2026
5514b02
fix(model-catalog): reserve list height while searching More models
AnishSarkar22 Sep 17, 2026
6c9af98
git commit -m "docs(plans): move llmfit catalog expansion spec into a…
AnishSarkar22 Sep 17, 2026
3556067
fix(llmfit): pin explicit :latest tag on untagged hf.co fallback pulls
AnishSarkar22 Sep 17, 2026
f47f445
fix(model-picker): show curated/scanned display names instead of raw …
AnishSarkar22 Sep 17, 2026
e13a359
fix(model-selection): let long model names truncate instead of overfl…
AnishSarkar22 Sep 17, 2026
704f76e
fix(llmfit): stop probing hardware on unrefreshed catalog loads, only…
AnishSarkar22 Sep 17, 2026
d7b868c
fix(settings): stop Models dialog content from clipping past its edge
AnishSarkar22 Sep 17, 2026
55863cb
fix(models): show a clean provider/repo name for hf.co fallback insta…
AnishSarkar22 Sep 17, 2026
ad8d196
Merge pull request #1804 from AnishSarkar22/feat/local-model-catalog
AnishSarkar22 Sep 17, 2026
b337173
fix(license): say a license expires rather than renews
CREDO23 Sep 17, 2026
d349b60
Merge pull request #1805 from CREDO23/license-expires-wording
CREDO23 Sep 17, 2026
91496df
feat(site-nav): add sticky /sunset announcement bar to the nav header
AnishSarkar22 Sep 17, 2026
9e6bc49
Merge pull request #1806 from AnishSarkar22/feat/banner-homepage
AnishSarkar22 Sep 17, 2026
43a2ace
fix(license): send GitHub tag-release download links in license mail
CREDO23 Sep 17, 2026
f82fb8d
refactor(studio): lift document selection into shared workspace state
AnishSarkar22 Sep 17, 2026
435f409
feat(studio): replace inline source checklist with a drill-down sub-view
AnishSarkar22 Sep 17, 2026
f1bcb82
chore(local): synced plans
MODSetter Sep 17, 2026
48f68ad
fix(egress): gate the catalog's own model download, not just the manu…
AnishSarkar22 Sep 17, 2026
1c5dd8f
fix(local): scroll long source lists in dialogs, label Updates sectio…
AnishSarkar22 Sep 17, 2026
104b8b4
feat(local): gate manual update checks behind egress consent, mark re…
AnishSarkar22 Sep 17, 2026
66b6cab
feat(ui): extract podcast form's native select into a shared componen…
AnishSarkar22 Sep 17, 2026
8317e33
fix(chat): match the chats dialog's scroll fade to its actual background
AnishSarkar22 Sep 17, 2026
3eb0be2
fix(egress): associate network settings checkbox with its label
AnishSarkar22 Sep 17, 2026
141464d
Merge pull request #1807 from AnishSarkar22/feat/local-model-catalog
AnishSarkar22 Sep 17, 2026
0487698
feat(seo): updated seo statergy
MODSetter Sep 17, 2026
29095a7
Merge branch 'dev' of https://github.com/MODSetter/SurfSense into dev
MODSetter Sep 17, 2026
a96ce15
feat(local): pre release tweaks
MODSetter Sep 18, 2026
49149ec
feat(local): more pre release tweaks
MODSetter Sep 18, 2026
7b3dffd
fix(email): update support email address to rohan@surfsense.com in li…
MODSetter Sep 18, 2026
ab7b9aa
fix(electron): install the frontend's deps before building it
CREDO23 Sep 17, 2026
2aa2fe9
fix(frontend): catch the studio and update tests up with their compon…
CREDO23 Sep 18, 2026
a2ed161
fix linux local packagin
CREDO23 Sep 18, 2026
491f94b
feat(electron): swap the desktop icon to the marketing black mark
CREDO23 Sep 18, 2026
bbf9959
docs: ship the 2.0 README for the local desktop app
CREDO23 Sep 18, 2026
e57c964
chore: drop sunset client trees from the working repo
CREDO23 Sep 17, 2026
35c83ca
chore: drop leftover skills, plans, and unused docker extras
CREDO23 Sep 17, 2026
2029358
chore: add AGENTS.md and a small set of vendor skills
CREDO23 Sep 17, 2026
48a97be
docs: make first contributions match one tree, not the old hosted stack
CREDO23 Sep 17, 2026
ac11dbb
docs: shorten issue and PR templates so they are easy to fill
CREDO23 Sep 17, 2026
626e771
docs: add backend and web READMEs so each product has a setup path
CREDO23 Sep 17, 2026
bb58326
Merge pull request #1808 from CREDO23/repo-reorg
CREDO23 Sep 18, 2026
3cbc056
docs: restore the Trendshift badge on the README
CREDO23 Sep 18, 2026
6295c53
chore: merge main into dev before the release PR
CREDO23 Sep 18, 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
  •  
  •  
  •  
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# Deepening

How to deepen a cluster of shallow modules safely, given its dependencies. Assumes the vocabulary in [LANGUAGE.md](LANGUAGE.md) **module**, **interface**, **seam**, **adapter**.
How to deepen a cluster of shallow modules safely, given its dependencies. Assumes the vocabulary in [SKILL.md](SKILL.md): **module**, **interface**, **seam**, **adapter**.

## Dependency categories

When assessing a candidate for deepening, classify its dependencies. The category determines how the deepened module is tested across its seam.

### 1. In-process

Pure computation, in-memory state, no I/O. Always deepenable merge the modules and test through the new interface directly. No adapter needed.
Pure computation, in-memory state, no I/O. Always deepenable: merge the modules and test through the new interface directly. No adapter needed.

### 2. Local-substitutable

Expand All @@ -31,7 +31,7 @@ Third-party services (Stripe, Twilio, etc.) you don't control. The deepened modu

## Testing strategy: replace, don't layer

- Old unit tests on shallow modules become waste once tests at the deepened module's interface exist delete them.
- Old unit tests on shallow modules become waste once tests at the deepened module's interface exist; delete them.
- Write new tests at the deepened module's interface. The **interface is the test surface**.
- Tests assert on observable outcomes through the interface, not internal state.
- Tests should survive internal refactors they describe behaviour, not implementation. If a test has to change when the implementation changes, it's testing past the interface.
- Tests should survive internal refactors, since they describe behaviour, not implementation. If a test has to change when the implementation changes, it's testing past the interface.
44 changes: 44 additions & 0 deletions .agents/skills/codebase-design/DESIGN-IT-TWICE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Design It Twice

When the user wants to explore alternative interfaces for a chosen deepening candidate, use this parallel sub-agent pattern. Based on "Design It Twice" (Ousterhout): your first idea is unlikely to be the best.

Uses the vocabulary in [SKILL.md](SKILL.md): **module**, **interface**, **seam**, **adapter**, **leverage**.

## Process

### 1. Frame the problem space

Before spawning sub-agents, write a user-facing explanation of the problem space for the chosen candidate:

- The constraints any new interface would need to satisfy
- The dependencies it would rely on, and which category they fall into (see [DEEPENING.md](DEEPENING.md))
- A rough illustrative code sketch to ground the constraints, not a proposal, just a way to make the constraints concrete

Show this to the user, then immediately proceed to Step 2. The user reads and thinks while the sub-agents work in parallel.

### 2. Spawn sub-agents

Spawn 3+ sub-agents in parallel. Each must produce a **radically different** interface for the deepened module.

Prompt each sub-agent with a separate technical brief (file paths, coupling details, dependency category from [DEEPENING.md](DEEPENING.md), what sits behind the seam). The brief is independent of the user-facing problem-space explanation in Step 1. Give each agent a different design constraint:

- Agent 1: "Minimize the interface: aim for 1–3 entry points max. Maximise leverage per entry point."
- Agent 2: "Maximise flexibility: support many use cases and extension."
- Agent 3: "Optimise for the most common caller: make the default case trivial."
- Agent 4 (if applicable): "Design around ports & adapters for cross-seam dependencies."

Include both [SKILL.md](SKILL.md) vocabulary and CONTEXT.md vocabulary in the brief so each sub-agent names things consistently with the architecture language and the project's domain language.

Each sub-agent outputs:

1. Interface (types, methods, params, plus invariants, ordering, error modes)
2. Usage example showing how callers use it
3. What the implementation hides behind the seam
4. Dependency strategy and adapters (see [DEEPENING.md](DEEPENING.md))
5. Trade-offs: where leverage is high, where it's thin

### 3. Present and compare

Present designs sequentially so the user can absorb each one, then compare them in prose. Contrast by **depth** (leverage at the interface), **locality** (where change concentrates), and **seam placement**.

After comparing, give your own recommendation: which design you think is strongest and why. If elements from different designs would combine well, propose a hybrid. Be opinionated: the user wants a strong read, not a menu.
114 changes: 114 additions & 0 deletions .agents/skills/codebase-design/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
---
name: codebase-design
description: Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.
---

# Codebase Design

Design **deep modules**: a lot of behaviour behind a small interface, placed at a clean seam, testable through that interface. Use this language and these principles wherever code is being designed or restructured. The aim is leverage for callers, locality for maintainers, and testability for everyone.

## Glossary

Use these terms exactly: don't substitute "component," "service," "API," or "boundary." Consistent language is the whole point.

**Module**: anything with an interface and an implementation. Deliberately scale-agnostic: a function, class, package, or tier-spanning slice. _Avoid_: unit, component, service.

**Interface**: everything a caller must know to use the module correctly: the type signature, but also invariants, ordering constraints, error modes, required configuration, and performance characteristics. _Avoid_: API, signature (too narrow, they refer only to the type-level surface).

**Implementation**: what's inside a module, its body of code. Distinct from **Adapter**: a thing can be a small adapter with a large implementation (a Postgres repo) or a large adapter with a small implementation (an in-memory fake). Reach for "adapter" when the seam is the topic; "implementation" otherwise.

**Depth**: leverage at the interface. The amount of behaviour a caller (or test) can exercise per unit of interface they have to learn. A module is **deep** when a large amount of behaviour sits behind a small interface, **shallow** when the interface is nearly as complex as the implementation.

**Seam** _(Michael Feathers)_: a place where you can alter behaviour without editing in that place; the *location* at which a module's interface lives. Where to put the seam is its own design decision, distinct from what goes behind it. _Avoid_: boundary (overloaded with DDD's bounded context).

**Adapter**: a concrete thing that satisfies an interface at a seam. Describes *role* (what slot it fills), not substance (what's inside).

**Leverage**: what callers get from depth. More capability per unit of interface they learn. One implementation pays back across N call sites and M tests.

**Locality**: what maintainers get from depth. Change, bugs, knowledge, and verification concentrate in one place rather than spreading across callers. Fix once, fixed everywhere.

## Deep vs shallow

**Deep module** = small interface + lots of implementation:

```
┌─────────────────────┐
│ Small Interface │ ← Few methods, simple params
├─────────────────────┤
│ │
│ Deep Implementation│ ← Complex logic hidden
│ │
└─────────────────────┘
```

**Shallow module** = large interface + little implementation (avoid):

```
┌─────────────────────────────────┐
│ Large Interface │ ← Many methods, complex params
├─────────────────────────────────┤
│ Thin Implementation │ ← Just passes through
└─────────────────────────────────┘
```

When designing an interface, ask:

- Can I reduce the number of methods?
- Can I simplify the parameters?
- Can I hide more complexity inside?

## Principles

- **Depth is a property of the interface, not the implementation.** A deep module can be internally composed of small, mockable, swappable parts; they just aren't part of the interface. A module can have **internal seams** (private to its implementation, used by its own tests) as well as the **external seam** at its interface.
- **The deletion test.** Imagine deleting the module. If complexity vanishes, it was a pass-through. If complexity reappears across N callers, it was earning its keep.
- **The interface is the test surface.** Callers and tests cross the same seam. If you want to test *past* the interface, the module is probably the wrong shape.
- **One adapter means a hypothetical seam. Two adapters means a real one.** Don't introduce a seam unless something actually varies across it.

## Designing for testability

Good interfaces make testing natural:

1. **Accept dependencies, don't create them.**

```typescript
// Testable
function processOrder(order, paymentGateway) {}

// Hard to test
function processOrder(order) {
const gateway = new StripeGateway();
}
```

2. **Return results, don't produce side effects.**

```typescript
// Testable
function calculateDiscount(cart): Discount {}

// Hard to test
function applyDiscount(cart): void {
cart.total -= discount;
}
```

3. **Small surface area.** Fewer methods = fewer tests needed. Fewer params = simpler test setup.

## Relationships

- A **Module** has exactly one **Interface** (the surface it presents to callers and tests).
- **Depth** is a property of a **Module**, measured against its **Interface**.
- A **Seam** is where a **Module**'s **Interface** lives.
- An **Adapter** sits at a **Seam** and satisfies the **Interface**.
- **Depth** produces **Leverage** for callers and **Locality** for maintainers.

## Rejected framings

- **Depth as ratio of implementation-lines to interface-lines** (Ousterhout): rewards padding the implementation. We use depth-as-leverage instead.
- **"Interface" as the TypeScript `interface` keyword or a class's public methods**: too narrow: interface here includes every fact a caller must know.
- **"Boundary"**: overloaded with DDD's bounded context. Say **seam** or **interface**.

## Going deeper

- **Deepening a cluster given its dependencies**, see [DEEPENING.md](DEEPENING.md): dependency categories, seam discipline, and replace-don't-layer testing.
- **Exploring alternative interfaces**, see [DESIGN-IT-TWICE.md](DESIGN-IT-TWICE.md): spin up parallel sub-agents to design the interface several radically different ways, then compare on depth, locality, and seam placement.
3 changes: 3 additions & 0 deletions .agents/skills/codebase-design/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
interface:
display_name: "Codebase Design"
short_description: "Vocabulary for deep-module design"
1 change: 1 addition & 0 deletions .agents/skills/fastapi
18 changes: 0 additions & 18 deletions .agents/skills/humanizer/.claude-plugin/marketplace.json

This file was deleted.

15 changes: 0 additions & 15 deletions .agents/skills/humanizer/.claude-plugin/plugin.json

This file was deleted.

29 changes: 0 additions & 29 deletions .agents/skills/humanizer/.github/workflows/validate.yml

This file was deleted.

49 changes: 0 additions & 49 deletions .agents/skills/humanizer/AGENTS.md

This file was deleted.

21 changes: 0 additions & 21 deletions .agents/skills/humanizer/LICENSE

This file was deleted.

Loading
Loading