Ostatnia aktualizacja: 20 października 2026
Prywatność
nodes to aplikacja jednej osoby, w zamkniętej becie. Ta strona mówi dokładnie, co opuszcza Twoje urządzenie, co go nie opuszcza, kto jeszcze ma z tym styczność i jak wyłączyć to, co jest opcjonalne. Napisana jest po to, żeby ją przeczytać, a nie przetrwać — jeśli coś tu jest niejasne, to błąd tej strony.
Krótko
- Twoje karty trafiają do chmury, kiedy synchronizujesz. Na tym polega synchronizacja. Leżą w bazie, z której czytać może tylko Twoje konto.
- Nie trafiają nigdzie indziej — ani do diagnostyki, ani do żadnego narzędzia analitycznego, ani do modelu językowego, chyba że korzystasz z funkcji AI i podasz własny klucz.
- W trakcie bety aplikacja zgłasza awarie i statystyki użycia — z których funkcji korzystasz, ile kart było w sesji — powiązane z Twoim kontem. Jeden przełącznik w Ustawieniach to wyłącza.
- Nic z tego nie jest sprzedawane, przekazywane reklamodawcom ani używane do trenowania czegokolwiek. Ani na tej stronie, ani w aplikacji nie ma sieci reklamowej ani zewnętrznego trackera.
Co zostaje na Twoim urządzeniu
Na komputerze i telefonie cała kolekcja leży w pliku SQLite na Twojej maszynie — po jednym na zalogowane konto. Nauka, edycja, import, graf wiedzy i planowanie powtórek działają lokalnie i offline. Kilka rzeczy nie wychodzi stąd nigdy:
- Oryginalne pliki multimedialne z importu
.apkgoraz.apkg, który wyeksportujesz. - Model osadzeń (112 MB) i samo liczenie osadzeń: tekst zamienia się w wektor na Twoim procesorze, nigdy w zewnętrznej usłudze.
- Moduł sprawdzający generatora fiszek, jeśli go pobierzesz (286 MB, na komputerze): porównuje każdą wygenerowaną fiszkę z fragmentem, z którego powstała, na Twoim procesorze, nigdy w zewnętrznej usłudze. Oba modele pobierasz z naszego serwera, gdy jesteś zalogowany. Żądanie sprawdza Twoją sesję w Supabase, a Cloudflare prowadzi z niego zwykłe logi serwera, jak dla reszty tej strony. Nie zawiera treści fiszek.
- Pliki PDF dodane do Biblioteki na komputerze. Nodes kopiuje każdy do własnego folderu na Twojej maszynie, po jednym folderze na konto, i czyta go stamtąd. Sama książka, miejsce, w którym skończono czytać, i wyszukiwane słowa nigdy nie są wysyłane ani synchronizowane, więc na innym urządzeniu jej nie będzie. Usunięcie książki kasuje tę kopię, a Twój oryginalny plik zostaje nietknięty.
- Dla każdej fiszki utworzonej z książki z Biblioteki: strona i fragment, z których pochodzi, żeby fiszka mogła otworzyć książkę w tym miejscu. Zostają na urządzeniu razem z książką i nigdy nie są wysyłane, synchronizowane ani dołączane do diagnostyki; same fiszki synchronizują się bez nich.
- Twoje ustawienie diagnostyki, klucz API do Gemini, jeśli go wpiszesz, oraz ustawienia interfejsu trzymane w preferencjach systemu.
- To, z czego powstała każda wygenerowana fiszka. Gdy generujesz fiszki, fragment, który model zacytował dla każdej z nich, oraz cały tekst, który mu podano, zostają w lokalnej bazie danych. Dotyczy to także fiszek, których nie zostawiłeś. Służy to sprawdzeniu, jak często generator pisze coś, czego w tekście nie ma, na prawdziwym materiale, a nie na tekście testowym. Ten zapis nigdy nie jest wysyłany, niezależnie od ustawienia diagnostyki. Z Nodes Plus fragment każdej fiszki trafia też jednorazowo do sprawdzania w chmurze opisanego przy funkcjach AI; nasz serwer nie zachowuje kopii.
Co trafia do chmury przy synchronizacji
Na komputerze i telefonie synchronizacja jest ręczna — dzieje się wtedy, gdy naciśniesz przycisk. Klient webowy pod adresem /app/ działa inaczej: nie ma lokalnej bazy, więc czyta i zapisuje kopię w chmurze bezpośrednio, a powtórki zrobione tam zapisują się na bieżąco.
Co jest wysyłane — wszystko pod Twoim kontem:
- Talie i karty — przód i tył każdej karty jako HTML, jej tagi oraz oryginalna notatka z Anki, jeśli karta pochodzi z importu. To jest treść Twoich kart. Trafia do chmury, bo inaczej ta sama kolekcja nie pojawiłaby się na drugim urządzeniu.
- Historia powtórek — każda odpowiedź, jej ocena i czas, a także podejścia do egzaminu.
- Ustawienia i harmonogram — parametry FSRS dla talii, kroki nauki, limity, konfiguracja „łatwych dni”.
- Osadzenia kart — wektory policzone na Twoim urządzeniu. Wektor pochodzi z treści karty i nie da się go czytać jak tekstu, ale traktuj go jak dane pochodne od kart, bo nimi jest.
- Zapisy usunięć — kiedy usuwasz kartę albo talię, do chmury trafia krótki zapis usunięcia, żeby dotarło ono do Twoich pozostałych urządzeń; potem znika z serwera.
- Obrazki z kart, jeśli jakieś masz. Do wyświetlania w kliencie webowym wysyłana jest pomniejszona, przekodowana kopia. Prywatna jest mapa: co się nazywa i gdzie leżą jego bajty. Same bajty leżą we wspólnym magazynie, pod ścieżką wyliczoną z sumy SHA-256 pliku — dzięki temu ten sam obrazek przechowywany jest raz dla wszystkich, którzy go mają.
- Zapis tego, co wygenerował kreator kart, jeśli z
niego korzystasz. Dla każdej karty zaproponowanej przez AI — łącznie z
tymi, które odznaczyłeś, i tymi, które kreator sam wstrzymał — powstaje
wiersz mówiący, która wersja pipeline'u ją napisała, który model
odpowiedział, co zmierzyły kontrole jakości i co następnie z nią
zrobiłeś: zachowanie, edycja, przywrócenie albo odrzucenie. Dzięki temu
wiemy, czy zmiana w kreatorze poprawiła karty, czy je pogorszyła — a z
samej karty tego się nie da odczytać.
Dwie rzeczy idą tu dalej niż reszta tej strony, więc warto powiedzieć je wprost. Zapis obejmuje tekst kart, które odrzuciłeś — tekst, którego nigdy nie zapisałeś i który nigdy nie stał się kartą — bo cały sens polega na porównaniu tego, co zaproponowano, z tym, co zgodziłeś się zatrzymać. A jeśli poprawiłeś kartę przed zapisaniem, obejmuje również to, co model napisał pierwotnie, żeby poprawka była widoczna jako poprawka. Tak samo z kartą, którą kreator uporządkował ✨ Formatuj, zanim Ci ją pokazał: jeśli zatrzymałeś uporządkowaną wersję, zapis obejmuje też tekst sprzed porządkowania. Tekst trafia też do zapisu przy karcie, którą kontrole wstrzymały, a Ty przywróciłeś i zatrzymałeś bez zmian, choć zapisana karta zawiera te same słowa: to najwięcej mówiący wiersz całego przebiegu, a zapis przetrwa kartę, jeśli ją potem usuniesz. Jeśli wyłączysz diagnostykę w Ustawieniach, żaden z tych tekstów nie jest wysyłany; numery wersji i pomiary nadal tak, a nie zawierają niczego, co napisałeś.
Ten ostatni punkt zasługuje na szczegół: magazyn obrazków może odczytać każdy, kto zna 256-bitową ścieżkę, a ścieżka nie zawiera ani nazwy pliku, ani nazwy talii, ani identyfikatora konta. Mapę, z której te ścieżki powstają, może odczytać wyłącznie Twoje konto. To nie jest sejf — to magazyn, w którym znalezienie Twojego obrazka wymaga wcześniejszej znajomości jego dokładnej zawartości.
Diagnostyka w trakcie bety
Aplikacja nie miała żadnego sposobu, żeby zobaczyć awarię. Osoba testująca, której ekran zrobił się czerwony, nie zostawiała po sobie niczego — a to kiepski sposób prowadzenia bety. Dlatego aplikacja zgłasza teraz dwie rzeczy. Obie obejmuje jeden przełącznik, domyślnie włączony, który aplikacja proponuje wyłączyć przy pierwszym uruchomieniu.
Statystyki użycia
Siedem nazw zdarzeń i ani jednej więcej — nazwę, której aplikacja nie zadeklarowała, baza odrzuca. Każde zdarzenie niesie liczby, flagi i ustalone etykiety; nigdy tekst, który wpisujesz:
app_opened— wersja aplikacji i platforma.study_session_completed— tryb tempa nauki, ile kart, jak długo, czy sesja została dokończona.import_finished/import_failed— format, ile kart, jak długo, a przy niepowodzeniu: na którym etapie i nazwa klasy błędu.generation_run— jak daleko doszło generowanie kart oraz ile stwierdzeń i kart zaproponowano, zostawiono i przyjęto — jako liczby.sync_finished— czy się udało, ile wierszy poszło w którą stronę, jak długo to trwało.feature_used— jedna etykieta z zamkniętej listy: widok grafu, czat o karcie, powiększenie karty, cofnięcie, rozładowanie zaległości, „inne ujęcia”, ściąga ze skrótami.
Zdarzenia czekają w kolejce na Twoim urządzeniu i wysyłane są przy starcie aplikacji oraz po synchronizacji, więc offline nie wychodzi nic. Kolejka mieści najwyżej 500 pozycji i porzuca wszystko starsze niż 30 dni.
Zgłoszenia awarii
Kiedy coś rzuci wyjątkiem, aplikacja może wysłać komunikat błędu, ślad stosu, krótką ustaloną etykietę miejsca, wersję aplikacji i platformę. Adres IP, nazwa użytkownika i nazwa urządzenia są jawnie wyłączone, a pomiary wydajności nie są zbierane w ogóle.
Słowo „może” niesie tu sporo treści. Zgłaszanie awarii instaluje się wyłącznie w kompilacji zrobionej z kluczem raportującym, a żaden skrypt budujący w publicznym repozytorium aplikacji takiego klucza nie podaje — łącznie z tym, który tworzy pliki do pobrania dla bety. Jeśli więc nie masz specjalnie przygotowanej kopii, moduł zgłaszania awarii nie jest u Ciebie po prostu wyłączony: nigdy nie został zainstalowany i żadne zgłoszenie nie opuściło Twojego urządzenia. Statystyki użycia to osobna sprawa i to ich nie dotyczy.
Dwie rzeczy, które aplikacja formułuje odrobinę za mocno
„Anonimowe” nie jest do końca trafne. Zgłoszenia i zdarzenia niosą identyfikator Twojego konta — po to, żeby dało się odpowiedzieć na pytanie „ta sama osoba wciąż trafia na ten sam błąd”. Nie niosą imienia, adresu e-mail ani adresu zamieszkania, ale są powiązane z kontem, a uczciwe słowo na to brzmi „pseudonimowe”, nie „anonimowe”. Napis w aplikacji zostanie poprawiony tak, żeby zgadzał się z tą stroną.
„Karty nigdy nie opuszczają urządzenia” to obietnica o zamiarze plus sufit. Żadne zdarzenie ani zgłoszenie awarii nie jest pomyślane tak, by nieść treść karty, a zamknięta lista powyżej to wszystko, co jest wysyłane. Ale parser, który zakrztusi się źle sformowaną kartą, potrafi zacytować jej fragment we własnym komunikacie błędu. Dlatego każde pole z dowolnym tekstem w zgłoszeniu awarii jest przycinane do 240 znaków przed wysłaniem. To zamienia „cała notatka ląduje w raporcie o błędzie” w „może wylądować fragment” — co jest realną różnicą i czymś mniejszym niż obietnica absolutna. Czytaj to więc tak: treść kart nigdy nie jest wysyłana celowo i nie może zostać wysłana w całości.
Jak to wyłączyć
Ustawienia → Diagnostyka → pierwszy przełącznik. Statystyki przestają być zapisywane w chwili, gdy go przestawisz, a to, co już czeka w kolejce, zostaje na Twoim urządzeniu i nie zostaje wysłane. Zgłaszanie awarii wyłącza się przy następnym uruchomieniu aplikacji, bo instaluje się zanim narysowany zostanie pierwszy ekran.
Diagnostyka działa tylko na komputerze i telefonie. Klient webowy pod /app/ nie zbiera ani awarii, ani statystyk.
Funkcje AI i Twój własny klucz
Czat o karcie, generowanie kart z tekstu i „inne ujęcia” istniejącej karty wysyłają tekst do API Gemini firmy Google. Tym tekstem jest to, czego dana funkcja dotyczy: wklejony fragment albo karta, o którą pytasz. Te funkcje nie robią zupełnie nic, dopóki nie wpiszesz w Ustawieniach własnego klucza API do Gemini, a klucz trzymany jest wyłącznie na Twoim urządzeniu. Jeśli nigdy go nie wpiszesz, aplikacja nie wyśle do Google nic. Z Nodes Plus mogą też działać na kredytach AI, a wtedy tekst trafia do Anthropic, nie do Google (niżej).
Gdy tworzysz fiszki z fragmentu zaznaczonego w książce z Biblioteki, ten fragment jest wysyłany dokładnie tak jak wklejony tekst, i tylko on: nigdy reszta książki, nazwa jej pliku ani strona, z której pochodzi. Sama książka nadal nigdy nie opuszcza Twojego urządzenia.
Gdy tworzysz fiszki z obszaru, który przeciągasz po rysunku, tabeli lub zeskanowanej stronie, wysyłane są też obrazy zaznaczone w książce: obraz samego tego prostokąta, wyrenderowany na Twoim urządzeniu (najwyżej 3 MB), razem z tekstem wydrukowanym w odległości około pół cala od niego, jeśli strona go ma. Nic więcej ze strony i nic z reszty książki nie wychodzi. Model ma opisać słowami, co pokazuje obraz, i zachować go na fiszkach, które go używają. Te fiszki niosą potem obraz jak zwykły obraz fiszki, więc jest zapisany razem z nimi i synchronizowany jak każdy obraz fiszki (patrz Obrazki z kart wyżej); książka nadal nie. Zapis generatora przechowuje tekst modelu i liczbę pokazanych obrazów, nigdy sam obraz.
Jeśli karta, którą wysyłasz do „Popraw fiszkę” („Więcej ujęć”, „Podziel fiszkę” albo „Napisz od nowa”), zawiera obrazy, one również trafiają do Gemini razem z tekstem karty — najwyżej cztery na kartę, każdy poniżej 3 MB, odczytane z Twojego urządzenia. Model ma opisać w nowych kartach, co pokazuje każdy obraz, i zachować go na nich. Obrazy nie są nigdzie zapisywane w tym celu: opisany wyżej zapis generatora przechowuje tekst modelu i liczbę pokazanych mu obrazów, nigdy same obrazy.
„Popraw fiszkę” ma też opcjonalne pole, w którym możesz napisać, dlaczego fiszka nie zostaje Ci w pamięci. Jeśli coś w nim wpiszesz, ta notatka trafia do Gemini razem z fiszką i wskazuje, nad czym mają pracować nowe fiszki. Nie jest nigdzie zapisywana: zapis generatora przechowuje tylko informację, czy notatka była, nigdy jej treść.
To, co Google robi z tym tekstem, regulują warunki Google dla klucza, którego używasz — nie ta strona.
Z Nodes Plus sprawdzanie fiszek z generatora działa na większym modelu w chmurze: Clef w Cloudflare Workers AI. Dla każdej fiszki, którą napisze generator, wysyłamy jej pytanie, odpowiedź i fragment, który model dla niej zacytował — nie resztę Twojego tekstu — i dostajemy z powrotem jedną liczbę. Nasz serwer tylko przekazuje ten tekst i nie zapisuje go w logach. Żeby pilnować dziennego limitu, zapisuje dla każdego dnia, ile fiszek sprawdziłeś i ile tokenów to zajęło, nigdy sam tekst. Bez Plus nic nie jest wysyłane; używany jest wtedy moduł sprawdzający na Twoim komputerze, jeśli go pobrałeś. To, co Cloudflare robi z tym tekstem, regulują warunki Cloudflare dla Workers AI.
Nodes Plus obejmuje też kredyty AI, dzięki którym funkcje AI działają bez własnego klucza Gemini. Gdy funkcja korzysta z tych kredytów (a nie z Twojego klucza — wybierasz to w Preferencjach), ten sam tekst, który trafiłby do Gemini, trafia przez nasz serwer do Claude API firmy Anthropic: fragment lub fiszka, nad którą pracujesz, obrazy z fiszki lub obszar zaznaczony w książce i ewentualna notatka. Anthropic przetwarza go w naszym imieniu na podstawie swojej umowy powierzenia, która obejmuje przekazanie danych do Stanów Zjednoczonych. Nasz serwer tylko przekazuje tekst i niczego z niego nie zapisuje. Żeby pilnować miesięcznego przydziału, zapisuje dziennie liczbę wywołań, zużyte tokeny i ich koszt — nigdy tekst.
Prezentacja na stronie głównej
Na stronie głównej działa kopia aplikacji, którą można wyklikać. Liczymy wyłącznie to, jak daleko docierają odwiedzający: ile osób otworzyło każdą z trzech prezentacji, ile kart odpowiedziano i ile osób doszło do końca. To są dzienne sumy i nic poza tym — żadnego ciasteczka, żadnego identyfikatora, żadnego adresu IP, żadnego odcisku przeglądarki, żadnego zapisu pojedynczej wizyty. Z tych liczb nie da się odczytać, czy dwie z nich pochodzą od tej samej osoby — my też tego nie wiemy. To nasz własny licznik na naszej własnej domenie; na stronie nie ma skryptu analitycznego podmiotu trzeciego.
Formularz zaproszenia na stronie głównej
„Poproś o zaproszenie” zapisuje wpisany adres e-mail oraz — jeśli wcześniej otwarto jedną z tych trzech prezentacji — którą z nich. Nic poza tym: żadnego imienia, żadnego ciasteczka, żadnego zapisu tego, co robisz na stronie. Zostanie użyty raz, żeby wysłać Ci zaproszenie. Klucz, którego używa strona, może dopisać wiersz do tej listy i nie może jej odczytać.
Kto to przetwarza i gdzie
- Supabase — konto, zsynchronizowana kolekcja, zdarzenia użycia, lista zaproszeń i powyższe liczniki prezentacji. Serwery w UE (Irlandia). Każda tabela chroniona jest przez zabezpieczenia na poziomie wiersza, więc zalogowany klient czyta wyłącznie swoje własne wiersze.
- Stripe — płatności za Nodes Plus, gdy ruszy sprzedaż: imię i nazwisko, e-mail, adres rozliczeniowy i dane karty, które przechowuje Stripe. My zapisujemy tylko identyfikator klienta Stripe i status subskrypcji.
- Sentry — wyłącznie zgłoszenia awarii i wyłącznie z kompilacji niosącej klucz raportujący, czego na dzień podany wyżej nie robi żadna opublikowana kompilacja. Konto, do którego trafiałyby zgłoszenia, jest w europejskiej instancji Sentry.
- Google (API Gemini) — tylko tekst, który przekazujesz funkcji AI, obrazy karty, którą prosisz ulepszyć, obszar zaznaczony w książce oraz dopisaną notatkę, i tylko jeśli masz wpisany klucz.
- Cloudflare Workers AI — tylko z Nodes Plus: pytanie, odpowiedź i zacytowany fragment każdej wygenerowanej fiszki, na potrzeby opisanego wyżej sprawdzania w chmurze.
- Anthropic (Claude API) — tylko z Nodes Plus i tylko dla funkcji AI uruchomionej na kredytach Plus: ten sam tekst, obrazy i notatka, które ta funkcja wysłałaby inaczej do Gemini.
- Cloudflare Pages — serwuje tę stronę i klienta webowego, obsługuje opisany wyżej własny licznik prezentacji i udostępnia zalogowanej aplikacji dwa modele działające na urządzeniu. Zwykłe logi serwera i żadnego skryptu analitycznego podmiotu trzeciego.
- Google Fonts — ta strona i strona główna pobierają dwa kroje pisma z CDN-u Google, co oznacza, że Twoja przeglądarka wysyła tam zapytanie, a Google widzi adres IP, z którego przyszło. To jedyne zapytanie do podmiotu trzeciego, jakie robi którakolwiek z tych stron.
Nie ma na tej liście sieci reklamowej, piksela śledzącego, nagrywarki sesji ani brokera danych.
Usuwanie
Karta albo talia — usuń ją w aplikacji. Przy następnej synchronizacji znika też z chmury, a nie tylko przestaje być widoczna.
Konto i wszystko, co się w nim znajduje — nie ma jeszcze przycisku, który zrobi to sam; jest na liście. Zanim powstanie, wystarczy poprosić i zostanie to zrobione ręcznie: konto i każdy przypisany do niego wiersz w bazie, czyli Twoja kolekcja, historia i zdarzenia użycia. Zgłoszenia awarii leżą w osobnym systemie i kasowane są oddzielnie, w ramach tej samej prośby. Napisz na privacy@nodes.cards.
Jedna rzecz, do której usunięcie nie sięga, bo sięgnąć nie może: odduplikowane bajty obrazków opisane wyżej. Mapa z obrazka na Twojej karcie do jego bajtów należy do Ciebie i znika razem z kontem. Same bajty zostają we wspólnym magazynie, już bez odniesienia — leżą pod ścieżką, która jest skrótem samego pliku, więc nie da się do nich dotrzeć, nie mając wcześniej tego pliku, a ich usunięcie zepsułoby każde inne konto, które akurat ma ten sam obrazek.
Usunięcie aplikacji bez usunięcia konta zostawia kopię w chmurze — o to w kopii w chmurze chodzi, i dlatego właśnie istnieje prośba powyżej.
Zmiany
To jest beta i ta strona będzie się z nią zmieniać. Leży w publicznym repozytorium aplikacji, więc każda jej zmiana to datowany, czytelny commit, a nie ciche podmienienie. Data na górze to ta ostatnia.