[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fv3WALz-Kk-ncVTGFQuXQ7CU7omSqNyMruak-j53FgMQ":3},{"id":4,"slug":5,"titleFr":6,"titleEn":7,"titleKm":8,"descriptionFr":9,"descriptionEn":10,"descriptionKm":11,"tags":12,"githubUrl":20,"demoUrl":21,"imageUrl":11,"featured":22,"createdAt":23},50,"chet-health-strong","Suivi pompes quotidien","Daily Pushup Tracker","តាមដានកិច្ចការរាំងដៃប្រចាំថ្ងៃ","## L'idée\n\nDébut janvier 2026, je me suis lancé un défi simple : **faire des pompes tous les jours**. Pas un programme de musculation complexe — juste une habitude quotidienne, mesurable, avec un objectif clair. Et comme je suis développeur, j'ai naturellement construit un écosystème complet pour ça.\n\n## Le concept : gamification à la Duolingo\n\nL'inspiration vient directement de Duolingo et de sa mécanique de **streak** (série de jours consécutifs). Le principe est psychologiquement puissant : une fois qu'on a 30 jours de streak, on ne veut surtout pas casser la chaîne.\n\n## L'application web (portfolio)\n\nLe tracker est d'abord né comme un composant intégré au portfolio :\n- **Un stepper quotidien** : +5 / -5 pompes pour ajuster rapidement\n- **Un calendrier visuel** : chaque jour validé est coché, les jours manqués sont marqués\n- **Un compteur de streak** : le nombre de jours consécutifs sans interruption\n- **Des statistiques** : total, moyenne, progression mensuelle\n\n## L'application Android native\n\nPour rendre la validation encore plus simple au quotidien, j'ai développé une **application Android native en Kotlin** :\n- **Architecture MVVM** avec ViewModel, LiveData et Room pour le cache local\n- **Retrofit 2** pour la synchronisation avec le backend\n- **Widget home screen** : un widget qui affiche le streak et le statut du jour directement sur l'écran d'accueil — impossible de l'ignorer en allumant le téléphone\n- **WorkManager** : synchronisation en arrière-plan toutes les 30 minutes\n- **Swipe to refresh** : pull-to-refresh pour forcer la synchronisation\n- **Light mode** : design épuré avec le même style beige/or que le portfolio\n\n## Authentification Google OAuth\n\nL'application a évolué d'un outil purement personnel vers un système **multi-utilisateur** avec authentification :\n- **Google Sign-In** via Credential Manager sur Android\n- **Vérification stateless** des Google ID Tokens côté backend (compatible serverless Vercel)\n- **Upsert automatique** des utilisateurs à la première connexion\n- **Données scopées** : chaque utilisateur ne voit que ses propres données\n- Pas de sessions, pas de cookies — juste un token dans le header `Authorization: Bearer`\n\n## Progression\n\n- **Janvier 2026** : objectif de 20 pompes/jour — phase d'installation de l'habitude\n- **Février 2026** : passage à 25 pompes/jour — le corps s'adapte, on monte la barre\n- L'objectif augmentera progressivement au fil des mois\n\n## Stack technique\n\n- **Backend** : Nuxt 3 / Nitro, Drizzle ORM, PostgreSQL Neon serverless, déployé sur Vercel\n- **Auth** : Google OAuth 2.0 (google-auth-library)\n- **Android** : Kotlin, MVVM, Retrofit 2, Room 2.6, Credential Manager, WorkManager\n- **Web** : composant Vue avec stepper interactif et calendrier responsive","## The Idea\n\nEarly January 2026, I set myself a simple challenge: **do pushups every day**. Not a complex workout program — just a daily, measurable habit with a clear goal. And since I'm a developer, I naturally built a complete ecosystem for it.\n\n## The Concept: Duolingo-Style Gamification\n\nThe inspiration comes directly from Duolingo and its **streak** mechanics (consecutive day series). The principle is psychologically powerful: once you have a 30-day streak, you really don't want to break the chain.\n\n## The Web App (Portfolio)\n\nThe tracker was first born as a component integrated into the portfolio:\n- **A daily stepper**: +5 / -5 pushups for quick adjustment\n- **A visual calendar**: each validated day is checked, missed days are marked\n- **A streak counter**: consecutive days without interruption\n- **Statistics**: total, average, monthly progression\n\n## The Native Android App\n\nTo make daily validation even simpler, I built a **native Android app in Kotlin**:\n- **MVVM architecture** with ViewModel, LiveData and Room for local caching\n- **Retrofit 2** for backend synchronization\n- **Home screen widget**: a widget that displays the streak and today's status right on the home screen — impossible to ignore when unlocking the phone\n- **WorkManager**: background sync every 30 minutes\n- **Swipe to refresh**: pull-to-refresh to force sync\n- **Light mode**: clean design matching the portfolio's beige/gold style\n\n## Google OAuth Authentication\n\nThe app evolved from a purely personal tool into a **multi-user system** with authentication:\n- **Google Sign-In** via Credential Manager on Android\n- **Stateless verification** of Google ID Tokens on the backend (Vercel serverless compatible)\n- **Automatic upsert** of users on first login\n- **Scoped data**: each user only sees their own data\n- No sessions, no cookies — just a token in the `Authorization: Bearer` header\n\n## Progression\n\n- **January 2026**: target of 20 pushups/day — habit installation phase\n- **February 2026**: up to 25 pushups/day — the body adapts, we raise the bar\n- The target will gradually increase over the months\n\n## Tech Stack\n\n- **Backend**: Nuxt 3 / Nitro, Drizzle ORM, PostgreSQL Neon serverless, deployed on Vercel\n- **Auth**: Google OAuth 2.0 (google-auth-library)\n- **Android**: Kotlin, MVVM, Retrofit 2, Room 2.6, Credential Manager, WorkManager\n- **Web**: Vue component with interactive stepper and responsive calendar",null,[13,14,15,16,17,18,19],"Vue","Nuxt","Kotlin","Android","OAuth","Health","Gamification","https://github.com/chetana/dailypushup","https://chetana.fr/projects/health",true,"2026-03-07T00:52:45.036875"]