Notification Guard

Notification Guard filtruje przychodzące powiadomienia Android na podstawie predefiniowanych profili ciszy (cisza nocna, cisza w południe, godziny pracy, weekend) i opcjonalnie własnych reguł per aplikacja. Wrażliwe aplikacje są zawsze przepuszczane przez filtr prywatności.
| Cecha | Wartość |
|---|---|
| Platforma | Android 7+ (API 24) |
| Stack | Tauri v2 · Rust · Svelte 5 |
| Języki | 7 |
| Repozytorium | git.pronix.org/oiv1Ni3o/notification-guard |
flowchart LR
A[Powiadomienia aplikacji] --> B[Lokalne przechwytywanie<br/>tylko on-device]
B --> C[(Zaszyfrowany lokalny magazyn)]
C --> D[Widok użytkownika]
D --> E[Manualny eksport]
B -.->|nigdy| F[("Chmura / serwer")]
style F stroke-dasharray: 5 5,stroke:#c00,color:#c00
Co aplikacja robi
- 🕒 Profile ciszy — Cztery wbudowane profile czasowe. Kategorie aplikacji są pakowane w profile — bez budowania reguły dla każdej aplikacji.
- 📦 Top aplikacji skatalogowane — 77 kuratowanych presetów aplikacji w 5 kategoriach (Social, Games, News, Shopping, Streaming). Filtrowalne według zainstalowanych aplikacji.
- 🧠 Silnik reguł — Ewaluacja oparta na Rust w poniżej 10 ms na powiadomienie. Reguły użytkownika mają pierwszeństwo przed profilami. Wyjątki per reguła (kontakt, słowo kluczowe).
- 🗑️ Czyszczenie TTL — Zablokowane powiadomienia są automatycznie usuwane po konfigurowalnej retencji (domyślnie 24 h). „Usuń wszystko" jednym tapnięciem.
Ochrona prywatności
Architektura local-only. Bez serwera, bez konta, bez trackingu, bez analytics. Bez uprawnienia internet w manifeście Androida.
Czego możesz oczekiwać
- W pełni lokalnie — wszystkie dane pozostają na urządzeniu
- Bez serwerów, bez chmury, bez SDK osób trzecich
- Bez dostępu do internetu (manifest nie zawiera
android.permission.INTERNET) - Bez crash-reporterów, bez analytics, bez telemetrii
- Baza SQLite w prywatnej pamięci aplikacji
- Automatyczne czyszczenie zablokowanych powiadomień po TTL
- Manualne „Usuń wszystko" możliwe w każdej chwili
Filtr prywatności — wrażliwe aplikacje nigdy nie są blokowane
NotificationListenerService siłą rzeczy widzi wszystkie powiadomienia. Pre-filtr odfiltrowuje wrażliwe kategorie aplikacji ZANIM silnik reguł je zobaczy — te powiadomienia nigdy nie trafiają do bunkra, ich zawartość nie jest nigdy zapisywana.
Chronione kategorie: bankowość (DKB, PayPal, Sparkasse, …), 2FA/Authenticator, kasy chorych (TK, AOK, Barmer), instytucje publiczne (Bund, Elster).
Google-Play-Compliance
Sześć obowiązkowych ograniczeń architektonicznych z aktualnych polityk Google Play (Data Safety, Permissions Declaration, Notification Listener). Każde jest śledzone jako Gitea-Issue.
| ID | Wymaganie | Status i wdrożenie |
|---|---|---|
| C1 | Prominent Disclosure & Consent | ✓ Spełnione — kreator 4-krokowy z disclosure, wyborem profilu, wyborem kategorii, aktywacją permissions. Jasne wskazówki: lokalnie, bez serwera, bez sieci. |
| C2 | Bez SYSTEM_ALERT_WINDOW | ✓ Spełnione — manifest nie zawiera tego uprawnienia. Re-notifications idą przez NotificationManager. |
| C3 | Data Retention TTL | ✓ Spełnione — konfigurowalna retencja (domyślnie 24 h). Okresowy cleanup-task (Tokio-Interval, 60 min). Przycisk „Usuń wszystko" z dialogiem potwierdzenia. |
| C4 | Contact Picker zamiast READ_CONTACTS | ○ Planowane — zostanie dodane jako opcjonalny moduł opt-in z Android Contact Picker — bez READ_CONTACTS. |
| C5 | Filtr prywatności (blocklist wrażliwych kategorii aplikacji) | ✓ Spełnione — hardcoded default-blocklist jako pre-filtr bezpośrednio w silniku reguł. Pierwsza logika w evaluate() — match → natychmiast Pass, bez ewaluacji, bez zapisu. |
| C6 | Bez warstwy sieciowej | ✓ Spełnione — manifest zweryfikowany (aapt dump badging). Bez zależności od klientów HTTP w plikach Cargo.toml. Aplikacja działa w pełni w trybie samolotowym. |
Używane uprawnienia
Cztery uprawnienia manifestowe, każde z konkretnym powiązaniem funkcjonalnym. Bez uprawnień runtime, bez restricted special-access poza głównym Listenerem.
android.permission.BIND_NOTIFICATION_LISTENER_SERVICE— Główna funkcja. Bez tego uprawnienia aplikacja nie może czytać ani filtrować powiadomień. Aktywowane przez użytkownika wyraźnie w ustawieniach systemowych.android.permission.RECEIVE_BOOT_COMPLETED— Ponowne połączenie Listener-Service po restarcie urządzenia. Bez niego aplikacja byłaby ślepa po każdym reboocie aż do manualnego startu aplikacji.android.permission.WAKE_LOCK— Niezawodne wyzwalanie snooze-timerów dla powiadomień z trybu Doze (planowane w fazie 2).android.permission.POST_NOTIFICATIONS— Wyświetlanie własnych re-notifications (released lub snoozed) — zamiast okna overlay (zob. C2).
Technologia
- Frontend — Svelte 5 (Runes) w Tauri-WebView, responsywny od 360 px, układ bottom-tab na mobile.
- Wielojęzyczność —
svelte-i18nz rozpoznawaniem OS-locale przeztauri-plugin-os. Dostępne języki: English, Deutsch, Français, Español, 中文, 日本語, 한국어. - Backend — Rust + Tauri v2 host. Trzy własne plugins (Listener, Rules-Engine, Store) plus oficjalne plugins Notification i OS.
- Warstwa Mobile — Android Kotlin:
NotificationListenerServicemostkuje eventy przez Tauri-Plugin-API do pipeline’u Rust. - Baza danych — SQLite przez
rusqlite(WAL, Foreign-Keys on). 5 migracji. Plik app-private, bez zewnętrznego dostępu. - Build & Signing — Universal-APK i AAB (obowiązek AAB w Google Play). Dev-builds podpisane lokalnym keystore. APK aktualnie ~14 MB.
Highlighty architektoniczne
- Izolacja pluginów — Trzy własne plugins (
notif-listener,rules-engine,notif-store) nie mają cross-dependencies. Komunikacja idzie wyłącznie przez Tauri-host jako mediator. - Filtr prywatności na wejściu pipeline’u — Wrażliwe aplikacje są filtrowane, zanim silnik reguł je zobaczy — zawartości wrażliwych powiadomień nigdy nie są logowane ani zapisywane.
- Profile vs. reguły — UX dla początkujących poprzez predefiniowane profile + kategorie aplikacji; UX dla power-userów poprzez indywidualne reguły w widoku „Zaawansowane". Obie ścieżki używają tego samego silnika.
- Specyfika mobile — własne moduły plugin-Android z mergem AndroidManifest. Permission-onboarding wychwytuje Android-13-Restricted-Settings-Lockout dla APK z sideloadu.
Notification Guard — Repozytorium: git.pronix.org/oiv1Ni3o/notification-guard