[{"data":1,"prerenderedAt":554},["ShallowReactive",2],{"article-/blog/tempo-ma-premiere-app-ios-et-android":3},{"id":4,"title":5,"body":6,"date":536,"description":537,"extension":538,"image":539,"meta":540,"navigation":546,"path":547,"seo":548,"stem":549,"tags":550,"__hash__":553},"articles/blog/tempo-ma-premiere-app-ios-et-android.md","Tempo, ma première app sur l'App Store et le Play Store",{"type":7,"value":8,"toc":523},"minimark",[9,26,31,38,45,48,64,71,75,78,105,108,115,121,124,138,145,149,156,159,163,225,232,236,279,282,288,292,295,305,316,322,328,346,353,364,374,384,390,396,400,403,427,430,436,440,451,454,465,475,478,493,496,500,503,510,513,516],[10,11,12,13,17,18,21,22,25],"p",{},"Jusqu'ici, tous mes projets étaient des sites ou des SaaS. Développeur web depuis toujours, je n'avais jamais franchi le pas du mobile natif : Swift, Kotlin, les stores, la review d'Apple, tout ça restait un territoire que je regardais de loin. ",[14,15,16],"strong",{},"Tempo",", c'est ma première app publiée sur l'",[14,19,20],{},"App Store"," et sur le ",[14,23,24],{},"Play Store",". Et franchement, c'est une étape dont je suis assez fier, même si, vous allez le voir, elle m'a rappelé à quel point le mobile est une autre planète.",[27,28,30],"h2",{"id":29},"lidée","L'idée",[10,32,33,34,37],{},"On passe en moyenne ",[14,35,36],{},"2 h 30 par jour"," à scroller. Je ne fais pas exception : Instagram, YouTube, X, la boucle infinie du soir sur le canapé. J'ai testé les bloqueurs classiques (Opal, Jomo, Freedom…), et ils ont tous le même défaut : ils opposent la volonté à la tentation. Tu te restreins, point. Et le jour où la volonté flanche, tu désactives le truc en deux tapotements.",[10,39,40,41,44],{},"Tempo part d'un principe différent : ",[14,42,43],{},"tes apps de distraction sont verrouillées, et tes minutes d'activité physique sont la seule façon de les rouvrir."," Tu cours 30 minutes, tu gagnes une heure d'Instagram. Tu ne bouges pas, tu ne scrolles pas. On ne punit pas le scroll, on récompense l'effort, et c'est toi qui fixes le taux de change. Le temps d'écran ne se subit plus, il se mérite.",[10,46,47],{},"Deux choix de positionnement ont tout structuré ensuite :",[49,50,51,58],"ul",{},[52,53,54,57],"li",{},[14,55,56],{},"Ce n'est pas du contrôle parental",", c'est de l'auto-restriction choisie, pour des adultes qui veulent reprendre la main. Le ton est celui d'un coach exigeant mais complice, jamais culpabilisant.",[52,59,60,63],{},[14,61,62],{},"C'est privé, radicalement."," Aucun backend, aucun compte, aucune analytique. Rien ne quitte le téléphone. Le label App Store est « Data Not Collected », et c'est vrai. C'est éthique, c'est un argument rare, et c'est aussi ce qui a fait accepter l'entitlement Apple dont je parle plus bas.",[10,65,66],{},[67,68],"img",{"alt":69,"src":70},"L'écran d'accueil de Tempo","/images/Tempo/home.webp",[27,72,74],{"id":73},"comment-ça-marche","Comment ça marche",[10,76,77],{},"La boucle tient en quatre temps :",[79,80,81,87,93,99],"ol",{},[52,82,83,86],{},[14,84,85],{},"Tu bouges."," Une séance normale, avec ta montre, Strava ou n'importe quelle app qui écrit dans Apple Santé (Health Connect sur Android).",[52,88,89,92],{},[14,90,91],{},"Tempo crédite automatiquement",", même sans ouvrir l'app : HealthKit réveille Tempo à la fin d'une séance, et au fil des pas pendant la journée.",[52,94,95,98],{},[14,96,97],{},"Tu dépenses."," Tant que ton solde de minutes est positif, toutes tes apps restreintes sont ouvertes. Leur usage draine le solde, minute par minute.",[52,100,101,104],{},[14,102,103],{},"À zéro, le téléphone re-verrouille tout seul",", même si Tempo est fermée. Le verrou est tenu par iOS, pas par mon app.",[10,106,107],{},"Un exemple concret avec le profil par défaut (« Équilibré », taux ×2) : 28 minutes de course, ça fait 56 minutes d'écran. 22 minutes de vélo, pondérées à ×0,8 parce que c'est moins intense, ça fait 35 minutes. Et la marche compte pour la moitié, sinon la balade du dimanche financerait la semaine entière. Quatre profils règlent tout d'un tap : Douceur, Équilibré, Sportif, Spartiate. Le dernier n'est jamais présélectionné : une ascèse, ça se choisit.",[10,109,110,111,114],{},"Depuis la dernière version, la ",[14,112,113],{},"fréquence cardiaque"," fait varier le crédit. Le taux du sport est un plancher, le cœur le relève : une minute en zone 5 vaut ×1,75, une minute tranquille en zone 1 vaut ×0,5. Une séance sans montre vaut exactement ce qu'elle vaut sans le réglage. Et sans montre du tout, les pas restent la monnaie de base, 15, 10 ou 5 minutes par tranche de 1 000 pas selon le profil.",[10,116,117],{},[67,118],{"alt":119,"src":120},"Le réglage du taux de conversion","/images/Tempo/conversion.webp",[10,122,123],{},"Deux règles que je ne négocierai jamais :",[49,125,126,132],{},[52,127,128,131],{},[14,129,130],{},"Le crédit se mérite au capteur."," Toute séance saisie à la main dans Santé est ignorée. Sinon l'app se résume à un formulaire.",[52,133,134,137],{},[14,135,136],{},"Les minutes expirent en 24 heures glissantes."," La récompense suit l'effort, pas le calendrier. On ne peut pas faire de réserve pour scroller tout le week-end.",[10,139,140,141,144],{},"Et une chose que j'ai comprise en utilisant ma propre app : le pitch « une minute de sport contre une minute d'écran » est la règle du jeu, mais ce n'est pas le bénéfice réel. En pratique, ",[14,142,143],{},"on gagne toujours plus qu'on ne dépense",". Le solde n'est pas une monnaie, c'est un prétexte pour rater le train du scroll au bon moment. Je croyais échanger du sport contre de l'écran. En vrai, j'ai arrêté de scroller et je me suis mis à bouger.",[27,146,148],{"id":147},"le-pool-global-ou-la-refonte-du-deuxième-jour","Le pool global, ou la refonte du deuxième jour",[10,150,151,152,155],{},"La toute première version bloquait app par app : tu débloquais Instagram pour 20 minutes, puis YouTube pour 15, avec des plafonds individuels. Le 14 juillet, au deuxième jour, j'ai tout jeté pour un ",[14,153,154],{},"pool global"," : un seul solde, toutes les apps ouvertes tant qu'il est positif, tout re-verrouillé à zéro.",[10,157,158],{},"La raison est à la fois technique et produit. Techniquement, l'API d'Apple m'accorde une vingtaine de seuils par activité, pas plus. Côté produit, débloquer app par app, c'est de la friction pure, et une friction qui ne protège de rien : bloqué sur Instagram, tu ouvres TikTok. Le pool global rend l'app presque invisible : tu bouges, tes apps s'ouvrent, tu scrolles, elles se ferment. Aucun écran intermédiaire, aucune modale, aucun bouton « réclamer ».",[27,160,162],{"id":161},"une-timeline-un-peu-folle","Une timeline un peu folle",[49,164,165,175,181,187,193,203,213,222],{},[52,166,167,170,171,174],{},[14,168,169],{},"12 juillet 2026"," : demande de l'entitlement Family Controls, l'autorisation formelle qu'Apple exige pour distribuer une app qui bloque d'autres apps. Le délai annoncé est de deux à six semaines. Accordé ",[14,172,173],{},"le jour même",".",[52,176,177,180],{},[14,178,179],{},"13 juillet"," : premier commit.",[52,182,183,186],{},[14,184,185],{},"16 juillet"," : approuvée sur l'App Store, après un seul aller-retour avec la review (un rejet 3.1.2 sur la mise en avant du prix, corrigé dans la journée).",[52,188,189,192],{},[14,190,191],{},"19, 23 et 27 juillet"," : versions 1.1, 1.2 et 1.3. Quatorze jours, quatre versions publiées.",[52,194,195,198,199,202],{},[14,196,197],{},"Mi-juillet"," : démarrage du portage ",[14,200,201],{},"Android",", en parallèle, dans le même dépôt.",[52,204,205,208,209,212],{},[14,206,207],{},"3 août"," : l'app ",[14,210,211],{},"Apple Watch",", avec ses complications.",[52,214,215,218,219,174],{},[14,216,217],{},"4 août"," : la 1.6 sur l'App Store et, le même jour, la ",[14,220,221],{},"publication sur le Play Store",[52,223,224],{},"Ensuite, une version par semaine ou presque, jusqu'à la 1.10 et ses zones cardiaques.",[10,226,227,228,231],{},"Tout ça avec plus de ",[14,229,230],{},"1 700 tests automatisés"," entre iOS et Android. Une app qui bloque tes apps, tu as intérêt à ce qu'elle soit fiable.",[27,233,235],{"id":234},"la-stack","La stack",[49,237,238,244,253,259,273],{},[52,239,240,243],{},[14,241,242],{},"iOS"," : Swift et SwiftUI, iOS 18 minimum. Cinq cibles : l'app, le moniteur d'activité, l'écran de blocage, son action, et les widgets, plus l'app watchOS. Les frameworks Screen Time d'Apple (FamilyControls, ManagedSettings, DeviceActivity), HealthKit, CoreMotion pour le podomètre, StoreKit 2 pour les achats, WidgetKit, WatchConnectivity. Le projet est généré par xcodegen, la CI tourne sur Xcode Cloud.",[52,245,246,248,249,252],{},[14,247,201],{}," : Kotlin et Jetpack Compose. Il n'existe ",[14,250,251],{},"aucun équivalent de FamilyControls"," sur Android : tous les bloqueurs du marché font la même chose, détecter l'app au premier plan et poser un écran par-dessus. C'est ce que fait Tempo, avec un service au premier plan. Le crédit passe par Health Connect, les achats par Play Billing, le widget par Glance.",[52,254,255,258],{},[14,256,257],{},"Le portage"," : toute la logique métier (le solde, le pool, la conversion, le freemium) est de la logique pure sans dépendance au framework. Elle vit dans un module Kotlin autonome, réécrite depuis Swift quasi ligne à ligne, en utilisant les tests iOS comme spécification. Les suites de tests se répondent nom pour nom.",[52,260,261,264,265,272],{},[14,262,263],{},"La landing"," (",[266,267,271],"a",{"href":268,"rel":269},"https://movetempo.app",[270],"nofollow","movetempo.app",") : Nuxt 4, Tailwind 4, bilingue, générée en statique, avec un téléphone en 3D via three.js chargé en différé. Déployée en Docker sur mon VPS.",[52,274,275,278],{},[14,276,277],{},"Les vidéos"," : Remotion, pour faire du motion design en React. Les clips de la landing et les formats verticaux pour les réseaux sont générés depuis le vrai design system, pas montés à la main.",[10,280,281],{},"Côté design, la direction s'appelle « stade en nocturne » : un stade d'athlétisme la nuit, éclairé aux projecteurs, le solde affiché comme un chrono de panneau. Dark only, un seul accent orange, des chiffres énormes en SF compressée. Une première version « cartes gradient » générique a été rejetée. Les anti-références sont écrites noir sur blanc : dashboards fitness surchargés, esthétique contrôle parental, gamification criarde.",[10,283,284],{},[67,285],{"alt":286,"src":287},"La montre : le solde et les pas restants","/images/Tempo/watch.webp",[27,289,291],{"id":290},"ce-quapple-ne-dit-pas","Ce qu'Apple ne dit pas",[10,293,294],{},"C'est là que j'ai le plus appris, et de loin. Les API Screen Time sont puissantes mais très peu documentées, et chaque limite ci-dessous m'a coûté une session de débogage sur un vrai iPhone. Aucune n'est dans la doc.",[10,296,297,300,301,304],{},[14,298,299],{},"Le budget d'événements est global à l'app."," DeviceActivity permet de poser une vingtaine de seuils d'usage par activité. Mon moteur en consommait 17, en supposant qu'il les avait pour lui seul. Le jour où j'ai ajouté une deuxième activité pour la fonction de pause, il ne restait plus un seul slot : la pause était « monitorée », et son événement n'était ",[14,302,303],{},"jamais délivré",". En silence. Le symptôme parfait, intermittent : petit solde, ça marche, gros solde, cassé.",[10,306,307,310,311,315],{},[14,308,309],{},"Le minimum documenté est parfois refusé."," L'API annonce un intervalle minimum de 15 minutes. Quinze pile est parfois refusé par l'OS, et l'erreur était avalée par un ",[312,313,314],"code",{},"try?"," dans l'extension. Ça marchait avec 19 minutes, c'était cassé à 15. Règle retenue : plancher à 17.",[10,317,318,321],{},[14,319,320],{},"Le shield est en lecture seule."," L'écran de blocage lit parfaitement les données partagées, mais toute écriture est rejetée sans exception ni code d'erreur : la valeur n'arrive jamais. Conséquence directe : quand tu quittes l'écran de blocage par le geste d'accueil, aucune extension n'est prévenue. La statistique « fois où Tempo a tenu la porte » est donc un plancher, et elle est affichée comme telle : « 15+ », au moins. Une contrainte de plateforme assumée dans l'interface plutôt que maquillée.",[10,323,324,327],{},[14,325,326],{},"Une app de temps d'écran ne peut pas lire ton temps d'écran."," L'extension qui affiche ces chiffres vit dans un bac à sable sans réseau ni partage : rien ne remonte dans l'app. C'est voulu par Apple. D'où la première question de l'onboarding : « ton écran, par jour ? ». On est obligé de demander ce que le système sait déjà.",[10,329,330,333,334,337,338,341,342,345],{},[14,331,332],{},"Le moniteur remet son compteur à zéro à chaque armement."," Pour drainer un solde d'une heure avec vingt seuils, il faut ré-armer le moniteur en boucle, et chaque ré-armement repart de zéro. J'ai d'abord tenté de contourner ça avec une « base d'usage » qui reprenait le compteur là où il en était. Résultat mesuré : ",[14,335,336],{},"32 minutes facturées pour 68 minutes d'écran",". Le remède était la maladie. Le drain a été refait à plat les 10 et 11 août et validé sur iPad : ",[14,339,340],{},"43 minutes débitées pour 44 comptées par le Temps d'écran d'iOS",", sur une session qui traversait deux ré-armements. Et la mesure qui a clos l'arbitrage sur la taille des fenêtres : ",[14,343,344],{},"une couture coûte six secondes",", pas une minute. Passer de deux à cinq ré-armements ne change rien au résultat.",[10,347,348,349,352],{},"Au passage, une règle apprise dans la douleur : ",[14,350,351],{},"ne jamais changer l'heure de l'appareil pour tester",". Deux sauts d'horloge ont pollué une matinée entière de mesures.",[10,354,355,358,359,363],{},[14,356,357],{},"Le bug du vélo."," La 1.8 était validée, prête à partir, quand un utilisateur m'a signalé le 6 août que sa sortie à vélo de 35 km lui avait crédité des milliers de pas. Santé n'en avait retenu que 325 ; Tempo en avait compté 7 082. Un iPhone dans la poche prend chaque coup de pédale pour un pas. J'ai refait la sortie moi-même le lendemain, iPhone en poche et montre au poignet, pour mesurer : la cadence ne discrimine rien (le vélo produit ",[360,361,362],"em",{},"moins"," de pas par minute que la marche), la classification d'activité du système n'étiquette qu'un tiers des pas en « vélo », et la déduplication d'Apple protège parfois et parfois non. Ce fil a débloqué trois chantiers d'un coup et fait dérailler ma sortie simultanée iOS et Android.",[10,365,366,369,370,373],{},[14,367,368],{},"Les 48 509 minutes."," Une requête HealthKit livre tout l'historique devenu visible lorsqu'on redonne l'autorisation. Un tap sur « Redonner l'accès » a crédité ",[14,371,372],{},"48 509 minutes d'un coup",", soit environ deux cents séances depuis l'installation, dans un seul événement de journal. Deux garde-fous ont limité la casse (le plafond quotidien et l'expiration à 24 h), mais la série de jours poussée dans iCloud, elle, ne se répare pas seule. Mes cinq tests unitaires étaient verts : aucun ne présentait un historique au moment de l'octroi.",[10,375,376,379,380,383],{},[14,377,378],{},"L'autorisation Santé peut disparaître sans que l'app le sache."," Un jour, sur mon propre iPhone, toutes les lectures ont rendu « non déterminé », sans qu'on sache pourquoi. Ce qui rendait la panne muette : les pas continuaient de créditer via le podomètre, donc l'app ",[360,381,382],{},"paraissait"," marcher. Règle retenue : une app qui lit un capteur système doit savoir dire qu'elle ne le lit plus.",[10,385,386,389],{},[14,387,388],{},"L'iPhone seul voit la moitié des pas."," Sur une même marche, le podomètre de l'iPhone comptait 877 pas là où l'Apple Watch en voyait 1 683. C'est ce qui a justifié de remonter le podomètre de la montre vers l'iPhone dans la 1.7.",[10,391,392,395],{},[14,393,394],{},"Une app watchOS sans icône ne s'installe pas, et personne ne le dit."," Build vert, signature valide, bundle correctement imbriqué, aucune erreur nulle part. Rien sur la montre. La cible n'avait pas de catalogue d'assets, donc pas d'icône, donc pas d'installation. Le simulateur, lui, l'avalait sans broncher depuis le début.",[27,397,399],{"id":398},"et-côté-android","Et côté Android",[10,401,402],{},"Android a ses propres pièges, différents mais pas moins vicieux.",[49,404,405,411,421],{},[52,406,407,410],{},[14,408,409],{},"Le picture-in-picture échappe au drain."," Une vidéo passée en PiP est visible mais pas « reprise » au sens du système : quatre minutes de YouTube en PiP ont débité zéro minute, le solde est resté à 57. Pire, poser l'écran de pause par-dessus YouTube fait passer la vidéo en PiP automatiquement. Le coupe-circuit ouvrait lui-même la porte de sortie.",[52,412,413,416,417,420],{},[14,414,415],{},"Samsung Health rend l'anti-triche aveugle."," Toutes ses séances arrivent avec la même méthode d'enregistrement « inconnue », les vraies comme les saisies à la main. Impossible de les distinguer. Et rien n'arrive du tout tant qu'un consentement n'est pas coché ",[360,418,419],{},"dans"," Samsung Health, sans message ni erreur. L'utilisateur conclura que Tempo est cassé, jamais que Samsung attend une case.",[52,422,423,426],{},[14,424,425],{},"Le faux vert."," Mon harnais de test écrivait 6 000 pas dans Health Connect, et l'agrégation en rendait zéro, parce que Health Connect dédoublonne par liste de priorité et écarte silencieusement les sources absentes de cette liste. Un premier test avait l'air concluant. Sur quatre anomalies trouvées pendant la campagne Android, trois étaient des défauts du harnais, pas du produit. Le seul protocole valable : marcher pour de vrai avec le téléphone.",[10,428,429],{},"Le portage Android a été mis en pause du 8 au 18 août, le temps de régler le bug du vélo côté iOS. Ce n'était pas un retard de parité, c'était une décision : une règle produit qui change touche les deux plateformes, et je ne voulais pas porter deux fois la même correction.",[10,431,432],{},[67,433],{"alt":434,"src":435},"Le journal et les statistiques","/images/Tempo/stats.webp",[27,437,439],{"id":438},"le-modèle-et-pourquoi-je-ne-vends-pas-ce-que-vous-croyez","Le modèle, et pourquoi je ne vends pas ce que vous croyez",[10,441,442,443,446,447,450],{},"Tempo est ",[14,444,445],{},"gratuit"," pour l'essentiel : la boucle complète, tous les sports, un nombre illimité d'apps bloquées, 60 minutes de déblocage par jour, les profils, les bonus, la pondération automatique. Le ",[14,448,449],{},"Pro"," est à 4,99 €/mois, 34,99 €/an avec sept jours d'essai, ou 79,99 € à vie.",[10,452,453],{},"La première grille était à 9,99 / 69,99 / 179,99 €. Hors marché. Je l'ai révisée en me calant entre Jomo (bon marché, indé) et Opal (19,99 $ par mois, 399 $ à vie, jugé abusif par ses propres utilisateurs). Le lifetime est fixé à environ 2,6 fois l'annuel : en dessous de 2,5 il cannibalise l'abonnement, au-dessus de 4 personne ne le prend.",[10,455,456,457,460,461,464],{},"Mais le vrai sujet, c'est ce qu'il y a derrière le mur. Le principe que j'ai fini par formuler : ",[14,458,459],{},"on ne gate pas la capacité, on gate la contrainte."," Personne ne paie pour bloquer ",[360,462,463],{},"plus"," d'apps, c'est un bouton. Les gens paient pour s'empêcher de tricher. Opal vend son mode hardcore, Brick vend un objet physique à 60 € dont l'unique fonction est qu'on ne puisse pas se déverrouiller soi-même. Quelqu'un qui installe une app de blocage a, par définition, déjà échoué avec sa seule volonté.",[10,466,467,468,471,472],{},"D'où le gate principal du Pro : le ",[14,469,470],{},"mode strict",". Durcir un réglage s'applique tout de suite, l'assouplir attend 24 heures. Et 24 heures glissantes, pas « à minuit », parce qu'à 23 h 50 minuit ne coûte rien, et c'est précisément l'heure où l'on craque. La phrase du paywall dit tout : ",[360,473,474],{},"« Tempo gratuit marche, et tu peux l'éteindre. Pro, tu ne peux plus. »",[10,476,477],{},"Le 1ᵉʳ août, j'ai supprimé la limite d'apps du gratuit, code compris. Avec un pool global elle ne limitait rien (on ouvrait l'app d'à côté), et elle empêchait le gratuit de vivre la boucle qui convertit. Un gratuit généreux ne tue pas la conversion, il la fabrique : il faut avoir vécu la boucle, puis s'être surpris à couper Tempo à 23 h, pour vouloir se retirer la clé des mains. Depuis, l'offre ne se présente plus jamais comme un mur, seulement à des moments où le produit vient de tenir sa promesse : à la fin de l'onboarding, quand tu as mérité plus que le plafond ne te laisse dépenser, après trois jours de série, ou quand tu desserres toi-même un réglage.",[10,479,480,481,484,485,488,489,492],{},"Deux fonctionnalités ont été tuées à l'examen, et je tiens à ces deux abandons. La ",[14,482,483],{},"carte de séance partageable"," : le temps d'écran gagné n'est pas un flex, c'est un aveu. Le seul truc partageable sans honte, c'est la discipline, ce qu'on n'a ",[360,486,487],{},"pas"," dépensé, et c'est ce que le streak « jours mérités » mesure. Et la ",[14,490,491],{},"Live Activity"," avec le solde qui fond sur l'écran verrouillé : infaisable sans backend, et surtout anxiogène par nature. Une app anti-compulsion ne met pas un compteur qui descend sous les yeux de son utilisateur. On était en train de recréer l'anxiété qu'on prétend soigner.",[10,494,495],{},"Et pas de promo étudiante, définitivement : une vérification solide passe par un flux hors appareil qui percerait le pitch privacy. La privacy radicale a d'ailleurs un coût que je n'avais pas anticipé : impossible d'afficher le moindre chiffre d'usage sur la landing. Aucune statistique n'existe.",[27,497,499],{"id":498},"ce-que-je-retiens","Ce que je retiens",[10,501,502],{},"Construire, c'était la partie facile. Six jours après la publication, ma seule action marketing était un post sur X. Le plan de lancement (Product Hunt, Reddit, presse Apple) est écrit, et il est intégralement à l'état de plan.",[10,504,505,506,509],{},"Le 11 août, après des mois à croire que le mécanisme était sans équivalent, une demi-heure de recherche m'a appris que le créneau « bouger pour gagner du temps d'écran » était occupé : Steppin, co-fondé par un des fondateurs de Kayak et couvert par la presse américaine, StepStore, une dizaine d'autres. Rien de tout ça ne m'était connu. J'ai décidé de ne jamais revendiquer la primeur, mais la ",[14,507,508],{},"justesse"," : un décompte exact, et un re-verrouillage qui ne demande pas de rouvrir l'app. Les deux défauts que j'ai réparés la semaine du 10 août sont, mot pour mot, ce que les utilisateurs du leader lui reprochent dans leurs avis.",[10,511,512],{},"Le 20 août, j'ai mesuré la landing avec les yeux d'un moteur de recherche : la page d'accueil redirigeait les robots vers la version anglaise, toute URL inconnue renvoyait l'accueil en 200, et surtout la page ne contenait aucun des mots que les gens tapent, ni « bloquer », ni « bloqueur d'applications ». Excellente en conversion, muette en acquisition. Corrigé depuis, avec six guides bilingues.",[10,514,515],{},"Le lancement, le vrai, reste à faire. Mais l'app existe, elle est sur les deux stores, je l'utilise tous les jours, et pour la première fois j'ai un produit qui tient une promesse que le système d'exploitation garantit à ma place.",[10,517,518,519],{},"La fiche projet avec tous les détails, ",[266,520,522],{"href":521},"/projects/tempo","👉 c'est par ici !",{"title":524,"searchDepth":525,"depth":525,"links":526},"",2,[527,528,529,530,531,532,533,534,535],{"id":29,"depth":525,"text":30},{"id":73,"depth":525,"text":74},{"id":147,"depth":525,"text":148},{"id":161,"depth":525,"text":162},{"id":234,"depth":525,"text":235},{"id":290,"depth":525,"text":291},{"id":398,"depth":525,"text":399},{"id":438,"depth":525,"text":439},{"id":498,"depth":525,"text":499},"2026-08-27T10:00:00.000Z","Grosse étape pour moi 📱 Tempo est ma première application mobile native, disponible sur iOS et Android. Elle verrouille les apps de distraction, et le sport est la seule clé. Je vous raconte l'idée, la mécanique, les quatorze jours entre le premier commit et la quatrième version publiée, et tout ce qu'Apple ne dit pas dans sa documentation.","md","/images/Tempo/cover.webp",{"readingTime":541},{"text":542,"minutes":543,"time":544,"words":545},"16 min read",15.84,950400,3168,true,"/blog/tempo-ma-premiere-app-ios-et-android",{"title":5,"description":537},"blog/tempo-ma-premiere-app-ios-et-android",[551,242,201,552],"Mobile","Projet","ftIioqVtBg_8hQOFvv4gaHC8Uxut0JwS1mvOrjEKous",1787859225485]