Projektablauf und Architektur
Dieses Dokument beschreibt die Architektur, den Entwicklungs-Workflow und die zentralen Konzepte dieses Multi-App-Projekts.
Checkliste (laufend)
Offen
- Fehlende Punkte/Abweichungen aus Regeln/PRD identifizieren und aufnehmen.
Erledigt
- Checkliste eingefuehrt und in den Ablauf integriert.
- TypeScript-Dateien im Ordner
obsolentvorhanden (veraltet). Nicht verwenden! - SvelteKit-Verwendung im Unterverzeichnis
apps/MadeIn/Projektentdeckt. Nicht verwenden! - React/Next-Abhängigkeiten in
package.jsonvorhanden, jedoch nicht genutzt. Nicht verwenden! - Laufende Arbeitsschritte fuer die naechste Iteration ergaenzen.
1. Ziel & Vision
Das Ziel ist die Entwicklung einer Sammlung von Web-Anwendungen innerhalb einer zentralisierten Monorepo-Architektur. Eine dynamische, datenbankgesteuerte Landingpage dient als zentraler Einstiegspunkt zu allen verfügbaren Applikationen. Dieser Ansatz vereinfacht die Verwaltung, Wartung und Skalierung des gesamten Systems.
2. Architektur-Überblick
2.1. Monorepo-Struktur
Das Projekt nutzt eine Monorepo-Struktur, um Code zentral zu verwalten:
/apps: Enthält die einzelnen Frontend-Anwendungen (z.B. Svelte.js, nicht SvelteKit, auch kein Typescript)./backend: Der zentrale Express.js-Server./packages: (Geplant) Geteilter Code wie UI-Komponenten, Hooks oder Konfigurationen.package.json: Zentrale Verwaltung aller Abhängigkeiten.
2.2. Zentraler Backend-Server
Der Server unter /backend ist das Herzstück der Anwendung und verantwortlich für:
- User-Verwaltung & Authentifizierung (JWT in httpOnly Cookies + Refresh-Token)
- Payment / Abrechnung
- Sprachverwaltung / Übersetzungen
- Datenbank-Interaktionen (MongoDB)
- Auslieferung der statischen Apps unter
/apps/<slug>(wenn vorhanden).
2.3. Datenbank-gesteuerte Landingpage
Die Landingpage (/) wird dynamisch gerendert. Die Liste der angezeigten Apps wird aus der apps-Collection in der MongoDB geladen. Jede App in der Datenbank hat einen status (ready, coming_soon, maintenance), der die Darstellung und Klickbarkeit des entsprechenden Buttons auf der Landingpage steuert.
2.4. App-Auslieferung
Der Backend-Server auf Port 3000 liefert Apps als statische Dateien aus:
- Statische Apps: Einfache Apps (z.B. HTML/JS/CSS) werden unter
/apps/<slug>ausgeliefert. - Dev-Server für Apps: Werden manuell separat gestartet (kein automatischer Proxy aktiv).
3. Entwicklungs-Setup
3.1. Installation
- Repository klonen:
git clone <repo-url> cd <repo-name> - Abhängigkeiten installieren:
npm install
3.2. Entwicklungsumgebung starten
Empfohlen: npm run dev im Root startet Backend + frontend-svelte parallel (concurrently), wie im Projekt genutzt.
Optional: zwei Terminals (wie im Projekt genutzt):
# Terminal 1
npm --prefix frontend-svelte run dev
# Terminal 2
npm run dev:backend
3.3. Zugriff im Browser
- Landing Page (Dev):
http://localhost:5173/ - API:
http://localhost:3000/ - Beispiel-App:
http://localhost:3000/apps/<slug>
4. Datenbank-Management
4.1. App-Modell
Das App-Modell in backend/models/App.js definiert die Struktur für einen App-Eintrag in der Datenbank. Das wichtigste Feld für die Landingpage ist status.
4.2. Datenbank Seeding
Um die Datenbank mit den im /apps-Verzeichnis vorhandenen Anwendungen zu befüllen, wird ein Seeding-Skript verwendet.
npm run db:seed
Dieser Befehl:
- Liest alle Ordner im
/apps-Verzeichnis. - Prüft, für welche Ordner noch kein Eintrag in der Datenbank existiert.
- Fügt nur die neuen Apps zur Datenbank hinzu und setzt deren
statusstandardmäßig aufcoming_soon.
Bestehende Einträge in der Datenbank werden nicht verändert. So bleiben manuelle Anpassungen (z.B. ein geänderter status) erhalten.
5. Eine neue App hinzufügen (Workflow)
- Ordner erstellen: Lege einen neuen Ordner für deine App in
/appsan (z.B./apps/neue-app). - App entwickeln: Baue deine Anwendung.
- Proxy konfigurieren (falls nötig): Wenn deine App einen eigenen Server (z.B. Vite) benötigt, füge eine neue Proxy-Regel in
backend/server.jshinzu. - Datenbank aktualisieren: Führe
npm run db:seederneut aus. Das Skript findet deine neue App und fügt sie zur Datenbank hinzu, ohne bestehende Einträge zu verändern.
6. Deployment (Produktion)
In einer Produktionsumgebung wird ein dedizierter Webserver wie nginx als Reverse Proxy vor den NodeJS-Server geschaltet. Nginx übernimmt das SSL-Handling (HTTPS) und das effiziente Routing von Anfragen an die korrekten Services.
Etappenprotokoll
Kurzfassung (verifiziert, bereinigt)
- Landing/Embed: Apps koennen in der Hero-Section eingebettet werden; App-Karten werden im Embed ausgeblendet; Profil-Start oeffnet Embedded-App, wenn vorhanden.
- Shortener (Embed): CRUD vorhanden, QR pro Zeile mit Inline-Preview, ToggleButton statt Checkbox, URL-Text wird mit
truncateUrl(..., 40)gekuerzt. - QR-Code Generator (Embed): erweiterte Typen/Formulare, Speichern/Loeschen/Reports, QR-Preview in der Haupt-Box mit Toggle, keine Tracking-URL im QR-Bild, kein Klickzaehler.
- Calculators (Embed): Tabs fuer Units, Time, Data, Numbers, Encoding, CSV/JSON/XML, Strings, Hashes, Formatters, Internet, WebDev, Encoders.
- Games: Sammelkarte in Landing; serverseitige Game-APIs aktiv; i18n in Games-Apps.
- Zugriff/Entitlements: App-Start Buttons in Landing/Profil/Modal, Free-Tier-Ablaufschutz, Access-Labels ueber
shared/appAccess.js. - Billing: Paid-Aktivierung via
/api/v1/billing/checkoutmit Rueckmeldung in der Landing. - i18n (Shared):
shared/i18n.jsgenutzt in Qrcode, Shortener, Games, Blood-WebApp; Games setzen Asset-Base im Embed. - Slug-Schutz: bad-words + Blockliste in Shortener/QR-Controller aktiv.
- Seeds: Svelte-Fallbacks fuer DB werden via
backend/scripts/seedSvelteFallbacks.jsgesetzt.
Hinweis: Der Legacy-Block wurde in den Anhang verschoben.
Appendix: Legacy Etappen
Archivierte Etappen (Legacy/ungeprueft)
Etappe: Fix Svelte Runtime-Fehler (effect_orphan)
- Initialisierung in
frontend-svelte/src/views/Landing.sveltenachonMountverschoben. - Popstate-Listener mit Cleanup registriert, um Runtime-Fehler zu vermeiden.
- Ziel: Fehler "effect_orphan" nach
npm run devbeseitigen.
Etappe: Build-Fehler in Svelte behoben
- Print-HTML in
frontend-svelte/src/views/Landing.svelteso angepasst, dass kein</script>im Template-Literal vorkommt. - Ziel: Vite Build ohne "Unterminated template".
- Test:
npm run buildinfrontend-svelte(erfolgreich, nur A11y-Warnungen).
Etappe: Default-User + Admin-Dashboard Basis
- Seed-Skript fuer Test- und Admin-User erstellt (
backend/seedUsers.js). - Admin-API fuer Uebersicht hinzugefuegt (
/api/v1/admin/overview). - Admin-Ansicht in
frontend-svelte/src/views/Landing.svelteintegriert (Stats + User-CRUD(fehlt noch)). - Test:
npm run buildinfrontend-svelte(erfolgreich, A11y-Warnungen). - Seed ausgefuehrt:
npm run db:seed:users.
Etappe: Login-Reparatur + Forgot/Reset Password
- Passwort-Reset-Token im User-Model ergaenzt.
- Forgot/Reset-Endpunkte in Auth-Controller und Routes implementiert.
- Reset-E-Mail Versand via
mailServiceergaenzt. - Landingpage um Forgot/Reset Views erweitert.
- Shortener-Login auf Plattform-Forgot-Link umgestellt.
- Test:
npm run buildinfrontend-svelte(erfolgreich, A11y-Warnungen). - Seed aktualisiert:
npm run db:seed:users.
Etappe: App-Start Static Routing + Dashboard Label
- App-Index-Auswahl auf
public/dist/buildpriorisiert und Asset-Pfade fuer/apps/<slug>automatisch gepraefixed. - Static-Asset-Serving fuer
/apps/<slug>/*hinzugefuegt, damit gebaute Apps geladen werden. - Header-Label "Dashboard" fuer angemeldete Nutzer angepasst und Login-State beim Login stabilisiert.
- Test:
npm run buildinfrontend-svelte(erfolgreich, A11y-Warnungen).
Etappe: Dev-Start via Concurrently
- Root-
npm run devstartet jetzt Backend (nodemon) undfrontend-svelteparallel. dev:backendunddev:frontendScripts hinzugefuegt; Vite laeuft auf Port 5173.- Dependency
concurrentlyim Root installiert.
Etappe: Public-Ordner deaktiviert
- Ordner
publicinxxpublicumbenannt. - Backend nutzt
xxpublicnur noch, wennSERVE_STATIC_UI=truegesetzt ist. - Vite-Output auf
xxpublic/uiumgestellt, damit keine Builds mehr inpubliclanden.
Etappe: Vite-Port korrigiert
frontend-svelteDev-Port von 4173 auf 5173 gestellt, passend zunpm run dev.
Etappe: Login sichtbar auf Landingpage
- Schnell-Login-Block in der Landing-Ansicht hinzugefuegt (Login/Registrieren/Passwort vergessen).
Etappe: CORS fuer Vite-Dev
http://localhost:5173in die erlaubten Origins aufgenommen, damit Login per Vite-Dev funktioniert.
Etappe: API-Calls ueber Vite-Proxy
frontend-sveltenutzt jetzt relative/api-Calls (kein Cross-Origin), damit Cookies sauber funktionieren.
Etappe: Login-UI bereinigt + Auth-Status stabilisiert
- Schnell-Login in der Landing-Ansicht entfernt (Login nur via /login).
- Auth-Requests gegen parallele
fetchMe()-Updates abgesichert, damit der Login-Status nicht ueberschrieben wird.
Etappe: Login-Feedback & Profil-Navigation
- Nach Login direkte Weiterleitung auf
/profile. - Header zeigt Profil-Link und gruene Login-Markierung mit Username/E-Mail.
Etappe: Reaktives Login-Flag
isLoggedInist jetzt ein reaktiver Wert statt Funktionsaufruf, damit Header/Profil sofort umschalten.
Etappe: Admin immer Vollzugang
- Admin bekommt in
/api/v1/auth/appsalle Apps als aktiv/paid zurück. - App-Aktivierung ignoriert Free-Tier fuer Admins.
Etappe: Dummy Revolut Link in config.js
- Ein Dummy-Revolut-URL wird in
backend/config/config.jsalsrevolutDummyLinkhinzugefügt. - Dies dient der Testumgebung, um Zahlungssimulationen ohne Stripe zu ermöglichen.
Etappe: App-Start im Dev-Modus
- App-Start-Links zeigen in Dev auf
http://localhost:3000/apps/<slug>statt Vite, damit die Apps geladen werden. - Profil-Ansicht bietet fuer freigeschaltete Apps jetzt direkt "App starten".
Etappe: Ablauf-Dokumentation aktualisiert (verworfen)
- Verworfen: Meta-Aktualisierung ist nicht direkt im Code verifizierbar.
Etappe: Direkter /apps/<slug> Zugriff
/apps/<slug>auf der Landing-URL (Dev/Prod) validiert Login + App-Zugriff und leitet danach auf die App um.- Bei fehlender Freischaltung Redirect auf
/profilemit Hinweis.
Etappe: Plan.md Baseline erstellt
- Neue
Plan.mdmit kompletter ToDo-Baseline erstellt, basierend auf rules.md, README.md, PRD.md und AblaufProtokoll.md. - Alle Punkte sind bewusst als ungeprueft/offen markiert, damit spaeter gezielt abgehakt werden kann.
Etappe: README aktualisiert (Englisch, Legacy-Hinweise)
- README.md auf Englisch aktualisiert und an den aktuellen Code-Stand angepasst.
- Legacy/konzeptionelle App-Ordner explizit genannt und mit Migrationshinweis zu Svelte versehen.
Etappe: README erweitert (Legacy-Detail + Migrationscheckliste)
- Registry-Apps mit Source-Pfaden und Status ergaenzt.
- Legacy/konzeptionelle App-Ordner detailliert aufgefuehrt und Migrations-Checkliste hinzugefuegt.
Etappe: RalphWiggum Prompt-Quellen erweitert + Migration Guide
ralphWiggum.shliest jetzt rules.md, PRD.md, Plan.md und README.md mit klarer Prioritaet fuer Konflikte.- README um Migrationsstatus-Spalte ergaenzt.
- Neues Dokument
MIGRATION.mdmit konkreten Legacy-Migrationsschritten erstellt.
Etappe: RalphWiggum Dateisuche tolerant gemacht
ralphWiggum.shloest Kern-Dateien jetzt case-insensitive auf und bricht nicht wegen abweichender Schreibweise ab.
Etappe: Vollpruefung AblaufProtokoll (Audit-Report)
- Vollaudit aller Etappen erstellt und nach
OK/UNKLAR/FALSCHklassifiziert. - Report liegt unter
.ralphWiggum/full_audit.md.
Etappe: Audit-Korrekturen + Build-Punkte obsolet
- Build-bezogene Etappen als obsolet markiert (spaeterer Nachholtermin).
- Korrekturen und offene UNKLAR-Punkte in
AblaufProtokoll_Audit_Corrections.mderfasst.
Etappe: UNKLAR-Punkte verifiziert (Audit-Fortschritt)
- UNKLAR-Liste weitgehend verifiziert und mit konkreten Dateibelegen ergaenzt.
- Verbleibende unklare/kontradizierende Punkte sind markiert.
- Slug-Validierung (mind. 4 Zeichen) als intern reserviert dokumentiert.
Etappe: UNKLAR-Punkte weiter verifiziert
- Weitere UNKLAR-Punkte verifiziert (u.a. Paid-Aktivierung Start, Games serverseitig + i18n).
- Neue Widersprueche in der Audit-Korrekturliste markiert.
- Unverifizierbare Etappen als verworfen markiert.
Etappe: App-Index-Aufloesung erweitert
- App-Serving sucht jetzt auch in
WebApp/undLandingPage/(inkl. dist/build/public).
Etappe: Git-Setup
- Lokales Git-Repo initialisiert.
.gitignorefuer typische Artefakte/Builds undxxpublic/hinzugefuegt.
Etappe: Eingebettete Git-Repos entfernt
- Unterordner mit eigenen
.git-Ordnern in Apps entfernt, damit alles im Monorepo versioniert wird.
Etappe: Blood-WebApp in Landing eingebettet
frontend-svelte/src/apps/BloodApp.svelteals Wrapper fuer die bestehende Blood-WebApp erstellt.- Vite-Server erlaubt jetzt Imports aus dem Monorepo (
frontend-svelte/vite.config.js). - Blood-Assets nach
frontend-svelte/public/assets/imageskopiert undflaggsAlias angelegt.
Etappe: Wasser-Reminder in Landing eingebettet
frontend-svelte/src/apps/WasserReminderApp.svelteerstellt und Wasser-HTML/JS eingebunden.- Wasser-Assets nach
frontend-svelte/public/wasserkopiert.
Etappe: Games als einzelne Apps eingebettet
- Svelte-Komponenten fuer 2048+, Wörtli und Fruits+ erstellt.
- Game-Assets nach
frontend-svelte/public/gameskopiert.
Etappe: Einbettung rueckgebaut + Games umbenannt
- Landing-Embedding fuer Blood/Wasser/Games entfernt, damit die Landing wieder startet.
- Spiele-Ordner nach
apps/2048-plus,apps/wordle-plus,apps/fruits-plusverschoben.
Etappe: Games nach Svelte migriert
- 2048+, Wordle+ und Fruits+ als eigenstaendige Svelte-Apps unter
apps/2048-plus,apps/wordle-plus,apps/fruits-plusangelegt. - Landing nutzt Svelte-Komponenten aus den neuen App-Ordnern.
- Vite-Proxy in
frontend-svelteerweitert, damit/apps/*und/assets/*im Dev ueber das Backend erreichbar sind.
Etappe: Landing stabilisiert + doppelte Assets entfernt
- Alte Embedding-Wrapper und Hilfsdateien entfernt (
frontend-svelte/src/apps/BloodApp.svelte,frontend-svelte/src/apps/WasserReminderApp.svelte,frontend-svelte/src/apps/GameRoyalMatchApp.svelte). - Doppelte Assets in
frontend-svelte/publicentfernt (assets,games,wasser), damit Assets nur noch aus den App-Ordnern kommen. - Landing-Hintergrund explizit auf das Standard-Design gesetzt.
Etappe: Games-Styles auf einheitliches Design gezogen
- Game-Styles auf App-Wrapper gekapselt, damit kein globaler
body-Style die Landing ueberschreibt. - Farbpalette an das MultiApps-Design angepasst (primary/secondary/accent).
- Zusätzliche CSS-Scopes eingefuegt, damit generische Klassen wie
.containerundheaderdie Landing nicht mehr beeinflussen.
Etappe: Blood API (MongoDB) gestartet
- Neue Mongo-Modelle fuer Blutdruck-Eintraege und Reminder-Settings angelegt.
- REST-API unter
/api/v1/bloodhinzugefuegt (Entries + Settings).
Etappe: Blood Svelte-Port (Mongo)
- Neue Svelte-App unter
apps/blood/WebAppumgesetzt (Eintraege, Trends, Reminder). - Plattform-Login via
/api/v1/auth/meintegriert, Daten per/api/v1/blood/*. - Landing-Embedding fuer Blood wieder aktiviert.
Etappe: Landing Karten mobile-first
- Kartenraster auf mobile-first Breakpoints umgestellt (1/2/3 Spalten).
- Abstaende, Schriftgroessen und Buttons fuer kleine Screens optimiert.
Etappe: Sensitive Dateien entfernt
anmeldeDaten.txtaus Git entfernt und in.gitignoreaufgenommen.
Etappe: Admin-Apps immer aktiv + Regeln
- Admin sieht
App startenin den App-Karten (Zugriff immer aktiv). rules.mdim Root angelegt.
Etappe: Login-Status nach Zurueck
pageshowEvent refreshtfetchMe(), damit der Header nach Browser-Back korrekt auf "App starten" bleibt.
Etappe: Dev-Proxy fuer App-Starts
- Backend proxied
/apps/<slug>auf App-Dev-Server (konfigurierbar inbackend/config/appDevProxy.js).
Etappe: QR-Code Generator (Svelte)
- Neue Svelte-App unter
apps/qrcodemit QR-Generator (URL/Text/WLAN). - Dev-Port 4201 eingerichtet (Vite), passend zum Dev-Proxy.
Etappe: QR-Code Generator erweitert
- QR-Typen fuer Web, Kontakte, Kommunikation, Termine, Standort, Technik, Payment, Daten und Marketing ergänzt.
- Scan-Counter via Shortener für URL-basierte Typen integriert.
- CORS fuer App-Dev-Ports erweitert (4201-4204).
Etappe: Root-Dev startet QR-App
- Root-
npm run devstartet jetzt zusaetzlich den QR-Code-Generator (apps/qrcode) im Dev-Modus.
Etappe: QR-App Dependencies installiert
npm --prefix apps/qrcode installausgefuehrt, damitvitefuer die QR-App verfuegbar ist.
Etappe: QR-App Vite Base gesetzt
apps/qrcode/vite.config.jsaufbase: "/apps/qrcode/"gestellt, damit Dev-Assets ueber den Backend-Proxy geladen werden.
Etappe: QR-Proxy Prefix behalten
- Dev-Proxy behaelt fuer
qrcodeden/apps/qrcodePfad, damit Vite-Redirects nicht in einen Loop laufen.
Etappe: QR-Proxy BaseUrl nutzen
- Dev-Proxy nutzt fuer
qrcodereq.baseUrl, damit/apps/qrcode/korrekt an Vite weitergegeben wird.
Etappe: CSP fuer Vite-HMR
connect-srcim CSP erweitert, damit WebSocket-HMR ueber/apps/qrcodeim Dev-Modus nicht blockiert wird.
Etappe: Ready-Apps eingebettet
- QR-Code-Generator als Svelte-Komponente (
frontend-svelte/src/apps/QrcodeApp.svelte) eingebettet. - Landingpage rendert
qrcodeundqrshortdoorbellin der Hero-Section; App-Buttons nutzen das Embedding fuer diese Apps.
Etappe: QR-URL nur Slug
- QR-Code Generator verwendet fuer URL-Typ einen Slug-Input und baut daraus
https://ucall.me/<slug>.
Etappe: Slug-Validierung (intern, mind. 4 Zeichen)
- Interne Slugs sind ab 4 Zeichen gueltig; oeffentliche Slug-Configs bleiben bei 6 Zeichen.
Etappe: Dynamische Beispiel-URL
- Beispiel-Zeile zeigt den eingegebenen Slug als
https://ucall.me/<slug>und faerbt gruen, sobald gueltig.
Etappe: Scan-Counter Label zweizeilig (verworfen)
- Verworfen: kein belegbarer Scan-Counter-Label im aktuellen QR-Embed.
Etappe: Scan-Counter Styling verbessert (verworfen)
- Verworfen: kein belegbares Scan-Counter-Styling im aktuellen QR-Embed.
Etappe: Home-Link und Admin-Header
- Home-Link schliesst eingebettete Apps, damit die Haupt-Landingpage sichtbar ist.
- About-Link im Header fuer Admin ausgeblendet.
Etappe: Shortener-CRUD
- Backend: Shortener-API um Listen/Update/Delete erweitert.
- Frontend: UrlManager mit Bearbeiten/Löschen + klick-Statistik umgesetzt.
Etappe: Shortener eingebettet
- Shortener als Svelte-Komponente in der Landingpage eingebettet (Dashboard/CRUD in der Hero-Section).
Etappe: Shortener-URL Schema
- Short-URLs nutzen
https://ucall.me/<slug>(ohne/s/), Backend akzeptiert fehlendeshttps://und normalisiert. URL_shorterKarte wird aus der Landingpage-Liste ausgefiltert.
Etappe: App-Karten ausblenden bei Embed
- Wenn eine App in der Hero-Section eingebettet ist, werden die App-Karten ausgeblendet und erst bei Home/Logo wieder angezeigt.
Etappe: Shortener Checkbox Layout (verworfen)
- Verworfen: aktuelle UI nutzt
ToggleButtonstatt Checkboxen.
Etappe: Toggle-Buttons statt Checkboxen
- Checkboxes in Shortener, Qr-Code-Generator und Doorbell-Embed durch Toggle-Buttons mit ✅/❔ ersetzt.
- Shortener bietet optionalen QR-Code-Output fuer die erzeugte Short-URL.
Etappe: Shortener QR pro Zeile
- QR-Code wird nun per Icon in der URL-Liste erzeugt und direkt in der jeweiligen Zeile angezeigt.
Etappe: QR-Icon ucall.me
- QR-Icon in der Shortener-Liste zeigt ein QR fuer
https://ucall.me.
Etappe: Shortener Liste kompakt
- QR-Code Vorschau sitzt inline in der Aktionszeile; Ziel-URL wird via
truncateUrl(..., 40)gekuerzt.
Etappe: Short-URL Base via NODE_ENV
- Short-URL Basis ist in Dev
http://localhost:3000/<slug>und in Prodhttps://ucall.me/<slug>.
Etappe: Admin-Shortener + Qr-Code-Generator Slug-Regeln
- Admin darf Shortener-Slugs mit variabler Laenge nutzen (nur erlaubte Zeichen).
- Qr-Code-Generator Slugs sind jetzt mindestens 6 Zeichen lang.
Etappe: Slug-Sanitizer (Blockliste)
- Shortener und Qr-Code-Generator blocken Slugs mit
porn,sex,nsKombinationen.
Etappe: bad-words integriert
- bad-words Filter nutzt Blockliste fuer Shortener und Qr-Code-Generator.
Etappe: bad-words Import fix
- bad-words wird als Named Export (
{ Filter }) importiert, damit Vite laedt.
Etappe: Deutsche Bad-words erweitert
- Filterliste um
fick,ficker,fickdicherweitert (inkl. Substring-Check).
Etappe: QR-Generator Speichern + Reports
- QR-Codes werden gespeichert, via
/q/<slug>getrackt und in einer Liste mit Klicks angezeigt. - Reports sperren Short-URLs/QR-Codes, warnen User in-App und blocken nach 3 Verwarnungen.
- Ziel-Links mit nicht jugendfreien Begriffen werden geblockt.
- User sehen Verwarnungen im Profil (In-App Hinweise).
Etappe: QR-Generator Tracking-URL Basis + Scan-Counter immer aktiv
- QR-Tracking-URLs nutzen jetzt nur
NODE_ENV(Prod = Host-Domain, Dev = localhost). - QR-Code Bild nutzt immer die Tracking-URL (Scan-Counter immer aktiv).
- QR-Generator-UI ohne Scan-Counter Toggle/Short-URL-Option.
Etappe: QR-Codes loeschbar
- DELETE Endpoint fuer eigene QR-Codes hinzugefuegt.
- Loesch-Button in QR-Listen (Embedded + Standalone) ergaenzt.
Etappe: Toasts statt Alerts + Modals statt Confirm
- Alerts/Confirm durch Toasts und eigene Bestaetigungs-Modals ersetzt (Landing, Shortener, QR-Generator).
Etappe: QR-Code-Listen mit QR-Icon
- QR-Code-Listen zeigen ein QR-Icon-Button zum Anzeigen des gespeicherten QR-Codes.
Etappe: Ablaufdatum fuer Shortener & QR-Generator
- Shortener und QR-Codes speichern optional ein Gueltig-bis-Datum.
- Redirects blockieren abgelaufene Links (410).
Etappe: QR-Generator ohne Tracking-URL im QR-Bild
- QR-Codes enthalten wieder den eigentlichen Payload (kein Tracking-Link im QR-Bild).
Etappe: QR-Generator ohne Slug
- URL-Eingabe akzeptiert echte URLs (kein eigener Slug im QR-Generator).
Etappe: Labels naeher an Inputs (verworfen)
- Verworfen: kein eindeutiger Beleg fuer reduzierte Label-Abstaende im QR-Embed.
Etappe: QR-Preview aus Liste in Haupt-QR-Box
- QR-Icon in der Liste zeigt den QR-Code in der Haupt-Preview (nicht inline) und nutzt Payload statt Tracking-URL.
Etappe: QR-Preview Toggle
- QR-Icon in der Liste toggelt die Vorschau in der Haupt-QR-Box an/aus.
Etappe: QR-Listen ohne Klickzaehler
- Klickzaehler-Anzeige im QR-Generator entfernt.
Etappe: QR-Listen ohne Slug-Anzeige (verworfen)
- Verworfen: QR-Listen zeigen
entry.qrUrlund enthalten damit den Slug.
Etappe: App-Start aus Profil direkt in Embed
- App-Start aus dem Profil behält das Embedded-App-Rendern beim Wechsel zur Landingpage.
Etappe: WasserReminder als Svelte-Port
- Neue Svelte-App in
apps/wasserReminder/WebAppmit Vite-Base/apps/wasserreminder/und Nutzung des bestehendenpublic/wasser-Asset-Pools. - WasserReminder UI/Logik (Reminder, History/Chart, Ads, Share, Audio-Recorder, Sprache) nach Svelte portiert und per Module strukturiert.
- CSS auf
.app-wassergescoped, damit keine globalen Styles auf die Landingpage durchschlagen. - Landingpage-Embed
wasserreminderinklusive Wrapper-Komponente hinzugefuegt. - Manifest/Service-Worker Pfade auf
/apps/wasserreminder/angepasst.
Etappe: WordClock als Svelte-Port
- WordClock nach
apps/WordClock/WebAppportiert (Svelte/Vite, Base/apps/wordclock/). - WordClock-Logik aus
script.jsin Svelte-Module ueberfuehrt und JSON-Daten (timeTexts.json) direkt importiert. - Styles auf
.app-wordclockgescoped und Landing-Embedwordclocksamt Wrapper integriert.
Etappe: GrammarAI Migration (Plattform)
- GrammarAI als Svelte-App unter
apps/grammarAi/WebAppportiert und in die Landing eingebettet. - Backend-Integration ueber
/api/v1/grammar/*(History, Feedback, API-Keys) sowie/api/v1/billing/checkoutfuer Paid-Upgrade. - Free-Tier Standard auf 14 Tage gesetzt und Paid-Upgrade setzt App als ad-free.
Etappe: GrammarAI Fix (Translations Import)
- Import-Pfad fuer
translations.tsinapps/grammarAi/WebApp/src/lib/i18n.jskorrigiert, damit Vite das File findet.
Etappe: GrammarAI Fix (Gemini API Key)
- Dev-Fallback in
apps/grammarAi/WebApp/src/lib/geminiService.js: wenn keinVITE_GEMINI_API_KEYgesetzt ist, wird eine neutrale Korrektur (Text unveraendert, keine Vorschlaege) geliefert.
Etappe: Obsolent-Ordner
- Nicht mehr benoetigte Dateien/Ordner (Skripte, Generatoren, alte Dokumentations-Snapshots) nach
obsolent/verschoben.
Etappe: App-Registry (SSOT)
- Zentrales
appRegistry.jseingefuehrt (Slugs, Namen, Embed-Flags, Dev-Ports, Short-Codes). - Landing nutzt Embedded-Slugs aus der Registry, Dev-Proxy nutzt die Registry.
- Script
db:sync:appspasst App-Namen in der DB an (z.B. Qr-Code-Generator).
Etappe: Reservierte Short-URLs
- Script
db:seed:shorturlslegt 4-Zeichen-Shortcodes fueradmin@ucall.mean und zeigt auf/apps/<slug>. PUBLIC_BASE_URLin zentrale Backend-Env aufgenommen.
Etappe: .env Zentralisierung
- Alle
.env*Dateien inenv/zentralisiert. - Backend/Script-Lader sowie Vite-Configs auf die neuen Env-Pfade umgestellt.
Etappe: Dev-Watcher (ohne nodemon/concurrently)
- Root-Dev startet ueber
node scripts/dev.js(Backend vianode --watch).
Etappe: Shortener Dev-Proxy
- Shortener Vite-Base auf
/apps/shortener/gesetzt und Dev-Port auf 4209 gelegt. - Root-Dev startet Shortener-Dev-Server mit, damit
/apps/shortenerim Dev funktioniert.
Etappe: App-Dev-Server komplett (verworfen)
- Verworfen: keine belegbare Aussage zur Vollstaendigkeit im aktuellen Setup.
Etappe: /apps/qrshortdoorbell Redirect
- App-Redirect fuer
qrshortdoorbelloeffnet die Landingpage mit eingebetteter Doorbell statt einem eigenen App-Server.
Etappe: App-Registry DB Sync (Create)
db:sync:appslegt fehlende App-Records aus der Registry an.
Etappe: Dev-Abhaengigkeiten (Blood/Shortener) (verworfen)
- Verworfen: keine belegbare Aenderung zu Abhaengigkeiten im Root gefunden.
Etappe: Games-Sammelkarte
- Games-Karte fasst 2048+, Woertli und Fruits+ zusammen.
- Klick auf Games oeffnet eine eigene Games-Landing in der Hero-Section, die die drei Spiele startet.
- Buttontexte fuer Games auf "Zu den Games" angepasst.
- Wordle+ Bezeichnung vereinheitlicht (Landing + Spieltitel).
- Fruits+ in der Plattform benannt.
- Games-Assets fuer Wordle+/Fruits+ nutzen jetzt die definierte App-Basis-URL, damit Daten/Sounds geladen werden.
- Games-Embeds auf mobile Hoehe angepasst (keine 100vh in der Landing).
Etappe: Dev-PIDs Cleanup
scripts/dev.jsbeendet vorherige Dev-Prozesse per PID-File, damit Ports nicht blockiert bleiben.
Etappe: Dev-Start mit Logfile
npm run devkillt vorhandene Dev-Prozesse und schreibt die Ausgabe nachdev.log.
Etappe: Dev-Port Cleanup
scripts/dev.jsbeendet Prozesse auf den festen Dev-Ports (3000/5173/4201-4209), damit die Apps nicht auf Ausweichports starten.
Etappe: Dev-Port Cleanup (lsof Pfad)
scripts/dev.jsnutzt nun den absolutenlsof-Pfad, damit das Port-Killing auf macOS sicher greift.
Etappe: Landing Container & Mobile-Nav
- Landing-Inhalt (Header/Stats/App-Karten) wird nur angezeigt, wenn keine Embedded-App aktiv ist; Embedded-Apps ersetzen damit die Hero-Section.
- Navigation auf Mobile-First umgestellt: Logo + Sprache + Icon-Shortcuts, zusaetzlich Hamburger-Menue fuer die restlichen Links.
- Mobile-Nav erweitert: Login-Icon sichtbar wenn nicht eingeloggt, Menue mit allen Punkten; Hintergrund des Menues auf
gray-700. - Embedded-Apps zeigen nur ein Close-Icon rechts oben, ohne eigenen Titel-Header.
Etappe: 2048+ Mobile-Responsive
- Board-Groesse wird aus der Wrapper-Breite berechnet, damit es im View bleibt.
- 2048+ Layout stapelt Header/Controls auf kleinen Screens und reduziert Padding/Typo.
- Board nutzt jetzt max. 95% der View-Breite, geringere Margin/Padding fuer mehr Spielflaeche.
- Embedded-View reduziert Container-Padding und zeigt das Close-Icon als Overlay rechts oben.
- 2048+ Titel links ausgerichtet, kleinere Padding/Gaps fuer mehr Spielflaeche.
- 2048+ Board/Tile-Groesse weiter reduziert, Gap kleiner; Container-Rahmen im Embed entfernt.
- Grid-Size Buttons immer in einer Reihe (4 Spalten).
- Board-Container auf max. 90% der Wrapper-Breite begrenzt, Padding weiter reduziert.
- Board-Groesse kommt jetzt direkt aus der 90%-Wrapper-Berechnung, damit Grid-Cells und Tiles exakt gleich gross sind.
- 2048+ Board: Gap weiter reduziert, Wrapper-Padding wird exakt abgezogen, Min-Cell kleiner fuer 4x4 im View.
- 2048+ Board: Cell- und Tile-Groesse wird jetzt direkt aus
vw / gridSizeminus Gaps berechnet (keine festen Groessen). - 2048+ Board richtet sich an der Breite der Grid-Size-Auswahl aus (Brett = Selector-Breite minus Gaps).
- Referenz fuer Board-Breite ist jetzt
.grid-selector-buttons. - Board-Groesse = min(Selector, Wrapper) minus 2x Board-Umrandung (Gap), Cells daraus berechnet.
- Default CSS-Variablen fuer 2048+ (Board/Gap/Cell) angepasst.
- Grid-Columns/Rows im 2048+ Board werden in px gesetzt, damit Cells und Tiles exakt passen.
- Board-Maxbreite ist jetzt
100% - 2 * gap, Cell-Groesse daraus berechnet (inkl. Board-Umrandung). - Grid-Cells/Tiles werden nun ueber die Formel
(boardOuter - gap*(grid-1)) / gridexakt identisch berechnet. - 2048+ nutzt jetzt dieselbe Root-Quelle fuer CSS-Variablen bei Grid und Tiles, damit Position/Size konsistent bleiben.
Etappe: Wordle+ Daily Word (verworfen)
- Verworfen: im aktuellen
apps/wordle-plus/srckeine Daily-Word-Logik vorhanden.
Etappe: Games Assets Proxy
- Wordle+/Fruits+ Assets werden im Embed immer relativ zu
/apps/...geladen, damit der Vite-Proxy gleiche Origin bleibt (keine CORP-Blocks).
Etappe: Calculators Auswahl (V1)
- Geplant (V1, Prioritaet): Unit Converter, Zeitzonen-Umrechner, Data Size Converter, Nummern-Konverter (Binary/Decimal/Hex/Octal), Text/Encoding (Base64, URL Encode/Decode), Datum/Unix Timestamp.
- Offen (spaeter): CSV/JSON/XML Converter, String Utils (HTML/XML Escape/Unescape, Strip Tags), Hash-Generatoren (MD5/SHA1/SHA256/SHA512), Formatters (CSS/JS/JSON/SQL), Sonstiges (IP, Email-Validator, Is-It-Up).
Etappe: Calculators App (Start)
- Neue Svelte-Component
CalculatorsAppmit Tabs und V1-Umrechnern (Units, Timezone, Data, Numbers, Encoding, Date/Unix). - Landing-Embed und Registry-Eintrag fuer
calculatorshinzugefuegt. - Sync-Script setzt
calculatorsauf Statusready, damit die Karte sofort startbar ist. - Tabs im Calculators-Header duerfen umbrechen (so wenig Zeilen wie noetig).
Etappe: Calculators App (CSV/JSON/XML)
- CSV/JSON/XML Konverter hinzugefuegt (CSV↔JSON, JSON↔XML) inkl. Delimiter.
- CSV/JSON/XML → HTML/TSV hinzugefuegt (Tabellen-Output).
- CSV → XML und XML → CSV hinzugefuegt, plus Convert Files (csv/json/xml -> json/csv/xml/html/tsv).
Etappe: Calculators App (String Tools)
- HTML/XML Escape & Unescape sowie Strip-Tags hinzugefuegt.
- Word Counter und Regex-Tester hinzugefuegt.
- String-Konverter erweitert: Binary/Hex ↔ String, separate Strip-Optionen fuer HTML/XML.
Etappe: Calculators App (Hashes)
- Hash-Generatoren hinzugefuegt: MD5, SHA-1, SHA-256, SHA-512.
Etappe: Calculators App (Formatters)
- JSON Pretty/Minify und einfache Formatter fuer CSS/JS/SQL hinzugefuegt.
- Formatter-Liste erweitert (CSS, GO, HTML, JS Obfuscate, JSON Editor/Validator, Perl/PHP/Python/Ruby, XML).
Etappe: Calculators App (Internet Tools)
- Email Validator, URL Parser und "What is my IP" (ipify) hinzugefuegt.
- Binary/Hex String Encoder/Decoder hinzugefuegt (String↔Binary, String↔Hex).
- Internet-Tools erweitert: Is-It-Up Check, Router Defaults, User Manuals (Links).
Etappe: Calculators App (Web Dev)
- Web-Dev-Links integriert (Playground, Color Tools, CSS Fonts, Diff Tool, Regex Tools, RGB/HEX, Spritegen, Epoch/Unix, Speed Test).
Etappe: Calculators App (Encoders/Decoders)
- Kombinierter Tab fuer Base64, URL Encode/Decode und Hash Generatoren hinzugefuegt.
- Email-Validator trimmt Eingaben, damit gueltige Mails nicht faelschlich scheitern.
- Email-Regex korrigiert (escape Sequenzen bereinigt).
Etappe: Calculators App (Numbers)
- Zusaetzliche Basis-Ausgaben (Binary/Octal/Decimal/Hex) parallel angezeigt.
- Numbers-Converter-Optionen erweitert (Binary/Decimal/Hex/Octal in alle Richtungen).
- URL-Parser-Variablen umbenannt, um Namenskonflikt mit Encoding-Tab zu vermeiden.
- Regex fuer URL-Parser korrigiert (Svelte-Parse-Fehler behoben).
- Tile-Animation verlangsamt und Spawn-Delay eingefuegt, damit Bewegungen/Neue Tiles ruhiger wirken.
- CSS-Variablen fuer 2048+ werden direkt auf
.app-2048gesetzt, damit Cells/Tiles wirklich gleich bleiben.
Etappe: Calculators App (Time + Date/Unix)
- Date/Unix Tab in den Time-Tab integriert, damit kein Doppel-Tab existiert.
Etappe: Calculators App (Reverse Toggle)
- Alle hin/her-Umrechner verwenden jetzt ein 🔄-Icon fuer die Richtungsumkehr.
- Labels zeigen die Richtung mit gruenem Pfeil, Eingabefelder wechseln die Seite.
- Reverse-Button zeigt jetzt den Text "Umkehren 🔄".
Etappe: I18n Basis (Shared)
- Gemeinsames i18n-Helper-Modul hinzugefuegt, das Sprachen und Uebersetzungen aus der MongoDB-API lädt.
- Landing nutzt jetzt das Shared-Helper fuer Sprache/Translation (preferredLanguage zentral).
- GrammarAI i18n ist auf DB-Quelle umgestellt und nutzt die zentrale Spracheinstellung.
Etappe: I18n Calculators (Start)
- CalculatorsApp nutzt jetzt DB-Translations ueber Shared-i18n.
- UI-Texte sind per
t()verschluesselt und in der DB hinterlegt.
Etappe: I18n Shortener (Embed)
- ShortenerApp bindet Shared-i18n ein und nutzt DB-Keys fuer alle UI-Texte.
- Fehlende Embed-Keys wurden in der DB ergaenzt.
Etappe: Embedded Container Spacing
- Embedded-Container nutzt
px-1 py-1fuer mehr Nutzflaeche, Close-Icon weiter nach unten (top-6).
Etappe: I18n QR-Code-Generator (Embed)
- QrcodeApp nutzt Shared-i18n und t()-Keys fuer UI, Fehler, Confirm und Toasts.
- QR-Typen, Labels, Actions und Hints sind in der DB hinterlegt.
Etappe: I18n Games Landing (Embed)
- GamesLanding nutzt Shared-i18n fuer Spielnamen und CTA.
- Deutsche Seed-Texte liegen in der DB (Translation-Collection); keine Dateien.
Etappe: I18n Game 2048+
- 2048+ nutzt Shared-i18n fuer UI-Labels, Overlay und Autoplay-Text.
- Game-Logik nutzt data-Attribute fuer dynamische Texte (Game Over, Autoplay).
- Deutsche Seed-Texte liegen in der DB (Translation-Collection); keine Dateien.
Etappe: I18n Game Wordle+
- Wordle+ nutzt Shared-i18n fuer Titel, CTA und Meldungen.
- UI-Texte werden via
window.__wordleUiTextsin die Spiel-Logik gereicht. - Deutsche Seed-Texte liegen in der DB (Translation-Collection); keine Dateien.
Etappe: I18n Game Fruits+
- Fruits+ nutzt Shared-i18n fuer UI-Texte, Dialoge und Highscore-Anzeigen.
- Spiel-Logik liest UI-Strings aus
window.__fruitsPlusUiTexts. - Deutsche Seed-Texte liegen in der DB (Translation-Collection); keine Dateien.
Etappe: I18n Pfadfixes (Games + GrammarAI) (teilweise)
- Games setzen Asset-Base via
window.__*AssetBaseim Embed; GrammarAI hat keinen nachweisbaren Pfadfix.
Etappe: I18n WasserReminder (WebApp)
- WasserReminder nutzt Shared-i18n ueber
language.jsund setztwindow.langaus DB-Translations. - Language-Modal bezieht verfuegbare Sprachen aus der DB (gefiltert auf bekannte Codes).
- Reminder/Charts/Toasts nutzen DB-Strings statt Hardcodes.
- Deutsche Seed-Texte liegen in der DB (Translation-Collection); keine Dateien.
Etappe: I18n QR-Code (Standalone)
- Standalone QR-Code-App nutzt Shared-i18n fuer UI, Fehler, Confirm und Toasts.
- QR-Typen/Labels verwenden die gleichen Keys wie das Embedded-Widget.
Etappe: I18n Shortener (Standalone)
- Standalone Shortener laedt UI-Translations ueber Shared-i18n in svelte-i18n (DB als Quelle).
Etappe: I18n WordClock (Standalone)
- WordClock laedt Zeittexte und UI-Labels aus der DB (Shared-i18n), mit Fallback auf
timeTexts.json. - Arrays werden aus DB-Strings rekonstruiert (Texts/PrefixRules).
Etappe: I18n Blood (WebApp)
- Blood nutzt Shared-i18n im LanguageStore (DB-Quelle), inkl. globaler Spracheinstellung.
- Sprachliste wird aus der DB bezogen; Fallback bleibt lokal verfuegbar.
- Seed-Texte liegen in der DB (Translation-Collection); keine Dateien.
Etappe: I18n Qr-Code-Doorbell (Platform + App)
- Doorbell-Beschreibung ist in den Plattform-Translations unter
app.description.qrshortdoorbellhinterlegt. - Plattform-Texte fuer Doorbell-UI sind in der DB hinterlegt.
Etappe: Layout + Umlaute (MultiApps) (verworfen)
- Verworfen: keine belegbare Aenderung gefunden.
Etappe: Landing i18n (Apps + Menue + Buttons)
- App-Titel, Buttons und Menueeintraege in Landing nutzen jetzt t()-Keys.
- Kurzbeschreibungen der Apps werden ueber
app.description.<slug>geladen. - Games-Landing zeigt i18n-Kurzbeschreibungen fuer alle drei Spiele.
Etappe: App-Vorschlaege im Footer
- Footer-Modal nutzt jetzt den Titel "Korrektur vorschlagen" und laedt alle Texte aus der DB.
- Wenn zuletzt eine App genutzt wurde, wird die App im Modal angezeigt und als App-Vorschlag gespeichert.
- Backend speichert App-Vorschlaege mit
type=app,appSlugund Statusneu.
Etappe: Translation-Konsolidierung (DB)
- Translation-Model/Controller unterstützen jetzt app-übergreifende Einträge ueber
apps. - Home-Translations setzen
app.description.*undapp.long_description.*fuer alle Apps im Eintrag. - Seed-Script konsolidiert Übersetzungen nach identischem Key+Text und aktualisiert die DB-Einträge.
- Übersetzungen liegen ausschließlich in der DB; keine Übersetzungsordner im Code.
Etappe: Translation-Backfill (API)
- Backfill-Endpoint ergänzt, der fehlende Übersetzungen automatisch uebersetzt und speichert.
- Fehlende Sprachen werden per 1:1-Textkopie (bevorzugt de/en) ergänzt, ohne externe Übersetzungsdienste.
- Translation-Controller behandelt Map- und Objekt-Strukturen robust beim Lesen.
- Translation-Controller toleriert Konflikte zwischen String- und Objekt-Keys (z.B.
app.titlevs.app.title.*). - Landing laedt
home/initohne Cache, damit Sprachwechsel sicher greifen. - Footer-Rechtezeile nutzt nun i18n-Keys.
- Home-Controller gibt Übersetzungen auch bei fehlenden Sprach-Sätzen zurück (kein "translating" Block mehr).
- Landing merged Platform-Translations explizit nach dem
home/init, damit Header/Footer sicher aktualisiert werden. - Landing erzwingt bei Sprachwechsel ein Re-Render von Header/Stats/Footer ueber
#key selectedLang. - Home-Controller beruecksichtigt Plattform-Keys auch dann, wenn sie via
appsdedupliziert sind. - Landing aktualisiert
t()reaktiv, damit Übersetzungen ohne Reload erscheinen. - Landing-Layout: Nav, Content-Container und Footer erhalten kleinere Padding-Werte fuer Mobile-First.
- App-Titel in der Nav bekommt ein nicht umbrechbares Leerzeichen fuer minimalen Abstand.
- Footer-Padding reduziert und
mt-autoentfernt, damit der Footer nicht nach unten wandert. - Hauptlayout nutzt
h-screen+overflow-hidden, damit Nav/Footer sticky bleiben und die Hero-Section scrollt. - Dummy-Werbebanner ergänzt: Mobile ueber dem Footer, Desktop/Tablet links/rechts/bottom.
- Werbebanner werden nur fuer Nicht-Paid/AdFree/Non-Admin angezeigt; Content-Container bekommt seitliche Reserve, damit Karten nicht ueberdeckt werden.
- Auto-Tag Script fuer Ads in
frontend-svelte/index.htmleingebunden.
Etappe: App-Start Buttons (Landing/Profil/Modal)
- Start-Buttons in Landing, Profil und App-Modal nutzen jetzt eine gemeinsame Start-Logik, die eingebettete Apps in der Hero-Section oeffnet.
Etappe: App-Tier Anzeige in App-Ansichten
- In eingebetteten App-Ansichten wird der aktuelle Status (Free/Paid/Admin) inkl. verbleibender Free-Tage angezeigt.
Etappe: Paid/Free Aktivierung im App-Modal
- Free-Tier, abgelaufene Free-Tier und Paid-Aktivierung werden im App-Modal generisch pro Slug angeboten.
- Free-Tier-Aktivitaet beachtet jetzt Ablaufdatum, Paid-Aktivierung nutzt
/api/v1/billing/checkout. - Werbe-Logik zeigt Ads in App-Ansichten nur, wenn die aktive App nicht als Paid/AdFree markiert ist.
- Paid-Jahresbetrag ist jetzt leer und zeigt nur den Placeholder "min. 12€/Jahr".
Etappe: Blood Paid-Ablaufdatum im Titel
- Blood-App zeigt Paid-Ablaufdatum direkt neben dem Titel (aus
/api/v1/auth/apps), die separate Statuszeile in der Landing wurde entfernt.
Etappe: Access-Label fuer alle Apps
- Gemeinsamer Helper
shared/appAccess.jsliefert Access-Label (Paid/Free-Tier) pro App. - Alle eingebetteten Apps zeigen den Access-Status neben dem jeweiligen App-Titel.
Etappe: Free-Tier Ablaufschutz (App-Start)
- Starten von Apps blockiert jetzt abgelaufene Free-Tiers und zeigt ein Modal mit Hinweis + Paid-Option.
Etappe: Nav/Footer Border (verworfen)
- Verworfen: kein belegbarer Border im aktuellen Layout.
Etappe: Nav/Footer Ebenen
- Nav und Footer liegen ueber dem Content (hoher z-index), Content-Scrollbereich liegt darunter.
- Footer zeigt das aktuelle Jahr dynamisch an und hat hoechsten z-index.
- Content-Scrollbereich hat jetzt immer Bottom-Padding, damit der Footer-Border nicht ueberdeckt wird.
- Footer ist zusaetzlich isoliert und hat hoechsten Stack, damit der Border sichtbar bleibt.
- App-Container hat unteren Abstand, damit er nicht in den Footer läuft.
- Scroll-Container nutzt ein Footer-Height-Offset, damit der Footer-Border sichtbar bleibt und Scrollen aktiv ist.
- Nav und Footer sind auf
z-50, Content-Container explizit aufz-0.
Etappe: Paid-Aktivierung Start
- Nach erfolgreicher Paid-Aktivierung startet die gewaehlte App sofort aus dem Modal.
Etappe: Games Aktivierung Mapping
- Games-Modal aktiviert/paid jetzt den ersten Game-Slug, damit die Games-Ansicht nicht im Freischaltungs-Kreis haengt.
- Free-Tier fuer Games nutzt nun den ersten noch nicht aktivierten Game-Slug und blockt, wenn alle belegt sind.
Etappe: App-Name in User-Apps
- User-Apps speichern jetzt
appNamezusaetzlich zurappId(Activation, Billing, GrammarAI, Admin-Add, Seed).
Etappe: Backfill appName
- Script
backend/scripts/backfillUserAppNames.jsfuellt fehlendeappNamein User-Apps nach.
Etappe: QR‑Shortdoorbell prüfen
- Owner‑Profile und QR‑Erzeugung
- Server‑seitige QR‑Generierung
- Tier‑Regeln, Radius/GPS‑Validierung
- Keine Kontaktanzeige im Free‑Tier
- Integration in dev‑Proxy (nach Server‑Start)
Audit: AblaufProtokoll Verifikation (2026-01-20)
Geprueft per statischer Code-Inspektion (ohne Runtime-Tests). Abweichungen zum aktuellen Stand:
- Dev-Start via Concurrently:
npm run devnutztscripts/dev.js(kein nodemon/concurrently mehr). - Login sichtbar auf Landingpage: Quick-Login ist nicht mehr vorhanden (spaeter wieder entfernt).
- App-Start Static Routing + Dashboard Label: Priorisierung
public/dist/buildist im aktuellenbackend/server.jsnicht vorhanden. - Public-Ordner deaktiviert: Root
xxpublic/ist nicht vorhanden;frontend-sveltebuildt nach../public/ui. - Einbettung rueckgebaut + Games umbenannt: Blood/Wasser/Games sind aktuell wieder eingebettet (
frontend-svelte/src/apps/*). - Landing stabilisiert + doppelte Assets entfernt:
frontend-svelte/src/apps/BloodApp.svelteundfrontend-svelte/src/apps/WasserReminderApp.sveltesind vorhanden (nicht entfernt). - Blood/Wasser/Games Assets in
frontend-svelte/public/*: Verzeichnisseassets/,games/,wasser/existieren nicht mehr. - Shortener-URL Schema: UI und Backend nutzen weiterhin
/s/(backend/server.js,apps/shortener/src/components/Dashboard.svelte). - QR-URL nur Slug / Slug-Validierung: aktueller QR-Generator nimmt echte URLs, kein Slug-Input im UI.
- GrammarAI Fix (Translations Import):
translations.tswird nicht importiert;apps/grammarAi/WebApp/src/lib/i18n.jsnutztshared/i18n.js. - I18n-Quellen: Es existieren noch Übersetzungsdateien im Repo (z.B.
apps/blood/WebApp/src/lib/lang,apps/wasserReminder/public/wasser/js/languages,apps/shortener/public/languages,apps/WordClock/timeTexts.json). - Sensitive Dateien entfernt:
anmeldeDaten.txtist noch im Root vorhanden.
Etappe: App-Flags (running/translated/isSvelte)
- App-Schema um
flagserweitert (backend/models/App.js). - Sync-Script setzt fehlende Flags standardmaessig (
backend/scripts/syncAppRegistry.js). npm run db:sync:appsausgefuehrt.
Etappe: Svelte-Fallbacks in DB seed
- Script
backend/scripts/seedSvelteFallbacks.jserstellt (Sveltet()/translate()Fallbacks alsde). - 28 Sprachen per Copy-Backfill gesetzt (keine externen Quellen).
- Script in Root-
package.jsonalsdb:seed:svelte-fallbacksregistriert. npm run db:seed:svelte-fallbacksausgefuehrt.
Etappe: WordClock State API
- WordClock-Logik serverseitig bereitgestellt (
backend/utils/wordClock.js). - Endpoint
/api/v1/wordclock/stateliefert Matrix + aktive Positionen. - WordClock-Frontend ruft den Server-State zyklisch ab (
apps/WordClock/WebApp/src/App.svelte).
Naechste Schritte (fixe Reihenfolge)
- Games (2048+/Wordle+/Fruits+) serverseitig + i18n komplett
- QrCodeGenerator serverseitig (Payload-Logik) + i18n komplett
- Shortener serverseitig (Validation/URL-Logik) + i18n komplett
- Blood/WasserReminder/GrammarAi serverseitig + i18n komplett
Etappe: Games (2048+/Wordle+/Fruits+) serverseitig + i18n komplett
- 2048+ Logik auf Server verlagert (Session + Moves + AI) und Client auf API umgestellt.
- Wordle+ nutzt Server-Sessions fuer Tageswort, Gueltigkeitspruefung und Farben; Client sendet Guesses.
- Fruits+ Match-3 Engine serverseitig (Swaps, Powerups, Matches, Bonuspunkte) inkl. Hint-API; Client rendert nur noch State.