Blog
Du prototype au produit : Le parcours de developpement de Tactic Remote
13 jalons en 8 semaines ont fait passer Tactic Remote d'une preuve de concept tmux a un outil de developpement a distance pret pour la production. Voici l'histoire complete de ce parcours.
Suivez les mises à jour produit et ingénierie de cette catégorie.
Voir la catégorieTactic Remote a commence comme une question debut janvier 2026 : et si on pouvait verifier une session Claude Code en cours depuis son telephone ? Cette question est devenue un prototype en un week-end, un outil utilisable en deux semaines, et un produit avec 13 jalons acheves avant que nous ne publiions notre premiere version numerotee. Voici l'histoire de cet arc de developpement — ce que nous avons construit, ce que nous avons jete, et ce que nous avons appris en livrant vite sans livrer du casse.
Le prototype du week-end (Debut janvier 2026)
La premiere version de Tactic Remote comptait environ 200 lignes de code. Un script shell lancait Claude Code dans une session tmux, un serveur Python Flask exposait un endpoint qui executait tmux capture-pane et retournait la sortie en texte brut, et une app iOS basique interrogeait cet endpoint toutes les 2 secondes et affichait le resultat dans une vue texte a espacement fixe.
C'etait moche et lent. Le modele d'interrogation signifiait 2 secondes de latence a chaque mise a jour. La capture en texte brut perdait toute la mise en forme. Il n'y avait pas d'authentification — n'importe qui sur le meme reseau Wi-Fi pouvait lire votre terminal. Mais cela prouvait le concept : on pouvait suivre de maniere significative une session de codage IA depuis l'ecran d'un telephone.
Ce prototype a survecu environ 4 jours avant que nous ne commencions a reconstruire.
Architecture par jalons
Nous avons adopte un modele de developpement base sur les jalons plutot que des sprints calendaires. Chaque jalon avait un objectif technique specifique, une definition du termine et pas de date limite fixe. Cela nous permettait de livrer quand quelque chose etait pret plutot qu'a la fin d'un sprint. En pratique, les jalons duraient en moyenne 4 a 5 jours, bien que certains n'aient pris que 2 jours et un ait necessite pres de deux semaines.
Voici la progression condensee :
Jalons 1-3 : Fondation. Remplacer Flask par un serveur integre natif Swift. Etablir WebSocket pour le streaming en temps reel au lieu de l'interrogation HTTP. Implementer l'authentification par token. Apres le Jalon 3, nous avions un systeme fonctionnel ou l'iPhone recevait les mises a jour du terminal en 200ms et l'acces non autorise etait bloque.
Jalons 4-5 : Gestion des sessions. Support de plusieurs sessions tmux simultanees. Construction du cycle de vie des sessions (creation, surveillance, veille, completion, nettoyage). Ajout de la persistance des sessions apres redemarrage de l'app compagnon en se reconnectant aux sessions tmux existantes au demarrage. C'est a ce moment que Tactic Remote a cesse d'etre une demo pour devenir utilisable pour du vrai travail.
Jalons 6-7 : Humain dans la boucle. Integration avec le systeme de hook de Claude Code pour intercepter les demandes d'approbation. Construction de l'interface d'approbation sur iOS — afficher ce que l'IA veut faire, montrer le contexte pertinent et fournir des actions approuver/rejeter. Ajout des notifications push pour que les approbations ne necessitent pas que l'app soit ouverte. Ces deux jalons furent le point de bascule. Avant eux, Tactic Remote etait un visualiseur de terminal. Apres, c'etait une surface de controle.
Jalons 8-9 : Robustesse de connexion. Gestion des basculements Wi-Fi vers cellulaire. Implementation de la reconnexion automatique avec backoff exponentiel. Ajout d'indicateurs de qualite de connexion. Construction du flux de connexion rapide par QR code pour eliminer la saisie manuelle d'IP et de token. Le Jalon 9 fut le jalon individuel le plus difficile — les cas limites reseau sur iOS sont nombreux et mal documentes.
Jalons 10-11 : Cloudflare Tunnel. Integration de cloudflared comme processus enfant gere. Construction de l'architecture de connexion bi-mode (local et tunnel). Gestion de la surveillance de sante du tunnel, du redemarrage automatique et du repli gracieux. Ajout de l'URL du tunnel a la generation du QR code.
Jalons 12-13 : Preparation pour la production. Localisation (7 langues). Prevention de la mise en veille du Mac. Peaufinage de l'interface de la barre de menus. Rapports de plantage et diagnostics. Optimisation des performances pour reduire l'empreinte memoire d'environ 60 Mo a moins de 25 Mo au repos. Audit de securite final des couches d'authentification et de transport.
Decisions techniques cles
Plusieurs decisions prises durant le developpement ont defini le caractere du produit :
tmux plutot que la gestion PTY personnalisee
Nous avons debattu longuement de ce sujet durant le Jalon 1. La gestion PTY personnalisee nous donnerait un controle plus fin sur la capture du terminal et eliminerait la dependance a tmux. Mais cela signifierait aussi reimplementer la persistance des sessions, l'emulation de terminal et la gestion du cycle de vie des processus — des problemes que tmux resout depuis 15 ans. Nous avons choisi de nous appuyer sur cette fondation plutot que de la reconstruire.
WebSocket plutot que Server-Sent Events
Pour le streaming en temps reel, les deux protocoles fonctionnent. Nous avons choisi WebSocket parce que nous avions besoin d'une communication bidirectionnelle — l'iPhone envoie des commandes et des approbations au Mac, il ne recoit pas seulement la sortie du terminal. SSE aurait necessite un canal separe pour la communication montante, ajoutant de la complexite.
Serveur integre plutot que daemon autonome
Un daemon autonome (gere par launchd) aurait ete plus "correct" du point de vue de l'architecture macOS. Mais il aurait double la complexite d'installation et cree une categorie de bugs "le serveur tourne mais l'app non". Integrer le serveur dans l'app de barre de menus signifie une seule chose a installer, une seule chose a executer, une seule chose a quitter.
Token statique plutot qu'OAuth/authentification par session
Le modele de menace de Tactic Remote est simple : empecher l'acces non autorise depuis le reseau. Un token aleatoire cryptographique de 256 bits stocke dans le Trousseau atteint cet objectif sans la complexite du renouvellement de token, de l'expiration de session ou des flux de connexion. Pour les cas d'utilisation en entreprise necessitant une authentification par utilisateur, nous recommandons Cloudflare Access comme couche externe.
Interrogation tmux plutot que surveillance du systeme de fichiers
Nous interrogeons tmux capture-pane a des intervalles de 200ms plutot que d'utiliser des APIs de notification du systeme de fichiers (kqueue/FSEvents) sur un PTY. Cela semble peu elegant, mais la commande capture de tmux est extremement rapide (sub-milliseconde), et la surveillance du systeme de fichiers sur les peripheriques PTY s'est revelee peu fiable selon les versions de macOS dans nos tests. L'approche par interrogation a ete solide comme un roc sur macOS 13, 14 et 15.
Ce que nous avons jete
Tout n'a pas survecu. Quelques coupes notables :
Un client web. Nous avons construit une interface web responsive durant le Jalon 6 qui pouvait tourner dans n'importe quel navigateur. Ca fonctionnait, mais l'experience etait nettement inferieure a une app native — pas de notifications push, pas de reconnexion en arriere-plan, pas de retour haptique sur les approbations. Nous l'avons mise de cote pour nous concentrer sur l'experience iOS native.
Couleurs et formatage du terminal. Les premieres versions tentaient de preserver les codes couleur ANSI et de les afficher sur l'iPhone. Le rendu etait inconsistant et ajoutait une complexite significative au protocole de streaming. Nous sommes passes a un modele de rendu simplifie qui preserve la structure sans tenter une emulation pixel-parfaite du terminal. Le support complet d'ANSI reste dans la feuille de route.
Suggestions automatiques de taches. Nous avons prototype une fonctionnalite ou Tactic Remote suggerait des taches Claude Code basees sur votre activite git recente. C'etait techniquement interessant mais semblait presomptueux — les developpeurs savent sur quoi ils veulent travailler. Nous l'avons retire avant qu'aucun beta testeur ne le voie.
La transition vers le versionnage
Apres le Jalon 13, nous sommes passes du suivi par jalons au versionnage semantique. La premiere version numerotee etait 1.2.0 (pas 1.0.0, car nous avions des builds internes numerotes 1.0 et 1.1 durant les tests fermes et nous ne voulions pas creer de confusion).
La progression depuis : 1.2.0, 1.3.0, 1.4.0, 1.4.2 et 1.5.0-beta.1. Chaque version correspond a un ensemble clair de changements utilisateur documentes dans notre journal des modifications. Le systeme de jalons nous a bien servi durant le prototypage rapide, mais le versionnage semantique communique plus clairement aux utilisateurs qui doivent evaluer le risque de mise a jour.
Ce que nous avons appris
Livrer la plus petite chose utile. Le prototype du week-end etait embarrassant selon tout standard d'ingenierie, mais il a repondu a la seule question qui comptait : surveiller Claude Code depuis un telephone aide-t-il reellement ? Chaque jalon suivant etait une reponse incrementale a "quelle est la prochaine amelioration la plus utile ?"
Le reseau est la partie difficile. Nous avons passe plus de temps sur la fiabilite de connexion que sur tout autre aspect du produit. Basculements Wi-Fi vers cellulaire, reconnexion WebSocket apres la mise en veille, surveillance de sante de Cloudflare Tunnel — chacun de ces sujets a consomme un jalon complet. La capture reelle du terminal et la gestion des sessions etaient comparativement simples.
Les dependances doivent etre ennuyeuses. tmux, cloudflared, Trousseau, IOKit — les technologies dont depend Tactic Remote sont stables et bien documentees. Chaque fois que nous avons envisage d'adopter quelque chose de plus recent ou de plus innovant, nous nous sommes demande si l'option ennuyeuse existante etait suffisamment bonne. Elle l'etait generalement.
Le developpement par jalons fonctionne pour les petites equipes. Sans la charge de la planification de sprint, des stand-ups et du suivi de velocite, nous avancions plus vite. Chaque jalon avait une ligne d'arrivee claire, et nous pouvions ajuster le perimetre en temps reel en fonction de ce que nous apprenions durant l'implementation. Ce modele s'effondre a plus grande echelle, mais pour notre developpement initial, c'etait le bon choix.
Resume chronologique
| Periode | Ce qui s'est passe |
|---|---|
| Debut janvier 2026 | Prototype du week-end : script shell + Flask + app iOS basique |
| 6-20 janvier | Jalons 1-5 : Fondation, WebSocket, sessions |
| 20-29 janvier | Jalons 6-9 : Approbations, notifications push, connexion QR |
| 29 janvier - 10 fevrier | Jalons 10-11 : Integration Cloudflare Tunnel |
| 10-18 fevrier | Jalons 12-13 : Localisation, peaufinage, audit de securite |
| A partir du 18 fevrier | Versionnage semantique : 1.2.0 a 1.5.0-beta.1 |
Huit semaines d'une idee a une beta ouverte. Non pas parce que nous avons coupe les coins, mais parce que nous avons reduit le perimetre sans pitie et construit sur des fondations eprouvees.
Pour un apercu detaille de chaque version publiee, consultez notre Journal des modifications.
Essayez Tactic Remote
Pilotez vos agents de programmation depuis votre téléphone
Connectez-vous à Claude Code, Codex et aux autres agents sur votre Mac, PC Windows ou Linux. Consultez leur progression et envoyez la prochaine instruction depuis votre iPhone ou iPad.