Notatki local-first: offline i synchronizacja po powrocie do sieci
Local-first: co to jest i czym różni się od offline-first? Jak działają notatki offline, synchronizacja notatek, konflikty i uczciwe ograniczenia.

W tym artykule
Local-first, co to jest? To sposób budowania aplikacji, w którym główna kopia danych leży na Twoim urządzeniu, a serwer jest pomocnikiem: przenosi zmiany między urządzeniami i trzyma kopię na wypadek, gdyby któreś z nich przepadło. W aplikacji do notatek oznacza to, że czytasz i piszesz bez internetu, w samolocie czy w piwnicy, a synchronizacja notatek odbywa się, gdy wracasz do sieci.
Wyjaśniamy, czym local-first różni się od aplikacji offline-first i od zwykłych aplikacji chmurowych, co się dzieje, gdy dwa urządzenia zmienią tę samą notatkę, i gdzie to podejście ma realne granice. Za przykład bierzemy Cappę, aplikację do notatek, którą tworzymy, łącznie z tym, czego nie potrafi.
Local-first: co to jest i skąd się wzięło?
Pojęcie wprowadził esej z 2019 roku autorstwa laboratorium badawczego Ink & Switch: Local-first software: you own your data, in spite of the cloud („Oprogramowanie local-first: Twoje dane należą do Ciebie mimo chmury”). Napisali go Martin Kleppmann, Adam Wiggins, Peter van Hardenberg i Mark McGranaghan. Główna myśl to zamiana ról. W większości dzisiejszych aplikacji prawdziwa kopia danych jest na serwerze, a telefon pokazuje jej podgląd. W oprogramowaniu local-first podstawową kopią jest ta na Twoim laptopie czy telefonie, a serwery przechowują kopie drugorzędne, które ułatwiają dostęp z wielu urządzeń.
Obrazowo: aplikacja chmurowa to zeszyt trzymany w bibliotece. Czytasz go, kiedy tam przyjdziesz, ale gdy biblioteka jest zamknięta, nie masz nic. Aplikacja local-first to zeszyt w Twojej torbie plus kurier, który dba, żeby te same strony pojawiły się w zeszytach w domu i w pracy.
Autorzy eseju opisują siedem ideałów takiego oprogramowania. Po ludzku brzmią tak:
- Bez kręcących się kółek. Praca otwiera się od razu, bo już jest na urządzeniu.
- Dane nie są uwięzione na jednym urządzeniu. Masz je na laptopie, telefonie i tablecie.
- Sieć jest opcjonalna. Czytasz i edytujesz bez połączenia.
- Płynna współpraca. Kilka osób może pracować nad tym samym, nie niszcząc sobie nawzajem zmian.
- Długi horyzont. Dane pozostają czytelne przez lata, nawet jeśli firma albo aplikacja zniknie.
- Bezpieczeństwo i prywatność domyślnie. Serwer nie powinien móc czytać wszystkiego, co piszesz.
- Ostateczna kontrola należy do Ciebie. Kopiujesz, eksportujesz i usuwasz dane na własnych warunkach.
Autorzy sami przyznają, że istniejące technologie spełniają niektóre z tych celów, ale żadna nie spełnia wszystkich. Dalej uczciwie sprawdzamy, jak na ich tle wypada Cappa.
Local-first, offline-first i chmura: czym się różnią?
Te pojęcia często się mylą. Oto jak się je zwykle rozumie.
- Aplikacja chmurowa (cloud-first), domyślny model większości aplikacji webowych: prawdziwe dane są na serwerach dostawcy. Urządzenie pobiera to, co trzeba pokazać. Brak połączenia oznacza zwykle kręcące się kółko, błąd albo tryb tylko do odczytu.
- Aplikacja offline-first: podejście projektowe, dzięki któremu aplikacja działa po utracie połączenia, zwykle przez przechowywanie danych na urządzeniu i wysyłanie zmian później. Nie mówi nic o tym, do kogo należą dane i która kopia się liczy. Kopia na serwerze często nadal jest „tą prawdziwą”.
- Local-first: praca offline to dopiero początek. Kopia na urządzeniu jest podstawowa, serwer jest pomocnikiem, a celem są też prywatność, trwałość i Twoja kontrola nad danymi.
Krótko mówiąc: każda aplikacja local-first działa offline, ale nie każda aplikacja offline-first jest local-first.
Notatki w chmurze
- Notatki są na serwerze dostawcy
- Offline: często nic albo fragment w pamięci podręcznej
- Dostawca zwykle może czytać Twoje notatki
- Notatki zależą od tego, czy usługa dalej istnieje
Notatki local-first
- Notatki są na Twoim urządzeniu, a serwer trzyma kopie
- Offline: pełne czytanie i edycja
- Przy szyfrowaniu end-to-end serwer ma tylko zapieczętowane kopie
- Możesz wyeksportować zwykłe pliki i pracować dalej bez usługi
Jak działają notatki offline w Cappie
Każda współczesna przeglądarka ma wbudowaną małą bazę danych o nazwie IndexedDB, w której strona może zapisywać dane na Twoim urządzeniu. Cappa trzyma w niej dwie rzeczy:
- zaszyfrowaną kopię notatek i ustawień, czyli te same zapieczętowane rekordy, które przechowuje serwer;
- kolejkę zmian: każdą edycję zrobioną na tym urządzeniu, której serwer jeszcze nie potwierdził.
Samą aplikację, czyli stronę i jej skrypty, przechowuje offline service worker: niewielki pomocnik, którego przeglądarka uruchamia dla danej strony. Razem oznacza to, że gdy raz otworzysz konto na urządzeniu i zakończy się pierwsza synchronizacja, możesz uruchomić Cappę zupełnie bez połączenia, odblokować ją hasłem głównym i pisać dalej. Notatki są odszyfrowane w przeglądarce tylko wtedy, gdy aplikacja jest odblokowana. Szczegóły szyfrowania opisujemy w tekście o notatkach szyfrowanych end-to-end.
Jeden warunek trzeba powiedzieć wprost: offline działa na urządzeniach, na których konto było już używane. Nowy telefon nie ma jeszcze niczego zapisanego, więc pierwsze otwarcie wymaga internetu.
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. Odpowiadają na różne pytania. 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
Wyobraź sobie serwer jako kuriera z zamkniętym magazynem. Twoje urządzenia zostawiają w nim zapieczętowane koperty (zaszyfrowane notatki) i odbierają te, które są dla nich. Kurier wie, jak duża jest każda koperta i kiedy przyszła, ale nie może jej otworzyć. Serwer przechowuje kopię każdej koperty, dlatego nowe urządzenie może pobrać Twoje notatki. Nie jest jednak miejscem, w którym notatki się czyta albo edytuje.
Laptop w pociągu
Edytujesz notatkę. Każda zmiana jest szyfrowana, zapisywana lokalnie i czeka w kolejce.
Serwer jako kurier
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?
Gdy Cappa jest otwarta i widoczna, co 5 sekund sprawdza serwer. Synchronizuje się też 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 w tle. Jeśli więc zmiany powstały 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 nadal 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 ponownie. 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łki i urządzenie spróbuje jeszcze raz, serwer nie zapisze tej samej zmiany dwukrotnie.
Co się dzieje, gdy dwa urządzenia zmienią tę samą notatkę?
To klasyczny konflikt synchronizacji i miejsce, w którym wiele systemów po cichu gubi tekst. Są dwie leniwe odpowiedzi: „wygrywa urządzenie, które zsynchronizuje się ostatnie” (druga zmiana znika) albo „zatrzymaj się i każ użytkownikowi porównać dwie ściany tekstu”. Cappa robi coś bliższego temu, czego programiści używają do kodu: scalanie trzystronne.
- Scalanie trzystronne
- Sposób łączenia dwóch zmienionych wersji tego samego tekstu przez porównanie każdej z nich z ostatnią wspólną wersją. Zmiany zrobione tylko po jednej stronie zostają, zmiany w różnych liniach się łączą, a decyzji wymagają tylko zmiany tych samych linii.
Żeby to było możliwe, Cappa przechowuje ostatnią wersję uzgodnioną przez obie strony (zaszyfrowaną, jak wszystko inne) obok Twojej lokalnej zmiany, dopóki serwer jej nie potwierdzi. Tak to wygląda na liście rzeczy do spakowania, edytowanej na dwóch urządzeniach, gdy oba były 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 dopisał linię 5. Żadne nie ruszyło linii drugiego, więc obie zmiany przetrwały i dostajesz jedną notatkę z obiema poprawkami.
A teraz załóżmy, że oba urządzenia zmieniły tę samą linię: na laptopie „krem z filtrem SPF 50”, na telefonie „krem z filtrem, mała tubka”. Nie da się zgadnąć, o co Ci chodziło. Cappa zostawia w notatce wersję edytowaną później, a drugą zapisuje jako osobną notatkę, której tytuł kończy się słowami „conflict copy”. Nic nie znika: sam wybierasz, co zostawić, i usuwasz kopię.
Usunięte notatki nie wracają
Usuwanie też wymaga ostrożności. Jeśli laptop był offline przez miesiąc, a w tym czasie notatka została usunięta na telefonie, laptop wciąż ją ma. Po powrocie do sieci naiwna synchronizacja mogłaby wysłać ją ponownie i wskrzesić notatkę.
Cappa zapobiega temu dzięki tombstone'om (dosłownie „nagrobkom”): gdy usuwasz notatkę, serwer zachowuje mały znacznik „ta notatka została usunięta”, bez jej treści. Urządzenie, które wraca po długiej przerwie, widzi znacznik i usuwa swoją kopię, zamiast ją wskrzeszać. Cappa nie czyści tych znaczników z czasem właśnie po to, żeby urządzenie wracające po miesiącach też dostało tę wiadomość.
Gdy terminy się zderzą, czyli notatkę usunięto na jednym urządzeniu, a edytowano na drugim, Cappa stawia na zachowanie tekstu. Zależnie od tego, co stało się później, edytowana wersja zostaje jako sama notatka albo jako osobna kopia, a w niektórych przypadkach krótka notatka „Deletion conflict” wyjaśnia, co zaszło.
Jeden sejf, jedna otwarta karta
Przeglądarka nie potrafi skoordynować dwóch kart zapisujących do tej samej bazy tak bezpiecznie jak serwer. Dlatego Cappa pozwala mieć odblokowany sejf (czyli zaszyfrowany zbiór notatek) tylko w jednej karcie naraz. Druga karta odmówi z komunikatem „This vault is already open in another tab.” To drobna niewygoda, ale dzięki niej nie wywołasz konfliktu sam ze sobą.
Uczciwie o granicach notatek local-first
Local-first przybliża notatki do Ciebie, a to znaczy, że pamięć urządzenia ma większe znaczenie.
Większość tych ryzyk ograniczą proste nawyki:
- 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?
Oto nasza uczciwa ocena w zestawieniu z siedmioma ideałami:
| Ideał | Cappa dziś |
|---|---|
| Bez kręcących się kółek | Tak. Notatki otwierają się z kopii na urządzeniu |
| Dane nie są uwięzione na jednym urządzeniu | Tak. Synchronizacja przenosi zaszyfrowane zmiany między urządzeniami |
| Sieć jest opcjonalna | Tak, po pierwszym logowaniu i synchronizacji na danym urządzeniu |
| Płynna współpraca | Nie. Jedna osoba, jeden sejf; nie ma udostępniania ani wspólnej edycji |
| Długi horyzont | Częściowo. Notatki to zwykły Markdown i eksportują się jako zwykłe pliki |
| Bezpieczeństwo i prywatność domyślnie | Tak w zakresie treści: notatki są szyfrowane, zanim opuszczą urządzenie. Metadane, takie jak rozmiary i czasy zmian, serwer widzi |
| Kontrola nad danymi | Częściowo. Możesz wyeksportować wszystko jako zwykłe pliki, ale synchronizacja wymaga konta na serwerze Cappy, a konta powstają tylko z zaproszenia |
Uwaga techniczna dla ciekawych: esej Ink & Switch promuje CRDT, struktury danych zaprojektowane tak, żeby zmiany wielu osób zawsze scalały się automatycznie. Cappa używa starszego scalania trzystronnego w stylu Gita. Dobrze pasuje ono do jednej osoby edytującej tekst na kilku urządzeniach, a gdy nie ma pewności, zachowuje obie wersje.
Jeśli chcesz uporządkować to, co piszesz, gdy już bezpiecznie leży na Twoich urządzeniach, zajrzyj do tekstu o tym, jak organizować notatki. A jeśli chcesz wypróbować sam edytor, demo działa w całości w jednej karcie przeglądarki. Niczego nie synchronizuje ani nie zapisuje, więc pokazuje pisanie, a nie pracę offline.
Najczęstsze pytania
Czy Cappa działa bez internetu?
Tak, na każdym urządzeniu, na którym logowanie i pierwsza synchronizacja już się odbyły. Odblokowujesz sejf hasłem głównym, czytasz i edytujesz notatki, a zmiany czekają w kolejce na powrót sieci. 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: kopia na urządzeniu jest podstawowa, serwer jest pomocnikiem, a projekt ma chronić prywatność, trwałość i Twoją kontrolę nad danymi.
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” do przejrzenia.
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 notatki pobiorą się i odszyfrują lokalnie. Dlatego przed czyszczeniem czegokolwiek sprawdź, czy widzisz „Synced”.
Czy synchronizacja zastępuje kopię zapasową?
Nie. Synchronizacja sprawia, że urządzenia mają to samo, więc usunięcie albo niechciana zmiana trafia na wszystkie. 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.


