SportProgLoader

SportProgLoader

Charge un programme et lance ta séance.

00:00
En attente

Séance terminée 🎉

Min réelles
Faits principaux
Prévus principaux

Comment utiliser SportProgLoader

Charge un programme d'entraînement en JSON, suis le déroulé, exporte ton récap.

1. Démarrage rapide

SportProgLoader est une application qui te guide pas à pas pendant ta séance de sport. Tu charges un programme au format JSON, et l'app déroule chaque exercice avec chronos, pauses et conseils.

3 étapes pour commencer :

  1. Récupère ou crée un programme JSON (voir les sections suivantes)
  2. Charge-le dans l'app : soit par upload de fichier, soit par copier-coller dans la zone de texte
  3. Démarre la séance et laisse-toi guider

À la fin, tu peux exporter un récap de ta séance (durée réelle, ressentis, exercices passés/faits).

2. Utiliser le prompt avec ton coach IA

Si tu utilises déjà une IA conversationnelle (ChatGPT, Claude, Gemini, Mistral…) comme coach pour gérer tes séances, tu peux lui apprendre le format JSON de l'app.

Comment ça marche :

  1. Copie le prompt ci-dessous et colle-le dans ta conversation avec l'IA
  2. L'IA mémorise le format mais ne génère rien immédiatement
  3. Continue à discuter de ta séance comme d'habitude (exos, pauses, ajustements…)
  4. Quand ton programme est prêt, dis simplement : « Génère-moi le JSON maintenant »
  5. L'IA te sortira le JSON correspondant à ce que vous avez défini ensemble
  6. Copie le JSON, colle-le dans l'app, c'est parti
  7. Après ta séance, tu peux re-coller le récap dans la conversation pour que l'IA t'aide à analyser et ajuster la prochaine séance

Avantage : pas besoin de tout redécrire, l'IA reprend le contexte de votre conversation et peut suivre ta progression sur le long terme.


        

Note : une fois le JSON généré par l'IA, copie-le et colle-le dans l'onglet « Coller un JSON » de l'app, ou utilise l'icône 📋 pour coller directement.

3. Comprendre le format JSON

Si tu veux écrire ton programme à la main ou ajuster un programme existant, voici comment le format fonctionne.

🏗️ Structure générale

Un programme = un objet JSON avec 3 parties principales :

  1. version : toujours "1.0"
  2. meta : informations sur la séance (nom, date, durée estimée…)
  3. phases : la liste ordonnée des phases de la séance

📋 Les phases

Une séance peut contenir autant de phases que tu veux. Typiquement : Échauffement, Circuit principal, Étirements.

Chaque phase a :

  • Un nom (string)
  • Un type : "sequence" ou "circuit"
  • Une liste d'exercices

sequence : exercices enchaînés simplement, sans pause structurée. Idéal pour l'échauffement et les étirements.

circuit : exercices répétés sur plusieurs tours, avec pauses configurables.

⚙️ Les exercices

Chaque exercice a :

  • Un nom (string)
  • Un type : "reps", "secondes" ou "custom"
  • Un objectif (objectif pour reps, duree pour secondes, instructions pour custom avec chrono libre)
  • Optionnellement un conseil (affiché pendant l'exo)

Exemples des 3 types :

// Exercice en répétitions
{ "nom": "Pompes", "type": "reps", "objectif": 10 }

// Exercice en temps
{ "nom": "Gainage", "type": "secondes", "duree": 30 }

// Exercice avec instructions libres et chrono montant
{ "nom": "Étirement libre", "type": "custom", "instructions": "..." }

🔁 Cas avancés

Exercice asymétrique (gauche/droite) :

{
  "nom": "Fente avant",
  "type": "reps",
  "objectif": 5,
  "objectif_mode": "par_cote",
  "cotes": ["gauche", "droite"]
}

Exercice répété plusieurs fois (étirements typiquement) :

{
  "nom": "Squat profond statique",
  "type": "secondes",
  "duree": 30,
  "series": 3,
  "pause_entre_series_sec": 120,
  "series_auto": true
}

Pauses dans un circuit :

{
  "nom": "Circuit",
  "type": "circuit",
  "tours": 4,
  "pause_entre_exos_sec": 45,
  "pause_entre_tours_sec": 90,
  "pause_fin_circuit_sec": 60
}

📈 Variations par tour (décrescendo, crescendo, pyramide)

Dans un circuit, tu peux faire varier l'objectif d'un exercice à chaque tour avec deux champs optionnels :

  • objectifs_par_tour : tableau de nombres pour les exos en reps (remplace objectif)
  • durees_par_tour : tableau de secondes pour les exos en secondes (remplace duree)

Le tableau doit avoir exactement autant de valeurs que de tours. Index 0 = tour 1, index 1 = tour 2, etc.

Exemple — décrescendo sur 3 tours :

{
  "nom": "Circuit",
  "type": "circuit",
  "tours": 3,
  "pause_entre_exos_sec": 30,
  "pause_entre_tours_sec": 60,
  "exercices": [
    {
      "nom": "Pompes",
      "type": "reps",
      "objectifs_par_tour": [10, 8, 6],
      "conseil": "Décrescendo : on baisse à chaque tour."
    },
    {
      "nom": "Gainage",
      "type": "secondes",
      "durees_par_tour": [30, 25, 20]
    }
  ]
}

Ces champs n'ont de sens que dans un circuit. Dans une sequence, ils sont ignorés.

🏷️ Travail principal ou accompagnement

Le champ travail_principal (booléen, requis) sur chaque phase indique si elle compte dans les statistiques principales et l'analyse du cœur de séance, ou si elle relève de l'accompagnement (échauffement, récupération, mobilité douce).

Comportement de l'app selon ce champ :

  • Travail principal → compte dans les stats principales, mise en avant visuelle dans le récap.
  • Accompagnement → visible dans le récap, mais exclu des compteurs principaux.

Tu dois le renseigner explicitement pour chaque phase :

{
  "nom": "Mobilité avancée travaillée",
  "type": "sequence",
  "travail_principal": true,
  "exercices": [...]
}

📝 Collecte du ressenti par phase

Le champ collecter_ressenti (booléen, requis) sur une phase indique si l'app doit demander à l'utilisateur son ressenti après chaque exo de la phase.

Comportement :

  • true → l'app demande un ressenti après chaque exo. Si la phase est une sequence sans pauses naturelles, l'app injecte automatiquement une mini-pause libre après chaque exo pour permettre la saisie.
  • false → l'app ne demande jamais de ressenti pour cette phase.

À noter : travail_principal et collecter_ressenti sont deux champs indépendants. travail_principal contrôle les stats principales et le récap, collecter_ressenti contrôle uniquement la demande de ressenti pendant la séance.

{
  "nom": "Étirements travaillés",
  "type": "sequence",
  "travail_principal": true,
  "collecter_ressenti": true,
  "exercices": [
    { "nom": "Squat profond statique", "type": "secondes", "duree": 30 },
    { "nom": "Toucher ses pieds", "type": "secondes", "duree": 30 }
  ]
}

Avec ce JSON, après chaque exo l'app insère une petite pause libre pendant laquelle l'utilisateur peut taper son ressenti, puis "Suivant" pour enchaîner.

🔄 Enchaînement automatique des côtés (mode_cotes)

Pour les exos avec un champ cotes, le champ optionnel mode_cotes contrôle comment les côtés s'enchaînent :

  • "separe" (défaut) : un step par côté, avec pause éventuelle entre eux.
  • "auto" : tous les côtés enchaînés automatiquement en un seul step.

À noter : cotes n'est pas limité à gauche/droite. Tu peux mettre ["bras 1", "bras 2"], ["prise large", "prise neutre", "prise serrée"], ou n'importe quels libellés à enchaîner.

Pour un exo secondes en mode auto : à la fin du chrono d'un côté, l'app joue un bip + un compte à rebours 3s avec le côté suivant affiché, puis relance le chrono. Idéal pour les étirements bilatéraux.

{
  "nom": "Fléchisseurs des hanches",
  "type": "secondes",
  "duree": 20,
  "cotes": ["gauche", "droite"],
  "mode_cotes": "auto",
  "series": 3,
  "pause_entre_series_sec": 60,
  "series_auto": true,
  "conseil": "Bassin vers l'avant, dos non cambré."
}

Déroulement : gauche 20s + transition 3s + droite 20s, pause 60s, puis répété 3 fois en tout.

Pour un exo reps en mode auto : un seul step. objectif_mode précise si l'objectif est total ou par côté.

{
  "nom": "Fentes alternées",
  "type": "reps",
  "objectif": 10,
  "objectif_mode": "total",
  "cotes": ["gauche", "droite"],
  "mode_cotes": "auto",
  "conseil": "5 par jambe en alternance, descente lente."
}

Le mode auto n'est pas applicable aux exos custom (ignoré dans ce cas).

4. Programme exemple complet

Voici un programme complet que tu peux télécharger ou copier pour tester l'app, ou comme base pour créer le tien.


        
5. FAQ
🔹 Mes données sont-elles stockées quelque part ?
Non. SportProgLoader est une application 100% côté navigateur, sans serveur. Aucune donnée n'est envoyée nulle part. Le programme que tu charges et le récap que tu génères restent uniquement sur ton appareil.
🔹 Mon programme est sauvegardé entre les séances ?
Non, il faut le recharger à chaque fois (par upload ou copier-coller). En revanche, si tu rafraîchis accidentellement la page pendant une séance, l'app te propose de la reprendre où tu t'étais arrêté.
🔹 Comment partager un programme avec un pote ?
Plusieurs options : envoie-lui directement le fichier .json, ou copie le contenu et envoie-le par message (Discord, mail, SMS). Il pourra le charger sur cette même app.
🔹 L'écran s'éteint pendant ma séance, c'est normal ?
L'app utilise l'API Wake Lock pour empêcher l'écran de s'éteindre. Si ça arrive quand même, c'est probablement un réglage système de ton appareil (mode économie d'énergie). Désactive-le ou augmente le délai d'extinction de l'écran.
🔹 Je peux utiliser l'app hors-ligne ?
Pas encore. Il faut une connexion pour charger la page la première fois. Une fois la page chargée, tu peux faire ta séance hors-ligne (rien n'est envoyé), mais il faut que la page soit déjà ouverte.
🔹 Le son ne marche pas ?
Sur certains navigateurs (notamment iOS Safari), le son nécessite une première interaction utilisateur pour s'activer. Clique sur « Démarrer la séance » ou n'importe quel bouton et le son devrait fonctionner. Tu peux aussi le couper avec l'icône 🔊 dans la barre du haut.
🔹 Je peux modifier un programme en cours de séance ?
Non, le programme est figé une fois la séance lancée. Pour ajuster, quitte la séance, modifie ton JSON, recharge-le, redémarre.
🔹 Les durées et le format des pauses sont configurables ?
Oui, tout est piloté par le JSON. Tu changes les valeurs pause_entre_exos_sec, pause_entre_tours_sec, etc. dans ton fichier et l'app applique ces valeurs.
🔹 L'IA me sort un JSON avec des commentaires ou du texte autour, ça plante. Comment faire ?
Copie uniquement le contenu JSON du bloc ```json : il doit commencer par { et finir par }. Si l'IA ajoute des commentaires (//) ou du texte dans le bloc, demande-lui de les retirer.
🔹 À quoi sert le récap de fin de séance ?
À 2 choses principalement :
  1. Garder une trace de ta séance (durée, ressentis, exos passés)
  2. Le coller dans ta conversation avec ton coach IA pour qu'il analyse et ajuste le prochain programme. Les champs ressenti et duree_reelle_sec sont précieux pour calibrer la difficulté.
6. À propos Format v1.0

SportProgLoader est une application web légère, qui fonctionne entièrement dans ton navigateur. Aucune donnée n'est envoyée vers un serveur, tout reste sur ton appareil.

Pour partager l'app : il suffit de partager l'URL. Tout le monde peut l'utiliser avec son propre programme JSON.

Pour signaler un bug ou proposer une amélioration : [contact à compléter ultérieurement]