Seguimiento familiar sencillo, privado y pensado para Android.
Lumo es una aplicación de seguimiento familiar con tres experiencias: controlador, controlado y debug local. El diseño está pensado para que una persona mayor pueda consultar una ubicación, recibir avisos de llegada y pedir ayuda sin navegar por menús complejos.
Lumo no sustituye a los servicios de emergencia ni a un sistema médico. La disponibilidad de ubicación en segundo plano depende de Android, de los permisos concedidos, de la batería y de las políticas de ahorro de energía del fabricante.
- Emparejamiento mediante QR de un solo uso y PIN de seis cifras.
- Reemplazo autorizado del teléfono controlado mediante QR, conservando su organización.
- Varios controladores para un controlado; los permisos se validan en el servidor.
- Ubicación en segundo plano, cola cifrada offline y reintentos acotados.
- Lugares habituales con geocercas, dirección, colores e iconos configurables.
- Avisos de llegada, tiempo de trayecto, última actividad y solicitud de ayuda.
- Alarma de ayuda en el controlador, con deslizador para detenerla, llamada y localización.
- Caché local cifrada para mostrar la última información disponible sin inventar datos nuevos.
- Modo debug aislado para probar ubicaciones, permisos, batería y notificaciones sin tocar un grupo remoto.
flowchart LR
subgraph ANDROID["APK Lumo · Android"]
UI["React + Emotion<br/>Controlador · Controlado · Debug<br/>mobile/"]
TAURI["Tauri + comandos Rust<br/>Autorización y estado<br/>mobile/src-tauri/"]
NATIVE["Plugin Kotlin<br/>Ubicación · Geocercas · Notificaciones · Keystore<br/>plugins/tauri-plugin-lumo-mobile/"]
UI <-->|"comandos y eventos"| TAURI
TAURI <-->|"puente móvil"| NATIVE
end
subgraph RUST["Workspace Rust compartido"]
CORE["Dominio y reglas<br/>PIN · Roles · Geocercas · Eventos<br/>crates/lumo-core/"]
PROTOCOL["Protocolo v2<br/>Credenciales · Firmas · Sobres cifrados<br/>crates/lumo-protocol/"]
RUNTIME["Runtime del cliente<br/>Caché cifrada · HTTPS · Emparejamiento<br/>crates/lumo-runtime/"]
CORE --> PROTOCOL
CORE --> RUNTIME
PROTOCOL --> RUNTIME
end
subgraph SERVER["VPS · Docker"]
API["API Axum<br/>Autorización · Cuotas · Replay protection<br/>crates/lumo-api/"]
DB[("SQLite<br/>Estado cifrado y retención limitada")]
API <--> DB
end
TAURI --> CORE
TAURI --> PROTOCOL
TAURI --> RUNTIME
RUNTIME <-->|"HTTPS + mensajes cifrados"| API
API --> CORE
API --> PROTOCOL
classDef mobile fill:#f3edff,stroke:#7650b3,color:#2f2938,stroke-width:1.5px;
classDef rust fill:#fff4e8,stroke:#c8752d,color:#382d25,stroke-width:1.5px;
classDef server fill:#eaf7f1,stroke:#3d8a70,color:#24362f,stroke-width:1.5px;
class UI,TAURI,NATIVE mobile;
class CORE,PROTOCOL,RUNTIME rust;
class API,DB server;
El frontend sólo presenta snapshots. La autoridad para grupos, roles, PIN, invitaciones y estado remoto está en Rust y en la API. Un dispositivo controlado nunca recibe la clave del estado canónico del controlador: envía operaciones tipadas y cifradas.
Consulta las decisiones de arquitectura y recuperación y la auditoría de v2.0.0 para conocer las garantías, pruebas y límites de esta versión.
- HTTPS obligatorio; se rechaza tráfico cleartext en Android.
- Credenciales aleatorias por dispositivo, revocables y almacenadas cifradas.
- PIN protegido con Argon2id y bloqueo por dispositivo, no como secreto del QR.
- QR sin nombres, teléfonos ni PIN; las invitaciones caducan y sólo se consumen una vez.
- Estado del controlador cifrado con XChaCha20-Poly1305 y claves de miembro separadas.
- La clave maestra del servidor sólo vive en el VPS y nunca se compila en el APK.
- Backups Android desactivados para datos de seguimiento y credenciales.
- SQLite está pensado para una instancia del servicio; el proxy y el firewall deben limitar el acceso al puerto interno.
La API conserva el último estado cifrado y aplica límites de tamaño, cuota, expiración, CAS, ETag y protección contra replay. La retención de actividad de 24 horas es lógica de la aplicación; no es un sistema de archivado histórico ilimitado.
- Windows, Linux o macOS.
- Rust estable compatible con
rust-toolchain.toml. - Bun 1.3.14 o posterior.
- JDK 17, Android SDK/NDK y Gradle para generar APK.
- Docker Engine y Docker Compose 2.24.4 o posterior sólo para la API.
Frontend:
cd mobile
bun install --frozen-lockfile
bun run devBackend local y binarios de prueba:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\verify-local-backend.ps1./scripts/verify-local-backend.shEl gate comprueba formato, compilación, Clippy sin avisos, pruebas, builds y los self-test de lumo-controller, lumo-controlled y lumo-debug usando transporte local. No necesita una API pública.
En el cliente sólo se declara el origen HTTPS de la API:
LUMO_RUNTIME_MODE=remote
LUMO_API_URL=https://api.example.comLa clave maestra, certificados y límites del servidor se configuran únicamente en .env del VPS. Consulta docs/backend-local.md para el contrato y docs/deploy.md para Docker, Nginx, Cloudflare, backups y rollback. No subas .env, certificados ni keystores al repositorio.
Para desarrollo:
cd mobile
bun run tauri android devLa release pública se publica en GitHub Releases únicamente como código fuente verificable. No se distribuyen APK precompilados desde este repositorio para evitar que una compilación pueda incorporar un endpoint privado o una configuración local.
Si generas tu propio APK, declara sólo LUMO_RUNTIME_MODE=remote y el origen HTTPS público en LUMO_API_URL. Nunca proporciones al proceso de compilación la clave maestra del servidor, tokens de dispositivo, PIN, certificados, keystores ni el archivo .env de producción completo.
GitHub Actions ejecuta formato, ESLint, tipos, pruebas y build del frontend; el gate completo de Rust; compilación, pruebas y lint Android; pruebas del contenedor con TLS; auditoría de dependencias y detección de secretos. Los APK temporales de CI no se publican como artefactos. Dependabot propone actualizaciones semanalmente; los saltos mayores requieren revisar sus cambios de API y validar los jobs.
La corrección local de GLib conserva la API que necesita GTK3 y verifica su procedencia y regresiones en modo optimizado. Los avisos de mantenimiento de dependencias transitivas se detallan en la auditoría; no se silencian con una lista de excepciones.
Lumo se distribuye bajo los términos de LICENSE.

