Notatki local-first: praca offline i synchronizacja
Co oznacza local-first? Wyjaśniamy, jak aplikacje zapisują notatki, synchronizują zmiany i rozwiązują konflikty oraz kiedy potrzebują dostępu do sieci.

W tym artykule
Aplikacja local-first trzyma Twoje dane przede wszystkim na Twoim własnym urządzeniu, a serwer pełni rolę pomocnika, który przenosi zmiany między urządzeniami. W przypadku notatnika oznacza to, że notatki przeczytasz i poprawisz bez internetu, w pociągu czy w piwnicy, a zmiany trafią dalej, gdy połączenie wróci.
Wyjaśniamy, czym local-first różni się od offline-first i od zwykłych aplikacji w chmurze. Na przykładzie Cappy pokazujemy, jak działa synchronizacja, co się dzieje, gdy dwa urządzenia zmienią tę samą notatkę, i gdzie kończą się możliwości przechowywania danych w przeglądarce.
Local-first: co to jest i skąd się wzięło?
Nazwa pochodzi z eseju Local-first software: you own your data, in spite of the cloud, który w 2019 roku opublikowali Martin Kleppmann, Adam Wiggins, Peter van Hardenberg i Mark McGranaghan z laboratorium badawczego Ink & Switch. Autorzy proponują odwrócić zwykły układ. W większości dzisiejszych aplikacji prawdziwa kopia danych leży na serwerze, a telefon tylko ją wyświetla. W oprogramowaniu local-first najważniejsza jest kopia na Twoim urządzeniu, a chmura pomaga ją synchronizować, zamiast decydować, czy w ogóle możesz pracować.
Różnicę najłatwiej zauważyć, gdy znika internet. Aplikacja zależna od serwera może wtedy przestać działać. Aplikacja local-first nadal pozwala czytać i zmieniać dane zapisane na urządzeniu. Sama praca offline to jednak dopiero część tej idei.
Autorzy eseju opisują siedem ideałów, do których takie oprogramowanie powinno dążyć:
- Aplikacja reaguje od razu. Otwarcie czy zapis danych nie czeka na odpowiedź serwera.
- Dane nie są uwięzione na jednym urządzeniu. Masz je na laptopie, telefonie i tablecie.
- Sieć nie jest konieczna. Czytasz i edytujesz bez połączenia.
- Współpraca bez przeszkód. Kilka osób może pracować nad tym samym i nie nadpisywać sobie nawzajem zmian.
- Dostęp na lata. Dane pozostają użyteczne, nawet gdy aplikacja przestanie być rozwijana albo firma zniknie.
- Bezpieczeństwo i prywatność od początku. Serwer nie powinien móc czytać wszystkiego, co piszesz.
- Ostatnie słowo należy do Ciebie. Kopiujesz, eksportujesz i usuwasz dane na własnych warunkach.
Nie jest to lista wymagań do odhaczenia, tylko kierunek, w którym warto projektować. Różne aplikacje realizują te ideały w różnym stopniu. Niżej sprawdzamy, jak wypada na ich tle Cappa.
Local-first, offline-first i chmura: czym się różnią?
Każde z tych określeń zakłada coś innego:
- Cloud-first: prawdziwe dane leżą na serwerze. Aplikacja może trzymać ich część w pamięci podręcznej i działać w trybie offline, ale ostatecznie zależy od usługi dostawcy.
- Offline-first: aplikacja ma działać także bez połączenia, np. zapisywać zmiany lokalnie i wysyłać je później. To podejście nie mówi nic o tym, kto panuje nad danymi ani jaką rolę pełni serwer.
- Local-first: podstawą pracy jest kopia na urządzeniu. Oprócz działania offline liczą się trwały dostęp, prywatność, możliwość przeniesienia danych i niezależność od dostawcy.
Praca offline jest więc warunkiem local-first, ale sama nie wystarcza, żeby aplikację tak nazwać.
Notatki w chmurze
- Notatki są na serwerze dostawcy
- Offline: często nic albo tylko to, co zostało w pamięci podręcznej
- Dostawca zwykle może czytać Twoje notatki
- Notatki są dostępne tak długo, jak długo działa usługa
Notatki local-first
- Notatki są na Twoim urządzeniu, a serwer przechowuje kopie
- Offline: pełne czytanie i edycja
- Przy szyfrowaniu end-to-end (E2EE) serwer trzyma zaszyfrowane kopie, ale nie ma klucza, żeby je odczytać
- Możesz wyeksportować zwykłe pliki i pracować dalej bez usługi
Jak działają notatki offline w Cappie
Cappa zapisuje dane lokalnie w IndexedDB, czyli bazie danych wbudowanej w przeglądarkę. Trzyma tam:
- zaszyfrowane notatki i ustawienia, w tej samej postaci co rekordy na serwerze;
- kolejkę zmian, czyli każdą edycję z tego urządzenia, której serwer jeszcze nie potwierdził.
Pliki potrzebne do uruchomienia aplikacji zapisuje w pamięci podręcznej service worker, czyli skrypt działający w tle przeglądarki. Gdy konto zostanie raz otwarte, pamięć podręczna przygotowana, a synchronizacja zakończona, Cappę da się uruchomić bez internetu, odblokować sejf, czyli zaszyfrowany zbiór Twoich notatek, i pracować dalej. Treść jest odszyfrowywana lokalnie dopiero po odblokowaniu. Więcej o ochronie danych przeczytasz w tekście o szyfrowaniu end-to-end.
Pierwsze uruchomienie na nowym urządzeniu wymaga internetu. Aplikacja musi pobrać swoje pliki i dane konta. Dopóki nie ma lokalnej kopii, nie ma na czym pracować offline.
Co znaczą komunikaty o stanie
Obok notatki Cappa pokazuje dwa małe wskaźniki: jeden dotyczy zapisu na tym urządzeniu, drugi synchronizacji z serwerem. Każdy odpowiada na inne pytanie. Interfejs Cappy jest po angielsku, więc podajemy oryginalne komunikaty.
| Komunikat | Co oznacza |
|---|---|
| Saved locally | Ostatnia zmiana jest zapisana w bazie przeglądarki na tym urządzeniu |
| Offline · 3 changes | Brak połączenia. Trzy zmiany czekają w kolejce na tym urządzeniu |
| Syncing | Aplikacja właśnie wymienia zmiany z serwerem |
| Synced · just now | Serwer potwierdził zmiany i nic nie czeka w kolejce |
| Sync failed | Ostatnia próba się nie udała. Zmiany zostają w kolejce, a aplikacja spróbuje ponownie |
Jak działa synchronizacja notatek po powrocie do sieci
Serwer przyjmuje zaszyfrowane rekordy razem z informacją o ich wersjach i udostępnia je pozostałym urządzeniom konta. Treści nie odszyfrowuje. Odczyt, edycja i łączenie zmian odbywają się na Twoich urządzeniach.
Laptop w pociągu
Edytujesz notatkę. Każda zmiana jest szyfrowana, zapisywana lokalnie i czeka w kolejce.
Serwer synchronizacji
Przechowuje zaszyfrowane rekordy i ich numery wersji. Nie może ich przeczytać.
Twój telefon
Pobiera nowe rekordy, odszyfrowuje je i scala z własnymi zmianami.
Kiedy Cappa synchronizuje dane?
Gdy Cappa jest otwarta i widoczna, co 5 sekund sprawdza, czy na serwerze są zmiany. Synchronizuje dane także od razu po powrocie połączenia, po przełączeniu się z powrotem do jej okna i po kliknięciu wskaźnika synchronizacji. Gdy karta jest ukryta, sprawdzanie się wstrzymuje. Zamknięta Cappa nie synchronizuje niczego w tle. Jeśli więc pracujesz offline, po powrocie sieci otwórz aplikację i poczekaj, aż skończy synchronizację, zanim przesiądziesz się na inne urządzenie.
Numery wersji chronią przed nadpisaniem
Każda notatka na serwerze ma numer wersji, czyli rewizję. Wysyłając zmianę, urządzenie podaje też, od której rewizji zaczęło: „to moja poprawka do wersji 7”. Serwer przyjmuje ją tylko wtedy, gdy notatka wciąż jest w wersji 7. Jeśli inne urządzenie było szybsze, serwer odmawia, a Twoje urządzenie pobiera nowszą wersję, scala zmiany i próbuje jeszcze raz. Programiści nazywają to compare-and-swap (porównaj i podmień). Każda zmiana ma też własny identyfikator, więc gdy połączenie zerwie się w połowie wysyłania i urządzenie ponowi próbę, serwer nie zapisze tej samej zmiany dwa razy.
Co się dzieje, gdy dwa urządzenia zmienią tę samą notatkę?
Wtedy może dojść do konfliktu synchronizacji. Prosta zasada „wygrywa ostatni zapis” mogłaby skasować wcześniejszą poprawkę. Cappa zamiast tego porównuje obie wersje z ich wspólnym punktem wyjścia. Taki sposób łączenia tekstu nazywa się scalaniem trzystronnym.
- Scalanie trzystronne
- Sposób łączenia dwóch zmienionych wersji tego samego tekstu, w którym każdą z nich porównuje się z ostatnią wspólną wersją. Zmiany wprowadzone tylko po jednej stronie zostają, zmiany w różnych liniach się łączą, a decyzji wymagają tylko zmiany w tych samych liniach.
Cappa przechowuje ostatnią wspólną wersję notatki obok lokalnych zmian, dopóki serwer ich nie potwierdzi. Obie wersje są zaszyfrowane. Poniżej lista rzeczy do spakowania, zmieniona na dwóch urządzeniach, z których jedno pracowało offline:
| Linia | Ostatnia wspólna wersja | Laptop (offline) | Telefon | Po scaleniu |
|---|---|---|---|---|
| 1 | Na wyjazd | Na wyjazd | Na wyjazd | Na wyjazd |
| 2 | paszport | paszport | paszport | paszport |
| 3 | ładowarka | ładowarka | ładowarka USB-C | ładowarka USB-C |
| 4 | krem z filtrem | krem z filtrem | krem z filtrem | krem z filtrem |
| 5 | (brak) | słuchawki | (brak) | słuchawki |
Telefon zmienił linię 3, a laptop dodał linię 5. Zmiany na siebie nie nachodzą, więc obie mogą trafić do jednej notatki.
Jeśli oba urządzenia zmienią tę samą linię, np. jedno dopisze „SPF 50”, a drugie „mała tubka”, aplikacja nie wie, która wersja jest właściwa. Cappa zostawia w notatce wersję edytowaną później, a drugą zapisuje osobno, z dopiskiem „conflict copy” w tytule. Obie wersje są do wglądu.
Usunięte notatki nie wracają
Urządzenie, które długo było offline, może wciąż mieć notatkę usuniętą już gdzie indziej. Synchronizacja musi rozpoznać, że to nieaktualna kopia, a nie nowa notatka do wysłania.
Dlatego Cappa przechowuje znaczniki usunięcia (ang. tombstones). Zawierają informację, że dany rekord usunięto, ale nie jego treść. Po powrocie do sieci urządzenie pobiera znacznik i usuwa nieaktualną kopię. Znaczniki nie wygasają, więc mechanizm działa także po długiej przerwie.
Osobny przypadek to usunięcie notatki na jednym urządzeniu przy jednoczesnej edycji na drugim. Cappa stara się wtedy ocalić zmieniony tekst. Zależnie od kolejności zdarzeń zostawia go w notatce albo w osobnej kopii; czasem tworzy też informację „Deletion conflict”.
Jeden sejf, jedna otwarta karta
W jednym profilu przeglądarki sejf może być odblokowany tylko w jednej karcie. Cappa używa Web Locks API, żeby dwie karty nie zapisywały jednocześnie do tej samej lokalnej bazy. Druga karta wyświetla komunikat „This vault is already open in another tab.” Żeby pracować w niej dalej, trzeba najpierw zwolnić sejf w poprzedniej karcie.
Ograniczenia lokalnego zapisu
Dzięki lokalnemu zapisowi możesz pracować bez sieci, ale o trwałość danych na urządzeniu trzeba zadbać samodzielnie.
Większość tych ryzyk ograniczysz kilkoma prostymi nawykami:
- Przed wyjazdem albo zmianą urządzenia otwórz Cappę z dostępem do sieci i poczekaj, aż wskaźnik pokaże „Synced”.
- Na iPhonie lub iPadzie dodaj Cappę do ekranu początkowego, zamiast korzystać z niej wyłącznie w karcie Safari.
- Co jakiś czas eksportuj notatki w Settings → Data: jako czytelne pliki Markdown lub TXT albo jako wersjonowaną kopię zapasową. Pamiętaj, że eksport nie jest szyfrowany, więc trzymaj go w zaufanym miejscu. Notatki to zwykły Markdown, więc otworzysz je w niemal każdym edytorze. Podstawy znajdziesz w naszym przewodniku po Markdownie w notatkach.
Na ile Cappa jest naprawdę local-first?
Poniżej zestawiamy obecne możliwości Cappy z ideałami opisanymi przez Ink & Switch.
| Ideał | Cappa dziś |
|---|---|
| Aplikacja reaguje od razu | Tak. Notatki są odczytywane z kopii na urządzeniu |
| Dane nie są uwięzione na jednym urządzeniu | Tak. Synchronizacja przenosi zaszyfrowane zmiany między urządzeniami |
| Sieć nie jest konieczna | Tak, po pierwszym logowaniu i synchronizacji na danym urządzeniu |
| Współpraca bez przeszkód | Nie. Jedna osoba, jeden sejf; nie ma udostępniania ani wspólnej edycji |
| Dostęp na lata | Częściowo. Eksport do zwykłych plików pozwala odczytać treść także poza Cappą |
| Bezpieczeństwo i prywatność od początku | Tak w zakresie treści: notatki są szyfrowane, zanim opuszczą urządzenie. Metadane, takie jak rozmiary i czasy zmian, serwer widzi |
| Ostatnie słowo należy do Ciebie | Częściowo. Możesz wyeksportować wszystko jako zwykłe pliki, ale synchronizacja wymaga konta na serwerze Cappy, a konta powstają tylko z zaproszenia |
Esej Ink & Switch omawia CRDT, czyli struktury danych, które pozwalają automatycznie uzgadniać zmiany wprowadzane równolegle. Cappa korzysta ze scalania trzystronnego, znanego m.in. z systemu Git. To inne rozwiązanie: łączy niezależne poprawki, a przy konflikcie zachowuje dodatkową kopię do sprawdzenia.
Jak porządkować tak zapisane notatki, opisujemy w poradniku o organizowaniu notatek. Sam edytor możesz wypróbować w wersji demonstracyjnej. Demo trzyma zmiany tylko w pamięci bieżącej karty i traci je po odświeżeniu, więc nie pokaże trwałego zapisu ani synchronizacji.
Najczęstsze pytania
Czy Cappa działa bez internetu?
Tak, na każdym urządzeniu, na którym już się zalogowano i przeprowadzono pierwszą synchronizację. Odblokowujesz sejf hasłem głównym, czytasz i edytujesz notatki, a zmiany czekają w kolejce, aż wróci sieć. Logowanie na nowym urządzeniu, pierwsza synchronizacja i odzyskiwanie konta wymagają połączenia.
Czym różni się local-first od offline-first?
Offline-first opisuje aplikację, która działa dalej po utracie połączenia, zwykle dzięki danym zapisanym na urządzeniu. Local-first idzie dalej: podstawą jest kopia na urządzeniu, serwer tylko pomaga, a całość ma chronić prywatność, trwałość danych i Twoją kontrolę nad nimi.
Czy przy konflikcie synchronizacji stracę tekst?
Cappa jest zaprojektowana tak, żeby nie gubić tekstu po cichu. Zmiany w różnych liniach tej samej notatki się łączą. Gdy dwa urządzenia zmienią te same linie, notatka zachowuje nowszą wersję, a druga trafia do osobnej notatki „conflict copy”, którą możesz przejrzeć.
Czy po wyczyszczeniu danych przeglądarki stracę notatki?
Stracisz kopię na tym urządzeniu, łącznie ze zmianami, które nie zdążyły się zsynchronizować. Wszystko, co dotarło już na serwer, wróci po ponownym zalogowaniu, bo aplikacja pobierze notatki i odszyfruje je lokalnie. Dlatego zanim cokolwiek wyczyścisz, sprawdź, czy widzisz „Synced”.
Czy synchronizacja zastępuje kopię zapasową?
Nie. Synchronizacja sprawia, że wszystkie urządzenia mają to samo, więc usunięcie albo niechciana zmiana trafia na każde z nich. Kopia zapasowa to wersja, do której możesz wrócić. Co jakiś czas eksportuj notatki w Settings → Data i trzymaj plik w bezpiecznym miejscu.


