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ć.
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.
- Twój dźwięk
- Twoje transkrypcje
- Etykiety mówców
- Twoje pliki i Twoja licencja
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
127.0.0.1, a wszystko zostanie na Twoim komputerze). Przy pierwszym uruchomieniu jeden raz pobierają się modele mowy (pełna lista poniżej).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ć
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.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.
# 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.
Linux — ss / lsof
# (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.
_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.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.