{"id":119,"date":"2026-07-28T10:20:06","date_gmt":"2026-07-28T10:20:06","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2026\/07\/28\/mama-calendar\/"},"modified":"2026-07-28T10:20:06","modified_gmt":"2026-07-28T10:20:06","slug":"mama-calendar","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/de\/2026\/07\/28\/mama-calendar\/","title":{"rendered":"Mama Calendar \u2013 plattform\u00fcbergreifende Erinnerungs-App"},"content":{"rendered":"<p>Mama Calendar ist eine plattform\u00fcbergreifende Ereignis- und Erinnerungsanwendung, die in React Native (Expo) mit zwei Backend-Implementierungen geschrieben wurde: Node.js + MongoDB und PHP + MariaDB.<\/p>\n<p>Mit der Anwendung k\u00f6nnen Sie Ereignisse mit Emoji-Kategorisierung erstellen, die Art der Wiederholung ausw\u00e4hlen (einmal, j\u00e4hrlich, monatlich, w\u00f6chentlich, t\u00e4glich) und wichtige Ereignisse f\u00fcr die n\u00e4chsten 3 Tage in einer separaten Registerkarte \u201eWichtige Ereignisse\u201c anzeigen.<\/p>\n<h2>Technologie-Stack<\/h2>\n<p>Das Frontend ist in React Native 0.86 \u00fcber Expo SDK 57 mit TypeScript, Expo Router f\u00fcr die Navigation und <code>react-native-reanimated<\/code> f\u00fcr Animationen geschrieben. Expo-Symbole werden f\u00fcr Icons verwendet (SF-Symbole auf iOS, Material-Symbole auf Android\/Web).<\/p>\n<p>Das Backend ist in zwei Versionen implementiert:<\/p>\n<ul>\n<li><b>Node.js:<\/b> Express 4, MongoDB 8 \u00fcber nativen Treiber, benutzerdefinierte Authentifizierung mit Scrypt + Salt, manuelle Token-Verwaltung. Docker Compose ruft den Client (nginx), den Server und MongoDB auf.<\/li>\n<li><b>PHP:<\/b> PHP 8.2 ohne Frameworks, PDO + MariaDB 11, bcrypt f\u00fcr Passwort-Hashing, Ihr eigener Router und PSR-4-Autoloading \u00fcber Composer.<\/li>\n<\/ul>\n<h2>Anwendungsfunktionen<\/h2>\n<ul>\n<li><b>Registrierung und Autorisierung:<\/b> einfaches System mit Benutzername\/Passwort und Bearer-Token<\/li>\n<li><b>CRUD-Ereignisse:<\/b> Ereignisse mit Datum, Emoji und Wiederholungstyp erstellen, anzeigen, bearbeiten und l\u00f6schen<\/li>\n<li><b>Intelligente Filterung:<\/b> Auf der Registerkarte \u201eWichtige Ereignisse\u201c werden Ereignisse der n\u00e4chsten drei Tage unter Ber\u00fccksichtigung von Wiederholungsregeln angezeigt. J\u00e4hrliche Ereignisse zeigen beispielsweise das n\u00e4chstgelegene j\u00e4hrliche Ereignis an, monatlich \u2013 nach Tag des Monats, w\u00f6chentlich \u2013 nach Tag der Woche<\/li>\n<li><b>Emoji-Auswahl:<\/b> 20 voreingestellte Emojis zur schnellen Kategorisierung von Ereignissen<\/li>\n<li><b>Heutige Ereignisse hervorheben:<\/b> Die heutigen Ereignisse werden mit einem roten Hintergrund hervorgehoben (#B71C1C)<\/li>\n<li><b>Dunkles Thema:<\/b> Automatische Erkennung des Systemfarbschemas mit separaten Paletten f\u00fcr helles und dunkles Thema<\/li>\n<li><b>Internationalisierung:<\/b> Russische und englische Sprachen \u00fcber React Context<\/li>\n<li><b>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u0438:<\/b> \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043b\u044d\u0448-\u0441\u043a\u0440\u0438\u043d \u0441 Keyframe API \u0438 \u0443\u043f\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439, \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0438\u043a\u043e\u043d\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u0441\u0432\u0435\u0447\u0435\u043d\u0438\u0435\u043c<\/li>\n<li><b>Admin-Endpunkte:<\/b> Verwaltung von Benutzern, Tokens und L\u00f6schen der Datenbank \u00fcber Master-Tokens<\/li>\n<\/ul>\n<h2>Warum zwei Backend-Implementierungen?<\/h2>\n<p>Die Node.js-Version ist die Hauptversion, aber die PHP-Version existiert als Alternative f\u00fcr klassischeres Hosting. Die API ist v\u00f6llig identisch, sodass Sie zwischen ihnen wechseln k\u00f6nnen, ohne den Client-Code zu \u00e4ndern.<\/p>\n<h2>Infrastruktur<\/h2>\n<p>Der gesamte Stack wird durch Docker Compose angehoben: Der Client wird durch einen mehrstufigen Build (Expo-Export \u2192 Nginx Alpine) zusammengestellt, ein Server auf Node.js, MongoDB 8. F\u00fcr die PHP-Version gibt es eine separate Compose-Datei mit MariaDB 11 und phpunit f\u00fcr Tests.<\/p>\n<p>Die Zusammenstellung der Webversion wird durch ein PowerShell-Skript automatisiert, das die API_URL vor dem <code>expo export<\/code> patcht und die Originale danach wiederherstellt.<\/p>\n<h2>Ausgabe<\/h2>\n<p>Mama Calendar ist eine plattform\u00fcbergreifende Anwendung mit vollem Funktionsumfang, die den gesamten Zyklus abdeckt: vom mobilen und Web-Frontend auf React Native bis hin zu zwei serverseitigen Optionen. Das Projekt ist aufgrund seiner Architektur, der Nutzung moderner Expo SDK-Funktionen und der Dual-Backend-Implementierung interessant.<\/p>\n<h2>Links<\/h2>\n<p><a href=\"https:\/\/github.com\/zefir1990\/Mama-Calendar\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/zefir1990\/Mama-Calendar<\/a><br \/>\n<a href=\"https:\/\/demensdeum.com\/software\/mama-calendar\/events\" rel=\"noopener\" target=\"_blank\">https:\/\/demensdeum.com\/software\/mama-calendar\/events<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mama Calendar ist eine plattform\u00fcbergreifende Ereignis- und Erinnerungsanwendung, die in React Native (Expo) mit zwei Backend-Implementierungen geschrieben wurde: Node.js + MongoDB und PHP + MariaDB. Mit der Anwendung k\u00f6nnen Sie Ereignisse mit Emoji-Kategorisierung erstellen, die Art der Wiederholung ausw\u00e4hlen (einmal, j\u00e4hrlich, monatlich, w\u00f6chentlich, t\u00e4glich) und wichtige Ereignisse f\u00fcr die n\u00e4chsten 3 Tage in einer separaten [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-119","post","type-post","status-publish","format-standard","hentry","category-software"],"translation":{"provider":"WPGlobus","version":"3.0.3","language":"de","enabled_languages":["en","ru","zh","de","ja","fr","es","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"es":{"title":false,"content":false,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":0,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/119\/revisions"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}