Las aplicaciones web tradicionales dependen del supuesto de que siempre se dispone de una conexión estable y de baja latencia. La mayoría del software de línea de negocio trata una base de datos de nube central como la única fuente de verdad, manipulando mutaciones y búsquedas a través de REST o GraphQL endpoints. Cuando los picos de latencia o caídas de conectividad (como en almacenes, inspecciones de servicios de campo o hangares de aeronaves), los usuarios se encuentran cargando spinners, formas bloqueadas y actualizaciones optimistas rotas.
La arquitectura local-primera cambia este modelo al tratar la tienda local de datos del cliente como la principal fuente de verdad en lugar de tratar el navegador como un cliente delgado para el estado remoto. Las lecturas y mutaciones se ejecutan en una base de datos en proceso localmente en menos de 1ms, mientras que un motor de sincronización de fondo se reconcilia con el servidor.
El concepto se deriva del papel de investigación Ink & Switch 2019 *"Local-First Software"*Entre 2024 y 2026, la adopción empresarial pasó de prototipos experimentales a despliegues de producción. Acceso estándar del sistema de archivos del navegador, tiempo de funcionamiento relacional WebAssembly, y protocolos de sincronización especializados ahora permiten a los equipos ejecutar sistemas web distribuidos sin renunciar a garantías de transacción o seguridad.
At Lidex, construimos software personalizado y modernizamos los sistemas institucionales donde el tiempo de inactividad inducido por la red interrumpe las operaciones centrales. A continuación se presenta una visión general de cómo funcionan los primeros sistemas locales bajo la capucha, sus compensaciones prácticas y las pautas de aplicación para la producción.
¿Por qué el retroceso fuera de línea falla los flujos de trabajo de la empresa (y cómo local-como primario lo fija)
La mayoría de las aplicaciones web tratan de manejar la conectividad intermitente utilizando caches de trabajadores de servicio y optimistas UI actualizaciones. Cuando alguien envía una factura o cambia los recuentos de inventario, el cliente actualiza su variable de estado local, asume el éxito y envía una solicitud asincrónica sobre la red. Si esa solicitud falla, la aplicación muestra un tostado de error, revuelve el cambio, o empuja la mutación en una cola de IDDB ad hoc.
En entornos transaccionales complejos, este patrón se descompone rápidamente:
- Inconsistencia del Estado: Si un usuario completa tres pasos dependientes mientras está fuera de línea (como la creación de un informe de inspección, la fijación de defectos de partida lineal y la asignación de tareas), la vuelta atrás paso dos deja el estado restante fuera de sincronización o corrupto.
- Latencia de la red: Esperar entre 100 y 300ms para viajes de red entre actualizaciones de visión desacelera el rendimiento del operador en interfaces de datos-denses como sistemas punto de venta o ERP.
- Manejo complejo de errores: El código de entrada termina cargado con colas de mutación personalizadas, lógica de reingreso, retrocesos exponenciales y conflictos provocan a través de formas.
Con un diseño local-como-primario, lee y escribe ejecutar sincrónicamente contra la memoria o disco local. Debido a que la aplicación escribe directamente a una base de datos incrustada, la persistencia es inmediata y atómica. Las mutaciones no fallan simplemente porque la red cae. La red sirve como una capa de transporte asincrónica para sincronizar en lugar de bloquear la dependencia de ejecución.
Traditional Architecture:
[Client UI] ---> Network (100-300ms) ---> [API Gateway] ---> [Cloud Database]
(Network drops = System stalls)
Local-First Architecture:
[Client UI] ---> Local Embedded DB (<1ms)
|
Background Sync Engine
|
[Central Database & Sync Server]
Sustratos de almacenamiento del navegador: OPFS, WASM SQLite y PGlite
Ejecutar un motor relacional integrado dentro del navegador fue una vez restringido por IndexedDB. IndexedDB maneja datos básicos de valor clave, pero su API es torpe, su soporte de transacción es limitado, y su serialización basada en cursor hace que buscar miles de registros lento.
Las implementaciones modernas utilizan el Sistema de Archivo Privado de Origen (OPFS), apoyado en las versiones modernas de Chromium, Safari y Firefox. OPFS proporciona acceso a sistemas de archivos privados con rendimiento de lectura y escritura rápidas, permitiendo bases de datos integradas por WebAssembly para ejecutar operaciones de sistemas de archivos nativos dentro de Web Workers.
Dos tiempos de funcionamiento son comunes en la producción:
- SQLite compiló a WebAssembly (
wa-sqliteo SQLite oficial WASM): Utilizando OPFS para la persistencia, WASM SQLite proporciona transacciones, índices y SQL consultas directamente en el cliente a través de cientos de miles de registros. - PGlite (ElectricSQL): Publicado en 2024 y mantenido a través de revisiones importantes posteriores, paquetes PGlite Postgres en un paquete WebAssembly de aproximadamente 3MB comprimido. Funciona dentro de los trabajadores del navegador, Bun, o Node.js, ofrenda PostgreSQL Compatibilidad de dialecto. Los clientes pueden realizar consultas parametizadas, uniones relacionales y búsqueda de vectores de lado cliente utilizando extensiones embebidas de
pgvector.
Garantías de gestión y desahucios
Los dispositivos cliente tienen almacenamiento finito. Si bien los navegadores modernos permiten a las aplicaciones solicitar almacenamiento persistente a través de navigator.storage.persist() y utilizar hasta el 60% hasta el 80% del espacio de disco disponible, el navegador o sistema operativo host todavía puede desalojar datos si el espacio de disco funciona críticamente bajo.
Los sistemas de producción local-primer no deben tratar el almacenamiento del cliente como almacenamiento permanente de archivos. La aplicación requiere una copia de seguridad de servidor autorizada junto con una estrategia de desalojo menos utilizada (LRU) para prune stale records mientras preserva el conjunto de trabajo activo localmente.
El motor de sincronización: por qué los sistemas empresariales se desplazan más allá de los CRDT puros
La primera investigación local se centró fuertemente en los tipos de datos replicados sin conflictos (CRDTs). Los CRDT estatales y basados en operaciones permiten que varios nodos actualicen los datos simultáneamente sin un coordinador central, resolviendo ramas divergentes determinísticamente.
Bibliotecas como Yjs, Automerge (en particular después de su 2025 Rust reescritura de núcleo, que reduce significativamente la memoria de documentos encabezada), y Loro trabaja bien para herramientas colaborativas de texto rico y lienzo como Noción, Figma o Excalidraw. However, pure CRDTs introduce major friction when applied to relational business applications like ERP, CRM, and inventory systems:
- Tombstones y crecimiento de la memoria: El seguimiento de las eliminaciones y actualizaciones frecuentes en los datos transaccionales crea la sobrecarga de lápida que globos uso de la memoria.
- Limitaciones de relación: Los sistemas empresariales dependen de claves extranjeras e invariantes multigrabados. Los CRDT puramente iguales no pueden hacer cumplir fácilmente las restricciones transversales sin una autoridad coordinadora.
Debido a estas limitaciones, los equipos de construcción de software de negocios han adoptado en gran medida motores de sincronización con servidores que conectan una base de datos central (típicamente Postgres) con réplicas de clientes integrados locales.
Marcos de sincronización de producción
- Cero (Rocicorp): Utiliza la reconciliación del servidor inspirada en las arquitecturas de juego multijugador. Un proceso de
zero-cachese encuentra frente a Postgres y sincronizaciones filtradas suscripciones de consultas a los motores de consulta del lado cliente. - ElectricSQL (Shapes) Arquitectura: Se desplaza de CRDTs cliente puro hacia un modelo de transmisión HTTP llamado Formas. El servidor transmite subconjuntos parametizados y caqueables de tablas de Postgres sobre HTTP o Eventos de Servidor-Sent (SSE) en instancias locales SQLite o PGlite.
- PowerSync: Un servicio que sincroniza bases de datos de backend (Postgres, MySQL, MongoDB) directamente con bases de datos SQLite locales a través de web, Flutter, React Native, y Kotlin Clientes multiplataforma.
Sanción de datos y seguridad en el límite de reproducción
Las bases de datos empresariales suelen almacenar decenas o cientos de gigabytes en millones de filas. Los clientes no pueden copiar toda la base de datos localmente, ni deben tener acceso sin restricciones a los datos fuera de su alcance. Las configuraciones de producción administran esto a través de la replicación parcial y límites de autorización estrictos.
Deslice de datos dinámicos
Los motores de sincronización modernos establecen suscripciones filtradas en lugar de sincronizar la base de datos completa. Los límites de sincronización se adaptan en función de la visión y el papel activos del usuario.
Por ejemplo, en el punto de referencia "Gigabugs" de Rocicorp (que evalúa las consultas en un conjunto de datos de 1,2 millones de filas), el cliente sincroniza e indexa sólo opiniones activas y registros recientemente vistos. Esto se mantiene. UI interacciones subsegundo manteniendo actualizaciones locales reactivas.
Autorización de cambio a la capa de replicación
En una arquitectura tradicional REST, la autorización sucede por solicitud API capa:
// Traditional: Auth validated at the API layer
app.get('/api/invoices/:id', authenticateUser, async (req, res) => {
const invoice = await db.invoices.findById(req.params.id);
if (invoice.organizationId !== req.user.orgId) {
return res.status(403).send('Forbidden');
}
return res.json(invoice);
});
Porque un cliente local corre SQL o expresiones query-builder directamente contra sus tablas locales, los registros no autorizados nunca deben llegar al navegador en primer lugar.
Esto requiere la autorización móvil directamente al flujo de reproducción. Los protocolos de sincronización modernos evalúan las políticas de base de datos Row-Level Security (RLS) o las reglas declarativas antes de transmitir filas al cliente (por ejemplo, mediante reglas de sincronización PowerSync o manifiestos de permiso Zero):
- El cliente abre una secuencia de sincronización con credenciales de sesión autenticadas, como un JWT verificado.
- El motor de replicación evalúa las políticas RLS o reglas de sincronización antes de transmitir los registros.
- Sólo las filas autorizadas llegan a la base de datos del cliente, manteniendo datos no autorizados fuera del dispositivo completamente.
Evolución del esquema y deriva multi-versión
En las aplicaciones web estándar, las actualizaciones de primera línea y las migraciones de bases de datos se implementan en bloqueo, y los clientes adoptan el nuevo esquema en recarga.
En los primeros sistemas locales, los usuarios pueden mantener las pestañas abiertas durante días o trabajar fuera de línea durante semanas mientras se producen migraciones de backend. Si un cliente intenta sincronizar mutaciones basadas en un esquema anticuado a un backend modificado, la replicación ingenua fallará.
El manejo de la deriva del esquema requiere fiablemente tres patrones:
1. Migraciones de servidores adicionales
Las bases de datos centrales autorizadas mantienen compatibilidad atrasada. Las columnas no son renombradas o abandonadas sin un período de deprecación gradual.
2. Gestión de la migración del lado del cliente
En el inicio, la instancia local SQLite o PGlite ejecuta scripts de migración locales en secuencia antes de iniciar el motor de sincronización.
3. Transformación bidireccional a través de lentes de esquema
Para la deriva multi-versión, las arquitecturas se basan en la investigación de Ink & Switch's Proyecto Cambria. Los objetivos de Schema definen transformaciones bidireccionales entre versiones de esquema:
Server Schema v5 <---> [Lens v4-v5] <---> [Lens v3-v4] <---> Client Schema v3
Estos lentes traducen operaciones de lectura y escritura entre modelos de clientes antiguos (como Schema v3) y el modelo de backend (como Schema v5) sin dañar datos concurrentes.
Aplicación de los sistemas locales
Mover a una arquitectura local-primera cambia fundamentalmente cómo las aplicaciones manejan el estado, la replicación y la gobernanza de datos. Ofrece tiempos de respuesta instantáneos y mantiene los flujos de trabajo críticos operativos independientemente de la volatilidad de la red.
At Lidex, diseñamos y modernizamos el software empresarial donde las perturbaciones de la red no pueden comprometer las operaciones, aprovechando los tiempos de funcionamiento de WASM, la persistencia de OPFS y los motores de sincronización con servidores para crear aplicaciones fiables y de alto rendimiento.
