wandres.dev
Arquitectura de datos que viven en el cliente

Domina Local-First
hasta nivel dios

La arquitectura local-first a fondo: almacenamiento en el navegador y SQLite sobre OPFS, Web Workers, la teoría de los CRDT y sus algoritmos de secuencia, almacenamiento direccionado por contenido, motores de sincronización, identidad sin servidor y cifrado extremo a extremo.

La ruta

59 niveles, de novato a dios

Cada nivel construye sobre el anterior. Sin saltos, sin huecos.

Ontología Nivel 0 · El mapa de local-first

La visión aérea: los siete ideales, el almacenamiento del cliente, los CRDT, el almacenamiento por contenido, los motores de sincronización y la identidad sin servidor.

Mapa mentalLocal-first

Los siete ideales Nivel 1 · qué promete de verdad

El artículo de Ink & Switch que fundó el término: rapidez, multidispositivo, offline, colaboración, longevidad, privacidad y control del usuario. Qué promete cada ideal y cuál se incumple más.

Ink & Switchideales

No es offline-first Nivel 2 · la taxonomía honesta

Offline-first, local-first, sync-first y app nativa no son sinónimos. Qué significa cada término, quién lo usa para vender y en qué se distinguen técnicamente.

taxonomíaoffline

El coste del servidor Nivel 3 · la latencia como diseño

Por qué la arquitectura cliente-servidor produce ruedas de carga: el viaje de ida y vuelta, el servidor como punto único de fallo, y el coste que nadie mide de la latencia acumulada.

latenciacliente-servidor

Propiedad del dato Nivel 4 · el argumento no técnico

Longevidad, privacidad y control: qué pasa con tus datos cuando la empresa cierra, cambia de precio o de términos. El argumento que decide la arquitectura y no es de ingeniería.

propiedadlongevidad

Cuándo NO hacerlo Nivel 5 · el criterio inverso

Los casos donde local-first es la respuesta equivocada: autoridad central obligatoria, datos que no caben, permisos que cambian, cumplimiento normativo y equipos pequeños.

criteriolímites

El mapa del almacenamiento Nivel 6 · cookies, local y session

Todo lo que el navegador ofrece para guardar: cookies, localStorage, sessionStorage y sus límites reales. Por qué los cinco megabytes de localStorage no son negociables.

localStoragelímites

IndexedDB I Nivel 7 · el modelo

Almacenes de objetos, índices, transacciones y cursores. El modelo mental de la única base de datos que todos los navegadores traen de serie.

IndexedDBtransacciones

IndexedDB II Nivel 8 · por qué es lento

Dónde se va el tiempo: la serialización estructurada, el coste por transacción, los patrones que lo hacen soportable y los envoltorios que valen la pena.

rendimientoDexie

OPFS I Nivel 9 · el sistema de archivos del origen

El Origin Private File System: un sistema de archivos real, privado por origen, sin diálogos de permiso. Qué es, qué lo diferencia de la File System Access API y qué te da.

OPFSarchivos

OPFS II Nivel 10 · la restricción que lo cambia todo

El acceso síncrono solo existe dentro de un Worker, y esa única restricción condiciona la arquitectura entera de tu aplicación. Por qué es así y cómo se convive con ello.

OPFSWorkersíncrono

Cuotas y desalojo Nivel 11 · cuando el navegador te borra

El modelo de cuota por origen, el modo best-effort, el desalojo silencioso bajo presión de disco, y cómo pedir persistencia de verdad con la API de almacenamiento.

cuotapersistdesalojo

SQLite en el navegador I Nivel 12 · WASM y la capa VFS

La compilación oficial a WebAssembly, la arquitectura de VFS que hace posible enchufarle cualquier backend de almacenamiento, y qué significa tener SQL de verdad en el cliente.

SQLiteWASMVFS

SQLite en el navegador II Nivel 13 · sobre OPFS, y a qué precio

El VFS de OPFS, las alternativas de la comunidad, el rendimiento medido en bases de varios gigabytes y los modos de concurrencia que tienes que elegir.

OPFSrendimientoconcurrencia

El catálogo de bases locales Nivel 14 · y cómo elegir

RxDB, PouchDB, Dexie, TinyBase, DuckDB en WebAssembly y los almacenes de los propios motores de sync. Qué resuelve cada uno y con qué criterio se elige.

RxDBDuckDBcriterio

Consultas reactivas Nivel 15 · la UI que se entera sola

El problema de mantener la interfaz sincronizada con la base local: consultas vivas, invalidación, y por qué esto define la ergonomía de toda la aplicación.

reactividadconsultas

Web Workers I Nivel 16 · el modelo de hilos de la web

Hilos reales sin memoria compartida: el paso de mensajes, el algoritmo de clonado estructurado, qué se puede transferir y qué se copia.

WorkerpostMessage

Web Workers II Nivel 17 · SharedWorker y las pestañas

El problema de las pestañas múltiples sobre la misma base de datos. SharedWorker, su soporte irregular, y las alternativas cuando no está disponible.

SharedWorkerpestañas

Web Locks y liderazgo Nivel 18 · quién escribe

La API de bloqueos del navegador, la elección de líder entre pestañas, y el patrón que evita que dos pestañas corrompan la misma base.

Web Lockslíder

La arquitectura de la pestaña Nivel 19 · el patrón completo

Juntar las piezas: la base en un Worker dedicado, RPC tipado sobre postMessage, propagación de cambios a todas las pestañas y arranque en frío.

arquitecturaRPCComlink

Por qué sincronizar es difícil Nivel 20 · particiones y orden

El teorema CAP aplicado a tu aplicación, qué es de verdad una partición de red, y por qué el orden de los eventos es el problema central y no un detalle.

CAPparticiones

Relojes I Nivel 21 · el tiempo no existe

Por qué la hora del sistema es inservible para ordenar eventos distribuidos: deriva, ajustes, saltos. La relación de precedencia causal y los relojes de Lamport.

Lamportcausalidad

Relojes II Nivel 22 · vectores y relojes híbridos

Vector clocks y version vectors para detectar concurrencia real, su coste en espacio, y los relojes lógicos híbridos que juntan lo mejor de ambos mundos.

vector clockHLC

Detectar conflictos Nivel 23 · y por qué LWW pierde datos

Qué es exactamente un conflicto, por qué "gana la última escritura" es la respuesta más común y la peor, y qué datos desaparecen sin que nadie se entere.

conflictosLWW

OT frente a CRDT Nivel 24 · las dos escuelas

La transformación operacional que hizo posible Google Docs y los tipos replicados sin conflicto. De dónde viene cada una, qué exige y dónde vive hoy cada enfoque.

OTCRDThistoria

CRDT I Nivel 25 · el teorema

La estructura algebraica que hay debajo: semirretículo de unión, conmutatividad, asociatividad e idempotencia. Por qué esas tres propiedades bastan para garantizar convergencia.

semilatticeteorema

CRDT II Nivel 26 · estado, operaciones y deltas

Las dos familias, basada en estado y basada en operaciones, qué exige la red a cada una, y los CRDT delta que resolvieron el problema de enviar el estado entero.

CvRDTCmRDTdelta

Contadores Nivel 27 · el CRDT más simple

G-Counter y PN-Counter: el punto de partida para entender la mecánica. Por qué un contador distribuido no es un número y qué implica eso.

contadorG-Counter

Conjuntos Nivel 28 · y el precio de borrar

G-Set, 2P-Set y OR-Set. El problema del borrado en un sistema sin autoridad central, las lápidas que deja detrás y por qué añadir es fácil y quitar no.

OR-Settombstone

Registros Nivel 29 · un solo valor, varios dueños

LWW-Register y MV-Register: guardar un valor cuando dos personas lo escriben a la vez. Resolver por reloj o exponer el conflicto al usuario.

LWWMV-Register

Mapas y JSON Nivel 30 · componer estructuras

Componer CRDT dentro de CRDT para representar documentos anidados, el problema de la eliminación de claves y el modelo JSON que usan las librerías reales.

mapaJSONanidado

Secuencias I Nivel 31 · el problema del orden

Por qué una lista es el caso difícil: hace falta poder crear un identificador estrictamente entre otros dos, infinitas veces, sin coordinación.

secuenciaorden denso

Secuencias II Nivel 32 · RGA, Logoot y Treedoc

Los algoritmos clásicos de lista replicada, sus estructuras internas y el compromiso que hace cada uno entre tamaño del identificador y coste de inserción.

RGALogoot

La intercalación Nivel 33 · el fallo que nadie vio

El artículo de 2019 que destapó que casi todos los algoritmos entrelazan el texto de dos personas que escriben a la vez en el mismo punto. Por qué pasó desapercibido décadas.

interleavingKleppmann

Fugue Nivel 34 · no intercalación maximal

El algoritmo que definió y resolvió la propiedad de no intercalación maximal, cómo lo consigue y por qué su formulación resultó ser más fácil de optimizar que las anteriores.

FugueWeidner

Eg-walker Nivel 35 · guardar operaciones, no metadatos

El enfoque que registra las operaciones originales en vez de la metadata del CRDT: un orden de magnitud menos de memoria y cargas de documento drásticamente más rápidas.

Eg-walkermemoria

Árboles y movimiento Nivel 36 · el problema del ciclo

Mover un nodo dentro de un árbol replicado puede crear un ciclo cuando dos personas lo hacen a la vez. Las estrategias para impedirlo y el coste de cada una.

árbolmoveciclo

Construir un OR-Set Nivel 37 · desde cero

Implementar un conjunto replicado paso a paso, con su prueba de convergencia y sus lápidas, para tocar con las manos lo que las lecciones anteriores describen.

implementarOR-Set

Construir una secuencia Nivel 38 · RGA paso a paso

Implementar una lista replicada completa: identificadores, inserción, borrado, recorrido y la función de mezcla. El ejercicio que fija todo lo demás.

implementarRGA

Probar la convergencia Nivel 39 · fuzzing y propiedades

Cómo se demuestra que tu implementación converge: pruebas basadas en propiedades, generación de historias concurrentes, simulación de particiones y reducción de casos.

property testingfuzzing

Yjs Nivel 40 · el estándar de facto

El modelo de documento, los tipos compartidos, el sistema de awareness para los cursores ajenos y los proveedores de transporte. Por qué domina el mercado de editores.

Yjsawareness

Automerge Nivel 41 · documentos e historia

El modelo de documento con historia completa, el formato de almacenamiento columnar de la versión 3 y las capacidades de viaje en el tiempo que eso habilita.

Automergecolumnar

Loro Nivel 42 · texto rico y árboles

La apuesta escrita en Rust: texto enriquecido, árboles con movimiento y el algoritmo de recorrido del grafo de eventos. Qué gana y qué le falta de ecosistema.

LoroRust

Elegir CRDT Nivel 43 · la comparación honesta

Tamaño en disco, memoria en caliente, velocidad de carga, madurez del ecosistema y forma de los datos. Un criterio de elección, y los casos donde ninguno es la respuesta.

comparacióncriterio

El historial infinito Nivel 44 · compactar sin romper

Un CRDT que guarda todo crece para siempre. Lápidas, compactación, instantáneas y la pregunta incómoda de qué historia puedes tirar sin romper a quien lleva meses desconectado.

compactaciónGC

Direccionar por contenido I Nivel 45 · el hash como identidad

La idea que cambia el modelo: el nombre de un dato es su hash. Inmutabilidad, deduplicación gratuita y verificación de integridad sin confiar en quien te lo envía.

CAShashdedup

Direccionar por contenido II Nivel 46 · Merkle DAG y CID

Grafos acíclicos dirigidos de Merkle, el troceado de ficheros grandes, los identificadores de contenido y el modelo de datos enlazados que usan los sistemas distribuidos.

Merkle DAGCIDIPLD

Git como CAS Nivel 47 · el ejemplo que ya usas

Git es un almacén direccionado por contenido con una interfaz de control de versiones encima. Objetos, árboles, commits y packfiles: lo que se aprende leyéndolo así.

Gitobjetospackfile

Funciones de hash Nivel 48 · SHA-256 frente a BLAKE3

Qué se le pide a un hash en este contexto, por qué la velocidad y el paralelismo importan tanto como la resistencia a colisiones, y los árboles de hash verificables por trozos.

SHA-256BLAKE3

Reconciliación eficiente Nivel 49 · saber qué falta sin mandarlo todo

El problema de averiguar la diferencia entre dos réplicas sin transmitirlas enteras: version vectors, filtros de Bloom y reconciliación de conjuntos.

reconciliaciónBloom

P2P I Nivel 50 · WebRTC y su peso

La pila que el navegador te da para conectar dos clientes: ICE, STUN, TURN, DTLS y SCTP. Por qué se diseñó para vídeo y qué cuesta usarla para sincronizar datos.

WebRTCICESTUN

P2P II Nivel 51 · libp2p, iroh y QUIC

Las alternativas modernas: la pila modular de libp2p, el enfoque de iroh sobre QUIC con claves como direcciones, y las tasas reales de éxito al perforar NAT.

libp2pirohQUIC

Motores de sync I Nivel 52 · la taxonomía

El panorama de 2026 ordenado: autoridad en el servidor frente a convergencia por CRDT, sincronización de tablas frente a sincronización de documentos, y qué implica cada eje.

sync enginetaxonomía

Motores de sync II Nivel 53 · los que existen

Zero, ElectricSQL, PowerSync, Jazz, LiveStore y compañía: cómo funciona cada uno por dentro, qué base de datos exige y para qué tipo de aplicación está pensado.

ZeroElectricPowerSync

Identidad sin servidor Nivel 54 · DID y delegación

Quién eres cuando no hay servidor de sesiones: identificadores descentralizados, cadenas de certificados con enlace tardío y autorización delegada que funciona sin conexión.

DIDUCAN

Cifrado extremo a extremo Nivel 55 · sobre datos que convergen

El choque entre cifrar y sincronizar: qué puede ver el servidor, la gestión de claves entre dispositivos, los protocolos de mensajería en grupo y el control de acceso local-first.

E2EEMLSKeyhive

Migrar el esquema Nivel 56 · datos que no controlas

El problema más difícil y el peor documentado: cambiar la forma de los datos cuando viven en dispositivos ajenos que llevan meses sin abrirse. Compatibilidad en las dos direcciones.

migraciónesquema

Casos de estudio Nivel 57 · qué hacen los que lo hacen

Cómo resolvieron esto en productos reales de escritorio y web: qué sincronizan, qué no, dónde ponen la autoridad y qué compromisos aceptaron a cambio.

casosproducción

Nivel Dios: local-first Nivel 58 · síntesis y futuro

El modelo mental completo, el árbol de decisiones para elegir arquitectura, lo que sigue sin estar resuelto y hacia dónde va el campo.

síntesisfuturo
291lecciones
59niveles
0→∞de cero a dios

¿Listo para dominar Local-First?

Empieza por los fundamentos y sube nivel a nivel hasta el dominio total.

Comenzar el camino →