[{"data":1,"prerenderedAt":204},["ShallowReactive",2],{"project-/projects/tempo":3},{"id":4,"title":5,"body":6,"date":179,"description":180,"extension":181,"image":182,"link":183,"meta":184,"navigation":190,"path":191,"seo":192,"stack":193,"stem":202,"__hash__":203},"projects/projects/tempo.md","Tempo",{"type":7,"value":8,"toc":171},"minimark",[9,22,29,34,93,97,104,122,126,164,168],[10,11,12,13,17,18,21],"p",{},"Tempo est une app d'auto-restriction : les apps de divertissement (Instagram, TikTok, YouTube…) sont verrouillées, et chaque minute d'activité physique les rouvre pour un temps donné. C'est ma première application mobile native, publiée sur l'",[14,15,16],"strong",{},"App Store"," le 16 juillet 2026 et sur le ",[14,19,20],{},"Play Store"," le 4 août 2026.",[10,23,24],{},[25,26],"img",{"alt":27,"src":28},"L'écran d'accueil et le journal","/images/Tempo/journal.webp",[30,31,33],"h2",{"id":32},"ce-que-tempo-propose","Ce que Tempo propose",[35,36,37,44,50,56,62,68,74,84,90],"ul",{},[38,39,40,43],"li",{},[14,41,42],{},"Blocage réel par le système"," : sur iOS, ce sont les frameworks Screen Time d'Apple qui posent le verrou. Il tient même app fermée.",[38,45,46,49],{},[14,47,48],{},"Crédit automatique"," depuis Apple Santé ou Health Connect, sans ouvrir l'app : séances (montre, Strava…), pas, calories actives.",[38,51,52,55],{},[14,53,54],{},"Un solde global de minutes"," : tant qu'il est positif, toutes les apps restreintes sont ouvertes ; l'usage le draine ; à zéro, tout se re-verrouille.",[38,57,58,61],{},[14,59,60],{},"Un taux de change réglable",", global ou par sport, avec des profils prêts à l'emploi (Douceur, Équilibré, Sportif, Spartiate).",[38,63,64,67],{},[14,65,66],{},"Zones cardiaques"," : le crédit augmente avec l'intensité mesurée.",[38,69,70,73],{},[14,71,72],{},"Filtre anti-triche"," : les séances saisies à la main dans Santé sont ignorées.",[38,75,76,79,80,83],{},[14,77,78],{},"Apple Watch"," (écran et complications), ",[14,81,82],{},"widgets"," d'accueil et d'écran verrouillé, journal, statistiques, bilan hebdomadaire, série de jours mérités.",[38,85,86,89],{},[14,87,88],{},"Privacy-first"," : aucun backend, aucun compte, label « Data Not Collected ».",[38,91,92],{},"Bilingue français / anglais.",[30,94,96],{"id":95},"le-modèle","Le modèle",[10,98,99,100,103],{},"Tout l'essentiel est gratuit : la boucle complète, tous les sports, blocage illimité d'apps, 60 minutes de déblocage par jour. Le ",[14,101,102],{},"Pro"," ajoute la contrainte plutôt que la capacité : mode strict (desserrer un réglage attend 24 h), plafond quotidien configurable, taux fixe par sport, zones cardiaques, journal complet, bilan détaillé et widgets.",[35,105,106,111,117],{},[38,107,108],{},[14,109,110],{},"4,99 €/mois",[38,112,113,116],{},[14,114,115],{},"34,99 €/an"," (essai de 7 jours)",[38,118,119],{},[14,120,121],{},"79,99 € à vie",[30,123,125],{"id":124},"aspects-techniques","Aspects techniques",[35,127,128,134,140,146,152,158],{},[38,129,130,133],{},[14,131,132],{},"iOS"," : Swift / SwiftUI, iOS 18+. Cinq cibles : l'app, le moniteur DeviceActivity, l'écran de blocage, son action, et les widgets, plus l'app watchOS. APIs : FamilyControls, ManagedSettings, DeviceActivity, HealthKit, CoreMotion, StoreKit 2, WidgetKit, WatchConnectivity. Plus de 1 000 tests.",[38,135,136,139],{},[14,137,138],{},"Android"," : Kotlin / Jetpack Compose, Health Connect, Play Billing, widget Glance. La logique métier vit dans un module Kotlin pur, portée depuis Swift avec les tests iOS comme spécification. Plus de 700 tests.",[38,141,142,145],{},[14,143,144],{},"Le drain"," : DeviceActivity ne délivrant qu'une vingtaine d'événements par activité, le moniteur se ré-arme en boucle par fenêtres d'une minute, calibré sur appareil (43 minutes débitées pour 44 mesurées par Temps d'écran).",[38,147,148,151],{},[14,149,150],{},"Landing"," : Nuxt 4, Tailwind 4, bilingue, génération statique, téléphone 3D en three.js chargé en différé. Hébergée sur un VPS via Docker et Nginx.",[38,153,154,157],{},[14,155,156],{},"Vidéos"," : compositions Remotion pour les formats 9:16, 16:9 et 1:1.",[38,159,160,163],{},[14,161,162],{},"CI"," : Xcode Cloud côté iOS.",[30,165,167],{"id":166},"et-la-suite","Et la suite ?",[10,169,170],{},"L'app évolue au rythme d'une version par semaine ou presque depuis juillet. Le vrai chantier qui reste, ce n'est pas le code : c'est le lancement, qui n'a encore jamais vraiment eu lieu.",{"title":172,"searchDepth":173,"depth":173,"links":174},"",2,[175,176,177,178],{"id":32,"depth":173,"text":33},{"id":95,"depth":173,"text":96},{"id":124,"depth":173,"text":125},{"id":166,"depth":173,"text":167},"2026-07-16T00:00:00.000Z","Tempo verrouille tes apps de distraction, et le sport est la seule clé. Ma première application mobile native, disponible sur l'App Store et le Play Store, sans backend, sans compte, sans collecte de données.","md","/images/Tempo/cover.webp","https://movetempo.app",{"readingTime":185},{"text":186,"minutes":187,"time":188,"words":189},"3 min read",2.135,128100,427,true,"/projects/tempo",{"title":5,"description":180},[194,195,196,197,198,199,200,201],"Swift","SwiftUI","Kotlin","Jetpack Compose","HealthKit","Screen Time API","StoreKit 2","Nuxt.js","projects/tempo","FcYdOmCAKb1TcHqVvr5IIilfPPz0NGZZCrWSdWdedNw",1787859225349]