Releases: Osvaldo-Net/Lince
Release list
v4.0.3
What's Changed (Maintenance release)
- Update pip requirement from >=26.2 to >=26.2.1 by @dependabot[bot] in #5
- Bump python from 3.14.6-alpine3.24 to 3.14.7-alpine3.24 by @dependabot[bot] in #4
¿Qué cambió? (Mantenimiento de dependencias)
- Se actualizó el requisito de pip de >=26.2 a >=26.2.1 por @dependabot[bot] en #5
- Se actualizó la imagen de Python de 3.14.6-alpine3.24 a 3.14.7-alpine3.24 por @dependabot[bot] en #4
Full Changelog: v4.0.2...v4.0.3
v4.0.2
What's Changed
- Minor improvements to the web interface.
- Update pip requirement from >=26.1.2 to >=26.2 by @dependabot[bot] in #2
Cambios en esta versión
- Algunas mejoras menores en la interfaz web.
- Se actualiza el requisito de pip de >=26.1.2 a >=26.2 por @dependabot[bot] en #2
New Contributors
- @dependabot[bot] made their first contribution in #2
Full Changelog: v4.0.1...v4.0.2
v4.0.1
What changed?
- Replaced the static default admin account with a randomly generated password shown once in the container logs on first startup
- Default admin username changed to lince@admin.com
- Forces password change on first login
- Added rate limiting to /api/scan and /api/puertos to prevent abuse
- Split database schema setup (init_db.py) from admin account creation (auth.py) for clarity
¿Qué cambió?
- Se reemplazó la cuenta admin estática por una contraseña generada aleatoriamente, mostrada una sola vez en los logs del contenedor en el primer arranque
- El usuario admin por defecto cambió a lince@admin.com
- Se fuerza el cambio de contraseña en el primer inicio de sesión
- Se agregó rate limiting a /api/scan y /api/puertos para evitar abuso
- Se separó la creación del esquema de la base de datos (init_db.py) de la creación del usuario admin (auth.py) para mayor claridad
Full Changelog: v4.0...v4.0.1
v4.0
¿Qué cambió?
Cambio de nombre: LANGuard → Lince, debido a la cantidad de aplicaciones encontradas con el mismo nombre.
Nuevo ícono de la app.
Rediseño de la interfaz web.
** IMPORTANTE:** Cambio de imagen de Docker. Actualiza tu docker-compose.yml:
- image: netosvaltools/languard:latest
+ image: netosvaltools/lince:latestA partir de este release, la imagen netosvaltools/languard dejará de funcionar/actualizarse. Debes migrar a netosvaltools/lince.
Nuevo soporte de SSO vía OIDC, con nuevas variables de entorno. Consulta la sección OIDC en el README para configurarlo.
Los mensajes de Telegram ahora se envían en el idioma seleccionado en la interfaz gráfica.
Actualización de dependencias:
pip25.4 → 26.1.2Werkzeug3.1.6 → 3.1.8
What changed?
Renamed: LANGuard → Lince, due to the number of other apps found with the same name.
New app icon.
Web interface redesign.
IMPORTANT: Docker image changed. Update your docker-compose.yml:
- image: netosvaltools/languard:latest
+ image: netosvaltools/lince:latestStarting from this release, the netosvaltools/languard image will stop working/receiving updates. You must migrate to netosvaltools/lince.
New SSO support via OIDC, with new environment variables. See the OIDC section in the README for setup details.
Telegram messages are now sent in the language selected in the web UI.
Dependency updates:
pip25.4 → 26.1.2Werkzeug3.1.6 → 3.1.8
Full Changelog: v.3.1.4...v4.0
v.3.1.4
¿Qué cambió?
- Imagen base de Python actualizada a 3.14.6-alpine3.24
- index.html segmentado en partials Jinja2 (_sidebar, _topbar, _stats, _device_table, _panel_historial, _panel_confiables, _panel_perfil, _modal_config, _modal_puertos) para facilitar el mantenimiento
- Sistema de traducciones migrado de un objeto JS monolítico a archivos JSON cargados por fetch
- Francés (fr) añadido como tercer idioma disponible
- Tarjetas de estadísticas rediseñadas.
- Páginas de login y cambio de credenciales modernizadas.
- Modal de configuración modernizado.
- Sidebar mejorado.
What changed?
- Updated Python base image to 3.14.6-alpine3.24
- index.html split into Jinja2 partials (_sidebar, _topbar, _stats, _device_table, _panel_historial, _panel_confiables, _panel_perfil, _modal_config, _modal_puertos) for easier maintenance
- Translation system migrated from a monolithic JS object to JSON files loaded via fetch
- French (fr) added as a third supported language
- Stat cards redesigned.
- Login and change-credentials pages modernized: organic background shapes, cleaner card layout
- Config modal modernized.
- Sidebar improved.
Full Changelog: v3.1.3...v.3.1.4
v3.1.3
What changed?
- Added flask-wtf, flask-limiter, and flask-talisman to the Dockerfile.
- Mandatory SECRET_KEY: The application now explicitly fails at startup if SECRET_KEY is not defined as an environment variable. The insecure default value (lan_guard_secret) was removed.
- Rate limiting on /login: IP-based login attempt limiting was implemented using Flask-Limiter.
- Global CSRF protection: Flask-WTF now protects all POST endpoints.
- MAC address validation: All endpoints receiving MAC addresses (/api/add, /api/delete, /api/name) now validate the format using regular expressions before interacting with the database.
- Device name length limit: Device names are now limited to 64 characters in both backend and frontend.
- Log rotation: FileHandler was replaced with RotatingFileHandler to prevent excessive disk usage.
- HTTP security headers: Additional HTTP security headers were applied.
- nmap timeout handling: scan_network() now catches subprocess.TimeoutExpired and safely returns an empty list without breaking the background thread.
- Telegram environment variable priority: Telegram environment variables are now prioritized before querying the database.
- panel.js refactor: All POST fetch() requests were migrated to postJSON(), automatically adding the X-CSRFToken header.
- Responsive improvements: Mobile display and usability were optimized.
¿Qué cambió?
- Se agregaron flask-wtf, flask-limiter y flask-talisman al Dockerfile.
- SECRET_KEY obligatoria: La aplicación ahora falla explícitamente al iniciar si SECRET_KEY no está definida como variable de entorno. Se eliminó el valor por defecto inseguro (lan_guard_secret).
- Rate limiting en /login: Se implementó limitación de intentos por IP usando Flask-Limiter.
- Protección CSRF global: Flask-WTF ahora protege todos los endpoints POST.
- Validación de direcciones MAC: Todos los endpoints que reciben MACs (/api/agregar, /api/eliminar, /api/nombrar) validan el formato usando expresiones regulares antes de interactuar con la base de datos.
- Límite de longitud en nombres: Los nombres de dispositivos ahora están limitados a 64 caracteres tanto en backend como en frontend.
- Logs con rotación: Se reemplazó FileHandler por RotatingFileHandler para evitar consumo excesivo de disco.
- Encabezados HTTP de seguridad: Se aplicaron encabezados HTTP de seguridad adicionales.
- Manejo de timeout en nmap: escanear_red() ahora captura subprocess.TimeoutExpired y devuelve una lista vacía sin romper el hilo de background.
- Prioridad de variables de entorno de Telegram: Ahora se prioriza la lectura de las variables de entorno para Telegram antes de consultar la base de datos.
- Refactor en panel.js: Todos los fetch() POST fueron migrados a postJSON(), agregando automáticamente el header X-CSRFToken.
- Mejoras responsive: Se optimizó la visualización y experiencia de uso en dispositivos móviles.
Full Changelog: v3.1.2...v3.1.3
v3.1.2
What changed?
- Upgraded Python runtime to version 3.14.4
¿Qué cambió?
- Se realizó upgrade del runtime de Python a la versión 3.14.4
Full Changelog: v3.1.1...v3.1.2
v3.1.1
¿Qué cambió?
- Se corrigió una vulnerabilidad XSS en el panel: nombres de dispositivos, MACs, IPs y fabricantes provenientes de la red se escapan ahora correctamente antes de insertarse en el HTML. Los íconos de requisitos de contraseña también fueron refactorizados para evitar la reinterpretación de texto del DOM.
- Los errores internos de Python ya no se exponen al cliente. Los endpoints /api/puertos y /api/telegram/test ahora devuelven mensajes genéricos; el error real solo se registra en el servidor.
What changed?
- Fixed DOM XSS across the panel: device names, MACs, IPs, and vendor strings from the network are now HTML-escaped before being injected into innerHTML. Password requirement icons were refactored to avoid reinterpreting DOM text as markup.
- Internal Python exceptions are no longer leaked to clients. /api/puertos and /api/telegram/test now return generic error messages; the real error is logged server-side only.
Full Changelog: v3.1.0...v3.1.1
v3.1.0
¿Qué cambió?
- Rediseño de la interfaz gráfica
Se actualizó el diseño de las vistas de login, inicio y cambio de contraseña utilizando una combinación en blanco y negro, logrando una apariencia más moderna y minimalista. - Renombrar dispositivos confiables
Ahora es posible editar los nombres personalizados a los dispositivos confiables. - Mejoras en el panel lateral
Se añadieron nuevas secciones en el panel lateral, incluyendo historial de actividad y perfil de usuario. - Nombre de usuario personalizable
Ahora puedes agregar un nombre visible a tu usuario. - Tarjetas informativas en el dashboard
Se incorporaron tarjetas que muestran el total de dispositivos, así como la cantidad de dispositivos confiables y no confiables.
What changed?
- UI redesign
The login, home, and password change views were redesigned using a black and white style for a cleaner and more modern look. - Rename trusted devices
You can now edit the names to trusted devices. - Sidebar improvements
New sections were added, including activity history and user profile. - Custom username
You can now set a display name for your account. - Dashboard cards
New cards display total devices, trusted devices, and untrusted devices.
Full Changelog: v3.0.3...v3.1.0
v3.0.2
¿Qué cambió?
- Base cambiada a Alpine — menos paquetes, menos CVEs, imagen más liviana (~80MB vs ~150MB)
apk upgrade— parchea el sistema al buildear- Eliminado
net-tools— tenía CVE-2025-46836 (6.6), reemplazado poriproute2 - Versiones mínimas de pip — evita flask/werkzeug con CVEs conocidos
What changed?
- Base changed to Alpine — fewer packages, fewer CVEs, lighter image (~80MB vs ~150MB)
apk upgrade— patches the system on build- Removed
net-tools— had CVE-2025-46836 (6.6), replaced byiproute2 - pip minimum versions — avoids flask/werkzeug with known CVEs
Full Changelog: v3.0.1...v3.0.3