Tactile
Vérifié en vrai — 145 images en 6 s

Un vrai Android dans votre navigateur, à la minute

Vous ouvrez une session, le téléphone apparaît dans l'onglet : vous touchez, vous tapez, vous installez votre APK. À la fermeture, l'appareil est remis à zéro — l'APK du client précédent n'y est plus.

Sans carte bancaire pour commencer. Paiement sécurisé par Stripe quand vous changez d'offre.

Capture réelle de l'écran du Redmi Note 13 pendant une session Tactile : l'écran de verrouillage, tel qu'il était relayé dans le navigateur
  • Toucherclic = tap
  • Glisserdrag = swipe
  • Texteclavier, Ctrl+V
  • Boutons systèmeAccueil, Retour, Récents
  • Barre d’outilsrotation, volume, veille
  • Sessioncapture, stats, fermer

Capture réelle : l'écran du Redmi du parc, relayé dans le lecteur.

Vérifié en vrai

145 images relayées en 6 secondes, décodées à ~30 images par seconde

Ce n'est pas une estimation de laboratoire : c'est une session réelle, sur un appareil réel, relevée dans le navigateur. Le flux H.264 traverse Tactile octet pour octet — le relais ne le réécrit pas, il le recopie.

  • 145images relayées
  • 6 sde session mesurée
  • 219 kosur le canal
  • ~30 i/simages par seconde
  • 460 × 1024session.ready
  • avc1.640020codec lu dans le SPS
Le lecteur de Tactile pendant la session de vérification : l'écran de l'appareil, la barre d'outils et le champ de texte
Le lecteur pendant la session : l'écran en haut, la barre d'outils et le champ de texte en bas. Capture du produit, pas une maquette.

Ce qui a été mesuré, et ce qui ne l’est pas

  • Une session, un appareil : Redmi Note 13, Android 13. Le reste du parc n’a pas été mesuré de bout en bout.
  • La capture d’écran exige une cible : le socle n’a pas de job « capture l’écran courant », et Tactile répond 400 unsupported_target.
  • Pas d’adb shell : uniquement les actions de la barre d’outils, toutes réversibles.
  • Le flux passe par vpsmain : ~4 Mbit/s par session, 40 Mbit/s à dix sessions. La bande passante du VPS est le facteur limitant.
Questions

Questions fréquentes

Ai-je un `adb shell` ?

Non, pas en v1 : uniquement les actions de la barre d'outils (toucher, clavier, boutons système, rotation, volume, dépôt d'APK, capture, ouverture d'URL). Le shell viendra plus tard, en liste blanche de commandes.

Puis-je capturer l'écran courant ?

Non : une `capture` du socle exige une cible (`package` ou `url`), il n'existe pas de job « capture l'écran courant ». Sans cible, Tactile répond `400 unsupported_target` au lieu de faire semblant. Le lecteur, lui, capture la vue affichée côté navigateur, sans job.

Le logcat est-il un flux continu ?

Non : `GET /api/v1/sessions/:id/logcat` exige un `package` et relance l'application ciblée avec un filtre. Aucune action de contrôle ne donne accès au shell — volontairement.

Puis-je réserver un créneau à l'avance ?

Pas en phase 1 : les réservations de créneaux, le back-office et le presse-papiers sont hors périmètre. Le plafond de sessions simultanées (`max_parallel`) est enregistré sur la clé mais pas appliqué.

Les appareils sont-ils connectés à un compte Google ?

Non : les appareils loués ne sont connectés à aucun compte Google personnel — un compte de service par appareil, ou aucun. Une session ne laisse donc rien derrière elle.

Ce que ça fait

Concrètement

De vrais appareils, pas des émulateurs

Le parc est en France, avec ses vrais constructeurs, ses vrais réseaux et ses vraies polices. Un émulateur rend la page de la même façon pour tout le monde ; un Redmi sous MIUI, non.

Le canal de session, vérifié en vrai

Tactile est le seul produit de la famille mesuré de bout en bout sur un appareil réel : 145 images / 219 ko en 6 s (~30 i/s), `session.ready` 460 × 1024, codec `avc1.640020` reconstruit depuis le SPS. Le flux H.264 est relayé octet pour octet.

Un jeton opaque, jamais la clé API

Le navigateur ne voit qu'un jeton de session opaque ; le bail du client est remplacé par celui de sa session. C'est ce qui empêche un client de regarder ou de piloter l'appareil d'un autre.

Chaque session repart propre

À la fermeture, un job `reset` désinstalle l'APK client, vide les téléchargements et déconnecte les comptes ajoutés pendant la session. Le client suivant ne trouve aucune trace du précédent.

Fin de session sans surprise

Inactivité de 5 min : avertissement puis fermeture. Navigateur fermé brutalement : le bail est libéré en moins de 60 s (grâce de 10 s puis balayage), et les minutes ne sont débitées qu'une fois.

Facturé à la minute

Le débit suit la transition d'état ouverte → fermée : un double appel (route `DELETE` puis balayeur) ne facture pas deux fois. Un plafond de crédits arrête la session avant la surprise.

La main courante

Ce que votre souris envoie à l’appareil

Chaque geste du navigateur devient une action précise côté appareil. Rien ne passe par un shell : ce sont des évènements de contrôle, donc rien ne peut rester cassé après votre session.

La barre d'outils du lecteur de Tactile, capture réelle : Accueil, Retour, Récents, Rotation, Vol +, Vol −, Veille, Réveil, Capture, Stats, Fermer, puis le champ de texte
La barre d’outils du lecteur, telle quelle : les boutons système, les commandes de session, et le champ « Texte à saisir ».
Dans le navigateur Sur l’appareil
Clic ou tap sur l’écran touch down puis up, aux coordonnées de la vidéo ; scrcpy les remet à l’échelle de l’écran réel.
Glisser touch down + move (au plus un toutes les 30 ms) + up : le geste part en continu, pas en saut.
Molette scroll, borné à ±20 unités par événement.
Frappe au clavier les lettres partent en text ; Entrée (66), Retour (67), Suppr (112), flèches, Tab et Échap → Retour partent en key.
Ctrl+V le presse-papiers, tronqué à 500 caractères.
Champ « Texte à saisir » + Envoyer jusqu’à 2 000 caractères d’un seul coup, sans passer par le clavier virtuel.
Barre d’outils Accueil, Retour, Récents, Rotation, Volume +/−, Veille, Réveil : des codes système, pas du shell.
Capture et Stats côté navigateur : l’instantané de la vue affichée et les compteurs (images décodées, file du décodeur, WebSocket, facturation).
Fermer libère l’appareil, déclenche la remise à zéro et débite les minutes consommées — une seule fois.
En toute franchise

Ce que nous ne faisons pas

Un produit qui cache ses limites fait perdre du temps à tout le monde. Voici les nôtres, aujourd'hui.

  • Pas d'`adb shell` brut pour le client : uniquement les actions de la barre d'outils (le shell viendra en liste blanche, plus tard).
  • La capture d'écran exige une cible : « capture l'écran courant » n'existe pas côté socle, et Tactile répond `400 unsupported_target`.
  • Le logcat n'est pas un flux continu : il exige un `package` et relance l'application ciblée.
  • Le plafond de sessions simultanées (`max_parallel`) est enregistré sur la clé mais pas appliqué.
  • Pas de réservations de créneaux, pas de back-office, pas de presse-papiers, pas d'enregistrement vidéo : aucune action de contrôle correspondante côté socle.
  • Vérifié en vrai sur un seul appareil (Redmi Note 13, Android 13) : le reste du parc n'a pas été mesuré de bout en bout.
  • Stripe n'est pas branché : la page de facturation le dit, la route de paiement répond 503, et les crédits se créent à la main.
  • Le flux vidéo traverse vpsmain : à ~4 Mbit/s par session, 10 sessions font 40 Mbit/s. La bande passante du VPS est le facteur limitant.
  • Le SDK du socle n'expose pas encore les baux : Tactile porte `createLease` / `heartbeatLease` / `releaseLease` lui-même en attendant, et le signale.

Ouvrez une session

Créez un compte, prenez une clé, ouvrez un appareil du parc. L'essai donne 60 minutes, sans carte bancaire.