İçeriğe geç / Skip to content / Zum Inhalt
Ahmet Balaman LogoAhmet Balaman

Wie ich Recapday entwickelt habe: ein Entscheidungsprotokoll von der Idee bis zum Store

Ahmet Balaman
RecapdayFlutterArchitekturFirebasePHPMySQLVibe CodingApp-EntwicklungNebenprojekt
Wie ich Recapday entwickelt habe: ein Entscheidungsprotokoll von der Idee bis zum Store

Das Schwierige beim Bau einer App ist nicht, Code zu schreiben. Das Schwierige ist zu entscheiden, welchen Code man nicht schreibt. Recapday — eine App, in der eine Freundesgruppe zu selbst gewählten Zeiten ein paar Sekunden aufnimmt und am Abend alles zu einem Vlog wird — war dafür ein gutes Beispiel.

In diesem Beitrag geht es um die Entscheidungen, nicht um den Code: was ich gewählt habe, warum, was mich später eingeholt hat und was sich bewährt hat.

Was dabei herauskam:

  • 39 Dart-Dateien, rund 7.400 Zeilen
  • 15 PHP-Dateien, rund 2.000 Zeilen — ohne Framework, ohne Composer
  • 8 MySQL-Tabellen
  • iOS und Android, beide mit Homescreen-Widget

Entscheidung 1: Firebase nur für die Identität

Das war die erste und folgenreichste Entscheidung. Firebase komplett zu nutzen (Auth + Firestore + Storage) wäre der schnellste Weg gewesen. Ich habe es nicht getan.

Der Grund sind die Speicherkosten. Recapday ist eine Video-App: jede Person lädt jeden Tag mehrere Clips hoch. Bei Firebase Storage heißt das eine Rechnung, die mit der Nutzerzahl wächst und schwer vorhersehbar ist. Ein Hostinger-Paket hatte ich ohnehin; Speicher und Traffic lagen dort zum Festpreis bereit.

Die Grenze wurde so gezogen:

  • Firebase Auth → Anmeldung mit Google und Apple. Zu beweisen, wer jemand ist, ist Googles Aufgabe; die schreibe ich nicht neu.
  • Mein eigener PHP- und MySQL-Server → Gruppen, Clips, Kommentare, Reaktionen, Mediendateien. Also alle Daten und alle Kosten.

Der Preis dieser Trennung: der Server muss das Firebase-ID-Token selbst prüfen. Wie das in reinem PHP ohne Composer geht, habe ich in einem eigenen Beitrag beschrieben.

Entscheidung 2: keine sozialen Medien bauen

Der erste Entwurf von Recapday hatte einen Explore-Feed, öffentliche Profile und ein Follower-System. Ich habe alles gelöscht.

Nicht nur der Einfachheit halber. Öffentliche Inhalte bedeuten:

  • Moderation. Melden, Blockieren, eine Prüfschlange.
  • App-Store-Richtlinie 1.2. Apps mit nutzergenerierten Inhalten müssen Melde- und Blockierfunktionen haben.
  • Eine Speicherrechnung, die nicht skaliert.

Geschlossene Gruppen (höchstens 10 Personen, Beitritt per Einladungscode) beseitigen alle drei Punkte. Und sie machen das Produkt besser: wo es keine Follower-Zahl gibt, teilen Menschen tatsächlich ihren gewöhnlichen Alltag.

Lehre: Funktionen zu streichen spart mehr Zeit, als Funktionen hinzuzufügen.

Entscheidung 3: das Aufnahmefenster ist das Produkt

Eine App, in der jeder jederzeit aufnehmen kann, ist nur eine gemeinsame Galerie. Was einen gemeinsamen Moment schafft, ist die Beschränkung.

Das Modell: die Gruppe legt einige Aufnahmezeiten fest (höchstens 8). Nach jeder Zeit öffnet sich ein Fenster; schließt es, ist der Moment vorbei. Wie lange es offen bleibt, wählt die Gruppe ebenfalls — 10 Minuten, 30 Minuten, 1 Stunde oder 2 Stunden. Standard sind 30 Minuten.

Diese Logik liegt auf dem Server, nicht im Client. Die Uhr im Client gehört der Nutzerin oder dem Nutzer; wer die Handyzeit ändert, könnte das Fenster beliebig öffnen. Nach dem Umzug auf den Server habe ich 13 Szenarien lokal getestet, inklusive Mitternachtswechsel und Upload-Karenz. Ein Fenster über Mitternacht (23:50 + 30 Min) schrieb in der ersten Fassung auf den falschen Tag — ohne die Tests hätte ich das nie bemerkt.

Entscheidung 4: niemanden zu etwas zwingen

Mein erster Kamerabildschirm zwang das Handy ins Querformat, damit Videos horizontal werden. Beim Benutzen meiner eigenen App habe ich das gehasst und wieder ausgebaut.

Das Endverhalten: die Oberfläche ist im Hochformat fixiert, die Kamera aber frei. Hoch- oder querformatig aufnehmen, ganz wie man will. Der Vlog-Schritt akzeptiert beides (wie, steht im ffmpeg-Beitrag).

Dasselbe Prinzip beim Auslöser: ein Tippen nimmt auf, Gedrückthalten ebenfalls. Beim Halten zoomt ein Wischen nach oben; ein Doppeltippen wechselt die Kamera — auch mitten in der Aufnahme. Statt zu raten, wie jemand das Handy hält, habe ich jeden Fall unterstützt. Die technischen Details stehen in einem eigenen Beitrag.

Entscheidung 5: den Vlog auf dem Handy rendern, nicht auf dem Server

Die Clips eines Tages zu einem Video zu verbinden heißt, irgendwo ffmpeg laufen zu lassen. Auf Shared Hosting ist das entweder unmöglich oder quälend langsam.

Ich habe das Rendern aufs Handy verlegt. Die Vorteile machen die Entscheidung offensichtlich:

  • Keine CPU-Kosten auf dem Server
  • Die Vlog-Datei wird nie hochgeladen → kein Speicher, kein Traffic
  • Ein Ergebnis, das das Gerät nie verlässt → die Datenschutzaussage stimmt wirklich

Der Preis: ein paar Minuten Rechenzeit auf dem Handy und getrennte ffmpeg-Tests pro Plattform. Ein akzeptabler Preis.

Wie der Name entstand

Die App kam als "Anılog" zur Welt: türkisch anı (Erinnerung) + log. In den Stores war der Name frei, der Paketname wurde als com.anilog festgelegt, und das Programmieren begann. Rund drei Wochen später wurde der Name geändert — und das ist die lehrreichste Entscheidung in diesem Beitrag.

Das Problem waren nicht die Stores, sondern die Suche. Google hält "anılog" für einen Tippfehler von "analog" und korrigiert ihn; Anime-Tracker heißen bereits "AniLog"; und das türkische ı ohne Punkt lässt sich außerhalb der Türkei nicht tippen. Der Name war hübsch, aber unauffindbar. Der neue Name ist Recapday: auch auf Englisch verständlich, reines ASCII, und die Suche danach liefert nichts anderes.

Die Lektion: der sichtbare Name ist billig, die Identität ist teuer. Der Paketname com.anilog, das Firebase-Projekt und die Serverpfade blieben unverändert; niemand sieht sie. Geändert wurden nur Store-Name, UI-Texte und Domain. Den Namen vor der ersten Codezeile festzulegen ist weiterhin richtig — festgelegt werden muss aber der Paketname, nicht die Marke.

Wo kommt KI ins Spiel?

Recapday entstand größtenteils mit KI-Unterstützung — nach der Vibe-Coding-Methode. Keine der fünf Entscheidungen oben hat das Modell getroffen. Beschleunigt hat es:

  • Die erste Fassung eines Bildschirms
  • Das Durchprobieren der ffmpeg-Filterkette (und das Messen der Versuche an echten Dateien)
  • Das Schreiben der PHP-Endpunkte
  • Denselben Bildschirm in drei Sprachen zu bringen

Gar nicht geholfen hat es hier, weil es das nicht kann:

  • Zu entscheiden, welche Funktion gestrichen wird
  • Zu erraten, wie jemand sein Handy hält
  • Zu sehen, wo die Kosten explodieren

Ist diese Grenze klar, beschleunigt KI wirklich. Ist sie es nicht, bekommt man einen Haufen plausibel aussehenden, in sich widersprüchlichen Code.

Aktueller Stand

Recapday wird auf die Store-Einreichung vorbereitet. Datenschutzerklärung und Kontolöschung über das Web sind live, das Datenschutz-Manifest (PrivacyInfo.xcprivacy) und die Verschlüsselungserklärung sind fertig.

Im Rückblick war die wertvollste Gewohnheit, jede Zahl an genau einer Stelle zu halten: Clip-Länge, Gruppengröße, Bearbeitungsfenster, Aufnahmefenster. Alles in einer einzigen Einstellungsdatei auf dem Server. App, Server und Produktseite nennen dieselbe Zahl, weil sie sie an derselben Stelle lesen.

Die weiteren Teile der Serie:

Kommentare