Skip to content

Releases: OksigeniaSL/oksigenia-sos

🛠️ Oksigenia SOS v4.1.1 — Reproducible Build hot-fix

01 May 18:00

Choose a tag to compare

v4.1.0 feature set, now bit-for-bit reproducible.


What changed vs v4.1.0

Nothing in app behaviour. Smart Beacon, the Equitation profile and the three new languages (Polish, Russian, Norwegian Bokmål) all behave identically.

The only change is in the GitHub Actions release workflow: a new step strips the build-id embedded by the linker into libdartjni.so (transitive jni dependency). Without this, each build produced a slightly different shared library, so the APK was not bit-for-bit reproducible and IzzyOnDroid could not certify it as RB-verified.

Reported by IzzySoft in Issue #6.

Workflow patch

- name: Patch jni for Reproducible Builds
  run: sed -i -e 's/-Wl,/-Wl,--build-id=none,/' $HOME/.pub-cache/hosted/*/jni-*/src/CMakeLists.txt

The patch runs after flutter pub get (so jni is already in the pub cache) and before flutter build apk (so the patched CMakeLists drives the actual build).


v4.1.0 features (carried forward)

📡 Smart Beacon — Post-SOS Position Updates

After an SOS SMS is sent (auto by Smart Sentinel or manual via the SOS button), Sylvia watches the user's GPS position. If the user moves >300 m from the last reference point, an SMS update is sent with the new coordinates.

  • Throttled: one SMS every 5 minutes
  • Capped: 20 updates over a 4-hour window
  • Battery cost while stationary: zero (no SMS sent until movement)
  • Stops automatically when the user taps "Restart system"

Solves the real outdoor problem of rescuers arriving 2–4 hours later to a victim who has wandered hundreds of meters from the original incident point.

🐴 Equitation Profile

Seventh activity profile, for horse riding. Impact detection is disabled by design — horse cadence (trot ~1.5 Hz, canter 2–3 Hz) interferes with the human-walk detector. Inactivity Monitor and manual SOS remain active. GPS interval 15 s / 20 m.

🌍 Three new languages

  • 🇵🇱 Polish (pl)
  • 🇷🇺 Russian (ru)
  • 🇳🇴 Norwegian Bokmål (nb)

Now 11 languages total.


⚙️ Technical

  • Flutter 3.38.7 (exact)
  • JDK 17 (Zulu)
  • Android target SDK 35
  • No Google Play Services / GMS
  • Split APKs: arm64-v8a, armeabi-v7a
  • Zero new dependencies vs v4.1.0
  • Zero new permissions vs v4.1.0

Distributed via IzzyOnDroid. Reproducible Builds compatible.

📍 Oksigenia SOS v4.1.0 — Smart Beacon

01 May 17:48

Choose a tag to compare

Post-SOS tracking. Three new languages. One new sport.


📡 Smart Beacon — Post-SOS Position Updates

The flagship feature of v4.1.0. Solves a real outdoor rescue problem: the victim may not stay where the SOS was triggered.

Real scenarios:

  • A hiker breaks a leg, sends SOS, gets disoriented and walks the wrong direction
  • A trail runner crashes, recovers dazed, tries to descend before night falls
  • A climber falls, sends SOS, then is carried by partners towards a rescue point

In all cases, the SMS the rescue team receives points to the incident location, not the victim's current location. By the time rescuers arrive 2–4 hours later, the victim may be hundreds of meters away.

How Smart Beacon works

After an SOS SMS is sent (auto by Smart Sentinel or manual via the SOS button), Sylvia:

  1. Stores the origin position and timestamp.
  2. Polls GPS every 5 seconds (battery-friendly — uses the same passive subscription as Live Tracking).
  3. If the user moves >300 m from the last reference point, sends an SMS update with the new coordinates.
  4. Throttled: one SMS every 5 minutes max (no spam on bursty movement).
  5. Capped: 20 updates over a 4-hour window (covers typical rescue timelines).
  6. Stops automatically when the user taps "Restart system" on the sent screen.

Battery cost

Essentially zero while stationary. The 5-second poll uses the same GPS stream that's already running for the active profile. SMS is only sent when movement is detected, so a victim who stays put consumes nothing extra.

SMS format

📍 OKSIGENIA UPDATE — moved 420m
Maps: https://maps.google.com/?q=lat,lon
OSM: https://www.openstreetmap.org/?mlat=...

Resolves the request from the team's tracking discussion: voluntary Live Tracking + automatic post-SOS Smart Beacon now coexist as complementary modes.


🐴 Equitation Profile

Seventh activity profile, for horse riding.

Impact detection is disabled by design — horse cadence (trot ~1.5 Hz, canter 2–3 Hz) interferes with the human-walk detector that powers Smart Sentinel. Without empirical phone-in-pocket-while-riding data, defaulting to "off" is the honest call rather than shipping unvalidated thresholds.

In flight: Inactivity Monitor + manual SOS protect the rider. Default GPS interval is 15 s / 20 m (similar to Kayak — moderate movement on terrain).

Same approach as the Paragliding and Kayak profiles. The full profile table is now:

Profile Impact Yellow Orange-direct GPS
🥾 Trekking 6G 10G 30 s / 30 m
🚵 Trail / MTB 8G 13G 5 s / 10 m
🧗 Mountaineering 6G 10G 30 s / 30 m
🪂 Paragliding 2 s / 5 m
🛶 Kayak 15 s / 20 m
🐴 Equitation 15 s / 20 m
👷 Professional 6G 10G 5 s / 10 m

🌍 Three new languages

The app now supports 11 languages.

  • 🇵🇱 Polish (pl) — Tatra and Beskid hiking culture, active F-Droid community
  • 🇷🇺 Russian (ru) — Caucasus, Altai, Urals, Kamchatka outdoor culture
  • 🇳🇴 Norwegian Bokmål (nb) — friluftsliv, the cradle of outdoor lifestyle

Translations cover all UI strings and SMS templates. Quality is reasonable but not native-validated — community feedback welcome via GitHub Issues for any phrasing improvements.


⚙️ Technical

  • Flutter 3.38.7 (exact, for Reproducible Builds)
  • JDK 17 (Zulu)
  • Android target SDK 35
  • No Google Play Services / GMS
  • Split APKs: arm64-v8a, armeabi-v7a
  • Zero new dependencies vs v4.0.0
  • Zero new permissions vs v4.0.0

🛡️ Permissions Required

Unchanged from v4.0.0. See README.md for the full table.


Distributed via IzzyOnDroid. Reproducible Builds compatible.

🛡️ Oksigenia SOS v4.0.0 — Smart Sentinel Complete

01 May 14:17

Choose a tag to compare

Multi-sport outdoor safety, now with home screen widgets.


🧠 Smart Sentinel v4 — Feature Complete

The fall-detection state machine and activity profile system landed in v3.9.7. v4.0.0 closes the loop with three additions:

Catastrophic Impact Path (orange-direct)

A second G-force threshold per profile fires the alarm immediately, bypassing the 60-second yellow observation window. For impacts so hard that observing for rhythmic movement would just delay the SMS unnecessarily.

Profile Yellow (observation) Orange (direct alarm)
🥾 Trekking 6G 10G
🚵 Trail / MTB 8G 13G
🧗 Mountaineering 6G 10G
🪂 Paragliding impact off impact off
🛶 Kayak impact off impact off
👷 Professional 6G 10G

Calibrated empirically on Pixel 8: a deliberate hard hit against a chair arm peaks at 10.4G — comparable to a real moderate-strong fall on a hard surface.

The 30-second pre-alert on the alarm screen remains the safety net for cancellation.

GPS Interval per Profile

Each profile now declares its own GPS sampling rate. Replaces the 5 s / 10 m hard-coded value used in v3.9.7.

Profile Interval Distance filter
🥾 Trekking 30 s 30 m
🚵 Trail / MTB 5 s 10 m
🧗 Mountaineering 30 s 30 m
🪂 Paragliding 2 s 5 m
🛶 Kayak 15 s 20 m
👷 Professional 5 s 10 m

Slow-motion sports save battery; fast-motion sports get the resolution they need. The new interval applies mid-session when the user changes the active profile.


🏠 Home Screen Widgets

Two AppWidgets, both implemented in native Kotlin — no new Flutter dependencies, no new permissions.

Panic Widget (1×1)

A red circular SOS button that lives on the home screen. Tap fires the alarm flow directly (AlarmScreen + 30 s pre-alert), even if monitoring is currently off — the foreground service is woken up if needed.

Status Widget (2×2)

A compact dashboard showing:

  • 🥾 Active profile (with emoji)
  • Sentinel state (green / yellow / orange / red colour-coded dot)
  • Active modes (fall detection, inactivity monitor with configured time, live tracking)
  • 🔋 Battery level

Updates once per minute via AlarmManager. Tap opens the app.


🛠️ Resolves Issue #3 — Paragliding False Positives

Issue #3 (@ulipo, Jan 2026) reported false positives during flight. v4.0.0 ships a Paragliding profile with impact detection disabled entirely. In flight the user is protected by the Inactivity Monitor and manual SOS. No accelerometer-based false positive is possible.

The Kayak profile follows the same logic.


⚙️ Technical

  • Flutter 3.38.7 (exact, for Reproducible Builds)
  • JDK 17 (Zulu)
  • Android target SDK 35
  • No Google Play Services / GMS
  • Split APKs: arm64-v8a, armeabi-v7a
  • Zero new dependencies vs v3.9.7
  • Zero new permissions vs v3.9.7

🛡️ Permissions Required

Unchanged from v3.9.6 / v3.9.7. See README.md for the full table.


Distributed via IzzyOnDroid. Reproducible Builds compatible.

🎯 Oksigenia SOS v3.9.7 — Smart Sentinel v4 & Activity Profiles

30 Apr 22:40

Choose a tag to compare

Pick your sport. The algorithm tunes itself.


🧠 Smart Sentinel v4 — Cadence-CV Detector

The fall-detection algorithm has been rewritten from scratch based on field telemetry from real walking sessions on Pixel 7a and Pixel 8 (running GrapheneOS, phone in pocket).

What changed

  • userAccelerometerEventStream instead of raw accelerometer — gravity is removed by the platform, so we no longer fight a 9.81 m/s² baseline.
  • Horizontal-plane cadence (√(effX² + effY²)) — vertical bobbing is filtered out, leaving the actual gait signature.
  • Z-bias EMA filter (α = 0.998) — corrects a Pixel 8 firmware quirk where the Z axis gets stuck around 197 m/s² for several seconds at a time.
  • Runtime Hz measurement — empirically the Pixel 7a delivers 58.8 Hz and the Pixel 8 delivers 49.8 Hz, not the 50 Hz the old code assumed. The frequency calculation now self-calibrates per device.
  • CV cap raised to 1.30 (from 0.85) — the wearable literature's "CV ≈ 0.4" assumption is wrong for a phone in a pocket. Median measured CV in real walking: 1.1 (range 0.81–1.71).
  • Crossing threshold raised to 1.12 m/s² (from 1.06) — sits above the noise floor of carrying the phone in hand.
  • File logger at app_flutter/sentinel.log (path_provider) for post-incident analysis. New event markers: 🚀 onStart entered, 📥 setMonitoring received, 🎯 Profile=....

Why it matters

Cancel-time on a real impact-followed-by-walking sequence dropped to 10–18 s. The old algorithm produced false alarms when carrying the phone normally; v4 doesn't.


🏃 Activity Profiles

Six presets tune Smart Sentinel sensitivity to match the sport. Pick yours from the home screen chip or the Settings screen.

Profile Impact threshold Cadence band Notes
🥾 Trekking (default) Standard Walking Balanced for general outdoor use
🚵 Trail / MTB Higher Wider Tolerates rough terrain vibration
🧗 Mountaineering Standard Slow Tuned for slow technical movement
🪂 Paragliding Disabled Free-fall is expected; impact off
🛶 Kayak Disabled Paddling motion confuses cadence
👷 Professional Sensitive Standard For lone-worker monitoring

Profiles are stored in PreferencesService and applied to the running service via setMonitoring, so changes take effect mid-session without restarting.

Color-coded chips on the home screen make the active profile visible at a glance.


🛠️ Pixel 7 / Android 14 Stability

Two background-restart bugs that affected the Pixel 7a are fixed.

Foreground service type

foregroundServiceType=location was triggering a ForegroundServiceTypeException when the WatchdogReceiver tried to restart the service from the background on Android 14+. The manifest now declares only dataSync|mediaPlayback — the runtime location permission is requested separately when needed and does not affect the FGS type contract.

setMonitoring race

On cold start, _loadSettings fired toggleInactivityMonitor and the setMonitoring event in quick succession, so the service occasionally received the second event before finishing the first. _loadSettings now awaits toggleInactivityMonitor and skips the redundant setMonitoring when the toggle handler will dispatch it itself. toggleInactivityMonitor was changed to Future<void> async to support this.


🔒 Privacy — Telephony Stack Replaced

The telephony ^0.2.0 package is unmaintained and was injecting a transitive READ_PHONE_STATE implied permission into release APKs.

Replaced with another_telephony ^0.4.1 (active fork). Verified with aapt dump permissions that the v3.9.7 release APK declares zero phone-state permissions.


⚙️ Technical

  • Flutter 3.38.7 (exact, for Reproducible Builds)
  • JDK 17 (Zulu)
  • Android target SDK 35
  • No Google Play Services / GMS
  • Split APKs: arm64-v8a and armeabi-v7a
  • New dependency: path_provider ^2.1.5 (for sentinel.log)

🛡️ Permissions Required

Unchanged from v3.9.6. See README.md for the full table.


📦 Field Validation

Validated on:

  • Pixel 7a (lynx) — GrapheneOS, 58.8 Hz accelerometer
  • Pixel 8 (shiba) — GrapheneOS, 49.8 Hz accelerometer

Both phones pass impact + walking → silent recovery. Both phones pass impact + immobility → alarm fires within the 60-second observation window.


Distributed via IzzyOnDroid. Reproducible Builds compatible.

🥾 Oksigenia SOS v3.9.6 — "The Trekking Update"

26 Apr 10:27

Choose a tag to compare

v3.9.6 — The Trekking Update

📡 Live Tracking

  • Periodic GPS SMS check-ins every 30, 60, or 120 minutes
  • Countdown timer visible in status pill and telemetry panel
  • Pause / Resume and manual "I'm OK" check-in button
  • Auto-Pause when SOS alarm fires; auto-Resume if cancelled

⏰ Doze Mode — Verified
AlarmManager.alarmClock survives 1 hour of deep sleep on GrapheneOS.
The alarm breaks through the lock screen without manual unlock.

🧭 Onboarding Overhaul

  • GrapheneOS SMS: step-by-step guide for the Android 13+ "Allow
    restricted settings" sequence sideloaded apps must follow
  • Sensor detection: automatically detects if the Sensors toggle is off
    and blocks monitoring until resolved
  • "Why permissions?" sheet: swipe up to read what each permission does
  • Language selector: change language directly from the onboarding screen

🔒 Privacy
Removed implicit READ_PHONE_STATE permission from transitive dependency.

Thanks to @IzzySoft for the review in #5.

🏔️ Oksigenia SOS v3.9.5 — "Immortal Sentinel"

25 Apr 14:02

Choose a tag to compare

The alarm now breaks through the lock screen. The Sentinel never dies.


🔔 Alarm Over Lock Screen

The most critical UX fix in the app's history.

  • Before: When a fall was detected with the screen locked, the alarm played audio but the screen stayed locked. The user had to unlock with PIN/pattern before cancelling — nearly impossible with cold hands or gloves.
  • After: The alarm appears directly on top of the lock screen using Android's fullScreenIntent. The Cancel button is fully interactive without unlocking. The screen turns on automatically.
  • Bonus fix: The app no longer shows a frozen, non-interactive screenshot when the screen locks during normal use. Lock screen behavior is now completely normal outside of alarm mode.

🔋 Battery Optimization — Now a Hard Gate

  • Monitoring (fall detection / inactivity) cannot be activated unless battery optimization is disabled for Oksigenia SOS.
  • This is not a warning. It is a block. A single tap on the battery icon opens the correct system setting.
  • Why this matters: Without Unrestricted battery mode, Android's Doze can kill the Sentinel after a few hours of inactivity — exactly when you need it most.

🧠 Smart Sentinel — Critical Fixes

  • Re-arm after cancel: The Sentinel now re-arms correctly after the user cancels an alarm. Previously, a stale sensor buffer caused every subsequent impact to be classified as a false positive.
  • Alarm loop fixed: The alarm sound now plays in a continuous loop for the full 30-second countdown. Previously it played once and went silent.
  • Zombie timer guard: The auto-send countdown no longer aborts on the first tick when triggered by Smart Sentinel or inactivity (was a race condition with _isAlarmActive flag).

🔧 Other Fixes

  • Notification icon corrected at all screen densities (was a white rectangle, now shows the proper app silhouette).
  • Sylvia's persistent notification now appears in the notification drawer on strict Android (GrapheneOS). Was being placed in the silent/hidden group due to incorrect channel importance.
  • updateNotification now uses the correct icon across all notification states.
  • sleepScreen is called when the user cancels an alarm, properly restoring normal lock screen behavior.

⚙️ Technical

  • Flutter 3.38.7 (exact, for Reproducible Builds)
  • Android target SDK 35
  • Reproducible Builds compatible (IzzyOnDroid verified)
  • No Google Play Services / GMS
  • Split APKs: arm64-v8a and armeabi-v7a

🛡️ Permissions Required

Permission Purpose Required to monitor?
SMS Send emergency alerts ✅ Yes
Location Include GPS in SMS ✅ Yes
Battery Optimization (Unrestricted) Keep Sentinel alive in deep sleep ✅ Yes
Full-Screen Notifications (Android 14+) Alarm appears over lock screen ✅ Yes
Notifications Show Sentinel status bar Recommended
Activity Recognition Sensor access Recommended

Named in honor of Sylvia van Os (@TheLastProject), IzzyOnDroid maintainer, whose early device testing and detailed feedback made this app possible.

v3.9.5-rc2

08 Feb 15:20

Choose a tag to compare

v3.9.5-rc2 Pre-release
Pre-release
v3.9.5 Release Candidate 2 - Persistencia mejorada

v3.9.4: Advanced Dashboard 🏔️

07 Feb 09:31

Choose a tag to compare

This update introduces a professional telemetry dashboard and modernizes the app's visual integration with Android.

🌟 New Features

📊 Advanced Dashboard

  • Live Telemetry Footer: Real-time monitoring of G-Force (3D Vector), Battery Voltage, and GPS Accuracy.
  • Safety Header: "Traffic Light" system for permissions. Instantly visualizes if SMS, Sensors, or Notifications are blocked.
  • Sorted Languages: Language selector is now sorted alphabetically by native name.

🎨 Visuals

  • Themed Icons: Added support for Android 13+ monochrome/themed icons (Material You).

⚙️ Logic & Improvements

  • Vector Physics: Fall detection now calculates the 3D Vector Magnitude ($\sqrt{x^2+y^2+z^2}$) to filter out noise from running or jumping.
  • Secure Links: Emergency SMS location links now strictly use https protocol.
  • Dying Gasp Format: Fixed text formatting in low-battery emergency SMS to ensure links are clickable.

⚠️ Known Behaviors

  • Service Persistence: The background service is now more resilient but may persist after closing the app in some Android versions. This is a known step towards a fully persistent security service in v3.9.5.

v3.9.3 - The Granite Update

04 Feb 22:20

Choose a tag to compare

🏔️ Oksigenia SOS v3.9.3: Granite Stability

[EN] The Definitive Stable Release.
EN] This version establishes the Granite Foundation of the 3.9 cycle. It locks down core stability to prepare for upcoming visual features.

[ES] Versión Estable Definitiva.
Esta versión establece los Cimientos de Granito del ciclo 3.9. Asegura la estabilidad del núcleo para preparar las futuras novedades visuales.


🛡️ 1. GRANITE CORE (System Integrity)

[EN] We rewrote the background service lifecycle from scratch.

  • Zero Zombies: The app closes cleanly, leaving no ghost processes draining battery.
  • Emergency Shielding: Countdown timers and sensors are now immune to UI restarts. If you turn off the screen or switch apps during an alarm, the clock keeps ticking.
  • Smart Passive GPS: Optimized triangulation that respects battery life but wakes up instantly in an emergency.

[ES] Hemos reescrito el ciclo de vida del servicio desde cero.

  • Cero Zombies: La app se cierra limpiamente, sin procesos fantasma.
  • Blindaje de Emergencia: Los temporizadores son inmunes a reinicios de la interfaz. Si apagas la pantalla durante una alarma, el reloj sigue bajando.
  • GPS Pasivo Inteligente: Triangulación optimizada que respeta la batería.

🧤 2. EXTREME UX ("Fat Finger Design")

[EN] Designed for stress, gloves, and frozen fingers.

  • Tactical Mode (Dark Only): Enforced dark interface to preserve night vision and reduce AMOLED battery consumption.
  • Haptic Language: The app "talks" to you through vibration. You'll know if a button is pressed or contacts are missing without looking.
  • Visual Polish: Fixed "Sent Screen" design (now Dark Mode compliant) and translated all system messages.

[ES] Diseñada para estrés, guantes y dedos fríos.

  • Modo Táctico (Solo Oscuro): Interfaz oscura forzada para preservar visión nocturna y batería.
  • Lenguaje Háptico: La app te "habla" vibrando. Sabrás lo que pasa sin mirar.
  • Pulido Visual: Arreglada la pantalla de "Enviado" (ahora en Modo Oscuro) y traducidos todos los mensajes del sistema.

📐 3. MATHEMATICAL PRECISION

[EN]

  • 3D Vector Calculation: Replaced simple detection with 3D G-Force Vector math.
  • Noise Filter: The algorithm now distinguishes between jogging/jumping and a real hard impact (>12G), eliminating "backpack bounce" false alarms.

[ES]

  • Cálculo Vectorial 3D: Sustituida la detección simple por matemáticas de Vector de Fuerza G.
  • Filtro de Ruido: El algoritmo distingue entre correr/saltar y un impacto real (>12G), eliminando falsas alarmas por "rebote de mochila".

🌍 4. GLOBAL REACH

  • 8 Native Languages: Full support for EN, ES, FR, DE, IT, PT, NL, SV.
  • Contextual Help: Technical explanations for SMS/GPS permissions in your local language.

📦 UPDATE INSTRUCTIONS / INSTRUCCIONES

[EN] Highly recommended for all users. This update fixes critical background service reliability issues.
[ES] Actualización muy recomendada. Soluciona problemas críticos de fiabilidad en segundo plano.

Respira > Inspira > Crece;

v3.9.2 - Stability & Integration / Estabilidad e Integración

02 Feb 22:35

Choose a tag to compare

🏔️ v3.9.2: The "Monochrome" Update

This release focuses on system stability, sensor intelligence, and native Android integration. It eliminates "zombie" processes, refines the motion algorithms to avoid false positives, and finally adapts the visual identity to modern Android themes.

Esta versión se centra en la estabilidad del sistema, la inteligencia de los sensores y la integración nativa con Android. Elimina los procesos "zombie", refina los algoritmos de movimiento para evitar falsos positivos y adapta por fin la identidad visual a los temas modernos de Android.


🚀 What's New / Novedades

📱 Android Integration (Visual)

  • Monochrome Icon Support: Added full support for Android 13+ Themed Icons. The app icon now correctly adapts to your wallpaper's color palette. Verified on Pixel/Android 16. (Thanks @dav23r!)
  • Soporte Iconos Temáticos: Añadido soporte para iconos monocromáticos en Android 13+. El icono ahora se adapta a la paleta de colores de tu fondo de pantalla. Verificado en Pixel/Android 16.

🧠 Sensor Intelligence (Logic)

  • Smart Noise Filter: Increased motion threshold to 0.15G (from 0.01G) and adjusted gravity margins (0.85G - 1.15G). Sylvia now only wakes up for real human movement.
  • Filtro Inteligente de Ruido: Umbral de movimiento subido a 0.15G y márgenes de gravedad ajustados. Sylvia ahora ignora vibraciones de motor o golpes en la mesa; solo se despierta con movimiento humano real.

🎨 Visual Telemetry (UI)

  • G-Force Traffic Light: The dashboard speedometer now changes color dynamically (Green/Yellow/Red) based on movement intensity.
  • Privacy Diagnostic: If the icon remains Grey, it visually indicates that sensors are blocked by the OS (useful for GrapheneOS users).
  • Semáforo de Fuerza G: El velocímetro del panel cambia de color dinámicamente (Verde/Amarillo/Rojo) según la intensidad del movimiento.
  • Diagnóstico de Privacidad: Si el icono permanece Gris, indica visualmente que los sensores están bloqueados por el SO (útil para usuarios de GrapheneOS).

🏛️ System Stability (Core)

  • Zombie Process Killer: Implemented android:stopWithTask="true". The background service now terminates cleanly when the app is closed via the task manager.
  • Native Dark Mode: Fixed startup white flashes. The app forces a clean dark theme boot sequence.
  • Mata-Zombies: Implementado stopWithTask. El servicio en segundo plano ahora termina limpiamente al cerrar la app desde el gestor de tareas.
  • Modo Oscuro Nativo: Corregidos los parpadeos blancos al inicio. Arranque limpio en modo oscuro.

🌍 Global Expansion

  • 3 New Languages: Added full support for Italian (IT), Dutch (NL), and Swedish (SV).
  • Cleaner UI: Updated language selector dialog (text-based, cleaner look).
  • 3 Nuevos Idiomas: Añadido soporte completo para Italiano (IT), Neerlandés (NL) y Sueco (SV).
  • UI Limpia: Selector de idiomas actualizado (basado en texto, aspecto más limpio).

🤝 Credits / Créditos

  • IT Translation: Thanks to @ulipo & Community.
  • Icon Report: Thanks to @dav23r.

Full Changelog: v3.9.1...v3.9.2