Initialise le dépôt Bonpoint avec docs et prototype web.
Structure docs/, web/ (app Node existante) et mobile/ (placeholder Flutter).
This commit is contained in:
@@ -0,0 +1,289 @@
|
||||
# Cahier des charges — Bons Points (app Android commerciale)
|
||||
|
||||
**Version :** 0.2
|
||||
**Date :** 9 juin 2026
|
||||
**Statut :** Cadrage — produit public monétisé (pas usage famille seul)
|
||||
|
||||
---
|
||||
|
||||
## 1. Vision produit
|
||||
|
||||
### Objectif business
|
||||
Publier sur le **Google Play Store** une application de **bons points** pour familles, **100 % locale** (pas de SaaS, pas de compte obligatoire), monétisée pour **générer des revenus** au-delà du coût du compte développeur (~25 €).
|
||||
|
||||
### Proposition de valeur (marketing)
|
||||
> **« Vos bons points restent chez vous — zéro cloud, zéro compte, zéro données enfants sur nos serveurs. »**
|
||||
|
||||
Les données familiales (scores, historique, photos) vivent **uniquement sur le téléphone**. Seul un **mini site de redirection** (téléchargement / QR) peut exister côté serveur — sans accès au contenu familial.
|
||||
|
||||
### Ce n’est PAS
|
||||
- **P’titsPas** (`app.ptits-pas.fr`) — application pro garde d’enfants / collectivités (projet séparé, login, SaaS).
|
||||
- L’instance familiale actuelle (Ariana, Pablo, Hélia) — elle sert de **prototype** et de source de règles par défaut, pas de produit final.
|
||||
|
||||
### Hors périmètre v1
|
||||
- iOS (coût Mac + 99 €/an)
|
||||
- OK Google / Nest / voix
|
||||
- Synchronisation multi-téléphones en temps réel
|
||||
- Comptes utilisateurs cloud (Firebase Auth, etc.)
|
||||
|
||||
---
|
||||
|
||||
## 2. Modèle économique
|
||||
|
||||
### Freemium (recommandé)
|
||||
|
||||
| | **Gratuit** | **Premium** (achat unique) |
|
||||
|--|-------------|----------------------------|
|
||||
| Enfants | **1 enfant** max | **Illimité** (ou plafond raisonnable, ex. 8) |
|
||||
| Règles / récompenses | Pack par défaut + édition limitée | Édition complète, familles custom |
|
||||
| Publicités | **Bandeau AdMob** (bas d’écran) | **Aucune pub** |
|
||||
| Export sauvegarde | ✅ | ✅ |
|
||||
| Historique | 30 derniers jours | Illimité |
|
||||
| Prix cible | 0 € | **2,99 € – 4,99 €** (achat in-app unique) |
|
||||
|
||||
*Chiffres à affiner après étude concurrence.*
|
||||
|
||||
### Publicité (AdMob)
|
||||
- App ciblant **familles et enfants** → politique **Google Play Families** obligatoire.
|
||||
- Pubs **taguées child-directed**, contenu **G** max, SDK Ads certifié Families.
|
||||
- **Revenus pub faibles** sur ce segment ; l’IAP « sans pub + multi-enfants » doit être le levier principal.
|
||||
- **Pas de pub** dans l’espace parent ni sur les écrans où l’enfant dépense ses points (UX + conformité).
|
||||
|
||||
### Coûts récurrents
|
||||
| Poste | Coût |
|
||||
|-------|------|
|
||||
| Compte Google Play | ~25 € une fois |
|
||||
| Hébergement landing `/download` | ~0 € (page statique sur infra existante) |
|
||||
| Backend données familiales | **0 €** |
|
||||
| AdMob / Play Billing | Commission Google sur IAP (~15 %) |
|
||||
|
||||
### Seuil de rentabilité (ordre de grandeur)
|
||||
- Coût fixe initial : ~25 € + temps de dev.
|
||||
- À 3 € IAP net ~2,55 € : **~10 achats** pour couvrir le compte Play (hors temps).
|
||||
- Les pubs seules nécessitent **très nombreuses** impressions (surtout en child-directed).
|
||||
|
||||
---
|
||||
|
||||
## 3. Utilisateurs cibles
|
||||
|
||||
| Profil | Besoin |
|
||||
|--------|--------|
|
||||
| **Parent** (acheteur décisionnaire) | Gérer points, règles, récompenses, corriger erreurs |
|
||||
| **Enfant** | Voir score, historique, « boutique » |
|
||||
| **Parent soucieux vie privée** | Pas de compte, pas de cloud — argument d’achat |
|
||||
|
||||
**Marché initial :** France, français. Extension EU possible plus tard.
|
||||
|
||||
---
|
||||
|
||||
## 4. Parcours utilisateur (premier lancement)
|
||||
|
||||
Pas de login. À la première ouverture :
|
||||
|
||||
1. **Écran bienvenue** — promesse (local, privé, simple).
|
||||
2. **Création du 1er enfant** — prénom, couleur, photo (galerie ou avatar).
|
||||
3. **Choix du PIN parent** (obligatoire).
|
||||
4. **Import règles par défaut** — pack « Maison & école » (~30 règles issues du prototype) ou départ vide.
|
||||
5. **Tableau de bord** — prêt à l’emploi.
|
||||
|
||||
Ensuite : ouverture directe sur le tableau de bord (PIN pour espace parent).
|
||||
|
||||
---
|
||||
|
||||
## 5. Fonctionnalités
|
||||
|
||||
### 5.1 MVP commercial (v1.0 — publication Play Store)
|
||||
|
||||
#### Tableau de bord
|
||||
- Liste enfants (limité à 1 en gratuit ; badge « Passer à Premium » si ajout 2e enfant).
|
||||
- Accès espace parent (PIN).
|
||||
- Menu : réglages, export/import, premium, politique confidentialité.
|
||||
|
||||
#### Enfant
|
||||
- Fiche : photo, score, historique, boutique.
|
||||
- Plancher score à **0**.
|
||||
|
||||
#### Espace parent (PIN)
|
||||
- Multi-sélection enfants (premium si >1 enfant).
|
||||
- Grille règles par familles (édition en premium ; lecture + apply en gratuit).
|
||||
- Historique + **annulation** de mouvement.
|
||||
- Verrouillage auto après sortie de l’écran parent.
|
||||
|
||||
#### Boutique
|
||||
- Récompenses configurables (premium) ou pack défaut (gratuit).
|
||||
|
||||
#### Configuration (premium ou partiel gratuit)
|
||||
- Ajouter / modifier / désactiver règles et récompenses.
|
||||
- Ajouter enfants (premium au-delà du 1er).
|
||||
- Changer PIN, couleurs, photos.
|
||||
- **Export / import** sauvegarde JSON chiffrée (Google Drive, mail, fichier local).
|
||||
|
||||
#### Monétisation intégrée
|
||||
- Bandeau AdMob (écrans autorisés uniquement).
|
||||
- Écran achat Premium (Google Play Billing).
|
||||
- Restauration achat sur nouveau téléphone.
|
||||
|
||||
#### Légal (obligatoire Play Store)
|
||||
- Politique de confidentialité (URL statique).
|
||||
- Mention « pas de collecte données enfants sur serveur ».
|
||||
- Déclaration cible d’âge Play Console (familles).
|
||||
- CGU simplifiées si IAP.
|
||||
|
||||
### 5.2 v1.1+
|
||||
- Widget Android (scores).
|
||||
- Packs de règles thématiques (téléchargement embarqué, pas serveur).
|
||||
- Statistiques locales pour parents (graphique semaine).
|
||||
- Traduction anglais si traction FR.
|
||||
|
||||
### 5.3 Exclu
|
||||
- Voix / assistant.
|
||||
- Sync cloud entre parents.
|
||||
- Réseau social, classements entre familles.
|
||||
|
||||
---
|
||||
|
||||
## 6. Règles métier (inchangées par rapport au prototype)
|
||||
|
||||
- Score entier, plancher **0**.
|
||||
- Mouvement = trace de chaque action (règle, delta, date).
|
||||
- Annulation = correction inverse (plancher respecté).
|
||||
- Familles de règles : Maison, Routine, Fratrie, Respect, Écrans, Bonus (+ custom en premium).
|
||||
|
||||
*Référence données seed : `apps/bonpoint/src/db.js` (`REGLES_DEFAUT`, `RECOMPENSES_DEFAUT`).*
|
||||
|
||||
---
|
||||
|
||||
## 7. Architecture technique
|
||||
|
||||
| Couche | Choix |
|
||||
|--------|--------|
|
||||
| Framework | **Flutter** (UI rapide, Cursor-friendly, un codebase) |
|
||||
| Base locale | **drift** ou **sqflite** (SQLite) |
|
||||
| État | Riverpod ou Bloc |
|
||||
| IAP | `in_app_purchase` |
|
||||
| Pub | `google_mobile_ads` (Families-compliant) |
|
||||
| Export | Fichier JSON + checksum ; option chiffrement AES (mot de passe parent) |
|
||||
| PIN | Hash local (bcrypt / argon2 via package) |
|
||||
|
||||
### Réseau (minimal)
|
||||
| Usage | Réseau | Données |
|
||||
|-------|--------|---------|
|
||||
| Usage quotidien app | **Non requis** | — |
|
||||
| AdMob | Oui | Requêtes pub anonymisées (Families) |
|
||||
| Play Billing | Oui | Transaction Google |
|
||||
| Landing `bonpoint.ptits-pas.fr/download` | Oui | Redirection Play Store + compteur scans |
|
||||
| Données familiales vers serveur | **Jamais** | — |
|
||||
|
||||
### Landing marketing (serveur léger)
|
||||
- URL : `https://bonpoint.ptits-pas.fr/download` (ou sous-domaine dédié).
|
||||
- QR code sur cartons → comptage scan → redirect fiche Play Store.
|
||||
- **Aucune** donnée enfant ; analytics agrégés uniquement.
|
||||
|
||||
---
|
||||
|
||||
## 8. Distribution Play Store
|
||||
|
||||
### Compte développeur
|
||||
- Compte **personnel** ou **organisation** (si structure P’tits Pas / micro-entreprise — *à trancher pour facturation IAP*).
|
||||
|
||||
### Avant publication publique (compte perso récent)
|
||||
- **Test fermé** : minimum **12 testeurs** opt-in, **14 jours consécutifs**.
|
||||
- Questionnaire « production access » rempli par Google.
|
||||
- Prévoir recrutement testeurs (réseau, parents école, etc.) **avant** de viser la prod.
|
||||
|
||||
### Fiche Store
|
||||
- Nom : **Bons Points** (ou **Bonpoint — Bons points famille** si conflit).
|
||||
- Captures : tableau de bord, espace parent, boutique.
|
||||
- Argument : **100 % hors ligne, privé, sans compte**.
|
||||
|
||||
---
|
||||
|
||||
## 9. Stratégie marketing (terrain)
|
||||
|
||||
| Canal | Action |
|
||||
|-------|--------|
|
||||
| **QR cartons** | Carton imprimé → `/download` → Play Store |
|
||||
| **Bouche-à-oreille** | Enfants / parents d’école (récré, WhatsApp parents) |
|
||||
| **Différenciation** | Vie privée vs apps concurrentes cloud + abonnement |
|
||||
| **Pas en v1** | Budget pub Facebook, influenceurs |
|
||||
|
||||
---
|
||||
|
||||
## 10. Concurrence & positionnement
|
||||
|
||||
Marché saturé d’apps « chores / rewards / points ». Angles possibles :
|
||||
|
||||
1. **100 % local** — pas d’abonnement mensuel.
|
||||
2. **Français natif** — règles et UX pensées France.
|
||||
3. **Prix bas** — IAP unique vs abonnements concurrents.
|
||||
4. **Sans compte** — installation en 2 minutes.
|
||||
|
||||
*Étude concurrentielle à faire (2–3 apps FR/EN) avant finalisation pricing.*
|
||||
|
||||
---
|
||||
|
||||
## 11. Rapport avec le prototype web
|
||||
|
||||
| Élément | Décision |
|
||||
|---------|----------|
|
||||
| `bonpoint.ptits-pas.fr` | Devient **landing + redirect** ; app web famille optionnelle en maintenance |
|
||||
| Code Node actuel | Source de vérité pour **règles par défaut** et **logique métier** ; pas porté tel quel |
|
||||
| Dialogflow / Smart Home / Nest | **Abandonné** |
|
||||
| Photos Ariana/Pablo/Hélia | Remplacées par avatars génériques dans l’app publique |
|
||||
|
||||
---
|
||||
|
||||
## 12. Planning indicatif
|
||||
|
||||
| Phase | Livrable | Durée estimée |
|
||||
|-------|----------|---------------|
|
||||
| **0** | Validation CDC v0.2 + étude concurrence + pricing | 1 semaine |
|
||||
| **1** | Projet Flutter + BDD + onboarding + 1 enfant | 1 semaine |
|
||||
| **2** | Espace parent, règles, mouvements, annulation | 1 semaine |
|
||||
| **3** | Boutique, export/import, packs règles défaut | 1 semaine |
|
||||
| **4** | AdMob + IAP + écran premium | 1 semaine |
|
||||
| **5** | Légal, polish, tests, test fermé 14 j | 2 semaines |
|
||||
| **6** | Landing QR + cartons + demande prod Play | 1 semaine |
|
||||
|
||||
**Total indicatif :** 7–8 semaines à temps partiel.
|
||||
|
||||
---
|
||||
|
||||
## 13. Critères d’acceptation v1.0
|
||||
|
||||
- [ ] Onboarding sans compte ; 1er enfant créé en < 3 min
|
||||
- [ ] Gratuit : 1 enfant, pub visible, pack règles défaut utilisable
|
||||
- [ ] Premium : achat débloque multi-enfants + sans pub + édition complète
|
||||
- [ ] 100 % fonctionnel en mode avion (hors pub et achat)
|
||||
- [ ] Export puis import sur autre téléphone = données identiques
|
||||
- [ ] Conformité Families (pubs G, pas de tracking enfant)
|
||||
- [ ] Politique confidentialité accessible depuis l’app
|
||||
- [ ] Test fermé 12×14 j validé avant prod
|
||||
|
||||
---
|
||||
|
||||
## 14. Points encore à trancher
|
||||
|
||||
| # | Question | Options |
|
||||
|---|----------|---------|
|
||||
| 1 | **Nom marque Play Store** | Bons Points / Bonpoint / autre |
|
||||
| 2 | **Prix IAP** | 2,99 € / 3,99 € / 4,99 € |
|
||||
| 3 | **Limite enfants premium** | Illimité / 6 / 8 |
|
||||
| 4 | **Compte Play** | Perso / société (micro-entreprise) |
|
||||
| 5 | **Édition règles en gratuit** | Lecture seule / 5 règles custom |
|
||||
| 6 | **Historique gratuit** | 30 j / 50 mouvements / illimité |
|
||||
| 7 | **Landing** | Garder `bonpoint.ptits-pas.fr` / nouveau domaine |
|
||||
| 8 | **Quand arrêter le site web actuel** | Dès v1 / après traction app |
|
||||
|
||||
---
|
||||
|
||||
## 15. Prochaine étape
|
||||
|
||||
1. Valider ce CDC v0.2 (prix IAP, limites gratuit/premium).
|
||||
2. Faire une **mini étude concurrence** (3 apps, leurs prix).
|
||||
3. Créer le repo Flutter `bonpoint-app` et l’onboarding.
|
||||
4. En parallèle : ouvrir compte Play + préparer liste des 12 testeurs.
|
||||
|
||||
---
|
||||
|
||||
*v0.1 → v0.2 : pivot produit public monétisé (freemium + AdMob + IAP), stack Flutter, landing QR conservée.*
|
||||
@@ -0,0 +1,129 @@
|
||||
# OK Google — Bons Points sur Nest
|
||||
|
||||
## Important : Dialogflow « conversation » ne marche plus sur Nest
|
||||
|
||||
Depuis le **13 juin 2023**, Google a arrêté les **Conversational Actions** (Dialogflow + « Dis à Bons Points… »).
|
||||
|
||||
L’endpoint `/api/voice/dialogflow` reste utile pour **tests** et pour d’autres intégrations Dialogflow, mais **ne peut plus être invoqué directement sur une enceinte Nest** via une action conversationnelle.
|
||||
|
||||
La voie officielle aujourd’hui : **Google Home Smart Home** (capteurs virtuels).
|
||||
|
||||
---
|
||||
|
||||
## Ce qui est déjà prêt côté serveur
|
||||
|
||||
| URL | Rôle |
|
||||
|-----|------|
|
||||
| `GET /api/voice/ariana` | Réponse JSON (test) |
|
||||
| `GET /api/voice?prenom=pablo` | Idem |
|
||||
| `POST /api/voice/dialogflow` | Webhook Dialogflow (tests) |
|
||||
| `POST /api/smarthome` | Fulfillment Google Home (SYNC / QUERY) |
|
||||
|
||||
Test rapide :
|
||||
|
||||
```bash
|
||||
curl -s https://bonpoint.ptits-pas.fr/api/voice/ariana
|
||||
curl -s -X POST https://bonpoint.ptits-pas.fr/api/smarthome \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"requestId":"test","inputs":[{"intent":"action.devices.SYNC"}]}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Principe Smart Home (recommandé)
|
||||
|
||||
Chaque enfant apparaît comme un **capteur de batterie** (0–100 %) = son score de bons points.
|
||||
|
||||
Phrases à essayer sur le Nest (en français) :
|
||||
|
||||
- « OK Google, **quel est le niveau de batterie d’Ariana** ? »
|
||||
- « OK Google, **quelle est la batterie de Pablo** ? »
|
||||
- « OK Google, **niveau de batterie Hélia** »
|
||||
|
||||
> Astuce famille : expliquer aux enfants que la « batterie » = leurs bons points.
|
||||
|
||||
Les scores au-dessus de 100 s’affichent comme 100 % (limite Google).
|
||||
|
||||
---
|
||||
|
||||
## Configuration Google Home Developer (à faire une fois)
|
||||
|
||||
### 1. Créer le projet
|
||||
|
||||
1. Ouvrir [Google Home Developer Console](https://console.home.google.com/)
|
||||
2. **Create project** → nom : `Bons Points`
|
||||
3. Type d’intégration : **Cloud-to-cloud**
|
||||
|
||||
### 2. Fulfillment
|
||||
|
||||
1. Menu **Integrations** → votre intégration Cloud-to-cloud
|
||||
2. **Fulfillment URL** :
|
||||
|
||||
```
|
||||
https://bonpoint.ptits-pas.fr/api/smarthome
|
||||
```
|
||||
|
||||
3. Enregistrer
|
||||
|
||||
### 3. Account linking (obligatoire pour le Nest)
|
||||
|
||||
Google exige un **OAuth 2.0** pour lier le compte dans l’app Google Home.
|
||||
|
||||
Options possibles :
|
||||
|
||||
- **Auth0** ou **Firebase Auth** (gratuit, adapté à un usage familial)
|
||||
- OAuth maison (plus technique)
|
||||
|
||||
Une fois OAuth configuré, vous liez l’intégration dans **Google Home** → **Paramètres** → **Travaille avec Google**.
|
||||
|
||||
### 4. Test avant production
|
||||
|
||||
1. Dans la console : **Test Suite** → lancer SYNC et QUERY
|
||||
2. Vérifier que 3 appareils apparaissent (Ariana, Pablo, Hélia)
|
||||
3. Tester une QUERY sur un appareil → le score doit correspondre à l’app
|
||||
|
||||
### 5. Utilisation au quotidien
|
||||
|
||||
1. Lier l’intégration sur le compte Google du foyer
|
||||
2. Les 3 « capteurs » sont découverts automatiquement
|
||||
3. Les enfants demandent le niveau de batterie / points à voix haute
|
||||
|
||||
---
|
||||
|
||||
## Dialogflow (optionnel, tests uniquement)
|
||||
|
||||
Si vous voulez quand même un agent Dialogflow pour tester le webhook :
|
||||
|
||||
1. [Dialogflow ES](https://dialogflow.cloud.google.com/) → nouvel agent **fr**
|
||||
2. Intent `score_enfant` avec phrases :
|
||||
- Combien de points a Ariana ?
|
||||
- Quel est le score de Pablo ?
|
||||
- Et Hélia elle a combien ?
|
||||
3. Paramètre `@sys.given-name` ou entité custom `prenom` : Ariana, Pablo, Hélia
|
||||
4. Intent `score_tous` : Combien de points ? / Les scores ?
|
||||
5. **Fulfillment** → activer webhook :
|
||||
|
||||
```
|
||||
https://bonpoint.ptits-pas.fr/api/voice/dialogflow
|
||||
```
|
||||
|
||||
6. Tester dans la console Dialogflow (simulateur) — **pas sur le Nest**.
|
||||
|
||||
---
|
||||
|
||||
## Dépannage
|
||||
|
||||
| Problème | Piste |
|
||||
|----------|--------|
|
||||
| Nest ne connaît pas l’action | Normal si vous utilisez encore Dialogflow conversationnel |
|
||||
| Appareils invisibles | Vérifier account linking + SYNC dans Test Suite |
|
||||
| Mauvais score | Vérifier `GET /api/public/scores` |
|
||||
| Hélia mal reconnue | Dire « Hélia » clairement ; le serveur accepte avec/sans accent |
|
||||
|
||||
---
|
||||
|
||||
## Évolutions possibles
|
||||
|
||||
- OAuth simplifié intégré à l’app (panneau parent)
|
||||
- Cast TTS vers le Nest après une routine (plus complexe)
|
||||
- Phrases personnalisées via Home Assistant (si un jour vous l’adoptez)
|
||||
Reference in New Issue
Block a user