{"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":"portierung-einer-smartphone-app-in-eine-browser-erweiterung","status":"publish","type":"post","link":"https:\/\/zydeno.com\/de\/portierung-einer-smartphone-app-in-eine-browser-erweiterung\/","title":{"rendered":"Portierung einer Smartphone-App in eine Browser-Erweiterung"},"content":{"rendered":"<p>KeyRush startete auf iPhone und Android. Als wir beschlossen, es auf Chrome zu portieren, standen wir vor der Wahl: Entweder die bestehende App in eine plattform\u00fcbergreifende Schicht zu verpacken oder sie f\u00fcr den Browser neu zu schreiben. Wir haben sie neu geschrieben und dabei von der Android-Version portiert. Reines JavaScript, Manifest V3, kein Framework und kein Build-Schritt. Hier sind die Erkenntnisse, die wir dabei gewonnen haben.<\/p>\n<h2>Die Tastatur ist jetzt echt<\/h2>\n<p>Auf einem Smartphone ist ein Tipptrainer nur eine Ann\u00e4herung. Die Bildschirmtastatur ist gleichzeitig Eingabeger\u00e4t und Lernobjekt, was eine etwas seltsame Situation darstellt. Im Browser hat der Nutzer eine echte Tastatur unter den Fingern \u2013 genau das, was die App ihm beibringen will.<\/p>\n<p>Das hat sich st\u00e4rker ver\u00e4ndert, als wir erwartet hatten. Die Tastaturlayouts unterscheiden sich je nach Land und Ger\u00e4t. Es gibt Modifikatortasten. Die Nutzer halten Tasten gedr\u00fcckt, dr\u00fccken zwei Tasten gleichzeitig oder wechseln mitten in einer Sitzung das Layout. Auf einer physischen Tastatur macht sich jede noch so kleine Ungenauigkeit im Trainer sofort bemerkbar, sodass wir viel sorgf\u00e4ltiger darauf achten mussten, was als korrekter Tastenanschlag gilt.<\/p>\n<p>Wir haben die Bildschirmtastatur beibehalten, aber ihre Funktion hat sich ge\u00e4ndert. Auf einem Smartphone dr\u00fcckt man darauf. In der Erweiterung dient sie als Orientierungshilfe: Sie hebt die Taste hervor, die man als N\u00e4chstes dr\u00fccken sollte, sodass man den Blick auf den Bildschirm richten kann, anstatt auf die H\u00e4nde. Das ist der Sinn des Blindschreibens, und der Browser hat es uns erm\u00f6glicht, dies ernst zu nehmen.<\/p>\n<h2>Die Fenstergr\u00f6\u00dfen sind nicht fest vorgegeben.<\/h2>\n<p>Smartphone-Bildschirme gibt es in einer Handvoll Formen. Browserfenster hingegen k\u00f6nnen jede erdenkliche Form haben. Ein Popup-Fenster einer Erweiterung ist schmal und kurz; ein vollst\u00e4ndiger Tab kann hingegen riesig sein. Dieselbe App musste in beiden F\u00e4llen sinnvoll funktionieren.<\/p>\n<p>Deshalb bieten wir beides an. KeyRush \u00f6ffnet sich als Popup-Fenster f\u00fcr einen schnellen Test und als vollwertiger Tab, wenn du Platz f\u00fcr Lektionen und Wettl\u00e4ufe brauchst. Mit Alt+Umschalt+K l\u00e4sst es sich \u00f6ffnen, ohne zur Maus greifen zu m\u00fcssen \u2013 was mir f\u00fcr eine Tipp-App als die richtige Standardeinstellung erschien.<\/p>\n<h2>Popups vergessen alles<\/h2>\n<p>Ein Popup-Fenster wird geschlossen, sobald man au\u00dferhalb davon klickt, und alles, was es im Speicher belegt hat, verschwindet ebenfalls. Bei Android kann eine App in den Hintergrund verschoben werden und genau dort wieder aufgerufen werden, wo sie aufgeh\u00f6rt hat. Bei einem Popup-Fenster muss man davon ausgehen, dass der Nutzer jeden Moment verschwinden k\u00f6nnte.<\/p>\n<p>Alles, was wichtig ist, wird also im Browserspeicher statt im Fenster abgelegt, und sowohl das Popup als auch der vollst\u00e4ndige Tab lesen denselben gespeicherten Zustand aus. Beendet man einen Test im Popup und \u00f6ffnet anschlie\u00dfend den vollst\u00e4ndigen Tab, ist das Ergebnis bereits vorhanden. Es ist eine kleine architektonische Entscheidung, die dazu gef\u00fchrt hat, dass sich die gesamte Erweiterung solider anf\u00fchlt.<\/p>\n<h2>Berechtigungen sind eine Designentscheidung<\/h2>\n<p>Auch Android-Apps fordern Berechtigungen an, doch die Nutzer lesen diese selten. Nutzer von Browser-Erweiterungen tun dies hingegen oft, und der Browser zeigt die Warnungen direkt in der Installationsaufforderung an. KeyRush fordert genau eine Berechtigung an: Speicherzugriff. Da die App keinen Einblick in die von Ihnen besuchten Seiten ben\u00f6tigt, fragt sie nicht danach. Wir haben einen separaten Beitrag dar\u00fcber verfasst, warum uns das wichtig ist.<\/p>\n<h2>Was wir behalten haben<\/h2>\n<p>Fast das gesamte eigentliche Produkt blieb unver\u00e4ndert: zeitgesteuerte Geschwindigkeitstests von 15, 30, 60 und 120 Sekunden, nach Fingern gegliederte Blindschreib\u00fcbungen, Wettl\u00e4ufe gegen Computergegner, Statistiken, eine Heatmap der Tasten, die man verfehlt, die t\u00e4gliche Herausforderung und alle 44 Erfolge. Wer vom Smartphone auf die Erweiterung umsteigt, sollte sich innerhalb einer Minute zurechtfinden.<\/p>\n<p>Auch an diesen Grunds\u00e4tzen haben wir festgehalten. Die Anwendung funktioniert vollst\u00e4ndig offline. Der Fortschritt wird ausschlie\u00dflich in Ihrem Browser gespeichert. Es gibt kein Konto und Sie m\u00fcssen sich nirgendwo anmelden.<\/p>\n<h2>Warum wir keinen Code geteilt haben<\/h2>\n<p>Eine Neuprogrammierung klingt aufwendig, und in gewisser Weise war sie das auch. Aber ein Tipptrainer ist keine gro\u00dfe App, und die wesentlichen Funktionen \u2013 Punktestand, Lektionen, Levels, Erfolge \u2013 sind \u00fcberschaubar genug, um sie sorgf\u00e4ltig von Hand aus dem Android-Original zu portieren. Im Gegenzug erhielten wir eine Erweiterung, die sofort geladen wird, keine Abh\u00e4ngigkeiten von Drittanbietern hat, die aktualisiert werden m\u00fcssen, und sich so verh\u00e4lt, als w\u00e4re sie f\u00fcr den Browser gemacht \u2013 denn das ist sie auch.<\/p>","protected":false},"excerpt":{"rendered":"<p>Was sich ge\u00e4ndert hat, als KeyRush von Android auf Chrome umgestellt hat \u2013 und was wir nicht \u00e4ndern wollten.<\/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\/de\/portierung-einer-smartphone-app-in-eine-browser-erweiterung\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/portierung-einer-smartphone-app-in-eine-browser-erweiterung\/\" \/>\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=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrii Matiushev\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"3\u00a0Minuten\" \/>\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\":\"de\",\"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\":\"de\",\"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\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/zydeno.com\/#organization\",\"name\":\"Zydeno Studio\",\"url\":\"https:\/\/zydeno.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@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\":\"de\",\"@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":"Portierung einer Smartphone-App in eine Browser-Erweiterung \u2013 Zydeno Studio","description":"Erkenntnisse aus der Portierung des KeyRush-Tipptrainers von Android auf eine Manifest-V3-Erweiterung namens Chrome: echte Tastaturen, Popups, Fenstergr\u00f6\u00dfen und Berechtigungen.","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\/de\/portierung-einer-smartphone-app-in-eine-browser-erweiterung\/","og_locale":"de_DE","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\/de\/portierung-einer-smartphone-app-in-eine-browser-erweiterung\/","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":{"Verfasst von":"Andrii Matiushev","Gesch\u00e4tzte Lesezeit":"3\u00a0Minuten"},"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":"de","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":"Portierung einer Smartphone-App in eine Browser-Erweiterung \u2013 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":"Erkenntnisse aus der Portierung des KeyRush-Tipptrainers von Android auf eine Manifest-V3-Erweiterung namens Chrome: echte Tastaturen, Popups, Fenstergr\u00f6\u00dfen und Berechtigungen.","breadcrumb":{"@id":"https:\/\/zydeno.com\/porting-a-phone-app-to-a-browser-extension\/#breadcrumb"},"inLanguage":"de","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 ist ein Indie-Studio, das Apps in vielen verschiedenen Kategorien entwickelt \u2013 verbunden durch eine gemeinsame Leidenschaft f\u00fcr Handwerkskunst und Detailtreue. Schnelle, eigenwillige und unabh\u00e4ngige Apps f\u00fcr iPhone, Android, Windows und Mac sowie Erweiterungen f\u00fcr Chrome, Edge und Firefox. Langsam entwickelt, sorgf\u00e4ltig ver\u00f6ffentlicht.","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":"de"},{"@type":"Organization","@id":"https:\/\/zydeno.com\/#organization","name":"Zydeno Studio","url":"https:\/\/zydeno.com\/","logo":{"@type":"ImageObject","inLanguage":"de","@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":"de","@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\/de\/wp-json\/wp\/v2\/posts\/730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zydeno.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zydeno.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zydeno.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zydeno.com\/de\/wp-json\/wp\/v2\/comments?post=730"}],"version-history":[{"count":1,"href":"https:\/\/zydeno.com\/de\/wp-json\/wp\/v2\/posts\/730\/revisions"}],"predecessor-version":[{"id":917,"href":"https:\/\/zydeno.com\/de\/wp-json\/wp\/v2\/posts\/730\/revisions\/917"}],"wp:attachment":[{"href":"https:\/\/zydeno.com\/de\/wp-json\/wp\/v2\/media?parent=730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zydeno.com\/de\/wp-json\/wp\/v2\/categories?post=730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zydeno.com\/de\/wp-json\/wp\/v2\/tags?post=730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}