{"id":730,"date":"2026-10-29T10:00:00","date_gmt":"2026-10-29T10:00:00","guid":{"rendered":"https:\/\/zydeno.com\/?p=730"},"modified":"2026-10-29T10:00:00","modified_gmt":"2026-10-29T10:00:00","slug":"portage-dune-application-mobile-vers-une-extension-de-navigateur","status":"publish","type":"post","link":"https:\/\/zydeno.com\/fr\/portage-dune-application-mobile-vers-une-extension-de-navigateur\/","title":{"rendered":"Portage d'une application mobile vers une extension de navigateur"},"content":{"rendered":"<p>KeyRush a vu le jour sur iPhone et Android. Lorsque nous avons d\u00e9cid\u00e9 de le faire passer \u00e0 Chrome, nous avions le choix : encapsuler l\u2019application existante dans une couche multiplateforme, ou la r\u00e9\u00e9crire pour le navigateur. Nous l\u2019avons r\u00e9\u00e9crite, en la portant depuis la version Android. Du JavaScript pur, Manifest V3, sans framework et sans \u00e9tape de compilation. Voici ce que nous avons appris en proc\u00e9dant ainsi.<\/p>\n<h2>Le clavier est d\u00e9sormais une r\u00e9alit\u00e9<\/h2>\n<p>Sur un t\u00e9l\u00e9phone, un logiciel d'apprentissage de la frappe n'est qu'une approximation. Le clavier \u00e0 l'\u00e9cran sert \u00e0 la fois de p\u00e9riph\u00e9rique de saisie et d'objet d'apprentissage, ce qui constitue une situation quelque peu \u00e9trange. Dans le navigateur, l'utilisateur a un v\u00e9ritable clavier sous les doigts \u2014 pr\u00e9cis\u00e9ment ce que l'application tente de lui enseigner.<\/p>\n<p>Cela a chang\u00e9 bien plus que nous ne l'avions pr\u00e9vu. Les dispositions varient d'un pays \u00e0 l'autre et d'un clavier \u00e0 l'autre. Il existe des touches de modification. Les utilisateurs maintiennent des touches enfonc\u00e9es, en appuient sur deux \u00e0 la fois ou changent de disposition en cours de session. Sur un clavier physique, la moindre impr\u00e9cision dans le simulateur se ressent imm\u00e9diatement ; nous avons donc d\u00fb faire preuve d'une bien plus grande rigueur pour d\u00e9terminer ce qui constituait une frappe correcte.<\/p>\n<p>Nous avons conserv\u00e9 le clavier virtuel, mais son r\u00f4le a chang\u00e9. Sur un t\u00e9l\u00e9phone, c\u2019est ce sur quoi on appuie. Dans l\u2019extension, c\u2019est un guide : il met en surbrillance la touche sur laquelle vous devez appuyer ensuite, ce qui vous permet de garder les yeux riv\u00e9s sur l\u2019\u00e9cran plut\u00f4t que sur vos mains. C\u2019est l\u00e0 tout l\u2019int\u00e9r\u00eat de la frappe \u00e0 l\u2019aveugle, et le navigateur nous a permis de prendre cela au s\u00e9rieux.<\/p>\n<h2>Les dimensions des fen\u00eatres ne sont pas fixes<\/h2>\n<p>Les \u00e9crans de t\u00e9l\u00e9phone se d\u00e9clinent en quelques formes diff\u00e9rentes. Les fen\u00eatres de navigateur, quant \u00e0 elles, peuvent prendre n'importe quelle forme. La fen\u00eatre contextuelle d'une extension est \u00e9troite et courte ; un onglet complet peut \u00eatre immense. La m\u00eame application devait s'adapter \u00e0 ces deux formats.<\/p>\n<p>Nous proposons donc les deux options. KeyRush s'ouvre sous forme de fen\u00eatre contextuelle pour un test rapide, et dans un onglet complet lorsque vous souhaitez disposer de plus d'espace pour les le\u00e7ons et les d\u00e9fis. La combinaison Alt+Maj+K permet de l'ouvrir sans avoir \u00e0 utiliser la souris \u2014 ce qui, pour une application de dactylographie, nous a sembl\u00e9 \u00eatre le bon r\u00e9glage par d\u00e9faut.<\/p>\n<h2>Les fen\u00eatres contextuelles oublient tout<\/h2>\n<p>Une fen\u00eatre contextuelle se ferme d\u00e8s que vous cliquez en dehors de celle-ci, et tout ce qu'elle contenait en m\u00e9moire dispara\u00eet avec elle. Sur Android, une application peut \u00eatre mise en arri\u00e8re-plan et reprendre exactement l\u00e0 o\u00f9 elle s'\u00e9tait arr\u00eat\u00e9e. Dans une fen\u00eatre contextuelle, vous devez partir du principe que l'utilisateur peut quitter l'application \u00e0 tout moment.<\/p>\n<p>Ainsi, tout ce qui compte est stock\u00e9 dans la m\u00e9moire du navigateur plut\u00f4t que dans la fen\u00eatre, et la fen\u00eatre contextuelle ainsi que l'onglet complet lisent les m\u00eames donn\u00e9es enregistr\u00e9es. Une fois un test termin\u00e9 dans la fen\u00eatre contextuelle, il suffit d'ouvrir l'onglet complet pour que le r\u00e9sultat s'y trouve d\u00e9j\u00e0. C'est un petit choix architectural qui a permis de rendre l'extension dans son ensemble plus solide.<\/p>\n<h2>Les autorisations rel\u00e8vent d'un choix de conception<\/h2>\n<p>Les applications Android demandent \u00e9galement des autorisations, mais les utilisateurs les lisent rarement. Ce n\u2019est g\u00e9n\u00e9ralement pas le cas des utilisateurs d\u2019extensions, et le navigateur affiche les avertissements directement dans la fen\u00eatre d\u2019installation. KeyRush n\u2019en demande qu\u2019une seule : l\u2019acc\u00e8s au stockage. L\u2019extension n\u2019a pas besoin d\u2019acc\u00e9der aux pages que vous consultez, elle ne vous le demande donc pas. Nous avons r\u00e9dig\u00e9 un article \u00e0 part enti\u00e8re expliquant pourquoi cela est important pour nous.<\/p>\n<h2>Ce que nous avons conserv\u00e9<\/h2>\n<p>La quasi-totalit\u00e9 du produit est rest\u00e9e inchang\u00e9e : des tests de vitesse chronom\u00e9tr\u00e9s de 15, 30, 60 et 120 secondes, des le\u00e7ons de dactylographie organis\u00e9es par doigt, des courses contre des adversaires virtuels, des statistiques, une carte thermique des touches que vous manquez, le d\u00e9fi quotidien et l'ensemble des 44 succ\u00e8s. Une personne passant de la version mobile \u00e0 la version de bureau devrait se sentir \u00e0 l'aise en moins d'une minute.<\/p>\n<p>Nous avons \u00e9galement conserv\u00e9 ces principes. L'application fonctionne enti\u00e8rement hors ligne. La progression est enregistr\u00e9e uniquement dans votre navigateur. Il n'y a pas de compte et aucune connexion n'est requise.<\/p>\n<h2>Pourquoi nous n'avons pas partag\u00e9 notre code<\/h2>\n<p>Une r\u00e9\u00e9criture peut sembler co\u00fbteuse, et \u00e7a l\u2019a \u00e9t\u00e9 \u00e0 certains \u00e9gards. Mais un logiciel d\u2019apprentissage de la frappe n\u2019est pas une application volumineuse, et la logique essentielle \u2014 le syst\u00e8me de points, les le\u00e7ons, les niveaux, les succ\u00e8s \u2014 est suffisamment simple pour \u00eatre port\u00e9e manuellement, avec soin, depuis la version originale Android. En contrepartie, nous avons obtenu une extension qui se charge instantan\u00e9ment, ne d\u00e9pend d\u2019aucun composant tiers n\u00e9cessitant des mises \u00e0 jour, et qui se comporte comme si elle avait \u00e9t\u00e9 con\u00e7ue pour le navigateur, car c\u2019est effectivement le cas.<\/p>","protected":false},"excerpt":{"rendered":"<p>Qu'est-ce qui a chang\u00e9 lorsque KeyRush est pass\u00e9 de Android \u00e0 Chrome \u2014 et ce que nous avons refus\u00e9 de changer.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-730","post","type-post","status-publish","format-standard","hentry","category-journal"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v22.2 (Yoast SEO v22.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Porting a phone app to a browser extension - Zydeno Studio<\/title>\n<meta name=\"description\" content=\"Lessons from porting the KeyRush typing trainer from Android to a Manifest V3 Chrome extension: real keyboards, popups, window sizes and permissions.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zydeno.com\/fr\/portage-dune-application-mobile-vers-une-extension-de-navigateur\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Porting a phone app to a browser extension\" \/>\n<meta property=\"og:description\" content=\"Lessons from porting the KeyRush typing trainer from Android to a Manifest V3 Chrome extension: real keyboards, popups, window sizes and permissions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zydeno.com\/fr\/portage-dune-application-mobile-vers-une-extension-de-navigateur\/\" \/>\n<meta property=\"og:site_name\" content=\"Zydeno Studio\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-29T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/zydeno.com\/wp-content\/uploads\/2026\/10\/zydeno-social.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Andrii Matiushev\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrii Matiushev\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/\"},\"author\":{\"name\":\"Andrii Matiushev\",\"@id\":\"https:\/\/zydeno.com\/#\/schema\/person\/1af4d0e254f05b407f306ede28252259\"},\"headline\":\"Porting a phone app to a browser extension\",\"datePublished\":\"2026-10-29T10:00:00+00:00\",\"dateModified\":\"2026-10-29T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/\"},\"wordCount\":666,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/zydeno.com\/#organization\"},\"articleSection\":[\"Journal\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/\",\"url\":\"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/\",\"name\":\"Porting a phone app to a browser extension - Zydeno Studio\",\"isPartOf\":{\"@id\":\"https:\/\/zydeno.com\/#website\"},\"datePublished\":\"2026-10-29T10:00:00+00:00\",\"dateModified\":\"2026-10-29T10:00:00+00:00\",\"description\":\"Lessons from porting the KeyRush typing trainer from Android to a Manifest V3 Chrome extension: real keyboards, popups, window sizes and permissions.\",\"breadcrumb\":{\"@id\":\"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/zydeno.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Porting a phone app to a browser extension\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/zydeno.com\/#website\",\"url\":\"https:\/\/zydeno.com\/\",\"name\":\"Zydeno Studio\",\"description\":\"Zydeno is an indie studio designing apps across many categories \u2014 united by a shared obsession with craft and detail. Fast, opinionated, independent apps for iPhone, Android, Windows and Mac, plus extensions for Chrome, Edge and Firefox. Built slowly, shipped carefully.\",\"publisher\":{\"@id\":\"https:\/\/zydeno.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/zydeno.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/zydeno.com\/#organization\",\"name\":\"Zydeno Studio\",\"url\":\"https:\/\/zydeno.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/zydeno.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/zydeno.com\/wp-content\/uploads\/2026\/04\/cropped-icon-512-1.png\",\"contentUrl\":\"https:\/\/zydeno.com\/wp-content\/uploads\/2026\/04\/cropped-icon-512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Zydeno Studio\"},\"image\":{\"@id\":\"https:\/\/zydeno.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/zydeno.com\/#\/schema\/person\/1af4d0e254f05b407f306ede28252259\",\"name\":\"Andrii Matiushev\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/zydeno.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4df57b6b4737601c798e728e7d4d209a9a9513422db2b613ff707286cb1ea58a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4df57b6b4737601c798e728e7d4d209a9a9513422db2b613ff707286cb1ea58a?s=96&d=mm&r=g\",\"caption\":\"Andrii Matiushev\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Portage d'une application mobile vers une extension de navigateur - Zydeno Studio","description":"Le\u00e7ons tir\u00e9es du portage du logiciel d'apprentissage de la frappe \u00ab KeyRush \u00bb de l'extension Android vers une extension Manifest V3 Chrome : claviers physiques, fen\u00eatres contextuelles, dimensions des fen\u00eatres et autorisations.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zydeno.com\/fr\/portage-dune-application-mobile-vers-une-extension-de-navigateur\/","og_locale":"fr_FR","og_type":"article","og_title":"Porting a phone app to a browser extension","og_description":"Lessons from porting the KeyRush typing trainer from Android to a Manifest V3 Chrome extension: real keyboards, popups, window sizes and permissions.","og_url":"https:\/\/zydeno.com\/fr\/portage-dune-application-mobile-vers-une-extension-de-navigateur\/","og_site_name":"Zydeno Studio","article_published_time":"2026-10-29T10:00:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/zydeno.com\/wp-content\/uploads\/2026\/10\/zydeno-social.png","type":"image\/png"}],"author":"Andrii Matiushev","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Andrii Matiushev","Dur\u00e9e de lecture estim\u00e9e":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/#article","isPartOf":{"@id":"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/"},"author":{"name":"Andrii Matiushev","@id":"https:\/\/zydeno.com\/#\/schema\/person\/1af4d0e254f05b407f306ede28252259"},"headline":"Porting a phone app to a browser extension","datePublished":"2026-10-29T10:00:00+00:00","dateModified":"2026-10-29T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/"},"wordCount":666,"commentCount":0,"publisher":{"@id":"https:\/\/zydeno.com\/#organization"},"articleSection":["Journal"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/","url":"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/","name":"Portage d'une application mobile vers une extension de navigateur - Zydeno Studio","isPartOf":{"@id":"https:\/\/zydeno.com\/#website"},"datePublished":"2026-10-29T10:00:00+00:00","dateModified":"2026-10-29T10:00:00+00:00","description":"Le\u00e7ons tir\u00e9es du portage du logiciel d'apprentissage de la frappe \u00ab KeyRush \u00bb de l'extension Android vers une extension Manifest V3 Chrome : claviers physiques, fen\u00eatres contextuelles, dimensions des fen\u00eatres et autorisations.","breadcrumb":{"@id":"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zydeno.com\/"},{"@type":"ListItem","position":2,"name":"Porting a phone app to a browser extension"}]},{"@type":"WebSite","@id":"https:\/\/zydeno.com\/#website","url":"https:\/\/zydeno.com\/","name":"Zydeno Studio","description":"Zydeno est un studio ind\u00e9pendant qui con\u00e7oit des applications dans de nombreux domaines, toutes anim\u00e9es par une m\u00eame passion pour le savoir-faire et le souci du d\u00e9tail. Des applications rapides, originales et ind\u00e9pendantes pour iPhone, Android, Windows et Mac, ainsi que des extensions pour Chrome, Edge et Firefox. D\u00e9velopp\u00e9es avec soin, lanc\u00e9es avec minutie.","publisher":{"@id":"https:\/\/zydeno.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zydeno.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/zydeno.com\/#organization","name":"Zydeno Studio","url":"https:\/\/zydeno.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/zydeno.com\/#\/schema\/logo\/image\/","url":"https:\/\/zydeno.com\/wp-content\/uploads\/2026\/04\/cropped-icon-512-1.png","contentUrl":"https:\/\/zydeno.com\/wp-content\/uploads\/2026\/04\/cropped-icon-512-1.png","width":512,"height":512,"caption":"Zydeno Studio"},"image":{"@id":"https:\/\/zydeno.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zydeno.com\/#\/schema\/person\/1af4d0e254f05b407f306ede28252259","name":"Andrii Matiushev","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/zydeno.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4df57b6b4737601c798e728e7d4d209a9a9513422db2b613ff707286cb1ea58a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4df57b6b4737601c798e728e7d4d209a9a9513422db2b613ff707286cb1ea58a?s=96&d=mm&r=g","caption":"Andrii Matiushev"}}]}},"_links":{"self":[{"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/posts\/730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/comments?post=730"}],"version-history":[{"count":1,"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/posts\/730\/revisions"}],"predecessor-version":[{"id":917,"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/posts\/730\/revisions\/917"}],"wp:attachment":[{"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/media?parent=730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/categories?post=730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zydeno.com\/fr\/wp-json\/wp\/v2\/tags?post=730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}