⌘ REFERENCIA · 98 elementos
Cheatsheet de Local-First
La arquitectura entera en un sitio: almacenamiento, concurrencia, convergencia, contenido, red, identidad y producción. Busca por concepto o por API.
📦 Almacenamiento del cliente 8
5 MB en UTF-16, síncrono, bloquea el hilolocalStorage
Igual, pero muere con la pestañasessionStorage
Transaccional, asíncrono, lento en volumenIndexedDB
Sistema de archivos privado del origenOPFS
E/S síncrona: SOLO dentro de un WorkercreateSyncAccessHandle()
Respuestas HTTP, no datos de aplicaciónCache API
Cuánto ocupas y cuánto quedanavigator.storage.estimate()
Pedir que no te desalojennavigator.storage.persist()
⚠️ Cuotas y desalojo 4
Modo por defecto: desalojablebest-effort
Hay que pedirlo y pueden negarlopersistent
Hasta el 80% del disco, cuota dinámicaChrome
¿Qué pasa si mañana no están los datos?La pregunta clave
🗃️ SQLite en el navegador 6
La capa que permite enchufar backendsVFS
VFS sobre OPFS, requiere Workeropfs
Reserva manejadores por adelantadoopfs-sahpool
Sobre localStorage: solo bases diminutaskvvfs
Cabeceras que exigen algunos modosCOOP / COEP
Una pestaña escribe; el resto esperaBloqueo exclusivo
🧵 Workers y pestañas 7
Hilo real, sin DOM, sin memoria compartidaWorker
Uno para todas las pestañas; soporte irregularSharedWorker
Notificar, no excluirBroadcastChannel
Bloqueo con nombre por origennavigator.locks.request()
Tomar un lock y no soltarlo nuncaElección de líder
Copia; funciones y prototipos no pasanstructuredClone
Pasar propiedad en vez de copiarTransferables
🕐 Relojes y orden 6
Inservible: deriva, ajustes, saltosHora del sistema
Contador; da orden, no detecta concurrenciaReloj de Lamport
Un contador por réplica; sí la detectaVector clock
Versiona réplicas, no eventosVersion vector
Híbrido: comparable con la hora realHLC
El vector crece con el nº de réplicasCoste
🧮 Teoría CRDT 9
Consistencia fuerte eventualObjetivo
La estructura que lo garantizaSemirretículo de unión
El orden de mezcla da igualConmutativa
El agrupamiento da igualAsociativa
Recibirlo dos veces da igualIdempotente
El estado solo avanza: de ahí las lápidasMonotonía
Basado en estado: manda todo, mezclaCvRDT
Basado en operaciones: exige entrega fiableCmRDT
Manda solo el trozo que cambióDelta-CRDT
🧺 Catálogo de CRDT 8
Solo suma; mezcla por máximoG-Counter
Dos contadores para poder restarPN-Counter
Solo crece; mezcla por uniónG-Set
Borra, pero no se puede readmitir2P-Set
Etiquetas por adición; gana añadirOR-Set
Gana la marca mayor; pierde datosLWW-Register
Conserva los concurrentes; decide el usuarioMV-Register
Claves tipo OR-Set, valores CRDTMapa
📏 Secuencias y texto 8
Crear un identificador entre otros dos, siempreEl problema
El primero; impracticable por costeWOOT
Identificador como camino; creceLogoot / LSEQ
Cada nodo apunta a su predecesorRGA
El algoritmo de YjsYATA
Mezclar letras de dos autores (2019)Intercalación
No intercalación maximalFugue
Guarda operaciones, no metadatosEg-walker
📚 Librerías 7
~920K/semana; el más maduro; YATAYjs
Documento y canal efímero aparteY.Doc · awareness
~85K/semana; historia completaAutomerge
Julio 2025: memoria 10x menorAutomerge 3.0
700 MB → 1,3 MB; 17 h → 9 sMoby Dick
~12K/semana; Rust; texto rico y árbolesLoro
Loro y Automerge guardan el DAG; Yjs noHistorial
🔗 Contenido y hashes 8
El nombre del dato es su hashCAS
Hash del contenido + hashes de los hijosMerkle DAG
Comparar dos árboles con un hashLa raíz resume el grafo
Identificador autodescriptivoCID
Un cambio invalida un bloqueTroceado por contenido
Ubicuo, secuencialSHA-256
En árbol: paralelo y verificable por trozosBLAKE3
blob, tree, commit, tag + refs mutablesGit
🌐 Red y sincronización 6
Saber qué falta sin mandarlo todoReconciliar
Resumen probabilístico, mensaje diminutoFiltro de Bloom
ICE, STUN, TURN, DTLS, SCTP: pesadoWebRTC
WebRTC no la especifica: la pones túSeñalización
Modular; perforar NAT ~70% de éxitolibp2p
Junio 2026; QUIC; claves como direccionesiroh 1.0
⚙️ Motores de sync 8
Servidor decide vs. convergenciaEje 1: autoridad
Filas vs. documentosEje 2: unidad
Qué subconjunto baja al clienteEje 3: alcance
1.0 en junio 2026; servidor autoritativoZero
Streaming de tablas Postgres; sin CRDTElectricSQL
SQLite local; el más maduro en móvilPowerSync
Descentralizado y cifradoJazz
Log de eventos deterministaLiveStore
🔐 Identidad y cifrado 6
Identificador descentralizado (W3C)DID
Autorización delegada, verificable offlineUCAN
Cadenas de certificados sin estadoEnlace tardío
Grupos cifrados con rotación de claveMLS · RFC 9420
Control de acceso local-first (Ink & Switch)Keyhive
Revocar lo que alguien ya descifróLo imposible
🚢 Producción 7
Solo si TODAS las réplicas lo han vistoCompactar
Dispositivo dormido bajo el corte causalEl que vuelve
Compatibilidad en las dos direccionesMigrar
Añadir campos opcionalesSeguro
Renombrar, cambiar tipo, moverPeligroso
Para cualquier historia, convergenProperty testing
De 200 operaciones a las 3 culpablesReducción de casos