Application web de suivi nutritionnel : recettes calibrées sur une cible calorique, planning hebdomadaire, liste de courses et journal alimentaire. Utilisable au navigateur sur le PC et installable sur l'écran d'accueil d'un iPhone (PWA).
Partagée entre plusieurs personnes, avec un compte chacune : planning, journal, pesées et objectifs sont strictement personnels ; les recettes et la base d'aliments sont communes.
Python + Flask, SQLite, aucune dépendance front.
- Recettes calibrées — la même recette sort en portion de 400 ou de 600 kcal. Les assaisonnements (sel, épices, ail) sont marqués « fixes » et ne bougent pas : seuls les ingrédients principaux suivent la cible. Les quantités affichées sont directement cuisinables.
- Base d'aliments officielle — table Ciqual 2025 de l'ANSES, 3 484 aliments, importée en local. Recherche tolérante au pluriel et aux formulations de cuisine (« lentilles vertes » trouve « Lentille verte, cuite »). Possibilité d'ajouter ses propres aliments.
- Planning hebdomadaire — 7 jours × 4 créneaux, avec la cible calorique de chaque repas et le total du jour face à l'objectif.
- Liste de courses — entre deux dates, ingrédients cumulés à partir des quantités réellement calibrées, regroupés par rayon de magasin, avec des cases à cocher persistées (on coche sur l'iPhone, c'est à jour sur le PC).
- Journal — ce qui a été réellement mangé (repas planifié en deux clics, ou aliment seul), suivi du poids et courbe d'évolution.
cd "C:/Users/sebas/Dev/Application Nutriform"
python -m venv .venv
.venv/Scripts/python.exe -m pip install -r requirements.txt
# Table Ciqual (1,5 Mo, données publiques ANSES)
mkdir -p data/ciqual
curl -L -o "data/ciqual/Table Ciqual 2025_FR.xlsx" \
"https://entrepot.recherche.data.gouv.fr/api/access/datafile/666260"
PYTHONUTF8=1 .venv/Scripts/python.exe import_ciqual.py
# Premier compte (sans lui, impossible de se connecter)
PYTHONUTF8=1 .venv/Scripts/python.exe tools/gerer_comptes.py creer moi Moi --admin
NF_COOKIE_HTTP=1 PYTHONUTF8=1 .venv/Scripts/python.exe serve.pyL'application écoute sur http://127.0.0.1:5001.
NF_COOKIE_HTTP=1 n'est nécessaire qu'en local : le cookie de session est
sinon réservé à HTTPS, et la connexion tournerait en boucle sur http://.
Pour y accéder depuis l'iPhone sur le réseau local :
NF_HOST=0.0.0.0 puis ouvrir http://<ip-du-pc>:5001. L'application est
pleinement utilisable ainsi, mais le cache hors ligne restera inactif — un
service worker exige HTTPS (ou localhost). Voir deploy/DEPLOY.md
pour l'installation complète sur l'écran d'accueil.
Les recettes sont des fichiers JSON dans recettes/, un par recette. Le format
est documenté dans recettes/_exemple.json.
En pratique : photographier la recette, l'envoyer à Claude Code dans ce dépôt, et le fichier JSON est produit avec les ingrédients rattachés à leur code Ciqual, les quantités converties en grammes et les assaisonnements marqués « fixes ».
| Variable | Défaut | Rôle |
|---|---|---|
NF_DB |
data/nutriform.db |
chemin de la base |
NF_HOST |
127.0.0.1 |
0.0.0.0 pour exposer sur le réseau local |
NF_PORT |
5001 |
port d'écoute |
NF_PERSONNE_DEFAUT |
(non définie) | en développement, court-circuite la connexion pour cette personne — jamais sur un serveur |
NF_COOKIE_HTTP |
(non définie) | 1 autorise le cookie de session sur http:// — indispensable en local, jamais sur un serveur |
NF_SECRET |
clé de développement | signature des cookies de session |
for t in tests/*.py; do PYTHONUTF8=1 .venv/Scripts/python.exe "$t"; doneSept suites autonomes, dont test_cloisonnement.py qui vérifie qu'aucune
donnée ne passe d'un compte à l'autre, et test_migration.py qui garantit
qu'un passage en multi-comptes ne perd rien.
Chaque personne a son identifiant et son mot de passe (haché en scrypt). La gestion se fait depuis l'écran Comptes pour un administrateur, ou en ligne de commande :
python tools/gerer_comptes.py lister
python tools/gerer_comptes.py creer <identifiant> <prénom> [--admin]
python tools/gerer_comptes.py motdepasse <identifiant>
python tools/gerer_comptes.py desactiver <identifiant>Un administrateur crée, désactive et réinitialise des comptes, mais l'application ne lui donne aucun moyen de consulter le journal, les pesées ou le planning de quelqu'un d'autre. Désactiver un compte conserve toutes ses données.
Le dépôt est analysé par Semgrep (managed scans). Ce qui en est ressorti
et a été corrigé : une redirection ouverte sur le paramètre suivant de
l'écran de connexion, et l'absence de protection CSRF. Chaque formulaire porte
désormais un jeton de session vérifié sur tout POST, et le cookie est
HttpOnly, Secure et SameSite=Strict.
Les alertes d'injection SQL sont des faux positifs : les valeurs passent par des paramètres liés, et les rares identifiants interpolés viennent de constantes internes ou d'un allow-list explicite.
Deux choses seulement : data/nutriform.db (comptes, planning, journal, poids,
aliments perso) et le dossier recettes/. Le référentiel Ciqual se
retélécharge. Dès que plusieurs personnes utilisent l'application, cette
sauvegarde n'est plus optionnelle : leurs données n'existent qu'à cet
endroit.
Données nutritionnelles : Anses. 2025. Table de composition nutritionnelle des aliments Ciqual — ciqual.anses.fr, licence Etalab 2.0.