Blog
Feature
15. November 20258 min

Wiederkehrende Erinnerungen: Wie man die verborgene Komplexität bewältigt

"Füge jeden Dienstag eine Erinnerung hinzu." Sechs Worte. Leicht gesagt. Aber hinter diesem Satz verbirgt sich eines der am meisten unterschätzten Probleme der App-Entwicklung: Wiederholungsregeln. Ich habe Tage damit verbracht, Grenzfälle zu behandeln, die niemand vorab antizipiert, bevor er auf sie stößt.

Wichtige Erkenntnisse:
- Wiederkehrende Erinnerungen scheinen einfach, bergen aber eine enorme Komplexität (Verwaltung ungleicher Monate, Zeitzonen, Ausnahmen).
- Die hybride Speicherung (Regel für das übergeordnete Element, Vorkommen bei Bedarf generiert) ist der beste Kompromiss zwischen Leistung und Flexibilität.
- Progressive UX – standardmäßig einfach, optional leistungsstark – ist der Schlüssel, um keine Benutzer zu verlieren.
- Ein gutes Wiederholungssystem erfordert mindestens 4 Regeltypen und eine robuste Handhabung von Grenzfallen.

Warum sind wiederkehrende Erinnerungen so komplex zu implementieren?

Wenn du an "wiederkehrende Erinnerung" denkst, stellst du dir wahrscheinlich ein einfaches setInterval oder einen Cron-Job vor. Die Realität ist viel komplizierter. TAMSIV unterstützt vier Arten von Wiederholungen: täglich, wöchentlich, monatlich und benutzerdefiniert. Der tägliche Fall dauert 10 Minuten zum Codieren. Der Fall "der letzte Freitag im Monat"? Tage.

Das grundlegende Problem ist, dass der Kalender nicht regelmäßig ist. Monate haben 28, 29, 30 oder 31 Tage. Wochen überschneiden sich mit Monaten. Schaltjahre existieren. Und Zeitzonen fügen eine zusätzliche Schicht des Chaos hinzu.

Als Solo-Entwickler von TAMSIV musste ich von Anfang an kritische architektonische Entscheidungen treffen, um spätere Refactorings zu vermeiden.

Mobile Anwendung, die einen Kalender mit farbigen wiederkehrenden Erinnerungen und wiederholten Benachrichtigungen anzeigt
Ein gut konzipiertes System für wiederkehrende Erinnerungen muss Dutzende von für den Benutzer unsichtbaren Grenzfallen verwalten.

Wie geht man mit dem Problem des "31. jedes Monats" um?

Das ist der klassische Fall, den jeder Kalenderentwickler fürchtet. Der Benutzer erstellt am 31. Januar eine Erinnerung mit monatlicher Wiederholung. Was passiert im Februar? Im April?

Es gibt drei Ansätze:

  1. Monat überspringen: keine Erinnerung im Februar. Schlechte UX – der Benutzer denkt, es sei ein Fehler.
  2. Auf den letzten Tag verschieben: Die Erinnerung wird auf den 28. (oder 29.) Februar, 30. April usw. verschoben. Das ist intuitiv.
  3. Den 1. des Folgemonats erzwingen: Für bestimmte Fälle logisch, aber verwirrend.

Ich habe Option 2 gewählt – die automatische Verschiebung auf den letzten Tag des Monats. Warum? Weil der Benutzer das erwartet, ohne darüber nachzudenken. Wenn jemand "jeden Monat" sagt, meint er "ungefähr am selben Datum jeden Monat". Pragmatismus schlägt mathematische Strenge.

Diese Wahl hat direkte Auswirkungen auf den Code. Für jedes Vorkommen berechne ich zuerst das theoretische Datum und prüfe dann, ob es im Zielmonat mit Math.min(jourOriginal, dernierJourDuMois) existiert. Oberflächlich einfach, aber es muss für jedes generierte Vorkommen gemacht werden.

Was ist das beste Speichermodell für wiederkehrende Ereignisse?

Das ist die entscheidende architektonische Frage. Zwei Schulen stehen sich gegenüber:

Option A: Alle Vorkommen speichern. Du generierst 365 Zeilen in der Datenbank für eine jährliche tägliche Erinnerung. Vorteil: einfache Abfragen. Nachteil: Explosion der Datenbank und Komplexität bei Änderungen (Änderung der Erinnerungszeit = 365 Zeilen ändern).

Option B: Nur die Regel speichern. Du behältst "jeden Dienstag um 9 Uhr" und berechnest on-the-fly. Vorteil: schlanke Datenbank. Nachteil: komplexe Abfragen, um herauszufinden, "welche Erinnerungen diese Woche anstehen?".

Ich habe mich für ein hybrides Modell in TAMSIV entschieden: Die Wiederholungsregel wird im übergeordneten Ereignis gespeichert, und die Vorkommen werden bei Bedarf generiert. Wenn eine Erinnerung in ein Kalenderereignis umgewandelt wird – zum Beispiel über das Agendasystem mit Filtern – wird ein konkretes Vorkommen in der Datenbank erstellt.

Entwickler arbeitet nachts vor einem Bildschirm, der ein Datenbankschema mit Kalendertabellen anzeigt
Die hybride Speicherung kombiniert das Beste aus beiden Ansätzen: Leichtigkeit der Datenbank und Einfachheit der Abfragen.

Konkret sieht die Datenbankstruktur so aus:

  • Elterntabelle: enthält Titel, Beschreibung und ein JSON-Feld mit der Wiederholungsregel (type, interval, daysOfWeek, endDate)
  • Vorkommenstabelle: wird bei Bedarf erstellt, wenn der Benutzer interagiert (abschließt, verschiebt, ändert)
  • Dynamische Berechnung: Für die Kalenderanzeige werden zukünftige Vorkommen clientseitig berechnet

Dieses hybride Modell vermeidet N+1-Abfragen und hält die Datenbank unter Kontrolle. Mit dem optimierten Caching-System bleibt die Leistung auch bei Hunderten von Erinnerungen hervorragend.

Wie erstellt man eine wiederkehrende Erinnerung per Sprache?

Einer der einzigartigen Vorteile von TAMSIV ist, dass du komplexe Erinnerungen durch natürliches Sprechen erstellen kannst. Die KI-Sprachpipeline analysiert deinen Satz und extrahiert automatisch die Wiederholungsregel.

Konkrete Beispiele:

  • "Erinnere mich daran, die Pflanzen alle 3 Tage zu gießen" → benutzerdefinierte Wiederholung, Intervall 3 Tage
  • "Teammeeting jeden Montag und Mittwoch um 10 Uhr" → wöchentlich, bestimmte Tage
  • "Miete am Ersten jedes Monats bezahlen" → monatlich, fester Tag mit Grenzfallbehandlung
  • "Maries Geburtstag am 15. März jedes Jahr" → jährlich

Das LLM (über OpenRouter) zerlegt den Satz in strukturierte Absichten. Die Funktion create_calendar_event erhält dann ein Objekt mit den bereits extrahierten Wiederholungsparametern. Der Benutzer muss nur noch bestätigen – oder ändern – bevor es in der Datenbank gespeichert wird.

Das ist die Stärke des integrierten Diktiergeräts: die technische Komplexität für den Endbenutzer unsichtbar zu machen.

Welche Fallstricke gibt es bei Zeitzonen mit Erinnerungen?

Wenn du denkst, dass unregelmäßige Monate lästig sind, warte, bis du die Zeitzonen siehst. Eine tägliche Erinnerung um 9 Uhr wird um 9 Uhr Ortszeit ausgelöst. Aber was ist "9 Uhr Ortszeit", wenn der Benutzer reist? Wenn die Sommer-/Winterzeitumstellung stattfindet?

Zwei mögliche Strategien:

  • In UTC speichern und beim Rendern konvertieren: sauber, aber problematisch für "jeden Tag um 9 Uhr" (was je nach Saison 8 Uhr oder 10 Uhr werden kann)
  • In Ortszeit mit Zeitzone speichern: treuer zur Absicht, aber komplexer in der Datenbank zu verwalten

In TAMSIV habe ich mich für die Speicherung in UTC mit der Referenzzeitzone des Benutzers entschieden. Wenn die Vorkommensberechnung auf einen Tag der Zeitumstellung fällt, passt das System an, um die Ortszeit stabil zu halten. Dies ist das Verhalten, das Benutzer von Google Kalender oder Apple Kalender erwarten.

Wie gestaltet man die UX von Erinnerungen, ohne den Benutzer zu überfordern?

Die UX-Herausforderung ist genauso wichtig wie die technische Herausforderung. Wie präsentiert man potenziell komplexe Wiederholungsregeln, ohne den Gelegenheitsnutzer zu verlieren?

Die Antwort: progressives Design (progressive disclosure).

Minimalistische mobile Benutzeroberfläche, die ein UX-Muster der progressiven Offenlegung mit einfachen Optionen und einem erweiterten Panel zeigt
Progressives Design zeigt zuerst die einfachen Optionen und enthüllt dann die Leistung bei Bedarf.

So habe ich es in TAMSIV implementiert:

  1. Stufe 1 – 4 einfache Schaltflächen: Täglich, Wöchentlich, Monatlich, Keine Wiederholung. Deckt 80% der Bedürfnisse ab.
  2. Stufe 2 – Erweitertes Panel: zugänglich über "Anpassen". Wählbare Wochentage, benutzerdefiniertes Intervall (alle N Tage/Wochen/Monate), optionales Enddatum.
  3. Stufe 3 – Komplexe Fälle: "Der letzte Freitag im Monat", "Der 2. Dienstag jedes Monats". Spezialisierte Oberfläche für diese seltenen Regeln.

Das Leitprinzip: standardmäßig einfach, optional leistungsstark. Der Gelegenheitsnutzer sollte sich nie verloren fühlen. Der fortgeschrittene Nutzer sollte sich nie eingeschränkt fühlen. Dieses Prinzip leitet auch das Onboarding-System der App.

Ich habe auch die Navigation per Wischgeste auf den Erinnerungsbildschirmen implementiert, um das Erlebnis flüssiger zu gestalten.

Welchen Unterschied gibt es zu den Erinnerungen von Google Kalender oder Todoist?

Bestehende Lösungen wie Todoist oder Google Kalender verwalten Wiederholungen gut. Aber sie haben alle den gleichen Fehler: die manuelle Eingabe.

Mit TAMSIV ändert die Spracherstellung die Gleichung grundlegend. "Erinnere mich daran, den Bericht jeden Freitag um 17 Uhr zu senden" ist unvergleichlich schneller, als durch 3 Menüs zu navigieren, um dasselbe manuell zu konfigurieren.

Darüber hinaus belohnt das Gamification-System das Abschließen wiederkehrender Erinnerungen, was einen positiven Kreislauf der Produktivität schafft. Jede abgeschlossene wiederkehrende Aufgabe füllt deinen Streak auf und bringt dich dem nächsten Level näher.

Welche Lehren sind aus der Implementierung von Wiederholungen zu ziehen?

Nachdem ich dieses System programmiert habe, sind hier die Lehren, die ich ziehe:

  • Grenzfälle nicht unterschätzen: der "31. des Monats", Schaltjahre, Zeitumstellungen – jeder Fall scheint einzeln selten, aber kollektiv betreffen sie Tausende von Benutzern.
  • Mit echten Daten testen: Unit-Tests reichen nicht aus. Man muss ein ganzes Jahr von Vorkommen simulieren und visuell überprüfen.
  • Das hybride Modell ist der richtige Kompromiss: weder alles in der Datenbank, noch alles berechnet. Die Mischung bietet das Beste aus beiden Welten.
  • Progressive UX rettet Leben: die Komplexität hinter Detailebenen zu verbergen, ist der einzig gangbare Ansatz für eine Massen-App.

Wenn du eine Produktivitäts-App oder ein Kalendersystem entwickelst, unterschätze niemals wiederkehrende Erinnerungen. Was wie eine 2-Tages-Funktion aussieht, kann leicht 10 Tage in Anspruch nehmen.

FAQ

Wie viele Arten von Wiederholungen unterstützt TAMSIV?

TAMSIV unterstützt vier Haupttypen: täglich, wöchentlich, monatlich und benutzerdefiniert. Der benutzerdefinierte Modus ermöglicht die Definition beliebiger Intervalle (alle N Tage, bestimmte Wochentage usw.) und deckt fortgeschrittene Fälle wie "den letzten Freitag im Monat" ab.

Kann man eine wiederkehrende Erinnerung per Sprache erstellen?

Ja, das ist sogar eine der Stärken von TAMSIV. Du kannst sagen "Erinnere mich daran, den Bericht jeden Montag um 9 Uhr zu senden" und die KI versteht automatisch den Wiederholungstyp, den Tag und die Uhrzeit. Es genügt, dies zu bestätigen, damit die Erinnerung erstellt wird.

Was passiert, wenn eine monatliche Erinnerung auf einen Tag fällt, der nicht existiert?

TAMSIV verschiebt die Erinnerung automatisch auf den letzten Tag des Monats. Zum Beispiel wird eine Erinnerung am 31. auf den 28. oder 29. im Februar und auf den 30. im April, Juni, September und November verschoben. Dies ist das intuitivste Verhalten für den Benutzer.

Funktionieren wiederkehrende Erinnerungen mit der Gamification?

Absolut. Jede Erledigung einer wiederkehrenden Erinnerung bringt Erfahrungspunkte und füllt deinen täglichen Streak auf. Das ist eine hervorragende Möglichkeit, eine produktive Routine aufrechtzuerhalten und langfristig motiviert zu bleiben.

Wie kann man ein einzelnes Vorkommen einer wiederkehrenden Erinnerung ändern oder löschen?

Du kannst ein bestimmtes Vorkommen ändern oder löschen, ohne die anderen zu beeinflussen. Das System erstellt dann eine "Ausnahme" für dieses Datum. Der Rest der Serie wird normal gemäß der definierten Regel fortgesetzt.