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 — a domyślnie nie ma tam nic, więc podsumowania są wyłączone, dopóki czegoś nie wskażesz: lokalnego serwera albo wybranej przez Ciebie usługi z własnym kluczem API. To nie obietnica, w którą musisz uwierzyć — to właściwość, którą możesz sprawdzić.

Co zostaje, co wychodzi

Ty decydujesz, dokąd trafiają podsumowania. Cała reszta zostaje.

Rozpoznawanie mowy, transkrypcje i etykiety mówców zawsze działają na Twoim komputerze — tego nie da się przestawić. Wybierasz tylko, kto tworzy podsumowania Twoich spotkań. Jedno ustawienie. Trzy opcje.

Zostaje na tym Macu — zawsze
  • Twój dźwięk
  • Twoje transkrypcje
  • Etykiety mówców
  • Twoje pliki i Twoja licencja
Co wychodzi na zewnątrz
Nic Twojego.
Podsumowania też powstają tutaj.
Tekst transkrypcji i Twoja opcjonalna notatka „o Tobie”.
Prosto do wybranego dostawcy, na Twoim własnym kluczu.
Nic Twojego.
Krok podsumowania jest pomijany.
Twoja transkrypcja trafia do serwera modelu na tym Macu, który sam instalujesz i uruchamiasz — llama.cpp, LM Studio, Ollama albo cokolwiek zgodnego z API OpenAI — pod adres, który wpiszesz (domyślnie to lokalny adres llama.cpp). Jeśli Twój Mac udźwignie lokalny model, wszystko zostaje w domu, a Wi-Fi może być wyłączone przez cały czas.
Użyj dowolnej usługi zgodnej z API OpenAI, z własnym kluczem API. Saykeep wysyła tekst transkrypcji — oraz opcjonalny opis „o Tobie”, jeśli go ustawisz — i nic więcej: nigdy dźwięku, prosto z Twojego Maca, bez żadnego serwera Saykeep po drodze. Twój klucz, ich zasady prywatności, Twoja decyzja.
Bez podłączonej usługi AI? Nagrywanie, transkrypcja i etykiety mówców działają w pełni — tylko podsumowanie zostaje po Twojej stronie.

Przełączaj do woli — lewa kolumna nigdy się nie zmienia.

Każde połączenie, jakie aplikacja może nawiązać — także te, które nie mają nic wspólnego z podsumowaniami — jest wymienione niżej, a w całości w NETWORK.md. To ustawienie możesz zmienić w każdej chwili.

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 — a zaraz po instalacji nie ma tam nic, więc podsumowania są wyłączone, dopóki nie wskażesz serwera (wskaż lokalny na 127.0.0.1, a wszystko zostanie na Twoim komputerze). 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.
W aplikacji nie ma telemetrii, analityki, raportowania błędów ani śledzenia użycia. Niczego z tego nie ma w kodzie. Ta strona internetowa to osobna sprawa — odwiedziny na niej mierzymy i niżej piszemy dokładnie jak.
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.
Każde połączenie, jakie aplikacja może nawiązać
Serwer podsumowań, który wskażeszTekst transkrypcji Twojego spotkania, gdy powstaje podsumowanie, oraz zapytanie o listę modeli (nic Twojego), gdy klikniesz Test w ustawieniach. Domyślnie to serwer na Twoim własnym Macu; jeśli wskażesz chmurowe API, Twoja transkrypcja trafia tam z Twojego wyboru.
huggingface.coJednorazowe pobranie modeli mowy przy pierwszym uruchomieniu — i nigdy więcej: model, który jest już na dysku, ładuje się z dysku, bez łączenia z huggingface.co. (Wersja 0.4.0 wysyłała jedno małe zapytanie o metadane przy każdym ładowaniu modelu — nazwę modelu i wersję biblioteki, bez tokenu; znaleźliśmy je, sprawdzając dane do tej strony, i poprawiliśmy w 0.4.1.)
models.saykeep.appJeden model etykiet mówców (~30 MB), pobierany raz, anonimowo, i nigdy więcej.
saykeep.appSprawdzanie aktualizacji: najwyżej raz dziennie, tylko jeśli zgodzisz się na nie przy konfiguracji (domyślnie zaznaczone „Tak”). Wysyła Twoją wersję Saykeep i nic więcej, a aktualizację instaluje tylko za Twoją zgodą.
huggingface.co/apiTylko jeśli w ustawieniach dodasz token Hugging Face i naciśniesz Test.

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 zapytanie dziennie do saykeep.app po mały podpisany plik z numerem aktualnej wersji. To zapytanie zawiera standardowy nagłówek User-Agent z nazwą aplikacji i jej wersją (Saykeep/<wersja> Sparkle/2.9.6) i nic poza tym — bez identyfikatora komputera, konta, klucza licencyjnego, plików cookie ani żadnego identyfikatora, który mógłby Cię wyróżnić lub powiązać dwa zapytania. Jeśli zdecydujesz się zainstalować aktualizację, Saykeep pobiera ją i instaluje wyłącznie za Twoją zgodą — nigdy po cichu i nigdy w trakcie nagrywania spotkania. Zostaw sprawdzanie 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.
Dwa testy, które zrobisz samodzielnie

Zablokuj aplikację w zaporze

Little Snitch, LuLu, firmowe proxy — co wolisz. Saykeep działa dalej: transkrypcja i etykiety mówców nigdy nie potrzebowały sieci.

Wyłącz Wi-Fi

Gdy modele są już na dysku, nagraj godzinne spotkanie przy wyłączonej sieci. Transkrypcja i etykiety mówców wyjdą takie same — prostszego audytu nie ma.

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`; **no default** — until you set one, summaries are off and nothing is sent) | 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. Out of the box no endpoint is set, so nothing is sent at all; point it at a server on your own machine and nothing leaves it. 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 — only if you opt in to the Parakeet engine in Settings — the Parakeet-TDT-0.6B-v3 weights from the Hub repos `mlx-community/parakeet-tdt-0.6b-v3` (macOS) or `istupakov/parakeet-tdt-0.6b-v3-onnx` plus the `istupakov/silero-vad-onnx` segmenter it needs for long audio (Linux/Windows), each pinned to a fixed revision. Diarization models come from here **only if you added a Hugging Face token** (optional fallback — the default path is row 5) | 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 optional Hugging Face token field in Settings ▸ Diarization | 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 | **saykeep.app** (the update appcast) | At most once/day, only if you enabled updates (you are asked once at first run) | A GET of a static XML file. The request carries a standard User-Agent naming the app and its version — `Saykeep/<version> Sparkle/2.9.6` — and nothing else: no machine id, no account, no licence key, no cookie, no identifier that could single you out or link two requests together. Downloads and installs the release only when you consent | Your Saykeep version, and that a copy of Saykeep is checking. Nothing else about you or your machine | Turn it off in Settings ▸ General ▸ Check for updates and no request is ever made |
| 5 | **models.saykeep.app** (the speaker-label model mirror) | Once, only if speaker labels (diarization) are enabled and the model is not yet on disk — shown in the "Getting Saykeep ready" download window | An anonymous GET of a static ~30 MB tarball (`diarization-v1.tar.gz`) — no machine id, account, token, or any identifier (the request carries only a generic HTTP-client name). The file is checksum-verified before it is installed | Nothing about you or your machine is sent | Yes — turn speaker labels off (Settings ▸ Diarization) and no request is ever made; once installed it is never re-downloaded |

*Row 2 note (2026-09-05): 0.4.0 also made one small metadata request to huggingface.co each time
a cached Whisper model loaded (at launch, when the meeting model loaded, and on every switch
between the two) — the loader was handed a Hub repo name instead of the on-disk path. Found and
proved on the wire while fact-checking the website
(`docs/ceo/evidence/2026-09-04-hf-launch-metadata-request.md`), disclosed here the same day, and
**fixed in 0.4.1**: a cached model now loads from its local snapshot with no request (wire proof:
three requests → zero across load → meeting → dictation). It carried no token and no identifier.
If you are still on 0.4.0, update, or block huggingface.co — the model loads from disk either way.*

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

*Row 4 honesty note (corrected 2026-08-30): this row previously claimed the check sends "no version
string". That was wrong — the update engine (Sparkle) sends its standard User-Agent, which names the
app version, and nothing in the app overrides it. The row now states what actually goes over the
wire. Verify it yourself with Little Snitch or `tcpdump` per the "watch it live" section below —
that is the point of this document.*

*Row 5 note: this is the token-free replacement for the Hugging Face diarization download (rows 2–3). Those two rows now apply only if you chose to add a token yourself.*

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, the only connection you will see during normal use is the **update check** — at most one request a day to the Saykeep appcast, and only if you said yes to it at first run (row 4). You will see your Saykeep version in that request's User-Agent, and nothing else identifying. The one other connection you may see is a **single** download of the speaker-label model the first time you open Saykeep with speaker labels enabled (row 5); it never repeats once the model is on disk. Turn the update check off in Settings and — once that one-time model download has happened, or with speaker labels off — you will see **zero** outbound connections.
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.

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 serwerze modelu. Co zobaczysz, gdy modele są już na dysku: nic. Bez konta, bez telemetrii, bez sprawdzania licencji — chyba że włączysz codzienne sprawdzanie aktualizacji albo wskażesz zdalną usługę do podsumowań. Każde z tych połączeń jest w tabeli powyżej.

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ć.

Ta strona to osobna sprawa — i owszem, mierzymy tu odwiedziny

Wszystko powyżej dotyczy aplikacji Saykeep na Twoim komputerze: nie ma w niej analityki, telemetrii ani raportowania awarii i możesz to sprawdzić na łączu. Ta strona — saykeep.app — jest zwykłą stroną internetową, a strony liczą odwiedzających. Wolimy powiedzieć to wprost, niż czekać, aż znajdziesz to w monitorze sieci.

Cloudflare Web Analytics liczy wyświetlenia stron przy każdej wizycie. Nie zapisuje żadnych plików cookie, nie zostawia niczego na Twoim urządzeniu i nie buduje Twojego profilu: Cloudflare używa adresu IP tylko po to, żeby ustalić przybliżony kraj, i go nie przechowuje. Stąd wiemy, czy ktokolwiek w ogóle tu trafił. Nie ma z czego rezygnować, bo na Twoim komputerze nic nie zostaje.
Google Analytics 4 działa tylko wtedy, gdy się na to zgodzisz w banerze. Dopóki tego nie zrobisz, żaden skrypt Google się nie pobiera i żadne cookie Google nie powstaje — tagu po prostu nie ma na stronie. Po zgodzie Google zapisuje pliki cookie analityczne (nazwy zaczynające się od _ga) i dostaje informacje o Twojej wizycie — oglądane strony, rodzaj urządzenia, przybliżoną lokalizację z adresu IP — w naszym imieniu. Sygnały Google i personalizację reklam mamy wyłączone, więc zostaje sam pomiar, nigdy reklama. Google to firma amerykańska, więc dane mogą być przetwarzane poza UE na podstawie standardowych klauzul umownych.
Odmowa nic Cię nie kosztuje — strona wygląda i działa tak samo, a pytania nie powtarzamy na każdej podstronie. Odpowiedź zostaje w Twojej przeglądarce (localStorage, klucz sk-consent) i nigdy do nas nie trafia. Zmienisz ją w każdej chwili linkiem „Pliki cookie i analityka” w stopce: wycofanie zgody wyłącza tag i kasuje pliki cookie _ga. Bloker reklam albo wyłączony JavaScript też trzymają Google z dala.

Te dwa światy nigdy się nie spotykają. W samej aplikacji nie działa żadna analityka, a ta strona nie ma wglądu w to, co nagrywasz, dyktujesz i przepisujesz. Osobnym wyjątkiem jest kasa: obsługuje ją Lemon Squeezy według własnej polityki prywatności.