Notification Guard

Notification Guard filtre les notifications Android entrantes selon des profils horaires prédéfinis (nuit, pause déjeuner, heures de travail, week-end) et des règles personnalisées par application. Les applications sensibles sont toujours laissées passer grâce à un filtre de confidentialité.
| Propriété | Valeur |
|---|---|
| Plateforme | Android 7+ (API 24) |
| Stack | Tauri v2 · Rust · Svelte 5 |
| Langues | 7 |
| Dépôt | git.pronix.org/oiv1Ni3o/notification-guard |
flowchart LR
A[Notifications app] --> B[Capture locale<br/>on-device uniquement]
B --> C[(Stockage local chiffré)]
C --> D[Vue utilisateur]
D --> E[Export manuel]
B -.->|jamais| F[("Cloud / Serveur")]
style F stroke-dasharray: 5 5,stroke:#c00,color:#c00
Fonctionnalités
- 🕒 Profils horaires — Quatre profils intégrés. Les catégories d’applications sont regroupées dans les profils — pas besoin d’écrire une règle par appli.
- 📦 Catalogue d’applis populaires — 77 préréglages curatés dans 5 catégories (Réseaux sociaux, Jeux, Actualités, Shopping, Streaming). Filtrable par applis installées.
- 🧠 Moteur de règles — Évaluation Rust en moins de 10 ms par notification. Les règles utilisateur priment sur les profils. Exceptions par règle (contact, mot-clé).
- 🗑️ Nettoyage TTL — Les notifications bloquées sont supprimées automatiquement après une rétention configurable (24 h par défaut). « Tout effacer » en un toucher.
Confidentialité
Architecture exclusivement locale. Pas de serveur, pas de compte, pas de tracking, pas d’analytics. Aucune permission Internet déclarée dans le manifest Android.
Ce que vous pouvez attendre
- Entièrement local — toutes les données restent sur l’appareil
- Aucun serveur, aucun cloud, aucun SDK tiers
- Aucun accès Internet (le manifest ne contient pas
android.permission.INTERNET) - Aucun rapporteur de crash, aucun analytics, aucune télémétrie
- Base de données SQLite dans le stockage privé de l’application
- Nettoyage automatique des notifications bloquées par TTL
- Bouton « Tout effacer » disponible à tout moment
Filtre de confidentialité — les applications sensibles ne sont jamais bloquées
Le NotificationListenerService voit inévitablement toutes les
notifications. Un pré-filtre écarte les catégories d’applications
sensibles AVANT que le moteur de règles ne les voie — ces notifications
n’entrent jamais dans le stockage, et leur contenu n’est jamais persisté.
Catégories protégées : banque (DKB, PayPal, caisses d’épargne, …), 2FA/authentificateur, assurance maladie (TK, AOK, Barmer), services publics (services fédéraux, Elster).
Conformité Google Play
Six contraintes architecturales strictes issues des politiques Google Play actuelles (Data Safety, Permissions Declaration, Notification Listener). Chaque contrainte est suivie comme un ticket Gitea.
| ID | Exigence | État & mise en œuvre |
|---|---|---|
| C1 | Divulgation et consentement explicites | ✓ Conforme — Assistant en 4 étapes couvrant divulgation, sélection de profil, sélection de catégories, activation de permission. Mentions claires : local, sans serveur, sans réseau. |
| C2 | Pas de SYSTEM_ALERT_WINDOW | ✓ Conforme — Le manifest ne déclare pas cette permission. Les re-notifications passent par NotificationManager. |
| C3 | TTL de rétention des données | ✓ Conforme — Rétention configurable (24 h par défaut). Tâche de nettoyage périodique (intervalle Tokio, 60 min). Bouton « Tout effacer » avec dialogue de confirmation. |
| C4 | Sélecteur de contacts au lieu de READ_CONTACTS | ○ Prévu — Sera ajouté comme module opt-in optionnel utilisant le Contact Picker Android — pas de READ_CONTACTS. |
| C5 | Filtre de confidentialité (blocklist de catégories sensibles) | ✓ Conforme — Blocklist par défaut codée en dur comme pré-filtre dans le moteur de règles. Premier contrôle dans evaluate() — correspondance → Pass immédiat, pas d’évaluation, pas de stockage. |
| C6 | Aucune couche réseau | ✓ Conforme — Manifest vérifié (aapt dump badging). Aucune dépendance HTTP dans les Cargo.toml. L’application fonctionne entièrement en mode avion. |
Permissions déclarées
Quatre permissions de manifest, chacune avec un objectif fonctionnel concret. Aucune permission d’exécution, aucun accès spécial restreint au-delà du listener principal.
android.permission.BIND_NOTIFICATION_LISTENER_SERVICE— Fonction principale. Sans cette permission, l’application ne peut ni lire ni filtrer les notifications. Activée explicitement par l’utilisateur dans les paramètres système.android.permission.RECEIVE_BOOT_COMPLETED— Reconnecte le service listener après un redémarrage de l’appareil. Sans elle, l’application serait aveugle après chaque reboot jusqu’au lancement manuel.android.permission.WAKE_LOCK— Déclenche de manière fiable les minuteurs de snooze depuis le mode Doze (prévu en phase 2).android.permission.POST_NOTIFICATIONS— Affiche nos propres re-notifications (libérées ou en snooze) — à la place d’une fenêtre superposée (voir C2).
Technologie
- Frontend — Svelte 5 (Runes) dans la WebView Tauri, responsive dès 360 px, mise en page avec onglets bas sur mobile.
- Localisation —
svelte-i18navec détection de locale OS viatauri-plugin-os. Langues disponibles : anglais, allemand, français, espagnol, chinois, japonais, coréen. - Backend — Rust + hôte Tauri v2. Trois plugins maison (Listener, Rules Engine, Store) ainsi que les plugins officiels Notification et OS.
- Couche mobile — Android Kotlin :
NotificationListenerServicerelaie les événements via l’API plugin Tauri vers le pipeline Rust. - Base de données — SQLite via
rusqlite(WAL, clés étrangères activées). 5 migrations. Fichier privé à l’application, sans accès externe. - Build & signature — APK universel et AAB (exigence AAB de Google Play). Builds dev signés avec un keystore local. APK actuellement ~14 Mo.
Points forts architecturaux
- Isolation des plugins — Les trois plugins maison (
notif-listener,rules-engine,notif-store) n’ont aucune dépendance croisée. La communication passe exclusivement par l’hôte Tauri comme médiateur. - Filtre de confidentialité à l’entrée du pipeline — Les applis sensibles sont filtrées avant que le moteur de règles ne les voie — le contenu des notifications sensibles n’est jamais journalisé ni stocké.
- Profils vs. règles — UX débutant via profils prédéfinis + catégories d’applis ; UX expert via règles individuelles dans une vue « avancée ». Les deux chemins partagent le même moteur.
- Spécificités mobiles — Modules Android plugin personnalisés avec fusion AndroidManifest. L’onboarding des permissions gère le verrouillage Android 13 « restricted settings » pour les APK sideloadées.
Notification Guard — Dépôt : git.pronix.org/oiv1Ni3o/notification-guard