Blog
Feature
3. November 20258 min

TipTap in React Native: mobiler Rich-Text-Editor

Ein Memo ist nicht nur reiner Text. Es ist eine strukturierte Idee: Überschriften, Fettdruck, Aufzählungslisten, Codeblöcke... und vor allem interaktive Checklisten. In einer kollaborativen App wie TAMSIV wird eine Checkliste zu einem echten Werkzeug für die Teamkoordination. Das Problem? Einen vollständigen Rich-Text-Editor in eine React Native App zu integrieren, ist eine technische Herausforderung, der sich nur wenige Entwickler direkt stellen.

Ich habe drei Wochen damit verbracht, diesen Editor zu entwickeln. Drei Wochen voller WebView-Bugs, mobiler Tastaturprobleme und Echtzeit-Synchronisation. Hier ist alles, was ich gelernt habe.

Wichtige Erkenntnisse:
- TipTap funktioniert in React Native über eine WebView mit einer bidirektionalen JSON-Bridge
- Kollaborative Checklisten erfordern zwei Modi: "Single"- und "Everyone"-Validierung
- Die Synchronisation erfolgt auf Ebene einzelner Elemente, nicht des gesamten Dokuments
- Die mobile Tastatur ist die größte technische Herausforderung bei der Integration
- Supabase Realtime ermöglicht Echtzeit-Synchronisation ohne komplexe CRDTs

Warum ein Rich-Text-Editor in einer mobilen App?

Die kurze Antwort: Weil reiner Text nicht ausreicht. Wenn du bei einem Meeting ein Memo schreibst, möchtest du eine Überschrift setzen, eine wichtige Idee hervorheben, eine Aktionsliste erstellen. Ein einfaches TextInput ermöglicht all das nicht.

Ich habe mehrere Optionen evaluiert, bevor ich loslegte. Die Feststellung war einfach: Erfolgreiche Produktivitäts-Apps im Jahr 2026 – Notion, Obsidian, Craft – bieten alle einen Rich-Editor an. Das ist zum Standard geworden. Ein Sprachmemo, das sich in reinen Text verwandelt, ist veraltet.

In TAMSIV dient der Rich-Text-Editor hauptsächlich in den Memos – diesen langen Notizen, die du sprachlich diktierst und dann manuell anreichern möchtest. Die Sprachpipeline generiert strukturierten Text, und der Editor ermöglicht es, diesen anzupassen.

Entwickler-Arbeitsbereich mit einem Laptop, der einen Rich-Text-Editor mit formatiertem Inhalt anzeigt
Der TAMSIV Rich-Text-Editor: vollständige Formatierung direkt auf dem Handy.

Wie funktioniert TipTap in React Native?

TipTap ist ein fantastischer Editor im Web. Er basiert auf ProseMirror, ist erweiterbar, gut dokumentiert und die Community ist aktiv. Das Problem: React Native hat kein DOM. TipTap kann nicht nativ funktionieren.

Die Lösung, die ich gewählt habe: eine WebView, die den kompletten TipTap-Editor einbettet. Die Architektur gliedert sich wie folgt:

  • WebView-Seite: TipTap läuft in einer klassischen Web-Umgebung mit all seiner Leistung
  • Bidirektionale Bridge: Nachrichten werden zwischen React Native und der WebView über postMessage / onMessage ausgetauscht
  • JSON-Serialisierung: Der Inhalt des Editors wird in TipTap-JSON serialisiert, an die Bridge gesendet und dann als HTML in der Datenbank gespeichert

Dieses Muster ist nicht ideal – es fügt eine Schicht Komplexität hinzu – aber es ist das einzige, das einen vollständigen Rich-Editor auf dem Handy ermöglicht, ohne ProseMirror von Grund auf neu zu schreiben.

Welche Funktionen unterstützt der Editor?

Der TAMSIV-Editor unterstützt eine vollständige Reihe von Formatierungen:

  • Überschriften (H1, H2, H3) zur Strukturierung langer Memos
  • Fett und Kursiv zur Hervorhebung
  • Aufzählungs- und nummerierte Listen
  • Codeblöcke für Entwickler (ja, sogar in einer Produktivitäts-App)
  • Interaktive Checklisten – das Herzstück des kollaborativen Systems

Die Wahl war bewusst: keine Tabellen, keine Einbettungen, keine Formeln. Jede hinzugefügte Funktion erhöht die Komplexität der WebView-Bridge und das Fehlerrisiko. Ich habe mich für einen leistungsstarken, aber fokussierten Editor entschieden.

Ist die mobile Tastatur die größte technische Herausforderung?

Ja, ohne Zweifel. Und wenn du schon einmal mit WebViews auf Mobilgeräten entwickelt hast, weißt du, wovon ich spreche.

Das grundlegende Problem: Wenn der Benutzer in die WebView tippt, öffnet sich die native Tastatur des Smartphones. Aber die WebView ist keine native Komponente – sie kommuniziert nicht natürlich mit dem Tastaturverwaltungssystem von Android oder iOS. Das Ergebnis:

  • Der Cursor verschwindet unter der Tastatur
  • Das automatische Scrollen folgt der Eingabe nicht
  • Die Größenänderung der Ansicht ist falsch
  • Auf einigen Android-Geräten schließt und öffnet sich die Tastatur zufällig

Die Lösung erforderte plattformspezifischen Code. Auf Android höre ich auf resize-Ereignisse in der WebView und passe die Höhe manuell an. Auf iOS ist es dank KeyboardAvoidingView etwas vorhersehbarer, aber man muss das Scrollen des Cursors trotzdem manuell verwalten.

Ich habe fast eine ganze Woche nur für Tastaturprobleme aufgewendet. Das ist die Art von Thema, die für den Endbenutzer unsichtbar ist – wenn es funktioniert, merkt es niemand – aber die das Erlebnis ruinieren kann, wenn sie schlecht gehandhabt wird.

Wie funktionieren kollaborative Checklisten?

Checklisten sind der Kern des kollaborativen Werts von TAMSIV. Eine geteilte Einkaufsliste, ein Besprechungsprotokoll mit Aktionen, ein Teamprotokoll – all diese Anwendungsfälle basieren auf Checklisten. Aber eine kollaborative Checkliste funktioniert nicht wie eine persönliche Checkliste.

Smartphone-Bildschirm, der eine mobile Anwendung mit interaktiven Checklisten-Elementen und Kollaborationsindikatoren anzeigt
Kollaborative Checklisten mit individueller oder kollektiver Validierung.

Ich habe zwei Validierungsmodi implementiert:

Modus "Single": Einer reicht aus

Anwendungsfall: "Kaffee kaufen". Das erste Teammitglied, das es tut, hakt den Punkt ab. Fertig. Es ist unnötig, dass alle bestätigen – eine Person reicht aus.

In der Datenbank ist es einfach: ein boolescher Wert is_checked und ein checked_by (UUID des Benutzers). Der erste, der abhakt, "gewinnt".

Modus "Everyone": Alle müssen bestätigen

Anwendungsfall: "Besprechungsprotokoll lesen". Wir wollen sicherstellen, dass jedes Teammitglied gelesen und bestätigt hat. Der Punkt ist erst "erledigt", wenn 100% der Mitglieder abgehakt haben.

In der Datenbank ist es komplexer: Eine Validierungstabelle speichert den Status pro Benutzer und pro Element. Jedes Häkchen ist unabhängig. Die Benutzeroberfläche zeigt einen Fortschrittsbalken ("3/5 haben validiert") und färbt das Element je nach Status unterschiedlich ein.

Dieses doppelte Validierungssystem ist von professionellen Tools wie Jira oder Monday.com inspiriert, aber an eine leichtere Nutzung angepasst – Familiengruppen, kleine Teams, Vereine.

Wie funktioniert die Echtzeit-Synchronisation?

Die Synchronisation ist das letzte Puzzleteil. Wenn zwei Personen gleichzeitig dasselbe Memo bearbeiten oder Elemente abhaken, muss alles konsistent bleiben.

Ich verwende Supabase Realtime, um Änderungen zu verbreiten. Die wichtige technische Entscheidung: Die Synchronisation erfolgt auf Ebene einzelner Elemente, nicht des gesamten Dokuments. Wenn du ein Element abhakt, wird nur dieses Element aktualisiert und verbreitet – nicht das gesamte Memo.

Warum diese Wahl? Weil die Synchronisation eines gesamten Dokuments Merge-Konflikte erzeugt, die ohne ein System vom Typ CRDT (Conflict-free Replicated Data Types) unlösbar sind. CRDTs sind in der Theorie elegant, aber sie fügen eine enorme Komplexität für einen Anwendungsfall hinzu, der sie nicht benötigt.

Mehrere Personen arbeiten an einem gemeinsamen digitalen Dokument auf einem Tablet mit Echtzeit-Bearbeitungsindikatoren zusammen
Echtzeit-Kollaboration: Jede Änderung wird sofort synchronisiert.

Der Synchronisationsablauf:

  1. Der Benutzer hakt ein Element in der WebView ab
  2. Die Bridge sendet die Änderung an React Native
  3. React Native schreibt über den dedizierten Dienst in Supabase
  4. Supabase Realtime verbreitet die Änderung an alle Abonnenten
  5. Die anderen Clients empfangen das Update und aktualisieren ihre WebView

Typische Latenz: 200 bis 500 ms. Das ist kein Google Docs, aber für Checklisten und kollaborative Memos völlig ausreichend. Wichtig ist, dass Änderungen niemals verloren gehen.

Welche Fallstricke gibt es bei TipTap auf Mobilgeräten zu vermeiden?

Nach drei Wochen Integration sind hier die Fallstricke, die ich gerne vor dem Start gekannt hätte:

1. Die Größe des WebView-Bundles. TipTap mit all seinen Erweiterungen wiegt schwer. Ich musste bei den importierten Erweiterungen selektiv sein. Jede ungenutzte Erweiterung erhöhte das Gewicht beim initialen Laden der WebView.

2. Die initiale Ladezeit. Das erste Öffnen des Editors ist langsam (~300ms), weil die WebView geladen, das HTML geparst und TipTap initialisiert werden muss. Ich habe einen Skeleton Loader hinzugefügt, um diese Verzögerung zu kaschieren.

3. Die Speicherverwaltung. WebViews verbrauchen viel Speicher. Auf Einstiegsgeräten (z.B. Android Go) kann das problematisch sein. Ich habe ein Lazy-Loading-System implementiert, das die WebView nur lädt, wenn der Benutzer den Editor tatsächlich öffnet.

4. Tastenkombinationen. Auf Tablets mit externer Tastatur erwarten Benutzer Strg+B für Fettdruck, Strg+I für Kursiv. Diese Tastenkombinationen funktionieren nativ in der TipTap WebView, aber man muss sicherstellen, dass sie nicht von React Native abgefangen werden, bevor sie die WebView erreichen.

5. Kopieren und Einfügen. Der aus dem Editor kopierte Inhalt muss korrekt als Rich-Text UND als reiner Text formatiert sein. TipTap verwaltet dies nativ, aber die WebView-Bridge kann manchmal die Formatierung zerstören.

Wie integriert sich die Sprachpipeline in den Editor?

Hier verbindet sich alles. Die Sprachpipeline von TAMSIV ermöglicht es, ein Memo per Sprache zu diktieren. Die KI transkribiert, strukturiert und generiert formatierten Text. Dieser Text gelangt bereits strukturiert in den TipTap-Editor – mit Überschriften, Listen, manchmal sogar vorab ausgefüllten Checklisten.

Der Benutzer kann den Inhalt dann manuell bearbeiten: eine Checkliste hinzufügen, einen Absatz neu formatieren, einen Codeblock einfügen. Es ist die Kombination aus Sprache und Rich-Editor, die TAMSIV einzigartig macht. Die Sprache für die schnelle Erfassung, der Editor für die Feinabstimmung.

Dieses Muster entspricht dem, was ich im Artikel über das Sprachdiktiergerät erkläre: Sprache ist ein Erfassungswerkzeug, kein Bearbeitungswerkzeug. Der Rich-Text-Editor schließt genau diese Lücke.

Welche Alternativen zu TipTap gibt es für React Native?

Bevor ich mich für TipTap + WebView entschied, habe ich andere Ansätze evaluiert:

  • Natives Markdown: leichter, aber die Bearbeitungserfahrung ist auf Mobilgeräten mittelmäßig. Der Benutzer muss die Markdown-Syntax kennen.
  • React Native Custom mit TextInput: möglich für grundlegenden Fett-/Kursivdruck, aber unhandhabbar für Listen, Codeblöcke und Checklisten.
  • Quill.js in WebView: ähnlich wie TipTap, aber weniger erweiterbar und die Community ist weniger aktiv.
  • Nativer Editor (Swift/Kotlin): die beste Leistung, aber verdoppelt den Entwicklungsaufwand, da zwei Codebasen gepflegt werden müssen.

TipTap + WebView ist der beste Kompromiss: ein einziger Code für beide Plattformen, maximale Erweiterbarkeit und eine aktive Community für Fehler.

Was ich über die technische Schuld von Editoren gelernt habe

Ein Rich-Text-Editor ist die Art von Funktion, die oberflächlich einfach erscheint, aber eine immense Komplexität verbirgt. Jedes neu unterstützte Format (Tabellen, Inline-Bilder, @-Erwähnungen) fügt unvorhergesehene Interaktionen mit dem Rest des Systems hinzu.

Die wichtigste Lektion: Minimal beginnen und schrittweise hinzufügen. Ich habe mit Überschriften + Fettdruck + Listen begonnen. Die Checklisten kamen danach. Die Codeblöcke noch später. Bei jeder Ergänzung habe ich die Stabilität auf beiden Plattformen validiert, bevor ich zum nächsten überging.

Das ist genau dieselbe Philosophie, die ich bei der Refaktorierung der Architektur angewendet habe: eine kontrollierte Komplexität statt einer sich ansammelnden technischen Schuld. Das entspricht auch den Prinzipien, die ich im Artikel über die Restrukturierung der Datenbank detailliert beschreibe.

Wenn du eine mobile App entwickelst und einen Rich-Text-Editor in Betracht ziehst, mein Rat: Beginne damit, die mobile Tastatur zu validieren. Wenn dieser Teil funktioniert, folgt der Rest. Wenn er nicht funktioniert, wird keine Menge an Funktionen das Benutzererlebnis retten.

Der TAMSIV-Editor ist nicht der leistungsstärkste auf dem Markt – Notion und Craft sind besser. Aber er ist ausreichend für den Zielanwendungsfall, er funktioniert im kollaborativen Modus und er integriert sich nativ in die Sprachpipeline. Manchmal ist "ausreichend und zuverlässig" besser als "spektakulär und instabil".

FAQ

Ist TipTap für die kommerzielle Nutzung kostenlos?

Ja. TipTap ist Open Source unter der MIT-Lizenz. Der Kern des Editors und die meisten Erweiterungen sind kostenlos. Nur bestimmte "Pro"-Erweiterungen (erweiterte Zusammenarbeit, Kommentarverwaltung) sind kostenpflichtig, aber für die meisten Anwendungsfälle nicht erforderlich.

Funktioniert der Editor offline?

Der Editor selbst funktioniert perfekt offline, da er in einer lokalen WebView läuft. Nur die Echtzeit-Synchronisation erfordert eine Verbindung. Änderungen werden in eine Warteschlange gestellt und synchronisiert, sobald das Netzwerk wieder verfügbar ist.

Was ist der Unterschied zwischen einer "Single"- und einer "Everyone"-Checkliste?

Im "Single"-Modus muss nur ein Mitglied abhaken, um den Punkt zu validieren (z.B. "Kaffee kaufen"). Im "Everyone"-Modus muss jedes Mitglied einzeln abhaken (z.B. "CR lesen"). Der Modus ist pro Element im Editor konfigurierbar.

Ist die Leistung auf Einstiegsgeräten ausreichend?

Ja, mit Vorsichtsmaßnahmen. Das Lazy Loading der WebView verhindert, dass der Editor geladen wird, solange er nicht benötigt wird. Auf den bescheidensten Geräten kann die anfängliche Öffnungszeit bis zu 500 ms betragen, aber die Bearbeitung bleibt nach dem Laden flüssig.

Warum kein CRDT für die Synchronisation verwenden?

CRDTs (wie Yjs oder Automerge) sind leistungsstark, fügen aber eine erhebliche Komplexität hinzu. Für Checklisten und kollaborative Memos ist die elementweise Synchronisation über Supabase Realtime ausreichend und viel einfacher zu warten.