Local-first архитектура
Данные живут на клиенте, сервер опциональный. Offline работает по умолчанию, синхронизация в фоне через CRDT, WebSocket, WebRTC.
Что это
Классическая web-архитектура: сервер — источник истины, клиент — окно. Без сети не работает.
Local-first: клиент хранит полную копию своих данных локально (OPFS, IndexedDB). С сетью — синхронизируется с другими узлами и/или сервером. Без сети — работает полностью. Сервер не обязателен и уязвим (single point of failure).
Стек технологий
┌─ UI (фронтенд-фреймворк, любой)
├─ State / Store (адаптер под привычный store)
├─ CRDT — разрешение конфликтов
├─ Persistence — OPFS / IndexedDB
├─ Sync transport — WebSocket / WebRTC / Service Worker
├─ Discovery — Blockchain или DHT (адреса нод)
└─ Crypto — Web Crypto (подписи, шифрование)
Компоненты
- CRDT (Conflict-free Replicated Data Types) — структуры данных, у которых merge коммутативен и идемпотентен. Два клиента редактируют offline → при синке нет ручного разрешения конфликта.
- OPFS (Origin Private File System) — приватная ФС в браузере, быстрее IndexedDB.
- Service Worker — прокси сети, кэш, фоновая синхронизация, шина между вкладками.
- WebSocket — синхронизация с сервером/нодами.
- WebRTC — P2P между клиентами в одной локальной сети, без сервера.
- Blockchain — публичный реестр адресов нод (не для денег, а для discovery).
- Web Crypto — подписи операций для верификации.
Производительность / Подводные камни
- Service Worker умирает через 30 сек — 5 мин после закрытия вкладок. WebSocket держит его живым.
- WebSocket периодически отпадает — три проблемы переподключения: потеря событий между разрывами, дубли, порядок.
- WebRTC только во вкладках — нужна «ведущая» вкладка через
web.locks. - WebRTC не гарантирует порядок — поверх UDP-природа DataChannel; для упорядоченности —
ordered: trueв config. - WebRTC обходит ограничение origin — клиенты разных origin могут общаться напрямую.
- Барьер входа высокий — нужны OPFS-tools (типа phpMyAdmin для блокчейна), npm-готовые компоненты.
- Adapter под привычный store — иначе фронтендеры не будут использовать.
Изоляция слоёв в Metarhia-варианте
автор разделяет три слоя, ничего не знающих друг про друга:
- UI ⟂ бизнес-логика
- Бизнес-логика ⟂ сеть
- Sync layer скрыт за Global Storage
Бизнес-логика пишется один раз и может исполняться:
- В таб-вкладке
- В Service Worker
- На сервере
- В тесте (mock-транспорт)
«Из-за того, что у нас всё отделено одно от другого Global Storage, это как раз и есть принцип Local First. UI и бизнес-логика работают как будто с локальным сториджем.»
Подменяемые стратегии
Все слои — Strategy pattern на уровне архитектуры:
- Транспорт: WebSocket / WebRTC / MessagePort
- Storage: OPFS / IndexedDB / Postgres / Redis
- Sync: CRDT / operation log / patch-based / pessimistic
Зрелость экосистемы
- Production-ready: Yjs, Automerge, Replicache, PouchDB.
- В разработке: Metarhia GlobalStorage с CRDT + blockchain discovery.
- Барьер входа: нужны OPFS-tools (типа phpMyAdmin для блокчейна), npm-готовые компоненты, adapter под привычный store — иначе фронтендеры не подключаются.
Слой sync — не катите свой
«Если синхронизацию состояния отдавать на откуп программистам, они её всегда начинают переизобретать. Хорошо может быть сделана, только если вынесена в специальный слой синхронизации — отдельная библиотека, которая отлаживается специальными умными людьми.»
🎓 Источники
-
🎓 PWA — Websocket, local-first, offline-first установка JS-приложения · 2025-08-04
- Тезисы: один Service Worker на много вкладок; SW как прокси с кэшем для fetch; сервер инициирует обновление кэша; broadcast между табами без сервера; установка PWA даёт расширенные права.
-
🎓 Local-first app PWA + CRDT + OPFS + Node.js + Websocket + Service Worker · 2025-08-17
- Тезисы: полный стек local-first; OPFS как быстрая локальная ФС; CRDT для merge без конфликтов; WebSocket для bidirectional sync.
-
🎓 Что могут Service Worker — Local-First подход · 2025-12-09
- Тезисы: SW умирает; WebSocket держит SW живым; task queue без потери событий; три проблемы переподключения; WebRTC только во вкладках; ведущая вкладка через web.locks; адреса нод из блокчейна; WebRTC обходит origin.
- Цитата: «Сервер не обязателен и уязвим. Адреса нод можно брать из блокчейна — публичный реестр без single point of failure.»
-
🎓 Local-first подход, CRDT и фронтенд — синхронизация в распределённых системах · 2025-03-07
- Тезисы: CRDT как обязательный слой; offline-first; P2P discovery.
-
🎓 Local-first — Как изменится фронтенд и бекенд · 2025-12-26
- Тезисы: бизнес-логика отделена от UI и сети; одна и та же на клиенте и сервере; архитектура собирается как лего; подменяемые стратегии транспорта/storage.
-
🎓 Развитие PWA от простого чата до Local-first архитектуры · 2026-02-06
- Тезисы: эволюция через 3 версии — голый WebSocket → Service Worker как прокси → GlobalStorage в SW и вкладке.
-
🎓 Metarhia Weekly #192 — Как стыкуются DDD фронт + DDD бэк + local-first · 2025-03-01
- Тезисы: domain-код общий для клиента и сервера; Redux как локальная СУБД; local-first как продолжение DDD.
-
🎓 Про Local-first та CRDT синхронізацію українською · 2025-08-21
- Тезисы: міграції локальної бази даних — повноцінна проблема; зміна схеми CRDT-структур; версіонування синхронізації.