Funciona sin señal
Crear, editar, buscar y adjuntar archivos sigue disponible incluso en modo avión.
Android · Offline-first
Un caso de estudio de arquitectura offline-first: cómo una app escribe, cifra y consulta localmente, y luego hace converger varios dispositivos sin bloquear al usuario.
La interfaz siempre consulta la base local. La red llega después.
Probar el flujo entre dos dispositivos...
El problema
Muchas aplicaciones móviles dejan de ser útiles cuando la red falla. Notium invierte esa dependencia: cada acción se confirma localmente en milisegundos y la sincronización ocurre cuando es posible.
Diseñada para trabajo de campo, movilidad y conexiones inestables.
Capacidades
Crear, editar, buscar y adjuntar archivos sigue disponible incluso en modo avión.
SQLCipher protege la base local y Android Keystore resguarda las credenciales.
Push, pull, reintentos e idempotencia mantienen cada dispositivo al día.
Last-Write-Wins resuelve cambios simultáneos sin borrar la trazabilidad del valor descartado.
Arquitectura
La base cifrada es la única fuente de verdad para la interfaz. Un coordinador independiente mueve cambios entre el dispositivo y el servidor sin bloquear al usuario.
Respuesta inmediataLa UI nunca espera una petición HTTP para guardar.
ConvergenciaWorkManager sincroniza al recuperar conectividad.
Conflictos visiblesLas decisiones LWW quedan en el historial.
Dentro del cliente
Cada capa tiene una sola responsabilidad. Así es posible probar la lógica sin emulador y sustituir infraestructura sin reescribir la UI.
Renderizan el estado y convierten gestos en intenciones.
Coordina el estado de presentación e inyecta dependencias.
Define las operaciones del dominio y oculta de dónde vienen los datos.
Es la fuente única de verdad; sus streams actualizan la pantalla.
Lee la cola pendiente y usa Dio solo cuando existe conectividad.
Ciclo de sincronización
Los estados son explícitos. Si algo falla, la nota permanece local y el usuario conserva el control.
Drift guarda el contenido, genera un UUID y marca la operación como PENDING.
WorkManager agrupa pendientes. La clave (uuid, version) permite reintentar sin duplicar.
El servidor compara versiones y updated_at; responde por cada operación.
El cliente descarga cambios posteriores al último timestamp y actualiza su base local.
Máquina de estados
La sincronización no es un indicador global ambiguo: cada nota conserva su propio estado y puede recuperarse de manera independiente.
PENDINGEl cambio ya está guardado localmente y espera conectividad.
SYNCEDEl servidor confirmó la operación y devolvió su versión autoritativa.
CONFLICTDos dispositivos editaron el mismo registro y el servidor debe resolver.
ERRORLa validación falló; el dato local permanece disponible para corregirlo.
Gana la escritura con el updated_at más reciente. La versión descartada no desaparece silenciosamente: se registra en HISTORIAL_CAMBIO para auditoría.
Notium crea un tombstone con is_deleted = true. Solo se purga cuando el servidor confirma su propagación, evitando que otro dispositivo “resucite” la nota.
Tecnología
El stack no se eligió por popularidad. Cada pieza responde a una restricción: trabajar sin red, proteger datos locales, reintentar sin duplicar y ser mantenible por un solo desarrollador.
Leer decisiones de arquitectura ↗Un solo código base entrega Android hoy y deja abierta la evolución a iOS, web y escritorio.
Evita mantener implementaciones nativas separadas con un equipo de una persona.Conecta streams de la base local con la interfaz mediante estado reactivo, tipado y fácil de probar.
Menos boilerplate que BLoC y mejor separación de responsabilidades que GetX.SQLite relacional, consultas validadas, migraciones y streams; SQLCipher cifra toda la base en reposo.
Se eligió sobre almacenes NoSQL porque notas, adjuntos e historial tienen relaciones reales.Programa sincronizaciones con restricción de red y sobrevive al cierre del proceso Android.
Un timer o servicio en foreground consumiría más batería y dependería de que la app siga abierta.Interceptores JWT, reintentos, cancelación, cargas multipart y control explícito del protocolo push/pull.
Mantiene el cliente HTTP pequeño sin añadir generación de código innecesaria.Una API liviana concentra autenticación, idempotencia y resolución de conflictos.
Menor costo operativo que un framework pesado para el volumen y alcance actuales.Replica el modelo relacional del cliente y consolida versiones, historial y operaciones procesadas.
Docker hace reproducible el despliegue de API y base de datos en el VPS.Seguridad y operación
Offline-first coloca más datos en el dispositivo. Por eso la seguridad no puede depender únicamente del servidor.
La base SQLite completa permanece cifrada. La pérdida física del teléfono no expone directamente las notas.
Access y refresh tokens viven en almacenamiento seguro; la expiración puede validarse localmente durante una desconexión.
Push, pull, autenticación y adjuntos viajan cifrados. La API valida que cada entidad pertenezca al usuario autenticado.
Frontend, API y PostgreSQL se despliegan de forma reproducible; el estado de la API puede comprobarse públicamente.
La base local da disponibilidad. El historial da trazabilidad. La idempotencia permite reintentar. El servidor hace converger dispositivos.
Código abierto
Explora el código, las pruebas, el contrato OpenAPI y las decisiones detrás de Notium.