Retour au journal de dev Point d’ingénierie

Point de juillet 2026 : un Desk plus stable, un clavier plus malin en route

Trois choses ce mois-ci : une build corrective de SharkTTY Desk téléchargeable dès aujourd'hui, un point honnête sur ce qui avance côté iPhone et iPad (qui avance — rien de tout cela n'est encore sorti), et un rapport d'étape sur un transport de terminal expérimental. Voici la version ingénierie ; les notes utilisateur, plus courtes, vivent dans Nouveautés.

SharkTTY Desk 0.8.0 — build du 10 juillet (disponible)

C'est une build de suivi du 0.8.0 de la semaine dernière, toujours en version 0.8.0. À télécharger ici.

Le bogue « Arrêter le partage »

Celui-là, nous l'avons rencontré nous-mêmes, à l'usage quotidien. Quand votre écran est visionné, macOS affiche son propre indicateur dans la barre des menus, avec sa propre commande « Arrêter le partage ». Terminer la session depuis — plutôt que depuis SharkTTY — pouvait coincer Desk : le code QR disparaissait, le service se disait en démarrage, et chaque reconnexion échouait, jusqu'à quitter et relancer l'app. Couper puis remettre le contrôle à distance n'y changeait rien. C'est la pire famille de pannes : pas un crash à signaler, juste un service qui cesse silencieusement d'en être un.

Ce qui se passait vraiment : à la fin d'une session, l'agent reconstruit son écouteur réseau pour la connexion suivante, et cette reconstruction doit récupérer le même port local. Or la libération du port de l'ancien écouteur n'était qu'un effet de bord d'un nettoyage interne dont le moment dépendait de la façon dont la session s'était terminée — et sur ce chemin précis, le nettoyage pouvait traîner loin derrière la reconstruction, voire ne jamais aboutir. La reconstruction tentait le bind, trouvait le port encore occupé, abandonnait après une fenêtre de reprises qui s'est révélée plus courte que le nettoyage, et laissait l'agent sans le moindre écouteur. Vu de l'extérieur : « démarrage », pour toujours.

Le correctif transforme cette passation de coïncidence en contrat : l'arrêt libère désormais le port explicitement et confirme la libération avant d'autoriser la reconstruction ; le rebind lui-même est plus patient et journalise chaque tentative, pour qu'un rapport futur se diagnostique depuis la Console. La leçon que nous en tirons : le démontage mérite le même déterminisme que le démarrage. « Le port finira bien par se libérer » n'est pas un contrat.

Affichage de la clé de connexion

Trois petits correctifs d'affichage de la clé de connexion sur le Mac — rien ne change dans la façon dont la clé est générée ou protégée. La clé masquée affiche désormais un espace réservé de longueur fixe plutôt qu'un point par caractère : le masque ne trahit plus la longueur. Les clés personnalisées très longues se réduisent pour tenir sur une ligne au lieu de déborder de la carte (le coupable : un interlettrage qui ne rétrécissait pas avec la police). Et Desk retient d'un lancement à l'autre que vous l'avez masquée — la masquer ne devrait pas être une corvée à répéter chaque matin. La révéler demande toujours Touch ID ou votre mot de passe, comme avant.

Compatibilité inchangée : cette build fonctionne avec SharkTTY 1.6 ou ultérieur sur iPhone et iPad. Si votre app est plus ancienne, la build SharkTTY Desk 0.5.0 reste disponible.

SharkTTY pour iPhone et iPad — en développement

Soyons clairs d'emblée : rien de cette section n'est sorti. C'est ce qui fonctionne déjà dans nos builds de développement, en route vers la prochaine mise à jour de l'App Store — nous préférons vous dire où en sont les choses plutôt que de nous taire jusqu'au lancement.

Le clavier flottant, deuxième acte

Le clavier flottant entame son deuxième acte. Il passe d'une disposition à six — US, UK ISO, JIS japonais, AZERTY français, QWERTZ allemand, espagnole ISO — et ce sont de vraies dispositions, pas des touches réétiquetées : les européennes portent un vrai troisième niveau AltGr (un terminal privé de | { } [ ] \ n'est pas un terminal), les claviers ISO gagnent leur touche supplémentaire près du Maj gauche, et la rangée fn→F1–F12 est mappée par position physique pour chaque disposition. Nous avons écrit un test qui parcourt chaque disposition et prouve que chaque caractère critique du terminal est atteignable — il a attrapé deux touches manquantes pendant le développement, exactement le genre de honte qu'un test doit savoir infliger. Le passage entre clavier flottant, panneau vocal et clavier système loge désormais dans le popover de réglages du clavier lui-même, là où il aurait toujours dû être.

Au-dessus des touches, une nouvelle bande de candidats : des complétions tirées de ce que votre terminal vient d'afficher, des mots tapés dans la session et d'une courte liste de commandes shell usuelles. Tout est calculé sur l'appareil, à partir de texte que votre écran montre déjà — rien ne part nulle part pour produire une suggestion. Le bouton micro du clavier gagne la dictée en maintien (appuyez pour parler) avec aperçu en direct dans cette même bande, et le résultat n'est inséré que lorsque vous le touchez. Ce dernier point est délibéré : un terminal ne pardonne pas les mots mal entendus, la voix ne va donc jamais directement au shell.

Panneau de saisie vocale

Le panneau vocal adopte les manières de fenêtre que le clavier flottant possède déjà : on le déplace, on le redimensionne, on baisse son opacité jusqu'à lire le shell au travers. Un seul jeu de commandes, deux panneaux, aucune surprise.

Des onglets de bureau à distance qui survivent à la coupure

Un correctif de cohérence qui se faisait attendre : déconnecter une session de bureau à distance fermait son onglet, alors que déconnecter une session SSH le gardait avec un bouton de reconnexion. Une même app, deux philosophies. Les onglets Desk se comportent désormais comme les onglets SSH — la déconnexion garde l'onglet, la reconnexion tient en un geste, et fermer un onglet ne se fait que sur l'onglet lui-même.

Robustesse de la synchronisation

Le travail le moins visible du mois, et peut-être le plus important. Vos hôtes, scripts et réglages se synchronisent entre appareils, et pendant tout déploiement vos appareils font tourner un mélange de versions — ce n'est pas un cas limite, c'est l'état normal du monde pendant des semaines autour de chaque sortie. Nous avons refondu la gestion du format de synchronisation pour que les données écrites par une version plus récente traversent une version plus ancienne sans une égratignure : la vieille app conserve ce qu'elle ne comprend pas et le réécrit tel quel, au lieu de s'étrangler ou de l'aplatir en douce dans la forme qu'elle connaît. La règle que nous nous imposons désormais est simple : une vieille app ne doit jamais pouvoir détruire ce qu'une plus récente a écrit. Vous ne verrez jamais cette fonctionnalité — c'est exactement le but.

Expérimental : le transport Eternal Terminal

SharkTTY parle SSH et Mosh. Mosh, c'est ce qui fait qu'un terminal survit à un tunnel ferroviaire — mais il roule sur UDP, et certains réseaux ne laissent tout simplement pas passer l'UDP. Eternal Terminal résout le même problème en TCP pur, et beaucoup de gens font déjà tourner etserver sur leurs machines. Notre position est simple : si vous opérez déjà un serveur qui résout ce problème, vous ne devriez pas avoir besoin de notre infrastructure pour en profiter — c'est à l'app de parler la langue de votre serveur.

Nous avons donc écrit, de zéro et en Rust, un client du protocole ouvert ET ; il boucle désormais le trajet complet face à un vrai etserver : se connecter, taper, couper le lien en pleine session, se reconnecter, ne rien perdre. Il patiente derrière un drapeau expérimental le temps d'accumuler du kilométrage réel ; ensuite, il apparaîtra comme troisième transport au choix par hôte, aux côtés de SSH et Mosh. Si vous faites tourner etserver aujourd'hui et voulez donner des coups de pied dans les pneus à l'ouverture du drapeau, gardez un œil sur ce blog.

Des questions ou des bogues sur tout ça ? Le tableau de retours est le chemin le plus court.