Prywatność

Saykeep działa na twoim komputerze. Twój dźwięk, nagrania, transkrypcje i etykiety mówców są przetwarzane lokalnie i zapisywane wyłącznie we wskazanym przez ciebie folderze; podsumowania tworzy endpoint zgodny z API OpenAI, który ty konfigurujesz — domyślnie lokalny serwer, albo wybrana przez ciebie usługa z własnym kluczem API. To nie obietnica, w którą musisz uwierzyć — to właściwość, którą możesz sprawdzić.

Nagrywanie jest zawsze widoczne — nie ma trybu ukrytego

Saykeep nagrywa jawnie. Gdy nagrywanie spotkań jest aktywne, pokazuje to stale włączony wskaźnik: ikona na pasku menu, linia statusu z czasem trwania i wskaźnikami poziomu dźwięku na żywo oraz karta nagrywania. Żadne ustawienie ani ścieżka w kodzie nie mogą go wyłączyć. W produkcie nie ma ukrytego, dyskretnego ani mało widocznego trybu nagrywania; to zasada zablokowana w kodzie i pilnowana testami, a nie ustawienie domyślne, które dałoby się po cichu zmienić. Przy pierwszym nagrywanym spotkaniu pojawia się też informacja o zgodzie, bo w niektórych miejscach każdy uczestnik musi się zgodzić, zanim zaczniesz nagrywać (zobacz FAQ). Uzyskanie tej zgody to twoja odpowiedzialność; zadaniem Saykeep jest sprawić, żeby nagrywania nie dało się przeoczyć.

O tym, co zostaje, decydujesz ty

Saykeep nie gromadzi nagrań na zapas. Gdy transkrypcja jest już zapisana, może skasować audio za ciebie — pytając po każdym spotkaniu albo automatycznie sprzątając audio starsze niż zadana liczba dni. Bezpiecznik: audio znika tylko wtedy, gdy istnieje udana transkrypcja, a transkrypcje i podsumowania nigdy nie są kasowane automatycznie. Każde spotkanie możesz też usunąć w całości z przeglądarki nagrań albo wymazać zawartość Saykeep — nagrania, modele, ustawienia — jednym chronionym krokiem (potwierdzasz, wpisując ERASE). Wszystko to zwykłe pliki w twoim folderze; o tym, co zostaje, decydujesz ty.

W skrócie

Podczas normalnego użytkowania nic nie opuszcza twojego komputera — poza tekstem transkrypcji, jeśli ty włączysz podsumowania spotkań; wtedy trafia on do endpointu, który ty konfigurujesz (domyślnie lokalny serwer na 127.0.0.1). Przy pierwszym uruchomieniu jeden raz pobierają się modele mowy (pełna lista poniżej).
Bez kont, bez logowania, bez synchronizacji z chmurą. Nie ma żadnego serwera Saykeep.
Bez telemetrii, analityki, raportowania błędów i śledzenia użycia. Niczego z tego nie ma w kodzie.
Licencja nie łączy się z żadnym serwerem. Klucze licencyjne są weryfikowane offline względem klucza publicznego wkompilowanego w aplikację — nie ma serwera aktywacji ani żadnego połączenia sieciowego.
Eksport diagnostyki zapisuje lokalny plik, o którego udostępnieniu decydujesz ty; nie nawiązuje żadnego połączenia sieciowego i usuwa sekrety.

Jedyny wyjątek podczas normalnego użytkowania — sprawdzanie aktualizacji

Saykeep może sprawdzać, czy istnieje nowsza wersja. To sprawdzanie jest domyślnie wyłączone i nigdy nie otwiera połączenia, dopóki go nie włączysz. Po włączeniu wysyła najwyżej jedno anonimowe zapytanie dziennie do GitHub Releases — bez numeru wersji, identyfikatora komputera ani żadnego innego identyfikatora. Tylko powiadamia; nigdy samo niczego nie pobiera ani nie instaluje. Zostaw je wyłączone, a Saykeep nie wykona ani jednego zapytania o aktualizację.

Jak to sprawdzić

1. Obserwuj na żywo. Na macOS uruchom Little Snitch; na Linuksie sudo ss -tunp | grep saykeep albo lsof -i -a -p <pid>. Z podsumowaniami wskazującymi lokalny endpoint i już pobranymi modelami zobaczysz zero połączeń wychodzących przy normalnym użytkowaniu.
2. Zajrzyj do konfiguracji. Settings → Advanced → „Export diagnostics…” pokazuje wynikowy adres URL endpointu LLM (z usuniętymi danymi dostępowymi), więc możesz dokładnie potwierdzić, dokąd trafiłoby podsumowanie.
3. Przeczytaj pełną listę poniżej. Każde połączenie, jakie aplikacja może nawiązać, jest wyliczone w aneksie — to ten sam plik, który trzymamy w repozytorium kodu — poniżej w całości, bajt w bajt.

Aneks poniżej przytaczamy w oryginale, po angielsku i słowo w słowo — to kanoniczny artefakt zaufania, którego nie zmieniamy nawet tłumaczeniem.

Uwaga o nazwie kodowej: poniższy dokument to wewnętrzny artefakt zaufania aplikacji, przytoczony słowo w słowo. Używa wewnętrznej nazwy kodowej „Whisperer” — to ta sama aplikacja, którą publicznie nazywamy Saykeep.
# NETWORK.md — every connection Whisperer can make

Whisperer is a **local-first** application. Your audio, recordings, transcripts, and summaries are
processed on your machine and stored only in your configured storage folder. This document is an
exhaustive, behavior-verifiable inventory of **every** network connection the app is capable of
making — nothing else happens. You do not have to take our word for it: run a network monitor
(Little Snitch on macOS, `lsof -i` / `ss -tunp` on Linux, a firewall log on Windows) and confirm the
app opens only the connections listed here.

*This file is kept in sync with the code. If you find an outbound connection not listed here, that is
a bug — please report it.*

## The complete list

| # | Host | When | What is sent | Contains your data? | Avoidable? |
|---|------|------|--------------|---------------------|------------|
| 1 | **The LLM endpoint you configure** (`llm.endpoint_url`; default `http://127.0.0.1:8080/v1` — a server on your own machine) | When a meeting summary is generated, and a `/models` health probe when you test the connection | The meeting **transcript text** (for summarization) or a models list request (for the probe) | **Yes — transcript text.** It goes only to the endpoint *you* set. By default that is a local server and nothing leaves your machine. If you point it at a cloud API, your transcript goes there **by your choice** | Yes — disable summaries / leave the endpoint unset. Meetings still record and transcribe fully locally |
| 2 | **huggingface.co** (and its model CDN) | First time a model is needed: the Whisper-family speech-to-text models and, if you enable diarization, the speaker models | A standard model **download** request; for the diarization models, your Hugging Face **token** in an `Authorization` header (only if you provide one) | No — these are downloads *to* your machine. Your token authenticates the download; no audio/transcript is uploaded | Partly — once models are cached locally they are not re-downloaded. Diarization is optional |
| 3 | **huggingface.co/api** (token check) | Only when you click "Test" on the Hugging Face token field in the wizard/settings | Your HF token in an `Authorization` header, to verify it can access the diarization model | No | Yes — it only runs when you test the token |
| 4 | **api.github.com** | At most once/day, ONLY if you enable Check-for-updates (off by default) | An anonymous latest-release request — no version string, machine id, or identifier | No | Yes — never runs unless you turn it on |

*Row 4 note: this check is off by default and never opens a socket while off.*

That is the entire list.

## What Whisperer **never** does

- **No telemetry, analytics, crash reporting, or usage tracking.** No analytics SDK is linked into
  the app — and you can hold us to it from the outside: the rows above are everything, and the wire
  is checkable.
- **No accounts, no login, no cloud sync.** There is no Whisperer server. Nothing is uploaded.
- **Your recordings, transcripts, and summaries are never sent anywhere** except the transcript text
  to the LLM endpoint *you* configured (row 1). They are stored only in your storage folder.
- **No license phone-home.** License keys are verified **offline** against a compiled-in public
  key — no activation server, no network call, ever.
- **The diagnostics export** (Settings → Advanced) writes a **local file** you choose whether to
  share; it makes no network call, and it redacts secrets.

## Local helpers are not network connections

Whisperer runs some local subprocesses — `pw-record` (Linux system audio), the bundled
`whisperer-syscapture` (macOS system audio), `osascript`/`caffeinate` (macOS), and your OS's
file-reveal command. These are **on-device** and open no network sockets.

## How to verify

1. **Watch it live:** macOS → Little Snitch; Linux → `sudo ss -tunp | grep whisperer` or `lsof -i -a -p <pid>`; Windows → Resource Monitor / firewall log. With summaries pointed at a local endpoint and models already cached, you will see **zero** outbound connections during normal use.
2. **Inspect your config:** Settings → Advanced → "Export diagnostics…" shows your resolved
   `llm.endpoint_url` (credentials redacted) so you can confirm where summaries would go.
3. **Hold us to the contract:** Whisperer is closed-source, so instead of "read the code," this file
   *is* the auditable surface — the only things that ever open a socket are the rows above. If you
   ever observe a connection that is not listed here, that is a bug; report it and we will treat it
   as one.

## Planned additions (not yet active in the app)

- **Self-hosted model mirror:** a Whisperer-controlled download host that will serve the diarization
  models **without a Hugging Face token**. Until it is live, diarization models come from
  huggingface.co (rows 2–3). Like rows 2–3, it would only ever *download* models to your machine —
  nothing is uploaded.

Sprawdź to samodzielnie — krok po kroku

macOS — Little Snitch

Zainstaluj Little Snitch (albo darmowe Little Snitch Mini), otwórz monitor sieci i używaj Saykeep normalnie — dyktuj, nagraj spotkanie, wygeneruj podsumowanie na swoim lokalnym endpoincie. Wiersz Saykeep cały czas pokazuje zero połączeń wychodzących.

Little Snitch — Saykeep
Outbound connections: 0
podczas 42-minutowego nagrywanego spotkania

Linux — ss / lsof

$ sudo ss -tunp | grep saykeep
# (no output — zero sockets)
$ lsof -i -a -p $(pgrep saykeep)
# (no output — zero sockets)

Jeśli kiedykolwiek zobaczysz połączenie, którego nie ma na opublikowanej liście, to błąd — daj nam znać.