Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
b555dec
docs(docker): the image's sign-in is a SurfSense page that Caddy enfo…
AnishSarkar22 Oct 27, 2026
f0f8885
feat(frontend): the Docker image's sign-in screen and Settings › Access
AnishSarkar22 Oct 27, 2026
8361bc6
feat(docker): an access service behind Caddy signs browsers in
AnishSarkar22 Oct 27, 2026
d11955d
feat(docker): the image runs llama.cpp, sd.cpp and audio.cpp on the CPU
AnishSarkar22 Oct 27, 2026
a43fb2a
feat(docker): HTTPS for a LAN name or a public domain
AnishSarkar22 Oct 27, 2026
1f05cc1
feat(local): plugin sign-ins from another device return to that device
AnishSarkar22 Oct 27, 2026
cc4dfd1
feat(local): finish a ChatGPT sign-in from another device by pasting …
AnishSarkar22 Oct 27, 2026
ff310b5
feat(frontend): in Docker a source downloads from its menu, and a cli…
AnishSarkar22 Oct 27, 2026
a79a8aa
refactor(frontend): one IN_CONTAINER flag for what the Docker build d…
AnishSarkar22 Oct 27, 2026
f1ee8af
refactor(local): the Claude dialog knows it is in Docker from its build
AnishSarkar22 Oct 27, 2026
fd13496
feat(local): the Docker image keeps no usage statistics
AnishSarkar22 Oct 27, 2026
9ddb923
feat(frontend): dictation says the microphone needs HTTPS where the b…
AnishSarkar22 Oct 27, 2026
51f2e03
feat(local): the ChatGPT paste-back route answers only in the container
AnishSarkar22 Oct 27, 2026
36ddda5
fix(docker): the image carries what Office support's LibreOffice link…
AnishSarkar22 Oct 27, 2026
9bd7947
fix(docker): a sign-in's callback needs no session
AnishSarkar22 Oct 27, 2026
d7e1d3b
feat(local): the chat model's capability says which Studio path it takes
AnishSarkar22 Oct 27, 2026
1d2aded
feat(frontend): Settings says what the chat model in use can do, in e…
AnishSarkar22 Oct 27, 2026
b0542e0
feat(studio): the simple web page is styled as the agent's pages are
AnishSarkar22 Oct 27, 2026
a28a129
feat(frontend): in Docker the right panel's toggle sits on a heading'…
AnishSarkar22 Oct 27, 2026
6b7ccc6
feat(frontend): a message's time and Copy show only while it is hovered
AnishSarkar22 Oct 27, 2026
e1ec989
feat(frontend): a message's time and Copy fade in and out on hover
AnishSarkar22 Oct 27, 2026
e5cbf7d
feat(docker): a dev stack runs the image with the checkout mounted in
AnishSarkar22 Oct 27, 2026
31032e2
feat(frontend): the dev server's tab says SurfSense Dev and wears the…
AnishSarkar22 Oct 27, 2026
4aedcc4
docs(agents): the Docker commands build, run and test the image witho…
AnishSarkar22 Oct 28, 2026
fd72c4b
feat(frontend): every dashboard column's title sits on one 56 px row
AnishSarkar22 Oct 28, 2026
535e362
feat(frontend): a column edge shows a short grip, centred on its border
AnishSarkar22 Oct 28, 2026
24dad11
refactor(frontend): the update's download ring is shared
AnishSarkar22 Oct 28, 2026
95a6710
feat(frontend): voice input sets up in Settings and says its problems…
AnishSarkar22 Oct 28, 2026
df40a45
feat(frontend): a speech download can be cancelled from the set-up po…
AnishSarkar22 Oct 28, 2026
f8f0381
feat(frontend): voice input records inside the composer's own row
AnishSarkar22 Oct 28, 2026
b9d172e
fix(frontend): the speech set-up popover's text is not selectable
AnishSarkar22 Oct 28, 2026
4bd584f
feat(docker): every instance has a password, set up on first visit, a…
AnishSarkar22 Oct 28, 2026
10d36e6
fix(docker): the workers' internal routes are refused to every browser
AnishSarkar22 Oct 28, 2026
c3d0cf7
feat(docker): the dev stack opens to the machine's networks, as the i…
AnishSarkar22 Oct 28, 2026
259ffbf
docs(docker): the Docker proposal becomes architecture/docker.md
AnishSarkar22 Oct 28, 2026
594e30f
docs(legacy): the legacy split proposal becomes architecture/legacy.m…
AnishSarkar22 Oct 28, 2026
f703265
fix(docker): sign-in reads paths as Caddy routes them, and counts eac…
AnishSarkar22 Oct 28, 2026
f316fe9
fix(chatgpt): a pasted sign-in address finishes the flow on the event…
AnishSarkar22 Oct 28, 2026
99bedb3
fix(runtimes): a relative --out stages where it says
AnishSarkar22 Oct 28, 2026
229076c
fix(docker): the dev stack opens on any host name the access service …
AnishSarkar22 Oct 28, 2026
4bf7c82
feat(frontend): English hot-reloads from the code on the dev server
AnishSarkar22 Oct 28, 2026
7f71ab0
feat(frontend): the language follows the browser where there is no El…
AnishSarkar22 Oct 28, 2026
d8a58ea
fix(docker): password changes run one at a time
AnishSarkar22 Oct 28, 2026
d341bc9
docs(docker): the installer is described as planned, and product deci…
AnishSarkar22 Oct 28, 2026
e1ae146
feat(docker): one-line installers that install and update the image
AnishSarkar22 Oct 28, 2026
9d20ceb
docs(readme): every README gives the Docker install command
AnishSarkar22 Oct 28, 2026
f40856b
test(docker): the architecture check accepts install.ps1's wording
AnishSarkar22 Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 35 additions & 7 deletions .github/workflows/docker-tests.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Docker Tests

# The Docker entry and ghcr.io/modsetter/surfsense (docs/proposals/docker/README.md),
# The Docker entry and ghcr.io/modsetter/surfsense (docs/architecture/docker.md),
# tested without pushing an image; release-docker.yml publishes. dev pushes write
# only the build cache. The shared core's own
# tests are Desktop Tests'; here only what the entry and the image add.
Expand Down Expand Up @@ -36,6 +36,7 @@ jobs:
frontend: ${{ steps.filter.outputs.frontend || 'true' }}
image: ${{ steps.filter.outputs.image || 'true' }}
backend: ${{ steps.filter.outputs.backend || 'true' }}
installer: ${{ steps.filter.outputs.installer || 'true' }}
steps:
- uses: actions/checkout@v7
with:
Expand All @@ -57,10 +58,8 @@ jobs:
- 'docker/surfsense/**'
- 'surfsense_local/headless/**'
- 'surfsense_local/sidecars/**'
# opencode's staging, and what it imports.
- 'surfsense_local/runtimes/opencode/**'
- 'surfsense_local/runtimes/pinned-download.mjs'
- 'surfsense_local/runtimes/windows-locks/**'
# The image stages llama.cpp, sd.cpp, audio.cpp and opencode with these.
- 'surfsense_local/runtimes/**'
- 'surfsense_local/backend/pyproject.toml'
- 'surfsense_local/backend/uv.lock'
# The bundled models' downloads, which the build runs.
Expand All @@ -81,6 +80,12 @@ jobs:
- 'surfsense_local/backend/scripts/fetch_*.py'
- 'backend/plugins/bundles/core/manifest/**'
- '.github/workflows/docker-tests.yml'
installer:
- 'docker/scripts/**'
# The files the installers download.
- 'docker/surfsense/docker-compose.yml'
- 'docker/surfsense/.env.example'
- '.github/workflows/docker-tests.yml'

headless:
name: Headless
Expand Down Expand Up @@ -156,7 +161,9 @@ jobs:
persist-credentials: false

- name: Check the compose file
run: docker compose -f docker/surfsense/docker-compose.yml --env-file docker/surfsense/.env.example config -q
run: |
docker compose -f docker/surfsense/docker-compose.yml --env-file docker/surfsense/.env.example config -q
docker compose -f docker/surfsense/dev/compose.yml config -q

- uses: docker/setup-buildx-action@v4

Expand Down Expand Up @@ -239,11 +246,32 @@ jobs:
-v "$PWD/docs/contracts:/app/docs/contracts:ro" \
surfsense:backend-tests

# The one-line installers against a stand-in docker; ubuntu-latest carries
# shellcheck and pwsh, so both scripts run.
installer:
name: Installers
runs-on: ubuntu-latest
timeout-minutes: 10
needs: changes
if: needs.changes.outputs.installer == 'true'
steps:
- uses: actions/checkout@v7
with:
# The token stays out of .git/config, where the code under test could read it.
persist-credentials: false
- uses: actions/setup-node@v7
with:
node-version: 24
- name: Shellcheck
run: shellcheck docker/scripts/install.sh
- name: Run tests
run: node --test docker/scripts/install.test.ts

gate:
name: Docker Gate
runs-on: ubuntu-latest
timeout-minutes: 10
needs: [changes, headless, frontend, image, backend]
needs: [changes, headless, frontend, image, backend, installer]
if: always()
steps:
- name: Check every job
Expand Down
5 changes: 3 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Desktop app plus SurfSense's own backend. Three trees:
| `surfsense_local` | Electron desktop |
| `backend` | The one SurfSense backend, one process run by `server/`: the [license portal](docs/architecture/license/portal.md) in `license/`, its `mailer/`, and `plugins/`, which holds SurfSense's own plugin servers ([plugin host](docs/architecture/plugin-host.md)) and the [registry](docs/architecture/plugin-registry.md); `plugins/bundles/` holds the earlier, local design's SDK and tooling, deferred |

The hosted service closed on 18 Oct 2026, when its user data was purged. The self-hosted stack, `surfsense_backend`, `surfsense_web`, `surfsense_mcp` and `docker/`, lives only on the `legacy` branch ([legacy split](docs/proposals/legacy-split/README.md)). Product direction is local + API.
The hosted service closed on 18 Oct 2026, when its user data was purged. The self-hosted stack, `surfsense_backend`, `surfsense_web`, `surfsense_mcp` and `docker/`, lives only on the `legacy` branch ([legacy stack](docs/architecture/legacy.md)). Product direction is local + API.

## Code organization

Expand Down Expand Up @@ -83,7 +83,8 @@ pre-commit run --all-files
| Desktop | `cd surfsense_local/electron && pnpm test` |
| Docker entry | `cd surfsense_local/headless && pnpm test` |
| Frontend in Docker mode | `cd surfsense_local/frontend && pnpm test:docker` (tests tagged `docker`; `pnpm test` leaves them out) |
| Docker image | `SURFSENSE_TEST_IMAGE=<image> node --test surfsense_local/headless/image.test.ts` (starts the image on port 4929) |
| Docker installers | `node --test docker/scripts/install.test.ts` (both scripts against a stand-in `docker`; `install.ps1`'s half needs `pwsh`) |
| Docker image | `SURFSENSE_TEST_IMAGE=<image> node --test surfsense_local/headless/image.test.ts` (starts the image on ports 4929 and 4943; `SURFSENSE_TEST_IMAGE_PORT=4931` moves them to 4931 and 4945, beside a running install) |
| Backend in the image | build `docker/surfsense/Dockerfile --target backend-tests` and run it with `tests/` and `docs/contracts/` mounted, as `docker-tests.yml` does; it runs `pytest -m image` |
CI: `.github/workflows/`. New behavior: one failing test, then the minimum code to pass it. Use the `tdd` skill. Tests hit public seams, not internals.

Expand Down
8 changes: 8 additions & 0 deletions README.ar.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ https://github.com/user-attachments/assets/073577b7-f055-4f59-8540-330bd764aeb0
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**استضفه بنفسك على خادم** باستخدام Docker، وافتحه من أي جهاز على شبكتك. شغّل الأمر نفسه مرة أخرى للتحديث.

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

على Windows مع Docker Desktop: `irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## بداية سريعة

1. تثبيت SurfSense وإتمام الإعداد الأولي (Start setting up).
Expand Down
8 changes: 8 additions & 0 deletions README.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ SurfSense ist eine kostenlose Open-Source-Desktop-App für Dokumente, die du nic
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**Betreibe es selbst auf einem Server** mit Docker und öffne es von jedem Gerät in deinem Netzwerk. Führe denselben Befehl erneut aus, um es zu aktualisieren.

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

Unter Windows mit Docker Desktop: `irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## Schnellstart

1. Installiere SurfSense und durchlaufe beim ersten Start die Einrichtung.
Expand Down
8 changes: 8 additions & 0 deletions README.es.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ SurfSense es una aplicación de escritorio gratuita y de código abierto para lo
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**Alójalo en tu propio servidor** con Docker y ábrelo desde cualquier dispositivo de tu red. Ejecuta el mismo comando de nuevo para actualizarlo.

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

En Windows con Docker Desktop: `irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## Inicio rápido

1. Instala SurfSense y completa la configuración inicial.
Expand Down
8 changes: 8 additions & 0 deletions README.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ SurfSense est une application de bureau gratuite et open source pour les documen
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**Hébergez-le vous-même sur un serveur** avec Docker, et ouvrez-le depuis n’importe quel appareil de votre réseau. Relancez la même commande pour le mettre à jour.

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

Sous Windows avec Docker Desktop : `irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## Démarrage rapide

1. Installez SurfSense et effectuez la configuration initiale.
Expand Down
8 changes: 8 additions & 0 deletions README.hi.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ SurfSense एक मुफ़्त, ओपन-सोर्स डेस्क
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**इसे Docker के साथ अपने सर्वर पर खुद होस्ट करें**, और अपने नेटवर्क के किसी भी डिवाइस से खोलें। अपडेट करने के लिए वही कमांड फिर से चलाएं।

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

Docker Desktop वाले Windows पर: `irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## झटपट शुरुआत

1. SurfSense इंस्टॉल करें और शुरुआती सेटअप पूरा करें।
Expand Down
8 changes: 8 additions & 0 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ SurfSense は、アップロードできない文書のための、無料のオ
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**Docker でサーバーにセルフホスト**し、ネットワーク上のどのデバイスからでも開けます。更新するには、同じコマンドをもう一度実行してください。

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

Windows(Docker Desktop)の場合:`irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## クイックスタート

1. SurfSense をインストールし、最初のセットアップを済ませます。
Expand Down
8 changes: 8 additions & 0 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ SurfSense는 업로드할 수 없는 문서를 위한 무료 오픈소스 데스
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**Docker로 서버에 직접 호스팅**하고, 네트워크의 어느 기기에서든 여세요. 업데이트하려면 같은 명령을 다시 실행하세요.

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

Docker Desktop이 설치된 Windows에서: `irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## 빠른 시작

1. SurfSense를 설치하고 초기 설정을 마칩니다.
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ SurfSense is a free, open-source desktop app for documents you can't upload. A p
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**Self-host it on a server** with Docker, and open it from any device on your network. Run the same command again to update.
Comment thread
AnishSarkar22 marked this conversation as resolved.
Resolved

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

On Windows with Docker Desktop: `irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## Quick start

1. Install SurfSense and do the initial onboarding setup.
Expand Down
8 changes: 8 additions & 0 deletions README.pt-BR.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ O SurfSense é um aplicativo de desktop gratuito e open source para os documento
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**Hospede no seu próprio servidor** com Docker e abra de qualquer dispositivo da sua rede. Execute o mesmo comando de novo para atualizar.

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

No Windows com Docker Desktop: `irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## Início rápido

1. Instale o SurfSense e faça a configuração inicial.
Expand Down
8 changes: 8 additions & 0 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ SurfSense — бесплатное настольное приложение с
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**Разверните на своём сервере** с Docker и открывайте с любого устройства в вашей сети. Чтобы обновить, запустите ту же команду ещё раз.

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

В Windows с Docker Desktop: `irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## Быстрый старт

1. Установите SurfSense и пройдите первоначальную настройку.
Expand Down
8 changes: 8 additions & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ SurfSense 是一款免费开源的桌面应用,专为那些不能上传的文
| **macOS** Apple Silicon | [SurfSense-arm64.dmg](https://www.surfsense.com/downloads/mac?src=readme) |
| **Linux** x64 | [AppImage](https://www.surfsense.com/downloads/linux-appimage?src=readme) · [deb](https://www.surfsense.com/downloads/linux-deb?src=readme) |

**用 Docker 在服务器上自托管**,并在你网络中的任何设备上打开。再次运行同一条命令即可更新。

```bash
curl -fsSL https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.sh | bash
```

在装有 Docker Desktop 的 Windows 上:`irm https://raw.githubusercontent.com/MODSetter/SurfSense/main/docker/scripts/install.ps1 | iex`

## 快速开始

1. 安装 SurfSense,完成初始设置。
Expand Down
Loading
Loading