Szyfrowany notatnik E2E — aplikacja PWA (self-hosted)
Szybka notatka zapisana w systemowym notatniku zostaje na jednym komputerze — na telefonie czy drugim urządzeniu już jej nie ma. Chmura (Notion, Keep, OneNote) to konto u obcego dostawcy i dane poza Twoją kontrolą. Zbudowaliśmy aplikację, która odwraca ten model: dane leżą na Twoim własnym hostingu, a klucz szyfrujący nigdy nie opuszcza Twoich urządzeń. Serwer — i ktokolwiek uzyska dostęp do jego plików — widzi wyłącznie szyfrogram. Apka instaluje się z przeglądarki jako osobne okno na Windows, macOS i iPhone, działa offline i sama zapisuje zmiany. Jedno narzędzie, każdy system, zero abonamentu.
Schemat działania — krok po kroku
Fraza na urządzeniu
Raz na urządzeniu podajesz frazę; z niej wyprowadzany jest klucz (PBKDF2), który zostaje wyłącznie lokalnie.
Piszesz notatkę
Tytuł to pierwsza linia treści. Nie klikasz „Zapisz" — aplikacja robi to za Ciebie.
Szyfrowanie w przeglądarce
Treść i tytuł są szyfrowane AES-256-GCM zanim cokolwiek opuści urządzenie.
Zapis na Twój hosting
Na serwer trafia wyłącznie szyfrogram, jako zwykły plik. Backend nie zna klucza i nic nie odszyfruje.
Sync między urządzeniami
Notatka z komputera czeka na telefonie i drugim komputerze — bez żadnej akcji z Twojej strony.
Wykrywanie konfliktów
Równoległa edycja na dwóch urządzeniach kończy się czytelnym wyborem wersji, nie cichym nadpisaniem.
Tryb offline
Bez sieci podglądasz ostatnie notatki; zaległe zapisy dosyłają się same po powrocie połączenia.
Co to daje
Dane tylko Twoje
Nawet pełny wyciek plików z serwera nie ujawnia treści — bez klucza to nieczytelny szyfrogram.
Jedna apka, każdy system
PWA z jednego kodu na Windows, macOS i iPhone — bez sklepów z aplikacjami i osobnych wersji.
Autozapis i zero tarcia
Zapis sekundę po przerwie w pisaniu i przy zamknięciu okna — nigdy nie tracisz myśli.
Lekki hosting
Działa na najtańszym hostingu z PHP i HTTPS: bez bazy danych, bez zależności, bez procesu build.
Pełna audytowalność
Około 700 linii własnego kodu i zero bibliotek zewnętrznych — brak podatności w łańcuchu dostaw.
Działa offline
Podgląd i pisanie bez sieci; synchronizacja dochodzi automatycznie po powrocie połączenia.
Szczegóły
Prywatność, która nie jest hasłem marketingowym
Szyfrowanie dzieje się w przeglądarce (WebCrypto, AES-256-GCM), zanim dane opuszczą urządzenie. Klucz wyprowadzany z Twojej frazy (PBKDF2, 600 000 iteracji, losowa sól) zostaje w pamięci urządzenia. Nawet tytuły są szyfrowane osobno — serwer nie zna ani treści, ani nazw notatek. Świadomie dokumentujemy granicę modelu: chroni przed wyciekiem danych z serwera, nie przed podmianą samego kodu aplikacji — to nieusuwalna granica każdej webowej aplikacji E2E.
Synchronizacja bez cichych nadpisań
Każdy zapis niesie znacznik wersji, którą klient widział. Gdy na serwerze jest nowsza treść, dostajesz czytelny wybór „zachowaj moją / wczytaj tamtą", a spóźnione zapisy po awarii sieci zapisują kopię obok zamiast nadpisać nowszą wersję. Do tego kolejkowanie zapisów i przełączanie notatki dopiero po udanym wczytaniu — żeby treść jednej notatki nigdy nie trafiła pod identyfikator innej.
Wdrożenie bez DevOps
Całość to kilka plików skopiowanych na dowolny hosting z PHP i HTTPS. Zero bazy danych, migracji i procesu budowania. Notatki to zwykłe pliki w katalogu odciętym od WWW, z niezgadywalnymi nazwami i blokadą path traversal; logowanie oparte na tokenie HMAC i rocznym cookie (odporność na czyszczenie pamięci przez iOS).
Dla zainteresowanych — jak to działa „pod maską". Frontend to czysty JavaScript (ES2020) z WebCrypto, service workerem i manifestem PWA, bez ani jednej biblioteki zewnętrznej. Backend to minimalne API JSON-RPC w PHP na płaskich plikach — celowo „głupie", bez znajomości klucza.
Kryptografia
AES-256-GCM z losowym IV na każdą operację; klucz z PBKDF2-SHA256 (600 000 iteracji, sól 128 bit). Kontekst wiązany przez AAD (id notatki + pole), więc serwer nie podmieni szyfrogramów między notatkami ani nie podstawi tytułu jako treści. Weryfikacja frazy przez odszyfrowanie znanego weryfikatora — zła fraza daje czytelny błąd, nigdy zapis złym kluczem.
Backend „głupi" i odporny
API JSON-RPC po POST (login/list/get/save/delete/meta). Notatki jako pliki z LOCK_EX w katalogu odciętym .htaccess; walidacja identyfikatorów blokuje path traversal; konfiguracja klucza tworzona atomowo (fopen w trybie x) — wyścig dwóch urządzeń kończy się czystym 409, nie dwoma kluczami. Sekret hasła w pliku poza katalogiem publicznym, porównania przez hash_equals.
PWA i offline
Service worker: sieć najpierw (świeże aktualizacje), cache jako fallback; odpowiedzi błędów nie zatruwają cache. Instalacja z przeglądarki daje własne okno i ikonę na pasku zadań, w Docku i na ekranie iPhone. Pola 16 px bez auto-zoomu iOS, układ dwupanelowy na desktopie i jednopanelowy na telefonie z obsługą safe-area.