4.6 KiB
title: Workout Challenge created: 2026-06-07 updated: 2026-06-07 type: app tags: [catalogue, fitness, challenge, gamification, typescript, react, social] confidence: medium contested: false sources: [https://selfh.st/apps/?tag=fitness, https://github.com/MarcusJellinghaus/ChallengeTimer]
Workout Challenge 🏆
Application de défis sportifs gamifiés écrite en TypeScript. Créez des challenges (nombre de répétitions, durée, fréquence), suivez votre progression et comparez-vous à vos amis.
| Métadonnée | Valeur |
|---|---|
| Site web | https://workout-challenge.app/ |
| GitHub | https://github.com/MarcusJellinghaus/ChallengeTimer |
| License | MIT |
| Langage | TypeScript (React + Node.js) |
| Étoiles | ⭐8 (selfh.st rank) |
| Dernière MAJ | 2026-02-14 |
| Catégorie | cat-fitness |
Description
Workout Challenge met l'accent sur la gamification de l'entraînement. Plutôt que de suivre passivement ses routines, l'application propose des défis (challenges) à objectif mesurable : « faire 1000 pompes en 30 jours », « courir 100 km en un mois », « tenir une planche 5 minutes ». Chaque challenge a un tableau de progression, des badges, et peut être partagé.
Fonctionnalités :
- Défis prédéfinis ou création personnalisée
- Tableau de bord avec progression en temps réel
- Badges et récompenses au franchissement d'étapes
- Partage entre amis (lien, pas de réseau social centralisé)
- Timer intégré pour certains types de défis (planche, burpees)
- Statistiques globales
L'architecture est simple : frontend React + TypeScript, backend Node.js + Express + SQLite. L'app est légère, facile à auto-héberger, et fonctionne aussi bien en solo (défis personnels) qu'en petit groupe familial. Le projet a une petite communauté de contributeurs et reste en évolution lente mais régulière.
Note
: peu d'étoiles (⭐8) reflète un projet de niche mais maintenu. Idéal pour qui veut quelque chose de simple et gamifié sans la complexité des gros trackers.
Installation
Via Docker Compose
services:
challenge-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: challenge
POSTGRES_PASSWORD: ${DB_PASSWORD:-changeme}
POSTGRES_DB: challenge
volumes:
- challenge_db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U challenge"]
interval: 10s
timeout: 5s
retries: 5
challenge-api:
image: workout-challenge/api:latest
restart: unless-stopped
depends_on:
challenge-db:
condition: service_healthy
environment:
DATABASE_URL: postgres://challenge:${DB_PASSWORD:-changeme}@challenge-db:5432/challenge
JWT_SECRET: ${JWT_SECRET:-changez-moi}
ports:
- "4000:4000"
challenge-web:
image: workout-challenge/web:latest
restart: unless-stopped
depends_on:
- challenge-api
ports:
- "3000:80"
volumes:
challenge_db:
Installation manuelle
git clone https://github.com/MarcusJellinghaus/ChallengeTimer.git
cd ChallengeTimer
npm install
# Backend
cd backend && npm run db:migrate && npm start
# Frontend (autre terminal)
cd ../frontend && npm install && npm run dev
Configuration
DATABASE_URL: PostgreSQL ou SQLiteJWT_SECRET: authentification- Pas de fichier de configuration : tout se configure dans l'UI
- Les défis se créent depuis l'interface, avec règle de validation (quotidien, hebdomadaire, total)
Alternatives
Open source :
- app-workout-tracker : plus généraliste
- app-wingfit : philosophie similaire
- app-exercise-diary : encore plus minimaliste
- app-wger : référence complète
- Streaks (apps) : la philosophie du « ne pas briser la série »
Propriétaire :
- Fitbit Challenges : si vous avez une Fitbit
- Strava Challenges : liés à l'écosystème Strava
- Nike Run Club : challenges running saisonniers
Sécurité
- Changer
DB_PASSWORDetJWT_SECRET - HTTPS obligatoire via reverse proxy
- Sauvegarder le volume
challenge_dbrégulièrement - Si usage multi-utilisateurs ouvert : rate-limit sur l'API
Ressources
- GitHub : https://github.com/MarcusJellinghaus/ChallengeTimer
- selfh.st : https://selfh.st/apps/?tag=fitness
Pages Liées
- cat-fitness
- recettes-docker-compose
- app-workout-tracker — version généraliste
- app-wingfit — alternative simple
- app-exercise-diary — minimaliste