Contexte Cursor — App mobile Bons Points
Usage : ouvrir ce dépôt dans un workspace Cursor dédié (mobile/), coller la section « Prompt de démarrage » dans le premier message, puis référencer ce fichier avec @docs/CONTEXTE_CURSOR.md.
Prompt de démarrage (à copier-coller)
Tu travailles sur le projet Bons Points — app Android Flutter commerciale, 100 % locale.
Dépôt : https://git.ptits-pas.fr/jmartin/bonpoint
Clone : git clone ssh://git@git.ptits-pas.fr:2222/jmartin/bonpoint.git
Structure :
- docs/ → cahier des charges et ce fichier
- web/ → prototype Node.js (référence métier + UI, NE PAS modifier sauf demande)
- mobile/ → app Flutter à créer et développer ICI
Lis en priorité :
1. docs/CONTEXTE_CURSOR.md
2. docs/CAHIER_DES_CHARGES_APP_ANDROID.md
3. web/src/db.js (schéma SQLite, règles par défaut, logique scores)
Vision :
- App Play Store freemium (1 enfant gratuit + AdMob, Premium IAP ~3–5 €)
- Données famille UNIQUEMENT sur le téléphone (SQLite), pas de backend SaaS
- Pas de login compte ; PIN parent local
- Français uniquement en v1
Hors périmètre (ne pas implémenter) :
- OK Google / Nest / Dialogflow / voix
- Sync cloud temps réel
- iOS
- Confusion avec P'titsPas (app.ptits-pas.fr = autre produit pro)
Stack imposée : Flutter + drift ou sqflite + Riverpod ou Bloc.
Commence par : flutter create dans mobile/ (org fr.ptitspas.bonpoint), reprendre le modèle de données de web/src/db.js, écran onboarding sans compte.
1. Identité du projet
|
|
| Nom produit |
Bons Points / Bonpoint |
| Type |
App Android familiale — système de bons points pour enfants |
| Objectif business |
App publique Play Store, monétisée (freemium), pas un outil perso famille seul |
| Argument marketing |
« 100 % local, zéro cloud, zéro compte — vos données restent sur votre téléphone » |
| Prototype |
web/ + site https://bonpoint.ptits-pas.fr (labo UX + règles métier) |
| À développer |
mobile/ — Flutter from scratch |
Ce n’est PAS
- P’titsPas (
app.ptits-pas.fr) — SaaS garde d’enfants / collectivités, login, autre codebase (/home/deploy/dev/ptitspas-app).
- Une app avec serveur backend pour les données enfants.
- Un projet vocal Nest / Google Home (abandonné, voir
docs/GOOGLE_HOME.md).
2. Dépôt Git
|
|
| Web |
https://git.ptits-pas.fr/jmartin/bonpoint |
| SSH (PC / clé jmartin) |
ssh://git@git.ptits-pas.fr:2222/jmartin/bonpoint.git |
| SSH (serveur deploy) |
gitea-jmartin:jmartin/bonpoint.git (alias dans ~/.ssh/config) |
| Branche principale |
main |
| État mobile |
mobile/ = placeholder (README.md seulement), pas encore de projet Flutter |
git clone ssh://git@git.ptits-pas.fr:2222/jmartin/bonpoint.git
cd bonpoint
3. Structure du dépôt
bonpoint/
├── README.md
├── .gitignore
├── docs/
│ ├── CONTEXTE_CURSOR.md ← ce fichier
│ ├── CAHIER_DES_CHARGES_APP_ANDROID.md ← spec produit v0.2
│ └── GOOGLE_HOME.md ← archive (Nest abandonné)
├── web/ ← NE PAS casser ; référence uniquement
│ ├── src/
│ │ ├── db.js ← ★ source de vérité métier + seed règles
│ │ ├── server.js
│ │ ├── auth.js ← PIN bcrypt
│ │ └── routes/
│ ├── public/ ← maquettes HTML/CSS (inspiration UI)
│ ├── docker-compose.yml
│ └── package.json
└── mobile/ ← ★ TRAVAILLER ICI
└── README.md
4. Décisions produit (validées)
| Sujet |
Décision |
| Plateforme |
Android seulement (pas iOS v1) |
| Framework |
Flutter |
| Données |
SQLite locale (drift ou sqflite) |
| Réseau usage quotidien |
Aucun (mode avion OK) |
| Authentification |
Pas de compte ; PIN parent hashé local |
| Monétisation |
Freemium : 1 enfant + pubs / Premium IAP (multi-enfants, sans pub, édition complète) |
| Pubs |
AdMob Families-compliant (child-directed, rating G) |
| Sauvegarde |
Export/import fichier JSON (obligatoire v1) |
| Voix / Nest / TV |
Abandonné |
| Langue |
Français |
5. Modèle freemium (cible — à affiner)
|
Gratuit |
Premium (IAP unique ~2,99–4,99 €) |
| Enfants |
1 max |
Plusieurs (ex. 8 max) |
| Règles / récompenses |
Pack défaut + édition limitée |
Édition complète |
| Publicités |
Bandeau AdMob (hors espace parent) |
Aucune |
| Historique |
30 jours (proposition) |
Illimité |
| Export sauvegarde |
Oui |
Oui |
6. Règles métier (à porter à l’identique)
Source : web/src/db.js
- Score entier, affiché tel quel.
- Plancher à 0 :
nouveauScore = max(0, score + delta) — le delta enregistré dans mouvements est le delta réel appliqué.
- Mouvement = toute action (règle appliquée, achat boutique, annulation).
- Annulation = inverse le delta (respect plancher 0) — voir
annulerMouvement().
- Boutique : achat si
score >= cout_points, sinon erreur pas_assez_de_points.
Familles de règles (seed)
| Clé |
Libellé |
| MAISON |
🏠 Maison & rangement |
| ROUTINE |
⏰ Matin, soir & école |
| FRATRIE |
👫 Fratrie & entraide |
| RESPECT |
🙏 Respect & écoute |
| ECRANS |
📱 Écrans |
| BONUS |
🌟 Bonus |
~36 règles dans REGLES_DEFAUT (version famille-v5) — à généraliser pour l’app publique (retirer références « Ariana 7h20 » etc. ou les garder comme exemples modifiables).
11 récompenses dans RECOMPENSES_DEFAUT (version famille-v2).
7. Schéma SQLite (référence)
enfants (id, prenom, date_naissance, score, couleur, ordre)
regles (id, libelle, points, icone, actif, ordre, famille, famille_ordre)
mouvements (id, enfant_id, regle_id?, delta, note?, cree_le)
recompenses (id, libelle, cout_points, icone, actif, ordre)
config (cle, valeur) -- ex. pin_hash, regles_version, premium_unlocked
PIN : bcrypt du PIN parent dans config.pin_hash (voir web/src/auth.js).
8. Écrans MVP (v1.0)
| Écran |
Accès |
Description |
| Onboarding |
1er lancement |
Bienvenue → créer 1er enfant → PIN → importer règles défaut |
| Tableau de bord |
Tous |
Liste enfants + scores ; lien espace parent |
| Fiche enfant |
Tous |
Photo, score, historique, bouton boutique |
| Boutique |
Tous |
Liste récompenses, achat |
| Espace parent |
PIN |
Multi-sélection, grille règles, historique + annulation |
| Réglages |
Parent |
Export/import, premium, politique confidentialité |
| Premium |
Parent |
Achat IAP, restauration |
Inspiration UI : web/public/*.html + web/public/css/style.css (couleurs, cartes, avatars ronds).
9. Stack technique recommandée
| Couche |
Choix |
| UI |
Flutter + Material 3 |
| État |
Riverpod ou Bloc |
| BDD |
drift ou sqflite |
| IAP |
in_app_purchase |
| Pub |
google_mobile_ads (tag child-directed) |
| PIN |
bcrypt ou package hash équivalent |
| Export |
JSON + checksum ; chiffrement AES optionnel (mot de passe parent) |
| Tests |
flutter test + tests unitaires logique scores |
Package Android : fr.ptitspas.bonpoint (proposition).
10. Réseau (minimal)
| Cas |
Réseau ? |
| Scores, règles, historique |
Non |
| AdMob |
Oui |
| Play Billing (IAP) |
Oui |
| Envoi données enfants vers serveur |
Jamais |
Landing marketing future (hors app) : bonpoint.ptits-pas.fr/download → redirect Play Store + QR cartons.
11. Play Store (contraintes)
- Compte développeur ~25 € (une fois).
- Compte personnel récent : test fermé 12 testeurs × 14 jours consécutifs avant production.
- Déclaration Families obligatoire (app pour enfants).
- Politique de confidentialité (URL statique).
- App non répertoriée possible en test interne.
12. Points NON tranchés (demander au porteur de projet)
| # |
Question |
| 1 |
Nom Play Store : « Bons Points » ou « Bonpoint » ? |
| 2 |
Prix IAP : 2,99 / 3,99 / 4,99 € ? |
| 3 |
Limite enfants premium : illimité ou plafond (6 / 8) ? |
| 4 |
Compte Play : perso ou micro-entreprise ? |
| 5 |
Édition règles en gratuit : lecture seule ou N règles custom ? |
| 6 |
Historique gratuit : 30 j / 50 mouvements / illimité ? |
| 7 |
Riverpod ou Bloc ? drift ou sqflite ? |
Ne pas inventer — proposer une valeur par défaut raisonnable et la documenter si bloqué.
13. Conventions de développement
- UI / textes utilisateur : français.
- Code : anglais (noms de classes, fichiers, variables) — cohérent avec l’écosystème Flutter.
- Commits : messages en français, concis.
- Scope : travailler dans
mobile/ ; ne pas modifier web/ ni infra_v2 sans demande explicite.
- Pas de sur-ingénierie : MVP d’abord, premium/AdMob en phase 4.
- Ne pas commit
.env, clés AdMob, fichiers google-services.json de prod dans le dépôt public.
14. Ordre de développement suggéré
flutter create dans mobile/ (org fr.ptitspas.bonpoint)
- Modèle de données + migrations SQLite
- Seed règles/récompenses (porter depuis
web/src/db.js)
- Onboarding + tableau de bord + 1 enfant
- Espace parent (PIN, appliquer règle, annulation)
- Fiche enfant + boutique
- Export/import sauvegarde
- IAP Premium + AdMob
- Polish, légal, build release
15. Fichiers clés à lire en premier
| Fichier |
Pourquoi |
docs/CAHIER_DES_CHARGES_APP_ANDROID.md |
Spec complète v0.2 |
web/src/db.js |
Schéma, seed, appliquerRegle, acheterRecompense, annulerMouvement |
web/src/auth.js |
Vérification PIN |
web/public/index.html |
Accueil |
web/public/parent.html |
Espace parent |
web/public/boutique.html |
Boutique |
web/public/css/style.css |
Charte visuelle |
16. Historique projet (éviter de refaire les erreurs)
| Tentative |
Résultat |
| Dialogflow + webhook |
OK en simulateur, inutilisable sur Nest/téléphone (Conversational Actions mortes depuis 06/2023) |
| Smart Home Google |
Répond « batterie » au lieu de « bons points » — abandonné |
| PWA / Cast TV |
Affichage possible, pas de voix custom — hors scope |
| App Nest installée |
Impossible (pas de store sur Nest Hub) |
17. Contacts & infra (info)
- Prototype web prod : https://bonpoint.ptits-pas.fr (Docker sur infra OVH,
/home/deploy/infra_v2/apps/bonpoint — legacy, le dépôt canonique est maintenant git.ptits-pas.fr/jmartin/bonpoint)
- Porteur projet : Julien Martin (
jmartin@ptits-pas.fr)
- Gitea : self-hosted
git.ptits-pas.fr
Dernière mise à jour : juin 2026 — aligné sur CDC v0.2 et dépôt main.