diff --git a/.github/workflows/cd-macmini.yml b/.github/workflows/cd-macmini.yml index 8a75ff396..fca2bbafe 100644 --- a/.github/workflows/cd-macmini.yml +++ b/.github/workflows/cd-macmini.yml @@ -47,8 +47,6 @@ on: - mana-web - mana-api - manavoxel-web - - memoro-server - - memoro-audio-server concurrency: group: cd-macmini @@ -144,8 +142,6 @@ jobs: "mana-web|apps/mana/apps/web/ apps/mana/packages/" "mana-api|apps/api/" "manavoxel-web|apps/manavoxel/apps/web/ apps/manavoxel/packages/" - "memoro-server|apps/memoro/apps/server/ apps/memoro/packages/" - "memoro-audio-server|apps/memoro/apps/audio-server/" ) echo "Changed files (first 40):" @@ -439,7 +435,6 @@ jobs: mana-api) echo "http://localhost:3060/health" ;; mana-web) echo "http://localhost:5000/health" ;; manavoxel-web) echo "http://localhost:5028/health" ;; - memoro-server) echo "http://localhost:3015/health" ;; *) echo "" ;; esac } diff --git a/apps/mana/apps/web/src/hooks.server.ts b/apps/mana/apps/web/src/hooks.server.ts index 7826896f9..00ac5d8df 100644 --- a/apps/mana/apps/web/src/hooks.server.ts +++ b/apps/mana/apps/web/src/hooks.server.ts @@ -35,10 +35,6 @@ const PUBLIC_SYNC_SERVER_URL_CLIENT = process.env.PUBLIC_SYNC_SERVER_URL_CLIENT || process.env.PUBLIC_SYNC_SERVER_URL || ''; const PUBLIC_ULOAD_SERVER_URL_CLIENT = process.env.PUBLIC_ULOAD_SERVER_URL_CLIENT || process.env.PUBLIC_ULOAD_SERVER_URL || ''; -// memoro-server is intentionally not injected — the unified web app's memoro -// module is fully local-first (recorder + Dexie + sync) and never calls the -// standalone server. The memoro-server compose service still exists for the -// mobile app, but mana.how does not depend on it. const PUBLIC_MANA_MEDIA_URL_CLIENT = process.env.PUBLIC_MANA_MEDIA_URL_CLIENT || process.env.PUBLIC_MANA_MEDIA_URL || ''; const PUBLIC_MANA_LLM_URL_CLIENT = @@ -158,7 +154,6 @@ const APP_SUBDOMAINS = new Set([ 'inventory', 'times', 'uload', - 'memoro', 'questions', ]); diff --git a/apps/mana/apps/web/src/lib/app-registry/apps.ts b/apps/mana/apps/web/src/lib/app-registry/apps.ts index 041175cd6..8bbc8ef17 100644 --- a/apps/mana/apps/web/src/lib/app-registry/apps.ts +++ b/apps/mana/apps/web/src/lib/app-registry/apps.ts @@ -28,7 +28,6 @@ import { HardDrives, Presentation, Package, - Microphone, NumberCircleOne, Binoculars, ArrowsInCardinal, @@ -103,7 +102,7 @@ import { // dreams · firsts · lasts · habits · recipes // Places & ev.: places · events // Creative: picture · music · photos -// Tools: memoro · uload · calc · inventory · +// Tools: uload · calc · inventory · // storage · skilltree · questions // Long-tail: quotes · automations · companion · wetter · // goals · website · spaces · augur · @@ -659,17 +658,6 @@ registerApp({ }, }); -registerApp({ - id: 'memoro', - name: 'Memoro', - color: '#F59E0B', - icon: Microphone, - views: { - list: { load: () => import('$lib/modules/memoro/ListView.svelte') }, - detail: { load: () => import('$lib/modules/memoro/views/DetailView.svelte') }, - }, -}); - registerApp({ id: 'questions', name: 'Questions', diff --git a/apps/mana/apps/web/src/lib/app-registry/help-content.ts b/apps/mana/apps/web/src/lib/app-registry/help-content.ts index ca2d49b8c..859722cec 100644 --- a/apps/mana/apps/web/src/lib/app-registry/help-content.ts +++ b/apps/mana/apps/web/src/lib/app-registry/help-content.ts @@ -293,21 +293,6 @@ export const MODULE_HELP: Record = { 'Standorte können verschachtelt sein (Zuhause → Büro → Schreibtisch)', ], }, - memoro: { - description: - 'Sprachnotizen aufnehmen und automatisch transkribieren lassen. Durchsuchbar, zusammengefasst und verschlüsselt.', - features: [ - 'Aufnahme mit einem Tap', - 'AI-Transkription (Whisper — läuft lokal im Browser)', - 'Automatische Zusammenfassung & Intro', - 'Durchsuchbare Memos im Volltext', - 'Verschlüsselter Transkript-Text', - ], - tips: [ - 'Die Transkription läuft direkt im Browser — deine Stimme verlässt nie dein Gerät', - 'Nutze Memos als schnelle Gedankennotizen unterwegs', - ], - }, questions: { description: 'Fragen sammeln und Antworten festhalten — ein persönliches Q&A-Archiv für Dinge die du herausfinden möchtest.', diff --git a/apps/mana/apps/web/src/lib/data/crypto/plaintext-allowlist.ts b/apps/mana/apps/web/src/lib/data/crypto/plaintext-allowlist.ts index 77f86e002..a0af5a8ef 100644 --- a/apps/mana/apps/web/src/lib/data/crypto/plaintext-allowlist.ts +++ b/apps/mana/apps/web/src/lib/data/crypto/plaintext-allowlist.ts @@ -66,9 +66,6 @@ export const PLAINTEXT_ALLOWLIST: readonly string[] = [ 'manaLinks', // TODO: audit 'markers', // TODO: audit 'mealTags', // TODO: audit - 'memoSpaces', // TODO: audit - 'memoTags', // TODO: audit - 'memoroSpaces', // TODO: audit 'moodTags', // TODO: audit 'moods', // TODO: audit 'mukkeProjects', // TODO: audit @@ -96,7 +93,6 @@ export const PLAINTEXT_ALLOWLIST: readonly string[] = [ 'skillTags', // TODO: audit 'skills', // TODO: audit 'songTags', // TODO: audit - 'spaceMembers', // TODO: audit 'storageFolders', // TODO: audit 'taskLabels', // TODO: audit 'timeAlarms', // TODO: audit diff --git a/apps/mana/apps/web/src/lib/data/crypto/registry.ts b/apps/mana/apps/web/src/lib/data/crypto/registry.ts index 01856a0fa..7f59bd6cb 100644 --- a/apps/mana/apps/web/src/lib/data/crypto/registry.ts +++ b/apps/mana/apps/web/src/lib/data/crypto/registry.ts @@ -77,7 +77,6 @@ import type { LocalMessage, LocalConversation, LocalTemplate } from '../../modul import type { LocalNote } from '../../modules/notes/types'; import type { LocalDream, LocalDreamSymbol } from '../../modules/dreams/types'; import type { LocalJournalEntry } from '../../modules/journal/types'; -import type { LocalMemo } from '../../modules/memoro/types'; import type { LocalInvoice, LocalInvoiceClient, @@ -141,13 +140,6 @@ export const ENCRYPTION_REGISTRY: Record = { // is encrypted. dreamSymbols: entry(['meaning']), - // ─── Memoro ────────────────────────────────────────────── - // Voice transcripts are typically the largest plaintext blobs in the - // whole app — encrypting them yields the biggest disk-footprint win - // of any single field. - memos: entry(['title', 'intro', 'transcript']), - memories: { enabled: true, fields: ['title', 'content'] }, - // ─── Contacts ──────────────────────────────────────────── contacts: { enabled: true, diff --git a/apps/mana/apps/web/src/lib/data/database.ts b/apps/mana/apps/web/src/lib/data/database.ts index 376fa5938..5675cb0da 100644 --- a/apps/mana/apps/web/src/lib/data/database.ts +++ b/apps/mana/apps/web/src/lib/data/database.ts @@ -1559,6 +1559,22 @@ db.version(63).stores({ whoMessages: null, }); +// v64 — Memoro module retirement (2026-05-18). +// Memoro lebt als eigenständiger Stack auf memoro-app.mana.how / +// memoro-api.mana.how / memoro-audio.mana.how aus Code/memoro/ → +// ~/projects/memoro-deploy/. Die unified-App-Surface (Modul + +// memoro-server-Container im managarten-Compose) wird hier gedroppt. +// dropped: memos, memories, memoTags, memoroSpaces, spaceMembers, +// memoSpaces. +db.version(64).stores({ + memos: null, + memories: null, + memoTags: null, + memoroSpaces: null, + spaceMembers: null, + memoSpaces: null, +}); + // ─── Sync Routing ────────────────────────────────────────── // SYNC_APP_MAP, TABLE_TO_SYNC_NAME, TABLE_TO_APP, SYNC_NAME_TO_TABLE, // toSyncName() and fromSyncName() are now derived from per-module diff --git a/apps/mana/apps/web/src/lib/data/module-registry.test.ts b/apps/mana/apps/web/src/lib/data/module-registry.test.ts index 61a772623..6c59bb9de 100644 --- a/apps/mana/apps/web/src/lib/data/module-registry.test.ts +++ b/apps/mana/apps/web/src/lib/data/module-registry.test.ts @@ -222,7 +222,6 @@ describe('module-registry — snapshot', () => { questions: ['qCollections', 'questions', 'answers', 'questionTags'], uload: ['links', 'uloadTags', 'uloadFolders', 'linkTags'], calc: ['calculations', 'savedFormulas'], - memoro: ['memos', 'memories', 'memoTags', 'memoroSpaces', 'spaceMembers', 'memoSpaces'], guides: ['guides', 'sections', 'steps', 'guideCollections', 'runs', 'guideTags'], habits: ['habits', 'habitLogs'], notes: ['notes', 'noteTags'], @@ -310,7 +309,6 @@ describe('module-registry — snapshot', () => { qCollections: 'collections', uloadTags: 'tags', uloadFolders: 'folders', - memoroSpaces: 'spaces', guideCollections: 'collections', socialEvents: 'events', financeCategories: 'categories', diff --git a/apps/mana/apps/web/src/lib/data/module-registry.ts b/apps/mana/apps/web/src/lib/data/module-registry.ts index 550e85316..6ff0c7c10 100644 --- a/apps/mana/apps/web/src/lib/data/module-registry.ts +++ b/apps/mana/apps/web/src/lib/data/module-registry.ts @@ -67,7 +67,6 @@ import { timesModuleConfig } from '$lib/modules/times/module.config'; import { questionsModuleConfig } from '$lib/modules/questions/module.config'; import { uloadModuleConfig } from '$lib/modules/uload/module.config'; import { calcModuleConfig } from '$lib/modules/calc/module.config'; -import { memoroModuleConfig } from '$lib/modules/memoro/module.config'; import { guidesModuleConfig } from '$lib/modules/guides/module.config'; import { habitsModuleConfig } from '$lib/modules/habits/module.config'; import { notesModuleConfig } from '$lib/modules/notes/module.config'; @@ -124,7 +123,6 @@ export const MODULE_CONFIGS: readonly ModuleConfig[] = [ questionsModuleConfig, uloadModuleConfig, calcModuleConfig, - memoroModuleConfig, guidesModuleConfig, habitsModuleConfig, notesModuleConfig, diff --git a/apps/mana/apps/web/src/lib/data/privacy/exposed-records.ts b/apps/mana/apps/web/src/lib/data/privacy/exposed-records.ts index 753b388eb..b4b9dcada 100644 --- a/apps/mana/apps/web/src/lib/data/privacy/exposed-records.ts +++ b/apps/mana/apps/web/src/lib/data/privacy/exposed-records.ts @@ -187,18 +187,6 @@ const TABLES: TableConfig[] = [ return eventsStore.setVisibility(id, next); }, }, - { - module: 'memoro', - collection: 'memos', - moduleLabel: 'Memoro', - encrypted: true, - title: (r) => asString(r.title ?? r.intro), - href: (id) => `/memoro/${id}`, - setVisibility: async (id, next) => { - const { memosStore } = await import('$lib/modules/memoro/stores/memos.svelte'); - return memosStore.setVisibility(id, next); - }, - }, { module: 'presi', collection: 'presiDecks', diff --git a/apps/mana/apps/web/src/lib/data/tools/init.ts b/apps/mana/apps/web/src/lib/data/tools/init.ts index f1c65a919..41251551d 100644 --- a/apps/mana/apps/web/src/lib/data/tools/init.ts +++ b/apps/mana/apps/web/src/lib/data/tools/init.ts @@ -20,7 +20,6 @@ import { socialEventsTools } from '$lib/modules/events/tools'; import { musicTools } from '$lib/modules/music/tools'; import { storageTools } from '$lib/modules/storage/tools'; import { chatTools } from '$lib/modules/chat/tools'; -import { memoroTools } from '$lib/modules/memoro/tools'; import { skilltreeTools } from '$lib/modules/skilltree/tools'; import { periodTools } from '$lib/modules/period/tools'; import { firstsTools } from '$lib/modules/firsts/tools'; @@ -69,7 +68,6 @@ export function initTools(): void { registerTools(musicTools); registerTools(storageTools); registerTools(chatTools); - registerTools(memoroTools); registerTools(skilltreeTools); registerTools(periodTools); registerTools(firstsTools); diff --git a/apps/mana/apps/web/src/lib/i18n/locales/apps/de.json b/apps/mana/apps/web/src/lib/i18n/locales/apps/de.json index 6e215d72a..5e18b3342 100644 --- a/apps/mana/apps/web/src/lib/i18n/locales/apps/de.json +++ b/apps/mana/apps/web/src/lib/i18n/locales/apps/de.json @@ -17,7 +17,6 @@ "storage": "Speicher", "presi": "Presi", "inventory": "Inventar", - "memoro": "Memoro", "questions": "Recherche", "skilltree": "Skills", "uload": "uLoad", diff --git a/apps/mana/apps/web/src/lib/i18n/locales/apps/en.json b/apps/mana/apps/web/src/lib/i18n/locales/apps/en.json index f979a6d66..6a9f2579a 100644 --- a/apps/mana/apps/web/src/lib/i18n/locales/apps/en.json +++ b/apps/mana/apps/web/src/lib/i18n/locales/apps/en.json @@ -17,7 +17,6 @@ "storage": "Storage", "presi": "Presi", "inventory": "Inventory", - "memoro": "Memoro", "questions": "Research", "skilltree": "Skills", "uload": "uLoad", diff --git a/apps/mana/apps/web/src/lib/i18n/locales/apps/es.json b/apps/mana/apps/web/src/lib/i18n/locales/apps/es.json index 042050855..b4ce3114f 100644 --- a/apps/mana/apps/web/src/lib/i18n/locales/apps/es.json +++ b/apps/mana/apps/web/src/lib/i18n/locales/apps/es.json @@ -17,7 +17,6 @@ "storage": "Almacén", "presi": "Presi", "inventory": "Inventario", - "memoro": "Memoro", "questions": "Investigación", "skilltree": "Skills", "uload": "uLoad", diff --git a/apps/mana/apps/web/src/lib/i18n/locales/apps/fr.json b/apps/mana/apps/web/src/lib/i18n/locales/apps/fr.json index a1708c2e0..deda7bbc8 100644 --- a/apps/mana/apps/web/src/lib/i18n/locales/apps/fr.json +++ b/apps/mana/apps/web/src/lib/i18n/locales/apps/fr.json @@ -17,7 +17,6 @@ "storage": "Stockage", "presi": "Presi", "inventory": "Inventaire", - "memoro": "Memoro", "questions": "Recherche", "skilltree": "Skills", "uload": "uLoad", diff --git a/apps/mana/apps/web/src/lib/i18n/locales/apps/it.json b/apps/mana/apps/web/src/lib/i18n/locales/apps/it.json index 1f0ca10b0..09a59a702 100644 --- a/apps/mana/apps/web/src/lib/i18n/locales/apps/it.json +++ b/apps/mana/apps/web/src/lib/i18n/locales/apps/it.json @@ -17,7 +17,6 @@ "storage": "Archivio", "presi": "Presi", "inventory": "Inventario", - "memoro": "Memoro", "questions": "Ricerca", "skilltree": "Skills", "uload": "uLoad", diff --git a/apps/mana/apps/web/src/lib/i18n/locales/memoro/de.json b/apps/mana/apps/web/src/lib/i18n/locales/memoro/de.json deleted file mode 100644 index 44a1a121e..000000000 --- a/apps/mana/apps/web/src/lib/i18n/locales/memoro/de.json +++ /dev/null @@ -1,336 +0,0 @@ -{ - "common": { - "save": "Speichern", - "cancel": "Abbrechen", - "delete": "Löschen", - "edit": "Bearbeiten", - "share": "Teilen", - "back": "Zurück", - "next": "Weiter", - "done": "Fertig", - "loading": "Wird geladen...", - "search": "Suchen", - "settings": "Einstellungen", - "yes": "Ja", - "no": "Nein", - "ok": "OK", - "error": "Fehler", - "success": "Erfolg", - "create": "Erstellen", - "confirm": "Bestätigen", - "close": "Schließen", - "or": "ODER" - }, - "nav": { - "dashboard": "Dashboard", - "tags": "Tags", - "spaces": "Spaces", - "mana": "Mana", - "blueprints": "Vorlagen", - "statistics": "Statistiken", - "settings": "Einstellungen", - "logout": "Abmelden", - "expand": "Erweitern", - "minimize": "Minimieren", - "shortcuts": "Tastenkombinationen" - }, - "auth": { - "welcome": "Willkommen bei Memoro", - "get_started": "Los geht's", - "create_account": "Neues Konto erstellen", - "sign_in": "Anmelden", - "sign_in_with_email": "Mit E-Mail anmelden", - "sign_up_with_email": "Mit E-Mail registrieren", - "email": "E-Mail", - "password": "Passwort", - "confirm_password": "Passwort bestätigen", - "forgot_password": "Passwort vergessen?", - "reset_password": "Passwort zurücksetzen", - "logging_in": "Anmelden...", - "creating_account": "Konto wird erstellt...", - "sending": "Senden...", - "error_email_required": "Bitte gib deine E-Mail-Adresse ein", - "error_password_required": "Bitte gib dein Passwort ein", - "error_confirm_password": "Bitte bestätige dein Passwort", - "error_passwords_not_match": "Passwörter stimmen nicht überein", - "error_password_too_short": "Das Passwort muss mindestens 8 Zeichen lang sein", - "error_password_requirements": "Das Passwort muss mindestens einen Kleinbuchstaben, einen Großbuchstaben, eine Ziffer und ein Sonderzeichen enthalten", - "error_registration_failed": "Registrierung fehlgeschlagen", - "password_requirement": "Passwort muss mindestens 8 Zeichen lang sein und mindestens einen Kleinbuchstaben, einen Großbuchstaben, eine Ziffer und ein Sonderzeichen enthalten.", - "registration_success": "Registrierung erfolgreich! Überprüfe deine E-Mail, um dein Konto zu bestätigen.", - "check_email_confirmation": "Bitte überprüfe deine E-Mail, um dein Konto zu bestätigen.", - "reset_email_sent": "Gib deine E-Mail-Adresse ein und wir senden dir einen Link zum Zurücksetzen deines Passworts.", - "email_only_title": "Warum nur E-Mail-Authentifizierung?", - "email_only_info": "Wir unterstützen nur E-Mail-Registrierung, um deine Unabhängigkeit und Privatsphäre zu gewährleisten.", - "email_only_learn_more": "Mehr erfahren", - "email_only_intro": "Wir glauben daran, dir die volle Kontrolle über dein Konto und deine Daten zu geben. Mit E-Mail-basierter Authentifizierung stellen wir sicher:", - "email_only_benefit_1_title": "Kein Vendor Lock-in", - "email_only_benefit_1_desc": "Du bist nicht von Drittanbietern wie Google oder Apple abhängig. Dein Konto funktioniert unabhängig.", - "email_only_benefit_2_title": "Verbesserte Privatsphäre", - "email_only_benefit_2_desc": "Wir teilen deine Daten nicht mit Google, Apple oder anderen Drittanbietern zur Authentifizierung.", - "email_only_benefit_3_title": "Konto-Portabilität", - "email_only_benefit_3_desc": "Deine E-Mail-Adresse ist portabel und funktioniert auf allen Geräten und Plattformen.", - "email_only_benefit_4_title": "Direkte Kommunikation", - "email_only_benefit_4_desc": "Wir können dich direkt über wichtige Updates erreichen, ohne auf Drittanbieter-Benachrichtigungssysteme angewiesen zu sein.", - "email_only_modal_footer": "Wir sind verpflichtet, Tools zu entwickeln, die deine Freiheit und Privatsphäre respektieren. E-Mail-Authentifizierung ist Teil dieser Verpflichtung.", - "got_it": "Verstanden", - "already_have_account": "Hast du bereits ein Konto?", - "dont_have_account": "Noch kein Konto?", - "terms_agreement": "Mit der Nutzung von Memoro stimmst du unseren AGB und der Datenschutzerklärung zu.", - "mana_login": "Mana Login", - "mana_login_description": "Ein Login für alle Mana Apps", - "mana_login_benefit_0": "Mana Subscriptions über alle Apps hinweg nutzen - nur einmal zahlen und alles nutzen", - "back": "Zurück", - "reset_password_description": "Gib deine E-Mail-Adresse ein und wir senden dir einen Link zum Zurücksetzen deines Passworts.", - "reset_password_error": "Passwort zurücksetzen fehlgeschlagen", - "reset_password_success": "E-Mail wurde versendet!", - "reset_password_rate_limit": "Zu viele Versuche. Bitte warte einige Minuten.", - "reset_email_sent_description": "Wir haben eine E-Mail mit Anweisungen zum Zurücksetzen deines Passworts an {email} gesendet. Bitte überprüfe deinen Posteingang und Spam-Ordner.", - "back_to_login": "Zurück zum Login", - "resend_email": "E-Mail erneut senden", - "reset_email_sent_title": "E-Mail wurde versendet!", - "terms_agreement_conjunction": "und der", - "terms_agreement_suffix": "zu.", - "oauth_error_access_denied": "Zugriff verweigert. Die Anmeldung wurde abgebrochen.", - "oauth_error_server_error": "Server-Fehler bei der Authentifizierung. Bitte versuche es erneut.", - "oauth_error_temporarily_unavailable": "Der Authentifizierungsdienst ist vorübergehend nicht verfügbar. Bitte versuche es später erneut.", - "oauth_error_invalid_request": "Ungültige Anfrage. Bitte versuche es erneut.", - "oauth_error_unauthorized_client": "Nicht autorisierter Client. Bitte kontaktiere den Support.", - "oauth_error_unsupported_response_type": "Nicht unterstützter Antworttyp. Bitte kontaktiere den Support.", - "oauth_error_invalid_scope": "Ungültiger Berechtigungsbereich. Bitte kontaktiere den Support.", - "oauth_error_unknown": "Ein unbekannter Fehler ist aufgetreten. Bitte versuche es erneut.", - "password_requirements_title": "Passwort-Anforderungen:", - "password_requirement_length": "Mindestens 8 Zeichen", - "password_requirement_lowercase": "Einen Kleinbuchstaben", - "password_requirement_uppercase": "Einen Großbuchstaben", - "password_requirement_digit": "Eine Ziffer", - "password_requirement_special": "Ein Sonderzeichen" - }, - "dashboard": { - "title": "Dashboard", - "recent_memos": "Neueste Memos", - "no_memos": "Keine Memos gefunden", - "create_memo": "Memo erstellen", - "search_placeholder": "Memos durchsuchen..." - }, - "memo": { - "title": "Memo", - "unnamed": "Unbenanntes Memo", - "word_count": "{{count}} Wort", - "word_count_plural": "{{count}} Wörter", - "delete_confirmation": "Möchtest du dieses Memo wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", - "delete_permanently": "Endgültig löschen", - "deleting": "Wird gelöscht...", - "pin": "Anheften", - "unpin": "Loslösen", - "share": "Teilen", - "edit": "Bearbeiten", - "translate": "Übersetzen", - "create_memory": "Memory erstellen", - "ask_question": "Frage stellen", - "copy_transcript": "Transkript kopieren", - "replace_word": "Wort ersetzen", - "reprocess": "Erneut verarbeiten", - "label_speakers": "Sprecher benennen", - "add_photos": "Fotos hinzufügen", - "manage_spaces": "Spaces verwalten", - "tags": "Tags", - "add_tag": "Tag hinzufügen", - "options": "Optionen", - "search": "Suchen", - "copy": "Kopieren", - "speakers": "Sprecher", - "find_replace": "Suchen & Ersetzen", - "shortcuts": "Tastenkürzel", - "no_memo_selected": "Kein Memo ausgewählt", - "select_memo_hint": "Wähle ein Memo aus der Liste oder erstelle eine neue Aufnahme", - "processing_transcript": "Transkription wird verarbeitet...", - "ask_question_placeholder": "Stelle eine Frage zu diesem Memo...", - "open_in_new_tab": "In neuem Tab öffnen", - "edit_title": "Titel bearbeiten", - "export_text": "Als Text exportieren", - "enter_new_title": "Neuen Titel eingeben:", - "no_title": "Ohne Titel", - "no_transcript": "Kein Transkript verfügbar", - "link_copied": "Link in Zwischenablage kopiert!", - "transcript_copied": "Transkript in Zwischenablage kopiert!", - "no_search_results": "Keine Suchergebnisse", - "no_memos_with_search": "Es wurden keine Memos gefunden, die \"{query}\" enthalten.", - "clear_search": "Suche löschen", - "no_memos_with_tag": "Keine Memos mit diesem Tag", - "no_memos_with_tag_hint": "Es gibt noch keine Memos mit diesem Tag.", - "show_all_memos": "Alle Memos anzeigen", - "no_memos_yet": "Noch keine Memos", - "no_memos_hint": "Gehe zur Aufnahme-Seite, um dein erstes Memo aufzunehmen", - "load_more": "Mehr Memos laden", - "search_placeholder": "Memos durchsuchen...", - "delete_memo_title": "Memo löschen", - "delete_memo_confirm": "Möchtest du \"{title}\" wirklich löschen?", - "delete_memo_warning": "Diese Aktion kann nicht rückgängig gemacht werden. Das Memo und alle zugehörigen Daten werden dauerhaft gelöscht.", - "error_user_not_authenticated": "Benutzer nicht authentifiziert", - "error_loading_memos": "Memos konnten nicht geladen werden", - "error_deleting_memo": "Fehler beim Löschen des Memos. Bitte versuche es erneut.", - "error_updating_title": "Fehler beim Aktualisieren des Titels. Bitte versuche es erneut.", - "error_copying_link": "Fehler beim Kopieren des Links. Bitte versuche es erneut.", - "error_pin_status": "Fehler beim Ändern des Pin-Status. Bitte versuche es erneut.", - "error_saving": "Fehler beim Speichern. Bitte versuche es erneut.", - "error_copying_transcript": "Fehler beim Kopieren des Transkripts. Bitte versuche es erneut.", - "error_updating_tags": "Fehler beim Aktualisieren der Tags. Bitte versuche es erneut.", - "error_creating_tag": "Fehler beim Erstellen des Tags. Bitte versuche es erneut.", - "error_asking_question": "Fehler bei der Verarbeitung der Frage. Bitte versuche es erneut.", - "retry": "Erneut versuchen", - "export_title": "Titel", - "export_date": "Datum", - "export_duration": "Dauer", - "export_transcript": "Transkript", - "export_no_transcript": "Kein Transkript verfügbar", - "export_ai_analysis": "KI-Analyse" - }, - "tags": { - "title": "Tags", - "create_tag": "Tag erstellen", - "search_placeholder": "Tags durchsuchen...", - "no_tags": "Keine Tags gefunden", - "delete_confirmation": "Möchtest du den Tag \"{{name}}\" wirklich löschen?", - "tag_name": "Tag-Name", - "tag_color": "Tag-Farbe" - }, - "spaces": { - "title": "Spaces", - "create_space": "Space erstellen", - "no_spaces": "Keine Spaces gefunden", - "members": "Mitglieder", - "invite": "Einladen" - }, - "blueprints": { - "title": "Vorlagen", - "loading": "Lade Vorlagen...", - "no_blueprints": "Keine Vorlagen gefunden", - "search_placeholder": "Vorlagen durchsuchen...", - "all_categories": "Alle", - "standard": "Standard", - "manage": "Blueprints verwalten", - "activate": "Blueprint aktivieren", - "load_error": "Blueprints konnten nicht geladen werden.", - "previous_tip": "Vorheriger Tipp", - "next_tip": "Nächster Tipp", - "go_to_tip": "Gehe zu Tipp {index}" - }, - "record": { - "title": "Aufnehmen - Memoro", - "instruction": "Halte gedrückt zum Aufnehmen", - "uploading": "Wird hochgeladen...", - "user_not_authenticated": "Benutzer nicht authentifiziert", - "upload_failed": "Upload fehlgeschlagen", - "network_error": "Netzwerkfehler: Bitte überprüfe deine Verbindung und versuche es erneut.", - "upload_error": "Fehler beim Hochladen der Aufnahme: {error}", - "unexpected_error": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut.", - "cancel_title": "Aufnahme löschen", - "cancel_message": "Möchtest du die aktuelle Aufnahme wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", - "cancel_confirm": "Löschen", - "cancel_abort": "Nicht löschen", - "pause": "Pause", - "resume": "Fortsetzen", - "cancel": "Aufnahme abbrechen" - }, - "statistics": { - "title": "Statistiken", - "today": "Heute", - "last_30_days": "Letzte 30 Tage", - "total": "Gesamt", - "memos": "Memos", - "words": "Wörter", - "recording_duration": "Aufnahmedauer", - "loading": "Lade Statistiken..." - }, - "subscription": { - "title": "Mana kaufen", - "current_plan": "Aktueller Tarif", - "your_mana": "Dein Mana", - "buy": "Kaufen", - "popular": "Beliebt", - "legacy_plan": "Alter Tarif", - "monthly": "Monatlich", - "yearly": "Jährlich" - }, - "settings": { - "title": "Einstellungen", - "appearance": "Darstellung", - "theme": "Theme", - "system": "System", - "light": "Hell", - "dark": "Dunkel", - "language": "Sprache", - "user_interface": "Benutzeroberfläche", - "show_language_button": "Sprachen-Button anzeigen", - "show_recording_instruction": "Aufnahme-Anleitung anzeigen", - "show_blueprints": "Blueprints anzeigen", - "show_mana_badge": "Mana-Anzeige im Header", - "data_privacy": "Daten & Privatsphäre", - "save_location": "Standort speichern", - "enable_analytics": "Analytics aktivieren", - "support": "Support", - "contact_support": "Support kontaktieren", - "rate_app": "App bewerten", - "account": "Konto", - "email_label": "E-Mail-Adresse", - "sign_out": "Abmelden", - "delete_account": "Konto löschen", - "app_info": "App-Informationen", - "version": "Version", - "platform": "Plattform", - "build": "Build", - "browser": "Browser", - "copyright": "© 2025 Memoro GmbH", - "made_with_love": "Made with ❤️ in Germany" - }, - "theme": { - "toggle": "Theme wechseln", - "light_mode": "Heller Modus", - "dark_mode": "Dunkler Modus", - "switch_to_light": "Zum hellen Modus wechseln", - "switch_to_dark": "Zum dunklen Modus wechseln" - }, - "errors": { - "unexpected": "Ein unerwarteter Fehler ist aufgetreten.", - "network": "Netzwerkfehler. Bitte überprüfe deine Internetverbindung.", - "not_found": "Nicht gefunden.", - "unauthorized": "Nicht autorisiert.", - "forbidden": "Zugriff verweigert.", - "server_error": "Serverfehler. Bitte versuche es später erneut." - }, - "detail_view": { - "title_sources": { - "none": "Lokal (regelbasiert)", - "browser": "Auf deinem Gerät (Gemma 4 E2B)", - "mana_server": "Mana-Server (Gemma 4 E4B)", - "byok": "Dein API-Key", - "cloud": "Google Gemini" - }, - "statuses": { - "pending": "Ausstehend", - "processing": "Wird verarbeitet", - "completed": "Fertig", - "failed": "Fehlgeschlagen" - }, - "not_found": "Memo nicht gefunden", - "confirm_delete": "Memo wirklich löschen?", - "toast_deleted": "Memo gelöscht", - "placeholder_title_idle": "Titel…", - "placeholder_title_generating": "Titel wird generiert…", - "label_status": "Status", - "label_duration": "Dauer", - "label_language": "Sprache", - "placeholder_language": "z.B. de", - "label_visibility": "Sichtbarkeit", - "section_summary": "Zusammenfassung", - "placeholder_summary": "Zusammenfassung hinzufügen...", - "section_transcript": "Transkript", - "transcribing": "Wird transkribiert…", - "transcript_failed": "Transkription fehlgeschlagen. Versuche es erneut oder gib das Transkript manuell ein.", - "transcript_empty": "Kein Transkript vorhanden.", - "transcript_source": "Voxtral via mana-stt", - "meta_created": "Erstellt: {date}", - "meta_updated": "Bearbeitet: {date}" - } -} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/memoro/en.json b/apps/mana/apps/web/src/lib/i18n/locales/memoro/en.json deleted file mode 100644 index ec5d30ce3..000000000 --- a/apps/mana/apps/web/src/lib/i18n/locales/memoro/en.json +++ /dev/null @@ -1,336 +0,0 @@ -{ - "common": { - "save": "Save", - "cancel": "Cancel", - "delete": "Delete", - "edit": "Edit", - "share": "Share", - "back": "Back", - "next": "Next", - "done": "Done", - "loading": "Loading...", - "search": "Search", - "settings": "Settings", - "yes": "Yes", - "no": "No", - "ok": "OK", - "error": "Error", - "success": "Success", - "create": "Create", - "confirm": "Confirm", - "close": "Close", - "or": "OR" - }, - "nav": { - "dashboard": "Dashboard", - "tags": "Tags", - "spaces": "Spaces", - "mana": "Mana", - "blueprints": "Blueprints", - "statistics": "Statistics", - "settings": "Settings", - "logout": "Logout", - "expand": "Expand", - "minimize": "Minimize", - "shortcuts": "Shortcuts" - }, - "auth": { - "welcome": "Welcome to Memoro", - "get_started": "Get Started", - "create_account": "Create Account", - "sign_in": "Sign In", - "sign_in_with_email": "Sign In with Email", - "sign_up_with_email": "Sign Up with Email", - "email": "Email", - "password": "Password", - "confirm_password": "Confirm Password", - "forgot_password": "Forgot Password?", - "reset_password": "Reset Password", - "logging_in": "Signing in...", - "creating_account": "Creating account...", - "sending": "Sending...", - "error_email_required": "Please enter your email address", - "error_password_required": "Please enter your password", - "error_confirm_password": "Please confirm your password", - "error_passwords_not_match": "Passwords do not match", - "error_password_too_short": "Password must be at least 8 characters long", - "error_password_requirements": "Password must contain at least one lowercase letter, one uppercase letter, one digit, and one special character", - "error_registration_failed": "Registration failed", - "password_requirement": "Password must be at least 8 characters long and contain at least one lowercase letter, one uppercase letter, one digit, and one special character.", - "registration_success": "Registration successful! Check your email to verify your account.", - "check_email_confirmation": "Please check your email to confirm your account.", - "reset_email_sent": "Enter your email address and we'll send you a link to reset your password.", - "email_only_title": "Why Email-Only Authentication?", - "email_only_info": "We only support email registration to ensure your independence and privacy.", - "email_only_learn_more": "Learn more", - "email_only_intro": "We believe in giving you full control over your account and data. By using email-based authentication, we ensure:", - "email_only_benefit_1_title": "No Vendor Lock-In", - "email_only_benefit_1_desc": "You're not dependent on third-party services like Google or Apple. Your account works independently.", - "email_only_benefit_2_title": "Enhanced Privacy", - "email_only_benefit_2_desc": "We don't share your data with Google, Apple, or any other third party for authentication.", - "email_only_benefit_3_title": "Account Portability", - "email_only_benefit_3_desc": "Your email address is portable and works across all devices and platforms.", - "email_only_benefit_4_title": "Direct Communication", - "email_only_benefit_4_desc": "We can reach you directly for important updates without relying on third-party notification systems.", - "email_only_modal_footer": "We're committed to building tools that respect your freedom and privacy. Email authentication is part of that commitment.", - "got_it": "Got it", - "already_have_account": "Already have an account?", - "dont_have_account": "Don't have an account?", - "terms_agreement": "By using Memoro you agree to our Terms and Privacy Policy.", - "mana_login": "Mana Login", - "mana_login_description": "One login for all Mana apps", - "mana_login_benefit_0": "Use Mana subscriptions across all apps - pay once and use everything", - "back": "Back", - "reset_password_description": "Enter your email address and we'll send you a link to reset your password.", - "reset_password_error": "Password reset failed", - "reset_password_success": "Email sent!", - "reset_password_rate_limit": "Too many attempts. Please wait a few minutes.", - "reset_email_sent_description": "We've sent an email with instructions to reset your password to {email}. Please check your inbox and spam folder.", - "back_to_login": "Back to login", - "resend_email": "Resend email", - "reset_email_sent_title": "Email sent!", - "terms_agreement_conjunction": "and the", - "terms_agreement_suffix": ".", - "oauth_error_access_denied": "Access denied. The login was cancelled.", - "oauth_error_server_error": "Server error during authentication. Please try again.", - "oauth_error_temporarily_unavailable": "The authentication service is temporarily unavailable. Please try again later.", - "oauth_error_invalid_request": "Invalid request. Please try again.", - "oauth_error_unauthorized_client": "Unauthorized client. Please contact support.", - "oauth_error_unsupported_response_type": "Unsupported response type. Please contact support.", - "oauth_error_invalid_scope": "Invalid scope. Please contact support.", - "oauth_error_unknown": "An unknown error occurred. Please try again.", - "password_requirements_title": "Password requirements:", - "password_requirement_length": "At least 8 characters", - "password_requirement_lowercase": "One lowercase letter", - "password_requirement_uppercase": "One uppercase letter", - "password_requirement_digit": "One digit", - "password_requirement_special": "One special character" - }, - "dashboard": { - "title": "Dashboard", - "recent_memos": "Recent Memos", - "no_memos": "No memos found", - "create_memo": "Create Memo", - "search_placeholder": "Search memos..." - }, - "memo": { - "title": "Memo", - "unnamed": "Unnamed Memo", - "word_count": "{{count}} word", - "word_count_plural": "{{count}} words", - "delete_confirmation": "Are you sure you want to delete this memo? This action cannot be undone.", - "delete_permanently": "Delete Permanently", - "deleting": "Deleting...", - "pin": "Pin", - "unpin": "Unpin", - "share": "Share", - "edit": "Edit", - "translate": "Translate", - "create_memory": "Create Memory", - "ask_question": "Ask Question", - "copy_transcript": "Copy Transcript", - "replace_word": "Replace Word", - "reprocess": "Reprocess", - "label_speakers": "Label Speakers", - "add_photos": "Add Photos", - "manage_spaces": "Manage Spaces", - "tags": "Tags", - "add_tag": "Add Tag", - "options": "Options", - "search": "Search", - "copy": "Copy", - "speakers": "Speakers", - "find_replace": "Find & Replace", - "shortcuts": "Shortcuts", - "no_memo_selected": "No memo selected", - "select_memo_hint": "Select a memo from the list or create a new recording", - "processing_transcript": "Transcription in progress...", - "ask_question_placeholder": "Ask a question about this memo...", - "open_in_new_tab": "Open in new tab", - "edit_title": "Edit title", - "export_text": "Export as text", - "enter_new_title": "Enter new title:", - "no_title": "Untitled", - "no_transcript": "No transcript available", - "link_copied": "Link copied to clipboard!", - "transcript_copied": "Transcript copied to clipboard!", - "no_search_results": "No search results", - "no_memos_with_search": "No memos found containing \"{query}\".", - "clear_search": "Clear search", - "no_memos_with_tag": "No memos with this tag", - "no_memos_with_tag_hint": "There are no memos with this tag yet.", - "show_all_memos": "Show all memos", - "no_memos_yet": "No memos yet", - "no_memos_hint": "Go to the recording page to create your first memo", - "load_more": "Load more memos", - "search_placeholder": "Search memos...", - "delete_memo_title": "Delete memo", - "delete_memo_confirm": "Are you sure you want to delete \"{title}\"?", - "delete_memo_warning": "This action cannot be undone. The memo and all associated data will be permanently deleted.", - "error_user_not_authenticated": "User not authenticated", - "error_loading_memos": "Could not load memos", - "error_deleting_memo": "Error deleting memo. Please try again.", - "error_updating_title": "Error updating title. Please try again.", - "error_copying_link": "Error copying link. Please try again.", - "error_pin_status": "Error updating pin status. Please try again.", - "error_saving": "Error saving changes. Please try again.", - "error_copying_transcript": "Error copying transcript. Please try again.", - "error_updating_tags": "Error updating tags. Please try again.", - "error_creating_tag": "Error creating tag. Please try again.", - "error_asking_question": "Error processing question. Please try again.", - "retry": "Try again", - "export_title": "Title", - "export_date": "Date", - "export_duration": "Duration", - "export_transcript": "Transcript", - "export_no_transcript": "No transcript available", - "export_ai_analysis": "AI Analysis" - }, - "tags": { - "title": "Tags", - "create_tag": "Create Tag", - "search_placeholder": "Search tags...", - "no_tags": "No tags found", - "delete_confirmation": "Are you sure you want to delete the tag \"{{name}}\"?", - "tag_name": "Tag Name", - "tag_color": "Tag Color" - }, - "spaces": { - "title": "Spaces", - "create_space": "Create Space", - "no_spaces": "No spaces found", - "members": "Members", - "invite": "Invite" - }, - "blueprints": { - "title": "Blueprints", - "loading": "Loading blueprints...", - "no_blueprints": "No blueprints found", - "search_placeholder": "Search blueprints...", - "all_categories": "All", - "standard": "Standard", - "manage": "Manage blueprints", - "activate": "Activate blueprint", - "load_error": "Could not load blueprints.", - "previous_tip": "Previous tip", - "next_tip": "Next tip", - "go_to_tip": "Go to tip {index}" - }, - "record": { - "title": "Record - Memoro", - "instruction": "Hold to record", - "uploading": "Uploading...", - "user_not_authenticated": "User not authenticated", - "upload_failed": "Upload failed", - "network_error": "Network error: Please check your connection and try again.", - "upload_error": "Error uploading recording: {error}", - "unexpected_error": "An unexpected error occurred. Please try again.", - "cancel_title": "Delete Recording", - "cancel_message": "Do you really want to delete the current recording? This action cannot be undone.", - "cancel_confirm": "Delete", - "cancel_abort": "Don't delete", - "pause": "Pause", - "resume": "Resume", - "cancel": "Cancel recording" - }, - "statistics": { - "title": "Statistics", - "today": "Today", - "last_30_days": "Last 30 days", - "total": "Total", - "memos": "Memos", - "words": "Words", - "recording_duration": "Recording Duration", - "loading": "Loading statistics..." - }, - "subscription": { - "title": "Buy Mana", - "current_plan": "Current Plan", - "your_mana": "Your Mana", - "buy": "Buy", - "popular": "Popular", - "legacy_plan": "Legacy Plan", - "monthly": "Monthly", - "yearly": "Yearly" - }, - "settings": { - "title": "Settings", - "appearance": "Appearance", - "theme": "Theme", - "system": "System", - "light": "Light", - "dark": "Dark", - "language": "Language", - "user_interface": "User Interface", - "show_language_button": "Show Language Button", - "show_recording_instruction": "Show Recording Instruction", - "show_blueprints": "Show Blueprints", - "show_mana_badge": "Show Mana Badge in Header", - "data_privacy": "Data & Privacy", - "save_location": "Save Location", - "enable_analytics": "Enable Analytics", - "support": "Support", - "contact_support": "Contact Support", - "rate_app": "Rate App", - "account": "Account", - "email_label": "Email Address", - "sign_out": "Sign Out", - "delete_account": "Delete Account", - "app_info": "App Information", - "version": "Version", - "platform": "Platform", - "build": "Build", - "browser": "Browser", - "copyright": "© 2025 Memoro GmbH", - "made_with_love": "Made with ❤️ in Germany" - }, - "theme": { - "toggle": "Toggle Theme", - "light_mode": "Light Mode", - "dark_mode": "Dark Mode", - "switch_to_light": "Switch to light mode", - "switch_to_dark": "Switch to dark mode" - }, - "errors": { - "unexpected": "An unexpected error occurred.", - "network": "Network error. Please check your internet connection.", - "not_found": "Not found.", - "unauthorized": "Unauthorized.", - "forbidden": "Access denied.", - "server_error": "Server error. Please try again later." - }, - "detail_view": { - "title_sources": { - "none": "Local (rule-based)", - "browser": "On your device (Gemma 4 E2B)", - "mana_server": "Mana server (Gemma 4 E4B)", - "byok": "Your API key", - "cloud": "Google Gemini" - }, - "statuses": { - "pending": "Pending", - "processing": "Processing", - "completed": "Done", - "failed": "Failed" - }, - "not_found": "Memo not found", - "confirm_delete": "Really delete memo?", - "toast_deleted": "Memo deleted", - "placeholder_title_idle": "Title…", - "placeholder_title_generating": "Generating title…", - "label_status": "Status", - "label_duration": "Duration", - "label_language": "Language", - "placeholder_language": "e.g. en", - "label_visibility": "Visibility", - "section_summary": "Summary", - "placeholder_summary": "Add summary…", - "section_transcript": "Transcript", - "transcribing": "Transcribing…", - "transcript_failed": "Transcription failed. Try again or enter the transcript manually.", - "transcript_empty": "No transcript available.", - "transcript_source": "Voxtral via mana-stt", - "meta_created": "Created: {date}", - "meta_updated": "Edited: {date}" - } -} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/memoro/es.json b/apps/mana/apps/web/src/lib/i18n/locales/memoro/es.json deleted file mode 100644 index 4ee90dd7e..000000000 --- a/apps/mana/apps/web/src/lib/i18n/locales/memoro/es.json +++ /dev/null @@ -1,336 +0,0 @@ -{ - "common": { - "save": "Guardar", - "cancel": "Cancelar", - "delete": "Eliminar", - "edit": "Editar", - "share": "Compartir", - "back": "Volver", - "next": "Siguiente", - "done": "Hecho", - "loading": "Cargando...", - "search": "Buscar", - "settings": "Ajustes", - "yes": "Sí", - "no": "No", - "ok": "OK", - "error": "Error", - "success": "Éxito", - "create": "Crear", - "confirm": "Confirmar", - "close": "Cerrar", - "or": "O" - }, - "nav": { - "dashboard": "Tablero", - "tags": "Etiquetas", - "spaces": "Espacios", - "mana": "Mana", - "blueprints": "Plantillas", - "statistics": "Estadísticas", - "settings": "Ajustes", - "logout": "Cerrar sesión", - "expand": "Expandir", - "minimize": "Minimizar", - "shortcuts": "Atajos" - }, - "auth": { - "welcome": "Bienvenido a Memoro", - "get_started": "Comenzar", - "create_account": "Crear cuenta", - "sign_in": "Iniciar sesión", - "sign_in_with_email": "Iniciar sesión con correo", - "sign_up_with_email": "Registrarse con correo", - "email": "Correo electrónico", - "password": "Contraseña", - "confirm_password": "Confirmar contraseña", - "forgot_password": "¿Olvidó su contraseña?", - "reset_password": "Restablecer contraseña", - "logging_in": "Iniciando sesión...", - "creating_account": "Creando cuenta...", - "sending": "Enviando...", - "error_email_required": "Por favor, introduzca su dirección de correo electrónico", - "error_password_required": "Por favor, introduzca su contraseña", - "error_confirm_password": "Por favor, confirme su contraseña", - "error_passwords_not_match": "Las contraseñas no coinciden", - "error_password_too_short": "La contraseña debe tener al menos 8 caracteres", - "error_password_requirements": "La contraseña debe contener al menos una letra minúscula, una letra mayúscula, un dígito y un carácter especial", - "error_registration_failed": "Error en el registro", - "password_requirement": "La contraseña debe tener al menos 8 caracteres y contener al menos una letra minúscula, una letra mayúscula, un dígito y un carácter especial.", - "registration_success": "¡Registro exitoso! Revise su correo electrónico para confirmar su cuenta.", - "check_email_confirmation": "Por favor, revise su correo electrónico para confirmar su cuenta.", - "reset_email_sent": "Introduzca su dirección de correo electrónico y le enviaremos un enlace para restablecer su contraseña.", - "email_only_title": "¿Por qué solo autenticación por correo?", - "email_only_info": "Solo admitimos el registro por correo electrónico para garantizar su independencia y privacidad.", - "email_only_learn_more": "Más información", - "email_only_intro": "Creemos en darle control total sobre su cuenta y datos. Al usar autenticación por correo electrónico, garantizamos:", - "email_only_benefit_1_title": "Sin dependencia de proveedores", - "email_only_benefit_1_desc": "No depende de servicios de terceros como Google o Apple. Su cuenta funciona de forma independiente.", - "email_only_benefit_2_title": "Privacidad mejorada", - "email_only_benefit_2_desc": "No compartimos sus datos con Google, Apple ni ningún otro tercero para la autenticación.", - "email_only_benefit_3_title": "Portabilidad de la cuenta", - "email_only_benefit_3_desc": "Su dirección de correo electrónico es portátil y funciona en todos los dispositivos y plataformas.", - "email_only_benefit_4_title": "Comunicación directa", - "email_only_benefit_4_desc": "Podemos contactarle directamente para actualizaciones importantes sin depender de sistemas de notificación de terceros.", - "email_only_modal_footer": "Nos comprometemos a crear herramientas que respeten su libertad y privacidad. La autenticación por correo electrónico es parte de ese compromiso.", - "got_it": "Entendido", - "already_have_account": "¿Ya tiene una cuenta?", - "dont_have_account": "¿No tiene una cuenta?", - "terms_agreement": "Al usar Memoro, acepta nuestros Términos y nuestra Política de privacidad.", - "mana_login": "Mana Login", - "mana_login_description": "Un login para todas las apps de Mana", - "mana_login_benefit_0": "Usa suscripciones de Mana en todas las apps - paga una vez y úsalo todo", - "back": "Volver", - "reset_password_description": "Introduzca su dirección de correo electrónico y le enviaremos un enlace para restablecer su contraseña.", - "reset_password_error": "Error al restablecer la contraseña", - "reset_password_success": "¡Correo enviado!", - "reset_password_rate_limit": "Demasiados intentos. Por favor, espere unos minutos.", - "reset_email_sent_description": "Hemos enviado un correo con instrucciones para restablecer su contraseña a {email}. Por favor, revise su bandeja de entrada y carpeta de spam.", - "back_to_login": "Volver al login", - "resend_email": "Reenviar correo", - "reset_email_sent_title": "¡Correo enviado!", - "terms_agreement_conjunction": "y la", - "terms_agreement_suffix": ".", - "oauth_error_access_denied": "Acceso denegado. El inicio de sesión fue cancelado.", - "oauth_error_server_error": "Error del servidor durante la autenticación. Por favor, inténtelo de nuevo.", - "oauth_error_temporarily_unavailable": "El servicio de autenticación no está disponible temporalmente. Por favor, inténtelo más tarde.", - "oauth_error_invalid_request": "Solicitud inválida. Por favor, inténtelo de nuevo.", - "oauth_error_unauthorized_client": "Cliente no autorizado. Por favor, contacte con soporte.", - "oauth_error_unsupported_response_type": "Tipo de respuesta no soportado. Por favor, contacte con soporte.", - "oauth_error_invalid_scope": "Alcance inválido. Por favor, contacte con soporte.", - "oauth_error_unknown": "Ha ocurrido un error desconocido. Por favor, inténtelo de nuevo.", - "password_requirements_title": "Requisitos de contraseña:", - "password_requirement_length": "Al menos 8 caracteres", - "password_requirement_lowercase": "Una letra minúscula", - "password_requirement_uppercase": "Una letra mayúscula", - "password_requirement_digit": "Un dígito", - "password_requirement_special": "Un carácter especial" - }, - "dashboard": { - "title": "Tablero", - "recent_memos": "Memos recientes", - "no_memos": "No se encontraron memos", - "create_memo": "Crear memo", - "search_placeholder": "Buscar memos..." - }, - "memo": { - "title": "Memo", - "unnamed": "Memo sin nombre", - "word_count": "{{count}} palabra", - "word_count_plural": "{{count}} palabras", - "delete_confirmation": "¿Realmente desea eliminar este memo? Esta acción no se puede deshacer.", - "delete_permanently": "Eliminar permanentemente", - "deleting": "Eliminando...", - "pin": "Fijar", - "unpin": "Desfijar", - "share": "Compartir", - "edit": "Editar", - "translate": "Traducir", - "create_memory": "Crear Memory", - "ask_question": "Hacer pregunta", - "copy_transcript": "Copiar transcripción", - "replace_word": "Reemplazar palabra", - "reprocess": "Reprocesar", - "label_speakers": "Etiquetar oradores", - "add_photos": "Añadir fotos", - "manage_spaces": "Gestionar espacios", - "tags": "Etiquetas", - "add_tag": "Añadir etiqueta", - "options": "Opciones", - "search": "Buscar", - "copy": "Copiar", - "speakers": "Oradores", - "find_replace": "Buscar y reemplazar", - "shortcuts": "Atajos", - "no_memo_selected": "Ningún memo seleccionado", - "select_memo_hint": "Seleccione un memo de la lista o cree una nueva grabación", - "processing_transcript": "Transcripción en proceso...", - "ask_question_placeholder": "Haga una pregunta sobre este memo...", - "open_in_new_tab": "Abrir en nueva pestaña", - "edit_title": "Editar título", - "export_text": "Exportar como texto", - "enter_new_title": "Introduzca nuevo título:", - "no_title": "Sin título", - "no_transcript": "No hay transcripción disponible", - "link_copied": "¡Enlace copiado al portapapeles!", - "transcript_copied": "¡Transcripción copiada al portapapeles!", - "no_search_results": "Sin resultados de búsqueda", - "no_memos_with_search": "No se encontraron memos que contengan \"{query}\".", - "clear_search": "Limpiar búsqueda", - "no_memos_with_tag": "No hay memos con esta etiqueta", - "no_memos_with_tag_hint": "Aún no hay memos con esta etiqueta.", - "show_all_memos": "Mostrar todos los memos", - "no_memos_yet": "Aún no hay memos", - "no_memos_hint": "Ve a la página de grabación para crear tu primer memo", - "load_more": "Cargar más memos", - "search_placeholder": "Buscar memos...", - "delete_memo_title": "Eliminar memo", - "delete_memo_confirm": "¿Realmente desea eliminar \"{title}\"?", - "delete_memo_warning": "Esta acción no se puede deshacer. El memo y todos los datos asociados se eliminarán permanentemente.", - "error_user_not_authenticated": "Usuario no autenticado", - "error_loading_memos": "No se pudieron cargar los memos", - "error_deleting_memo": "Error al eliminar el memo. Por favor, inténtelo de nuevo.", - "error_updating_title": "Error al actualizar el título. Por favor, inténtelo de nuevo.", - "error_copying_link": "Error al copiar el enlace. Por favor, inténtelo de nuevo.", - "error_pin_status": "Error al cambiar el estado de fijado. Por favor, inténtelo de nuevo.", - "error_saving": "Error al guardar. Por favor, inténtelo de nuevo.", - "error_copying_transcript": "Error al copiar la transcripción. Por favor, inténtelo de nuevo.", - "error_updating_tags": "Error al actualizar las etiquetas. Por favor, inténtelo de nuevo.", - "error_creating_tag": "Error al crear la etiqueta. Por favor, inténtelo de nuevo.", - "error_asking_question": "Error al procesar la pregunta. Por favor, inténtelo de nuevo.", - "retry": "Reintentar", - "export_title": "Título", - "export_date": "Fecha", - "export_duration": "Duración", - "export_transcript": "Transcripción", - "export_no_transcript": "No hay transcripción disponible", - "export_ai_analysis": "Análisis de IA" - }, - "tags": { - "title": "Etiquetas", - "create_tag": "Crear etiqueta", - "search_placeholder": "Buscar etiquetas...", - "no_tags": "No se encontraron etiquetas", - "delete_confirmation": "¿Realmente desea eliminar la etiqueta \"{{name}}\"?", - "tag_name": "Nombre de etiqueta", - "tag_color": "Color de etiqueta" - }, - "spaces": { - "title": "Espacios", - "create_space": "Crear espacio", - "no_spaces": "No se encontraron espacios", - "members": "Miembros", - "invite": "Invitar" - }, - "blueprints": { - "title": "Plantillas", - "loading": "Cargando plantillas...", - "no_blueprints": "No se encontraron plantillas", - "search_placeholder": "Buscar plantillas...", - "all_categories": "Todas", - "standard": "Estándar", - "manage": "Gestionar plantillas", - "activate": "Activar plantilla", - "load_error": "No se pudieron cargar las plantillas.", - "previous_tip": "Consejo anterior", - "next_tip": "Siguiente consejo", - "go_to_tip": "Ir al consejo {index}" - }, - "record": { - "title": "Grabar - Memoro", - "instruction": "Mantén presionado para grabar", - "uploading": "Subiendo...", - "user_not_authenticated": "Usuario no autenticado", - "upload_failed": "Error en la subida", - "network_error": "Error de red: Por favor, verifica tu conexión e inténtalo de nuevo.", - "upload_error": "Error al subir la grabación: {error}", - "unexpected_error": "Ha ocurrido un error inesperado. Por favor, inténtalo de nuevo.", - "cancel_title": "Eliminar grabación", - "cancel_message": "¿Realmente deseas eliminar la grabación actual? Esta acción no se puede deshacer.", - "cancel_confirm": "Eliminar", - "cancel_abort": "No eliminar", - "pause": "Pausar", - "resume": "Continuar", - "cancel": "Cancelar grabación" - }, - "statistics": { - "title": "Estadísticas", - "today": "Hoy", - "last_30_days": "Últimos 30 días", - "total": "Total", - "memos": "Memos", - "words": "Palabras", - "recording_duration": "Duración de grabación", - "loading": "Cargando estadísticas..." - }, - "subscription": { - "title": "Comprar Mana", - "current_plan": "Plan actual", - "your_mana": "Tu Mana", - "buy": "Comprar", - "popular": "Popular", - "legacy_plan": "Plan antiguo", - "monthly": "Mensual", - "yearly": "Anual" - }, - "settings": { - "title": "Ajustes", - "appearance": "Apariencia", - "theme": "Tema", - "system": "Sistema", - "light": "Claro", - "dark": "Oscuro", - "language": "Idioma", - "user_interface": "Interfaz de usuario", - "show_language_button": "Mostrar botón de idioma", - "show_recording_instruction": "Mostrar instrucciones de grabación", - "show_blueprints": "Mostrar plantillas", - "show_mana_badge": "Mostrar insignia de Mana en el encabezado", - "data_privacy": "Datos y privacidad", - "save_location": "Guardar ubicación", - "enable_analytics": "Habilitar análisis", - "support": "Soporte", - "contact_support": "Contactar soporte", - "rate_app": "Calificar app", - "account": "Cuenta", - "email_label": "Dirección de correo", - "sign_out": "Cerrar sesión", - "delete_account": "Eliminar cuenta", - "app_info": "Información de la app", - "version": "Versión", - "platform": "Plataforma", - "build": "Build", - "browser": "Navegador", - "copyright": "© 2025 Memoro GmbH", - "made_with_love": "Made with ❤️ in Germany" - }, - "theme": { - "toggle": "Cambiar tema", - "light_mode": "Modo claro", - "dark_mode": "Modo oscuro", - "switch_to_light": "Cambiar a modo claro", - "switch_to_dark": "Cambiar a modo oscuro" - }, - "errors": { - "unexpected": "Ha ocurrido un error inesperado.", - "network": "Error de red. Verifique su conexión a Internet.", - "not_found": "No encontrado.", - "unauthorized": "No autorizado.", - "forbidden": "Acceso denegado.", - "server_error": "Error del servidor. Inténtelo de nuevo más tarde." - }, - "detail_view": { - "title_sources": { - "none": "Local (reglas)", - "browser": "En tu dispositivo (Gemma 4 E2B)", - "mana_server": "Mana server (Gemma 4 E4B)", - "byok": "Tu API key", - "cloud": "Google Gemini" - }, - "statuses": { - "pending": "Pendiente", - "processing": "Procesando", - "completed": "Listo", - "failed": "Fallido" - }, - "not_found": "Memo no encontrado", - "confirm_delete": "¿Eliminar realmente el memo?", - "toast_deleted": "Memo eliminado", - "placeholder_title_idle": "Título…", - "placeholder_title_generating": "Generando título…", - "label_status": "Estado", - "label_duration": "Duración", - "label_language": "Idioma", - "placeholder_language": "p. ej. es", - "label_visibility": "Visibilidad", - "section_summary": "Resumen", - "placeholder_summary": "Añade un resumen…", - "section_transcript": "Transcripción", - "transcribing": "Transcribiendo…", - "transcript_failed": "Transcripción fallida. Inténtalo de nuevo o introdúcela manualmente.", - "transcript_empty": "Sin transcripción.", - "transcript_source": "Voxtral via mana-stt", - "meta_created": "Creado: {date}", - "meta_updated": "Editado: {date}" - } -} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/memoro/fr.json b/apps/mana/apps/web/src/lib/i18n/locales/memoro/fr.json deleted file mode 100644 index b39341d95..000000000 --- a/apps/mana/apps/web/src/lib/i18n/locales/memoro/fr.json +++ /dev/null @@ -1,336 +0,0 @@ -{ - "common": { - "save": "Enregistrer", - "cancel": "Annuler", - "delete": "Supprimer", - "edit": "Modifier", - "share": "Partager", - "back": "Retour", - "next": "Suivant", - "done": "Terminé", - "loading": "Chargement...", - "search": "Rechercher", - "settings": "Paramètres", - "yes": "Oui", - "no": "Non", - "ok": "OK", - "error": "Erreur", - "success": "Succès", - "create": "Créer", - "confirm": "Confirmer", - "close": "Fermer", - "or": "OU" - }, - "nav": { - "dashboard": "Tableau de bord", - "tags": "Tags", - "spaces": "Espaces", - "mana": "Mana", - "blueprints": "Modèles", - "statistics": "Statistiques", - "settings": "Paramètres", - "logout": "Déconnexion", - "expand": "Agrandir", - "minimize": "Réduire", - "shortcuts": "Raccourcis" - }, - "auth": { - "welcome": "Bienvenue sur Memoro", - "get_started": "Commencer", - "create_account": "Créer un compte", - "sign_in": "Connexion", - "sign_in_with_email": "Se connecter avec l'email", - "sign_up_with_email": "S'inscrire avec l'email", - "email": "Email", - "password": "Mot de passe", - "confirm_password": "Confirmer le mot de passe", - "forgot_password": "Mot de passe oublié ?", - "reset_password": "Réinitialiser le mot de passe", - "logging_in": "Connexion en cours...", - "creating_account": "Création du compte...", - "sending": "Envoi en cours...", - "error_email_required": "Veuillez entrer votre adresse email", - "error_password_required": "Veuillez entrer votre mot de passe", - "error_confirm_password": "Veuillez confirmer votre mot de passe", - "error_passwords_not_match": "Les mots de passe ne correspondent pas", - "error_password_too_short": "Le mot de passe doit contenir au moins 8 caractères", - "error_password_requirements": "Le mot de passe doit contenir au moins une lettre minuscule, une lettre majuscule, un chiffre et un caractère spécial", - "error_registration_failed": "Échec de l'inscription", - "password_requirement": "Le mot de passe doit contenir au moins 8 caractères et inclure au moins une lettre minuscule, une lettre majuscule, un chiffre et un caractère spécial.", - "registration_success": "Inscription réussie ! Vérifiez votre email pour confirmer votre compte.", - "check_email_confirmation": "Veuillez vérifier votre email pour confirmer votre compte.", - "reset_email_sent": "Entrez votre adresse email et nous vous enverrons un lien pour réinitialiser votre mot de passe.", - "email_only_title": "Pourquoi uniquement l'authentification par email ?", - "email_only_info": "Nous ne prenons en charge que l'inscription par email pour garantir votre indépendance et votre confidentialité.", - "email_only_learn_more": "En savoir plus", - "email_only_intro": "Nous croyons en vous donnant le contrôle total sur votre compte et vos données. En utilisant l'authentification par email, nous garantissons :", - "email_only_benefit_1_title": "Pas de dépendance aux fournisseurs", - "email_only_benefit_1_desc": "Vous n'êtes pas dépendant de services tiers comme Google ou Apple. Votre compte fonctionne de manière indépendante.", - "email_only_benefit_2_title": "Confidentialité renforcée", - "email_only_benefit_2_desc": "Nous ne partageons pas vos données avec Google, Apple ou d'autres tiers pour l'authentification.", - "email_only_benefit_3_title": "Portabilité du compte", - "email_only_benefit_3_desc": "Votre adresse email est portable et fonctionne sur tous les appareils et plateformes.", - "email_only_benefit_4_title": "Communication directe", - "email_only_benefit_4_desc": "Nous pouvons vous contacter directement pour des mises à jour importantes sans dépendre de systèmes de notification tiers.", - "email_only_modal_footer": "Nous nous engageons à créer des outils qui respectent votre liberté et votre confidentialité. L'authentification par email fait partie de cet engagement.", - "got_it": "Compris", - "already_have_account": "Vous avez déjà un compte ?", - "dont_have_account": "Pas encore de compte ?", - "terms_agreement": "En utilisant Memoro, vous acceptez nos Conditions et notre Politique de confidentialité.", - "mana_login": "Mana Login", - "mana_login_description": "Une connexion pour toutes les applications Mana", - "mana_login_benefit_0": "Utilisez les abonnements Mana dans toutes les applications - payez une fois et utilisez tout", - "back": "Retour", - "reset_password_description": "Entrez votre adresse email et nous vous enverrons un lien pour réinitialiser votre mot de passe.", - "reset_password_error": "Échec de la réinitialisation du mot de passe", - "reset_password_success": "Email envoyé !", - "reset_password_rate_limit": "Trop de tentatives. Veuillez patienter quelques minutes.", - "reset_email_sent_description": "Nous avons envoyé un email avec des instructions pour réinitialiser votre mot de passe à {email}. Veuillez vérifier votre boîte de réception et votre dossier spam.", - "back_to_login": "Retour à la connexion", - "resend_email": "Renvoyer l'email", - "reset_email_sent_title": "Email envoyé !", - "terms_agreement_conjunction": "et la", - "terms_agreement_suffix": ".", - "oauth_error_access_denied": "Accès refusé. La connexion a été annulée.", - "oauth_error_server_error": "Erreur serveur lors de l'authentification. Veuillez réessayer.", - "oauth_error_temporarily_unavailable": "Le service d'authentification est temporairement indisponible. Veuillez réessayer plus tard.", - "oauth_error_invalid_request": "Requête invalide. Veuillez réessayer.", - "oauth_error_unauthorized_client": "Client non autorisé. Veuillez contacter le support.", - "oauth_error_unsupported_response_type": "Type de réponse non supporté. Veuillez contacter le support.", - "oauth_error_invalid_scope": "Portée invalide. Veuillez contacter le support.", - "oauth_error_unknown": "Une erreur inconnue s'est produite. Veuillez réessayer.", - "password_requirements_title": "Exigences du mot de passe :", - "password_requirement_length": "Au moins 8 caractères", - "password_requirement_lowercase": "Une lettre minuscule", - "password_requirement_uppercase": "Une lettre majuscule", - "password_requirement_digit": "Un chiffre", - "password_requirement_special": "Un caractère spécial" - }, - "dashboard": { - "title": "Tableau de bord", - "recent_memos": "Mémos récents", - "no_memos": "Aucun mémo trouvé", - "create_memo": "Créer un mémo", - "search_placeholder": "Rechercher des mémos..." - }, - "memo": { - "title": "Mémo", - "unnamed": "Mémo sans nom", - "word_count": "{{count}} mot", - "word_count_plural": "{{count}} mots", - "delete_confirmation": "Voulez-vous vraiment supprimer ce mémo ? Cette action ne peut pas être annulée.", - "delete_permanently": "Supprimer définitivement", - "deleting": "Suppression...", - "pin": "Épingler", - "unpin": "Désépingler", - "share": "Partager", - "edit": "Modifier", - "translate": "Traduire", - "create_memory": "Créer une Memory", - "ask_question": "Poser une question", - "copy_transcript": "Copier la transcription", - "replace_word": "Remplacer un mot", - "reprocess": "Retraiter", - "label_speakers": "Nommer les intervenants", - "add_photos": "Ajouter des photos", - "manage_spaces": "Gérer les espaces", - "tags": "Tags", - "add_tag": "Ajouter un tag", - "options": "Options", - "search": "Rechercher", - "copy": "Copier", - "speakers": "Intervenants", - "find_replace": "Rechercher et remplacer", - "shortcuts": "Raccourcis", - "no_memo_selected": "Aucun mémo sélectionné", - "select_memo_hint": "Sélectionnez un mémo dans la liste ou créez un nouvel enregistrement", - "processing_transcript": "Transcription en cours...", - "ask_question_placeholder": "Posez une question sur ce mémo...", - "open_in_new_tab": "Ouvrir dans un nouvel onglet", - "edit_title": "Modifier le titre", - "export_text": "Exporter en texte", - "enter_new_title": "Entrez le nouveau titre :", - "no_title": "Sans titre", - "no_transcript": "Aucune transcription disponible", - "link_copied": "Lien copié dans le presse-papiers !", - "transcript_copied": "Transcription copiée dans le presse-papiers !", - "no_search_results": "Aucun résultat de recherche", - "no_memos_with_search": "Aucun mémo contenant \"{query}\" n'a été trouvé.", - "clear_search": "Effacer la recherche", - "no_memos_with_tag": "Aucun mémo avec ce tag", - "no_memos_with_tag_hint": "Il n'y a pas encore de mémos avec ce tag.", - "show_all_memos": "Afficher tous les mémos", - "no_memos_yet": "Pas encore de mémos", - "no_memos_hint": "Allez à la page d'enregistrement pour créer votre premier mémo", - "load_more": "Charger plus de mémos", - "search_placeholder": "Rechercher des mémos...", - "delete_memo_title": "Supprimer le mémo", - "delete_memo_confirm": "Voulez-vous vraiment supprimer \"{title}\" ?", - "delete_memo_warning": "Cette action ne peut pas être annulée. Le mémo et toutes les données associées seront supprimés définitivement.", - "error_user_not_authenticated": "Utilisateur non authentifié", - "error_loading_memos": "Impossible de charger les mémos", - "error_deleting_memo": "Erreur lors de la suppression du mémo. Veuillez réessayer.", - "error_updating_title": "Erreur lors de la mise à jour du titre. Veuillez réessayer.", - "error_copying_link": "Erreur lors de la copie du lien. Veuillez réessayer.", - "error_pin_status": "Erreur lors du changement du statut d'épinglage. Veuillez réessayer.", - "error_saving": "Erreur lors de l'enregistrement. Veuillez réessayer.", - "error_copying_transcript": "Erreur lors de la copie de la transcription. Veuillez réessayer.", - "error_updating_tags": "Erreur lors de la mise à jour des tags. Veuillez réessayer.", - "error_creating_tag": "Erreur lors de la création du tag. Veuillez réessayer.", - "error_asking_question": "Erreur lors du traitement de la question. Veuillez réessayer.", - "retry": "Réessayer", - "export_title": "Titre", - "export_date": "Date", - "export_duration": "Durée", - "export_transcript": "Transcription", - "export_no_transcript": "Aucune transcription disponible", - "export_ai_analysis": "Analyse IA" - }, - "tags": { - "title": "Tags", - "create_tag": "Créer un tag", - "search_placeholder": "Rechercher des tags...", - "no_tags": "Aucun tag trouvé", - "delete_confirmation": "Voulez-vous vraiment supprimer le tag \"{{name}}\" ?", - "tag_name": "Nom du tag", - "tag_color": "Couleur du tag" - }, - "spaces": { - "title": "Espaces", - "create_space": "Créer un espace", - "no_spaces": "Aucun espace trouvé", - "members": "Membres", - "invite": "Inviter" - }, - "blueprints": { - "title": "Modèles", - "loading": "Chargement des modèles...", - "no_blueprints": "Aucun modèle trouvé", - "search_placeholder": "Rechercher des modèles...", - "all_categories": "Tous", - "standard": "Standard", - "manage": "Gérer les modèles", - "activate": "Activer le modèle", - "load_error": "Impossible de charger les modèles.", - "previous_tip": "Conseil précédent", - "next_tip": "Conseil suivant", - "go_to_tip": "Aller au conseil {index}" - }, - "record": { - "title": "Enregistrer - Memoro", - "instruction": "Maintenez pour enregistrer", - "uploading": "Téléchargement...", - "user_not_authenticated": "Utilisateur non authentifié", - "upload_failed": "Échec du téléchargement", - "network_error": "Erreur réseau : Veuillez vérifier votre connexion et réessayer.", - "upload_error": "Erreur lors du téléchargement de l'enregistrement : {error}", - "unexpected_error": "Une erreur inattendue s'est produite. Veuillez réessayer.", - "cancel_title": "Supprimer l'enregistrement", - "cancel_message": "Voulez-vous vraiment supprimer l'enregistrement actuel ? Cette action ne peut pas être annulée.", - "cancel_confirm": "Supprimer", - "cancel_abort": "Ne pas supprimer", - "pause": "Pause", - "resume": "Reprendre", - "cancel": "Annuler l'enregistrement" - }, - "statistics": { - "title": "Statistiques", - "today": "Aujourd'hui", - "last_30_days": "30 derniers jours", - "total": "Total", - "memos": "Mémos", - "words": "Mots", - "recording_duration": "Durée d'enregistrement", - "loading": "Chargement des statistiques..." - }, - "subscription": { - "title": "Acheter du Mana", - "current_plan": "Plan actuel", - "your_mana": "Votre Mana", - "buy": "Acheter", - "popular": "Populaire", - "legacy_plan": "Plan ancien", - "monthly": "Mensuel", - "yearly": "Annuel" - }, - "settings": { - "title": "Paramètres", - "appearance": "Apparence", - "theme": "Thème", - "system": "Système", - "light": "Clair", - "dark": "Sombre", - "language": "Langue", - "user_interface": "Interface utilisateur", - "show_language_button": "Afficher le bouton de langue", - "show_recording_instruction": "Afficher les instructions d'enregistrement", - "show_blueprints": "Afficher les modèles", - "show_mana_badge": "Afficher le badge Mana dans l'en-tête", - "data_privacy": "Données et confidentialité", - "save_location": "Enregistrer la position", - "enable_analytics": "Activer les analyses", - "support": "Support", - "contact_support": "Contacter le support", - "rate_app": "Évaluer l'application", - "account": "Compte", - "email_label": "Adresse email", - "sign_out": "Déconnexion", - "delete_account": "Supprimer le compte", - "app_info": "Informations de l'application", - "version": "Version", - "platform": "Plateforme", - "build": "Build", - "browser": "Navigateur", - "copyright": "© 2025 Memoro GmbH", - "made_with_love": "Made with ❤️ in Germany" - }, - "theme": { - "toggle": "Changer de thème", - "light_mode": "Mode clair", - "dark_mode": "Mode sombre", - "switch_to_light": "Passer au mode clair", - "switch_to_dark": "Passer au mode sombre" - }, - "errors": { - "unexpected": "Une erreur inattendue s'est produite.", - "network": "Erreur réseau. Veuillez vérifier votre connexion Internet.", - "not_found": "Non trouvé.", - "unauthorized": "Non autorisé.", - "forbidden": "Accès refusé.", - "server_error": "Erreur serveur. Veuillez réessayer plus tard." - }, - "detail_view": { - "title_sources": { - "none": "Local (règles)", - "browser": "Sur ton appareil (Gemma 4 E2B)", - "mana_server": "Serveur Mana (Gemma 4 E4B)", - "byok": "Ta clé API", - "cloud": "Google Gemini" - }, - "statuses": { - "pending": "En attente", - "processing": "En traitement", - "completed": "Terminé", - "failed": "Échec" - }, - "not_found": "Mémo introuvable", - "confirm_delete": "Vraiment supprimer le mémo ?", - "toast_deleted": "Mémo supprimé", - "placeholder_title_idle": "Titre…", - "placeholder_title_generating": "Génération du titre…", - "label_status": "Statut", - "label_duration": "Durée", - "label_language": "Langue", - "placeholder_language": "p. ex. fr", - "label_visibility": "Visibilité", - "section_summary": "Résumé", - "placeholder_summary": "Ajouter un résumé…", - "section_transcript": "Transcription", - "transcribing": "Transcription en cours…", - "transcript_failed": "Échec de la transcription. Réessaie ou saisis manuellement.", - "transcript_empty": "Pas de transcription.", - "transcript_source": "Voxtral via mana-stt", - "meta_created": "Créé : {date}", - "meta_updated": "Modifié : {date}" - } -} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/memoro/it.json b/apps/mana/apps/web/src/lib/i18n/locales/memoro/it.json deleted file mode 100644 index be354c639..000000000 --- a/apps/mana/apps/web/src/lib/i18n/locales/memoro/it.json +++ /dev/null @@ -1,336 +0,0 @@ -{ - "common": { - "save": "Salva", - "cancel": "Annulla", - "delete": "Elimina", - "edit": "Modifica", - "share": "Condividi", - "back": "Indietro", - "next": "Avanti", - "done": "Fatto", - "loading": "Caricamento...", - "search": "Cerca", - "settings": "Impostazioni", - "yes": "Sì", - "no": "No", - "ok": "OK", - "error": "Errore", - "success": "Successo", - "create": "Crea", - "confirm": "Conferma", - "close": "Chiudi", - "or": "OPPURE" - }, - "nav": { - "dashboard": "Dashboard", - "tags": "Tag", - "spaces": "Spazi", - "mana": "Mana", - "blueprints": "Modelli", - "statistics": "Statistiche", - "settings": "Impostazioni", - "logout": "Esci", - "expand": "Espandi", - "minimize": "Minimizza", - "shortcuts": "Scorciatoie" - }, - "auth": { - "welcome": "Benvenuto in Memoro", - "get_started": "Inizia", - "create_account": "Crea account", - "sign_in": "Accedi", - "sign_in_with_email": "Accedi con email", - "sign_up_with_email": "Registrati con email", - "email": "Email", - "password": "Password", - "confirm_password": "Conferma password", - "forgot_password": "Password dimenticata?", - "reset_password": "Reimposta password", - "logging_in": "Accesso in corso...", - "creating_account": "Creazione account...", - "sending": "Invio in corso...", - "error_email_required": "Inserisci il tuo indirizzo email", - "error_password_required": "Inserisci la tua password", - "error_confirm_password": "Conferma la tua password", - "error_passwords_not_match": "Le password non corrispondono", - "error_password_too_short": "La password deve essere lunga almeno 8 caratteri", - "error_password_requirements": "La password deve contenere almeno una lettera minuscola, una lettera maiuscola, un numero e un carattere speciale", - "error_registration_failed": "Registrazione fallita", - "password_requirement": "La password deve essere lunga almeno 8 caratteri e contenere almeno una lettera minuscola, una lettera maiuscola, un numero e un carattere speciale.", - "registration_success": "Registrazione completata con successo! Controlla la tua email per confermare il tuo account.", - "check_email_confirmation": "Controlla la tua email per confermare il tuo account.", - "reset_email_sent": "Inserisci il tuo indirizzo email e ti invieremo un link per reimpostare la tua password.", - "email_only_title": "Perché solo autenticazione email?", - "email_only_info": "Supportiamo solo la registrazione via email per garantire la tua indipendenza e privacy.", - "email_only_learn_more": "Scopri di più", - "email_only_intro": "Crediamo nel darti il pieno controllo sul tuo account e sui tuoi dati. Utilizzando l'autenticazione via email, garantiamo:", - "email_only_benefit_1_title": "Nessun vincolo con fornitori", - "email_only_benefit_1_desc": "Non sei dipendente da servizi di terze parti come Google o Apple. Il tuo account funziona in modo indipendente.", - "email_only_benefit_2_title": "Privacy migliorata", - "email_only_benefit_2_desc": "Non condividiamo i tuoi dati con Google, Apple o altre terze parti per l'autenticazione.", - "email_only_benefit_3_title": "Portabilità dell'account", - "email_only_benefit_3_desc": "Il tuo indirizzo email è portabile e funziona su tutti i dispositivi e piattaforme.", - "email_only_benefit_4_title": "Comunicazione diretta", - "email_only_benefit_4_desc": "Possiamo contattarti direttamente per aggiornamenti importanti senza fare affidamento su sistemi di notifica di terze parti.", - "email_only_modal_footer": "Ci impegniamo a costruire strumenti che rispettino la tua libertà e privacy. L'autenticazione via email fa parte di questo impegno.", - "got_it": "Ho capito", - "already_have_account": "Hai già un account?", - "dont_have_account": "Non hai un account?", - "terms_agreement": "Utilizzando Memoro accetti i nostri Termini e la nostra Informativa sulla privacy.", - "mana_login": "Mana Login", - "mana_login_description": "Un login per tutte le app Mana", - "mana_login_benefit_0": "Usa gli abbonamenti Mana in tutte le app - paga una volta e usa tutto", - "back": "Indietro", - "reset_password_description": "Inserisci il tuo indirizzo email e ti invieremo un link per reimpostare la tua password.", - "reset_password_error": "Reimpostazione password fallita", - "reset_password_success": "Email inviata!", - "reset_password_rate_limit": "Troppi tentativi. Attendi qualche minuto.", - "reset_email_sent_description": "Abbiamo inviato un'email con le istruzioni per reimpostare la password a {email}. Controlla la posta in arrivo e la cartella spam.", - "back_to_login": "Torna al login", - "resend_email": "Reinvia email", - "reset_email_sent_title": "Email inviata!", - "terms_agreement_conjunction": "e la", - "terms_agreement_suffix": ".", - "oauth_error_access_denied": "Accesso negato. L'accesso è stato annullato.", - "oauth_error_server_error": "Errore del server durante l'autenticazione. Riprova.", - "oauth_error_temporarily_unavailable": "Il servizio di autenticazione non è temporaneamente disponibile. Riprova più tardi.", - "oauth_error_invalid_request": "Richiesta non valida. Riprova.", - "oauth_error_unauthorized_client": "Client non autorizzato. Contatta il supporto.", - "oauth_error_unsupported_response_type": "Tipo di risposta non supportato. Contatta il supporto.", - "oauth_error_invalid_scope": "Ambito non valido. Contatta il supporto.", - "oauth_error_unknown": "Si è verificato un errore sconosciuto. Riprova.", - "password_requirements_title": "Requisiti password:", - "password_requirement_length": "Almeno 8 caratteri", - "password_requirement_lowercase": "Una lettera minuscola", - "password_requirement_uppercase": "Una lettera maiuscola", - "password_requirement_digit": "Un numero", - "password_requirement_special": "Un carattere speciale" - }, - "dashboard": { - "title": "Dashboard", - "recent_memos": "Memo recenti", - "no_memos": "Nessun memo trovato", - "create_memo": "Crea memo", - "search_placeholder": "Cerca memo..." - }, - "memo": { - "title": "Memo", - "unnamed": "Memo senza nome", - "word_count": "{{count}} parola", - "word_count_plural": "{{count}} parole", - "delete_confirmation": "Vuoi davvero eliminare questo memo? Questa azione non può essere annullata.", - "delete_permanently": "Elimina definitivamente", - "deleting": "Eliminazione...", - "pin": "Fissa", - "unpin": "Sblocca", - "share": "Condividi", - "edit": "Modifica", - "translate": "Traduci", - "create_memory": "Crea Memory", - "ask_question": "Fai una domanda", - "copy_transcript": "Copia trascrizione", - "replace_word": "Sostituisci parola", - "reprocess": "Rielabora", - "label_speakers": "Nomina relatori", - "add_photos": "Aggiungi foto", - "manage_spaces": "Gestisci spazi", - "tags": "Tag", - "add_tag": "Aggiungi tag", - "options": "Opzioni", - "search": "Cerca", - "copy": "Copia", - "speakers": "Relatori", - "find_replace": "Trova e sostituisci", - "shortcuts": "Scorciatoie", - "no_memo_selected": "Nessun memo selezionato", - "select_memo_hint": "Seleziona un memo dalla lista o crea una nuova registrazione", - "processing_transcript": "Trascrizione in corso...", - "ask_question_placeholder": "Fai una domanda su questo memo...", - "open_in_new_tab": "Apri in una nuova scheda", - "edit_title": "Modifica titolo", - "export_text": "Esporta come testo", - "enter_new_title": "Inserisci nuovo titolo:", - "no_title": "Senza titolo", - "no_transcript": "Nessuna trascrizione disponibile", - "link_copied": "Link copiato negli appunti!", - "transcript_copied": "Trascrizione copiata negli appunti!", - "no_search_results": "Nessun risultato di ricerca", - "no_memos_with_search": "Nessun memo trovato contenente \"{query}\".", - "clear_search": "Cancella ricerca", - "no_memos_with_tag": "Nessun memo con questo tag", - "no_memos_with_tag_hint": "Non ci sono ancora memo con questo tag.", - "show_all_memos": "Mostra tutti i memo", - "no_memos_yet": "Ancora nessun memo", - "no_memos_hint": "Vai alla pagina di registrazione per creare il tuo primo memo", - "load_more": "Carica altri memo", - "search_placeholder": "Cerca memo...", - "delete_memo_title": "Elimina memo", - "delete_memo_confirm": "Vuoi davvero eliminare \"{title}\"?", - "delete_memo_warning": "Questa azione non può essere annullata. Il memo e tutti i dati associati verranno eliminati definitivamente.", - "error_user_not_authenticated": "Utente non autenticato", - "error_loading_memos": "Impossibile caricare i memo", - "error_deleting_memo": "Errore durante l'eliminazione del memo. Riprova.", - "error_updating_title": "Errore durante l'aggiornamento del titolo. Riprova.", - "error_copying_link": "Errore durante la copia del link. Riprova.", - "error_pin_status": "Errore durante la modifica dello stato di fissaggio. Riprova.", - "error_saving": "Errore durante il salvataggio. Riprova.", - "error_copying_transcript": "Errore durante la copia della trascrizione. Riprova.", - "error_updating_tags": "Errore durante l'aggiornamento dei tag. Riprova.", - "error_creating_tag": "Errore durante la creazione del tag. Riprova.", - "error_asking_question": "Errore durante l'elaborazione della domanda. Riprova.", - "retry": "Riprova", - "export_title": "Titolo", - "export_date": "Data", - "export_duration": "Durata", - "export_transcript": "Trascrizione", - "export_no_transcript": "Nessuna trascrizione disponibile", - "export_ai_analysis": "Analisi IA" - }, - "tags": { - "title": "Tag", - "create_tag": "Crea tag", - "search_placeholder": "Cerca tag...", - "no_tags": "Nessun tag trovato", - "delete_confirmation": "Vuoi davvero eliminare il tag \"{{name}}\"?", - "tag_name": "Nome tag", - "tag_color": "Colore tag" - }, - "spaces": { - "title": "Spazi", - "create_space": "Crea spazio", - "no_spaces": "Nessuno spazio trovato", - "members": "Membri", - "invite": "Invita" - }, - "blueprints": { - "title": "Modelli", - "loading": "Caricamento modelli...", - "no_blueprints": "Nessun modello trovato", - "search_placeholder": "Cerca modelli...", - "all_categories": "Tutti", - "standard": "Standard", - "manage": "Gestisci modelli", - "activate": "Attiva modello", - "load_error": "Impossibile caricare i modelli.", - "previous_tip": "Consiglio precedente", - "next_tip": "Consiglio successivo", - "go_to_tip": "Vai al consiglio {index}" - }, - "record": { - "title": "Registra - Memoro", - "instruction": "Tieni premuto per registrare", - "uploading": "Caricamento...", - "user_not_authenticated": "Utente non autenticato", - "upload_failed": "Caricamento fallito", - "network_error": "Errore di rete: Verifica la connessione e riprova.", - "upload_error": "Errore durante il caricamento della registrazione: {error}", - "unexpected_error": "Si è verificato un errore imprevisto. Riprova.", - "cancel_title": "Elimina registrazione", - "cancel_message": "Vuoi davvero eliminare la registrazione corrente? Questa azione non può essere annullata.", - "cancel_confirm": "Elimina", - "cancel_abort": "Non eliminare", - "pause": "Pausa", - "resume": "Riprendi", - "cancel": "Annulla registrazione" - }, - "statistics": { - "title": "Statistiche", - "today": "Oggi", - "last_30_days": "Ultimi 30 giorni", - "total": "Totale", - "memos": "Memo", - "words": "Parole", - "recording_duration": "Durata registrazione", - "loading": "Caricamento statistiche..." - }, - "subscription": { - "title": "Acquista Mana", - "current_plan": "Piano attuale", - "your_mana": "Il tuo Mana", - "buy": "Acquista", - "popular": "Popolare", - "legacy_plan": "Piano Legacy", - "monthly": "Mensile", - "yearly": "Annuale" - }, - "settings": { - "title": "Impostazioni", - "appearance": "Aspetto", - "theme": "Tema", - "system": "Sistema", - "light": "Chiaro", - "dark": "Scuro", - "language": "Lingua", - "user_interface": "Interfaccia utente", - "show_language_button": "Mostra pulsante lingua", - "show_recording_instruction": "Mostra istruzioni di registrazione", - "show_blueprints": "Mostra modelli", - "show_mana_badge": "Mostra badge Mana nell'intestazione", - "data_privacy": "Dati e privacy", - "save_location": "Salva posizione", - "enable_analytics": "Abilita analytics", - "support": "Supporto", - "contact_support": "Contatta supporto", - "rate_app": "Valuta app", - "account": "Account", - "email_label": "Indirizzo email", - "sign_out": "Esci", - "delete_account": "Elimina account", - "app_info": "Informazioni app", - "version": "Versione", - "platform": "Piattaforma", - "build": "Build", - "browser": "Browser", - "copyright": "© 2025 Memoro GmbH", - "made_with_love": "Made with ❤️ in Germany" - }, - "theme": { - "toggle": "Cambia tema", - "light_mode": "Modalità chiara", - "dark_mode": "Modalità scura", - "switch_to_light": "Passa alla modalità chiara", - "switch_to_dark": "Passa alla modalità scura" - }, - "errors": { - "unexpected": "Si è verificato un errore imprevisto.", - "network": "Errore di rete. Verifica la tua connessione Internet.", - "not_found": "Non trovato.", - "unauthorized": "Non autorizzato.", - "forbidden": "Accesso negato.", - "server_error": "Errore del server. Riprova più tardi." - }, - "detail_view": { - "title_sources": { - "none": "Locale (regole)", - "browser": "Sul tuo dispositivo (Gemma 4 E2B)", - "mana_server": "Mana server (Gemma 4 E4B)", - "byok": "La tua API key", - "cloud": "Google Gemini" - }, - "statuses": { - "pending": "In attesa", - "processing": "In elaborazione", - "completed": "Completato", - "failed": "Fallito" - }, - "not_found": "Memo non trovato", - "confirm_delete": "Eliminare davvero il memo?", - "toast_deleted": "Memo eliminato", - "placeholder_title_idle": "Titolo…", - "placeholder_title_generating": "Generazione del titolo…", - "label_status": "Stato", - "label_duration": "Durata", - "label_language": "Lingua", - "placeholder_language": "es. it", - "label_visibility": "Visibilità", - "section_summary": "Riassunto", - "placeholder_summary": "Aggiungi un riassunto…", - "section_transcript": "Trascrizione", - "transcribing": "Trascrizione in corso…", - "transcript_failed": "Trascrizione non riuscita. Riprova o inseriscila manualmente.", - "transcript_empty": "Nessuna trascrizione.", - "transcript_source": "Voxtral via mana-stt", - "meta_created": "Creato: {date}", - "meta_updated": "Modificato: {date}" - } -} diff --git a/apps/mana/apps/web/src/lib/modules/memoro/ListView.svelte b/apps/mana/apps/web/src/lib/modules/memoro/ListView.svelte deleted file mode 100644 index 572fdf8af..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/ListView.svelte +++ /dev/null @@ -1,137 +0,0 @@ - - - -
- m.id} emptyTitle="Keine Memos"> - {#snippet header()} - {memos.length} Memos - {pinned.length} angepinnt - {/snippet} - - {#snippet item(memo)} - - {/snippet} - - - -
- - diff --git a/apps/mana/apps/web/src/lib/modules/memoro/collections.ts b/apps/mana/apps/web/src/lib/modules/memoro/collections.ts deleted file mode 100644 index 049cd0cf2..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/collections.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Memoro module — collection accessors and guest seed data. - * - * Table names: memos, memories, memoroTags, memoTags, memoroSpaces, spaceMembers, memoSpaces - */ - -import { db } from '$lib/data/database'; -import type { - LocalMemo, - LocalMemory, - LocalMemoTag, - LocalSpace, - LocalSpaceMember, - LocalMemoSpace, -} from './types'; - -// ─── Collection Accessors ────────────────────────────────── - -export const memoTable = db.table('memos'); -export const memoryTable = db.table('memories'); -export const memoTagTable = db.table('memoTags'); -export const memoroSpaceTable = db.table('memoroSpaces'); -export const spaceMemberTable = db.table('spaceMembers'); -export const memoSpaceTable = db.table('memoSpaces'); - -// ─── Guest Seed ──────────────────────────────────────────── - -const DEMO_MEMO_ID = 'demo-welcome-memo'; - -export const MEMORO_GUEST_SEED = { - memos: [ - { - id: DEMO_MEMO_ID, - title: 'Willkommen bei Memoro', - intro: 'Dies ist ein Beispiel-Memo zum Kennenlernen.', - transcript: - 'Memoro ist dein AI-gestützter Sprachrekorder und Memo-Manager. Nimm Gedanken auf, lass sie transkribieren und erstelle Erinnerungen daraus.', - audioDurationMs: null, - processingStatus: 'completed' as const, - isArchived: false, - isPinned: true, - blueprintId: null, - language: 'de', - }, - ], - memories: [ - { - id: 'demo-memory-1', - memoId: DEMO_MEMO_ID, - title: 'Kernfunktionen', - content: - 'Memoro bietet Sprachaufnahme, automatische Transkription, KI-gestützte Zusammenfassungen und Tagging.', - }, - ], - memoTags: [] as Record[], - memoroSpaces: [] as Record[], - spaceMembers: [] as Record[], - memoSpaces: [] as Record[], -}; diff --git a/apps/mana/apps/web/src/lib/modules/memoro/index.ts b/apps/mana/apps/web/src/lib/modules/memoro/index.ts deleted file mode 100644 index c596251b9..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Memoro module — barrel exports. - */ - -export { memosStore } from './stores/memos.svelte'; -export { - tagMutations, - useAllTags, - getTagById, - getTagsByIds, - getTagColor, - memoTagOps, -} from './stores/tags.svelte'; -export { memoriesStore } from './stores/memories.svelte'; -export { - useAllMemos, - useArchivedMemos, - useMemoriesByMemo, - useAllMemoTags, - useAllSpaces, - toMemo, - toMemory, - toSpace, - sortMemos, - filterBySearch, - filterByTag, - getTagsForMemo, - formatDuration, - getStatusLabel, -} from './queries'; -export { - memoTable, - memoryTable, - memoTagTable, - memoroSpaceTable, - spaceMemberTable, - memoSpaceTable, - MEMORO_GUEST_SEED, -} from './collections'; -export type { - LocalMemo, - LocalMemory, - LocalMemoTag, - LocalSpace, - LocalSpaceMember, - LocalMemoSpace, - Memo, - Memory, - Space, - ProcessingStatus, -} from './types'; -// Tag type re-exported from @mana/shared-tags (the local memoro Tag was removed) -export type { Tag } from '@mana/shared-tags'; diff --git a/apps/mana/apps/web/src/lib/modules/memoro/llm-watcher.svelte.ts b/apps/mana/apps/web/src/lib/modules/memoro/llm-watcher.svelte.ts deleted file mode 100644 index 89618826d..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/llm-watcher.svelte.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { formatDate } from '$lib/i18n/format'; -/** - * Memoro LLM result watcher. - * - * The persistent task queue stores LlmTask results in its own Dexie - * table — but for module-side data (like a memo's title), we want - * those results to land in the module's own collection so existing - * queries / UI keep working without per-component subscriptions. - * - * This file owns the bridge for memoro: it subscribes via Dexie - * liveQuery to completed `common.generateTitle` tasks tagged - * with refType: 'memo', and for each one writes the generated title - * back into the memo row, then deletes the queue entry to mark it - * consumed. Once consumed, the queue stays empty for that memo. - * - * The watcher is started exactly once per page session — see - * startMemoroLlmWatcher() below for the idempotent guard. The - * memoro module config calls it from its initialize() hook, but - * even if a future refactor calls it twice, the duplicate call is - * a no-op. - * - * Cleanup: the subscription handle is stored module-scope; the page - * teardown is implicit (page reload kills the dev server too). For - * a long-lived SPA we'd want stop() — punt that to a follow-up. - */ - -import { liveQuery, type Subscription } from 'dexie'; -import type { QueuedTask } from '@mana/shared-llm'; -import { llmQueueDb } from '$lib/llm-queue'; -import { encryptRecord } from '$lib/data/crypto'; -import { memoTable } from './collections'; -import type { LocalMemo } from './types'; - -let subscription: Subscription | null = null; - -export function startMemoroLlmWatcher(): void { - if (subscription) return; // already running - if (typeof window === 'undefined') return; // SSR-safe no-op - - console.info('[memoro-llm-watcher] starting subscription'); - - const observable = liveQuery(async () => - llmQueueDb.tasks - .where('state') - .equals('done') - .and((t: QueuedTask) => t.taskName === 'common.generateTitle' && t.refType === 'memo') - .toArray() - ); - - subscription = observable.subscribe({ - next: async (rows) => { - if (rows.length === 0) return; - console.info(`[memoro-llm-watcher] saw ${rows.length} done title task(s)`); - - for (const row of rows) { - try { - await applyRow(row); - } catch (err) { - console.warn('[memoro-llm-watcher] failed to apply row', row.id, err); - // Best-effort: mark the row consumed so we don't keep - // retrying a row that crashes the watcher every cycle. - try { - await llmQueueDb.tasks.delete(row.id); - } catch { - /* ignore */ - } - } - } - }, - error: (err) => { - console.warn('[memoro-llm-watcher] subscription error:', err); - }, - }); - - // Belt-and-suspenders: Dexie liveQuery sometimes misses the FIRST - // emission if the subscription is set up in the same microtask as - // the table update. Trigger an immediate manual sweep on startup - // so any rows already done from a previous tab session get picked up. - void runOneSweep(); -} - -async function runOneSweep(): Promise { - try { - const rows = await llmQueueDb.tasks - .where('state') - .equals('done') - .and((t: QueuedTask) => t.taskName === 'common.generateTitle' && t.refType === 'memo') - .toArray(); - if (rows.length === 0) { - console.info('[memoro-llm-watcher] startup sweep: no pending done rows'); - return; - } - console.info(`[memoro-llm-watcher] startup sweep: applying ${rows.length} row(s)`); - for (const row of rows) { - try { - await applyRow(row); - } catch (err) { - console.warn('[memoro-llm-watcher] startup sweep failed for row', row.id, err); - } - } - } catch (err) { - console.warn('[memoro-llm-watcher] startup sweep error:', err); - } -} - -async function applyRow(row: QueuedTask): Promise { - if (!row.refId || typeof row.result !== 'string') { - console.info( - `[memoro-llm-watcher] dropping row ${row.id} — missing refId or result not a string` - ); - await llmQueueDb.tasks.delete(row.id); - return; - } - - const memo = await memoTable.get(row.refId); - if (!memo) { - console.info(`[memoro-llm-watcher] dropping row ${row.id} — memo ${row.refId} not found`); - await llmQueueDb.tasks.delete(row.id); - return; - } - - // Don't overwrite a manual title that the user typed - // between enqueue time and result time. The memo we just read - // from Dexie is still ENCRYPTED — title is either null/undefined - // (no manual title) or an `enc:1:...` blob (manual title set). - // Either way, presence-check is enough — we don't need to decrypt - // to know if the user filled it in. - if (typeof memo.title === 'string' && memo.title.trim()) { - console.info( - `[memoro-llm-watcher] memo ${row.refId} already has a title — skipping auto-title` - ); - await llmQueueDb.tasks.delete(row.id); - return; - } - - // Backstop: if the task result somehow came back empty/whitespace - // (LLM emitted only special tokens, runRules got an empty input, - // any other edge case), synthesize a date-based fallback so the - // user always gets *some* title rather than a stuck empty input. - let titleToWrite = row.result.trim(); - if (!titleToWrite) { - const created = (memo as { createdAt?: string }).createdAt; - const dateLabel = created - ? formatDate(new Date(created), { - day: 'numeric', - month: 'long', - year: 'numeric', - }) - : formatDate(new Date()); - titleToWrite = `Memo vom ${dateLabel}`; - console.warn( - `[memoro-llm-watcher] row ${row.id} returned empty title — using date fallback "${titleToWrite}"`, - { source: row.source, attempts: row.attempts, rawResult: JSON.stringify(row.result) } - ); - } else { - console.info(`[memoro-llm-watcher] writing title to memo ${row.refId}: "${titleToWrite}"`, { - source: row.source, - attempts: row.attempts, - }); - } - - // Stamp the title source on the memo's metadata so the DetailView can - // render a "via Mana-Server" / "Auf deinem Gerät" / "Lokal (Regeln)" - // label under the title — the same UX we already have under the - // transcript ("Voxtral via mana-stt"). Stored as plaintext metadata - // because the tier name isn't sensitive and the encryption registry - // for memos only covers title/intro/transcript. - const existingMetadata = (memo.metadata as Record | null) ?? {}; - - const diff: Partial = { - title: titleToWrite, - metadata: { - ...existingMetadata, - titleSource: row.source, - }, - }; - await encryptRecord('memos', diff); - await memoTable.update(row.refId, diff); - - // Mark consumed - await llmQueueDb.tasks.delete(row.id); - console.info(`[memoro-llm-watcher] applied + cleared row ${row.id}`); -} - -export function stopMemoroLlmWatcher(): void { - subscription?.unsubscribe(); - subscription = null; -} diff --git a/apps/mana/apps/web/src/lib/modules/memoro/module.config.ts b/apps/mana/apps/web/src/lib/modules/memoro/module.config.ts deleted file mode 100644 index a7a6ed651..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/module.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { ModuleConfig } from '$lib/data/module-registry'; - -export const memoroModuleConfig: ModuleConfig = { - appId: 'memoro', - tables: [ - { name: 'memos' }, - { name: 'memories' }, - { name: 'memoTags' }, - { name: 'memoroSpaces', syncName: 'spaces' }, - { name: 'spaceMembers' }, - { name: 'memoSpaces' }, - ], -}; diff --git a/apps/mana/apps/web/src/lib/modules/memoro/queries.ts b/apps/mana/apps/web/src/lib/modules/memoro/queries.ts deleted file mode 100644 index f3aa07176..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/queries.ts +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Reactive queries & pure helpers for Memoro — uses Dexie liveQuery on the unified DB. - */ - -import { useScopedLiveQuery } from '$lib/data/scope/use-scoped-live-query.svelte'; -import { deriveUpdatedAt } from '$lib/data/sync'; -import { db } from '$lib/data/database'; -import { scopedForModule } from '$lib/data/scope'; -import { decryptRecords } from '$lib/data/crypto'; -// `useAllTags` re-exports the shared-tags hook below; the actual tag -// objects flowing through this module are the shared shape, not the -// memoro/types.Tag declared next to LocalMemoTag. Importing the shared -// type here keeps `getTagsForMemo` and friends in sync with what the -// hook actually returns. -import type { Tag } from '@mana/shared-tags'; -import type { - LocalMemo, - LocalMemory, - LocalMemoTag, - LocalSpace, - Memo, - Memory, - Space, -} from './types'; - -// ─── Type Converters ─────────────────────────────────────── - -export function toMemo(local: LocalMemo): Memo { - return { - id: local.id, - title: local.title, - intro: local.intro, - transcript: local.transcript, - audioDurationMs: local.audioDurationMs, - transcriptModel: local.transcriptModel ?? null, - processingStatus: local.processingStatus, - isArchived: local.isArchived, - isPinned: local.isPinned, - visibility: local.visibility ?? 'space', - language: local.language, - createdAt: local.createdAt ?? new Date().toISOString(), - updatedAt: deriveUpdatedAt(local), - }; -} - -export function toMemory(local: LocalMemory): Memory { - return { - id: local.id, - memoId: local.memoId, - title: local.title, - content: local.content, - createdAt: local.createdAt ?? new Date().toISOString(), - updatedAt: deriveUpdatedAt(local), - }; -} - -export function toSpace(local: LocalSpace): Space { - return { - id: local.id, - name: local.name, - description: local.description, - ownerId: local.ownerId, - createdAt: local.createdAt ?? new Date().toISOString(), - updatedAt: deriveUpdatedAt(local), - }; -} - -// ─── Live Queries ────────────────────────────────────────── - -/** All non-archived memos, sorted by pinned first then createdAt desc. */ -export function useAllMemos() { - return useScopedLiveQuery(async () => { - const visible = (await scopedForModule('memoro', 'memos').toArray()).filter( - (m) => !m.deletedAt && !m.isArchived - ); - const decrypted = await decryptRecords('memos', visible); - return sortMemos(decrypted.map(toMemo)); - }, [] as Memo[]); -} - -/** All archived memos, sorted by updatedAt desc. */ -export function useArchivedMemos() { - return useScopedLiveQuery(async () => { - const visible = (await scopedForModule('memoro', 'memos').toArray()).filter( - (m) => !m.deletedAt && m.isArchived - ); - const decrypted = await decryptRecords('memos', visible); - return decrypted - .map(toMemo) - .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()); - }, [] as Memo[]); -} - -/** Memories for a specific memo. */ -export function useMemoriesByMemo(memoId: string) { - return useScopedLiveQuery(async () => { - const visible = ( - await db.table('memories').where('memoId').equals(memoId).toArray() - ).filter((m) => !m.deletedAt); - const decrypted = await decryptRecords('memories', visible); - return decrypted.map(toMemory); - }, [] as Memory[]); -} - -// Tags: use shared global tags from @mana/shared-stores -export { useAllTags } from '@mana/shared-stores'; - -/** All memo-tag associations. */ -export function useAllMemoTags() { - return useScopedLiveQuery(async () => { - const locals = await scopedForModule('memoro', 'memoTags').toArray(); - return locals.filter((mt) => !mt.deletedAt); - }, [] as LocalMemoTag[]); -} - -/** All spaces. */ -export function useAllSpaces() { - return useScopedLiveQuery(async () => { - const locals = await scopedForModule('memoro', 'memoroSpaces').toArray(); - return locals.filter((s) => !s.deletedAt).map(toSpace); - }, [] as Space[]); -} - -// ─── Pure Sort / Filter Functions ────────────────────────── - -/** Sort memos: pinned first, then by createdAt descending. */ -export function sortMemos(list: Memo[]): Memo[] { - return [...list].sort((a, b) => { - if (a.isPinned && !b.isPinned) return -1; - if (!a.isPinned && b.isPinned) return 1; - return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(); - }); -} - -/** Filter memos by search query on title and transcript. */ -export function filterBySearch(memos: Memo[], query: string): Memo[] { - if (!query.trim()) return memos; - const lower = query.toLowerCase(); - return memos.filter( - (m) => m.title?.toLowerCase().includes(lower) || m.transcript?.toLowerCase().includes(lower) - ); -} - -/** Filter memos by tag. */ -export function filterByTag(memos: Memo[], memoTags: LocalMemoTag[], tagId: string): Memo[] { - const memoIds = new Set(memoTags.filter((mt) => mt.tagId === tagId).map((mt) => mt.memoId)); - return memos.filter((m) => memoIds.has(m.id)); -} - -/** Get tags for a specific memo. */ -export function getTagsForMemo(tags: Tag[], memoTags: LocalMemoTag[], memoId: string): Tag[] { - const tagIds = new Set(memoTags.filter((mt) => mt.memoId === memoId).map((mt) => mt.tagId)); - return tags.filter((t) => tagIds.has(t.id)); -} - -/** Format audio duration in ms to readable string. */ -export function formatDuration(ms: number | null): string { - if (!ms) return ''; - const totalSeconds = Math.floor(ms / 1000); - const minutes = Math.floor(totalSeconds / 60); - const seconds = totalSeconds % 60; - return `${minutes}:${String(seconds).padStart(2, '0')}`; -} - -/** Get processing status label. */ -export function getStatusLabel(status: string): string { - switch (status) { - case 'pending': - return 'Ausstehend'; - case 'processing': - return 'Verarbeitung...'; - case 'completed': - return 'Fertig'; - case 'failed': - return 'Fehlgeschlagen'; - default: - return status; - } -} diff --git a/apps/mana/apps/web/src/lib/modules/memoro/stores/memories.svelte.ts b/apps/mana/apps/web/src/lib/modules/memoro/stores/memories.svelte.ts deleted file mode 100644 index cea32a96d..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/stores/memories.svelte.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Memories Store — Mutations Only - * - * Reads come from liveQuery hooks in queries.ts. - * Handles memory (AI insight) CRUD. - */ - -import { memoryTable } from '../collections'; -import { toMemory } from '../queries'; -import { MemoroEvents } from '@mana/shared-utils/analytics'; -import { encryptRecord } from '$lib/data/crypto'; -import type { LocalMemory } from '../types'; - -export const memoriesStore = { - /** Create a new memory for a memo. */ - async create(data: { memoId: string; title: string; content?: string }) { - const newLocal: LocalMemory = { - id: crypto.randomUUID(), - memoId: data.memoId, - title: data.title, - content: data.content ?? null, - }; - const plaintextSnapshot = toMemory(newLocal); - await encryptRecord('memories', newLocal); - await memoryTable.add(newLocal); - MemoroEvents.memoCreated(); - return plaintextSnapshot; - }, - - /** Update a memory. */ - async update(id: string, data: Partial>) { - const diff: Partial = { - ...data, - }; - await encryptRecord('memories', diff); - await memoryTable.update(id, diff); - }, - - /** Soft-delete a memory. */ - async delete(id: string) { - const now = new Date().toISOString(); - await memoryTable.update(id, { deletedAt: now }); - MemoroEvents.memoDeleted(); - }, -}; diff --git a/apps/mana/apps/web/src/lib/modules/memoro/stores/memos.svelte.ts b/apps/mana/apps/web/src/lib/modules/memoro/stores/memos.svelte.ts deleted file mode 100644 index f8ec084b0..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/stores/memos.svelte.ts +++ /dev/null @@ -1,215 +0,0 @@ -/** - * Memos Store — Mutations Only - * - * Reads come from liveQuery hooks in queries.ts. - * Handles memo CRUD, archive, pin, delete. - */ - -import { memoTable } from '../collections'; -import { toMemo } from '../queries'; -import { createArchiveOps } from '@mana/shared-stores'; -import { MemoroEvents } from '@mana/shared-utils/analytics'; -import { encryptRecord } from '$lib/data/crypto'; -import { emitDomainEvent } from '$lib/data/events'; -import { getActiveSpace } from '$lib/data/scope'; -import { getEffectiveUserId } from '$lib/data/current-user'; -import { defaultVisibilityFor, type VisibilityLevel } from '@mana/shared-privacy'; -import { transcribeAudio } from '$lib/voice/transcribe'; -import { llmTaskQueue } from '$lib/llm-queue'; -import { generateTitleTask } from '$lib/llm-tasks/generate-title'; -import type { LocalMemo } from '../types'; - -/** Archive/soft-delete ops for memos. */ -export const memoArchive = createArchiveOps({ - table: () => memoTable, -}); - -export const memosStore = { - /** Create a new memo (e.g., after recording). */ - async create(data: { - title?: string; - transcript?: string; - language?: string; - blueprintId?: string; - audioDurationMs?: number; - processingStatus?: LocalMemo['processingStatus']; - }) { - const now = new Date().toISOString(); - const newLocal: LocalMemo = { - id: crypto.randomUUID(), - title: data.title ?? null, - intro: null, - transcript: data.transcript ?? null, - audioDurationMs: data.audioDurationMs ?? null, - transcriptModel: null, - processingStatus: data.processingStatus ?? (data.transcript ? 'completed' : 'pending'), - isArchived: false, - isPinned: false, - visibility: defaultVisibilityFor(getActiveSpace()?.type), - blueprintId: data.blueprintId ?? null, - language: data.language ?? null, - // createdAt + updatedAt are required by LocalMemo's type but the - // previous create() never set them — DetailView showed - // "Erstellt: Invalid Date" for every memo. The Dexie creating - // hook only auto-stamps userId + __fieldMeta; module - // stores have to set their own createdAt/updatedAt explicitly - // (consistent with the rest of the Mana modules). - createdAt: now, - } as LocalMemo; - const plaintextSnapshot = toMemo(newLocal); - await encryptRecord('memos', newLocal); - await memoTable.add(newLocal); - emitDomainEvent('MemoCreated', 'memoro', 'memos', newLocal.id, { - memoId: newLocal.id, - fromVoice: false, - }); - MemoroEvents.memoCreated(); - return plaintextSnapshot; - }, - - /** - * Create a placeholder memo from a fresh voice recording and start the - * background transcription. Returns the new memo immediately so the UI - * can navigate / show a "processing" state without waiting. - */ - async createFromVoice(blob: Blob, durationMs: number, language?: string) { - const memo = await this.create({ - audioDurationMs: durationMs, - language, - processingStatus: 'processing', - }); - // Fire and forget — transcription updates the memo when it returns. - void this.transcribeBlob(memo.id, blob, language); - return memo; - }, - - /** - * Upload an audio blob to /api/v1/voice/transcribe and write the result - * back into the memo. Marks completed on success, failed on error. - */ - async transcribeBlob(memoId: string, blob: Blob, language?: string): Promise { - try { - const result = await transcribeAudio(blob, language); - - const transcript = result.text; - const existing = await memoTable.get(memoId); - if (!existing) return; - - const diff: Partial = { - transcript, - transcriptModel: result.model, - language: existing.language ?? result.language ?? null, - processingStatus: 'completed', - }; - await encryptRecord('memos', diff); - await memoTable.update(memoId, diff); - - // Auto-title: if the user didn't already give the memo a title, - // queue a background task to generate one from the transcript. - // The task is fire-and-forget — the memoro LLM watcher - // (./llm-watcher.svelte.ts) picks up the result reactively and - // writes it back to memo.title. Works on every tier including - // none (regex-based first-sentence fallback). - if (!existing.title?.trim() && transcript.length > 0) { - try { - const taskId = await llmTaskQueue.enqueue( - generateTitleTask, - { text: transcript, language: existing.language ?? result.language ?? 'de' }, - { refType: 'memo', refId: memoId, priority: 1 } - ); - console.info('[memoro] enqueued title task', { taskId, memoId }); - } catch (err) { - // Don't let queue failures break the transcription path. - // Worst case the memo stays untitled — the user can still - // rename it manually. - console.warn('[memoro] failed to enqueue title task:', err); - } - } - } catch (e) { - const msg = e instanceof Error ? e.message : String(e); - await memoTable.update(memoId, { - processingStatus: 'failed', - metadata: { ...(((await memoTable.get(memoId))?.metadata as object) ?? {}), error: msg }, - }); - } - }, - - /** Update a memo's fields. */ - async update( - id: string, - data: Partial> - ) { - const diff: Partial = { - ...data, - }; - - // If the user is overwriting the title manually, clear the - // auto-generated titleSource marker so the DetailView stops - // showing "via Mana-Server" — the title is now the user's, not - // the LLM's. We only touch metadata when title was actually in - // the diff so we don't accidentally wipe other metadata fields - // (e.g. STT failure markers) on a non-title update. - if ('title' in data) { - const existing = await memoTable.get(id); - const existingMetadata = (existing?.metadata as Record | null) ?? {}; - if ('titleSource' in existingMetadata) { - const { titleSource: _omit, ...rest } = existingMetadata; - void _omit; - diff.metadata = rest; - } - } - - await encryptRecord('memos', diff); - await memoTable.update(id, diff); - }, - - // Archive ops (delegated to shared factory) - archive: (id: string) => memoArchive.archive(id), - unarchive: (id: string) => memoArchive.unarchive(id), - - /** - * Flip a memo's visibility. Public memos surface in the user's - * website embed via the memoro embed-resolver. - */ - async setVisibility(id: string, next: VisibilityLevel) { - const existing = await memoTable.get(id); - if (!existing) throw new Error(`Memo ${id} not found`); - const before: VisibilityLevel = existing.visibility ?? 'space'; - if (before === next) return; - - const stamp = new Date().toISOString(); - await memoTable.update(id, { - visibility: next, - visibilityChangedAt: stamp, - visibilityChangedBy: getEffectiveUserId(), - updatedAt: stamp, - }); - - emitDomainEvent('VisibilityChanged', 'memoro', 'memos', id, { - recordId: id, - collection: 'memos', - before, - after: next, - }); - }, - - /** Pin a memo. */ - async pin(id: string) { - await memoTable.update(id, { - isPinned: true, - }); - }, - - /** Unpin a memo. */ - async unpin(id: string) { - await memoTable.update(id, { - isPinned: false, - }); - }, - - /** Soft-delete a memo. */ - async delete(id: string) { - await memoArchive.softDelete(id); - MemoroEvents.memoDeleted(); - }, -}; diff --git a/apps/mana/apps/web/src/lib/modules/memoro/stores/tags.svelte.ts b/apps/mana/apps/web/src/lib/modules/memoro/stores/tags.svelte.ts deleted file mode 100644 index c92b734da..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/stores/tags.svelte.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Memoro Tags — Uses shared global tags + module-specific junction table. - */ - -import { db } from '$lib/data/database'; -import { createTagLinkOps } from '@mana/shared-stores'; - -export { - tagMutations, - useAllTags, - getTagById, - getTagsByIds, - getTagColor, -} from '@mana/shared-stores'; - -export const memoTagOps = createTagLinkOps({ - table: () => db.table('memoTags'), - entityIdField: 'memoId', -}); diff --git a/apps/mana/apps/web/src/lib/modules/memoro/tools.ts b/apps/mana/apps/web/src/lib/modules/memoro/tools.ts deleted file mode 100644 index 2fe230c89..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/tools.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { ModuleTool } from '$lib/data/tools/types'; -import { memosStore } from './stores/memos.svelte'; - -export const memoroTools: ModuleTool[] = [ - { - name: 'create_memo', - module: 'memoro', - description: 'Erstellt ein neues Sprachmemo / Memo', - parameters: [ - { name: 'title', type: 'string', description: 'Titel', required: false }, - { name: 'transcript', type: 'string', description: 'Text / Transkript', required: true }, - ], - async execute(params) { - const memo = await memosStore.create({ - title: params.title as string | undefined, - transcript: params.transcript as string, - }); - return { success: true, data: memo, message: `Memo "${memo.title || 'Neu'}" erstellt` }; - }, - }, -]; diff --git a/apps/mana/apps/web/src/lib/modules/memoro/types.ts b/apps/mana/apps/web/src/lib/modules/memoro/types.ts deleted file mode 100644 index a51fd2cc0..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/types.ts +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Memoro module types for the unified app. - */ - -import type { BaseRecord } from '@mana/local-store'; -import type { VisibilityLevel } from '@mana/shared-privacy'; - -export type ProcessingStatus = 'pending' | 'processing' | 'completed' | 'failed'; - -export interface LocalMemo extends BaseRecord { - title: string | null; - intro: string | null; - transcript: string | null; - audioDurationMs: number | null; - transcriptModel: string | null; - processingStatus: ProcessingStatus; - isArchived: boolean; - isPinned: boolean; - visibility?: VisibilityLevel; - visibilityChangedAt?: string; - visibilityChangedBy?: string; - blueprintId: string | null; - language: string | null; - location?: Record; - source?: { - audioPath?: string; - audioDeleted?: boolean; - audioDuration?: number; - transcript?: string; - utterances?: Array<{ - text: string; - offset?: number; - duration?: number; - speakerId?: string; - }>; - speakers?: Record; - speakerMap?: Record; - primaryLanguage?: string; - languages?: string[]; - processing?: { - transcription?: { status: ProcessingStatus }; - headlineAndIntro?: { status: ProcessingStatus }; - }; - recordingStartedAt?: string; - }; - metadata?: Record; -} - -export interface LocalMemory extends BaseRecord { - memoId: string; - title: string; - content: string | null; - metadata?: Record; -} - -export interface LocalMemoTag extends BaseRecord { - memoId: string; - tagId: string; -} - -export interface LocalSpace extends BaseRecord { - name: string; - description: string | null; - ownerId: string; -} - -export interface LocalSpaceMember extends BaseRecord { - contextSpaceId: string; - userId: string; - role: 'owner' | 'member'; -} - -export interface LocalMemoSpace extends BaseRecord { - memoId: string; - contextSpaceId: string; -} - -// ─── View Types ──────────────────────────────────────────── - -export interface Memo { - id: string; - title: string | null; - intro: string | null; - transcript: string | null; - audioDurationMs: number | null; - transcriptModel: string | null; - processingStatus: ProcessingStatus; - isArchived: boolean; - isPinned: boolean; - visibility: VisibilityLevel; - language: string | null; - createdAt: string; - updatedAt: string; -} - -export interface Memory { - id: string; - memoId: string; - title: string; - content: string | null; - createdAt: string; - updatedAt: string; -} - -// NOTE: the Tag type used throughout the memoro module comes from -// `@mana/shared-tags`, not from a local definition. A legacy `Tag` -// interface used to live here but was removed because it diverged -// from the shared shape (missing userId, had isPinned/sortOrder that -// nothing reads). Import Tag from '@mana/shared-tags' everywhere. - -export interface Space { - id: string; - name: string; - description: string | null; - ownerId: string; - createdAt: string; - updatedAt: string; -} diff --git a/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte b/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte deleted file mode 100644 index b045738d0..000000000 --- a/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte +++ /dev/null @@ -1,338 +0,0 @@ - - - - - detail.deleteWithUndo({ - label: $_('memoro.detail_view.toast_deleted'), - delete: () => memosStore.delete(memoId), - goBack, - })} -> - {#snippet body(memo)} -
- - -
- - {#if titleSourceLabel} -
{titleSourceLabel}
- {/if} - -
-
- {$_('memoro.detail_view.label_status')} - - {$_(STATUS_KEYS[memo.processingStatus])} - -
- -
- {$_('memoro.detail_view.label_duration')} - {formatDuration(memo.audioDurationMs)} -
- -
- {$_('memoro.detail_view.label_language')} - -
- -
- {$_('memoro.detail_view.label_visibility')} - memosStore.setVisibility(memoId, next)} - disabledLevels={['unlisted']} - /> -
-
- -
- - -
- -
- - {#if memo.processingStatus === 'processing'} -
- - - - {$_('memoro.detail_view.transcribing')} -
- {:else if memo.processingStatus === 'failed'} -
- {$_('memoro.detail_view.transcript_failed')} -
- {:else if memo.transcript} -
{memo.transcript}
-
{$_('memoro.detail_view.transcript_source')}
- {:else} -
{$_('memoro.detail_view.transcript_empty')}
- {/if} -
- -
- {$_('memoro.detail_view.meta_created', { - values: { date: formatDate(new Date(memo.createdAt ?? '')) }, - })} - {#if memo.updatedAt} - {$_('memoro.detail_view.meta_updated', { - values: { date: formatDate(new Date(memo.updatedAt)) }, - })} - {/if} -
- {/snippet} -
- - diff --git a/apps/mana/apps/web/src/lib/modules/website/embeds.ts b/apps/mana/apps/web/src/lib/modules/website/embeds.ts index 2cf17092d..69a9cc2c5 100644 --- a/apps/mana/apps/web/src/lib/modules/website/embeds.ts +++ b/apps/mana/apps/web/src/lib/modules/website/embeds.ts @@ -33,7 +33,6 @@ import type { LocalComicStory } from '$lib/modules/comic/types'; import type { LocalHabit, LocalHabitLog } from '$lib/modules/habits/types'; import type { LocalQuiz } from '$lib/modules/quiz/types'; import type { LocalSocialEvent } from '$lib/modules/events/types'; -import type { LocalMemo } from '$lib/modules/memoro/types'; import type { LocalDeck as LocalPresiDeck } from '$lib/modules/presi/types'; import type { LocalAugurEntry } from '$lib/modules/augur/types'; import type { LocalTimeBlock } from '$lib/data/time-blocks/types'; @@ -83,9 +82,6 @@ export async function resolveEmbed(props: ModuleEmbedProps): Promise { - let memos = await db.table('memos').toArray(); - memos = memos.filter( - (m) => !m.deletedAt && !m.isArchived && canEmbedOnWebsite(m.visibility ?? 'private') - ); - - if (memos.length === 0) return []; - - const decrypted = (await decryptRecords('memos', memos)) as LocalMemo[]; - - // Pinned first, then newest. - decrypted.sort((a, b) => { - const pinA = a.isPinned ? 0 : 1; - const pinB = b.isPinned ? 0 : 1; - if (pinA !== pinB) return pinA - pinB; - return (b.updatedAt ?? '').localeCompare(a.updatedAt ?? ''); - }); - - function durationLabel(ms: number | null): string | null { - if (!ms || ms <= 0) return null; - const seconds = Math.round(ms / 1000); - if (seconds < 60) return `${seconds}s`; - const m = Math.floor(seconds / 60); - const s = seconds % 60; - return s === 0 ? `${m} Min` : `${m}:${String(s).padStart(2, '0')} Min`; - } - - return decrypted.map((m) => { - const intro = (m.intro ?? '').trim().slice(0, 140); - const dur = durationLabel(m.audioDurationMs); - const subtitleParts = [intro || null, dur].filter((x): x is string => Boolean(x)); - return { - title: (m.title ?? '').trim() || 'Memo', - subtitle: subtitleParts.length > 0 ? subtitleParts.join(' · ') : undefined, - }; - }); -} - // resolveCardDecks: dekommissioniert 2026-05-08, Cards lebt eigenständig // auf cardecky.mana.how. Public-Deck-Embeds für Cardecky kommen später // über die Cardecky-API. diff --git a/apps/mana/apps/web/src/lib/splitscreen/registry.ts b/apps/mana/apps/web/src/lib/splitscreen/registry.ts index 38e6579e1..02b17640e 100644 --- a/apps/mana/apps/web/src/lib/splitscreen/registry.ts +++ b/apps/mana/apps/web/src/lib/splitscreen/registry.ts @@ -24,7 +24,6 @@ const SPLIT_APP_ID_LIST = [ 'questions', 'uload', 'calc', - 'memoro', 'places', 'automations', 'playground', diff --git a/apps/mana/apps/web/src/routes/(app)/+layout.svelte b/apps/mana/apps/web/src/routes/(app)/+layout.svelte index 3fff16241..4ec019630 100644 --- a/apps/mana/apps/web/src/routes/(app)/+layout.svelte +++ b/apps/mana/apps/web/src/routes/(app)/+layout.svelte @@ -71,10 +71,6 @@ import { getEffectiveTier } from '$lib/data/scope'; import { useLocalStt } from '$lib/components/voice/use-local-stt.svelte'; import { Microphone, Stop } from '@mana/shared-icons'; - import { - startMemoroLlmWatcher, - stopMemoroLlmWatcher, - } from '$lib/modules/memoro/llm-watcher.svelte'; import { createUnifiedSync, restoreClientIdFromDexie } from '$lib/data/sync'; import { cleanupOrphanMigrationFlags } from '$lib/data/migrations-cleanup'; import { bootstrapSingletons } from '$lib/data/bootstrap-singletons'; @@ -587,7 +583,6 @@ startFeedbackToaster(); initByok(); startLlmQueue(); - startMemoroLlmWatcher(); // dashboardStore only drives /dashboard — safe to defer; other // routes don't read from it on first paint. void dashboardStore.initialize(); @@ -761,7 +756,6 @@ // will finish in the background and the next page session will // pick up where we left off. void stopLlmQueue(); - stopMemoroLlmWatcher(); }); // ── Search / Spotlight ─────────────────────────────────── diff --git a/apps/mana/apps/web/src/routes/(app)/memoro/+layout.svelte b/apps/mana/apps/web/src/routes/(app)/memoro/+layout.svelte deleted file mode 100644 index a72551e3b..000000000 --- a/apps/mana/apps/web/src/routes/(app)/memoro/+layout.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - -{@render children()} diff --git a/apps/mana/apps/web/src/routes/(app)/memoro/+page.svelte b/apps/mana/apps/web/src/routes/(app)/memoro/+page.svelte deleted file mode 100644 index c406ecfcf..000000000 --- a/apps/mana/apps/web/src/routes/(app)/memoro/+page.svelte +++ /dev/null @@ -1,286 +0,0 @@ - - - - Memoro - Mana - - - -
- -
-
-

Memoro

-

- {memosCtx.value.length} Memos -

-
-
- - - Tags - -
- -
- -
-
- - -
- - -
- - - {#if tagsCtx.value.length > 0} -
- - {#each tagsCtx.value as tag (tag.id)} - - {/each} -
- {/if} - - - {#if memosCtx.value.length === 0} -
-
- -
-

- Erstelle dein erstes Memo -

-

- Nimm Gedanken auf oder schreibe sie direkt auf. -

- -
- {:else} -
- {#each filtered() as memo (memo.id)} -
handleMemoClick(memo.id)} - onkeydown={(e) => e.key === 'Enter' && handleMemoClick(memo.id)} - class="group rounded-xl border border-[hsl(var(--color-border))] bg-[hsl(var(--color-card))] p-4 transition-colors hover:border-[hsl(var(--color-primary)/0.3)]" - > -
-
-
- {#if memo.isPinned} - - {/if} -

- {memo.title || 'Unbenanntes Memo'} -

-
- {#if memo.intro} -

- {memo.intro} -

- {:else if memo.transcript} -

- {memo.transcript} -

- {/if} -
-
- - -
-
- - -
- - {formatDate(memo.createdAt)} - - {#if memo.audioDurationMs} - - {formatDuration(memo.audioDurationMs)} - - {/if} - {#if memo.processingStatus !== 'completed'} - - {getStatusLabel(memo.processingStatus)} - - {/if} - - {#each getMemoTags(memo.id) as tag (tag.id)} - - {tag.name} - - {/each} -
-
- {/each} -
- {/if} - - - -
-
diff --git a/apps/mana/apps/web/src/routes/(app)/memoro/[id]/+page.svelte b/apps/mana/apps/web/src/routes/(app)/memoro/[id]/+page.svelte deleted file mode 100644 index e7a1e1a7e..000000000 --- a/apps/mana/apps/web/src/routes/(app)/memoro/[id]/+page.svelte +++ /dev/null @@ -1,302 +0,0 @@ - - - - {memo?.title || 'Memo'} - Memoro - Mana - - - - {#if !memo} -
-

Memo nicht gefunden

- - Zuruck zu Memoro - -
- {:else} -
- -
-
- - - -
- {#if isEditingTitle} -
- e.key === 'Enter' && saveTitle()} - class="flex-1 rounded border border-[hsl(var(--color-border))] bg-transparent px-2 py-1 text-xl font-bold focus:outline-none focus:ring-1 focus:ring-[hsl(var(--color-primary))]" - /> - - -
- {:else} - - {/if} -

- {formatDate(new Date(memo.createdAt), { - day: '2-digit', - month: 'long', - year: 'numeric', - hour: '2-digit', - minute: '2-digit', - })} - {#if memo.audioDurationMs} - · {formatDuration(memo.audioDurationMs)} - {/if} -

-
-
- -
- - - -
-
- - - {#if memo.processingStatus !== 'completed'} -
- Status: {getStatusLabel(memo.processingStatus)} -
- {/if} - - -
- {#each memoTags as tag (tag.id)} - - {tag.name} - - - {/each} -
- - {#if showTagPicker && availableTags.length > 0} -
- {#each availableTags as tag (tag.id)} - - {/each} -
- {/if} -
-
- - - {#if memo.intro} -
-

- Zusammenfassung -

-

{memo.intro}

-
- {/if} - - - {#if memo.transcript} -
-

- Transkript -

-

- {memo.transcript} -

-
- {/if} - - -
-

- Erinnerungen ({memories.length}) -

- {#if memories.length === 0} -

- Noch keine Erinnerungen fur dieses Memo. -

- {:else} -
- {#each memories as memory (memory.id)} -
-

{memory.title}

- {#if memory.content} -

- {memory.content} -

- {/if} -
- {/each} -
- {/if} -
-
- {/if} -
diff --git a/apps/mana/apps/web/src/routes/(app)/memoro/archive/+page.svelte b/apps/mana/apps/web/src/routes/(app)/memoro/archive/+page.svelte deleted file mode 100644 index f3244b058..000000000 --- a/apps/mana/apps/web/src/routes/(app)/memoro/archive/+page.svelte +++ /dev/null @@ -1,111 +0,0 @@ - - - - Archiv - Memoro - Mana - - - -
- -
- - - -
-

Archiv

-

- {archivedCtx.value.length} archivierte Memos -

-
-
- - {#if archivedCtx.value.length === 0} -
- -

Keine archivierten Memos

-
- {:else} -
- {#each archivedCtx.value as memo (memo.id)} -
handleClick(memo.id)} - onkeydown={(e) => e.key === 'Enter' && handleClick(memo.id)} - class="group rounded-xl border border-[hsl(var(--color-border))] bg-[hsl(var(--color-card))] p-4 transition-colors hover:border-[hsl(var(--color-primary)/0.3)]" - > -
-
-

- {memo.title || 'Unbenanntes Memo'} -

- {#if memo.intro} -

- {memo.intro} -

- {/if} -

- {formatDate(memo.updatedAt)} -

-
-
- - -
-
-
- {/each} -
- {/if} -
-
diff --git a/apps/mana/apps/web/src/routes/(app)/memoro/tags/+page.svelte b/apps/mana/apps/web/src/routes/(app)/memoro/tags/+page.svelte deleted file mode 100644 index c68622776..000000000 --- a/apps/mana/apps/web/src/routes/(app)/memoro/tags/+page.svelte +++ /dev/null @@ -1,217 +0,0 @@ - - - - Tags - Memoro - Mana - - - -
- -
-
- - - -
-

Tags

-

- {tagsCtx.value.length} Tags -

-
-
- -
- - {#if tagsCtx.value.length === 0} -
- -

Keine Tags

-

- Erstelle Tags, um deine Memos zu organisieren. -

- -
- {:else} -
- {#each tagsCtx.value as tag (tag.id)} -
- - {tag.name} -
- - -
-
- {/each} -
- {/if} -
- - - {#if showCreateForm} -
-
-
-

- {editingId ? 'Tag bearbeiten' : 'Neuer Tag'} -

- -
-
{ - e.preventDefault(); - handleSubmit(); - }} - class="space-y-4" - > -
- - -
-
- Farbe -
- {#each COLORS as color} - - {/each} -
-
-
- - -
-
-
-
- {/if} -
diff --git a/apps/memoro/.gitignore b/apps/memoro/.gitignore deleted file mode 100644 index aec2b5650..000000000 --- a/apps/memoro/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.env.deploy diff --git a/apps/memoro/CLAUDE.md b/apps/memoro/CLAUDE.md deleted file mode 100644 index 96ce76c66..000000000 --- a/apps/memoro/CLAUDE.md +++ /dev/null @@ -1,63 +0,0 @@ -# Memoro - -AI-powered voice recording + memo management. Memoro is a **hybrid**: its -frontend was consolidated into the unified Mana web app, but its backend -was kept as standalone services (Hono + Supabase) because of the -audio-processing pipeline and the legacy Supabase Storage bucket layout. - -## Where things live - -| Surface | Path | Notes | -|---------|------|-------| -| **Web frontend** (local-first, in unified Mana app) | [`apps/mana/apps/web/src/lib/modules/memoro/`](../mana/apps/web/src/lib/modules/memoro/) | Same module pattern as every other module — Dexie collections, Svelte 5 stores, runes UI. Reachable via `/memoro` route in mana.how. | -| **Native mobile app** | [`apps/memoro/apps/mobile/`](apps/mobile/) | React Native + Expo SDK 55. Talks directly to `memoro-server` (NOT to mana.how). Build via EAS, see `apps/mobile/eas.json`. | -| **Backend compute** | [`apps/memoro/apps/server/`](apps/server/) (`@memoro/server`) | Hono + Bun. Handles memo CRUD, transcription callbacks, spaces, invites, credits, settings, cleanup, meetings. **Still uses Supabase** for some legacy state. Deployed as `memoro-server` container. | -| **Audio processing** | [`apps/memoro/apps/audio-server/`](apps/audio-server/) | Separate Hono+Bun service for audio uploads + transcoding. Deployed as `memoro-audio-server` container. | -| **Landing page** | [`apps/memoro/apps/landing/`](apps/landing/) | Astro static landing → Cloudflare Pages | - -## Why memoro is not (yet) in `apps/api` - -Most consolidated products migrated their compute routes into -`apps/api/src/modules/{name}/`. Memoro stayed standalone because: - -1. **Audio pipeline.** The audio-server runs background transcoding/ - upload jobs that don't fit the request-response shape of `apps/api`. -2. **Legacy Supabase coupling.** Memo and storage records still live - in Supabase tables (`storage.objects`, RLS policies on `memos`). - Migrating to mana_platform was descoped in the consolidation sprint. -3. **Three deploy targets.** `memoro-server`, `memoro-audio-server`, - and the mobile app all need to coordinate. Easier to evolve as one - unit while migration is in flight. - -A future cleanup item is to either fold the routes into `apps/api` -(once Supabase is gone) or document this exception explicitly in the -root architecture overview. - -## Production deployment - -Both backends are part of `docker-compose.macmini.yml`: - -``` -memoro-server (apps/memoro/apps/server) — main backend -memoro-audio-server (apps/memoro/apps/audio-server) — audio worker -``` - -The mobile app builds via EAS — not part of the monorepo CI. - -## Known issues / cleanup items - -- **`@mana/notify-client` is imported by `apps/memoro/apps/server/src/lib/notify.ts:6` but NOT declared as a dependency** in `apps/memoro/apps/server/package.json`. Currently works via hoisted node_modules but should either be added as a workspace dep or replaced with a direct call to `mana-notify`. Tracked in `docs/REFACTORING_AUDIT_2026_04.md` items #29. -- **`apps/memoro/apps/server` still pulls `@supabase/supabase-js`** — not a bug, but flagged as a dependency to remove once Supabase migration completes. -- **No `apps/memoro/apps/web`** — was removed during the consolidation. The old SvelteKit "companion web app" lives now under `apps/mana/apps/web/src/lib/modules/memoro/`. - -## For monorepo-wide patterns - -See [root `CLAUDE.md`](../../CLAUDE.md) for the overall architecture and -[`apps/mana/CLAUDE.md`](../mana/CLAUDE.md) for the unified web app's -module pattern (which the memoro frontend follows). - -The previous 459-line "Memoro repository overview" describing memoro as -a standalone monorepo with `mana-middleware` and a bespoke auth bridge -was deleted in the audit cleanup of 2026-04-09. It pre-dated the -integration into the Mana monorepo and described an architecture that -no longer exists. Pre-consolidation reference is in git history. diff --git a/apps/memoro/README.md b/apps/memoro/README.md deleted file mode 100644 index 2f8158c44..000000000 --- a/apps/memoro/README.md +++ /dev/null @@ -1,373 +0,0 @@ -# Memoro - -**AI-powered voice recording and memo management platform** that transforms audio recordings into structured, searchable content using artificial intelligence. - -![Platform](https://img.shields.io/badge/platform-iOS%20%7C%20Android%20%7C%20Web-blue) -![React Native](https://img.shields.io/badge/React%20Native-0.81.4-61dafb) -![Expo](https://img.shields.io/badge/Expo-54.0.0-000020) -![SvelteKit](https://img.shields.io/badge/SvelteKit-2.x-ff3e00) -![TypeScript](https://img.shields.io/badge/TypeScript-5.x-3178c6) - -## 📱 What is Memoro? - -Memoro is a cross-platform application that combines voice recording, AI processing, and collaborative features to help individuals and teams capture, organize, and analyze spoken content. Record meetings, interviews, lectures, or personal notes, and let AI transform them into structured, actionable insights. - -### Key Features - -✨ **High-Quality Audio Recording** - Background recording with pause/resume support -🤖 **AI-Powered Analysis** - Transform recordings using customizable Blueprints and Prompts -👥 **Collaborative Spaces** - Share and organize memos within team workspaces -🌍 **32 Languages** - Full internationalization with automatic language detection -🎨 **4 Theme Variants** - Light/dark mode with Nature, Ocean, Stone, and Lume themes -💰 **Credit System** - Transparent Mana-based pricing for AI operations -🔒 **Enterprise Security** - Row-level security with JWT authentication -📊 **Rich Analytics** - Track usage, productivity, and team insights - -## 🏗 Monorepo Structure - -``` -memoro_app/ -├── apps/ -│ ├── mobile/ # React Native + Expo app (iOS & Android native) -│ └── web/ # SvelteKit web application -├── CLAUDE.md # Development guidance for Claude Code -└── README.md # This file -``` - -Both applications share the same Supabase backend for seamless data synchronization. - -## 🚀 Quick Start - -### Prerequisites - -- **Node.js** 18 or higher -- **npm** or **pnpm** -- **Expo CLI** (for mobile development) -- **iOS Simulator** (macOS only) or **Android Emulator** -- **Supabase Account** (for backend services) - -### Installation - -```bash -# Clone the repository -git clone -cd memoro_app - -# Install mobile app dependencies -cd apps/mobile -npm install - -# Install web app dependencies -cd ../web -npm install -``` - -### Environment Setup - -Both apps require environment variables. Copy the example files and fill in your credentials: - -```bash -# Mobile app -cd apps/mobile -cp .env.dev.example .env.dev -cp .env.prod.example .env.prod -# Edit .env.dev and .env.prod with your Supabase and API credentials - -# Web app -cd apps/web -cp .env.example .env -# Edit .env with your Supabase credentials -``` - -**Required Environment Variables:** -- `EXPO_PUBLIC_SUPABASE_URL` - Your Supabase project URL -- `EXPO_PUBLIC_SUPABASE_ANON_KEY` - Your Supabase anonymous key -- `EXPO_PUBLIC_MIDDLEWARE_API_URL` - Middleware authentication service URL -- `EXPO_PUBLIC_APPID` - Application ID for middleware - -### Running the Apps - -**Mobile App (iOS & Android):** -```bash -cd apps/mobile - -# Start development server -npm start - -# Run on iOS -npm run ios - -# Run on Android -npm run android - -# Run with specific environment -npm run start:dev # Development environment -npm run start:prod # Production environment -``` - -**Web App:** -```bash -cd apps/web - -# Start development server -npm run dev - -# Build for production -npm run build -npm run preview -``` - -## 📖 Documentation - -### Comprehensive Guides - -- **[CLAUDE.md](./CLAUDE.md)** - Complete architectural overview and development guidelines -- **[Mobile App README](./apps/mobile/README.md)** - Detailed mobile app documentation -- **[Web App README](./apps/web/README.md)** - SvelteKit web app guide - -### Feature Documentation - -- **[Authentication System](./apps/mobile/features/auth/README.md)** - Middleware-based auth with JWT -- **[Audio Recording](./apps/mobile/features/audioRecordingV2/README.md)** - AudioRecordingV2 implementation -- **[Blueprints & Prompts](./apps/mobile/docs/blueprints_and_prompts.md)** - AI processing system -- **[Spaces](./apps/mobile/docs/SPACES.md)** - Collaborative workspaces -- **[SvelteKit Migration](./SVELTEKIT_MIGRATION_ANALYSIS.md)** - Web app migration analysis - -## 🛠 Technology Stack - -### Mobile App (`apps/mobile/`) - -| Category | Technologies | -|----------|-------------| -| **Framework** | React Native 0.81.4, Expo SDK 54 | -| **Language** | TypeScript 5.x | -| **Navigation** | Expo Router (file-based) | -| **Styling** | NativeWind (Tailwind CSS) | -| **State** | Zustand, React Context | -| **Backend** | Supabase (PostgreSQL, Storage, Realtime) | -| **Audio** | expo-audio, Azure Speech Services | -| **Payments** | RevenueCat (iOS, Android) | -| **Analytics** | PostHog, Sentry | -| **i18n** | react-i18next (32 languages) | - -### Web App (`apps/web/`) - -| Category | Technologies | -|----------|-------------| -| **Framework** | SvelteKit 2.x | -| **Language** | TypeScript 5.x | -| **Styling** | TailwindCSS 3.x | -| **State** | Svelte Stores | -| **Backend** | Supabase (shared with mobile) | -| **i18n** | svelte-i18n | - -## 🏛 Architecture Highlights - -### Feature-Based Structure -The mobile app uses a feature-based architecture with **33 self-contained modules** (auth, audioRecordingV2, memos, spaces, credits, subscription, i18n, theme, etc.), each with its own services, hooks, components, and stores. - -### Atomic Design System -Components are organized using atomic design principles: -- **Atoms**: Button, Input, Text, Icon (16 components) -- **Molecules**: MemoPreview, RecordingBar, TagSelector (21 components) -- **Organisms**: AudioRecorder, Memory, TranscriptDisplay (9 components) -- **Statistics**: Analytics components (14 components) - -### Middleware Authentication -Uses a custom middleware service as a bridge between the app and Supabase: -``` -Mobile/Web App → Middleware Auth → Supabase (with JWT + RLS) -``` -- Three token types: `manaToken`, `appToken`, `refreshToken` -- Platform-specific secure storage -- Automatic token refresh -- Supports email/password, Google, and Apple Sign-In - -### AI Processing Pipeline -- **Blueprints**: Reusable analysis patterns (Text Analysis, Creative Writing, Meeting Notes) -- **Prompts**: Specific AI tasks (Summary, To-Do, Translation, Q&A) -- **Categories**: 8 organizational categories (Office, Healthcare, University, etc.) -- Multi-language support with localized advice - -## 🎯 Key Features Deep Dive - -### Audio Recording System (V2) -- High-quality M4A/AAC recording -- Background recording with foreground service (Android) -- Pause/resume support -- Real-time audio metering -- Platform-specific optimizations (iOS/Android) -- Crash recovery with automatic segmentation -- Zero-byte recording prevention - -### Collaborative Spaces -- Create unlimited team workspaces -- Role-based permissions (owner, member) -- Email-based invitation system -- Shared credit pools -- Real-time collaboration via Supabase Realtime - -### Theme System -4 complete theme variants with light/dark modes: -- **Lume**: Modern gold & dark -- **Nature**: Soothing green -- **Stone**: Elegant slate -- **Ocean**: Tranquil blue - -Each theme includes 13 semantic color tokens for consistent UI. - -### Internationalization -**32 supported languages** with: -- Automatic device language detection -- Persistent user preferences -- RTL support (Arabic, Hebrew) -- Complete UI translations - -Languages: Arabic, Bengali, Bulgarian, Chinese, Czech, Danish, Dutch, English, Estonian, Finnish, French, Gaelic, German, Greek, Hindi, Croatian, Hungarian, Indonesian, Italian, Japanese, Korean, Lithuanian, Latvian, Maltese, Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovenian, Spanish, Swedish, Turkish, Ukrainian, Urdu, Vietnamese. - -## 💻 Development - -### Code Quality Tools - -```bash -# Mobile app linting -cd apps/mobile -npm run lint # Check code quality -npm run lint:fix # Auto-fix issues -npm run lint:unused # Find unused imports/vars -npm run format # Format with Prettier + ESLint - -# Web app checking -cd apps/web -npm run check # Type check -npm run check:watch # Watch mode -``` - -### Building for Production - -**Mobile App (EAS Build):** -```bash -cd apps/mobile - -# Development build (with dev client) -eas build --profile development - -# Preview build (internal testing) -eas build --profile preview - -# Production build (store submission) -eas build --profile production -``` - -**Web App:** -```bash -cd apps/web - -# Build static site -npm run build - -# Preview production build -npm run preview -``` - -## 📊 Project Statistics - -- **~10,890** TypeScript/JavaScript files in mobile app -- **33** feature modules -- **60+** reusable components -- **32** language translations -- **4** theme variants (8 including dark modes) -- **2** platforms (mobile + web) -- **1** shared Supabase backend - -## 🔒 Security - -- **Row Level Security (RLS)** on all Supabase tables -- **JWT-based authentication** with middleware -- **Secure token storage** (platform-specific) -- **Automatic token rotation** -- **Environment variable protection** -- **Sensitive file exclusion** (.gitignore) - -## 🤝 Contributing - -1. Read the [CLAUDE.md](./CLAUDE.md) for architectural guidance -2. Follow the atomic design system for components -3. Use feature-based organization for new features -4. Test on both iOS and Android before committing -5. Run linting and formatting before pushing -6. Update documentation for significant changes - -## 📝 Common Development Tasks - -### Adding a New Feature -```bash -# 1. Create feature directory in mobile app -mkdir -p apps/mobile/features/my-feature/{components,hooks,services,store,types} - -# 2. Create index.ts for public API -touch apps/mobile/features/my-feature/index.ts - -# 3. Add feature-specific README if complex -touch apps/mobile/features/my-feature/README.md - -# 4. Update CLAUDE.md if architecturally significant -``` - -### Adding a New Route (Mobile) -```bash -# File-based routing with Expo Router -# Protected route: -touch apps/mobile/app/\(protected\)/my-route.tsx - -# Public route: -touch apps/mobile/app/\(public\)/my-route.tsx -``` - -### Platform-Specific Code (Mobile App Only) -```bash -# Create platform variants for iOS/Android differences -touch apps/mobile/features/my-feature/myService.ts # Default/shared -touch apps/mobile/features/my-feature/myService.ios.ts # iOS-specific -touch apps/mobile/features/my-feature/myService.android.ts # Android-specific - -# Metro bundler automatically resolves the correct file based on platform -# Note: .web.ts variants are no longer used - use apps/web/ for web features -``` - -### Adding a New Route (Web App) -```bash -# SvelteKit file-based routing -# Protected route: -mkdir -p apps/web/src/routes/\(protected\)/my-route -touch apps/web/src/routes/\(protected\)/my-route/+page.svelte - -# Public route: -mkdir -p apps/web/src/routes/my-route -touch apps/web/src/routes/my-route/+page.svelte -``` - -## 🐛 Known Issues - -1. **Android 16+**: Must be in foreground to start recording (platform restriction) -2. **Zero-byte recordings**: Occasional issue on some Android devices (retry mechanism implemented) -3. **Token refresh**: Email may not be in refreshed JWT (stored separately as workaround) - -## 📄 License - -Proprietary - All rights reserved - ---- - -## 🔗 Quick Links - -- **Documentation**: [CLAUDE.md](./CLAUDE.md) -- **Mobile App**: [apps/mobile/README.md](./apps/mobile/README.md) -- **Web App**: [apps/web/README.md](./apps/web/README.md) -- **Architecture**: See CLAUDE.md for detailed architecture -- **Issue Tracking**: (Add your issue tracker link) -- **Support**: (Add your support contact) - ---- - -**Built with ❤️ using React Native, Expo, SvelteKit, and Supabase** diff --git a/apps/memoro/apps/audio-server/Dockerfile b/apps/memoro/apps/audio-server/Dockerfile deleted file mode 100644 index a4ca04def..000000000 --- a/apps/memoro/apps/audio-server/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM oven/bun:1 AS production - -# Install ffmpeg -RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg && rm -rf /var/lib/apt/lists/* - -WORKDIR /app - -COPY package.json bun.lock* ./ -RUN bun install --frozen-lockfile 2>/dev/null || bun install - -COPY src ./src -COPY tsconfig.json ./ - -EXPOSE 3016 - -HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ - CMD bun -e "fetch('http://localhost:3016/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" - -CMD ["bun", "run", "src/index.ts"] diff --git a/apps/memoro/apps/audio-server/package.json b/apps/memoro/apps/audio-server/package.json deleted file mode 100644 index 31120c6ac..000000000 --- a/apps/memoro/apps/audio-server/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@memoro/audio-server", - "version": "1.0.0", - "private": true, - "scripts": { - "dev": "bun run --hot src/index.ts", - "start": "bun run src/index.ts", - "build": "bun build src/index.ts --outdir dist --target bun" - }, - "dependencies": { - "@azure/storage-blob": "^12.17.0", - "@supabase/supabase-js": "^2.49.5", - "fluent-ffmpeg": "^2.1.2", - "hono": "^4.7.0" - }, - "devDependencies": { - "@types/fluent-ffmpeg": "^2.1.21", - "@types/node": "^20.0.0", - "typescript": "^5.5.0" - } -} diff --git a/apps/memoro/apps/audio-server/src/index.ts b/apps/memoro/apps/audio-server/src/index.ts deleted file mode 100644 index 0abf4a4e8..000000000 --- a/apps/memoro/apps/audio-server/src/index.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Hono } from 'hono'; -import type { MiddlewareHandler } from 'hono'; -import { createTranscribeRoutes } from './routes/transcribe.ts'; - -const app = new Hono(); - -// ─── Service key middleware ─────────────────────────────────────────────────── - -function serviceKeyMiddleware(): MiddlewareHandler { - return async (c, next) => { - const expectedKey = process.env.SERVICE_KEY; - - if (!expectedKey) { - console.error('[Auth] SERVICE_KEY env var is not configured'); - return c.json({ error: 'Server misconfiguration' }, 500); - } - - const providedKey = c.req.header('X-Service-Key'); - - if (!providedKey || providedKey !== expectedKey) { - console.warn( - `[Auth] Unauthorized request to ${c.req.path} — invalid or missing X-Service-Key` - ); - return c.json({ error: 'Unauthorized' }, 401); - } - - await next(); - }; -} - -// ─── Health check (no auth) ─────────────────────────────────────────────────── - -app.get('/health', (c) => { - return c.json({ - status: 'ok', - service: 'memoro-audio-server', - version: '1.0.0', - timestamp: new Date().toISOString(), - }); -}); - -// ─── Protected routes ───────────────────────────────────────────────────────── - -app.use('/api/*', serviceKeyMiddleware()); - -const transcribeRoutes = createTranscribeRoutes(); -app.route('/api/v1/transcribe', transcribeRoutes); - -// ─── 404 handler ───────────────────────────────────────────────────────────── - -app.notFound((c) => { - return c.json({ error: `Not found: ${c.req.method} ${c.req.path}` }, 404); -}); - -// ─── Error handler ──────────────────────────────────────────────────────────── - -app.onError((err, c) => { - console.error(`[Error] Unhandled error on ${c.req.method} ${c.req.path}:`, err); - return c.json({ error: 'Internal server error' }, 500); -}); - -// ─── Start ──────────────────────────────────────────────────────────────────── - -const port = parseInt(process.env.PORT ?? '3016', 10); - -console.log(`[Server] Memoro Audio Server starting on port ${port}`); - -export { app }; -export default { - port, - fetch: app.fetch, -}; diff --git a/apps/memoro/apps/audio-server/src/lib/azure.test.ts b/apps/memoro/apps/audio-server/src/lib/azure.test.ts deleted file mode 100644 index a697ec2fb..000000000 --- a/apps/memoro/apps/audio-server/src/lib/azure.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Tests for Azure Speech config utilities. - */ - -import { describe, it, expect, beforeEach, afterEach } from 'vitest'; -import { getAvailableSpeechServices, pickRandomService, BATCH_ENDPOINT_BASE } from './azure'; -import type { SpeechServiceConfig } from './azure'; - -describe('BATCH_ENDPOINT_BASE', () => { - it('points to swedencentral', () => { - expect(BATCH_ENDPOINT_BASE).toBe( - 'https://swedencentral.api.cognitive.microsoft.com/speechtotext' - ); - }); -}); - -describe('getAvailableSpeechServices', () => { - const originalEnv = process.env; - - beforeEach(() => { - process.env = { ...originalEnv }; - // Clear all Azure keys - delete process.env.AZURE_SPEECH_KEY; - delete process.env.AZURE_SPEECH_KEY_1; - delete process.env.AZURE_SPEECH_KEY_2; - delete process.env.AZURE_SPEECH_KEY_3; - delete process.env.AZURE_SPEECH_KEY_4; - delete process.env.AZURE_SPEECH_REGION; - }); - - afterEach(() => { - process.env = originalEnv; - }); - - it('throws if no keys configured', () => { - expect(() => getAvailableSpeechServices()).toThrow('No Azure Speech credentials configured'); - }); - - it('uses single AZURE_SPEECH_KEY as fallback', () => { - process.env.AZURE_SPEECH_KEY = 'single-key'; - - const services = getAvailableSpeechServices(); - expect(services).toHaveLength(1); - expect(services[0].key).toBe('single-key'); - expect(services[0].name).toBe('azure-speech-default'); - }); - - it('uses numbered keys when available', () => { - process.env.AZURE_SPEECH_KEY_1 = 'key-1'; - process.env.AZURE_SPEECH_KEY_2 = 'key-2'; - - const services = getAvailableSpeechServices(); - expect(services).toHaveLength(2); - expect(services[0].name).toBe('azure-speech-1'); - expect(services[1].name).toBe('azure-speech-2'); - }); - - it('prefers numbered keys over single key', () => { - process.env.AZURE_SPEECH_KEY = 'fallback-key'; - process.env.AZURE_SPEECH_KEY_1 = 'key-1'; - - const services = getAvailableSpeechServices(); - expect(services).toHaveLength(1); - expect(services[0].key).toBe('key-1'); - }); - - it('uses custom region', () => { - process.env.AZURE_SPEECH_KEY = 'key'; - process.env.AZURE_SPEECH_REGION = 'westeurope'; - - const services = getAvailableSpeechServices(); - expect(services[0].region).toBe('westeurope'); - expect(services[0].endpoint).toContain('westeurope'); - }); - - it('defaults to swedencentral region', () => { - process.env.AZURE_SPEECH_KEY = 'key'; - - const services = getAvailableSpeechServices(); - expect(services[0].region).toBe('swedencentral'); - }); -}); - -describe('pickRandomService', () => { - it('throws for empty array', () => { - expect(() => pickRandomService([])).toThrow('No speech services available'); - }); - - it('returns the only service for single-element array', () => { - const service: SpeechServiceConfig = { - key: 'key-1', - endpoint: 'https://example.com', - region: 'swedencentral', - name: 'azure-speech-1', - }; - - expect(pickRandomService([service])).toBe(service); - }); - - it('returns a service from the array', () => { - const services: SpeechServiceConfig[] = [ - { key: 'key-1', endpoint: 'https://example.com', region: 'swedencentral', name: 'svc-1' }, - { key: 'key-2', endpoint: 'https://example.com', region: 'swedencentral', name: 'svc-2' }, - ]; - - const result = pickRandomService(services); - expect(services).toContainEqual(result); - }); -}); diff --git a/apps/memoro/apps/audio-server/src/lib/azure.ts b/apps/memoro/apps/audio-server/src/lib/azure.ts deleted file mode 100644 index 38b17b2d9..000000000 --- a/apps/memoro/apps/audio-server/src/lib/azure.ts +++ /dev/null @@ -1,60 +0,0 @@ -export interface SpeechServiceConfig { - key: string; - endpoint: string; - region: string; - name: string; -} - -export const BATCH_ENDPOINT_BASE = 'https://swedencentral.api.cognitive.microsoft.com/speechtotext'; - -export function getAvailableSpeechServices(): SpeechServiceConfig[] { - const region = process.env.AZURE_SPEECH_REGION || 'swedencentral'; - const endpoint = `https://${region}.api.cognitive.microsoft.com/speechtotext/transcriptions:transcribe`; - const batchBase = `https://${region}.api.cognitive.microsoft.com/speechtotext`; - - const services: SpeechServiceConfig[] = []; - - // Try numbered keys first (AZURE_SPEECH_KEY_1 through AZURE_SPEECH_KEY_4) - for (let i = 1; i <= 4; i++) { - const key = process.env[`AZURE_SPEECH_KEY_${i}`]; - if (key) { - services.push({ - key, - endpoint, - region, - name: `azure-speech-${i}`, - }); - } - } - - // Fall back to single key if no numbered keys found - if (services.length === 0) { - const key = process.env.AZURE_SPEECH_KEY; - if (key) { - services.push({ - key, - endpoint, - region, - name: 'azure-speech-default', - }); - } - } - - if (services.length === 0) { - throw new Error('No Azure Speech credentials configured. Set AZURE_SPEECH_KEY_1..4 or AZURE_SPEECH_KEY.'); - } - - console.log(`[Azure] Available speech services: ${services.map((s) => s.name).join(', ')}`); - - return services; -} - -export function pickRandomService(services: SpeechServiceConfig[]): SpeechServiceConfig { - if (services.length === 0) { - throw new Error('No speech services available'); - } - const index = Math.floor(Math.random() * services.length); - const service = services[index]; - console.log(`[Azure] Selected service: ${service.name} (${index + 1}/${services.length})`); - return service; -} diff --git a/apps/memoro/apps/audio-server/src/lib/supabase.ts b/apps/memoro/apps/audio-server/src/lib/supabase.ts deleted file mode 100644 index 07287e0da..000000000 --- a/apps/memoro/apps/audio-server/src/lib/supabase.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { createClient } from '@supabase/supabase-js'; - -function getSupabaseClient() { - const supabaseUrl = process.env.MEMORO_SUPABASE_URL; - const supabaseServiceKey = process.env.MEMORO_SUPABASE_SERVICE_KEY; - - if (!supabaseUrl || !supabaseServiceKey) { - throw new Error('Missing required env vars: MEMORO_SUPABASE_URL, MEMORO_SUPABASE_SERVICE_KEY'); - } - - return createClient(supabaseUrl, supabaseServiceKey, { - auth: { - autoRefreshToken: false, - persistSession: false, - }, - }); -} - -export async function downloadAudioFromStorage(audioPath: string): Promise { - const supabase = getSupabaseClient(); - - console.log(`[Supabase] Downloading audio from storage: ${audioPath}`); - - const { data, error } = await supabase.storage.from('user-uploads').download(audioPath); - - if (error) { - console.error(`[Supabase] Failed to download audio: ${error.message}`); - throw new Error(`Failed to download audio from storage: ${error.message}`); - } - - if (!data) { - throw new Error(`No data returned for audio path: ${audioPath}`); - } - - const arrayBuffer = await data.arrayBuffer(); - const buffer = Buffer.from(arrayBuffer); - - console.log(`[Supabase] Downloaded audio: ${buffer.length} bytes`); - - return buffer; -} diff --git a/apps/memoro/apps/audio-server/src/routes/transcribe.test.ts b/apps/memoro/apps/audio-server/src/routes/transcribe.test.ts deleted file mode 100644 index fabb1eabc..000000000 --- a/apps/memoro/apps/audio-server/src/routes/transcribe.test.ts +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Tests for audio-server transcription routes and health check. - */ - -import { describe, it, expect, vi } from 'vitest'; -import { app } from '../index'; - -// ── Mocks ──────────────────────────────────────────────────────────────────── - -vi.mock('../lib/supabase.ts', () => ({ - downloadAudioFromStorage: vi.fn().mockResolvedValue(Buffer.from('fake-audio')), -})); - -vi.mock('../services/transcription.ts', () => { - class MockTranscriptionService { - transcribeWithFallback = vi.fn().mockResolvedValue({ transcript: 'Hello world' }); - } - return { TranscriptionService: MockTranscriptionService }; -}); - -const SERVICE_KEY = 'test-service-key'; - -function post(path: string, body: unknown, headers?: Record) { - return app.request(path, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...headers, - }, - body: JSON.stringify(body), - }); -} - -// ── Health ─────────────────────────────────────────────────────────────────── - -describe('GET /health', () => { - it('returns 200 with service info', async () => { - const res = await app.request('/health'); - expect(res.status).toBe(200); - - const data = await res.json(); - expect(data.status).toBe('ok'); - expect(data.service).toBe('memoro-audio-server'); - expect(data.version).toBe('1.0.0'); - expect(data.timestamp).toBeDefined(); - }); -}); - -// ── Auth ───────────────────────────────────────────────────────────────────── - -describe('Service key authentication', () => { - it('rejects requests without X-Service-Key', async () => { - const res = await post('/api/v1/transcribe', { - audioPath: 'test.m4a', - memoId: 'memo-1', - userId: 'user-1', - }); - expect(res.status).toBe(401); - - const data = await res.json(); - expect(data.error).toBe('Unauthorized'); - }); - - it('rejects requests with wrong service key', async () => { - const res = await post( - '/api/v1/transcribe', - { audioPath: 'test.m4a', memoId: 'memo-1', userId: 'user-1' }, - { 'X-Service-Key': 'wrong-key' } - ); - expect(res.status).toBe(401); - }); - - it('accepts requests with valid service key', async () => { - const res = await post( - '/api/v1/transcribe', - { audioPath: 'test.m4a', memoId: 'memo-1', userId: 'user-1' }, - { 'X-Service-Key': SERVICE_KEY } - ); - expect(res.status).toBe(200); - }); -}); - -// ── POST /api/v1/transcribe ────────────────────────────────────────────────── - -describe('POST /api/v1/transcribe', () => { - it('starts transcription with valid input', async () => { - const res = await post( - '/api/v1/transcribe', - { audioPath: 'user/recording.m4a', memoId: 'memo-1', userId: 'user-1' }, - { 'X-Service-Key': SERVICE_KEY } - ); - expect(res.status).toBe(200); - - const data = await res.json(); - expect(data.success).toBe(true); - expect(data.memoId).toBe('memo-1'); - expect(data.message).toBe('Transcription started'); - }); - - it('accepts optional fields', async () => { - const res = await post( - '/api/v1/transcribe', - { - audioPath: 'user/recording.m4a', - memoId: 'memo-1', - userId: 'user-1', - spaceId: 'space-1', - recordingLanguages: ['de-DE', 'en-US'], - enableDiarization: true, - recordingIndex: 0, - }, - { 'X-Service-Key': SERVICE_KEY } - ); - expect(res.status).toBe(200); - }); - - it('rejects missing audioPath', async () => { - const res = await post( - '/api/v1/transcribe', - { memoId: 'memo-1', userId: 'user-1' }, - { 'X-Service-Key': SERVICE_KEY } - ); - expect(res.status).toBe(400); - - const data = await res.json(); - expect(data.error).toContain('Missing required fields'); - }); - - it('rejects missing memoId', async () => { - const res = await post( - '/api/v1/transcribe', - { audioPath: 'test.m4a', userId: 'user-1' }, - { 'X-Service-Key': SERVICE_KEY } - ); - expect(res.status).toBe(400); - }); - - it('rejects missing userId', async () => { - const res = await post( - '/api/v1/transcribe', - { audioPath: 'test.m4a', memoId: 'memo-1' }, - { 'X-Service-Key': SERVICE_KEY } - ); - expect(res.status).toBe(400); - }); - - it('rejects invalid JSON', async () => { - const res = await app.request('/api/v1/transcribe', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Service-Key': SERVICE_KEY, - }, - body: 'not json', - }); - expect(res.status).toBe(400); - - const data = await res.json(); - expect(data.error).toBe('Invalid JSON body'); - }); -}); - -// ── POST /api/v1/transcribe/append ─────────────────────────────────────────── - -describe('POST /api/v1/transcribe/append', () => { - it('starts append transcription with valid input', async () => { - const res = await post( - '/api/v1/transcribe/append', - { - audioPath: 'user/append.m4a', - memoId: 'memo-1', - userId: 'user-1', - recordingIndex: 1, - }, - { 'X-Service-Key': SERVICE_KEY } - ); - expect(res.status).toBe(200); - - const data = await res.json(); - expect(data.success).toBe(true); - expect(data.memoId).toBe('memo-1'); - expect(data.message).toBe('Append transcription started'); - }); - - it('rejects missing required fields', async () => { - const res = await post( - '/api/v1/transcribe/append', - { audioPath: 'test.m4a' }, - { 'X-Service-Key': SERVICE_KEY } - ); - expect(res.status).toBe(400); - }); - - it('rejects invalid JSON', async () => { - const res = await app.request('/api/v1/transcribe/append', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Service-Key': SERVICE_KEY, - }, - body: '{invalid', - }); - expect(res.status).toBe(400); - }); -}); - -// ── 404 ────────────────────────────────────────────────────────────────────── - -describe('404 handler', () => { - it('returns 404 for unknown routes', async () => { - const res = await app.request('/nonexistent'); - expect(res.status).toBe(404); - - const data = await res.json(); - expect(data.error).toContain('Not found'); - }); - - it('returns 404 for unknown API routes', async () => { - const res = await app.request('/api/v1/unknown', { - headers: { 'X-Service-Key': SERVICE_KEY }, - }); - expect(res.status).toBe(404); - }); -}); diff --git a/apps/memoro/apps/audio-server/src/routes/transcribe.ts b/apps/memoro/apps/audio-server/src/routes/transcribe.ts deleted file mode 100644 index 0753a15f0..000000000 --- a/apps/memoro/apps/audio-server/src/routes/transcribe.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { Hono } from 'hono'; -import { downloadAudioFromStorage } from '../lib/supabase.ts'; -import { TranscriptionService } from '../services/transcription.ts'; - -interface TranscribeBody { - audioPath: string; - memoId: string; - userId: string; - spaceId?: string; - recordingLanguages?: string[]; - enableDiarization?: boolean; - isAppend?: boolean; - recordingIndex?: number; -} - -const transcriptionService = new TranscriptionService(); - -export function createTranscribeRoutes() { - const app = new Hono(); - - app.post('/', async (c) => { - let body: TranscribeBody; - - try { - body = await c.req.json(); - } catch { - return c.json({ error: 'Invalid JSON body' }, 400); - } - - const { audioPath, memoId, userId, spaceId, recordingLanguages, enableDiarization, recordingIndex } = body; - - if (!audioPath || !memoId || !userId) { - return c.json({ error: 'Missing required fields: audioPath, memoId, userId' }, 400); - } - - const serviceKey = process.env.SERVICE_KEY ?? ''; - const serverUrl = process.env.MEMORO_SERVER_URL ?? 'http://localhost:3015'; - - console.log(`[Route] POST /transcribe — memoId: ${memoId}, userId: ${userId}, audioPath: ${audioPath}`); - - // Fire-and-forget: return immediately, process in background - queueMicrotask(async () => { - try { - const audioBuffer = await downloadAudioFromStorage(audioPath); - await transcriptionService.transcribeWithFallback({ - audioBuffer, - audioPath, - memoId, - userId, - spaceId, - recordingLanguages, - enableDiarization, - isAppend: false, - recordingIndex, - serviceKey, - serverUrl, - }); - } catch (err: unknown) { - const msg = err instanceof Error ? err.message : String(err); - console.error(`[Route] Transcription background task failed for memo ${memoId}: ${msg}`); - } - }); - - return c.json({ - success: true, - memoId, - message: 'Transcription started', - }); - }); - - app.post('/append', async (c) => { - let body: TranscribeBody; - - try { - body = await c.req.json(); - } catch { - return c.json({ error: 'Invalid JSON body' }, 400); - } - - const { audioPath, memoId, userId, spaceId, recordingLanguages, enableDiarization, recordingIndex } = body; - - if (!audioPath || !memoId || !userId) { - return c.json({ error: 'Missing required fields: audioPath, memoId, userId' }, 400); - } - - const serviceKey = process.env.SERVICE_KEY ?? ''; - const serverUrl = process.env.MEMORO_SERVER_URL ?? 'http://localhost:3015'; - - console.log( - `[Route] POST /transcribe/append — memoId: ${memoId}, userId: ${userId}, audioPath: ${audioPath}, recordingIndex: ${recordingIndex}`, - ); - - // Fire-and-forget: return immediately, process in background - queueMicrotask(async () => { - try { - const audioBuffer = await downloadAudioFromStorage(audioPath); - await transcriptionService.transcribeWithFallback({ - audioBuffer, - audioPath, - memoId, - userId, - spaceId, - recordingLanguages, - enableDiarization, - isAppend: true, - recordingIndex, - serviceKey, - serverUrl, - }); - } catch (err: unknown) { - const msg = err instanceof Error ? err.message : String(err); - console.error(`[Route] Append transcription background task failed for memo ${memoId}: ${msg}`); - } - }); - - return c.json({ - success: true, - memoId, - message: 'Append transcription started', - }); - }); - - return app; -} diff --git a/apps/memoro/apps/audio-server/src/services/batch.ts b/apps/memoro/apps/audio-server/src/services/batch.ts deleted file mode 100644 index 37c3dda0f..000000000 --- a/apps/memoro/apps/audio-server/src/services/batch.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { BATCH_ENDPOINT_BASE, type SpeechServiceConfig } from '../lib/azure.ts'; -import { convertToAzureWav } from './ffmpeg.ts'; - -const DEFAULT_CANDIDATE_LOCALES = [ - 'en-US', - 'de-DE', - 'en-GB', - 'fr-FR', - 'it-IT', - 'es-ES', - 'sv-SE', - 'ru-RU', - 'nl-NL', - 'tr-TR', - 'pt-PT', -]; - -interface BatchJobResult { - jobId: string; - status: 'processing'; -} - -interface BatchJobStatus { - jobId: string; - status: string; - self?: string; - files?: string; -} - -async function getAzureBlobClients(accountName: string, accountKey: string) { - const { BlobServiceClient, StorageSharedKeyCredential } = await import('@azure/storage-blob'); - const credential = new StorageSharedKeyCredential(accountName, accountKey); - const blobServiceClient = new BlobServiceClient( - `https://${accountName}.blob.core.windows.net`, - credential, - ); - return { blobServiceClient, credential }; -} - -async function uploadWavToBlob( - wavBuffer: Buffer, - userId: string, - accountName: string, - accountKey: string, -): Promise { - const { BlobSASPermissions, generateBlobSASQueryParameters } = await import('@azure/storage-blob'); - const { blobServiceClient, credential } = await getAzureBlobClients(accountName, accountKey); - - const containerName = 'batch-transcription'; - const blobName = `transcriptions/${userId}/${Date.now()}.wav`; - - const containerClient = blobServiceClient.getContainerClient(containerName); - await containerClient.createIfNotExists(); - - const blockBlobClient = containerClient.getBlockBlobClient(blobName); - await blockBlobClient.upload(wavBuffer, wavBuffer.length, { - blobHTTPHeaders: { blobContentType: 'audio/wav' }, - }); - - console.log(`[Batch] Uploaded WAV to Azure Blob: ${containerName}/${blobName}`); - - const sasOptions = { - containerName, - blobName, - permissions: BlobSASPermissions.parse('r'), - startsOn: new Date(Date.now() - 5 * 60 * 1000), - expiresOn: new Date(Date.now() + 6 * 60 * 60 * 1000), - }; - - const sasToken = generateBlobSASQueryParameters(sasOptions, credential).toString(); - return `${blockBlobClient.url}?${sasToken}`; -} - -async function ensureResultsContainerSasUrl(accountName: string, accountKey: string): Promise { - const { ContainerSASPermissions, generateBlobSASQueryParameters } = await import('@azure/storage-blob'); - const { blobServiceClient, credential } = await getAzureBlobClients(accountName, accountKey); - - const resultsContainerName = 'results'; - const containerClient = blobServiceClient.getContainerClient(resultsContainerName); - await containerClient.createIfNotExists(); - - const sasToken = generateBlobSASQueryParameters( - { - containerName: resultsContainerName, - permissions: ContainerSASPermissions.parse('rcw'), - startsOn: new Date(Date.now() - 5 * 60 * 1000), - expiresOn: new Date(Date.now() + 24 * 60 * 60 * 1000), - }, - credential, - ).toString(); - - return `https://${accountName}.blob.core.windows.net/${resultsContainerName}?${sasToken}`; -} - -export class BatchTranscriptionService { - async createBatchJob( - audioBuffer: Buffer, - userId: string, - speechService: SpeechServiceConfig, - languages?: string[], - diarization?: boolean, - ): Promise { - const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME; - const accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY; - - if (!accountName || !accountKey) { - throw new Error('Azure Storage credentials not configured (AZURE_STORAGE_ACCOUNT_NAME, AZURE_STORAGE_ACCOUNT_KEY)'); - } - - console.log(`[Batch] Creating batch transcription job for user ${userId}`); - - // Convert audio to WAV before uploading - const wavBuffer = await convertToAzureWav(audioBuffer, '.wav'); - - // Upload WAV to Azure Blob Storage - const sasUrl = await uploadWavToBlob(wavBuffer, userId, accountName, accountKey); - console.log(`[Batch] Got SAS URL for blob`); - - // Ensure results container and get its SAS URL - const destinationUrl = await ensureResultsContainerSasUrl(accountName, accountKey); - - // Build candidate locales - const mainLocale = languages?.[0] || 'de-DE'; - let candidateLocales = - languages && languages.length > 0 - ? Array.from(new Set([mainLocale, ...languages, ...DEFAULT_CANDIDATE_LOCALES])) - : DEFAULT_CANDIDATE_LOCALES; - - candidateLocales = candidateLocales.slice(0, 10); - if (candidateLocales.length < 2) { - candidateLocales = Array.from(new Set([...candidateLocales, 'en-US', 'de-DE'])).slice(0, 10); - } - - const properties: Record = { - wordLevelTimestampsEnabled: true, - punctuationMode: 'DictatedAndAutomatic', - profanityFilterMode: 'Masked', - destinationContainerUrl: destinationUrl, - timeToLive: 'PT12H', - languageIdentification: { - candidateLocales, - mode: 'Continuous', - }, - }; - - if (diarization !== false) { - properties['diarizationEnabled'] = true; - properties['speakerCount'] = 10; - } - - const transcriptionBody = { - contentUrls: [sasUrl], - locale: mainLocale, - displayName: userId, - properties, - }; - - const batchEndpoint = `${BATCH_ENDPOINT_BASE}/v3.1/transcriptions`; - console.log(`[Batch] Submitting job to: ${batchEndpoint}`); - - const response = await fetch(batchEndpoint, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Ocp-Apim-Subscription-Key': speechService.key, - }, - body: JSON.stringify(transcriptionBody), - }); - - if (!response.ok) { - const errorText = await response.text(); - console.error(`[Batch] Job creation failed: ${response.status} - ${errorText}`); - throw new Error(`Azure Batch API error: ${response.status} - ${errorText}`); - } - - const jobData = await response.json() as { self?: string }; - const jobId = jobData.self?.split('/').pop() ?? String(Date.now()); - - console.log(`[Batch] Job created successfully: ${jobId}`); - - return { jobId, status: 'processing' }; - } - - async getJobStatus(jobId: string, speechService: SpeechServiceConfig): Promise { - const batchEndpoint = `${BATCH_ENDPOINT_BASE}/v3.1/transcriptions/${jobId}`; - - console.log(`[Batch] Checking job status: ${jobId}`); - - const response = await fetch(batchEndpoint, { - method: 'GET', - headers: { - 'Ocp-Apim-Subscription-Key': speechService.key, - }, - }); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`Azure Batch status check failed: ${response.status} - ${errorText}`); - } - - const data = await response.json() as { status?: string; self?: string; links?: { files?: string } }; - - return { - jobId, - status: data.status ?? 'unknown', - self: data.self, - files: data.links?.files, - }; - } -} diff --git a/apps/memoro/apps/audio-server/src/services/ffmpeg.ts b/apps/memoro/apps/audio-server/src/services/ffmpeg.ts deleted file mode 100644 index 4121bad62..000000000 --- a/apps/memoro/apps/audio-server/src/services/ffmpeg.ts +++ /dev/null @@ -1,167 +0,0 @@ -import * as ffmpeg from 'fluent-ffmpeg'; -import * as fs from 'fs'; -import * as path from 'path'; -import * as os from 'os'; - -const FORMAT_MAP: Record = { - '.m4a': 'mp4', - '.mp4': 'mp4', - '.mp3': 'mp3', - '.wav': 'wav', - '.aac': 'aac', - '.ogg': 'ogg', - '.webm': 'webm', - '.flac': 'flac', - '.caf': 'caf', - '.wma': 'asf', - '.amr': 'amr', -}; - -const PROBE_FORMAT_MAP: Record = { - mp3: 'mp3', - mov: 'mp4', - mp4: 'mp4', - m4a: 'mp4', - wav: 'wav', - aac: 'aac', - ogg: 'ogg', - webm: 'webm', - flac: 'flac', - caf: 'caf', - asf: 'asf', - amr: 'amr', -}; - -async function probeAudioFile( - filePath: string, -): Promise<{ valid: boolean; format?: string; codec?: string; duration?: number }> { - return new Promise((resolve) => { - (ffmpeg as any).ffprobe(filePath, (err: Error | null, metadata: any) => { - if (err) { - console.warn(`[ffmpeg] Probe failed for ${filePath}: ${err.message}`); - resolve({ valid: false }); - return; - } - - const format = metadata?.format?.format_name; - const duration = metadata?.format?.duration; - const audioStream = metadata?.streams?.find((s: any) => s.codec_type === 'audio'); - const codec = audioStream?.codec_name; - - resolve({ valid: true, format, codec, duration }); - }); - }); -} - -async function cleanup(...files: string[]): Promise { - await Promise.all( - files.map((f) => - fs.promises.unlink(f).catch(() => { - // Ignore cleanup errors - }), - ), - ); -} - -export async function convertToAzureWav(inputBuffer: Buffer, fileExtension: string): Promise { - const tempDir = os.tmpdir(); - const ext = fileExtension.startsWith('.') ? fileExtension : `.${fileExtension}`; - const inputFile = path.join(tempDir, `memoro_input_${Date.now()}${ext}`); - const outputFile = path.join(tempDir, `memoro_output_${Date.now()}.wav`); - - console.log(`[ffmpeg] Converting audio (${ext}) to Azure WAV format`); - - try { - await fs.promises.writeFile(inputFile, inputBuffer); - - // Probe actual format to detect mismatches between extension and content - const probeResult = await probeAudioFile(inputFile); - let inputFormat = FORMAT_MAP[ext.toLowerCase()]; - - if (probeResult.valid && probeResult.format) { - const probedFormatName = probeResult.format.split(',')[0].trim(); - const detectedFormat = PROBE_FORMAT_MAP[probedFormatName]; - if (detectedFormat && detectedFormat !== inputFormat) { - console.warn( - `[ffmpeg] Format mismatch: extension suggests "${inputFormat}", content detected as "${detectedFormat}". Using detected format.`, - ); - inputFormat = detectedFormat; - } - console.log(`[ffmpeg] Probed format: ${probeResult.format}, codec: ${probeResult.codec}`); - } - - return await new Promise((resolve, reject) => { - const command = (ffmpeg as any)(inputFile) - .audioCodec('pcm_s16le') // PCM 16-bit little-endian - .audioFrequency(16000) // 16kHz — Azure's preferred sample rate - .audioChannels(1) // Mono - .format('wav') - .inputOptions([ - '-err_detect', - 'ignore_err', // Handle iOS spatial audio metadata (chnl box) gracefully - '-fflags', - '+genpts', // Generate presentation timestamps - ]) - .outputOptions(['-y']); - - if (inputFormat) { - command.inputFormat(inputFormat); - console.log(`[ffmpeg] Using input format: ${inputFormat} for extension: ${ext}`); - } else { - console.warn(`[ffmpeg] Unknown format for extension ${ext}, letting ffmpeg auto-detect`); - } - - command - .on('end', async () => { - try { - const converted = await fs.promises.readFile(outputFile); - await cleanup(inputFile, outputFile); - console.log(`[ffmpeg] Conversion complete: ${converted.length} bytes`); - resolve(converted); - } catch (readErr) { - await cleanup(inputFile, outputFile); - reject(readErr); - } - }) - .on('error', async (err: Error) => { - await cleanup(inputFile, outputFile); - console.error(`[ffmpeg] Conversion error for ${ext}: ${err.message}`); - reject(err); - }) - .save(outputFile); - }); - } catch (err) { - await cleanup(inputFile, outputFile); - throw err; - } -} - -export async function getAudioDuration(buffer: Buffer): Promise { - const tempDir = os.tmpdir(); - const tempFile = path.join(tempDir, `memoro_probe_${Date.now()}.tmp`); - - try { - await fs.promises.writeFile(tempFile, buffer); - - return await new Promise((resolve, reject) => { - (ffmpeg as any).ffprobe(tempFile, async (err: Error | null, metadata: any) => { - await cleanup(tempFile); - - if (err) { - reject(new Error(`Failed to probe audio duration: ${err.message}`)); - return; - } - - const duration = metadata?.format?.duration; - if (typeof duration === 'number') { - resolve(duration); - } else { - reject(new Error('Could not determine audio duration from metadata')); - } - }); - }); - } catch (err) { - await cleanup(tempFile); - throw err; - } -} diff --git a/apps/memoro/apps/audio-server/src/services/transcription.ts b/apps/memoro/apps/audio-server/src/services/transcription.ts deleted file mode 100644 index 13973368d..000000000 --- a/apps/memoro/apps/audio-server/src/services/transcription.ts +++ /dev/null @@ -1,677 +0,0 @@ -import { - getAvailableSpeechServices, - pickRandomService, - type SpeechServiceConfig, -} from '../lib/azure.ts'; -import { convertToAzureWav } from './ffmpeg.ts'; -import { BatchTranscriptionService } from './batch.ts'; -import * as path from 'path'; - -const CANDIDATE_LOCALES = [ - 'de-DE', - 'en-GB', - 'fr-FR', - 'it-IT', - 'es-ES', - 'sv-SE', - 'ru-RU', - 'nl-NL', - 'tr-TR', - 'pt-PT', -]; - -const TOTAL_TIMEOUT_MS = 1_200_000; // 20 minutes -const FAST_TIMEOUT_MS = 1_200_000; // 20 minutes - -// Self-hosted mana-stt service (WhisperX on GPU server) -const MANA_STT_URL = process.env.MANA_STT_URL || ''; -const MANA_STT_API_KEY = process.env.MANA_STT_API_KEY || ''; - -interface TranscriptionResult { - transcript: string; - utterances: Array<{ - speaker: number; - text: string; - offset: number; - duration: number; - }>; - speakers: Record; - speakerMap: Record; - languages: string[]; - primary_language: string; -} - -interface TranscribeParams { - audioBuffer: Buffer; - audioPath: string; - memoId: string; - userId: string; - spaceId?: string; - recordingLanguages?: string[]; - enableDiarization?: boolean; - isAppend?: boolean; - recordingIndex?: number; - serviceKey: string; - serverUrl: string; -} - -export class TranscriptionService { - private readonly batchService = new BatchTranscriptionService(); - - async transcribeWithFallback(params: TranscribeParams): Promise { - const { - audioBuffer, - audioPath, - memoId, - userId, - recordingLanguages, - enableDiarization, - isAppend, - recordingIndex, - serviceKey, - serverUrl, - } = params; - const startTime = Date.now(); - - const checkTimeout = (stage: string): void => { - const elapsed = Date.now() - startTime; - if (elapsed > TOTAL_TIMEOUT_MS) { - throw new Error(`Fallback chain timeout exceeded after ${elapsed}ms in stage: ${stage}`); - } - }; - - const withTimeout = (promise: Promise, timeoutMs: number, label: string): Promise => { - return Promise.race([ - promise, - new Promise((_, reject) => - setTimeout(() => reject(new Error(`${label} timeout after ${timeoutMs}ms`)), timeoutMs) - ), - ]); - }; - - try { - console.log(`[Transcription] Starting fallback chain for memo ${memoId} (${audioPath})`); - - // Attempt 0: Self-hosted mana-stt (WhisperX on GPU server) — primary - if (MANA_STT_URL) { - try { - checkTimeout('mana-stt'); - console.log(`[Transcription] Trying mana-stt (WhisperX) at ${MANA_STT_URL}`); - - const result = await withTimeout( - this.performManaSTTTranscription( - audioBuffer, - audioPath, - recordingLanguages, - enableDiarization - ), - FAST_TIMEOUT_MS, - 'mana-stt transcription' - ); - - await this.notifyServer( - memoId, - userId, - result, - 'fast', - serviceKey, - serverUrl, - isAppend, - recordingIndex - ); - console.log(`[Transcription] mana-stt (WhisperX) succeeded for memo ${memoId}`); - return; - } catch (manaSttError: unknown) { - const msg = manaSttError instanceof Error ? manaSttError.message : String(manaSttError); - console.warn(`[Transcription] mana-stt failed, falling back to Azure: ${msg}`); - } - } - - // Attempt 1: Fast realtime transcription (Azure) - try { - checkTimeout('initial-fast'); - const services = getAvailableSpeechServices(); - const service = pickRandomService(services); - - const wavBuffer = await convertToAzureWav(audioBuffer, path.extname(audioPath) || '.m4a'); - - const result = await withTimeout( - this.performRealtimeTranscription( - wavBuffer, - service, - recordingLanguages, - enableDiarization - ), - FAST_TIMEOUT_MS, - 'Fast transcription' - ); - - await this.notifyServer( - memoId, - userId, - result, - 'fast', - serviceKey, - serverUrl, - isAppend, - recordingIndex - ); - console.log(`[Transcription] Fast transcription succeeded for memo ${memoId}`); - return; - } catch (fastError: unknown) { - const fastErrMsg = fastError instanceof Error ? fastError.message : String(fastError); - console.warn(`[Transcription] Fast route failed: ${fastErrMsg}`); - - // Attempt 2: Service retry with different Azure key (429 rate limit) - if (this.shouldRetryWithDifferentService(fastErrMsg)) { - try { - checkTimeout('service-retry'); - console.log(`[Transcription] Retrying with different Azure service key`); - - const services = getAvailableSpeechServices(); - if (services.length > 1) { - const service = pickRandomService(services); - const wavBuffer = await convertToAzureWav( - audioBuffer, - path.extname(audioPath) || '.m4a' - ); - const result = await withTimeout( - this.performRealtimeTranscription( - wavBuffer, - service, - recordingLanguages, - enableDiarization - ), - FAST_TIMEOUT_MS, - 'Service retry transcription' - ); - await this.notifyServer( - memoId, - userId, - result, - 'fast', - serviceKey, - serverUrl, - isAppend, - recordingIndex - ); - console.log(`[Transcription] Service retry succeeded for memo ${memoId}`); - return; - } else { - console.warn( - `[Transcription] Only one Azure service configured, skipping service retry` - ); - } - } catch (serviceRetryError: unknown) { - const msg = - serviceRetryError instanceof Error - ? serviceRetryError.message - : String(serviceRetryError); - console.warn(`[Transcription] Service retry failed: ${msg}`); - } - } - - // Attempt 3: FFmpeg conversion + retry (422 / format errors) - if (this.shouldRetryWithConversion(fastErrMsg)) { - try { - checkTimeout('conversion-retry'); - console.log(`[Transcription] Retrying with enhanced audio conversion`); - - const services = getAvailableSpeechServices(); - const service = pickRandomService(services); - - // Force conversion even if already attempted — use explicit wav extension - const wavBuffer = await convertToAzureWav(audioBuffer, '.wav'); - - const result = await withTimeout( - this.performRealtimeTranscription( - wavBuffer, - service, - recordingLanguages, - enableDiarization - ), - FAST_TIMEOUT_MS, - 'Conversion retry transcription' - ); - await this.notifyServer( - memoId, - userId, - result, - 'fast', - serviceKey, - serverUrl, - isAppend, - recordingIndex - ); - console.log(`[Transcription] Conversion retry succeeded for memo ${memoId}`); - return; - } catch (conversionError: unknown) { - const msg = - conversionError instanceof Error ? conversionError.message : String(conversionError); - console.warn(`[Transcription] Conversion retry failed: ${msg}. Falling back to batch.`); - } - } - - // Attempt 4: Azure batch transcription fallback - checkTimeout('batch-fallback'); - console.log(`[Transcription] Falling back to Azure Batch transcription for memo ${memoId}`); - - try { - const services = getAvailableSpeechServices(); - const service = pickRandomService(services); - const batchResult = await this.batchService.createBatchJob( - audioBuffer, - userId, - service, - recordingLanguages, - enableDiarization - ); - console.log(`[Transcription] Batch job created: ${batchResult.jobId} for memo ${memoId}`); - // Batch jobs complete asynchronously via webhook — no immediate notify here - return; - } catch (batchError: unknown) { - const msg = batchError instanceof Error ? batchError.message : String(batchError); - throw new Error(`All transcription methods failed. Batch error: ${msg}`); - } - } - } catch (error: unknown) { - const errorMsg = error instanceof Error ? error.message : String(error); - console.error(`[Transcription] All fallback attempts failed for memo ${memoId}: ${errorMsg}`); - - await this.notifyServerError(memoId, userId, errorMsg, serviceKey, serverUrl); - } - } - - async performRealtimeTranscription( - audioBuffer: Buffer, - speechService: SpeechServiceConfig, - languages?: string[], - diarization?: boolean - ): Promise { - const definition: Record = { - wordLevelTimestampsEnabled: true, - punctuationMode: 'Automatic', - profanityFilterMode: 'None', - }; - - if (diarization !== false) { - definition['diarization'] = { - enabled: true, - maxSpeakers: 10, - }; - } - - const candidateLocales = languages && languages.length > 0 ? languages : CANDIDATE_LOCALES; - - definition['languageIdentification'] = { - candidateLocales, - }; - - console.log(`[Azure] Sending realtime transcription request to ${speechService.name}`); - console.log(`[Azure] Definition: ${JSON.stringify(definition)}`); - - const formData = new FormData(); - formData.append('definition', JSON.stringify(definition)); - - const audioBlob = new Blob([audioBuffer], { type: 'audio/wav' }); - formData.append('audio', audioBlob, 'audio.wav'); - - const response = await fetch(`${speechService.endpoint}?api-version=2024-11-15`, { - method: 'POST', - headers: { - 'Ocp-Apim-Subscription-Key': speechService.key, - Accept: 'application/json', - }, - body: formData, - }); - - if (!response.ok) { - const errorText = await response.text(); - - if (response.status === 429) { - const retryAfter = response.headers.get('retry-after') ?? 'n/a'; - const requestId = response.headers.get('x-ms-request-id') ?? 'n/a'; - const quotaReason = response.headers.get('x-ms-service-quota-reason') ?? 'n/a'; - console.error( - `[AZURE_429_ERROR] Rate limited on ${speechService.name} — retry-after: ${retryAfter}, request-id: ${requestId}, quota-reason: ${quotaReason}` - ); - console.error(`[AZURE_429_ERROR] Body: ${errorText}`); - throw new Error(`[AZURE_429_ERROR] Azure Speech API rate limited (429): ${errorText}`); - } - - if (response.status === 422) { - const requestId = response.headers.get('x-ms-request-id') ?? 'n/a'; - console.error( - `[AZURE_422_ERROR] Format error on ${speechService.name} — request-id: ${requestId}` - ); - console.error(`[AZURE_422_ERROR] Body: ${errorText}`); - throw new Error(`[AZURE_422_ERROR] Azure Speech API format error (422): ${errorText}`); - } - - throw new Error(`Azure Speech API error: ${response.status} - ${errorText}`); - } - - const azureResult = (await response.json()) as Parameters< - typeof this.processTranscriptionResult - >[0]; - console.log(`[Azure] Transcription response received from ${speechService.name}`); - console.log(`[Azure] Phrase count: ${azureResult?.phrases?.length ?? 0}`); - - return this.processTranscriptionResult(azureResult); - } - - processTranscriptionResult(azureResult: { - phrases?: Array<{ - text?: string; - speaker?: number; - offsetMilliseconds?: number; - durationMilliseconds?: number; - locale?: string; - words?: unknown[]; - }>; - combinedPhrases?: Array<{ text?: string }>; - locale?: string; - }): TranscriptionResult { - let transcript = ''; - let primary_language = 'de-DE'; - let languages: string[] = ['de-DE']; - - // Determine languages from phrase-level locale analysis (more accurate than top-level) - if (azureResult.phrases && azureResult.phrases.length > 0) { - const phraseCounts: Record = {}; - const charCounts: Record = {}; - - for (const phrase of azureResult.phrases) { - if (phrase.locale) { - phraseCounts[phrase.locale] = (phraseCounts[phrase.locale] ?? 0) + 1; - charCounts[phrase.locale] = (charCounts[phrase.locale] ?? 0) + (phrase.text?.length ?? 0); - } - } - - const uniqueLanguages = Object.keys(phraseCounts); - if (uniqueLanguages.length > 0) { - // Pick primary by character count — more accurate than phrase count - primary_language = uniqueLanguages.reduce((best, lang) => - (charCounts[lang] ?? 0) > (charCounts[best] ?? 0) ? lang : best - ); - languages = uniqueLanguages; - console.log( - `[Transcription] Language detection: ${JSON.stringify(charCounts)}, primary: ${primary_language}` - ); - } - } else if (azureResult.locale) { - primary_language = azureResult.locale; - languages = [azureResult.locale]; - } - - // Build transcript text - if (azureResult.combinedPhrases && azureResult.combinedPhrases.length > 0) { - transcript = azureResult.combinedPhrases[0]?.text ?? ''; - } else if (azureResult.phrases && azureResult.phrases.length > 0) { - transcript = azureResult.phrases.map((p) => p.text ?? '').join(' '); - } - - // Build utterances and speaker maps - const utterances: TranscriptionResult['utterances'] = []; - const speakerIdSet = new Set(); - - if (azureResult.phrases) { - for (const phrase of azureResult.phrases) { - if (phrase.speaker !== undefined && phrase.text) { - utterances.push({ - speaker: phrase.speaker, - text: phrase.text, - offset: phrase.offsetMilliseconds ?? 0, - duration: phrase.durationMilliseconds ?? 0, - }); - speakerIdSet.add(phrase.speaker); - } - } - } - - // Sort by time - utterances.sort((a, b) => a.offset - b.offset); - - // Build speaker label maps - const speakers: Record = {}; - const speakerMap: Record = {}; - - for (const speakerId of speakerIdSet) { - const label = `Speaker ${speakerId}`; - speakers[String(speakerId)] = label; - speakerMap[label] = speakerId; - } - - console.log( - `[Transcription] Processed: ${transcript.length} chars, ${utterances.length} utterances, ${speakerIdSet.size} speakers, lang: ${primary_language}` - ); - - return { transcript, utterances, speakers, speakerMap, languages, primary_language }; - } - - /** - * Transcribe via self-hosted mana-stt service (WhisperX on GPU server). - * Uses the /transcribe/whisperx endpoint which returns rich data with - * diarization, word alignment, and utterances. - */ - async performManaSTTTranscription( - audioBuffer: Buffer, - audioPath: string, - languages?: string[], - diarization?: boolean - ): Promise { - const ext = path.extname(audioPath) || '.m4a'; - const mimeTypes: Record = { - '.m4a': 'audio/mp4', - '.mp3': 'audio/mpeg', - '.wav': 'audio/wav', - '.flac': 'audio/flac', - '.ogg': 'audio/ogg', - '.webm': 'audio/webm', - '.mp4': 'audio/mp4', - }; - const mimeType = mimeTypes[ext] || 'audio/wav'; - - // Determine language hint from recording languages (e.g., 'de-DE' → 'de') - const langHint = languages?.[0]?.split('-')[0] || null; - - const formData = new FormData(); - const audioBlob = new Blob([audioBuffer], { type: mimeType }); - formData.append('file', audioBlob, `audio${ext}`); - if (langHint) formData.append('language', langHint); - formData.append('diarization', String(diarization !== false)); - formData.append('alignment', 'true'); - - const headers: Record = { - Accept: 'application/json', - }; - if (MANA_STT_API_KEY) { - headers['X-API-Key'] = MANA_STT_API_KEY; - } - - console.log( - `[mana-stt] Sending WhisperX request (${audioBuffer.length} bytes, lang=${langHint})` - ); - - const response = await fetch(`${MANA_STT_URL}/transcribe/whisperx`, { - method: 'POST', - headers, - body: formData, - }); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`mana-stt error: ${response.status} - ${errorText}`); - } - - const sttResult = (await response.json()) as { - text: string; - language?: string; - duration_seconds?: number; - utterances?: Array<{ - speaker: number; - text: string; - offset: number; - duration: number; - }>; - speakers?: Record; - speaker_map?: Record; - languages?: string[]; - primary_language?: string; - }; - - console.log( - `[mana-stt] Response: ${sttResult.text.length} chars, ` + - `${sttResult.utterances?.length ?? 0} utterances, ` + - `lang=${sttResult.primary_language ?? sttResult.language}` - ); - - // Map mana-stt language codes to locale format (e.g., 'de' → 'de-DE') - const localeMap: Record = { - de: 'de-DE', - en: 'en-GB', - fr: 'fr-FR', - it: 'it-IT', - es: 'es-ES', - sv: 'sv-SE', - ru: 'ru-RU', - nl: 'nl-NL', - tr: 'tr-TR', - pt: 'pt-PT', - ja: 'ja-JP', - ko: 'ko-KR', - zh: 'zh-CN', - ar: 'ar-SA', - hi: 'hi-IN', - }; - - const rawLang = sttResult.primary_language ?? sttResult.language ?? 'de'; - const primaryLocale = localeMap[rawLang] ?? `${rawLang}-${rawLang.toUpperCase()}`; - const detectedLanguages = (sttResult.languages ?? [rawLang]).map( - (l) => localeMap[l] ?? `${l}-${l.toUpperCase()}` - ); - - return { - transcript: sttResult.text, - utterances: sttResult.utterances ?? [], - speakers: sttResult.speakers ?? {}, - speakerMap: sttResult.speaker_map ?? {}, - languages: detectedLanguages, - primary_language: primaryLocale, - }; - } - - shouldRetryWithDifferentService(errorMsg: string): boolean { - const has429 = /429|AZURE_429_ERROR|rate.?limit|too many requests/i.test(errorMsg); - console.log( - `[Transcription] shouldRetryWithDifferentService: ${has429} (${errorMsg.substring(0, 100)})` - ); - return has429; - } - - shouldRetryWithConversion(errorMsg: string): boolean { - const patterns = [ - /422/, - /AZURE_422_ERROR/, - /audio.?format/i, - /InvalidAudioFormat/i, - /audio\/x-m4a/i, - /unsupported.*format/i, - /invalid.*audio/i, - /codec.*not.*supported/i, - /content.*type.*unsupported/i, - /bitrate.*not.*supported/i, - /sample.*rate.*invalid/i, - /media.*type.*not.*supported/i, - ]; - const matches = patterns.some((p) => p.test(errorMsg)); - console.log( - `[Transcription] shouldRetryWithConversion: ${matches} (${errorMsg.substring(0, 100)})` - ); - return matches; - } - - async notifyServer( - memoId: string, - userId: string, - result: TranscriptionResult, - route: 'fast' | 'batch', - serviceKey: string, - serverUrl: string, - isAppend?: boolean, - recordingIndex?: number - ): Promise { - const endpoint = isAppend - ? `${serverUrl}/api/v1/internal/append-transcription-completed` - : `${serverUrl}/api/v1/internal/transcription-completed`; - - const body: Record = { - memoId, - userId, - transcriptionResult: result, - route, - success: true, - }; - - if (isAppend) { - body['recordingIndex'] = recordingIndex; - } - - console.log(`[Callback] Notifying server at ${endpoint} for memo ${memoId}`); - - const response = await fetch(endpoint, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Service-Key': serviceKey, - }, - body: JSON.stringify(body), - }); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`Server callback failed: ${response.status} - ${errorText}`); - } - - console.log(`[Callback] Server notified successfully for memo ${memoId}`); - } - - async notifyServerError( - memoId: string, - userId: string, - errorMsg: string, - serviceKey: string, - serverUrl: string - ): Promise { - const endpoint = `${serverUrl}/api/v1/internal/transcription-completed`; - - console.error( - `[Callback] Notifying server of transcription error for memo ${memoId}: ${errorMsg}` - ); - - try { - const response = await fetch(endpoint, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Service-Key': serviceKey, - }, - body: JSON.stringify({ - memoId, - userId, - error: errorMsg, - success: false, - timestamp: new Date().toISOString(), - }), - }); - - if (!response.ok) { - const text = await response.text(); - console.error(`[Callback] Error notification failed: ${response.status} - ${text}`); - } - } catch (notifyErr: unknown) { - const msg = notifyErr instanceof Error ? notifyErr.message : String(notifyErr); - console.error(`[Callback] Failed to notify server of error: ${msg}`); - } - } -} diff --git a/apps/memoro/apps/audio-server/src/test-setup.ts b/apps/memoro/apps/audio-server/src/test-setup.ts deleted file mode 100644 index 35bad647f..000000000 --- a/apps/memoro/apps/audio-server/src/test-setup.ts +++ /dev/null @@ -1,3 +0,0 @@ -process.env.NODE_ENV = 'test'; -process.env.SERVICE_KEY = 'test-service-key'; -process.env.MEMORO_SERVER_URL = 'http://localhost:3015'; diff --git a/apps/memoro/apps/audio-server/tsconfig.json b/apps/memoro/apps/audio-server/tsconfig.json deleted file mode 100644 index f79b74bd1..000000000 --- a/apps/memoro/apps/audio-server/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "bundler", - "lib": ["ESNext"], - "strict": true, - "skipLibCheck": true, - "noEmit": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "resolveJsonModule": true, - "allowImportingTsExtensions": true, - "outDir": "dist", - "types": ["bun-types", "node"] - }, - "include": ["src/**/*.ts", "vitest.config.ts"], - "exclude": ["node_modules", "dist"] -} diff --git a/apps/memoro/apps/audio-server/vitest.config.ts b/apps/memoro/apps/audio-server/vitest.config.ts deleted file mode 100644 index d84744d7e..000000000 --- a/apps/memoro/apps/audio-server/vitest.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { - globals: true, - environment: 'node', - include: ['src/**/*.test.ts'], - setupFiles: ['./src/test-setup.ts'], - clearMocks: true, - }, -}); diff --git a/apps/memoro/apps/landing/.env.example b/apps/memoro/apps/landing/.env.example deleted file mode 100644 index a374ffa34..000000000 --- a/apps/memoro/apps/landing/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -# Umami Analytics Configuration (optional) -# PUBLIC_UMAMI_WEBSITE_ID=your-website-id -# PUBLIC_UMAMI_URL=https://your-umami-instance.com/script.js \ No newline at end of file diff --git a/apps/memoro/apps/landing/.gitignore b/apps/memoro/apps/landing/.gitignore deleted file mode 100644 index 5b59d37a1..000000000 --- a/apps/memoro/apps/landing/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# build output -dist/ - -# generated types -.astro/ - -# dependencies -node_modules/ - -# logs -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# environment variables -.env -.env.production - -# macOS-specific files -.DS_Store - -# jetbrains setting folder -.idea/ - -# Archive folder -.archive/ - -# Local Netlify folder -.netlify diff --git a/apps/memoro/apps/landing/CLAUDE.md b/apps/memoro/apps/landing/CLAUDE.md deleted file mode 100644 index 5b13b0fe2..000000000 --- a/apps/memoro/apps/landing/CLAUDE.md +++ /dev/null @@ -1,112 +0,0 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Project Overview - -Memoro is a multilingual marketing website built with Astro for an AI-powered conversation documentation and note-taking app. The site supports German (de) as default and English (en) locales. - -## Build Commands - -```bash -npm run dev # Start development server (localhost:4321) -npm run build # Build production site to ./dist/ -npm run preview # Preview production build locally -npm run astro check # Type-check the project. IMPORTANT: Use this after every change! -``` - -## Architecture - -### Tech Stack - -- **Framework**: Astro 5.3.0 with static site generation -- **Styling**: Tailwind CSS -- **Content**: MDX support with content collections -- **TypeScript**: Strict mode enabled - -### Project Structure - -``` -src/ -├── components/ # Reusable Astro components -├── content/ # Content collections with Zod schemas -│ ├── blog/ # Blog posts (de/en subfolders) -│ ├── team/ # Team member profiles -│ ├── features/ # Feature descriptions -│ ├── guides/ # User guides and tutorials -│ └── ... # Other collections (industries, testimonials, etc.) -├── i18n/ # Internationalization (ui.ts for translations) -├── layouts/ # Page layout templates -├── pages/ # Routes with [lang] dynamic routing -├── styles/ # Global CSS with Tailwind -└── utils/ # Utility functions -``` - -### Internationalization (i18n) - -- **Default locale**: German (de) -- **Supported locales**: German (de), English (en) -- **Routing**: Prefix-based (e.g., /de/blog, /en/blog) -- **Middleware**: Automatically redirects to default locale if missing -- **Translations**: Centralized in `src/i18n/ui.ts` -- **Content**: Organized in language subfolders within collections - -### Content Collections - -All content uses Zod schemas for validation. Key collections: - -- **blog**: Articles with metadata (title, description, pubDate, author, tags) -- **team**: Team profiles with roles and social links -- **features**: Product features with icons and categories -- **guides**: Tutorials with difficulty levels and duration -- **testimonials**: Customer testimonials -- **legal**: Legal pages (privacy, terms, etc.) - -Each content type must include: - -- `lang` field (either 'de' or 'en') -- Proper frontmatter matching the schema -- MDX content body - -### Code Style Guidelines - -#### Components - -- Use PascalCase for component names (e.g., `BlogCard.astro`) -- Define Props interfaces at the top of component files -- Import order: external libraries first, then project files - -#### TypeScript - -- Always use Zod schemas for content validation -- Define interfaces for all component props -- Use strict type checking (enabled in tsconfig) - -#### CSS - -- Use Tailwind CSS utility classes -- Follow kebab-case for custom CSS classes -- Avoid inline styles - -#### Error Handling - -- Middleware handles 404s and missing locale redirects -- Use optional chaining for potentially undefined values -- Provide fallbacks for missing translations - -### Important Implementation Notes - -- Static site generation means no server-side runtime -- All content is pre-built at build time -- Dynamic routes use Astro's `getStaticPaths()` -- Sitemap generation includes all locales -- Images stored in `/public/images/` organized by type - -### Testing - -No test framework is currently configured. Consider manual testing of: - -- All language routes -- Content collection validation -- Build process for production -- 404 handling and redirects diff --git a/apps/memoro/apps/landing/POSTHOG_SETUP.md b/apps/memoro/apps/landing/POSTHOG_SETUP.md deleted file mode 100644 index 71cd477aa..000000000 --- a/apps/memoro/apps/landing/POSTHOG_SETUP.md +++ /dev/null @@ -1,168 +0,0 @@ -# PostHog A/B Testing Setup - -Dieses Dokument beschreibt die PostHog-Integration für A/B-Testing auf der Memoro-Website. - -## 1. Initiale Einrichtung - -### PostHog-Account erstellen -1. Gehe zu [PostHog EU](https://eu.posthog.com) -2. Erstelle einen Account (EU-Region für GDPR-Compliance) -3. Erstelle ein neues Projekt "Memoro Landing" - -### Environment-Variablen -Erstelle eine `.env`-Datei basierend auf `.env.example`: -```bash -PUBLIC_POSTHOG_KEY=phc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -``` - -### Testen der Integration -1. Starte den Dev-Server: `npm run dev` -2. Akzeptiere Analytics-Cookies im Cookie-Banner -3. Öffne die Browser-Konsole und prüfe: `window.posthog` sollte verfügbar sein -4. Überprüfe im PostHog-Dashboard, ob Events ankommen - -## 2. A/B-Tests erstellen - -### Im PostHog-Dashboard -1. Navigiere zu "Feature Flags" → "New Feature Flag" -2. Erstelle ein neues Flag, z.B. `hero-cta-test` -3. Konfiguriere die Varianten: - - Control: Default (kein Wert) - - Variant B: `variant-b` -4. Setze die Rollout-Percentage (z.B. 50/50) - -### Im Code implementieren - -#### Option 1: Fertige Experiment-Komponente nutzen -```astro ---- -import HeroCtaExperiment from '../components/experiments/HeroCtaExperiment.astro'; ---- - - -``` - -#### Option 2: Custom Implementation -```astro -
- -
- - -``` - -## 3. Verfügbare Utilities - -### `getExperiment(key)` -Holt die aktuelle Variante für einen Test: -```javascript -const variant = await getExperiment('hero-cta-test'); -// Returns: null | 'control' | 'variant-b' | ... -``` - -### `trackEvent(name, properties)` -Trackt ein Custom Event: -```javascript -trackEvent('button_clicked', { - button_id: 'download-cta', - page: 'home' -}); -``` - -### `trackExperimentConversion(experiment, type)` -Trackt eine Conversion für einen A/B-Test: -```javascript -trackExperimentConversion('hero-cta-test', 'download_click'); -``` - -### `applyExperimentClasses(elementId, experimentKey, variantClasses)` -Wendet CSS-Klassen basierend auf der Variante an: -```javascript -applyExperimentClasses('hero-section', 'hero-test', { - 'control': 'bg-blue-500', - 'variant-b': 'bg-green-500' -}); -``` - -## 4. Best Practices - -### Performance -- PostHog lädt nur nach Cookie-Consent -- Script ist asynchron und blockiert nicht -- Feature Flags werden gecached - -### GDPR-Compliance -- Analytics nur mit expliziter Zustimmung -- EU-Server verwenden -- `person_profiles: 'identified_only'` für anonyme Nutzer - -### Testing-Strategie -1. **Start klein**: Beginne mit unkritischen Elementen -2. **Messe richtig**: Definiere klare Success-Metriken -3. **Dokumentiere**: Halte Tests und Ergebnisse fest -4. **Iteriere**: Nutze Learnings für neue Tests - -## 5. Geplante A/B-Tests - -### Phase 1 (Sofort möglich) -- **Hero CTA**: "App herunterladen" vs. "Kostenlos testen" -- **Download Button Position**: Rechts vs. Links in Navigation -- **Testimonial Position**: Oben vs. Unten auf Homepage - -### Phase 2 (Nach ersten Learnings) -- **Pricing Layout**: Grid vs. Tabelle -- **Feature-Reihenfolge**: Verschiedene Priorisierungen -- **Formulare**: Anzahl der Felder reduzieren - -## 6. Monitoring & Analyse - -### PostHog Dashboard -- **Experiments**: Übersicht aller laufenden Tests -- **Feature Flags**: Status und Rollout-Percentage -- **Insights**: Custom Dashboards für Conversions - -### Wichtige Metriken -- Conversion Rate (Download-Klicks) -- Bounce Rate pro Variante -- Time on Page -- Scroll-Tiefe - -## 7. Troubleshooting - -### PostHog lädt nicht -1. Prüfe Cookie-Consent Status -2. Checke Browser-Konsole für Fehler -3. Verifiziere API-Key in `.env` - -### Feature Flag gibt null zurück -1. Stelle sicher, dass PostHog geladen ist -2. Prüfe Flag-Name (Case-sensitive!) -3. Checke Rollout-Settings im Dashboard - -### Events werden nicht getrackt -1. Öffne Network-Tab und suche nach `posthog.com/e/` -2. Prüfe, ob `autocapture: false` gesetzt ist -3. Nutze `posthog.debug()` für Details - -## 8. Migration von Plausible - -Aktuell laufen Plausible und PostHog parallel. Nach 2-4 Wochen: - -1. Vergleiche Metriken beider Tools -2. Stelle sicher, dass PostHog alle benötigten Daten erfasst -3. Entferne Plausible-Komponente -4. Update Cookie-Consent Beschreibung -5. Entferne Plausible DNS-Prefetch - -## Support - -Bei Fragen oder Problemen: -- PostHog Docs: https://posthog.com/docs -- Astro + PostHog: https://posthog.com/tutorials/astro-ab-tests \ No newline at end of file diff --git a/apps/memoro/apps/landing/README.md b/apps/memoro/apps/landing/README.md deleted file mode 100644 index ff19a3e7e..000000000 --- a/apps/memoro/apps/landing/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# Astro Starter Kit: Basics - -```sh -npm create astro@latest -- --template basics -``` - -[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics) -[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics) -[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json) - -> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! - -![just-the-basics](https://github.com/withastro/astro/assets/2244813/a0a5533c-a856-4198-8470-2d67b1d7c554) - -## 🚀 Project Structure - -Inside of your Astro project, you'll see the following folders and files: - -```text -/ -├── public/ -│ └── favicon.svg -├── src/ -│ ├── layouts/ -│ │ └── Layout.astro -│ └── pages/ -│ └── index.astro -└── package.json -``` - -To learn more about the folder structure of an Astro project, refer to [our guide on project structure](https://docs.astro.build/en/basics/project-structure/). - -## 🧞 Commands - -All commands are run from the root of the project, from a terminal: - -| Command | Action | -| :------------------------ | :----------------------------------------------- | -| `npm install` | Installs dependencies | -| `npm run dev` | Starts local dev server at `localhost:4321` | -| `npm run build` | Build your production site to `./dist/` | -| `npm run preview` | Preview your build locally, before deploying | -| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | -| `npm run astro -- --help` | Get help using the Astro CLI | - -## 👀 Want to learn more? - -Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). diff --git a/apps/memoro/apps/landing/astro.config.mjs b/apps/memoro/apps/landing/astro.config.mjs deleted file mode 100644 index 3b6c88fe5..000000000 --- a/apps/memoro/apps/landing/astro.config.mjs +++ /dev/null @@ -1,48 +0,0 @@ -import { defineConfig } from 'astro/config'; -import mdx from '@astrojs/mdx'; -import tailwind from '@astrojs/tailwind'; -import sitemap from '@astrojs/sitemap'; -import icon from 'astro-icon'; - -// https://astro.build/config -export default defineConfig({ - image: { - service: { - entrypoint: 'astro/assets/services/sharp', - config: { - limitInputPixels: false, - }, - }, - domains: [], - remotePatterns: [], - }, - integrations: [ - mdx(), - tailwind(), - sitemap({ - i18n: { - defaultLocale: 'de', - locales: { - de: 'de-DE', - en: 'en-US' - } - } - }), - icon({ - include: { - mdi: ["*"] - } - }) - ], - contentCollections: true, - site: 'https://memoro.ai', - output: 'static', - i18n: { - locales: ['de', 'en'], - defaultLocale: 'de', - routing: { - prefixDefaultLocale: true, - redirectToDefaultLocale: false - } - } -}); diff --git a/apps/memoro/apps/landing/context/CopyWritingGuidelines.md b/apps/memoro/apps/landing/context/CopyWritingGuidelines.md deleted file mode 100644 index 9be8ba2c4..000000000 --- a/apps/memoro/apps/landing/context/CopyWritingGuidelines.md +++ /dev/null @@ -1,15 +0,0 @@ -Texte High Level - -Du bist eine begabte Werbetexterin und Copywriterin. -Du hilfst dabei anhand von diesen Guidelines einen Text umzuschreiben: - -Memoro Text Guidelines -Die 8 Prinzipien unserer Stimme: -Wir reden nicht um den heißen Brei herum. Wir nutzen kurze, klare, prägnante Sätze. -Wir informieren, und wollen helfen, nichts bewerben oder verkaufen. Mehrwert schaffen wir mit unserer Applikation. -Wir versuchen auf Du oder Sie zu verzichten, mehr wie ein Pressetext zu klingen. -Wir ziehen Vergleiche zu Memoro (Einer App die Gespräche aufzeichnet, aufschreibt und passend zusammenfasst, eine Wissenbibliothek und ein ständiger Assistent, der im Hintergrund bleibt und Zeit schafft und einem den Rücken freihält, die Brandfarbe ist Gelb (wie ein Gedanke) und die Formen sind fließend und rund) -Wir wollen andere mit unseren Gedanken anstecken und sie zum ausprobieren bewegen, Inspiration schaffen. -Wir wollen Partizipation fördern und andere an unserer Entwicklung teilhaben lassen und ihre Ideen und Funktion Wünsche, um für sie das beste Produkt bauen zu können. -Wir wollen Engaging mit unserem Publikum kommunizieren. Nutzen das AIDA Framework (Attention, Intrest, Desire, Action) im Aufbau unserer Texte. -Wir wollen das alle Nutzer alles verstehen, also kommunizieren wir in einfache Sprache: Statt DSGVO konform, sage lieber alle Daten werden sicher in Deutschland gespeichert. Wir reden auch nicht über KI, sondern über die besten Ohren, das intelligente mitschreiben und zusammenfassen etc. Ausserdem nutzen wir keine Worte wie revolutionierend oder ähnliches, wir sind bodenständig und ziehen lieber einen lustigen Vergleich. diff --git a/apps/memoro/apps/landing/context/ImagePrompts.md b/apps/memoro/apps/landing/context/ImagePrompts.md deleted file mode 100644 index 959a882f5..000000000 --- a/apps/memoro/apps/landing/context/ImagePrompts.md +++ /dev/null @@ -1,80 +0,0 @@ -# Image Prompts für Blog-Artikel - -Diese Datei enthält bewährte Prompt-Vorlagen für die Generierung von Blog-Bildern. - -## Blog-Header Icons/Symbole - -### Minimale geometrische Symbole (mit transparentem Hintergrund) - -**Vorlage für Kommunikation/KI-Themen:** -``` -Minimal geometric icon design on transparent background. Two interlocking shapes: a rounded speech bubble (gradient from coral to orange) flowing into a crystalline hexagon (gradient from electric blue to purple). The shapes overlap in the center creating a small overlapping area in vibrant green. Clean vector style, no shadows, no background. Flat design with subtle gradients. Symbol represents human-AI communication. Centered composition, perfect for web use. -``` - -**Verwendung:** Prompt Engineering, KI-Kommunikation, Chat-Themen - ---- - -### Variationen für andere Themen - -**Für Produktivitäts-Themen:** -``` -Minimal geometric icon design on transparent background. Three overlapping circles forming a Venn diagram. Left circle: orange gradient. Right circle: blue gradient. Bottom circle: purple gradient. Where all three overlap in the center: bright teal. Clean, minimal, flat design. No text, no decoration. Modern tech logo style. -``` - -**Für Transformation/Workflow-Themen:** -``` -Minimalist vector symbol on transparent background: Single flowing arrow that transforms from organic curved line (warm orange gradient) to geometric angular shape (cool blue-purple gradient). The transformation happens in the middle with a smooth color transition. Ultra simple, modern icon design. No background, clean edges. -``` - ---- - -## Anpassungshinweise - -- **Farben:** Hauptgradients können angepasst werden (orange/coral → blue/purple ist bewährt) -- **Form:** Grundformen können variiert werden (Kreise, Hexagone, Pfeile, etc.) -- **Stil:** Immer "minimal", "clean", "flat design", "no shadows", "transparent background" -- **Format:** Optimal für Web-Verwendung, zentrierte Komposition - -## Bewährte Farbkombinationen - -1. **Warm → Cool:** Orange/Coral → Blue/Purple -2. **Energie:** Yellow/Orange → Red/Pink -3. **Natur:** Green/Teal → Blue/Purple -4. **Professional:** Gray/Silver → Blue/Navy - -## Technische Spezifikationen - -- Format: PNG mit transparentem Hintergrund -- Stil: Flat Design, Vektor-ähnlich -- Schatten: Keine -- Text: Keiner -- Komposition: Zentriert -- Verwendung: Blog-Header, Icon-Elemente - ---- - -## Neue Prompts für "KI als persönlicher Assistent" - -### Option 1: Automatisierung-Symbol -``` -Minimal geometric icon design on transparent background. Two interlocking gears: left gear organic and rounded (gradient from warm orange to coral), right gear precise and angular (gradient from electric blue to purple). Small floating elements around them representing automated tasks (tiny circles and triangles in teal). Clean vector style, no shadows, no background. Flat design with subtle gradients. Symbol represents automation and AI assistance. Centered composition, perfect for web use. -``` - -### Option 2: Zeit-Effizienz-Symbol -``` -Minimalist vector symbol on transparent background: Clock face transforming into flowing energy streams. Clock portion: gradient from orange to yellow. Energy streams: gradient from blue to purple, flowing outward in elegant curves. Small productivity icons (tiny checklist, envelope, document) floating in the streams in vibrant green. Ultra simple, modern icon design. No background, clean edges. -``` - -### Option 3: Assistent-Verbindung-Symbol -``` -Simple vector icon on transparent background: Central hub (hexagon in blue-purple gradient) connected to four smaller circles representing different tasks. Connections: flowing lines in orange gradient. Each circle different color: orange (meetings), teal (emails), purple (documents), green (tasks). Clean, minimal, flat design. No text, no decoration. Modern tech assistance logo style. -``` - ---- - -## Prompt für "KI-gestützte Entscheidungsfindung" - -``` -Minimal geometric icon design on transparent background. Decision tree visualization: Central diamond shape (gradient from coral to orange) with three branching paths flowing outward. Each path ends in a different geometric shape representing options: circle (blue gradient), triangle (purple gradient), square (teal gradient). The paths are elegant curved lines with subtle glow. Small analytical elements floating around (tiny data points, mini charts) in soft green. Clean vector style, no shadows, no background. Flat design with subtle gradients. Symbol represents AI-supported decision making. Centered composition, perfect for web use. -``` \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/Memoro-Features.md b/apps/memoro/apps/landing/context/Memoro-Features.md deleted file mode 100644 index 3d60a1ca9..000000000 --- a/apps/memoro/apps/landing/context/Memoro-Features.md +++ /dev/null @@ -1,170 +0,0 @@ -Recording Features -Feature: Perfektes Gehör -Beschreibung: Ein Klick genügt - Memoro hört aufmerksam zu und erfasst jedes Detail deiner Gespräche. -Hauptfunktionen: -Ein-Klick Aufnahme: Memoro ist sofort einsatzbereit, nach Tippen auf den großen runden Aufnahmeknopf. -Intelligentes Hören: Erkennt bis zu 15 verschiedene Sprecher in über 80 Sprachen und Dialekten. -Flexible Aufnahme: Nimm die verschiedensten Gespräche auf: Meetings & Konferenzen, Persönliche Notizen, Interviews & Vorträge, Dokumentation, Beratung -Zuverlässige Technik: Memoro ist komplett Offline-fähig. Jede Aufnahme wird auf deinem Gerät gespeichert und kann aus dem Audioarchiv erneut hochgeladen werden, wenn wieder mit dem Internet verbunden. -Bleibt im Hintergrund: Memoro ist sehr batterie-effizient. Du kannst dein Gerät auch sperren, oder die App wechseln, Memoro bleibt aktiv, ohne abzulenken. -Optionale Standortspeicherung: Wenn in den Einstellungen aktiviert wird, wird zusätzlich automatisch der Standort beim Beenden der Memo gespeichert. Dieser kann dann auf der Karte angesehen werden. - -Feature: Aufnahme Sprachen -Beschreibung: Über 80 Sprachen und Dialekte mit automatischer Erkennung. -Hauptfunktionen: -Automatische Spracherkennung: Memoro erkennt automatisch die gesprochene Sprache, aus über 80 verschiedenen Sprachen und Dialekten. -20 Express-Sprachen: Diese Sprachen können in wenigen Sekunden verarbeitet werden und stehen fast unmittelbar zur Verfügung. Wird verwendet bei Aufnahmen bis zu 40 Minuten. Unterstützte Sprachen: Deutsch, Englisch, Französisch, Spanisch, Italienisch, Niederländisch, Polnisch, Schwedisch, Russisch, Portugiesisch, Arabisch, Hindi, Chinesisch, Japanisch, Koreanisch. -80+ Spachen: Mit 60+ Sprachen mit Standard-Transkription (diese braucht mehrere Minuten zur Verarbeitung). Memoro bietet die schnellste und qualitativ hochwertigste, DSGVO konforme Transkription auf dem Markt. -Dialekt-Erkennung: Memoro unterstützt verschiedene Dialekte, um eine möglichst gute Translationsqualität zu gewährleisten. Diese Varianten werden unterstützt: Regionales Deutsch (Deutschland, Österreich, Schweiz), Englisch-Varianten (USA, UK, Australien, Indien), Spanisch-Dialekte (Spanien, Mexiko, Argentinien, Kolumbien), Chinesische Varianten (Mandarin, Kantonesisch, Taiwanesisch) -Mehrsprachige Meetings: Automatischer Sprachenwechsel während der Aufnahme mit mehreren Sprachen, Sprechererkennung behält Sprachzuordnung bei, auch in unterschiedlichen Sprachen. -Spezialisierte Unterstützung: Memoro versteht die verschiedensten Fachsprachen: Medizinische Terminologie, Technisches Vokabular, Juristische Fachsprache, und viele mehr, je nach gewähltem Aufnahme-Blueprint. - -Feature: Audio-Archiv -Beschreibung: Ihre persönliche Audioarchiv - alle Aufnahmen sicher gespeichert und jederzeit verfügbar -Hauptfunktionen: -Vollständiger Überblick über alle lokal gespeicherten Aufnahmen -Detaillierte Statistiken über Länge und Dateigröße der Aufnahmen -Einfaches exportieren der Audioaufnahmen, einfach über den Teilen Button im Audioplayer -Hilfreich für Vielnutzer, Projektmanager, Compliance - - -Feature: Recording Blueprints (Aufnahme Vorlagen) -Beschreibung: Vordefinierte Aufnahmevorlagen für perfekt strukturierte Ergebnisse -Hauptfunktionen: -Etliche Vorlagen für die verschiedensten Anwendungsfälle -Vorlagen für verschiedene Branchen: Von Bildung an Universitäten oder Schulen und Kindergärten, über Pflegedokumentation an Krankenhäusern oder Altersheimen, zu Baubesprechungen von Handwerkern oder Architekten, bis zur Dokumentation von Familiengeschichten. Und etliche weitere spezialisierte Vorlagen und Industrien. Psst: Bald können auch eigene Blueprints erstellt werden. -Feedback Funktion an Memoro, um den Blueprint zu verbessern. - -Feature: Audio Upload -Beschreibung: Lade deine Aufnahmen hoch und lass sie automatisch analysieren -Hauptfunktionen: -MP3, WAV und M4A Formate unterstützt -Unbegrenzte Aufnahmelänge -Automatische Transkription -Einstellungen für Datum, Uhrzeit, Sprache und Vorlagen -Sofortige KI-Analyse -Verschlüsselte Übertragung -Sichere Cloud-Speicherung -Organization Features -Feature: Memories -Beschreibung: Entdecke die verschiedenen Analysen, die Memoro von deinen Gesprächen erstellt -Hauptfunktionen: -Explorative Memories: Erkenntnisse: Wichtige Punkte chronologisch zusammengefasst, Zusammenfassung: Automatische Formatierung als Protokoll, Vortrag oder Formular, Artikel: Strukturierte Aufbereitung der Inhalte -Exekutive Memories: Aufgaben: Erfasst Verantwortliche, Deadlines und Status, Termine: Sammelt Datum, Ort und Beschreibung - - -Feature: Tags zur Organisation -Beschreibung: Sortiere und finde deine Gespräche blitzschnell mit Tags und intelligentem Filter -Hauptfunktionen: -Tag-System mit flexibler Kategorisierung -Eigene Namen, Farbe und Emojis vergeben -Verschiedene Anwendungsfälle für Tags, zum Beispiel für Status Tracking wie “Offen” und “Erledigt”, oder für Themenschwerpunkte wie “Technologie” und “Sport”, oder für Arten von Gesprächen oder Gesprächspartnern. -Mehrere Tags pro Memo: Baue dein eigenes Memo Organisationssystem, und filtere es dynamisch auf der Memos Seite - -Feature: Memo-Kombination -Beschreibung: Füge mehrere Memos zu einem umfassenden Dokument zusammen -Hauptfunktionen: -Mehrere Memos in einer neuen Memo kombinieren -Perfekt für mehrteilige Meetings, Geschichten, oder Sammlungen von Informationen. -Stelle deiner kombinierten Memo Fragen oder erstelle neue Memories. - -Feature: Mehrsprachig auf allen Ebenen -Memoro unterstützt 24 Sprachen und zwei Dialekte für eine globale Kommunikation -Unterstützte Sprachen: -Europäische Sprachen: Deutsch, Englisch, Französisch, Spanisch, Italienisch, Portugiesisch, Niederländisch, Schwedisch, Polnisch -Osteuropäische: Russisch, Ukrainisch, Tschechisch -Asiatische Sprachen: Hindi, Chinesisch (Mandarin), Japanisch, Koreanisch, Vietnamesisch -Nahost & Afrika: Arabisch, Türkisch, Hebräisch - -Feature: Übersetzen -Beschreibung: Überwinde Sprachbarrieren mit automatischer Übersetzung in 24 Sprachen -Hauptfunktionen: -Automatische Übersetzung in 24 Sprachen -Zweisprachige Ansicht -Erhalt des ursprünglichen Kontexts -Erkennt Fachbegriffe -Berücksichtigt kulturelle Nuancen -Sharing Features -Feature: Memos teilen -Beschreibung: Teile deine Gespräche nahtlos über alle deine Apps -Hauptfunktionen: -Teile deine Memo direkt über alle gängigen Kanäle wie Mail, Whatsapp, Telegram oder kopiere sie in ein Dokument -Nutze die Webapp unter web.memoro.ai um deine Inhalte schnell auf dem Computer oder anderen Geräten aufzurufen. -Schnelles kopieren des Transkriptes -Feature in Arbeit: Teilen von Memos in Memoro - gemeinsames Bearbeiten und erweitern der Memo - -Customization Features -Feature: Mana Credits System -Beschreibung: Flexibles KI-Credit-System für jeden Bedarf - -Vorteile: -- Fair: Zahlen Sie nur für das, was Sie nutzen -- Skalierbar: Verschiedene Pakete für jeden Bedarf -- Transparent: Klare Kostenübersicht -- Flexibel: Monatlich oder jährlich, plus Einmalkäufe -- 33% Rabatt bei Jahresabonnements - -Mana-Kosten für Memoro: -- Aufnahme/Transkription: 2 Mana pro Minute (mindestens 10 Mana) -- Frage an Memo stellen: 5 Mana pro Frage -- Neue Memory erstellen: 5 Mana -- Blueprint anwenden: 5 Mana -- Memos kombinieren: 5 Mana pro kombiniertes Memo - -Mana-Abonnements: -Mana Tropfen (Kostenlos) - 0 € / Monat: -- 150 Mana Startguthaben -- 5 Mana täglich (max. 150 Mana Guthaben) -- Perfekt zum Ausprobieren - -Mana Fluss - 5,99 € / Monat (47,99 € / Jahr): -- 600 Mana Startguthaben -- 20 Mana täglich (max. 1.200 Mana Guthaben) -- Mana verschenken möglich - -Mana Strom - 14,99 € / Monat (119,99 € / Jahr): -- 1.500 Mana Startguthaben -- 50 Mana täglich (max. 3.000 Mana Guthaben) -- Mana verschenken möglich - -Mana See - 29,99 € / Monat (239,99 € / Jahr): -- 3.000 Mana Startguthaben -- 100 Mana täglich (max. 6.000 Mana Guthaben) -- Mana verschenken möglich - -Mana Meer - 49,99 € / Monat (399,99 € / Jahr): -- 5.000 Mana Startguthaben -- 200 Mana täglich (max. 10.000 Mana Guthaben) -- Mana verschenken möglich - -Mana-Pakete (Einmalkauf): -- Kleiner Mana Trank: 350 Mana für 4,99 € -- Mittlerer Mana Trank: 700 Mana für 9,99 € -- Großer Mana Trank: 1.400 Mana für 19,99 € -- Riesiger Mana Trank: 2.800 Mana für 39,99 € - -Feature: Memoro anpassen -Beschreibung: Passen Sie Memoro perfekt an Ihre Bedürfnisse an -Anpassungsoptionen: -Erscheinungsbild: Dunkel & Hell Modus -Anzeigeelemente Aufnahme Seite: Ein und ausblenden von verschiedenen Elementen auf der Aufnahmeseite -Oberflächensprache (48 verschiedene), Aufnahme Sprache (82 verschiedene Sprachen), Übersetzungssprachen (57 verschiedene Sprachen zum Übersetzen) -Datenschutz & Sicherheit: Standortspeicherung opt-in, Analysedaten opt-out - -Feature: Branchenspezifische Anpassung -Beschreibung: Maßgeschneiderte Lösungen für deine Branche mit spezialisierten Vorlagen und Integrationen -Hauptfunktionen: -Spezialisierte Vorlagen für verschiedene Branchen -Systemintegration mit APIs -Individuelle Anpassungen -Spezielle Compliance Lösungen -Branchenlösungen für: Gesundheitswesen, Rechtsberatung, Finanzdienstleistungen, Bildung, Consulting, Immobilien, IT & Software - -Analytics Features -Feature: Detaillierte Statistiken -Beschreibung: Umfassende Einblicke in Ihre Produktivität und Nutzungsmuster -Statistik-Features: -Memos-Metriken: Gesamtanzahl, Länge, Wortanzahl, Trends, etc -Aufnahmedauer-Analysen: Gesamtzeit, Durchschnittliche Länge, etc -Wörter-Statistiken: Gesamtwortanzahl, Wörter pro Memo, etc -Erweiterte Analysen: Zeitverteilung, Tag-Analyse, Produktivitätsmuster, etc \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/Memoro.md b/apps/memoro/apps/landing/context/Memoro.md deleted file mode 100644 index 7df935b56..000000000 --- a/apps/memoro/apps/landing/context/Memoro.md +++ /dev/null @@ -1,301 +0,0 @@ -# Das ist Memoro - -# Memoro App: Revolutionierung der Gesprächsdokumentation und Gedankenerfassung - -## 1\. Einführung - -Memoro ist eine innovative mobile Anwendung, die darauf abzielt, die Art und Weise, wie Menschen Gespräche dokumentieren und Gedanken festhalten, zu revolutionieren. Entwickelt als Antwort auf die Herausforderungen des manuellen Mitschreibens und der Protokollführung, bietet Memoro eine intuitive Lösung für die automatisierte Erfassung, Transkription und Zusammenfassung von gesprochenen Inhalten. - -## 2\. Hauptfunktionen - -- **Aufnahme**: Ein zentraler Aufnahmeknopf ermöglicht das einfache Starten und Beenden von Aufnahmen. -- **Transkription**: Memoro transkribiert das Gesprochene Wort für Wort und erkennt dabei verschiedene Sprecher. -- **Zusammenfassung**: Die App fasst den Inhalt automatisch zusammen und extrahiert wichtige Informationen wie Aufgaben, Termine und Erkenntnisse. -- **Mehrsprachigkeit**: Unterstützung von 82 Sprachen bei der Aufnahme und Transkription. 56 Sprachen für die Übersetzung und 48 Sprachen für die App Oberfläche. - -## 3\. Besondere Merkmale - -- **Einfache Bedienung**: Die App ist intuitiv gestaltet und erfordert minimales Onboarding. -- **Sprachbarrieren überwinden**: Memoro unterstützt die Integration ausländischer Fachkräfte durch mehrsprachige Funktionen. -- **Fokus auf Face-to-Face-Gespräche**: Optimiert für persönliche Interaktionen und Gedankenerfassung. -- **Branchenspezifische Modi**: Anpassbare Modi für verschiedene Berufsgruppen und Anwendungsfälle. -- **Made in Germany**: Entwickelt nach höchsten Sicherheitsstandards mit Datenspeicherung in Deutschland. - -## 4\. Zielgruppen und Anwendungsfälle - -- **Studierende**: Vorlesungsmitschriften, Brainstorming für Abschlussarbeiten -- **Büroarbeiter**: Meetingprotokolle, E-Mail-Diktate -- **Handwerker**: Materiallisten, Baubesprechungen -- **Pflegekräfte**: Maßnahmenplanung, Dokumentation -- **Marketingexperten**: Interviewführung und \-analyse -- **Kreative**: Ideensammlung und Selbstreflexion - -## 5\. Technische Details - -- **Plattformen**: iOS (Apple App Store) und Android (Google Play Store) - - **iOS App**: https://apps.apple.com/de/app/memoro/id6451258411 - - **Android App**: https://play.google.com/store/apps/details?id=com.memo.beta -- **Desktop-Zugang**: Lesefunktion für aufgenommene Memos -- **Integrationen**: Einfache Übertragung in andere Anwendungen durch Textformat -- **Erklärvideos**: - - **Deutsch**: https://www.youtube.com/watch?v=YTVbhzPY9eI (21.02.2024) - - **Englisch**: https://www.youtube.com/watch?v=bqDx4_V-zZU (21.02.2024) - -## 6\. Preismodell - -- **Kostenlose Version**: 180 Minuten/Monat, max. 50 Minuten/Aufnahme, 22 Memos/Tag -- **Plus**: 9€/Monat (600 Minuten/Monat, 100 Minuten/Memo) -- **Pro**: 23€/Monat (1800 Minuten/Monat, 200 Minuten/Memo) -- **Ultra**: 42€/Monat (4800 Minuten/Monat, 300 Minuten/Memo) -- 20% Rabatt bei jährlicher Abrechnung -- Sonderkonditionen für Bildungseinrichtungen und gemeinnützige Organisationen - -## 7\. Datenschutz und Sicherheit - -- DSGVO- und GDPR-konform -- Daten werden ausschließlich in Deutschland gespeichert -- Ende-zu-Ende-Verschlüsselung bei der Übertragung -- Tägliche Backups -- Keine Weitergabe an Dritte -- On-Premise-Lösungen für Unternehmen verfügbar - -## 8\. Unternehmenswerte und Vision - -- Inklusivität und Barrierefreiheit -- Verbesserung der Kommunikation und des gegenseitigen Verständnisses -- Demokratisierung des Zugangs zu KI-gestützten Dokumentationstools -- Fokus auf Zeitersparnis und effizienteres Arbeiten - -## 9\. Erfolgsgeschichten und Statistiken - -- 800 aktive Nutzer, davon 100 wöchentliche Nutzer -- Geschätzte Zeitersparnis von 2-6 Stunden pro Woche je nach Branche -- Reduzierung der Dokumentationsarbeit um bis zu 75% -- Erfolgreiche Anwendung bei Abschlussarbeiten und Forschungsprojekten - -## 10\. Zukunftspläne und Entwicklung - -- Kontinuierliche Verbesserung der Analysen -- Entwicklung neuer branchenspezifischer Modi -- Enge Zusammenarbeit mit Nutzern zur Produktoptimierung -- Anpassung an individuelle Kundenwünsche - -## 11\. Kundenservice und Support - -- Direkte Unterstützung über [kontakt@memoro.ai](mailto:kontakt@memoro.ai) -- Ausführliche Online-Dokumentation -- Schnelle Reaktion auf Nutzerfeedback und \-probleme - -## 12\. Marketing und Kommunikation - -- **Kernbotschaften**: Freiheit, Sicherheit, Ruhe, Verständnis -- **Emotionale Assoziationen**: Konzentration auf den Moment, Überwindung von Sprachbarrieren, verbesserte Selbstreflexion -- **Terminologie**: - - "Memoro" \- die App - - "Memos" \- einzelne Aufnahmen oder Analysen - - "Memories" \- Analyseabschnitte (z.B. Erkenntnisse, Termine, Aufgaben) - -Memoro positioniert sich als unverzichtbares Tool für effiziente Kommunikation und Dokumentation in einer zunehmend globalisierten und schnelllebigen Arbeitswelt. Durch seine Benutzerfreundlichkeit, Mehrsprachigkeit und branchenübergreifende Anwendbarkeit hat Memoro das Potenzial, die Art und Weise, wie wir Informationen erfassen und verarbeiten, grundlegend zu verändern. - -Memoro Mehrwert: - -1. Definition und Bedeutung von Mehrwert: - - Mehrwert wird definiert als alle Vorteile und Nutzen, die zusätzlich zu einem Produkt oder einer Dienstleistung entstehen. Dies umfasst nicht nur die Funktionalität eines Produkts oder einer App, sondern auch alle damit verbundenen positiven Auswirkungen. - - Der Mehrwert ist entscheidend für Marketing, Vertrieb, Schaffung von Wettbewerbsvorteilen, Kundenbindung und Rentabilität. Ein Unternehmen, das den Mehrwert seiner Produkte und Dienstleistungen gut kennt und nutzt, kann erfolgreicher agieren. -2. Arten von Mehrwert: - - Mehrwert durch das Produkt selbst: Dies bezieht sich auf die grundlegenden Funktionen und Anwendungen eines Produkts oder einer App. Hier wurde diskutiert, wie ein Produkt spezifische Probleme löst und welche Vorteile es bietet. - - Mehrwert durch Prozesse rund um das Produkt: Dies umfasst die Vorteile, die durch die Nutzung des Produkts entstehen, sowie die Verbindungen und Prozesse, die dadurch optimiert werden. - - Mehrwert durch Personen im Unternehmen: Der Fokus lag auf den Kenntnissen, Erfahrungen und Fähigkeiten der Mitarbeiter, die sie in ihrem Bereich und möglicherweise auch außerhalb davon anbieten können. - - Mehrwert durch den entstehenden Profit für Kunden: Dies bezieht sich auf den finanziellen Gewinn, den Kunden durch die Nutzung eines Produkts erzielen, sowie andere Arten von Mehrwert, die nicht direkt monetär sind. -3. Nutzung und Ergebnisse von Mehrwert: - - Mehr Zeit für die eigentliche Arbeit: Durch die Nutzung des Produkts werden repetitiven und zeitaufwändigen Aufgaben reduziert, wodurch mehr Zeit für die Kernaufgaben bleibt. - - Weniger nervige Arbeit: Insbesondere das Führen von Protokollen wird erleichtert, was oft als unangenehme Pflicht empfunden wird. - - Weniger Missverständnisse und Stress in Gesprächen: Die Verfügbarkeit von Protokollen und Aufzeichnungen führt zu klareren Kommunikationen und weniger Missverständnissen. - - Unmittelbare Verfügbarkeit von Informationen: Protokolle und Aufzeichnungen stehen sofort zur Verfügung, was die Effizienz und Transparenz verbessert. - - Verbesserte Qualität der Arbeit: Durch detailliertere und spezifischere Dokumentationen wird die Arbeitsqualität gesteigert. -4. Erfahrungen und Wissen im Unternehmen: - - Breites Wissen in kreativem Design: Das Unternehmen verfügt über umfangreiche Kenntnisse in Bereichen wie Brand Design, Grafikdesign, UX/UI-Design, Film, Musik und Licht. - - Rapid Prototyping: Die Fähigkeit, schnell Prototypen zu erstellen und zu testen, wurde als eine der Kernkompetenzen hervorgehoben. - - KI-Kompetenzen: Das Unternehmen hat tiefgehende Erfahrungen in der Anwendung und Entwicklung von Künstlicher Intelligenz und weiß, welche Technologien zukunftsträchtig sind und welche vermieden werden sollten. - - Kundennähe und proaktive Zusammenarbeit: Eine enge Zusammenarbeit mit Kunden und die Fähigkeit, sich schnell auf deren Bedürfnisse einzustellen, wurden als besondere Stärken genannt. - - Marktkenntnis: Das Unternehmen kennt den deutschen und Schweizer Markt gut und kann seine Produkte entsprechend anpassen. -5. Vermittlung der Expertise: - - Demos und Workshops: Die Durchführung von Demonstrationen und Workshops, um die Funktionalität und Vorteile des Produkts zu zeigen. - - Nutzung der App als Beispiel: Die App selbst dient als lebendiges Beispiel für die eigenen Kompetenzen. - - Networking und Veranstaltungen: Teilnahme an und Organisation von Events wie Hackathons zur Förderung von Kollaborationen und Innovationsaustausch. - - Webseite und Social Media: Nutzung von Blogs, LinkedIn und anderen Plattformen, um Wissen und Updates zu teilen. -6. Emotionale Aspekte der Nutzung: - - Erleichterung und Sicherheit: Nutzer fühlen sich erleichtert und sicher, da sie wissen, dass wichtige Informationen aufgezeichnet und zugänglich sind. - - Selbstbestimmtheit und Selbstwertgefühl: Die App stärkt das Selbstvertrauen und das Gefühl der Selbstbestimmtheit, da Nutzer ihre Gedanken und Ideen festhalten können. - - Gemeinschaftsgefühl: Die Möglichkeit, Wissen und Informationen zu teilen, fördert ein Gefühl der Verbundenheit und Zusammenarbeit. - - Vorfreude und Motivation: Nutzer freuen sich auf regelmäßige Updates und Verbesserungen, die die App noch nützlicher machen. - - Professionelle Unterstützung: Die App wird als professionelles Tool wahrgenommen, das im Alltag eine wertvolle Unterstützung bietet. - - Ermöglichung und Empowerment: Insbesondere für Nutzer mit sprachlichen oder technischen Einschränkungen bietet die App die Möglichkeit, sich besser auszudrücken und einzubringen. - - Gelassenheit und Ausgeglichenheit: Die Nutzung der App trägt zu einem Gefühl der Ruhe und Ausgeglichenheit bei, da Nutzer wissen, dass wichtige Informationen sicher gespeichert sind. - - Aktivierung und Entdeckungslust: Die Möglichkeit, jederzeit Gedanken und Ideen festzuhalten, motiviert die Nutzer, aktiv zu bleiben und Neues zu entdecken. - -# Das Memoro Team - -Unser Team besteht aus erfahrenen Experten aus den Bereichen künstliche Intelligenz, Softwareentwicklung, Datensicherheit und Branchenspezialisten. Gemeinsam arbeitet das Team daran, Memoro kontinuierlich zu verbessern und an die Bedürfnisse der Kunden anzupassen. - -## Till Schneider - -Till Schneider bringt als erfahrener Filmemacher und Mediendesigner eine Fülle von Kreativität und technischem Know-how in das Memoro-Team ein. Mit über einem Jahrzehnt Erfahrung in der digitalen Medienproduktion hat Till eine beeindruckende Karriere aufgebaut, die ihn optimal für seine Rolle bei Memoro qualifiziert. - -Tills Expertise erstreckt sich über ein breites Spektrum der digitalen Medienlandschaft. Seine Leidenschaft für innovative Technologien und interaktive Medien spiegelt sich in seiner Arbeit wider. Er hat maßgeblich an der Entwicklung eines interaktiven Film-Tools mitgewirkt, was seine Fähigkeit zur Konzeption und Umsetzung komplexer digitaler Projekte unter Beweis stellt. Diese Erfahrung ist besonders wertvoll für die kontinuierliche Verbesserung und Erweiterung der Memoro-App. - -In seiner Karriere hat Till über 80 selbständige Filmproduktionen realisiert, darunter Projekte für namhafte Unternehmen und öffentliche Einrichtungen. Diese Vielseitigkeit in der Projektarbeit hat sein Verständnis für unterschiedliche Kundenbedürfnisse geschärft – eine Fähigkeit, die bei der Weiterentwicklung von Memoro von unschätzbarem Wert ist. Seine Erfahrung in der Kundenbetreuung und \-beratung ermöglicht es dem Team, die Anforderungen der Nutzer besser zu verstehen und in die Produktentwicklung einfließen zu lassen. - -Tills akademischer Hintergrund in Mediendesign, mit Schwerpunkten in UX/UI Design, Bewegtbild und interaktiven Medien, bildet eine solide Grundlage für die Gestaltung benutzerfreundlicher und ansprechender Interfaces. Seine Bachelorarbeit, die sich mit der Gestaltung einer Lernplattform befasste, zeigt sein Interesse an der Entwicklung von Tools, die das Lernen und die Informationsverarbeitung erleichtern – ein Kernaspekt der Mission von Memoro. - -Als ehemaliger Geschäftsführer eines kleinen Teams bringt Till wertvolle Führungserfahrung mit. Er versteht die Herausforderungen der Teamkoordination und Projektleitung, was für die agile Entwicklung und das Wachstum von Memoro von großer Bedeutung ist. Seine Fähigkeit, komplexe Projekte von der Konzeption bis zur Umsetzung zu begleiten, trägt wesentlich zur effizienten Realisierung der Unternehmensziele bei. - -Tills technische Fähigkeiten umfassen den professionellen Umgang mit verschiedenen Kamerasystemen, fortgeschrittene Kenntnisse in der Postproduktion von Film und Fotografie sowie Expertise in Branding und Corporate Design. Diese vielseitigen Kompetenzen ermöglichen es ihm, bei Memoro in verschiedenen Bereichen wertvolle Beiträge zu leisten, von der visuellen Gestaltung der App bis hin zur Erstellung von Marketingmaterialien. - -Mit seiner Kombination aus kreativer Vision, technischem Fachwissen und Führungserfahrung ist Till Schneider eine treibende Kraft hinter der Innovation bei Memoro. Seine Fähigkeit, komplexe Ideen in benutzerfreundliche Lösungen zu übersetzen, macht ihn zu einem unverzichtbaren Mitglied des Teams, das kontinuierlich daran arbeitet, die Memoro-App zu verbessern und an die sich wandelnden Bedürfnisse der Nutzer anzupassen. - -## Tobias Müller - -Tobias Müller bringt als Full-Stack-Entwickler eine beeindruckende Bandbreite an technischen Fähigkeiten und Projekterfahrungen in das Memoro-Team ein. Mit seinem Hintergrund in Software Engineering und seiner Expertise in modernen Web-Technologien ist er bestens gerüstet, um die technische Entwicklung und Innovation bei Memoro voranzutreiben. - -Tobias' Fachkenntnisse umfassen ein breites Spektrum an Programmiersprachen und Frameworks, mit besonderem Fokus auf JavaScript-basierte Technologien wie React.js, Vue.js und Node.js. Diese Expertise ist von unschätzbarem Wert für die Weiterentwicklung und Optimierung der Memoro-App, insbesondere im Hinblick auf Benutzerfreundlichkeit und Leistungsfähigkeit. Seine Erfahrung mit SQL- und NoSQL-Datenbanken ermöglicht es ihm, effiziente und skalierbare Datenlösungen für Memoro zu implementieren, was angesichts der Datenintensität der App von großer Bedeutung ist. - -In seiner bisherigen Laufbahn hat Tobias an einer Vielzahl anspruchsvoller Projekte mitgewirkt, die seine Fähigkeit zur Umsetzung komplexer Softwarelösungen unter Beweis stellen. Besonders hervorzuheben ist seine Erfahrung in der Entwicklung von KI-gesteuerten Assistenten und in der Konzeption neuer Software-Architekturen. Diese Kompetenzen sind für Memoro von großem Wert, da sie direkt zur Verbesserung der KI-gestützten Transkriptions- und Zusammenfassungsfunktionen der App beitragen können. - -Ein besonderer Mehrwert liegt in Tobias' Erfahrung mit Cloud-Technologien, insbesondere mit Azure und Google Cloud. Diese Expertise ist entscheidend für die Skalierbarkeit und Zuverlässigkeit der Memoro-Infrastruktur. Seine Kenntnisse in Bereichen wie CI/CD-Pipelines und Containerisierung mit Docker tragen dazu bei, die Entwicklungs- und Bereitstellungsprozesse bei Memoro zu optimieren und zu beschleunigen. - -Mit seiner Kombination aus technischer Expertise, Projekterfahrung und innovativem Denken ist Tobias Müller hervorragend positioniert, um wesentlich zur technologischen Weiterentwicklung von Memoro beizutragen. Seine Fähigkeit, komplexe technische Herausforderungen zu meistern und dabei stets den Nutzen für den Endanwender im Blick zu behalten, macht ihn zu einem wertvollen Mitglied des Memoro-Teams. - -# Aleksandra Vasileva - -Aleksandra Vasileva, die von allen Alex genannt wird, bringt eine einzigartige Kombination aus Marketing-Expertise und Medienerfahrung in das Memoro-Team ein. Mit ihrem Hintergrund in Internet und Online Marketing sowie ihrer praktischen Erfahrung in der TV-Produktion ist Alex bestens gerüstet, um Memoros Marktpräsenz zu stärken und die Nutzerkommunikation zu optimieren. - -Alex' Studium des Internet und Online Marketings an der Hochschule Ravensburg-Weingarten hat ihr ein solides Fundament in den Bereichen Social Media Marketing, Online Marketing und Projektmanagement im Marketing vermittelt. Diese Kenntnisse sind von unschätzbarem Wert für Memoro, insbesondere wenn es darum geht, die App einem breiteren Publikum zugänglich zu machen und die Nutzerbindung zu erhöhen. - -Ihre Erfahrung als Junior TV Production Manager bei Regio TV Bodensee hat Alex' Fähigkeiten in der Content-Erstellung und \-Organisation geschärft. Die Erstellung von Programmlisten und Sendungsinhalten sowie die Organisation von Online-Inhalten mit WordPress sind Kompetenzen, die direkt auf die Content-Strategie von Memoro übertragen werden können. Diese Fähigkeiten sind besonders wertvoll, um die Benutzeroberfläche der App intuitiv und informativ zu gestalten und regelmäßige Updates für die Nutzer zu planen. - -Während ihres Praktikums bei Bitzilla GmbH sammelte Alex wertvolle Erfahrungen in der Entwicklung und Umsetzung von Social Media Marketing Kampagnen. Ihre Fähigkeit, Events zu organisieren und Content-Marketing-Pläne zu erstellen, wird Memoro dabei helfen, eine kohärente und ansprechende Online-Präsenz aufzubauen. Die Erstellung von Social Media Inhalten, Beiträgen und Bildern ist eine Kompetenz, die für die Vermarktung von Memoro in verschiedenen digitalen Kanälen von großer Bedeutung ist. - -Alex' Verständnis für SEO und professionelles Schreiben für Websites, Apps und Blogs ist ein wesentlicher Vorteil für Memoro. Diese Fähigkeiten können genutzt werden, um die Sichtbarkeit der App in Suchmaschinen zu verbessern und ansprechende, informative Inhalte für potenzielle und bestehende Nutzer zu erstellen. - -Ihre Erfahrung in der Usability-Testbegleitung ist besonders wertvoll für Memoro. In Zusammenarbeit mit den Entwicklern kann Alex dazu beitragen, die Benutzerfreundlichkeit der App kontinuierlich zu verbessern und sicherzustellen, dass sie den Bedürfnissen und Erwartungen der Nutzer entspricht. - -Alex' mehrsprachige Fähigkeiten – sie spricht fließend Bulgarisch, Englisch und Deutsch – sind ein großer Vorteil für Memoro, insbesondere im Hinblick auf die internationale Ausrichtung und Expansion des Unternehmens. Ihre Fähigkeit, in verschiedenen Sprachen zu kommunizieren, kann dazu beitragen, Marketingmaterialien und Nutzerkommunikation für verschiedene Märkte zu lokalisieren und anzupassen. - -Ihre vielfältigen Interessen, die von Geschichte über Nachhaltigkeit bis hin zu Physik und Astrophysik reichen, verleihen Alex eine breite Perspektive, die bei der Entwicklung von Marketingstrategien für verschiedene Zielgruppen von Vorteil sein kann. Dies ist besonders relevant für Memoro, da die App in verschiedenen Bereichen und von unterschiedlichen Nutzergruppen eingesetzt werden kann. - -Mit ihrer Kombination aus theoretischem Wissen und praktischer Erfahrung im digitalen Marketing, gepaart mit ihren Fähigkeiten in der Medienproduktion, ist Alex hervorragend positioniert, um die Marketingbemühungen von Memoro zu leiten und zu optimieren. Ihre Kreativität, ihr technisches Verständnis und ihre kommunikativen Fähigkeiten machen sie zu einem wertvollen Mitglied des Teams, das wesentlich zur Steigerung der Bekanntheit und Attraktivität der Memoro-App beitragen kann. - -## Das Umfeld und die Community von Memoro - -# Unsere Zielgruppe - -# Datenschutz, Sicherheit und Infrastruktur - -## Einleitung - -Memoro, eine innovative App zur Gesprächsdokumentation und Gedankenerfassung, legt höchsten Wert auf Datenschutz und Sicherheit. Als in Deutschland entwickelte Anwendung erfüllt Memoro die strengsten Qualitäts- und Sicherheitsstandards. Dieses Dokument bietet einen umfassenden Überblick über die Datenschutzpraktiken, Sicherheitsmaßnahmen und die zugrunde liegende Infrastruktur von Memoro. - -## Datenschutz - -Memoro ist vollständig DSGVO- und GDPR-konform. Das Unternehmen hat strikte Datenschutzrichtlinien implementiert, um die Privatsphäre seiner Nutzer zu schützen. Alle personenbezogenen Daten werden mit größter Sorgfalt behandelt und ausschließlich für die vorgesehenen Zwecke verwendet. - -Folgende Datenschutzmaßnahmen sind bei Memoro implementiert: - -- Daten werden ausschließlich in Deutschland gespeichert, was eine hohe Datensicherheit und die Einhaltung strenger EU-Datenschutzgesetze gewährleistet. -- Es erfolgt keine Weitergabe von Nutzerdaten an Dritte, es sei denn, dies ist gesetzlich vorgeschrieben oder der Nutzer hat ausdrücklich zugestimmt. -- Nutzer haben volle Kontrolle über ihre Daten und können jederzeit Auskunft, Berichtigung oder Löschung ihrer personenbezogenen Daten verlangen. - -## Sicherheit - -Die Sicherheit der Nutzerdaten hat bei Memoro oberste Priorität. Das Unternehmen setzt modernste Sicherheitstechnologien ein, um die Integrität und Vertraulichkeit aller gespeicherten und übertragenen Daten zu gewährleisten. - -Zu den wichtigsten Sicherheitsmaßnahmen gehören: - -- Ende-zu-Ende-Verschlüsselung bei der Datenübertragung, um unbefugten Zugriff zu verhindern. -- Tägliche Backups aller Daten, um Datenverlust zu vermeiden und eine schnelle Wiederherstellung im Notfall zu ermöglichen. -- Strenge Zugriffskontrollen und Berechtigungsmanagement innerhalb des Unternehmens, um sicherzustellen, dass nur autorisiertes Personal Zugang zu sensiblen Daten hat. -- Regelmäßige Sicherheitsaudits und Penetrationstests, um potenzielle Schwachstellen frühzeitig zu erkennen und zu beheben. - -Für Unternehmen, die besonders hohe Sicherheitsanforderungen haben, bietet Memoro On-Premise-Lösungen an. Diese ermöglichen es Kunden, die Memoro-Infrastruktur in ihrer eigenen IT-Umgebung zu betreiben und so die volle Kontrolle über ihre Daten zu behalten. - -## Infrastruktur - -Die technische Infrastruktur von Memoro wurde sorgfältig konzipiert, um höchste Leistung, Skalierbarkeit und Sicherheit zu gewährleisten. Das Unternehmen nutzt eine Kombination aus eigenen Systemen und bewährten Cloud-Diensten, um eine zuverlässige und effiziente Plattform bereitzustellen. - -Kernelemente der Memoro-Infrastruktur sind: - -- Datenspeicherung: Memoro nutzt die Firebase Cloud (Google Cloud) für die Speicherung von Nutzerdaten, Eingaben, Abrechnungsdaten und Memos (einschließlich Transkripte und Zusammenfassungen). Die Datenbank-Server befinden sich in Frankfurt, Deutschland, was kurze Latenzzeiten für europäische Nutzer und die Einhaltung strenger EU-Datenschutzbestimmungen gewährleistet. - -- Audioverarbeitung: Für die Transkription von Audiodateien verwendet Memoro Azure Speech, das ebenfalls in Frankfurt gehostet wird. Dies ermöglicht präzise und schnelle Transkriptionen bei gleichzeitiger Einhaltung der Datenschutzbestimmungen. - -- KI-gestützte Analysen: Die Erstellung von Zusammenfassungen wird durch Azure OpenAI unterstützt, das in Paris gehostet wird. Wichtig zu betonen ist, dass die verarbeiteten Daten nicht zum Training der KI-Modelle genutzt werden, was den Schutz der Nutzerinformationen zusätzlich stärkt. - -- Anwendungshosting: Die Memoro-App ist sowohl für iOS (über den Apple App Store) als auch für Android (über den Google Play Store) verfügbar. Zusätzlich gibt es einen Desktop-Zugang, der es Nutzern ermöglicht, ihre aufgenommenen Memos zu lesen und zu verwalten. - -Die Infrastruktur von Memoro ist so konzipiert, dass sie problemlos skaliert werden kann, um mit dem Wachstum der Nutzerbasis Schritt zu halten. Regelmäßige Leistungsoptimierungen und Kapazitätserweiterungen stellen sicher, dass die App auch bei hoher Auslastung reibungslos funktioniert. - -## Datenspeicherung und \-verarbeitung - -Memoro verarbeitet verschiedene Arten von Daten, um seinen Nutzern einen umfassenden Service zu bieten. Dazu gehören: - -- Sprachaufnahmen -- Transkriptionen der Sprachaufnahmen -- Zusammenfassungen der Transkriptionen -- Nutzungsdaten (z.B. IP-Adresse, Gerätetyp, Betriebssystem) -- Diagnosedaten und Fehlerberichte - -Die Speicherdauer dieser Daten ist wie folgt geregelt: - -- Nutzungsdaten werden maximal 26 Monate nach der Erfassung aufbewahrt. -- Sprachaufnahmen, Transkriptionen und Zusammenfassungen bleiben für die Dauer des Nutzungsverhältnisses gespeichert und werden spätestens 6 Monate nach Beendigung des Nutzungsverhältnisses gelöscht. -- Diagnosedaten und Fehlerberichte werden maximal 90 Tage nach der Erfassung aufbewahrt. - -Bei den verwendeten Azure-Diensten gelten folgende Speicherfristen: - -- Azure Speech: Daten werden maximal 31 Tage gespeichert. -- Azure OpenAI: Daten werden maximal 30 Tage gespeichert. - -Diese Speicherfristen gewährleisten, dass Memoro seinen Nutzern einen zuverlässigen Service bieten kann, während gleichzeitig der Datenschutz gewahrt bleibt. - -## Kontinuierliche Verbesserung und Nutzerfeedback - -Memoro legt großen Wert auf die kontinuierliche Verbesserung seiner Dienste. Zu diesem Zweck werden anonymisierte Nutzungsanalysen durchgeführt, die dabei helfen, die App stetig zu optimieren und an die Bedürfnisse der Nutzer anzupassen. Hierbei kommt Google Analytics zum Einsatz, wobei streng darauf geachtet wird, dass keine personenbezogenen Daten in die Analysen einfließen. - -Zur Erkennung und Analyse von App-Fehlern nutzt Memoro Firebase Crashlytics. Dies ermöglicht es dem Entwicklungsteam, auftretende Probleme schnell zu identifizieren und zu beheben, was zu einer stabilen und zuverlässigen Nutzererfahrung beiträgt. - -Memoro ermutigt seine Nutzer aktiv, Feedback zu geben und Verbesserungsvorschläge einzureichen. Dieses Feedback wird sorgfältig geprüft und fließt in die Weiterentwicklung der App ein. Nutzer können sich jederzeit mit Fragen oder Anliegen an den Kundenservice unter [kontakt@memoro.ai](mailto:kontakt@memoro.ai) wenden. - -## Kernbotschaften - -Bei der Kommunikation über Memoros Datenschutz, Sicherheit und Infrastruktur sollten folgende Kernbotschaften im Mittelpunkt stehen: - -1. **Made in Germany**: Memoro wird vollständig in Deutschland entwickelt und folgt den höchsten Qualitäts- und Sicherheitsstandards. Dies unterstreicht das Engagement für Exzellenz und Vertrauenswürdigkeit. - -2. **DSGVO-Konformität**: Memoro erfüllt alle Anforderungen der Datenschutz-Grundverordnung (DSGVO). Dies gewährleistet, dass die Privatsphäre der Nutzer geschützt und ihre Rechte in Bezug auf ihre persönlichen Daten respektiert werden. - -3. **Datenspeicherung in Deutschland**: Alle Nutzerdaten werden ausschließlich in deutschen Rechenzentren gespeichert. Dies garantiert die Einhaltung strenger europäischer Datenschutzgesetze und minimiert das Risiko des Zugriffs durch ausländische Behörden. - -4. **Ende-zu-Ende-Verschlüsselung**: Memoro verwendet modernste Verschlüsselungstechnologien, um die Sicherheit der Nutzerdaten während der Übertragung zu gewährleisten. Dies schützt vor unbefugtem Zugriff und Datenmissbrauch. - -5. **Keine Weitergabe an unbefugte Dritte**: Memoro verpflichtet sich, Nutzerdaten nicht an Dritte weiterzugeben, es sei denn, dies ist gesetzlich vorgeschrieben oder der Nutzer hat ausdrücklich zugestimmt. Dies unterstreicht das Engagement für den Schutz der Privatsphäre der Nutzer. - -6. **Transparenz und Kontrolle**: Nutzer haben volle Kontrolle über ihre Daten und können jederzeit Auskunft, Berichtigung oder Löschung ihrer personenbezogenen Daten verlangen. Diese Transparenz fördert das Vertrauen in Memoro. - -7. **Kontinuierliche Verbesserung**: Memoro investiert ständig in die Verbesserung seiner Sicherheitsmaßnahmen und Datenschutzpraktiken. Regelmäßige Audits und Updates gewährleisten, dass die App immer auf dem neuesten Stand der Technik ist. - -8. **Branchenführende Technologien**: Durch die Nutzung von Azure Speech und Azure OpenAI bietet Memoro fortschrittliche KI-Funktionen, ohne dabei Kompromisse beim Datenschutz einzugehen. Die Daten werden nicht zum Training der KI-Modelle verwendet. - -9. **Flexible Lösungen für Unternehmen**: Mit On-Premise-Optionen bietet Memoro auch für Unternehmen mit besonders hohen Sicherheitsanforderungen passende Lösungen. Dies unterstreicht die Anpassungsfähigkeit und das Verständnis für unterschiedliche Sicherheitsbedürfnisse. - -10. **Vertrauenswürdiger Partner**: Memoro positioniert sich als vertrauenswürdiger Partner für Einzelpersonen und Unternehmen, der die Bedeutung von Datenschutz und Sicherheit in der digitalen Welt versteht und priorisiert. - -Diese Kernbotschaften sollten in allen Kommunikationskanälen konsistent vermittelt werden, sei es in Marketingmaterialien, Kundengesprächen oder bei der Produktpräsentation. Sie unterstreichen Memoros Engagement für Datenschutz, Sicherheit und technologische Innovation und differenzieren das Unternehmen in einem zunehmend wettbewerbsintensiven Markt. - -# Memoro Kontakt - -Webseite: [https://www.memoro.ai/](https://www.memoro.ai/) -LinkedIn: [https://www.linkedin.com/company/memoroai](https://www.linkedin.com/company/memoroai) -Instagram: [https://www.instagram.com/memoroai/](https://www.instagram.com/memoroai/) -WhatsApp: [+41 79 370 88 99](https://wa.me/41793708899) -Adresse: Reichenaustraße 11a, 78467 Konstanz diff --git a/apps/memoro/apps/landing/context/blueprints/handwerk-blueprints.md b/apps/memoro/apps/landing/context/blueprints/handwerk-blueprints.md deleted file mode 100644 index 593f5fc88..000000000 --- a/apps/memoro/apps/landing/context/blueprints/handwerk-blueprints.md +++ /dev/null @@ -1,242 +0,0 @@ -# Blueprint-Ideen für das Handwerk - Handwerker (Final) - -## Die 4 wichtigsten Blueprints - NUR mit den 8 verfügbaren System-Prompts (ohne Schlüsselpunkte) - ---- - -## 1. Kundengespräch & Angebotserstellung / Customer Meeting & Quote Preparation -**Kategorie**: Handwerk -**Farbe**: #FF6F00 - -### Beschreibung -**Deutsch**: Dokumentiert Kundenwünsche, technische Anforderungen und Preisabsprachen. Erstellt strukturierte Grundlagen für Angebote und Auftragsbestätigungen. - -**English**: Documents customer requirements, technical specifications, and price agreements. Creates structured foundations for quotes and order confirmations. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Kurzzusammenfassung** (Sort Order: 1) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Kompakte Projektübersicht für die Kalkulation - -2. **Ausführliche Zusammenfassung** (Sort Order: 2) - - Prompt ID: `4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - - Memory Title: Ausführliche Zusammenfassung / Detailed Summary - - Detaillierte Kundenanforderungen und Leistungsumfang - -3. **Aufgaben & Termine** (Sort Order: 3) - - Prompt ID: `7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48` - - Memory Title: Aufgaben & Termine / Tasks & Appointments - - Besichtigungstermine, Lieferzeiten, Fertigstellungsdaten - -4. **Offene Fragen** (Sort Order: 4) - - Prompt ID: `c576e875-5a52-4f6a-abb7-0c62c945af78` - - Memory Title: Offene Fragen / Open Questions - - Klärungsbedarf für Material, Technik oder Genehmigungen - ---- - -## 2. Baustellendokumentation & Qualitätssicherung / Site Documentation & Quality Control -**Kategorie**: Handwerk -**Farbe**: #FF6F00 - -### Beschreibung -**Deutsch**: Erfasst Baufortschritt, Mängel, Abnahmen und wichtige Entscheidungen. Perfekt für Gewährleistung und Nachweise. - -**English**: Records construction progress, defects, approvals, and important decisions. Perfect for warranty and documentation. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Kurzzusammenfassung** (Sort Order: 1) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Tagesübersicht Baufortschritt - -2. **Ausführliche Zusammenfassung** (Sort Order: 2) - - Prompt ID: `4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - - Memory Title: Ausführliche Zusammenfassung / Detailed Summary - - Detaillierte Tagesprotokolle und Fortschrittsdokumentation - -3. **Aufgaben & Termine** (Sort Order: 3) - - Prompt ID: `7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48` - - Memory Title: Aufgaben & Termine / Tasks & Appointments - - Nacharbeiten, Abnahmetermine, Materialbestellungen - -4. **Beantwortete Fragen & Antworten** (Sort Order: 4) - - Prompt ID: `47ce3340-e8c6-437c-928d-854c55589491` - - Memory Title: Q&A / Questions & Answers - - Technische Klärungen und Lösungen - ---- - -## 3. Team-Besprechung & Arbeitsplanung / Team Meeting & Work Planning -**Kategorie**: Handwerk -**Farbe**: #FF6F00 - -### Beschreibung -**Deutsch**: Strukturiert Teambesprechungen, Arbeitseinteilung und Projektkoordination. Dokumentiert Zuständigkeiten und Arbeitsabläufe. - -**English**: Structures team meetings, work allocation, and project coordination. Documents responsibilities and workflows. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Kurzzusammenfassung** (Sort Order: 1) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Wochenplanung kompakt - -2. **Aufgaben & Termine** (Sort Order: 2) - - Prompt ID: `7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48` - - Memory Title: Aufgaben & Termine / Tasks & Appointments - - Arbeitseinteilung, Deadlines, Materialvorbereitung - -3. **Gesammelte Ideen & Vorschläge** (Sort Order: 3) - - Prompt ID: `8cdc89a5-2f76-4d50-a93d-0c177c3e73ab` - - Memory Title: Ideen & Vorschläge / Ideas & Suggestions - - Prozessverbesserungen und Lösungsansätze - -4. **Offene Fragen** (Sort Order: 4) - - Prompt ID: `c576e875-5a52-4f6a-abb7-0c62c945af78` - - Memory Title: Offene Fragen / Open Questions - - Klärungsbedarf mit Auftraggeber oder Lieferanten - ---- - -## 4. Fachliche Weiterbildung & Schulungen / Professional Training & Education -**Kategorie**: Handwerk -**Farbe**: #FF6F00 - -### Beschreibung -**Deutsch**: Dokumentiert Schulungen, neue Techniken und Zertifizierungen. Erstellt Wissensdatenbank für Mitarbeiter und Nachweise für Kunden. - -**English**: Documents training, new techniques, and certifications. Creates knowledge base for employees and proof for customers. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Kurzzusammenfassung** (Sort Order: 1) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Schulung auf einen Blick - -2. **Ausführliche Zusammenfassung** (Sort Order: 2) - - Prompt ID: `4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - - Memory Title: Ausführliche Zusammenfassung / Detailed Summary - - Vollständige Schulungsdokumentation mit allen Details - -3. **Beantwortete Fragen & Antworten** (Sort Order: 3) - - Prompt ID: `47ce3340-e8c6-437c-928d-854c55589491` - - Memory Title: Q&A / Questions & Answers - - Technisches Fachwissen zum Nachschlagen - -4. **Blogbeitrag** (Sort Order: 4) - - Prompt ID: `2c6a6e47-1d0c-441f-9449-b5d908bffba2` - - Memory Title: Blogbeitrag / Blog Post - - Für Firmen-Website oder Kundennewsletter - ---- - -## Implementierungsdetails - -### JSON-Struktur für Supabase -```json -{ - "category_id": "handwerk-category-id", - "blueprints": [ - { - "name": { - "de": "Kundengespräch & Angebotserstellung", - "en": "Customer Meeting & Quote Preparation" - }, - "description": { - "de": "Dokumentiert Kundenwünsche und erstellt Angebotsgrundlagen", - "en": "Documents customer requirements and creates quote foundations" - }, - "prompts": [ - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "4370cb68-d676-4b93-8afd-2fb7c4ad78c4", - "7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48", - "c576e875-5a52-4f6a-abb7-0c62c945af78" - ] - }, - { - "name": { - "de": "Baustellendokumentation & Qualitätssicherung", - "en": "Site Documentation & Quality Control" - }, - "description": { - "de": "Erfasst Baufortschritt, Mängel und Abnahmen", - "en": "Records construction progress, defects, and approvals" - }, - "prompts": [ - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "4370cb68-d676-4b93-8afd-2fb7c4ad78c4", - "7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48", - "47ce3340-e8c6-437c-928d-854c55589491" - ] - }, - { - "name": { - "de": "Team-Besprechung & Arbeitsplanung", - "en": "Team Meeting & Work Planning" - }, - "description": { - "de": "Strukturiert Teambesprechungen und Arbeitseinteilung", - "en": "Structures team meetings and work allocation" - }, - "prompts": [ - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48", - "8cdc89a5-2f76-4d50-a93d-0c177c3e73ab", - "c576e875-5a52-4f6a-abb7-0c62c945af78" - ] - }, - { - "name": { - "de": "Fachliche Weiterbildung & Schulungen", - "en": "Professional Training & Education" - }, - "description": { - "de": "Dokumentiert Schulungen und neue Techniken", - "en": "Documents training and new techniques" - }, - "prompts": [ - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "4370cb68-d676-4b93-8afd-2fb7c4ad78c4", - "47ce3340-e8c6-437c-928d-854c55589491", - "2c6a6e47-1d0c-441f-9449-b5d908bffba2" - ] - } - ] -} -``` - -## Vorteile dieser finalen Version - -### ✅ 100% Kompatibilität -- **NUR die 8 tatsächlich verfügbaren Prompts** werden verwendet (ohne Schlüsselpunkte) -- Keine Phantasie-IDs oder nicht existierende Prompts -- Sofort implementierbar ohne Backend-Änderungen - -### ✅ Vollständige Abdeckung -- **Kundenbetreuung**: Von Erstgespräch bis Angebot -- **Projektdokumentation**: Lückenlose Baustellendokumentation -- **Teamorganisation**: Effiziente Arbeitsplanung -- **Qualifikation**: Weiterbildung und Zertifizierungen - -### ✅ Praktischer Nutzen für Handwerker -- **Rechtssicherheit**: Dokumentation für Gewährleistung und Beweissicherung -- **Effizienz**: Strukturierte Arbeitsabläufe und klare Zuständigkeiten -- **Qualität**: Systematische Erfassung von Mängeln und Nacharbeiten -- **Kundenbindung**: Professionelle Dokumentation und Kommunikation -- **Wissensmanagement**: Schulungsinhalte und Best Practices im Team teilen - -### ✅ Handwerksspezifische Anwendungsfälle -- Mängelprotokolle und Abnahmen -- Materialbestellungen und Liefertermine -- Arbeitszeiten und Leistungserfassung -- Technische Klärungen und Normen -- Kundenwünsche und Änderungen -- Sicherheitsunterweisungen - -### ✅ Einfache Implementierung -- Direkt in Supabase einfügbar -- Keine neuen Prompts nötig -- Verwendet bestehende Infrastruktur -- Mehrsprachigkeit bereits integriert (DE, EN, IT, FR, ES) \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/blueprints/office-blueprints.md b/apps/memoro/apps/landing/context/blueprints/office-blueprints.md deleted file mode 100644 index 70b0a0a98..000000000 --- a/apps/memoro/apps/landing/context/blueprints/office-blueprints.md +++ /dev/null @@ -1,244 +0,0 @@ -# Blueprint-Ideen für den Büro-Kontext / Office (Final) - -## Die 4 wichtigsten Blueprints - NUR mit den 8 verfügbaren System-Prompts (ohne Schlüsselpunkte) - ---- - -## 1. Meeting-Protokoll & Follow-Up / Meeting Minutes & Follow-Up -**Kategorie**: Büro / Office -**Farbe**: #2196F3 - -### Beschreibung -**Deutsch**: Erstellt strukturierte Meeting-Protokolle mit Entscheidungen, Aufgaben und Terminen. Perfekt für effiziente Nachbereitung und klare Verantwortlichkeiten. - -**English**: Creates structured meeting minutes with decisions, tasks, and deadlines. Perfect for efficient follow-up and clear responsibilities. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Kurzzusammenfassung** (Sort Order: 1) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Meeting-Ergebnisse auf einen Blick - -2. **Ausführliche Zusammenfassung** (Sort Order: 2) - - Prompt ID: `4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - - Memory Title: Ausführliche Zusammenfassung / Detailed Summary - - Vollständiges Protokoll mit allen Diskussionspunkten - -3. **Aufgaben & Termine** (Sort Order: 3) - - Prompt ID: `7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48` - - Memory Title: Aufgaben & Termine / Tasks & Appointments - - Action Items mit Verantwortlichen und Deadlines - -4. **Offene Fragen** (Sort Order: 4) - - Prompt ID: `c576e875-5a52-4f6a-abb7-0c62c945af78` - - Memory Title: Offene Fragen / Open Questions - - Themen für das nächste Meeting - ---- - -## 2. Brainstorming & Ideenentwicklung / Brainstorming & Idea Development -**Kategorie**: Büro / Office -**Farbe**: #2196F3 - -### Beschreibung -**Deutsch**: Erfasst und strukturiert kreative Sessions, Workshops und Strategieentwicklung. Dokumentiert alle Ideen und priorisiert Umsetzungsschritte. - -**English**: Captures and structures creative sessions, workshops, and strategy development. Documents all ideas and prioritizes implementation steps. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Kurzzusammenfassung** (Sort Order: 1) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Session-Ergebnis kompakt - -2. **Gesammelte Ideen & Vorschläge** (Sort Order: 2) - - Prompt ID: `8cdc89a5-2f76-4d50-a93d-0c177c3e73ab` - - Memory Title: Ideen & Vorschläge / Ideas & Suggestions - - Alle Konzepte nach Umsetzbarkeit sortiert - -3. **Aufgaben & Termine** (Sort Order: 3) - - Prompt ID: `7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48` - - Memory Title: Aufgaben & Termine / Tasks & Appointments - - Nächste Schritte zur Umsetzung - -4. **Blogbeitrag** (Sort Order: 4) - - Prompt ID: `2c6a6e47-1d0c-441f-9449-b5d908bffba2` - - Memory Title: Blogbeitrag / Blog Post - - Für internes Wissensmanagement oder Intranet - ---- - -## 3. Projektbesprechung & Statusupdate / Project Meeting & Status Update -**Kategorie**: Büro / Office -**Farbe**: #2196F3 - -### Beschreibung -**Deutsch**: Dokumentiert Projektfortschritt, Meilensteine und Hindernisse. Ideal für Steering Committees, Sprint Reviews und Stakeholder-Updates. - -**English**: Documents project progress, milestones, and obstacles. Ideal for steering committees, sprint reviews, and stakeholder updates. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Kurzzusammenfassung** (Sort Order: 1) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Projektstatus Executive Summary - -2. **Ausführliche Zusammenfassung** (Sort Order: 2) - - Prompt ID: `4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - - Memory Title: Ausführliche Zusammenfassung / Detailed Summary - - Detaillierter Fortschrittsbericht - -3. **Aufgaben & Termine** (Sort Order: 3) - - Prompt ID: `7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48` - - Memory Title: Aufgaben & Termine / Tasks & Appointments - - Meilensteine und kritische Pfade - -4. **Offene Fragen** (Sort Order: 4) - - Prompt ID: `c576e875-5a52-4f6a-abb7-0c62c945af78` - - Memory Title: Offene Fragen / Open Questions - - Risiken und Eskalationsbedarf - ---- - -## 4. Kommunikations-Content / Communication Content -**Kategorie**: Büro / Office -**Farbe**: #2196F3 - -### Beschreibung -**Deutsch**: Verwandelt Besprechungen und Präsentationen in professionelle Kommunikationsinhalte für verschiedene Kanäle und Zielgruppen. - -**English**: Transforms meetings and presentations into professional communication content for various channels and audiences. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Kurzzusammenfassung** (Sort Order: 1) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Management Summary für Führungsebene - -2. **Blogbeitrag** (Sort Order: 2) - - Prompt ID: `2c6a6e47-1d0c-441f-9449-b5d908bffba2` - - Memory Title: Blogbeitrag / Blog Post - - Für Intranet oder Unternehmens-Blog - -3. **Social Media Posts** (Sort Order: 3) - - Prompt ID: `b2e39e0a-ec1f-4d0e-813d-f1a08493332b` - - Memory Title: Social Media Posts - - LinkedIn, Twitter für Corporate Communications - -4. **Ausführliche Zusammenfassung** (Sort Order: 4) - - Prompt ID: `4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - - Memory Title: Ausführliche Zusammenfassung / Detailed Summary - - Hintergrundinformationen für Newsletter - ---- - -## Implementierungsdetails - -### JSON-Struktur für Supabase -```json -{ - "category_id": "office-category-id", - "blueprints": [ - { - "name": { - "de": "Meeting-Protokoll & Follow-Up", - "en": "Meeting Minutes & Follow-Up" - }, - "description": { - "de": "Strukturierte Meeting-Protokolle mit Aufgaben und Entscheidungen", - "en": "Structured meeting minutes with tasks and decisions" - }, - "prompts": [ - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "4370cb68-d676-4b93-8afd-2fb7c4ad78c4", - "7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48", - "c576e875-5a52-4f6a-abb7-0c62c945af78" - ] - }, - { - "name": { - "de": "Brainstorming & Ideenentwicklung", - "en": "Brainstorming & Idea Development" - }, - "description": { - "de": "Erfasst kreative Sessions und priorisiert Umsetzungsschritte", - "en": "Captures creative sessions and prioritizes implementation steps" - }, - "prompts": [ - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "8cdc89a5-2f76-4d50-a93d-0c177c3e73ab", - "7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48", - "2c6a6e47-1d0c-441f-9449-b5d908bffba2" - ] - }, - { - "name": { - "de": "Projektbesprechung & Statusupdate", - "en": "Project Meeting & Status Update" - }, - "description": { - "de": "Dokumentiert Projektfortschritt und Meilensteine", - "en": "Documents project progress and milestones" - }, - "prompts": [ - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "4370cb68-d676-4b93-8afd-2fb7c4ad78c4", - "7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48", - "c576e875-5a52-4f6a-abb7-0c62c945af78" - ] - }, - { - "name": { - "de": "Kommunikations-Content", - "en": "Communication Content" - }, - "description": { - "de": "Professionelle Inhalte für verschiedene Kanäle", - "en": "Professional content for various channels" - }, - "prompts": [ - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "2c6a6e47-1d0c-441f-9449-b5d908bffba2", - "b2e39e0a-ec1f-4d0e-813d-f1a08493332b", - "4370cb68-d676-4b93-8afd-2fb7c4ad78c4" - ] - } - ] -} -``` - -## Vorteile dieser finalen Version - -### ✅ 100% Kompatibilität -- **NUR die 8 tatsächlich verfügbaren Prompts** werden verwendet (ohne Schlüsselpunkte) -- Keine Phantasie-IDs oder nicht existierende Prompts -- Sofort implementierbar ohne Backend-Änderungen - -### ✅ Vollständige Abdeckung -- **Meetings**: Effiziente Protokollierung und Nachverfolgung -- **Innovation**: Strukturierte Ideenentwicklung und Workshops -- **Projektmanagement**: Lückenlose Statusdokumentation -- **Kommunikation**: Multi-Channel Content-Erstellung - -### ✅ Praktischer Nutzen für Büro-Mitarbeiter -- **Zeitersparnis**: Automatische Protokollerstellung statt manueller Notizen -- **Klarheit**: Eindeutige Aufgabenverteilung und Verantwortlichkeiten -- **Transparenz**: Nachvollziehbare Entscheidungen und Projektfortschritte -- **Effizienz**: Ein Gespräch, mehrere Outputs (Protokoll, Blog, Social Media) -- **Compliance**: Revisionssichere Dokumentation wichtiger Meetings - -### ✅ Büro-spezifische Anwendungsfälle -- Board-Meetings und Vorstandssitzungen -- Agile Sprint Reviews und Retrospektiven -- Kundenpräsentationen und Pitches -- Strategieworkshops und OKR-Planungen -- Team-Meetings und Jour Fixes -- Change Management Kommunikation -- Internal Communications -- Stakeholder Updates - -### ✅ Einfache Implementierung -- Direkt in Supabase einfügbar -- Keine neuen Prompts nötig -- Verwendet bestehende Infrastruktur -- Mehrsprachigkeit bereits integriert (DE, EN, IT, FR, ES) \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/blueprints/university-student-blueprints-FINAL.md b/apps/memoro/apps/landing/context/blueprints/university-student-blueprints-FINAL.md deleted file mode 100644 index c60bb3e49..000000000 --- a/apps/memoro/apps/landing/context/blueprints/university-student-blueprints-FINAL.md +++ /dev/null @@ -1,234 +0,0 @@ -# Blueprint-Ideen für den Universitären Kontext - Studenten (FINAL) - -## Die 4 wichtigsten Blueprints - NUR mit den 8 verfügbaren System-Prompts - ---- - -## 1. Vorlesungsanalyse / Lecture Analysis -**Kategorie**: Universität -**Farbe**: #9C27B0 - -### Beschreibung -**Deutsch**: Umfassende Analyse von Vorlesungen mit automatischer Erstellung von Zusammenfassungen und offenen Fragen für die Prüfungsvorbereitung. - -**English**: Comprehensive analysis of lectures with automatic creation of summaries and open questions for exam preparation. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Kurzzusammenfassung** (Sort Order: 1) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Schneller Überblick über die Vorlesung - -2. **Ausführliche Zusammenfassung** (Sort Order: 2) - - Prompt ID: `4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - - Memory Title: Ausführliche Zusammenfassung / Detailed Summary - - Detaillierte Nachbereitung - -3. **Offene Fragen** (Sort Order: 3) - - Prompt ID: `c576e875-5a52-4f6a-abb7-0c62c945af78` - - Memory Title: Offene Fragen / Open Questions - - Für Sprechstunden und Verständnisfragen - -4. **Beantwortete Fragen & Antworten** (Sort Order: 4) - - Prompt ID: `47ce3340-e8c6-437c-928d-854c55589491` - - Memory Title: Q&A / Questions & Answers - - Perfekt für Lernkarten - ---- - -## 2. Seminar & Gruppenarbeit / Seminar & Group Work -**Kategorie**: Universität -**Farbe**: #9C27B0 - -### Beschreibung -**Deutsch**: Perfekt für Seminardiskussionen und Gruppenarbeiten - erfasst Aufgaben, Ideen und erstellt strukturierte Dokumentation. - -**English**: Perfect for seminar discussions and group work - captures tasks, ideas, and creates structured documentation. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Aufgaben & Termine** (Sort Order: 1) - - Prompt ID: `7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48` - - Memory Title: Aufgaben & Termine / Tasks & Appointments - - Mit Verantwortlichkeiten und Deadlines - -2. **Gesammelte Ideen & Vorschläge** (Sort Order: 2) - - Prompt ID: `8cdc89a5-2f76-4d50-a93d-0c177c3e73ab` - - Memory Title: Ideen & Vorschläge / Ideas & Suggestions - - Brainstorming und kreative Ansätze - -3. **Kurzzusammenfassung** (Sort Order: 3) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Hauptergebnisse der Diskussion - -4. **Offene Fragen** (Sort Order: 4) - - Prompt ID: `c576e875-5a52-4f6a-abb7-0c62c945af78` - - Memory Title: Offene Fragen / Open Questions - - Für die nächste Sitzung - ---- - -## 3. Prüfungsvorbereitung / Exam Preparation -**Kategorie**: Universität -**Farbe**: #9C27B0 - -### Beschreibung -**Deutsch**: Speziell für die intensive Prüfungsvorbereitung - verwandelt Lernmaterial in strukturierte Lernhilfen mit Q&A und Zusammenfassungen. - -**English**: Specifically for intensive exam preparation - transforms study material into structured learning aids with Q&A and summaries. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Beantwortete Fragen & Antworten** (Sort Order: 1) - - Prompt ID: `47ce3340-e8c6-437c-928d-854c55589491` - - Memory Title: Q&A / Questions & Answers - - Perfekt für Lernkarten und Selbsttest - -2. **Kurzzusammenfassung** (Sort Order: 2) - - Prompt ID: `c4009bef-4504-4af7-86f5-f896a2412a0a` - - Memory Title: Kurzzusammenfassung / Executive Summary - - Schnelle Wiederholung vor der Prüfung - -3. **Ausführliche Zusammenfassung** (Sort Order: 3) - - Prompt ID: `4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - - Memory Title: Ausführliche Zusammenfassung / Detailed Summary - - Detailliertes Prüfungsmaterial - -4. **Offene Fragen** (Sort Order: 4) - - Prompt ID: `c576e875-5a52-4f6a-abb7-0c62c945af78` - - Memory Title: Offene Fragen / Open Questions - - Identifiziert Wissenslücken - ---- - -## 4. Content-Erstellung für Studienarbeiten / Academic Content Creation -**Kategorie**: Universität -**Farbe**: #9C27B0 - -### Beschreibung -**Deutsch**: Verwandelt Recherche und Diskussionen in strukturierte Inhalte für Hausarbeiten, Präsentationen und wissenschaftliche Blogs. - -**English**: Transforms research and discussions into structured content for term papers, presentations, and academic blogs. - -### Verwendete Prompts (100% VERFÜGBAR) -1. **Ausführliche Zusammenfassung** (Sort Order: 1) - - Prompt ID: `4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - - Memory Title: Ausführliche Zusammenfassung / Detailed Summary - - Basis für Literaturarbeit - -2. **Blogbeitrag** (Sort Order: 2) - - Prompt ID: `2c6a6e47-1d0c-441f-9449-b5d908bffba2` - - Memory Title: Blogbeitrag / Blog Post - - Für wissenschaftliche Blogs oder Artikel - -3. **Social Media Posts** (Sort Order: 3) - - Prompt ID: `b2e39e0a-ec1f-4d0e-813d-f1a08493332b` - - Memory Title: Social Media Posts - - Für akademisches Networking (LinkedIn) - -4. **Gesammelte Ideen & Vorschläge** (Sort Order: 4) - - Prompt ID: `8cdc89a5-2f76-4d50-a93d-0c177c3e73ab` - - Memory Title: Ideen & Vorschläge / Ideas & Suggestions - - Kreative Ansätze für Arbeiten - ---- - -## Implementierungsdetails - -### JSON-Struktur für Supabase -```json -{ - "category_id": "b26c7a49-187d-4429-9dc6-ba55de512a8d", - "blueprints": [ - { - "name": { - "de": "Vorlesungsanalyse", - "en": "Lecture Analysis" - }, - "description": { - "de": "Umfassende Analyse von Vorlesungen mit Zusammenfassungen und Q&A", - "en": "Comprehensive lecture analysis with summaries and Q&A" - }, - "prompts": [ - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "4370cb68-d676-4b93-8afd-2fb7c4ad78c4", - "c576e875-5a52-4f6a-abb7-0c62c945af78", - "47ce3340-e8c6-437c-928d-854c55589491" - ] - }, - { - "name": { - "de": "Seminar & Gruppenarbeit", - "en": "Seminar & Group Work" - }, - "description": { - "de": "Erfasst Aufgaben, Ideen und Diskussionsergebnisse", - "en": "Captures tasks, ideas, and discussion results" - }, - "prompts": [ - "7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48", - "8cdc89a5-2f76-4d50-a93d-0c177c3e73ab", - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "c576e875-5a52-4f6a-abb7-0c62c945af78" - ] - }, - { - "name": { - "de": "Prüfungsvorbereitung", - "en": "Exam Preparation" - }, - "description": { - "de": "Strukturierte Lernhilfen mit Q&A und Zusammenfassungen", - "en": "Structured learning aids with Q&A and summaries" - }, - "prompts": [ - "47ce3340-e8c6-437c-928d-854c55589491", - "c4009bef-4504-4af7-86f5-f896a2412a0a", - "4370cb68-d676-4b93-8afd-2fb7c4ad78c4", - "c576e875-5a52-4f6a-abb7-0c62c945af78" - ] - }, - { - "name": { - "de": "Content-Erstellung für Studienarbeiten", - "en": "Academic Content Creation" - }, - "description": { - "de": "Strukturierte Inhalte für Hausarbeiten und Präsentationen", - "en": "Structured content for term papers and presentations" - }, - "prompts": [ - "4370cb68-d676-4b93-8afd-2fb7c4ad78c4", - "2c6a6e47-1d0c-441f-9449-b5d908bffba2", - "b2e39e0a-ec1f-4d0e-813d-f1a08493332b", - "8cdc89a5-2f76-4d50-a93d-0c177c3e73ab" - ] - } - ] -} -``` - -## Vorteile dieser finalen Version - -### ✅ 100% Kompatibilität -- **NUR die 8 tatsächlich verfügbaren Prompts** werden verwendet -- Keine nicht existierenden Prompts (wie "Schlüsselpunkte") -- Sofort implementierbar ohne Backend-Änderungen - -### ✅ Vollständige Abdeckung -- **Vorlesungen**: Nachbereitung und Verständnis -- **Gruppenarbeit**: Organisation und Ideensammlung -- **Prüfungen**: Strukturierte Vorbereitung -- **Wissenschaftliches Schreiben**: Content-Erstellung - -### ✅ Praktischer Nutzen -- Jeder Blueprint löst ein reales studentisches Problem -- Sinnvolle Kombination der verfügbaren Prompts -- Mehrsprachigkeit bereits integriert (DE, EN, IT, FR, ES) - -### ✅ Einfache Implementierung -- Direkt in Supabase einfügbar -- Keine neuen Prompts nötig -- Verwendet bestehende Infrastruktur - -## Wichtiger Hinweis -Der Prompt "Schlüsselpunkte" (ID: 9b411221-6f52-4534-9ea9-dd1904259e8c) existiert NICHT in der Datenbank und wurde in dieser finalen Version komplett entfernt. \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/legal/Memoro-TOMs.md b/apps/memoro/apps/landing/context/legal/Memoro-TOMs.md deleted file mode 100644 index 92c11e551..000000000 --- a/apps/memoro/apps/landing/context/legal/Memoro-TOMs.md +++ /dev/null @@ -1,1099 +0,0 @@ -Technische und organisatorische Maßnahmen, -Infrastruktur und Datenströme (TOMs) -gemäß Art. 32 DSGVO -Version: 2.3 -Datum: 15.07.2025 -Verantwortlicher: Nils Weiser - -1. Allgemeine Angaben - Unternehmen: - Memoro GmbH - Reichenaustraße 11a - 78467 Konstanz - E-Mail: kontakt@memoro.ai - Telefon: +49 176 444 343 85 - Datenschutzbeauftragter: - Nils Weiser - E-Mail: kontakt@memoro.ai - Telefon: +49 176 444 343 85 - Einleitung: Infrastruktur und Datenflüsse - Dieses Dokument beschreibt transparent unsere technische Infrastruktur und die Verarbeitung - Ihrer Daten. Unser oberstes Credo ist der Schutz Ihrer Privatsphäre: Wir werden Ihre Daten - niemals einsehen oder verkaufen. Wir setzen gezielt auf Lösungen, die höchsten europäischen - Datenschutzstandards entsprechen und reduzieren stetig die Abhängigkeit von außereuropäischen - Anbietern. - Der Weg Ihrer Daten bei Memoro: Von der Aufnahme zur Analyse -1. Aufnahme und Speicherung: Wenn Sie eine Memo aufzeichnen, wird die Audiodatei - zunächst sicher auf Ihrem Endgerät gespeichert. Sobald eine Internetverbindung besteht, - wird die Aufnahme verschlüsselt zu unserem Backend-Dienstleister Supabase - hochgeladen. Die Datenbank und die darin gespeicherten Audiodateien befinden sich - physisch in einem Rechenzentrum in Frankfurt, Deutschland. -1. Transkription: Um Ihre Sprachaufnahme in Text umzuwandeln, wird die Audiodatei an - eine Instanz von Microsoft Azure in Schweden gesendet. Wir nutzen diesen Standort, da - dort die neuesten und qualitativ hochwertigsten Transkriptionsmodelle verfügbar sind. Ihre - Daten verlassen dabei zu keinem Zeitpunkt den Europäischen Wirtschaftsraum. -1. Dateikonvertierung (bei Bedarf): In seltenen Fällen, in denen Ihr Endgerät - Audioaufnahmen in einem nicht-standardisierten Format speichert, wird die Datei zur - Konvertierung an Google Cloud in Frankfurt gesendet. Google konvertiert lediglich das - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 1 / 23 - -Dateiformat, ohne den Inhalt zu analysieren oder dauerhaft zu speichern. 4. Analyse und Erstellung von "Memories": Das erstellte Transkript wird zurück an unsere -Supabase-Datenbank in Frankfurt gesendet. Aus diesem Text werden Analyseabschnitte -("Memories") generiert. Für diesen Schritt nutzen wir je nach Anforderung die -leistungsfähigsten KI-Modelle: -○ Google Gemini: Die Verarbeitung findet auf Servern in Belgien statt. Google -garantiert, dass diese Daten nicht für das Training von Modellen verwendet werden. -Die Daten werden nach spätestens 30 Tagen gelöscht. -○ OpenAI-Modelle via Microsoft Azure: Die Verarbeitung erfolgt auf unserer Instanz -in Schweden, um von den fortschrittlichsten verfügbaren Modellen zu profitieren. -Microsoft garantiert, dass diese Daten nicht für das Training von Modellen -verwendet werden. Die Daten werden nach spätestens 30 Tagen gelöscht. -○ Erklärung: Die Daten werden bei Google Gemini und Microsoft Azure nicht aktiv -gespeichert, sondern befinden sich lediglich in deren internen Caching- und -Logging-Systemen. Diese Systeme löschen die Daten automatisch nach maximal -30 Tagen. Memoro hat keinen Zugriff auf diese zwischengespeicherten Daten, und -sie werden ausschließlich für interne Sicherheits- und Qualitätssicherungszwecke -der Anbieter vorgehalten, jedoch nicht für Modelltraining verwendet. 5. Die finalen Analysen werden wiederum sicher in unserer Supabase-Datenbank in -Frankfurt gespeichert. -Welche Daten werden verarbeitet? -Wenn Sie Memoro nutzen, werden folgende Kategorien von Daten an unser Backend (gehostet bei -Supabase in Frankfurt) übermittelt und dort verarbeitet: -● Inhaltsdaten: Die von Ihnen aufgezeichneten Audiodateien, die daraus erstellten -Transkripte sowie die finalen Analyseabschnitte ("Memories"). -● Account-Daten: Ihre E-Mail-Adresse und Ihr Name (falls angegeben) zur Erstellung und -Verwaltung Ihres Nutzerkontos. Das Passwort wird ausschließlich als verschlüsselter -Hash-Wert gespeichert. -● Nutzungs- und Metadaten: Zeitstempel der Aufnahmen, Dateiformate, Gerätemodell (zur -Fehleranalyse) und Interaktionsdaten innerhalb der App (z.B. welche Funktionen genutzt -werden), um unseren Dienst zu verbessern. -● Technische Verbindungsdaten: Ihre IP-Adresse, die zur Herstellung der Verbindung zu -unseren Servern temporär verarbeitet wird, sowie Authentifizierungstokens zur Sicherung -Ihres Accounts. -Unsere Unterauftragsverarbeiter (Subdienstleister) -● Supabase: (Backend & Datenbank), Serverstandort: Frankfurt, DE. -● Microsoft Azure: (Transkription & KI-Analyse), Serverstandort: Schweden, EU. -● Google Cloud: (Dateikonvertierung & KI-Analyse), Serverstandort: Frankfurt, DE. -● PostHog: (Produktanalyse, Open Source), Serverstandort: EU-Hosting. (Deaktivierbar für -Organisationskunden, je nach AVV). -Ihre Kontrolle und unser Versprechen - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 2 / 23 - -Sie behalten stets die volle Kontrolle über Ihre Daten. -● Vollständige Löschung: Von Ihnen gelöschte Daten werden unwiderruflich und vollständig -von allen unseren Systemen entfernt. -● Anonymisierungsoptionen: Funktionen wie die Sprechererkennung können von Ihnen -deaktiviert werden, um die Rückverfolgbarkeit zu reduzieren. -Diese Vorkehrungen gewährleisten, in Kombination mit den detaillierten Maßnahmen dieses -Dokuments, eine sichere und DSGVO-konforme Verarbeitung Ihrer Daten. -Organisationsspezifische Anpassungen: Für Unternehmens- und Organisationskunden bieten -wir maßgeschneiderte Datenschutzlösungen, einschließlich automatischer Löschfristen und -angepasster Datenverarbeitungsprozesse gemäß individuellen Compliance-Anforderungen. 2. Zweck des Dokuments -Dieses Dokument beschreibt die technischen und organisatorischen Maßnahmen (TOMs) der -Memoro GmbH gemäß Art. 32 DSGVO. Ziel ist die Gewährleistung eines angemessenen -Schutzniveaus für personenbezogene Daten. -Dieses Dokument ist Bestandteil des Verzeichnisses von Verarbeitungstätigkeiten gemäß Art. -30 DSGVO. 3. Geltungsbereich -Die hier dokumentierten Maßnahmen gelten für: - -- Alle IT-Systeme und Prozesse der Memoro GmbH -- Verarbeitung personenbezogener Daten innerhalb der Memoro App -- Die gesamte Infrastruktur, einschließlich externer Dienstleister - -4. Rechtsgrundlagen - Die TOMs basieren auf Art. 32 DSGVO (Sicherheit der Verarbeitung), der angemessene - Schutzmaßnahmen sowie deren regelmäßige Überprüfung fordert. -5. Beschreibung der Technischen Maßnahmen (IT-Sicherheit) - Gemäß Art. 32 DSGVO setzt die Memoro GmbH folgende technische Maßnahmen um, um die - Sicherheit und den Schutz personenbezogener Daten zu gewährleisten. - 5.1 Zugangskontrolle und Authentifizierung - 5.1.1 Zugang zu Cloud-Diensten - -- Systeme und Daten werden bevorzugt über europäische Cloud-Dienstleister oder - solche mit Sitz in Ländern mit Angemessenheitsbeschluss verarbeitet. Bei Dienstleistern in - Drittländern ohne Angemessenheitsbeschluss werden geeignete Garantien gemäß Art. 46 - DSGVO (z.B. Standardvertragsklauseln, Zertifizierungen nach dem Data Privacy - Framework) implementiert, wie in Abschnitt 10 detailliert. -- Jeder Zugriff erfolgt über individuell vergebene Benutzerkonten, es gibt keine - gemeinsam genutzten Logins. - Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 3 / 23 - -- Multi-Faktor-Authentifizierung (MFA) ist für alle kritischen Systeme aktiviert. -- Verwaltung von Zugangsdaten über einen Passwort-Manager (1Password) mit - Sicherheitsüberwachung. - 5.1.2 Sicherheitsvorgaben für Endgeräte -- Nutzung eines Passwort-Managers (1Password) ist verpflichtend für alle - Mitarbeitenden. -- Watchtower-Funktion von 1Password erkennt unsichere oder kompromittierte - Passwörter und alarmiert Nutzer. -- Alle Geräte müssen aktuelle Sicherheitsupdates installiert haben. -- Es sind Firewall und Virenschutz-Software aktiviert. - 5.1.3 Berechtigungsmanagement -- Nutzerzugriffe werden über Google Workspace verwaltet. -- Berechtigungen werden nach dem Need-to-Know-Prinzip vergeben und regelmäßig - überprüft. -- Kritische Änderungen an Berechtigungen erfolgen dokumentiert und mit Zustimmung - einer berechtigten Person. - 5.2 Datenverschlüsselung -- Transportverschlüsselung (TLS 1.2/1.3) für alle Cloud-Kommunikationen. -- AES-256-Verschlüsselung für gespeicherte Daten innerhalb der eingesetzten - Cloud-Dienste. -- Ende-zu-Ende-Verschlüsselung für besonders sensible Daten innerhalb der Systeme. - 5.3 Netzwerksicherheit -- Zugriff auf Cloud-Dienste wird durch Sicherheitsrichtlinien gesteuert, um unbefugten - Zugriff zu verhindern. -- Bestimmte sicherheitskritische Dienste erfordern zusätzliche Freigaben, um Zugriff - auf sensible Daten zu ermöglichen. -- Sicherheitsmechanismen der Cloud-Plattformen werden zur Erkennung verdächtiger - Aktivitäten genutzt. - 5.4 Backup- und Notfallmanagement - 5.4.1 3-2-1-Backup-Strategie -- Tägliche Backups aller personenbezogenen Daten mit Versionierung und - Zugriffsbeschränkungen. -- Daten werden gemäß der 3-2-1-Backup-Strategie gesichert: -- 3 Kopien der Daten werden auf unterschiedlichen Speicherorten vorgehalten. -- 2 verschiedene Medientypen werden für die Sicherung verwendet (z. B. - Cloud-Storage & verschlüsselte Offline-Backups). -- 1 Backup befindet sich an einem separaten Standort zur Ausfallsicherheit. -- Backups sind verschlüsselt und nur für berechtigte Personen zugänglich. - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 4 / 23 - -5.4.2 Notfall- und Wiederherstellungsmaßnahmen - -- Alle Cloud-Dienste sind auf Hochverfügbarkeit ausgelegt, um Ausfälle und - Datenverluste zu minimieren. -- Datenwiederherstellung wird regelmäßig getestet, um die Integrität der Backups zu - gewährleisten. -- Notfallprozesse sind dokumentiert und werden regelmäßig aktualisiert. - 5.5 Protokollierung und Monitoring - 5.5.1 Logging von Zugriffen und Änderungen -- Alle Zugriffe auf Cloud-Dienste werden automatisch protokolliert (Google Workspace - Security Logs). -- Verdächtige Aktivitäten werden erkannt und gemeldet. -- Revisionssichere Speicherung von Audit-Logs, um Zugriffe nachverfolgen zu können. - 5.5.2 Sicherheitsüberwachung -- Google Security- und Überwachungsfunktionen werden zur Erkennung von - Sicherheitsbedrohungen eingesetzt. -- Automatische Benachrichtigungen bei sicherheitskritischen Ereignissen. -- Regelmäßige Überprüfung der Protokolle durch den Datenschutzbeauftragten. - -6. Organisatorische Maßnahmen (Prozesse & Richtlinien) - Die Memoro GmbH setzt neben technischen Schutzmaßnahmen auch organisatorische - Maßnahmen um, um die Sicherheit und den Datenschutz der verarbeiteten personenbezogenen - Daten zu gewährleisten. - 6.1 Datenschutzrichtlinien und Schulungen - -- Interne Datenschutzrichtlinien sind dokumentiert und für alle Mitarbeitenden verbindlich. -- Alle Mitarbeitenden müssen eine Verpflichtung zur Vertraulichkeit und zum - Datenschutz gemäß Art. 5 und Art. 32 DSGVO unterzeichnen. -- Regelmäßige Datenschutz- und IT-Sicherheitsschulungen für alle Mitarbeitenden. -- Datenschutz-Themen sind Bestandteil des Onboardings für neue Mitarbeitende. - 6.2 Verwaltung von Benutzerrechten -- Zugriff auf personenbezogene Daten erfolgt nach dem Prinzip der minimalen - Berechtigungen (Need-to-Know-Prinzip). -- Rechte werden dokumentiert und regelmäßig überprüft. -- Kritische Änderungen an Zugriffsrechten erfolgen nur mit dokumentierter Genehmigung. -- Alle Zugriffe werden protokolliert und regelmäßig auf unbefugte Aktivitäten überprüft. - 6.3 Umgang mit externen Dienstleistern -- Die Memoro GmbH nutzt externe Dienstleister und Cloud-Anbieter, um bestimmte - Verarbeitungstätigkeiten durchzuführen. -- Eine Liste der relevanten externen Dienstleister wird geführt und regelmäßig aktualisiert. - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 5 / 23 - -- Externe Dienstleister mit Zugriff auf personenbezogene Daten müssen - DSGVO-konform sein und die gesetzlichen Anforderungen erfüllen. -- Die datenschutzrechtliche Absicherung erfolgt je nach Anbieter durch: -- Einen Auftragsverarbeitungsvertrag (AVV) gemäß Art. 28 DSGVO, sofern der - Dienstleister als Auftragsverarbeiter tätig ist. -- Datenverarbeitungsbedingungen (DPA), falls der Anbieter eine standardisierte - Regelung zur DSGVO-Compliance bereitstellt. -- Standardvertragsklauseln (SCC) gemäß Art. 46 DSGVO, falls personenbezogene - Daten in ein Drittland ohne Angemessenheitsbeschluss übermittelt werden. -- Transfer Impact Assessments (TIA) zur Risikobewertung bei Datenübermittlungen - in Drittländer. - -- Vor der Beauftragung neuer Dienstleister wird geprüft, ob eine - Datenschutz-Folgenabschätzung (DSFA) gemäß Art. 35 DSGVO erforderlich ist. -- Datenübermittlungen an Dritte erfolgen nur auf einer rechtlichen Grundlage, z. B. - Einwilligung, vertragliche Notwendigkeit oder gesetzliche Verpflichtung. - 6.3.2 Nutzung von Payment-/Abo-Dienstleistern -- Für die Abwicklung von In-App-Käufen und Abo-Verwaltung wird ein externer Dienstleister - genutzt. -- Ein Auftragsverarbeitungsvertrag (AVV) gemäß Art. 28 DSGVO ist vorhanden. -- Bei Übermittlungen in Drittländer (USA) werden Standardvertragsklauseln (SCC) - eingesetzt. -- Die Datenübertragung erfolgt TLS-verschlüsselt, und es findet nur eine - pseudonymisierte bzw. minimierte Übermittlung relevanter Abodaten statt. -- Das Einhalten von Sicherheits- und Compliance-Standards (z. B. SOC 2, ISO 27001) - wird regelmäßig überprüft. - 6.4 Datenschutz-Folgenabschätzung (DSFA) -- Für Verarbeitungen mit hohem Risiko für die Rechte und Freiheiten betroffener Personen - wird eine Datenschutz-Folgenabschätzung gemäß Art. 35 DSGVO durchgeführt. -- Die DSFA erfolgt nach einer standardisierten internen Bewertung und wird in kritischen - Fällen mit der Aufsichtsbehörde abgestimmt. - - 6.5 Grundsätze zur Datenaufbewahrung und Löschkonzept - Die Memoro GmbH folgt strikt den Grundsätzen der Datenminimierung und Speicherbegrenzung - gemäß Art. 5 Abs. 1 lit. e DSGVO. Personenbezogene Daten werden nur so lange in einer Form - gespeichert, die die Identifizierung der betroffenen Personen ermöglicht, wie es für die Zwecke, für - die sie verarbeitet werden, erforderlich ist. - Dieses Kapitel beschreibt das verbindliche Löschkonzept der Memoro GmbH und ersetzt eine - separate Richtlinie zur Datenaufbewahrung. Es legt die konkreten Fristen für die Löschung der - verschiedenen Datenkategorien fest. - 6.5.1 Reguläre Speicher- und Löschfristen - Die folgenden Fristen gelten für die in den aktiven Systemen der Memoro GmbH verarbeiteten - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 6 / 23 - -Daten: - -Datenkategorie Zweck der Verarbeitung Speicherdauer & Löschfrist -Inhaltsdaten -(Audioaufnahmen, -Transkripte & -Analysen/"Memories") - -Bereitstellung der -Kernfunktionalität der -Memoro App; dauerhafter -Zugriff für den Nutzer auf -seine Inhalte. - -Gespeichert, solange das -Nutzerkonto besteht. Die -Daten werden -unverzüglich gelöscht, -wenn der Nutzer die -jeweilige Memo oder seinen -gesamten Account löscht. - -Account-Daten (z.B. -E-Mail-Adresse, Name, -Passwort-Hash) - -Authentifizierung, -Verwaltung des -Nutzerkontos und -Kommunikation mit dem -Nutzer. - -Gespeichert, solange das -Nutzerkonto besteht. Bei -Löschanfrage des Accounts -werden diese Daten -innerhalb von 30 Tagen aus -den aktiven Systemen -entfernt. - -Technische -Protokolldaten (z.B. -IP-Adressen, Server-Logs) - -Gewährleistung der -Sicherheit, Stabilität und -Funktionsfähigkeit der -Infrastruktur; Erkennung -und Abwehr von Angriffen. - -Die Speicherung erfolgt für -maximal 90 Tage. Danach -werden die Daten -automatisch gelöscht oder -vollständig anonymisiert. - -Produktanalysedaten (via -PostHog) - -Verbesserung der -Nutzererfahrung und -Optimierung der -App-Funktionen. - -Die Daten werden -pseudonymisiert erfasst und -nach spätestens 12 -Monaten automatisch -gelöscht. - -Zahlungs- & -Vertragsdaten (bei -Abonnements) - -Abwicklung von -Abonnements; Erfüllung -vertraglicher Pflichten. - -Daten zum -Abonnementstatus werden -bis zur Beendigung des -Vertragsverhältnisses -gespeichert. - -6.5.1.1 Sonderregelungen für Organisationskunden -Für Organisationskunden können im Rahmen des Auftragsverarbeitungsvertrags (AVV) -abweichende Löschfristen vereinbart werden. Diese Sonderregelungen haben Vorrang vor den -Standardfristen und können umfassen: - -Automatische Löschung nach definierten Zeiträumen: - -- Organisationen können festlegen, dass alle Inhaltsdaten (Audioaufnahmen, Transkripte und - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 7 / 23 - -Analysen) ihrer Mitarbeiter automatisch nach einem vereinbarten Zeitraum gelöscht werden - -- Die Löschung erfolgt unwiderruflich und umfasst alle zugehörigen Daten des jeweiligen - Memos -- Mitarbeiter werden vorab über die organisationsspezifischen Löschfristen informiert - Die konkreten Löschfristen und -modalitäten werden im jeweiligen AVV dokumentiert und technisch - implementiert." - - 6.5.2 Gesetzliche Aufbewahrungspflichten - Ungeachtet der oben genannten Löschfristen können gesetzliche Aufbewahrungspflichten eine - längere Speicherung bestimmter Daten erfordern. Insbesondere kaufmännische oder - steuerrechtliche Vorgaben (z.B. aus dem Handelsgesetzbuch (HGB) oder der Abgabenordnung - (AO)) können eine Aufbewahrung von rechnungsrelevanten Unterlagen von bis zu 10 Jahren - vorschreiben. Sollten Daten der Memoro GmbH solchen Pflichten unterliegen, werden sie für die - Dauer der gesetzlichen Frist aufbewahrt. Nach Ablauf der Frist erfolgt die Löschung. Diese Daten - werden für die Dauer der Aufbewahrung für andere Zwecke gesperrt. - 6.5.3 Umgang mit Daten in Backups - Zur Gewährleistung der Datensicherheit und für den Notfall (Disaster Recovery) werden - regelmäßig verschlüsselte Backups unserer Systeme erstellt. Für Daten in Backups gilt folgendes - spezielles Löschverfahren: - -1. Keine selektive Löschung: Aus technischen Gründen ist es nicht möglich, einzelne - Datensätze aus bestehenden Backup-Archiven zu entfernen. -2. Sperrung im Live-System: Sobald ein Nutzer seine Daten im aktiven System löscht, sind - diese nicht mehr zugänglich und werden nicht mehr verarbeitet. -3. Endgültige Löschung durch Überschreibung: Die in Backups enthaltenen, zur Löschung - markierten Daten werden im Zuge des regulären Backup-Zyklus endgültig und unwiderruflich - überschrieben. Die maximale Vorhaltezeit für Backups beträgt 30 Tage. -4. Zweckbindung: Während ihrer Speicherfrist werden Backups ausschließlich für den Zweck - der Datensicherheit und Wiederherstellung vorgehalten und nicht für operative - Geschäftsprozesse genutzt. - 6.5.4 Ausübung des Rechts auf Löschung - Jeder Nutzer kann sein Recht auf Löschung ("Recht auf Vergessenwerden" gemäß Art. 17 - DSGVO) jederzeit ausüben. Die Löschung einzelner Memos oder des gesamten Accounts kann - direkt in den Einstellungen der Memoro App vorgenommen werden. Für darüberhinausgehende - Löschanfragen steht unser Datenschutzbeauftragter zur Verfügung. Die Löschung erfolgt - fristgerecht gemäß den oben beschriebenen Prozessen. - 6.6 Umgang mit Datenschutzverletzungen - -- Datenschutzverletzungen werden intern dokumentiert und gemäß Art. 33 DSGVO - bewertet. -- Falls erforderlich, erfolgt eine Meldung an die zuständige Aufsichtsbehörde innerhalb - von 72 Stunden. - Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 8 / 23 - -- Betroffene Personen werden gemäß Art. 34 DSGVO informiert, wenn ein hohes Risiko - besteht. -- Vorfallsmanagement-Prozesse sind definiert und beinhalten Eskalationsstufen für - kritische Sicherheitsereignisse. - 6.7 Nachweise und Protokolle -- Liste der eingesetzten IT-Systeme und Verarbeitungsprozesse ist dokumentiert. -- Schulungsnachweise und Verpflichtungserklärungen werden revisionssicher archiviert. -- Zugriffsprotokolle und Audit-Logs werden regelmäßig überprüft. -- Interne und externe Datenschutzprüfungen sind dokumentiert und erfolgen regelmäßig. - -7. Nachweise und Protokolle - Die Memoro GmbH dokumentiert alle relevanten Datenschutzmaßnahmen und führt regelmäßige - Prüfungen durch, um die Einhaltung der DSGVO nachweisen zu können. - 7.1 Verzeichnis von Verarbeitungstätigkeiten - -- Ein Verzeichnis aller Verarbeitungstätigkeiten gemäß Art. 30 DSGVO wird geführt und - regelmäßig aktualisiert. -- Dieses enthält insbesondere: -- Zweck und Rechtsgrundlagen der Verarbeitung -- Kategorien betroffener Personen und personenbezogener Daten -- Empfänger von Daten, einschließlich externer Dienstleister -- Technische und organisatorische Maßnahmen (TOMs) - - 7.2 Schulungen und Verpflichtungserklärungen - -- Alle Mitarbeitenden werden regelmäßig zu Datenschutz und IT-Sicherheit geschult. -- Die Schulungsinhalte und Teilnehmerlisten werden dokumentiert. -- Alle Mitarbeitenden müssen eine Verpflichtung zur Vertraulichkeit gemäß Art. 5 und 32 - DSGVO unterzeichnen. - 7.3 Zugriffskontrollen und Berechtigungsmanagement -- Vergabe und Änderungen von Zugriffsrechten werden dokumentiert. -- Regelmäßige Überprüfung der Zugriffsrechte, um nicht mehr benötigte Berechtigungen - zu entfernen. -- Protokollierung von administrativen Änderungen und sicherheitskritischen Zugriffen. - 7.4 Protokollierung von Zugriffen und Änderungen -- Zugriffsprotokolle auf Cloud-Dienste (Google Workspace Security Logs, Audit-Logs von - Cloud-Anbietern) werden revisionssicher gespeichert. -- Alle sicherheitskritischen Änderungen an Daten, Zugriffsrechten und Einstellungen werden - automatisch protokolliert. -- Protokolldaten werden regelmäßig ausgewertet, um verdächtige Aktivitäten frühzeitig zu - erkennen. - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 9 / 23 - -7.5 Datenschutz-Audits und Prüfberichte - -- Interne Datenschutzprüfungen werden regelmäßig durchgeführt und dokumentiert. -- Falls erforderlich, werden externe Datenschutzprüfungen oder Zertifizierungen in - Betracht gezogen. -- Ergebnisse von Audits werden mit Maßnahmen zur kontinuierlichen Verbesserung - verbunden. - 7.6 Umgang mit Datenschutzvorfällen -- Dokumentation aller Datenschutzvorfälle mit Risikobewertung und ergriffenen - Gegenmaßnahmen. -- Falls eine Meldung an die Aufsichtsbehörde gemäß Art. 33 DSGVO erforderlich ist, - erfolgt dies innerhalb der vorgeschriebenen 72-Stunden-Frist. -- Betroffene Personen werden gemäß Art. 34 DSGVO informiert, falls ein hohes Risiko für - ihre Rechte und Freiheiten besteht. - 7.7 Speicherfristen für Nachweise und Protokolle -- Schulungsnachweise und Verpflichtungserklärungen werden mindestens 3 Jahre - aufbewahrt. -- Zugriffsprotokolle und sicherheitskritische Logs werden für mindestens 12 Monate - gespeichert, sofern keine längeren Speicherfristen erforderlich sind. -- Datenschutzprüfungen und Audit-Berichte werden mindestens 5 Jahre archiviert. - -8. Regelmäßige Aktualisierung und Kontrolle - Die Memoro GmbH stellt sicher, dass alle technischen und organisatorischen Maßnahmen (TOMs) - regelmäßig überprüft, aktualisiert und an neue rechtliche und technische Anforderungen angepasst - werden. - 8.1 Verantwortlichkeit für die Wartung des Dokuments - -- Die Verantwortung für die Aktualisierung der TOM-Dokumentation liegt bei der - Geschäftsführung und dem Datenschutzbeauftragten. -- Anpassungen erfolgen in Abstimmung mit IT-Sicherheit, Compliance und relevanten - Fachabteilungen. - 8.2 Regelmäßige Überprüfung der TOMs -- Jährliche Kontrolle und Aktualisierung der TOMs, um neue gesetzliche, technische oder - organisatorische Änderungen zu berücksichtigen. -- Zusätzliche Überprüfung erfolgt bei: -- Änderungen in der IT-Infrastruktur oder den eingesetzten Cloud-Diensten. -- Änderungen in den Verarbeitungstätigkeiten oder den verarbeiteten Daten. -- Relevanten Gesetzesänderungen oder neuen regulatorischen Anforderungen. -- Ergebnissen interner oder externer Datenschutzprüfungen. - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 10 / 23 - -8.3 Audit- und Kontrollmechanismen - -- Interne Datenschutz- und Sicherheitsaudits werden mindestens einmal jährlich - durchgeführt. -- Externe Datenschutzprüfungen oder Zertifizierungen werden nach Bedarf in Betracht - gezogen. -- Ergebnisse aus Audits und Prüfungen werden dokumentiert und für zukünftige - Optimierungen genutzt. - 8.4 Änderungsmanagement und Dokumentation -- Jede Änderung an den TOMs wird dokumentiert und in einer Änderungshistorie - festgehalten. -- Änderungen werden mit Versionsnummer, Datum und verantwortlicher Person - gekennzeichnet. -- Mitarbeitende werden über wesentliche Änderungen informiert, insbesondere wenn - diese Auswirkungen auf Sicherheits- oder Datenschutzmaßnahmen haben. - 8.5 Sensibilisierung und Schulung -- Mitarbeitende werden regelmäßig über aktualisierte Sicherheits- und - Datenschutzmaßnahmen informiert. -- Jährliche Datenschutz- und IT-Sicherheitsschulungen werden aktualisiert, um neue - Maßnahmen oder gesetzliche Änderungen abzubilden. - 8.6 Notfallkontrolle und Reaktionsstrategie -- Unvorhergesehene Sicherheitsvorfälle oder Datenschutzverletzungen lösen eine - sofortige Überprüfung der TOMs aus. -- Falls erforderlich, werden Sofortmaßnahmen zur Risikominimierung implementiert. -- Lessons Learned aus Vorfällen fließen in die Weiterentwicklung der - Sicherheitsmaßnahmen ein. - -9. Risikoanalyse - 9.1 Ziel der Risikoanalyse - Die Risikoanalyse dient dazu, potenzielle Datenschutz- und Sicherheitsrisiken im Zusammenhang - mit der Verarbeitung personenbezogener Daten innerhalb der Memoro GmbH zu identifizieren - und geeignete Maßnahmen zur Risikominimierung zu definieren. Sie erfüllt die Anforderungen aus - Art. 32 DSGVO (Sicherheit der Verarbeitung) sowie Art. 35 DSGVO - (Datenschutz-Folgenabschätzung – DSFA) für risikobehaftete Verarbeitungstätigkeiten. - Memoro verfolgt einen risikobasierten Ansatz, bei dem Bedrohungen anhand ihrer - Eintrittswahrscheinlichkeit und möglichen Auswirkungen bewertet werden. Ziel ist es, - Sicherheitslücken frühzeitig zu erkennen und durch technische und organisatorische Maßnahmen - zu minimieren. - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 11 / 23 - -9.2 Identifizierte Risiken und Gegenmaßnahmen -9.2.1 Technische Risiken -Risiko Beschreibung Gegenmaßnahmen -Datenverlust durch -Systemausfall - -Verlust gespeicherter Daten -durch Hard- oder -Softwarefehler - -Tägliche Backups, 3-2-1 - -Backup-Strategie, Notfall- -Wiederherstellungspläne - -Unbefugter Zugriff auf -Sprachaufnahmen & -Transkripte - -Kompromittierung -persönlicher Daten durch -Angreifer - -AES-256 Verschlüsselung, -Zugriff nur für autorisierte -Nutzer, -Zero-Trust-Sicherheitsmode -ll - -Hackerangriffe (DDoS, -Brute-Force) - -Versuch, Memoro-Dienste -durch Überlastung oder -Hacking zu stören - -DDoS-Schutz, Firewalls mit -Intrusion Detection System -(IDS), Rate Limiting - -Missbrauch von -API-Schnittstellen - -Exploits durch unbefugte -API-Nutzung - -OAuth 2.0-Authentifizierung, -Rate Limits für API-Zugriffe, -regelmäßige -Sicherheitsüberprüfungen - -Externe -Cloud-Sicherheitsrisiken - -Datenleck oder Ausfall durch -Anbieter wie Google Cloud -oder Azure - -Cloud-Sicherheitsüberprüfu -ng (SOC2, ISO 27001), -regelmäßige -Penetrationstests - -9.2.2 Organisatorische Risiken -Risiko Beschreibung Gegenmaßnahmen -Fehlende -Datenschutzschulungen - -Mitarbeitende könnten -unbeabsichtigt -Datenschutzverstöße -begehen - -Regelmäßige Datenschutz- -und - -IT-Sicherheitsschulungen, -verpflichtende Zertifizierungen - -Fehlende Kontrolle über -externe Dienstleister - -Risiken durch Cloud-Anbieter, -Auftragsverarbeiter oder Dritte - -Auftragsverarbeitungsverträ -ge (AVV) mit Dienstleistern, -regelmäßige -Compliance-Prüfungen - -9.2.3 Datenschutzrechtliche Risiken -Risiko Beschreibung Gegenmaßnahmen -Fehlende oder unklare -Einwilligung - -Nutzer könnten nicht -ausreichend über - -Transparente -Datenschutzerklärung, - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 12 / 23 - -Risiko Beschreibung Gegenmaßnahmen - -Datenverarbeitung informiert -sein - -aktive Einwilligung vor -Aufnahme, -DSGVO-konformes Opt-in - -Fehlende -Datenschutz-Folgenabschät -zung (DSFA) - -KI-gestützte Verarbeitung -könnte ein hohes Risiko für -Betroffene darstellen - -DSFA regelmäßig -aktualisieren, unabhängige -Datenschutzprüfung einholen - -Nichteinhaltung -organisationsspezifischer -Löschfristen - -Versäumnis der -automatischen Löschung nach -vereinbarten Zeiträumen - -Automatisierte Löschprozesse -mit täglicher Überprüfung; -Monitoring und Alerting bei -Löschfehlern; redundante -Löschmechanismen; -monatliche -Compliance-Reports - -9.2.4 Betriebsrisiken -Risiko Beschreibung Gegenmaßnahmen -Skalierungsprobleme bei -hohem Nutzeraufkommen - -Überlastung der Infrastruktur -könnte zu -Performance-Einbußen führen - -Dynamische Skalierung und -Lasttests zur Optimierung - -Datenverfügbarkeit & -Wiederherstellung - -Unzureichende Notfallplanung -könnte zu Datenverlust führen - -Notfall-Wiederherstellungsplä -ne (Disaster Recovery -Plans), jährliche Tests der -Backups - -9.3 Kontinuierliche Überprüfung und Verbesserung -Die identifizierten Risiken werden regelmäßig im Rahmen von internen Audits und -Datenschutzprüfungen evaluiert. Falls erforderlich, werden Maßnahmen zur Risikominimierung -aktualisiert und dokumentiert. -Die Risikoanalyse wird: - -- Mindestens einmal jährlich aktualisiert oder wenn sich wesentliche Änderungen in den - Verarbeitungstätigkeiten ergeben. -- In Zusammenarbeit mit IT-Sicherheit und Datenschutzbeauftragten überprüft. -- Als Grundlage für Datenschutz-Folgenabschätzungen (DSFA) nach Art. 35 DSGVO - verwendet. - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 13 / 23 - -10. Zertifizierungen - 10.1 Microsoft Azure Compliance - Die Memoro GmbH nutzt Microsoft Azure als Teil ihrer Infrastruktur. Microsoft Azure stellt - umfassende technische und organisatorische Sicherheitsmaßnahmen (TOMs) bereit, die eine - sichere und DSGVO-konforme Verarbeitung personenbezogener Daten gewährleisten. - Microsoft verpflichtet sich vertraglich zur Einhaltung der Datenschutz-Grundverordnung - (DSGVO) durch die Microsoft Online Services Terms, die Standardvertragsklauseln (SCC) - und die EU Data Boundary. Weitere Details sind unter Microsoft Azure Compliance abrufbar. - Globale und EU-spezifische Compliance-Zertifizierungen - Microsoft Azure erfüllt eine Vielzahl an internationalen und europäischen Sicherheitsstandards: - -- ISO/IEC 27001 – Informationssicherheits-Managementsystem (ISMS) -- ISO/IEC 27017 – Sicherheitskontrollen für Cloud-Dienste -- ISO/IEC 27018 – Schutz personenbezogener Daten in Public Clouds -- ISO/IEC 27701 – Privacy Information Management System (PIMS) -- ISO 22301 – Business Continuity Management (BCMS) -- ISO 9001 – Qualitätsmanagementsystem -- SOC 1, SOC 2, SOC 3 – Prüfberichte zur Sicherheitsvalidierung -- PCI DSS – Schutz von Zahlungsverkehrsdaten -- CSA STAR – Ergänzende Cloud-Sicherheitsbewertungen -- EU GDPR/DSGVO-konform – Standardvertragsklauseln (SCC), EU Cloud CoC (Scope - Europe zertifiziert) - Datenschutzmaßnahmen in Azure -- Volle Kontrolle über Kundendaten – Microsoft verarbeitet Daten nur gemäß vertraglicher - Vereinbarung. -- Keine Nutzung für Werbezwecke – Kundendaten werden nicht für Marketingzwecke - verwendet. -- Regionale Speicherung – Microsoft bietet die Möglichkeit der Speicherung von Daten - innerhalb der EU gemäß EU Data Boundary. -- Revisionssichere Löschung – Microsoft stellt Tools zur Verfügung, die eine - revisionssichere Löschung gemäß Kundenanforderungen ermöglichen. - Verschlüsselung und Datensicherheit -- Datenverschlüsselung im Ruhezustand (at rest) -- AES-256-Verschlüsselung -- FIPS 140-2-konforme Verschlüsselung -- Unterstützung von kundengemanagten Schlüsseln (Azure Key Vault) -- Azure Confidential Computing – Hardwarebasierte Verschlüsselung zur Isolierung - sensibler Daten - -- Datenverschlüsselung während der Übertragung (in transit) -- TLS 1.2/1.3 für sichere Datenkommunikation -- IEEE 802.1AE MAC Security zur Netzwerksicherheit - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 14 / 23 - -Zugriffskontrollen und Berechtigungen - -- Azure Role-Based Access Control (RBAC) für granulare Berechtigungen -- Azure Information Protection (AIP) für den Schutz sensibler Daten -- Multi-Faktor-Authentifizierung (MFA) für privilegierte Konten -- Zero Trust Security Model – Zugriffskontrolle durch kontinuierliche Authentifizierung und - Geräteintegritätsprüfungen - Microsoft Azure KI-Compliance - Microsoft aktualisiert regelmäßig seine Compliance-Maßnahmen, um neue regulatorische - Anforderungen wie den EU AI Act zu erfüllen. - Externe regulatorische Vorgaben -- EU AI Act (ab 2025) -- Transparenzpflichten (z. B. Kennzeichnung KI-generierter Inhalte) -- Strenge Dokumentationsanforderungen für Hochrisiko-KI -- Verbot der automatisierten Emotionserkennung in Bildung/Arbeitsplatz sowie - Echtzeit-Fernbiometrie durch Strafverfolgung (Art. 5 EU AI Act) - -- ISO 42001:2023 (KI-Managementsysteme) -- Risikobewertung, Ethikrichtlinien und Nachvollziehbarkeit von KI-Entscheidungen - -Microsoft-interne KI-Governance - -- Responsible AI Standard (Version 2) -- Bias-Erkennung und Fairness-Prüfung in Azure Machine Learning -- Explainability-APIs für transparente Entscheidungsfindung -- Content Safety zur Verhinderung von Missbrauch (z. B. Schutz vor Prompt Injection) -- Azure OpenAI EU-Region – Der Azure OpenAI Service wird in EU-Rechenzentren - gemäß EU Data Boundary betrieben. - Notfallmanagement und Incident Response - Microsoft implementiert ein strukturiertes Incident Response Model: - -1. Erkennung einer Sicherheitsverletzung -2. Analyse der Bedrohung und Bewertung der Auswirkungen -3. Reaktionsmaßnahmen, um das Risiko zu minimieren -4. Stabilisierung der betroffenen Systeme -5. Schließung des Vorfalls mit Lessons Learned - Microsoft verpflichtet sich, Kunden innerhalb von 72 Stunden über Datenschutzverletzungen zu - informieren. Microsoft bietet forensische Unterstützung, aber die finale DSGVO-Meldepflicht - gemäß Art. 33 DSGVO bleibt beim Kunden (Memoro GmbH). - Gemeinsame Verantwortung für Datenschutz und Sicherheit - Das Shared Responsibility Model definiert klare Abgrenzungen zwischen Microsoft und Kunden: - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 15 / 23 - -Microsoft Verantwortung Kundenverantwortung -Sichere Cloud-Infrastruktur Konfiguration und Absicherung der - -Cloud-Umgebung - -Netzwerksicherheit & Compliance Zugangskontrollen und Datenverschlüsselung -Zertifizierungen & Audit-Berichte Eigenständige Prüfung von -Compliance-Anforderungen - -10.2 Google Cloud Compliance -Die Memoro GmbH nutzt Google Cloud als Teil ihrer Infrastruktur. Google Cloud stellt -umfangreiche technische und organisatorische Sicherheitsmaßnahmen (TOMs) bereit, um -Datenschutz, Compliance und regulatorische Anforderungen in der EU zu gewährleisten. -Google verpflichtet sich zur Einhaltung der Datenschutz-Grundverordnung (DSGVO) durch -Standardvertragsklauseln (SCCs) sowie technische Maßnahmen wie EU Data Boundaries für -bestimmte Dienste. Weitere Details sind unter Google Cloud Compliance abrufbar. -Globale und EU-spezifische Compliance-Zertifizierungen -Google Cloud erfüllt folgende internationale und europäischen Sicherheitsstandards: - -- ISO/IEC 27001 – Informationssicherheits-Managementsystem (ISMS) -- ISO/IEC 27017 – Cloud-spezifische Sicherheitskontrollen -- ISO/IEC 27018 – Schutz personenbezogener Daten in Public Clouds -- ISO/IEC 27701 – Datenschutzmanagementsystem für DSGVO-Anforderungen -- ISO 9001 – Qualitätsmanagementsystem -- SOC 1, SOC 2, SOC 3 – Prüfberichte zur Sicherheitsvalidierung -- PCI DSS – Schutz von Zahlungsverkehrsdaten -- CSA STAR – Ergänzende Cloud-Sicherheitsbewertungen -- EU GDPR/DSGVO-konform – Standardvertragsklauseln (SCC), EU Cloud Code of - Conduct - Regionale Zertifizierungen und Compliance -- DSGVO (GDPR) – Google Cloud erfüllt DSGVO-Anforderungen durch - Standardvertragsklauseln (SCCs) und optionale Datenlokalisierung über EU Data - Boundaries für bestimmte Dienste. -- EU Cloud Code of Conduct (Scope Europe zertifiziert) – Konformität mit - DSGVO-Standards für Google Cloud Platform. -- C5:2020 (BSI, Deutschland) – Zertifizierung des Bundesamts für Sicherheit in der - Informationstechnik. - EU Data Boundaries und Datenlokalisierung - Google Cloud bietet EU Data Boundaries zur Speicherung und Verarbeitung von Daten innerhalb - der EU an. Dabei gelten folgende Einschränkungen: - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 16 / 23 - -- Unterstützte Dienste: Compute Engine und Vertex AI, die Memoro nutzt, werden - vollständig in der EU betrieben, in Belgien. -- Technische Maßnahmen zur Absicherung: -- VPC Service Controls begrenzen Datenbewegungen außerhalb der EU. -- IAM-Richtlinien steuern Zugriffskontrollen für Datenverarbeitung in der EU. -- Client-seitige Verschlüsselung stellt sicher, dass Daten nur mit - kundenspezifischen Schlüsseln verarbeitet werden. - Technische Sicherheitsmaßnahmen und Infrastruktur -- Datenverschlüsselung – Alle Daten werden im Ruhezustand (AES-256) und während - der Übertragung (TLS 1.2/1.3) verschlüsselt. -- Zugriffskontrolle – IAM (Identity and Access Management), VPC Service Controls und - Firebase Security Rules gewährleisten granulare Berechtigungsstrukturen. -- Audit-Logs und Monitoring – Google Cloud Logging/Stackdriver und das Security - Command Center ermöglichen eine kontinuierliche Sicherheitsüberwachung. - 10.4 Supabase Compliance und Datenschutzmaßnahmen - Die Memoro GmbH nutzt Supabase als Backend-Plattform, die Datenbankdienste, - Authentifizierung, Speicherlösungen und Serverless-Funktionen bereitstellt. Supabase verpflichtet - sich zur Einhaltung der Datenschutz-Grundverordnung (DSGVO) und anderer relevanter - Datenschutzgesetze. Die Verarbeitung personenbezogener Daten durch Supabase ist durch ein - Data Processing Addendum (DPA), Version vom 02. Juni 2025, geregelt, das - Standardvertragsklauseln (SCCs) für internationale Datentransfers beinhaltet. - Datenübertragung und Speicherorte: Der primäre Speicherort für alle Kundendaten der Memoro - GmbH (insbesondere Audioaufnahmen, Transkripte, Analysen und Nutzer-Accountdaten) befindet - sich ausschließlich in einem Rechenzentrum in Frankfurt, Deutschland. - Mögliche Datenübermittlung in Drittländer (USA): Obwohl unsere Kundendaten die EU - physisch nicht verlassen, ist Supabase ein Unternehmen mit Sitz in den USA. Daher kann in - folgenden, eng begrenzten Fällen ein Zugriff auf Daten aus den USA oder eine Übermittlung von - Metadaten stattfinden: - ● Wartungs- und Supportarbeiten: Wenn technische Unterstützung durch - Supabase-Mitarbeiter erforderlich ist, die ihren Sitz außerhalb der EU (z.B. in den USA) - haben, kann ein Zugriff auf die in der EU gespeicherten Daten notwendig sein. Dieser - Zugriff erfolgt nach dem "Need-to-know"-Prinzip und ist streng reglementiert. - ● Nutzung von Subdienstleistern durch Supabase: Supabase selbst nutzt - Unterauftragsverarbeiter (z.B. für Monitoring oder Support-Tickets), die ihren Sitz in den - USA haben könnten. Hierbei werden in der Regel nur Metadaten oder - Support-Kommunikation verarbeitet, nicht jedoch die Kern-Nutzerdaten (Aufnahmen, - Transkripte). - ● Anforderungen durch US-Behörden (z.B. via CLOUD Act): Ein Restrisiko, dass - US-Behörden Zugriff auf Daten von US-Unternehmen verlangen, kann rechtlich nicht - vollständig ausgeschlossen werden. - Rechtsgrundlage und Schutzmaßnahmen: Für all diese potenziellen Übermittlungsszenarien - dient der mit Supabase geschlossene Auftragsverarbeitungsvertrag (AVV) inklusive der - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 17 / 23 - -EU-Standardvertragsklauseln (SCCs) als rechtliche Grundlage. Diese Maßnahmen, kombiniert -mit den technischen Vorkehrungen von Supabase (z.B. Verschlüsselung), stellen sicher, dass das -Datenschutzniveau dem der EU entspricht. -Wichtige Compliance-Aspekte und Zertifizierungen: - -- SOC 2 Type 2: Supabase ist SOC 2 Typ 2 konform, was die Sicherheit, Verfügbarkeit, - Verarbeitungsintergrität, Vertraulichkeit und den Datenschutz der Kundendaten durch - unabhängige Prüfung bestätigt. -- HIPAA: Supabase ist HIPAA-konform. Die Speicherung von geschützten - Gesundheitsinformationen (Protected Health Information - PHI) ist auf der gehosteten - Plattform möglich, sofern ein Business Associate Agreement (BAA) mit Supabase - abgeschlossen wird und die Memoro GmbH ihre HIPAA-Verpflichtungen im Rahmen des - Shared Responsibility Modells erfüllt. -- Data Processing Addendum (DPA): Ein DPA (Version 02. Juni 2025) ist vorhanden und - regelt die Auftragsverarbeitung. Supabase agiert hierbei als Auftragsverarbeiter für die - Memoro GmbH. Das DPA enthält detaillierte Angaben zu den technischen und - organisatorischen Maßnahmen (Schedule 1), den eingesetzten Unterauftragsverarbeitern - (Schedule 3) und den Standardvertragsklauseln (Schedule 2). - Technische und Organisatorische Maßnahmen (gemäß Supabase DPA Schedule 1 und - Compliance-Informationen): - Datenverschlüsselung: -- Alle Kundendaten werden im Ruhezustand (at rest) mit AES-256 verschlüsselt. -- Daten während der Übertragung (in transit) werden via TLS (mindestens TLS 1.2) - verschlüsselt. -- Sensible Informationen wie Zugriffstoken und Schlüssel werden auf Anwendungsebene - verschlüsselt, bevor sie in der Datenbank gespeichert werden. -- Zugangskontrolle und Authentifizierung: -- Multi-Faktor-Authentifizierung (MFA) kann für Supabase-Nutzerkonten aktiviert werden. -- Interne Zugriffskontrollen basieren auf dem Prinzip der geringsten Rechte (Least Privilege). -- Starke Passwörter und obligatorische Zwei-Faktor-Authentifizierung (nicht SMS-basiert) für - interne Ressourcen bei Supabase. -- Rollenbasierte Zugriffskontrolle (Role-based access control - RBAC) ermöglicht die - granulare Rechtevergabe für Organisationsmitglieder auf spezifische Ressourcen. - Backup- und Notfallmanagement: -- Tägliche Backups für alle kostenpflichtigen Kundendatenbanken. -- Point-in-Time Recovery (PITR) ist als Add-on für Pro-Plan-Kunden verfügbar, um - Datenbanken zu jedem beliebigen Zeitpunkt wiederherzustellen. -- Backups werden verschlüsselt und auf unabhängigen Systemen gespeichert. - Netzwerksicherheit und DDoS-Schutz: -- Schutz vor Distributed Denial of Service (DDoS)-Angriffen auf CDN-Ebene durch - Cloudflare. -- Einsatz von fail2ban zur Verhinderung von Brute-Force-Logins. - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 18 / 23 - -- Möglichkeit zur Konfiguration von Ratenbegrenzungen (Rate Limits) für kritische - API-Routen und Ausgabenlimits (Spend Caps). -- Segmentierung von Kundenprojekten und internen Supabase-Diensten durch Firewalls. - Protokollierung und Monitoring (Audit Trails): -- Protokollierung von Nutzeraktionen und Interaktionen. -- Traffic-Flow-Logs. - Vulnerability Management und Tests: -- Regelmäßige Penetrationstests durch externe Sicherheitsexperten. -- Einsatz von Tools wie GitHub, Vanta und Snyk zur Code-Überprüfung auf Schwachstellen. -- Internes Monitoring und ein Breach Response Plan, der regelmäßig getestet wird. - Umgang mit Sicherheitsvorfällen: -- Supabase benachrichtigt die Memoro GmbH ohne unangemessene Verzögerung - (innerhalb von 48 Stunden nach Kenntnisnahme) über Sicherheitsvorfälle (Security - Incidents), die Kundendaten betreffen. - Datenlöschung: -- Nach Vertragsende können Daten innerhalb einer Frist von 30 Tagen durch die Memoro - GmbH exportiert werden. Anschließend werden die Daten durch Supabase gelöscht. - Unterauftragsverarbeiter (Sub-processors): - Supabase setzt verschiedene Unterauftragsverarbeiter für Hosting, Support und andere Dienste - ein. Eine aktuelle Liste ist im DPA (Schedule 3) enthalten. Zu den wichtigsten gehören: -- Supabase Pte. Ltd (Support) -- Amazon Web Services, Inc. (Hosting) -- Google, LLC (Hosting) -- Cloudflare, Inc. (Hosting, CDN) - Die Memoro GmbH wird mindestens 30 Tage im Voraus über geplante Änderungen bei den - Unterauftragsverarbeitern informiert und hat ein Einspruchsrecht. Ein Restrisiko durch den US - CLOUD Act bei Datenverarbeitung durch US-amerikanische Subprozessoren kann trotz SCCs und - weiterer Maßnahmen nicht vollständig ausgeschlossen werden. - Verantwortungsbewusster Einsatz von Supabase durch die Memoro GmbH: - Die Memoro GmbH setzt Supabase unter Beachtung der Datenschutzgrundsätze ein und ergreift - folgende Maßnahmen zur Gewährleistung einer sicheren und DSGVO-konformen Nutzung: -- Abschluss und Einhaltung des Data Processing Addendums (DPA) mit Supabase, inklusive - der Anwendung der aktuellen Standardvertragsklauseln (SCCs) als Rechtsgrundlage für - Datenübertragungen in die USA. -- Transparente Information der Nutzer über die Datenverarbeitung durch Supabase im - Rahmen der Datenschutzerklärung der Memoro App gemäß Art. 13 DSGVO, insbesondere - über mögliche Datentransfers in die USA. - Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 19 / 23 - -- Konfiguration der Supabase-Dienste nach dem Prinzip der Datenminimierung, sodass nur - für die jeweiligen Zwecke notwendige Daten verarbeitet werden. -- Implementierung starker Authentifizierungsmechanismen und sorgfältige Verwaltung von - Zugriffsrechten innerhalb der Supabase-Umgebung. -- Regelmäßige Überprüfung der rechtlichen und technischen Entwicklungen bezüglich - Supabase und Anpassung der eigenen Datenschutzmaßnahmen bei Bedarf. -- Nutzung der von Supabase bereitgestellten Sicherheitsfeatures wie MFA und rollenbasierte - Zugriffskontrollen. - Durch die Kombination aus den von Supabase implementierten Sicherheitsmaßnahmen, den - vertraglichen Vereinbarungen (DPA und SCCs) und den eigenen organisatorischen und - technischen Maßnahmen gewährleistet die Memoro GmbH ein hohes Datenschutzniveau beim - Einsatz von Supabase. - 10.5 PostHog Compliance und Datenschutzmaßnahmen - Die Memoro GmbH nutzt PostHog als Plattform für Produktanalysen, um das Nutzerverhalten - innerhalb der Memoro App zu verstehen, die Nutzererfahrung zu verbessern und die Anwendung - zu optimieren. PostHog wird als Alternative zu traditionellen Analysediensten wie Google Analytics - eingesetzt, da es als Open Source lizensiert ist und komplett in der EU gehostet werden kann. Bei - der Nutzung von PostHog Cloud agiert PostHog Inc. als Auftragsverarbeiter (Data Processor) und - die Memoro GmbH als Verantwortlicher (Data Controller) im Sinne der DSGVO. - -Datenhosting und Internationale Datentransfers: - -- Hosting: Die Memoro GmbH nutzt das EU-Hosting in Deutschland (Frankfurt) für Posthog, - um Datentransfers in Drittländer zu vermeiden. -- Datentransfers: Sollten Datenübertragungen in die USA oder andere Drittländer ohne - Angemessenheitsbeschluss erforderlich sein (z.B. für bestimmte Support-Prozesse durch - PostHog-Mitarbeiter außerhalb der EU), stützt sich PostHog auf Standardvertragsklauseln - (SCCs) der EU-Kommission und die Zertifizierung unter dem Data Privacy Framework. - -Wichtige Compliance-Aspekte und Zertifizierungen: - -- SOC 2 Type II: PostHog ist SOC 2 Typ II zertifiziert (Bericht vom 31. Mai 2024). Dies - bestätigt, dass PostHog über robuste Kontrollen in Bezug auf Sicherheit, Verfügbarkeit, - Verarbeitungsintegrität, Vertraulichkeit und Datenschutz verfügt. Ein Brückenbrief ist bis - zum nächsten Bericht verfügbar. -- GDPR (DSGVO): PostHog hat seine Architektur, Datenflüsse und Vereinbarungen - überprüft, um die DSGVO-Konformität seiner Plattform sicherzustellen. PostHog stellt - Kunden umfangreiche Kontrollen zur Minimierung der Erfassung personenbezogener - Daten zur Verfügung. -- CCPA: Für Kunden in Kalifornien agiert PostHog als "Service Provider". Ein CCPA-Zusatz - ist Bestandteil der Datenschutzerklärung von PostHog. -- Data Processing Agreement (DPA): Die Memoro GmbH schließt mit PostHog ein Data - Processing Agreement (DPA) ab. PostHog stellt hierfür einen DPA-Generator zur - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 20 / 23 - -Verfügung. Dieses DPA regelt die Auftragsverarbeitung und beinhaltet die -Standardvertragsklauseln (SCCs) für internationale Datentransfers. - -- EU-U.S. Data Privacy Framework: PostHog Inc. ist nach dem EU-U.S. Data Privacy - Framework (EU-U.S. DPF), der UK-Erweiterung zum EU-U.S. DPF und dem Swiss-U.S. - Data Privacy Framework zertifiziert. - -Technische und Organisatorische Maßnahmen (TOMs) von PostHog (Auswahl): -PostHog implementiert eine Vielzahl von Sicherheitsmaßnahmen und unterhält detaillierte interne -Richtlinien zur Gewährleistung der Datensicherheit und des Datenschutzes, die auch im Rahmen -der SOC 2-Zertifizierung geprüft werden. Dazu gehören unter anderem: - -- Zugriffskontrolle: Strenge Zugriffskontrollen und Multi-Faktor-Authentifizierung (MFA) für - interne Systeme. -- Datenverschlüsselung: Verschlüsselung von Daten während der Übertragung (in transit) - und im Ruhezustand (at rest). -- Sicherheitsrichtlinien: Umfassende interne Sicherheitsrichtlinien (z.B. Acceptable Use - Policy, Data Protection Policy, Encryption Policy, Incident Response Plan), die auf Anfrage - eingesehen werden können. -- Schwachstellenmanagement: Regelmäßige Penetrationstests (zuletzt April 2024) und - interne Sicherheitsüberprüfungen. -- Incident Response: Ein definierter Incident Response Plan zur Reaktion auf - Sicherheitsvorfälle. -- Datenminimierung: PostHog erfordert nicht zwingend personenbezogene Daten für - Produktanalysen und stellt der Memoro GmbH Werkzeuge zur Verfügung, um die - Erfassung personenbezogener Daten zu minimieren oder zu vermeiden. -- Datenlöschung: PostHog stellt Werkzeuge zur Verfügung, mit denen die Memoro GmbH - Anfragen zur Löschung von Endnutzerdaten nachkommen kann. - Unterauftragsverarbeiter (Sub-processors): - PostHog setzt für die Erbringung seiner Dienste Unterauftragsverarbeiter ein, insbesondere - Amazon Web Services (AWS) für das Cloud-Hosting. Eine aktuelle Liste der - Unterauftragsverarbeiter wird im Rahmen des DPA von PostHog geführt und zur Verfügung - gestellt. - -Verantwortungsbewusster Einsatz von PostHog durch die Memoro GmbH: -Die Memoro GmbH stellt einen datenschutzkonformen Einsatz von PostHog durch folgende -Maßnahmen sicher: - -- Abschluss eines Data Processing Agreements (DPA): Ein DPA inklusive - Standardvertragsklauseln (SCCs) wurde mit PostHog abgeschlossen, am 02.06.2025. -- EU-Hosting: Primäre Auswahl des Datenhostings auf Servern innerhalb der EU - (Deutschland), um Datentransfers in Drittländer zu vermeiden. -- Datenminimierung und Pseudonymisierung: Konfiguration von PostHog mit dem Ziel, keine - oder möglichst wenige personenbezogene Daten zu erfassen. Wenn möglich, werden - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 21 / 23 - -Daten pseudonymisiert. Es werden keine sensiblen Daten im Sinne von Art. 9 DSGVO an -PostHog übermittelt. - -- Transparenz: Information der Nutzer der Memoro App über den Einsatz von PostHog zu - Analysezwecken in der Datenschutzerklärung gemäß Art. 13 und 14 DSGVO, inklusive der - Erläuterung der Zwecke und der Rechte der Betroffenen. -- Einwilligungsmanagement: Sofern für die konkrete Datenerfassung und -verarbeitung durch - PostHog eine Einwilligung erforderlich ist, wird diese vorab von den Nutzern eingeholt. -- Regelmäßige Überprüfung: Die Konfiguration und Nutzung von PostHog wird regelmäßig - auf Einhaltung der Datenschutzvorgaben überprüft. -- Datenschutzbeauftragter von PostHog: Für datenschutzrelevante Anfragen an PostHog - steht deren Datenschutzbeauftragter, Charles Cook (VP Operations), unter - privacy@posthog.com zur Verfügung. - Durch diese Maßnahmen gewährleistet die Memoro GmbH, dass der Einsatz von PostHog im - Einklang mit der DSGVO und den Erwartungen der Nutzer erfolgt und die Sicherheit der - verarbeiteten Daten sichergestellt ist. - - 10.5.1 Sonderregelung für Enterprise-/Organisationsvarianten - Für spezielle Organisationsvarianten der Memoro App kann die Produktanalyse via PostHog - vollständig deaktiviert werden. In diesen Fällen: - ● Werden keine Daten an PostHog übermittelt - ● Findet keine Nutzungsanalyse statt - ● Gilt diese Regelung für alle Nutzer der jeweiligen Organisationsvariante - Die konkrete Konfiguration wird im jeweiligen Auftragsverarbeitungsvertrag mit der Organisation - festgelegt. - -11. Verantwortungsbewusstes Handeln der Memoro GmbH - -- Regulatorische Entwicklungen werden aktiv verfolgt – Memoro stellt sicher, dass alle - eingesetzten Cloud-Dienste mit den neuesten DSGVO-Anforderungen konform sind. -- Transparente Kommunikation – Nutzer werden umfassend über die Nutzung und - Verarbeitung ihrer Daten informiert. -- Technische Schutzmaßnahmen werden konsequent umgesetzt – Zusätzliche - Verschlüsselung und Anonymisierung werden in sicherheitsrelevanten Bereichen - angewendet. - Diese Maßnahmen gewährleisten eine rechtskonforme und sichere Nutzung von - Cloud-Diensten innerhalb der Memoro GmbH und stehen im Einklang mit den aktuellen - Datenschutzanforderungen in Deutschland und der EU. - -12. Auftragsverarbeitungsvertrag (AVV) - Die Memoro GmbH stellt für Organisationskunden einen standardisierten - Auftragsverarbeitungsvertrag gemäß Art. 28 DSGVO zur Verfügung. Dieser regelt: - -Memoro - Technische und organisatorische Maßnahmen (TOMs) Seite 22 / 23 - -● Die spezifischen Verarbeitungstätigkeiten für die jeweilige Organisation -● Besondere Konfigurationen (z.B. Deaktivierung von Analysediensten) -● Zusätzliche technische und organisatorische Maßnahmen -● Unterauftragsverarbeiter-Regelungen -Der aktuelle Muster-AVV kann über kontakt@memoro.ai angefordert werden. -Individuelle Anpassungen werden nach Absprache vorgenommen. diff --git a/apps/memoro/apps/landing/context/personas.md b/apps/memoro/apps/landing/context/personas.md deleted file mode 100644 index 9621a8079..000000000 --- a/apps/memoro/apps/landing/context/personas.md +++ /dev/null @@ -1,316 +0,0 @@ -# Personas Erstellungs-Guide - -## Überblick - -Personas sind detaillierte, datenbasierte Profile unserer Zielkunden. Sie helfen uns, Produkt- und Marketing-Entscheidungen aus Kundenperspektive zu treffen. - -## Dateistruktur - -### Speicherort -``` -src/content/_personas/ -├── de/ # Deutsche Personas -│ └── [slug].mdx # z.B. handwerksmeister-thomas.mdx -└── en/ # Englische Personas - └── [slug].mdx -``` - -### Namenskonvention -- Kleinschreibung mit Bindestrichen -- Format: `[rolle]-[vorname].mdx` -- Beispiele: - - `handwerksmeister-thomas.mdx` - - `startup-founder-alex.mdx` - - `projektmanagerin-sabine.mdx` - -## Persona-Struktur - -### 1. Frontmatter (YAML) - -Die Persona-Datei beginnt mit strukturierten Metadaten zwischen `---` Markierungen: - -```yaml ---- -# PFLICHTFELDER -name: "Thomas Bauer" # Vollständiger Name -title: "Der digitale Handwerksmeister" # Beschreibender Titel -lang: "de" # Sprache (de/en) - -# DEMOGRAFISCHE DATEN -demographics: - age: 45 # Alter oder Altersbereich (z.B. "35-45") - gender: "male" # male/female/diverse/unspecified - location: "Augsburg, Deutschland" # Stadt, Land - education: "Meisterbrief" # Bildungsabschluss - income: "75.000-95.000€/Jahr" # Optional: Einkommensspanne - familyStatus: "Verheiratet, 3 Kinder" # Optional: Familienstand - -# BERUFLICHES PROFIL -professional: - jobTitle: "Geschäftsführender Elektromeister" - company: "Bauer Elektrotechnik GmbH" # Optional: Firmenname/typ - companySize: "12 Mitarbeiter" - industry: "Handwerk - Elektrotechnik" - experience: "22 Jahre" - responsibilities: # Array von Hauptaufgaben - - "Betriebsführung" - - "Kundenakquise" - teamSize: "11 Mitarbeiter" # Optional - -# PSYCHOGRAFISCHE MERKMALE -psychographics: - personality: # Persönlichkeitsmerkmale - - "praktisch" - - "qualitätsbewusst" - values: # Werte und Überzeugungen - - "Handwerksqualität" - - "Zuverlässigkeit" - motivations: # Was treibt die Person an? - - "Betrieb modernisieren" - frustrations: # Pain Points - - "Zu viel Bürokratie" - goals: # Persönliche/berufliche Ziele - - "Digitalisierung vorantreiben" - -# VERHALTEN -behavior: - techSavviness: "intermediate" # beginner/intermediate/advanced/expert - workStyle: # Arbeitsweise - - "Früh auf Baustelle" - tools: # Genutzte Tools - - "WhatsApp Business" - communicationPreference: # Kommunikationskanäle - - "Persönlich" - - "WhatsApp" - buyingBehavior: "Braucht Empfehlungen" - informationSources: # Wo informiert sich die Person? - - "Handwerkskammer" - -# MEMORO-KONTEXT -memoroContext: - useCase: # Wie würde Memoro genutzt? - - "Baustellenprotokolle" - benefits: # Welche Vorteile sind relevant? - - "Rechtssicherheit" - concerns: # Bedenken/Hindernisse - - "Datenschutz" - features: # Wichtigste Features - - "Offline-Funktion" - priceSensitivity: "medium" # low/medium/high - adoptionLikelihood: "medium" # low/medium/high/very-high - influencers: # Optional: Wer beeinflusst Entscheidung? - - "Andere Handwerker" - -# USER STORY -userStory: | - Detaillierte Erzählung eines typischen Arbeitstages... - -# SZENARIEN (Optional) -scenarios: - - title: "Baustellenbegehung" - description: "..." - outcome: "..." - -# ZITATE (Optional) -quotes: - - "Ich verbringe mehr Zeit mit Papierkram als auf der Baustelle" - -# MARKETING -marketing: - segment: "secondary" # primary/secondary/tertiary - channels: # Marketing-Kanäle - - "Handwerkskammer" - messaging: # Kernbotschaften - - "Rechtssicherheit" - contentPreferences: # Content-Formate - - "Praxisberichte" - -# META-INFORMATIONEN -status: "active" # draft/active/archived -visibility: "internal" # internal/team/stakeholders -tags: - - "handwerk" - - "b2b" -relatedPersonas: # Optional: Verwandte Personas - - "architekt-claudia" - -# ZEITSTEMPEL -createdAt: 2024-12-01T10:00:00Z -lastUpdated: 2024-12-01T10:00:00Z -validatedAt: 2024-11-28T10:00:00Z # Optional - -# VERANTWORTLICHKEITEN -owner: "Marketing Team" -contributors: # Optional - - "Vertrieb" ---- -``` - -### 2. Content-Bereich (Markdown) - -Nach dem Frontmatter folgt der narrative Teil in Markdown: - -```markdown -## Detaillierte Persona-Beschreibung - -[Einführender Absatz über die Persona und ihre Bedeutung] - -### Kernherausforderungen - -1. **Challenge 1**: Beschreibung -2. **Challenge 2**: Beschreibung - -### Memoro Value Proposition - -[Wie löst Memoro die Probleme dieser Persona?] - -### Kommunikationsansatz - -[Wie sollten wir diese Persona ansprechen?] -``` - -## Schritt-für-Schritt Anleitung - -### 1. Research & Datensammlung - -Bevor du eine Persona erstellst: -- Analysiere vorhandene Kundendaten -- Führe Interviews mit echten Kunden -- Sammle Feedback von Vertrieb und Support -- Recherchiere Branchentrends - -### 2. Datei erstellen - -```bash -# Neue Persona-Datei anlegen -touch src/content/_personas/de/[rolle]-[name].mdx -``` - -### 3. Frontmatter ausfüllen - -Kopiere die Struktur von einer bestehenden Persona und passe an: -- Alle Pflichtfelder müssen ausgefüllt sein -- Nutze realistische, spezifische Details -- Vermeide Stereotypen - -### 4. User Story schreiben - -Die User Story sollte: -- Einen typischen Tag/Situation beschreiben -- Konkrete Pain Points zeigen -- Emotional nachvollziehbar sein -- 3-5 Absätze lang sein - -### 5. Content-Bereich verfassen - -Ergänze: -- Zusammenfassung der Persona -- 3-5 Kernherausforderungen -- Memoro's Value Proposition -- Kommunikationsempfehlungen - -### 6. Review & Validierung - -- [ ] Lasse die Persona vom Team reviewen -- [ ] Validiere mit echten Kundendaten -- [ ] Aktualisiere `validatedAt` Datum -- [ ] Setze Status auf `active` - -## Best Practices - -### DO's ✅ - -- **Spezifisch sein**: "45 Jahre, Elektromeister" statt "mittleres Alter, Handwerker" -- **Echte Zitate verwenden**: Aus Kundeninterviews -- **Pain Points priorisieren**: Die wichtigsten zuerst -- **Konsistent bleiben**: Persona-Details sollten zusammenpassen -- **Regelmäßig aktualisieren**: Quartalsweise Review - -### DON'Ts ❌ - -- **Keine Fantasie-Personas**: Basiere auf echten Daten -- **Keine Stereotypen**: Vermeide Klischees -- **Nicht zu vage**: "mag Technologie" → "nutzt WhatsApp Business täglich" -- **Nicht zu viele**: 3-5 Kern-Personas reichen meist -- **Nicht statisch**: Personas entwickeln sich weiter - -## Persona-Typen für Memoro - -### Primäre Zielgruppe -- Projektmanager:innen -- Team-Leads -- Consultants -- Sales Manager - -### Sekundäre Zielgruppe -- Startup-Gründer:innen -- Handwerker:innen -- Coaches & Trainer -- Freelancer - -### Tertiäre Zielgruppe -- HR-Manager:innen -- Forscher:innen -- Journalist:innen -- Anwält:innen - -## Verwendung der Personas - -### Im Produkt -- Feature-Priorisierung -- UX-Entscheidungen -- Onboarding-Flows - -### Im Marketing -- Content-Strategie -- Kampagnen-Planung -- Messaging & Positioning - -### Im Vertrieb -- Pitch-Anpassung -- Objection Handling -- Use-Case-Demos - -## Wartung & Pflege - -### Monatlich -- Neue Insights aus Kundengesprächen einarbeiten - -### Quartalsweise -- Vollständiger Review aller aktiven Personas -- Validierung mit aktuellen Kundendaten -- Archivierung veralteter Personas - -### Jährlich -- Strategische Überprüfung der Persona-Landschaft -- Neue Personas bei Markterweiterung - -## Tools & Ressourcen - -### Templates -- Basis-Template: `src/content/_personas/template.mdx.example` -- Interview-Leitfaden: `docs/persona-interview-guide.md` - -### Analyse-Tools -- Customer Analytics Dashboard -- Support-Ticket-Analyse -- Sales-Call-Recordings - -### Validierung -- A/B-Tests mit Persona-basiertem Content -- Conversion-Tracking nach Persona-Segment -- Regelmäßige Customer Surveys - -## Kontakt & Support - -**Fragen zu Personas?** -- Marketing Team: marketing@memoro.ai -- Product Team: product@memoro.ai - -**Neue Persona vorschlagen?** -- Erstelle ein Issue im Repository -- Oder kontaktiere direkt das Marketing Team - ---- - -*Letzte Aktualisierung: Dezember 2024* \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/press/podcast.md b/apps/memoro/apps/landing/context/press/podcast.md deleted file mode 100644 index c95a87714..000000000 --- a/apps/memoro/apps/landing/context/press/podcast.md +++ /dev/null @@ -1,313 +0,0 @@ -programmier.bar - -Deep Dive 168 – -Low Code mit Till Schneider & Tobias Müller -13.12.2024 -// Podcast -// Deep Dive 168 -Shownotes -Die meisten Entwickler:innen schreiben gerne Code. Aber muss das wirklich immer sein? Und ist das in jedem Szenario wirklich sinnvoll? - -In dieser Episode sprechen Garrelt und Jan mit Till und Tobias, den Köpfen hinter memoro.ai, über ihre Erfahrung mit Low-Code-Tools zur App-Entwicklung. Till und Tobias haben im Rahmen eines Hackathons die Idee für die Code-Minimierung entwickelt und anschließend ohne konventionelle Entwicklungsarbeit umgesetzt. Ein Beweis, dass man auch mit Low-Code-Tools moderne Apps an Endkund:innen ausliefern kann. - -Wir unterhalten uns über die Erfahrungen, die sie auf ihrer Reise gemacht haben: Von der Auswahl der richtigen Tools über den Einstieg und die Lernkurve bis hin zur Kollaboration zwischen Entwickler:innen und Designer:innen erforschen wir alle Facetten des Projektes. - -Aber wir beleuchten auch, wann und wie ein solcher Ansatz an seine Grenzen stoßen kann. Wir fragen uns, ob das unausweichlich ist und wie am besten damit umgegangen werden sollte. Außerdem stellen wir die alles entscheidende Frage: Können Till und Tobias den Ansatz wirklich empfehlen und würden sie es nochmal genauso machen? - - -Transkript: - -Jan -Hallo und herzlich willkommen zu einem neuen Deepdive in der programmier.bar. Heute mit einem ganz besonders spannenden Thema, nämlich einem Thema, was immer die Gemüter spaltet. Wir sprechen einmal über No Code beziehungsweise Low Code Lösungen. Und mit mir im virtuellen Studio in der unteren rechten Ecke meines Screens sitzt der Garelt. Hi, Garelt. Hi. Garelt, wie oft hast Du schon mit so Low Code und Low Code Lösungen gearbeitet? -Garrelt -Oh, wir hatten das in der Schule. Da hatten wir was zum Zusammenklicken, das hieß Scratch. Da hab ich ein megageiles Spiel gemacht, hab eine Eins bekommen und meine Schülerkameraden haben auch eine Eins bekommen für Trash Spiele, aber na ja, ist nicht mein Ding. -Jan -Die Zuhörerinnen da draußen, die jetzt nicht sehen, wie jung Du noch aussiehst, fragen sich natürlich, wann warst Du in der Schule und hast Scratch programmiert? Wie lang ist das her? -Garrelt -Das war zweitausendvierzehn, also genau zehn Jahre. -Jan -Zweitausendvierzehn. Zweitausendvierzehn hatt ich schon meinen Uniabschluss in der Tasche, dementsprechend länger ist mein Informatikunterricht auch schon her, ja. Aber bei mir gab's keinen Low Code in der Schule. So Fernsehsieg gab's damals noch nicht, ja. Wir haben mit Tobi Pascal und c irgendwie programmiert. Und weil ich dementsprechend ganz wenig Ahnung von Low Code und No Code hab, sondern nur viel Meinung dazu, haben wir uns noch Leute eingeladen, die uns mit viel Wissen zur Seite stehen können. Wir haben hier Till und Tobias von Memoro. Hallo Till. -Till Schneider -Hi Jan. -Jan -Grüß dich. Hallo Tobias. Hi. Tobi passt übrigens. Tobi auch wunderbar, kein Thema. Ihr habt zusammen Memoro gemacht mit noch ein paar anderen Leuten. Vielleicht wollt ihr einmal ganz kurz erklären, was Memoro ist, wie ihr auf die Idee gekommen seid und dann sprechen wir einmal ans Eingemachte. -Till Schneider -Jawoll, gerne. Wir haben Memoro vor so eineinhalb Jahren circa gestartet auf 'nem Hackathon hier in Konstanz am Bodensee. Ich kam da mit der Idee die Ecke, dass ich doch gerne meine Gedanken und Gespräche aufnehmen will. Also ich hatte das Hauptproblem, dass ziemlich viel Projekte parallel liefen und ich nicht hinterherkam irgendwie mit der Organisation, mit der Strukturierung von allem. Und dann hab ich mir so angewöhnt, abends 'n Spaziergang zu machen und das einfach so mir von der Seele zu reden. Und dann hab ich das mal getestet, aufm iPhone einfach Sprachnotiz aufgenommen, Sprachnotiz hochgeladen, transkribieren lassen, das dann in Chat GPT reinkopiert und in Sachen gefragt über den Text. Und das kam mir gleich vor wie sone kleine Superkraft, weil man sich selber halt supergut reflektiert bekommt und und recht unstrukturiert reden kann und strukturiert das Ganze zurückbekommt und halt son Überblick bekommt. Also es war wie son 'n kleiner kleiner seelischer Doktor, kann man fast sagen. Jemand, der mir dann zuhört und dann konnte man sich einfach son bisschen entleeren. Und das hat sich einfach so toll angefühlt, dass ich das dann vorgestellt habe auf dem Heck gefahren, als einfach nur eine eine grobe Idee. Und dann hat sich direkt 'n Team aus fünf, sechs Leuten eigentlich die Idee formiert und wir haben zwei Tage lang gebrainstormt. Wir haben sehr viel waren sehr viel spazieren, haben sehr viel geredet, das ist natürlich alles direkt aufgenommen und hatten dann eigentlich 'n super Startschuss rein in die in das neue Start-up, da wir diese ganzen Gespräche festgehalten haben und direkt wussten, was wo wir hinwollen. Und Tobi war auch direkt von Anfang an dabei und wir zwei haben dann tatsächlich direkt gestartet. Wir sind das Kernteam, wir haben angefangen zu entwickeln, die anderen unterstützen son bisschen. Und wir hatten dann nach zwei Wochen eigentlich einen einen eine Alpha und haben die verteilt an Leute, haben die Menschen in die Hand gedrückt und haben gefragt, wie sie das Tool gerne nutzen könnten. Und dann kamen sehr viele Anfragen aus verschiedenen Industrien, aus verschiedenen Branchen, die 'n großen Mehrwert daran sehen. Und heute sind wir jetzt bei tausenddreihundert Nutzern, haben auch Paying Subscriber schon und haben 'n Stipendium gewonnen, was uns 'n Jahr lang finanziert und haben auch sehr viel Platz und Raum, uns mit neuer KI Technologie grundsätzlich auseinanderzusetzen. -Jan -Das, was Du jetzt natürlich nur so halb implizit gesagt hast, ist, dass ihr natürlich Memoro komplett mit Low Code No Code Toolchain gebaut habt, sozusagen, ja? Ja, genau. Darüber wollen wir einmal einmal sprechen. Deswegen meine erste Frage vielleicht so an Tobi. Was macht man als Entwickler in soner No Code Low Code Bude? So wird wird man da überhaupt gebraucht Fragezeichen, -Tobias Müller -ne? Tatsächlich ist es gar nicht so gar nicht so falsch, weil auch als Coder überlegt man sich, wie kommt man schnell zu Ziel? Und ich komm auch son bisschen ausm Start up Bereich oder auf Hecertons. Und da muss alles immer schnell gehen. Und da braucht man natürlich das das Verständnis für Code, wie Programme aufgebaut sind. Aber es hilft einem unglaublich, mit sonem No Code Low Code Bilder einfach mal schnell 'n Prototypen zusammenzuklicken. Und da das ergänzt sich, find ich, super. Das ist gar kein Widerspruch zueinander. -Garrelt -Würdest Du sagen, man ist mit Low Code, mit dem Zusammenklicken wirklich schneller, wenn man gleich gut das auch entwickeln könnte? Einfach vom Speed her, wenn man beides gut kann. -Tobias Müller -Man muss 'n bisschen differenzieren zu früh und heute. Heute hat man KI. Da ist vielleicht tatsächlich son bisschen die Überlegung, hat man mit 'ner KI vielleicht schneller mal 'n Projekt initiiert und schnell mal 'n Code druntergeschrieben, grade wenn's 'n bisschen was Spezielleres ist. Aber allgemein, wenn man einfach mal nur was darstellen will, das heißt ja so schön, Dann dann kann man einfach mal schnell 'n Gefühl dafür bekommen und auch einfach mal einfache Logiken damit umsetzen, keine Ahnung, Kalkulation oder irgendwelche Sachen zu generieren und so weiter. Und vielleicht schreibt man dann durchaus auch mal 'n Kostencode. Aber da geht's halt alles wirklich Geschwindigkeit. Im Hackathon hat man nicht viel Zeit. -Till Schneider -Was ich dann noch ergänzen könnte vielleicht, und das war eigentlich so auch, das, wir hätten gar nicht, ich hätte nicht anfangen können, Tobi zu helfen, wenn wir nicht mit Low Code, Low Code gestartet wären. Also ich bin vom Designhintergrund und gut, ich hab mal bisschen Tailwind HTML CSS son bisschen rumgewurstelt, aber ich hatte dadurch halt die Möglichkeit, superschnell das Frontend zu iterieren. Und wir haben dann im Endeffekt innerhalb von, was war's, 'nem Jahr oder hatten wir über vierhundert Versionsnummern durchgeschoben und da hat sich auch in jeder was geändert. Also da war dann 'n ordentlicher Druck im Kessel und now 2 be im wir haben mehr aufs mehr im Backend und guckt, dass das Zeug sauber funktioniert, hat dann ja in Python das Backend geschrieben, also Backend nicht nicht Low Cop, No Code. Wir haben mal Tests gemacht mit mit anderen Tools auch und haben kleine kleine Backends Low Carb, No Code technisch aufgebaut. Aber sonst hätt die Zusammenarbeit mit uns gar nicht, wir hätten gar nicht starten können, hätten wir den Stack nicht gewählt. -Jan -Genau. Vielleicht machen wir da noch mal zweieinhalb Schritte zurück. Jetzt warst Du schon bei den vierhundert Versionen, die ihr da irgendwie durchgeschippt habt. Aber bevor ihr angefangen habt, also ihr hattet, ne, über das Thema son bisschen gesprochen, ihr hattet irgendwie 'n grobes Konzept. So weit sind ja, ich sag mal, Codeentwicklung und No Code Entwicklung sich ja auch gleich und ähnlich, ja. Erst mal muss man darüber sprechen, was man so baut, bevor man anfängt, das hilft. Und dann wollt ihr irgendwann anfangen. Wie habt ihr euch denn für ein spezielles Tool entschieden? Weil also alle Entwickler kennen ja diese Diskussion, Du willst jetzt was bauen. Da ist erst mal die wichtigste Diskussion vorher so, was ist der Stack, was ist die Sprache, was ist das Framework, ja? Gab es da auch ähnliche Diskussionen so in diesem No Code Bereich, wo man sich überlegt, na ja, es gibt da halt zig verschiedene Tools da draußen, ja? Also wenn man einfach nur mal No Code oder Low Code googelt, da wird man ja jetzt zugeschüttet mit irgendwie Plattformen, die einem da was anbieten wollen und verschiedenen Wändern und basierend auf verschiedenen Technologien. Und wie habt ihr euch da überhaupt erst mal durchnavigiert, euch für eines von diesen Zehntausenden zu entscheiden? Und und was waren da ausschlaggebende Faktoren? -Tobias Müller -Was ich mal sagen kann dazu, ist, dass es auf jeden Fall Reibungspunkte auch da schon am Anfang gab. Weil ich als Entwickler hab natürlich meine Tools, die ich schon kennengelernt hab und so weiter. Und dann bleib ich natürlich auch gerne aus Gemütlichkeit bei dem, was ich schon kenne. Till war da schon deutlich offener am Anfang. Er guckt sich gerne aktuelle Berichte an, über was was für neue IDs es gibt, welche neuen Frameworks und so weiter. Er ist da deutlich offener, 'n bisschen weniger voreingenommen, würd ich sagen. Und da haben wir schon am Anfang auch schon angefangen zu diskutieren. Ja, und irgendwie kamen wir dann auf Flatterflow. Ich weiß gar nicht mehr so genau, wie's dazu kam. Weißt Du's noch, Tür? -Till Schneider -Ich glaube, wir hatten einfach verschiedene Test Testberichte gelesen. Ich bin 'n großer Youtube Videoanker und da verschiedenste Vergleiche mir reingezogen. Und ja, Flatterflow ordnet sich da einfach am Ende am am am am Ende zu Code eigentlich ein von den Low Code Tools. Also man kann sehr viel Custom Code mit einbauen und das das Tool eigentlich mehr und mehr erweitern. Und die anderen Low Code No Code Tools sind da eher noch mehr Low Code No Code, sag ich mal. Also wir haben uns dann so für diesen für für für das Komplexeste entschieden, was es gibt, haben dann auch geschaut, wo gibt's eine gute Community? Wo wo kann man Fragen stellen? Wo wird wo werden Features geschipped? Natürlich son bisschen, was ist der was ist grade heiß am Markt auch, aber was existiert auch schon länger? Also wir Flatterflor war damals schon 'n paar Jahre alt und und aufm Markt, heißt, auch da 'n bisschen auf die Langlebigkeit dann geschaut. Dann hat sich das so bisschen rauskristallisiert recht schnell eigentlich. -Garrelt -Aber Tobias, Du kannst aus nicht aus der Ecke Low Code, No Codes. Dein Setup vorher war reiner Code. -Tobias Müller -Also ich für mich selbst hab bisher weniger mit Low Code, No Code gearbeitet, klar. Und so weiter. Schon ein bisschen welche SDKs Frameworks kannst Du nutzen, wirklich 'n schnelles Ergebnis zu erzielen. Aber wirklich eingesetzt hatt ich's bisher dann noch weniger. Deswegen war jetzt halt auch son bisschen die die Diskussion, wo steigen wir ein? Und der große Punkt war, wie Till schon sagte, wie kann er halt auch mitentwickeln? Weil wenn wir jetzt wirklich mit Code anfangen, wird's halt schwierig. Und wir hatten dann auch getestet und angeschaut, inwieweit sind wir eingeschränkt? Wie viel Freiheiten haben wir? Und mit florida Flow war halt auch eben dies diese Möglichkeit, trotzdem noch eigenen Code einzufügen, was für uns auch notwendig war. -Jan -Das ist ja 'n spannender Punkt. Also wenn ihr relativ früh schon erkannt habt, okay, ist es halt notwendig, da auch Custom Logik oder UI Elementter oder so was zu machen. Wie lange ging es denn gut mit nur den Onboard Tools, ja, in eurem Prototyping, Bootstrapping Prozess? Und wann war so das erste Mal, wo ihr gesagt habt, okay, jetzt müssen wir mal hier Ärmel hochkrempeln und mal was Eigenes noch dazu bauen? -Tobias Müller -Eigentlich ging das ziemlich schnell, weil 'n Kerninhalt von unserer App ist halt die Audioaufnahme. Und Floodderflow bietet schon einen einfachen Recorder, aber sehr eingeschränkt. Also großes Kriterium ist bei uns, dass man's halt wirklich das Handy aufn Tisch legen kann und ohne drüber nachzudenken aufnehmen lassen kann. Und da darf halt die App nicht ins Sleep Mode gehen. Die der Screen muss gesperrt werden können. Und da muss man halt die Anforderungen von der jeweiligen Plattform erfüllen können. Dieser einfache Recorder, der hat dafür nicht ausgereicht. Das heißt, wir haben sehr schnell damit angefangen, wirklich den Recorder selbst zu implementieren. -Jan -Und was war das fürn Erlebnis? Also wie wie sehr arbeitet man da mit oder gegen die Plattform, wenn man dann da eigene Komponenten einbauen möchte? -Tobias Müller -Das war schon teilweise recht anstrengend. Man hat schon schmerzhafte Einschränkungen, würd ich sagen. Man hat halt wirklich nur, wie soll ich sagen? Man man kann Custom Actions, Custom Functions, Custom Widgets anlegen, aber man bewegt sich halt dann immer nur in einem Codebereich. Wenn man dann eben Sachen in die App integrieren muss, vielleicht direkt schon beim beim Starten der App mit initialisieren wird, dann wird's eben komplex und manchmal muss man dann auch Workaruns suchen. Wie kriegt man eben das integriert ohne diese Freiheiten? Wobei natürlich, man muss auch noch ergänzen, man könnte durchaus den Code verändern, aber dann wird's noch mal komplizierter. -Garrelt -Mhm. -Jan -Jetzt ist ja so auf Funktionalitätsebene das eine, aber auf Designebene ist ja das andere, ne. Also ich stell mir vor, wenn man da in sonem grafischen Editor arbeitet und sich da seine Elemente zusammenklickt, dann kommt man Till ja vielleicht auch relativ schnell an so dem Punkt so, das ist jetzt nicht so ganz Pixelperfekt, wie ich's eigentlich gerne hätte oder wie's in unserem Designentwurf aussah? Und gab es da auch Punkte, wo man da irgendwann so die die Edge Cases des Editors erreicht hat, sag ich mal und sich dann was anderes einfallen lassen muss? -Till Schneider -Würd ich nicht sagen. Also ich hab am Anfang noch angefangen, alles in Figma zu designen und wie die UI und UX da zu planen. Und dann war es auch son schleichender Prozess, dass dass halt Flatterflow im Grunde genommen so schnell funktioniert, dass ich eigentlich weniger und weniger die Sachen in Figma vorgescatcht hab und angefangen hab, wieder eigentlich direkt in Flatterflow Dinge auszuprobieren. Ist son schmaler Grat. Also manchmal hab ich's damals bereut, die Sachen nicht besser geplant zu haben in Figma. Manchmal war's eine gute Entscheidung, also da son bisschen der Mittelweg. Aber ich kam nie, also doch an ein, zwei Stellen, aber da würd ich sagen, also sehr, es gibt es gab dann gewisse Bereiche, die doch nicht funktioniert haben. Zum Beispiel wollt ich eine eine Liste am unteren Ende des Bildschirms haben und wenn auf die Liste getippt wird, sollte sie hochfahren und dann den ganzen Screen ausfüllen. Also quasi so wie eine Page Navigation, aber halt auf auf eigentlich in einer Seite contained, ging nicht. Solche Sachen wie wie Blur, haben Blurview, also auf iOS kennt man das ja, dass dann der der der Header zum Beispiel so so diesen, ja, ja, diese diesen Blur bekommt. Den konnte man nicht schön umsetzen beziehungsweise dann hat Flatterflow irgendwie im im Preview Mode dann rumgesponnen und wurde langsamer, wurde irgendwie slackgisch. Das gab's bei 'n paar Punkten, wo man wo man so, wenn man Sachen bauen will im Frontend, dass auch Flatter Flow es nicht mehr richtig gut handeln kann und man, ja, man eigentlich dann Abstriche machen muss. Was an sich okay war, glaub ich, weil im Grunde genommen sind halt die die Patterns, die User gewohnt sind, recht gut dargestellt darin. Und wenn man dann eigentlich an diese Grenzen kommt, sollte man sich vielleicht eher überlegen, ob das auch kein kein gewohntes Pattern ist, was man vielleicht auch anders bauen könnte. -Jan -Wie ist es denn in der in der täglichen Arbeit? Weil im Prinzip fahrt ihr ja zweigleisig, also oder auf zwei Ebenen, ne. Die die unterste Ebene ist das Betriebssystem iOS, Android, auf was auch immer ihr so deployed. Das verändert sich ja auch. Da kommen neue Versionen, neue Sales, neue raus. Und dann zwischen euch und dem Betriebssystem ist da diese Plattform, die es ja wahrscheinlich auch jetzt geändert hat so in der Zeit, in der ihr sie benutzt, ja auch mit mit neuen Features, mit neuen Funktionen, neue Widgets vielleicht out of the box bereitstellt oder so was. Was was macht es so mit dem Erlebnis? -Tobias Müller -Das hat aber auf jeden Fall dazu geführt, dass wir öfters mal zu plötzlich Errors hatten, die wir vorher nicht hatten. Und nach dem Debugging hat sich raus rausgestellt, okay, jetzt haben sich Dependencies geändert. Doch das ist son Beispiel gewesen. Entweder hat dann halt Flatterflow Updates gezogen oder ich hab dann irgendwie eine Dependency reingemacht, die halt auch nicht mehr mit 'ner anderen Version kompatibel war. Das war so 'n Problem, über das wir öfters gestolpert sind, was dann auch natürlich 'n bisschen frustrierend war, erst mal überhaupt rauszufinden, was ist denn da jetzt passiert? Auch von Android Seite gab's mal eine Änderung, dass man zusätzlich permissions grad mit dieser Backgroundaufnahme noch hinzufügen musste. Auch das war eine längere Recherche, dann wieder rauszufinden, okay, hier müssen wieder zusätzliche Angaben zu machen. Ja, da haben wir auf jeden Fall oder hab ich auch viel Zeit mit verbringen müssen mit dem Debugging, mit dem Recherchieren. -Jan -Mhm. Und was bringt denn sone Low Code Lösung am Ende alles mit? Also wir haben jetzt viel, ne, über so grafische Editoren für das Interface gesprochen und auf und Komponentenebene, die man selber bauen kann. Aber zu soner richtigen in Anführungszeichen App gehört ja oftmals noch viel mehr dazu, ne. Insbesondere wenn's irgendwie was kommerzielles ist, da braucht man irgendwie Usermanagement, da braucht man 'n 'n Payment oder Billing vielleicht auch, ja. Da braucht man irgendwie eine Art von Storage, die da dranhängen muss. Ihr habt schon über eure Aufnahmen gesprochen. Die werden ja auch irgendwo aufgerufen werden müssen. Ihr macht Transkcription, das wird irgendwo gemacht. Wie viel davon kann ich so alles in meinem Sandkasten machen? Und was muss ich selber extern zur Verfügung stellen? Und wie krieg ich das dann am Ende connected? -Tobias Müller -Ich glaube eben mal allgemein zu dem Low Code No Code Thema. Das ist auch der große Vorteil, weswegen man vielleicht das wählen kann, weil den meisten Low Code No Code Tools eben solche Integration schon mit drin sind. Da braucht man sich eben nicht darüber Gedanken machen, wie mach ich die das Setup? Was muss ich da beachten und so weiter? Und das war eben jetzt auch speziell bei Flood oflow sehr angenehm, weil da zum Beispiel Firebase schon komplett integriert ist mit dem der der und Firestore als Datenbank. Und das hat auch noch weitere Sachen wie zum Beispiel Superbase. Klar, schon eine gewisse Einschränkung. Es ist jetzt nicht alles drin, aber super zum Durchstarten, kein größeres Set-up kann man hat man direkt, was man braucht. -Till Schneider -Und auch weitergehen noch in Richtung eben, wie bekomme ich dir die Sachen denn in die Appstores rein? Wie bekomme ich das auf Testflight oder in den Play Store, Betatrack? Das ist alles eigentlich schon recht gut eingebaut. Das ist dann 'n ziemlich viel händisches Set-up, bis man mal eben den den Apple Developer Profil und den Android Developer Profil sauber aufgesetzt hat und da die recht alles alle Formulare ausgefüllt hat, bis man da überhaupt mal was reinpushen kann. Aber das ist im Grunde genommen alles schon eingebaut und dann auch Revenue Cat zum Beispiel, Integration, die dann die Payments handeln und und eigentlich den die App Store und Play Store Payments dann an einer zentralen Stelle wieder verwalten. Da musste, glaube ich, Tobi dann schon noch 'n bisschen was quasi auf Datenbankseite nachziehen, dass das wieder, dass dass wir auch die Daten sauber behalten und und das sauber abbuchen können sozusagen. Aber tatsächlich ging das jetzt in Flatterflow, dass wir die App dahin gebracht haben, dass sie inklusive in App Payments und Abomodell und so weiter vollkommen in Flatterflow entstanden mit viel Customcode dann geschippt werden kann. Und aktuell ist das immer noch die Version, die im App Store live ist. -Garrelt -Es klingt ja schon nach ziemlich viel Funktionalität. Und als ich mir das mal auf der Seite angeguckt hab, wirkte flutterflow auch sehr mächtig und auch für mich fast schon überladen. Wie ist denn so eure Erfahrung? Wie schnell seid ihr da reingekommen? War viel intuitiv für euch? Musstet ihr diese Software erst mal lernen, zu also überhaupt erst mal was machen zu können oder findet man eigentlich alles sehr schnell, was man braucht? -Tobias Müller -Also wenn man jetzt eben von diesen Integrationen redet, wie man die nutzt, auch UI Elemente, wie man die platziert, einfache Klickfunktionen und so weiter, ist es, denk ich, schon sehr einfach. Sobald's dann aber 'n bisschen Logiken geht, so das typische f F ifs, Schleifen, also ich red jetzt grade eher 'n bisschen über die algorithmische Ebene, da ist es dann vielleicht nicht mehr so intuitiv. Da hilft's dann's durchaus, sich auch 'n paar Tutorials anzuschauen, sich mal 'n bisschen damit zu beschäftigen, grade wenn man vielleicht jetzt nicht so die Codingerfahrung hat. -Till Schneider -Auch vom Frontend her finde ich, es gibt eine gewisse Lernkurve. Also man es ist wirklich 'n Tool, was was in Richtung, man muss schon Experte sein geht. Es hilft, wenn man Verständnis hat von Atomic Design System und weiß, wie man Komponenten richtig anlegt, einfach eine Konsistenz auch zu halten, sonst läuft es schon schnell ausm Ruder. Also ich musste da auch im Frontend dann immer wieder quasi refactern und mir überlegen, okay, wie krieg ich das jetzt einiger bisschen sauberer noch hin, dass ich hier nicht auf jeder Seite eine einzelne Header Komponente hab, sondern eine zentrale und da mach ich das halt mit Variablen. Also man, es wird schon recht schnell komplex. Also man braucht 'n gewisses Grundverständnis dafür. Und ich würde sagen, von den No No No No Go Tools eben hat es eine eine relativ steile Lernkurve. -Jan -Und wie habt ihr euch da geholfen? Also wie wie habt ihr diese Lernkurve gemeistert? -Till Schneider -Also in meinem Fall ist es tatsächlich Youtube Tutorials angucken. Flatterflow hat 'n supereigenen Channel, wo sie gute, auch lange Tutorials haben, wo sie mal eine ganze Applikation bauen. Oder sie haben solche solche Webinare, wo sie zusammen sich zusammenschalten und bisschen über Themen reden. Es war aber tatsächlich 'n extremes Gesuch. Also wir haben dann so zwei, drei Stunden lange Webinare und ich habe einen Fehler. Und der Fehler ist dann bei Minute dreiundfünfzig, wo sie genau darüber reden und erklären, dass das ja grad 'n Fehler ist in ihrer Software. Und man muss gucken, da muss man das so umbauen. Also es war schon oft son bisschen das Suchen nach der Nadel im Heuhaufen. -Tobias Müller -Also man merkt auch schon, es ist eine Community da, vermutlich auch größer wie bei anderen Tools, aber sie ist doch noch am Aufbauen. Also grad wenn's dann speziellere Dinge geht, ist es schon 'n bisschen an Gesuche und auch 'n bisschen mit Glück verbunden, ob denn tatsächlich schon mal jemand diese Frage überhaupt gestellt hat. -Till Schneider -Und und was ich noch ergänzen will, ist, dass wirklich diese diese zusätzliche Ebene, Abstraktionsebene, die halt Flatterflow noch mal auf Flatter draufsetzt, halt auch zu zu Problemen führt. Dann weiß man nie genau Und und auch die Flatterflow Community weiß nicht, ist das jetzt 'n Flatter Error oder entsteht das jetzt durch die Flatterflow Abstraktion noch mal, ist da der Fehler und es sorgt schon zu noch mehr Reibungen. -Garrelt -Aber die Community, mit der da im Austausch war, war schon auch die Flatter Community oder ist diese Flatterflow Community arg getrennt? -Till Schneider -Nur, Flatterflow hat selber eine Community, also auf Community, glaub ich, Punkt Flatterflow Punkt com oder wie auch immer die URL ist, gibt's eine eigene Community, die auch recht stark ist. Da gibt's 'n paar sehr, sehr tolle Members, die auch sofort antworten, die schnell antworten. Und wir haben uns dann, also ich mich fürs Frontend her, meistens darin bewegt. Tobi musste, glaub ich, noch öfters dann auch in auf die Flatterebene wechseln, gewisse Dinge zu verstehen oder zu debuggen. -Garrelt -Ich frag mich schon die ganze Zeit, also Till, Du sagst ja, Du kommst eher aus dem Design Background. Tobias, Du wärst so im Dev Background. Wie gut oder wie habt ihr euch so aufgeteilt aufgabentechnisch? Hat das gut funktioniert? Auch auch eine Frage in meinem Kopf ist, wie hat das mit Version Control funktioniert, weil das manchmal bei so Tools, glaub ich, 'n bisschen komplizierter sein kann. Und ich glaube, in meinem Kopf ist son Tool ja megastark, was so Design- und Entwicklungszusammenarbeit geht. So, was was sind da eure Erfahrungen? Was hat da gut funktioniert, was vielleicht nicht so gut? -Tobias Müller -Also flatterflow bietet schon eine git ähnliches Brunching mit ja, auch eine Versionskontrolle, aber die hat uns eigentlich nicht so wirklich geholfen. Meistens war eher der Prozessor. Till hat was eben UI mäßig umgesetzt, irgendwelche Elemente. Und nach ihm bin ich dann ran und hab irgendwelche Logiken dann dazu noch implementiert. Also es war schon irgendwie 'n getrenntes Arbeiten, da wir aber mehrere Baustellen hatten, hatten wir uns dann halt schon auch irgendwo aufgesplittet. Es war halt, das ist auch ein ein großes Problem, was wir eben auch mit Flatterflow hatten, son Bug könnte man sagen. Sobald man parallel auf einer Seite gearbeitet hat, was man theoretisch machen könnte, hat es oft dazu geführt, dass einfach Änderungen verschwinden sind. Till hat irgendwas gemacht, ich hab dann was eingefügt, dann -Garrelt -geh ich -Tobias Müller -in den Testmode und plötzlich ist es nicht mehr da. Und das war auch schon sehr frustrierend. Deswegen war dann einfach die Konsequenz, okay, wir müssen das halt etappenweise -Garrelt -machen. Also fast mehr Absprache nötig als sonst. -Tobias Müller -Genau, auf jeden Fall. -Garrelt -Ja. Und Till, Du konntest aber ohne viel Entwicklungs, nee, das weiß gar nicht, wie viel Entwicklungserfahrung hattest Du denn vorher? Oder bist Du da einfach wirklich aus dem reinen Designbackground eingestiegen und konntest da Dinge entwickeln? -Till Schneider -Also ich hab einmal eine eine Designlibrary eben mit mit Tellwind HTML, CSS irgendwie geschrieben. Das so Grundverständnisse waren eben da jetzt übers Boxmodel oder wie grundsätzlich die die die Dinge in in Code übersetzt werden. Aber tatsächlich war es dann doch eine recht steile Lernkurve eben noch mal eben viel, viel Tutorials angucken, dass man weiß, wie sich halt der flatterflow wieder verhält. Also ich wär dann wahrscheinlich schneller gewesen, hätt ich's dann in in mit irgendwie schreiben können. Ging an der Stelle aber nicht, weil andere Sachen wieder nicht gegangen wären. Und tatsächlich diese die Grenzen waren dann recht fließend. Also ich konnte dann halt auch über dieses dieses son System, wo man quasi die die Action Blocks dann einfügen kann, die irgendwelche Dinge triggern, wie zum Beispiel haptisches Feedback. Das waren für mich halt dann zwei Klicks, ein neue Note anlegen, sagen hier, haptisches Feedback auf, wenn der Button gedrückt wird. Und dann hat kann ich das supereinfach auch bewerkstelligen. Das wär auf Codebene dann wieder deutlich komplizierter gewesen, beziehungsweise hätt ich wahrscheinlich noch mehr Fehler gemacht. Also da konnte ich mich dann mehr Richtung Tobi auch arbeiten, sag ich mal, von der von der Funktionalität her. Auch Stück für Stück hab ich mich auch sicherer gefühlt, wie wie mach ich eine eine Firebase Datenbankabfrage und so weiter und so fort, weil der Flatterflow einfach das schon relativ verständlich macht für den Nutzer. -Jan -Das wär jetzt meine nächste Frage gewesen. Also selbst wenn Du dann durch diverse Tutorials und und so dich in dem Editor irgendwie wohlfühlst, musst Du ja trotzdem am Ende noch über kurz oder lang andere Services integrieren, sei es euer eigenes Firebase oder vielleicht habt ihr auch noch andere Services angebunden, keine Ahnung. Und wie schafft das denn son Tool an der Stelle, da sone Translation hinzubekommen zwischen, na ja, na ja, Du machst dir zwar eine Datenbankabfrage und da kommt irgend 'n 'n JSON Objekt vielleicht zurück am Ende des Tages. Aber wie sagt man dann, okay, und jetzt von diesem JSON Notizenobjekt hier an dieser Stelle den Titel anzeigen und hier den Inhalt und hier vielleicht, ne, also also wie wie ist dieser Connect so? -Tobias Müller -Ich glaub, da hat sich dann auch schnell gezeigt, wo so Grenzen dann liegen, was was trotzdem aber möglich ist. Einfache Updates, Datenbankabfragen und so weiter. Da kam Till auch super mit klar. Ich glaub, da braucht man nicht wirklich das Coding Verständnis, wenn's aber dann drum geht, wirklich mal Daten zu extrahieren, mehrere multiple Datensätze zu verändern oder auch in der UI ja berechnen und so weiter zu machen. Da musste ich dann schon einschreiten. Das ist nämlich auch flatterflow möglich, aber da gehört dann halt wirklich auch das Verständnis 'n bisschen dazu. -Jan -Und wie habt ihr euer euer Backend dazu gebaut? Weil ich nehm mal an, das macht man ja nicht in flatterflow. -Garrelt -Genau. Also wir hatten ja jetzt erst -Tobias Müller -mal über die Integration von Feuilleton zum Beispiel geredet. Jetzt kommt eben der Punkt unsere Verarbeitung bei Memoro, unsere unsere Prozesse, wie wir das natürlich aufgearbeitet ausgeben, das liegt alles an 'nem Backend. Und auch da bietet eigentlich Flatterflow 'n guten zentralen Punkt, wo man einfach seine Backend Route einfügt, seine Restcalls definiert und die dann auch als Action abfeuern kann. Aber auch da gibt's dann halt wiederum Limitierungen. Wir hatten jetzt Glück, dass wir jetzt da backend rotemäßig nicht nur hohe Komplexität haben, aber wir waren jetzt trotzdem auf ein back End eingegrenzt. Wir konnten so was wie On Preme und so weiter nicht umsetzen damit. -Garrelt -Was ich -Till Schneider -vielleicht noch ergänzen will an der Stelle, im Bezug auf die Datenbankabfragen, ist es son bisschen auch eine Blackbox gewesen. Also wir hatten dann im Endeffekt das Problem, dass wir in den Memory Leak reingelaufen sind und mussten dann ewig lang debuggen, woran liegt es? Wir haben's dann auch so halb rausgefunden, aber dann wieder doch nicht. Also es war irgendwie der Timer, den mussten wir dann Custom nachbauen, damit es besser funktioniert. Also drückst Aufnahme starten und dann zählt 'n Timer hoch und irgendwie der eingebaute Timer von Flatterflow hat diesen Memoryleak wohl verursacht, aber es war dann doch nicht, das war das Hauptproblem, aber da war noch mal 'n tiefer liegendes Problem und wir kamen da partout nicht dahinter. Und das war hat mich dann auch sehr verrückt gemacht. Ich als quasi, ich nutze Memoro am meisten, ich kipp da wirklich alles rein, ich nenn mein ganzes Leben damit auf. Ich find, das sind ganz essenzielle Metadaten. Da kann man ja dann irgendwann eine schöne eine KI mit personalisieren. Hatte dann die Probleme, dass das unglaublich langsam würde, die Oberfläche. Und ich hab jetzt im Verlauf von der Entwicklung von Nimuru, glaube ich, vier- oder fünfmal meinen Account gewechselt, weil einfach das das Ding so voll war, dass es dass es nicht mehr performant lief. Und wir hatten, wir wussten aber, es gibt eigentlich keine Lösung dafür. Wir haben ewig lange Schleifen gedreht in der Community, haben versucht, das rauszufinden, kamen dann halt aber zu der Erkenntnis, hey, wenn wir uns angucken, wie wie viel der Durchschnittsnutzer Memos hat, merkt er das Problem gar nicht. Also machen wir uns jetzt deswegen verrückt oder schieben wir das Problem vor uns her? Und wir waren dann an 'nem gewissen Punkt, war uns klar, okay, wir sollten den den den den Stack wechseln. Wir brauchen die Kontrolle über den ganzen Stack und dann haben wir dieses Thema einfach vertagt. Aber das hat uns sehr, sehr viele Bauchschmerzen bereitet. -Jan -Jetzt sprichst sprichst schon 'n wichtigen Punkt an so, diese Frage nach, ne, wann entwächst man halt so diesem Tool und wann muss man sich den Stack noch mal irgendwie grundlegend Gedanken machen. War das für euch von vornherein klar, dass ihr sagt, na gut, wir starten hier mit diesem No Code No Code Thema, einfach schnell sein zu können? Aber irgendwann werden wir's irgendwie selber bauen müssen, wenn alles gut läuft. Oder war eigentlich die Annahme, na ja, wir bauen das jetzt hier mit 'ner Flatterflow oder irgend 'nem anderen Tool und das kann uns auch bis zu den ersten zehn Millionen Usern tragen? -Tobias Müller -Ich glaub, gestartet sind wir schon 'n bisschen mit der Einstellung, dass wir das jetzt mal unlimitiert nutzen können. Natürlich trotzdem mit der Ungewissheit, welche Anforderungen wir noch haben werden. Wir haben aber auch schnell dann gemerkt, wir haben wirklich 'n Problem mit dem Faktor Zeit. Am Anfang eben diese diese Geschwindigkeiten, mit der uns wir uns bewegen, hat uns unglaublich geboostet. Wir konnten schnell iterieren. Wie Thuill schon sagte, unsere vierhundert Versionen, die wir da hatten, konnten direkt auf Feedback eingehen, konnten Sachen testen. Das hat uns sehr viel Geschwindigkeit gegeben, aber wir haben dann gemerkt, je komplexer das Projekt wurde, je größer hatten wir, je mehr hatten wir Probleme mit mit dem Thema Zeit ja bedingt durch. Zeiten, die teilweise bis zu zehn Minuten gingen, einfach nur, wenn man was in der UI ändert und hat dann eben dieses Hot Reload. Auch da sind die Zeiten bei so, keine Ahnung, eine halbe Minute. Und dann stimmt mal was nicht und man muss noch mal neu laden. Man will's aufm Device mal testen, ob da muss man dann wieder warten. Und Flatterflow, ja, kostet da halt leider viel Zeit. Und dann muss man halt irgendwann überlegen, ab welchem Punkt muss bringt man muss man zu viel Zeit für die Entwicklung aufbringen für diese Wartezeiten? Und wann wäre es es sinnvoller, eben auf 'ner anderen eigenen Stack zu wechseln? -Till Schneider -Wir hatten auch ein Problem. Wir haben ja die App dann direkt sehr mehrsprachig aufgebaut, also gleich vierundzwanzig Sprachen unterstützt von Anfang an. Da geht's eben auch drum, dass ausländische Fachkräfte ihr ihre Arbeit in ihrer Heimatsprache dokumentieren können per Sprache. Wir haben son bisschen son Speech to form System geschaffen dann in der App, da wir eben aus verschiedenen Industrien da Anfragen bekommen haben. Und da war einfach einen einen Bug in Flatterflow, dass ich hier die händisch oder ich ich hab einen Google Translate Button, der war erst mal super. Ich konnte oben die englische Sprache eintragen, dann hat er mir das übersetzt in die anderen dreiundzwanzig Sprachen. Erst mal war war da das Problem, dass Google Translate keinen Kontext mitgegeben bekommen hat. Also der wusste nicht, dass es eine UI Übersetzung hielt. Heißt, ich musste ganz viel dann, ich musste dann andere englische Wörter suchen, damit er besser versteht, dass es dass es sich eben eine App handelt. Das war schon 'n Krampf und dann gab's einfach einen Bug, dass er immer wieder die Übersetzung gelöscht hat. Und dann hatten wir sogar geschippte Versionen, wo dann wo er uns eine Seite, die wir überhaupt nicht angefasst hatten, wieder alle Übersetzungen zerschossen hat. Und da gab's, da haben wir auch eben Tickets für angelegt im in der Flatterfloor Community und und und. Kam aber nix. Also da gibt's, glaub ich, bis heute kein kein Fix dafür. Und wir hatten dann vermehrt genau dieses Problem der Hilflosigkeit eigentlich an der Stelle, wo wir wissen, okay, wenn wir das jetzt, hätten wir den Stack im Griff, könnten wir das lösen, aber wir können's grade nicht lösen. Und das waren dann so zwei, drei Baustellen und wo man dann mehr und mehr Bauchschmerzen bekommt und und dann halt eben die Zeit verliert. Weil auf einmal muss ich alle Seiten noch mal kontrollieren vor jedem Shipment und schauen, hey, ist da sind alle Übersetzungen drin. Also das ist genau der Punkt, Tobi meint so, diese die Zeit, am Anfang ging's unglaublich schnell und dann ging's unglaublich schnell unglaublich langsam. -Tobias Müller -Ja, und da haben wir halt schon früh gemerkt oder zu 'nem gewissen Punkt, wir müssen irgendwann den Absprung planen. Wir haben dann angepeilt, eine stabile Version zu haben, die wir in Ruhe lassen können. Und ab da dann eben zu sagen, okay, jetzt machen wir 'n Cut und jetzt wechseln wir auf unseren eigenen Stack. Also das haben wir schon früh angefangen zu planen. -Garrelt -Ja. Aber -Jan -das heißt ja natürlich oder vermutlich, in dem Fall ist das 'n kompletter, ne, weil son Tool wie Flatterflow sich wahrscheinlich nicht dafür anbietet zu sagen, wir machen hier son son hybrides Ding und ersetzen das so peu à peu vielleicht View by View oder Action by Action oder so was. Sondern Du musst im Prinzip, wie Du schon gesagt hast, ne, sone auch sone stabile Version mal kommen, die in Ruhe lassen und nebenbei dann im Prinzip komplett von vorne noch mal die ganze App bauen. Hat euch flutterfloda in irgend 'ner Art und Weise unterstützt? Also konntet ihr, weiß nicht, das Projekt, was ihr da hattet, exportieren und irgendwie dann im Code weiterbearbeiten? Oder habt ihr komplett auf der grünen Wiese angefangen? Wie wie läuft das? Oder habt ihr überhaupt schon angefangen oder plant ihr's grade nur? Vielleicht, das mal ganz vorne anzufangen. -Tobias Müller -Also also wir sind schon am Umbauen. -Till Schneider -Mhm. -Tobias Müller -Mhm. Also ich will nicht sagen, dass es nicht technisch möglich ist. Es ist durchaus technisch möglich, die Codebasis zu nehmen. Sobald man 'n Abo hat, hat man das Recht und kann man eben die die Codebasis nehmen und kann den Code auch selbst verändern. Aber dann kommt man, würd ich sagen, wirklich in Teufelsküche. Ich würde von abraten, weil dann noch mit wirklich der Flow Oberfläche noch Dinge zu verändern, fangt's an mit Merch Konflikten. Das geht So, nee, -Jan -dann hab ich's nämlich, glaub ich, falsch verstanden. Das ging mir nicht darum, parallel auch an der Codebase rumzuarbeiten, sondern die quasi zu nehmen und dann, also die Codebase einmal zu exportieren, flatterflow sozusagen abzuschalten, aber an der exportierten Codebase sozusagen weiterzuarbeiten einfach nur, ja? Dass man halt diesen Plattformlog in son bisschen umgehen kann. -Tobias Müller -Ja, okay. Ja gut, also prinzipiell gleiche Aussage, man hat den Code, man kann den nutzen, man könnte dann auch Vorurteile davon exportieren. Aber dadurch, dass halt flatterflow den Code selbst generiert und auch sein eigenes SDK dadrin nutzt, ist es, denke ich, nicht praktikabel. Also ich würde wirklich davon abraten, lieber die Logik, die dahintersteckt, nehmen und -Garrelt -aus der Logik die eigene App noch mal schreiben. Das geht ja -Tobias Müller -dann auch super mit KI heute. Da KI heute. Deine, Du schreibst deine Logik runter und sagst mir, erzeug mir daraus den Code. Viel effektiver als jetzt wirklich den Code da rauszuexrahin. -Jan -Aber das ist ja eigentlich 'n superwichtiges Learning, ne. Weil ich glaub, für ganz viele Leute ist so dieser Punkt, na ja, hab ich da 'n Plattformlog in oder kann ich am Ende meine App rausexportieren und mitnehmen? -Garrelt -Ja. -Jan -So, gibt ja gefühlte Sicherheit so eigentlich, ne, wenn Du damit anfängst. Und was Du jetzt ja eigentlich gesagt hast so durch die Blume ist, das hat eigentlich nichts wert, dieses Feature. Also es es gibt dir so sone gefühlte Sicherheit noch mit, aber 'n wirklich großen Nutzen außerhalb das zu retten, was Du hast, hast Du halt eigentlich nicht davon. -Tobias Müller -Ich ich kann mal kein Szenario vorstellen, wo das wirklich der Mehrwert größer wär als die Probleme, die man da durchkriegen würde. -Till Schneider -Ich würd das auch mal unter unter Marketing irgendwie verbuchen, weil wenn man wenn sich 'n Flatter Dev mal diesen Code anguckt, den man exportieren kann aus Flatterflow raus, dann wird der sagen, nee, nee, nee, wir müssen das so oder so komplett neu schreiben. Das entsteht halt aus aus diesem Low Code, No Code Ansatz, dass die halt das irgendwie zusammenschustern. Ich find da eine Parallele ganz spannend mit der Superbase, weil wir uns jetzt im im Sinne des auch damit beschäftigt haben, gehen wir auch aus diesem Log von Firebase raus. Und Superbase wirbt es ja ganz ähnlich an. Man kann da ja loslegen ganz einfach, aber sie sind ja Open Source und so weiter. Man kann es ja dann auch on prem hosten und selber hosten oder was auch immer. Ist halt dann aber doch nicht ganz der Fall, weil dieses ganze Tooling, was die Superbase so einfach macht, wenn man sie über deren Dienste nutzt, dann nicht mehr verfügbar ist. Und bei flut of floast, das würde ich sagen, noch extremer. Man vom Frontend her unglaublich wichtig, weil man konnte eben sehr viel Schleifen drehen. Das eine 'n Frontend nachzubauen geht verhältnismäßig einfach, es zu finden, ist ja das Schwierige. Also wo wo muss das Zeug hin? Wie wir deswegen, wir haben ganz schöne Screenshots von diesen vierhundert Versionsnummern und sehen genau, wie hat sich das verändert über die Zeit. Und dann haben wir eine eine gute Linie gefunden und die Linie jetzt nachzubauen, geht verhältnismäßig schnell dann. Aber ja, von der Codebasis, die mitzunehmen, nein. Und wir hatten ja nun dann auch eine Recherche gemacht und uns eigentlich auch gegen Flatter entschieden an der Stelle und haben auf REAC Native gesetzt. -Jan -Das ist jetzt noch mal 'n spannender Punkt, ne. Ich mein, jetzt habt ihr ja im Prinzip die ganze App schon mal in Flatter gebaut oder zumindest den Teil, den ihr custom gebaut gebaut habt davon, der ist ja vermutlich 'n Datenflatter gebaut in Flatterflow so, ja. Ja. Wieso seid ihr dann davon quasi weg, wo ihr dann Also da könnt ihr ja noch weniger recyceln, sag ich mal. -Till Schneider -Ja. Ja. Also ich finde da da auch lange lange recherchiert, mich reingefuchst irgendwie und die Es ist, glaub ich, relativ egal. Also es gibt in in Europa auch die größere Flatter Community. Ich kenn sehr viele Flatter Devs, die produktive Apps haben in Flatter gebaut. Und ich glaube, von der Größe der Community her, von der Menge der Packages her und dem Support her schenkt sich das wenig. Ich fand ich fand rig Native einfach deutlich interessanter, weil sie's jetzt erst, glaub ich, seit 'nem halben Jahr auch auch geschafft haben, aus einer zentralen Codebasis eine performante Web App hinzubekommen. Und Flatter, da es ja aus vom Canvas Model herkommt und eigentlich nicht aus der Webentwicklungsseite her, wird das wahrscheinlich nie schaffen, dass die wirklich performant wird, die Webseite. Wirklich eine Codebasis haben und damit auf alle Plattformen schippen können. Und da ist Reggnative meiner Ansicht nach jetzt 'n guten Schritt weiter plus Tobi und ich haben mehr Erfahrung von der vom Web Development Seite her. Deswegen fällt uns auch da die die, sag ich mal, die Sprache leichter. Es kommt kommt uns bekannter vor. Plus natürlich von Microsoft, Microsoft nutzt es immer mehr. Jetzt kam erst vor zwei, drei Wochen einen einen Riesenupdate. Wir haben eine neue neue Architektur geschipp, geschipped, weil Meta ist ja von Meta React auch in den in den Quests nutzt, also in ihren VR Headsets, das dort für die Oberfläche nutzt. Heißt, sie mussten extrem jetzt die Performance hochschrauben, dann Drop Frame in VR natürlich zu Motion Sickness führt und geht überhaupt nicht. Heißt, da ist einfach 'n megades Backing dahinter. Und vor allem, das war eigentlich der der entscheidende Punkt, man bekommt alle Plattformen performant bespielt. -Jan -Und als wie realistisch hat sich der Plan herausgestellt zu sagen, ihr habt eine stabile Version in Flatterflow, die ihr nicht mehr anfassen müsst. Und parallel arbeitet ihr quasi an dem an dem. Aber ich mein, das ist sone Situation, die haben wir da draußen, glaub ich, alle schon mal erlebt. Der hat's da also, hey, dieses alte Produkt fassen wir jetzt nicht mehr an. Und wir bauen hier einfach nebenbei das Neue. Ja. Und dann kommt halt doch irgendwie jemand die Ecke und sagt, könnt ihr können wir dich noch mal da eine Kleinigkeit ändern? Und da ist noch 'n Bug, der müsste irgendwie noch mal gemacht werden, weil bis das Neue kommt, dauert's irgendwie noch so lange. Und dann ist ja doch dieses Ziel, auf das man hinarbeitet, doch deutlich beweglicher, als man vorher gedacht hat, sag ich mal. -Tobias Müller -Ja, man muss die Sachen, glaub ich, einfach 'n bisschen runterschlucken und sich drauf fokussieren, dass man ja grade daran arbeitet. Weil dann hört man eben, ja hey, das und das geht nicht. Zu den Leuten, die eingeweiht sind, denen sagt man dann so, ja, das wissen wir. Die neue Version kommt bald. Zu den Externen sagt man, oh, vielen Dank, das nehmen wir uns zu Herzen, da arbeiten wir direkt dran. Also ja, wir arbeiten direkt dran, aber halt an 'ner komplett neuen App. -Till Schneider -Es war wirklich, dass wir's geschafft haben, die App noch an den Stand zu bekommen, an der sie jetzt ist. Und wir haben sie jetzt wirklich seit 'n paar Monaten nicht mehr angefasst. Und der letzte Schritt für uns war die Monetarisierung, dass wir dass wir's monetarisiert haben, dass die Leute da sich 'n Abo ziehen können. Diese letzte Versionsnummer war wirklich, also war wie im waren wir. Das, weil gefühlt ist ist uns mehr auseinandergefallen von jeder neuen Version, als dass es wieder funktioniert hat. Und es war wirklich, würd ich sagen, Glück, dass wir das noch mal rausgeschoben bekommen haben und es einfach auf 'nem guten Stand ist. Weil wie gesagt, Flatterflow auf einmal entschieden hat, hier, wir löschen euch Übersetzungen, wir löschen machen irgendwelche Hintergründe kaputt oder so. Das das war wirklich 'n Kampf dann am Ende gegen gegen gegen das Framework, sag ich mal. -Tobias Müller -Ja, es war es war, glaub ich, so gefühlt 'n bisschen Glück, dass wir genau jetzt zum wichtigen Zeitpunkt den Absprung geplant haben, weil's wirklich schlimm wurde jetzt. -Till Schneider -Ja, ja. Knappe Kiste. Okay. -Jan -Das forciert natürlich son bisschen die spannende Frage. Wenn ihr jetzt Memoro noch mal bauen würdet oder in ein paar Jahren ein anderes Start-up macht oder was auch immer, ein anderes Produkt im im selben Space, würdet ihr das noch mal genauso machen? -Garrelt -Zu Anfang drüber. -Tobias Müller -Ja, wir haben 'n bisschen differenzierte Meinung. Also mal allgemein find ich immer noch, ist valide. Für jemanden, der keine Codingerfahrung hat, eine eigene eine einfache App machen will, keine Ahnung, Du machst Schmuck und willst dann unbedingt auf eine App anbieten. Hey, dann, damit wirst Du glücklich, denk ich, mit flatterflow. Das wirst Du damit gut hinkriegen. Aber so was wie mit Moreo grade heute würd ich nicht mehr mit Flatterflow starten. Und genau, ich glaub, da kann ich Herrn Till übergeben zu seiner Meinung. -Till Schneider -Ich find das eine eine unglaublich spannende Frage, weil ich mach mir da viel Gedanken drüber, was wir denn jetzt eigentlich die letzten eineinhalb Jahre so gemacht haben und dann was wir so gearbeitet haben. Und vor allem haben wir uns, weil wir son kleines Team sind und eigentlich auch nicht das Budget haben, groß zu wachsen in dem Sinne. Und ich halte auch viel von organischem Wachstum, ich halte relativ wenig von riesenschnellen VC und wir sammeln viel Geld und wir machen hier. Das das find ich alles 'n bisschen eigentlich kontraproduktiv. Wir haben uns extrem drauf konzentriert, wie werden wir besser? Wie wie können wir noch schneller bauen? Also Tobi und ich, wie arbeiten wir besser zusammen und wie enhanzen wir uns noch mehr mit KI? Meine persönliche Meinung ist, ich würde nicht mehr mit Flatterflow starten, weil die Lernkurve eben so steil ist, dass meiner Ansicht nach heute, wenn man sich 'n Cursor nimmt oder 'n Windsurf nimmt, wenn man sich diese IDIs hernimmt, die wirklich gepimpt sind mit KI, man eigentlich schneller vom Fleck kommt. Und wir haben jetzt über die letzten drei, vier Monate, glaube ich, fünf, sechs, sieben neue Applikationen geschaffen, die alle in in 'ner guten Alphaphase sind, auch intern. Und wir haben unsere Webseite auch zum Beispiel, die jetzt mit NextJS und so, hab ich komplett mit mit Curcer damals komplett mit KI neu geschrieben und so. Das die liest die Marktdown Dateien aus, baut sich über Marktdown Dateien auf und so weiter und so fort. Man kann die dann recht einfach befüllen. Wir haben sehr viel experimentiert mit verschiedenen Sachen und ich glaube, es macht keinen Sinn mehr, diese Dependency und diese Probleme, die diese Dependencies eigentlich mit sich bringen, einzugehen. Man sollte mehr und mehr sich drauf konzentrieren, den Stack selber im Griff zu haben und grundsätzlich weniger Dependencies, weniger kleine Pakete für für irgendwelche kleinen Helferfunktionen und so weiter nutzen, sondern es die KI schreiben lassen. Und langsam sind die Tools, ich mein, die Zeit arbeitet da ja für uns und die das Tooling wird besser. Ich hab das Gefühl, die KI ist noch nicht so richtig in der Endanwendung angekommen, sondern es es passiert ganz viel im im Tooling, diese Tools zu bauen. Aber es ist 'n ganz neues Medium und wie bei jedem Mediumswechsel, die erste Fernsehsendungen, die liefen, da haben sie halt Radioshows abgefilmt, weil sie wussten ja auch nicht, was sie jetzt erfüllen sollen. Also man nimmt irgendwie so die alten Dinge auch noch mit, auch ausm UI Design und so weiter. Da hinken wir eigentlich hinterher, da gibt's extremes Innovationspotenzial. Meiner Ansicht nach hat hat AI 'n großes UX UI Problem eigentlich, wieder leere leere URL Zeile wie Anfänge des World Wide Webs und wir haben einfach wir haben einen unglaublichen Drang zu bauen. Also Tobi hat dann irgend eine Idee, wo er wo er sich 'n kleines Helfertool bauen will und baut es halt einfach. Und damals haben wir das noch in Bildship zusammengesetzt und und in in Flatterflow tatsächlich haben wir die ersten Prototypen gebaut und jetzt machen wir das einfach in Code. Und es geht meiner Ansicht nach schneller, aber wir wissen ja auch, dass das ist es heißt, es ist langfristiger. Wir haben den Stack im Griff und wir können dieses Tool jetzt mit anderen Tools verbinden. Und jetzt kommen Enterprise Customer und wollen das on prem haben oder unsere Schweizer Kunden wollen das in der Schweiz gehostet haben, die Deutschen in Deutschland und dann ist das möglich. Also wir sind viel, viel flexibler und wir bauen halt gleich was auf auf 'nem guten Fundament. Und langsamer geht es, glaub ich, nicht mehr. -Jan -Aber der Punkt, den Du gemacht hast mit, die die Zeit spielt ja dir in die Karten. Das gilt ja auch für so Tools wie Flatter, Flow oder wahrscheinlich analog auch für vergleichbare Tools. Vielleicht hab mir das eben nur mal so kurz nebenbei aufgemacht. Und da gibt's jetzt auch AI Funktionen, die so, ja, wo Du halt son bisschen schnell was malst und da generiert dir dein dein Widget daraus oder Nicht -Till Schneider -gut. Also leider ist das es ist es wirklich einfach nicht gut. Also Aber -Jan -aber wie Du gesagt hast, das ist ja jetzt das Schlechteste, was es jemals sein wird, so, ja? Also auch da ist ja die Frage, ne, weil Du dieses UI Thema auch so angesprochen hast, also da Also ich versteh deine Abwägung jetzt vollkommen, so. Ich frag mich halt, ob das in fünf Jahren immer noch genauso ist. Weil was ich immer seh, wenn Leute mit AI Code generieren oder UIs generieren oder so, es ist superschnell, solange diese diese menschliche Sprache als und funktioniert, ja? Wenn Du jetzt schreibst, hey, ich brauch 'n Login Screen und ich will hier 'n Userfeld und 'n Passwortfeld und 'n Login Button und 'n Registrieren Button und 'n, weiß ich nicht, Button oder so was, ja? Und dann wird das erstellt und alles cool. Und dann kommt so diese diese kleinen Details, ne. Ich brauch hier mein mein Logo drin und ah, nee, ich brauch's irgendwie anders. Das sitzt noch nicht so ganz richtig, wo man halt eigentlich in sonem grafischen Editor, ne, wenn wenn die Grundlage mal erzeugt, das würde man eigentlich viel lieber mit der mit der Maus mal so hingehen und das son bisschen bewegen oder ziehen oder noch mal noch mal anpassen. Und solang ich aber immer 'n neues prompt irgendwie schreiben muss so, ah, mach's doch noch mal 'n bisschen anders und schiebst's mal mehr dahin oder versuch's mal so und so. Das ist, glaub ich, beim Iterieren noch ziemlich mühselig grade. Was man, glaub ich, eigentlich haben will, ist doch son sone Toolchain, wo der Initialzustand quasi AI generiert wird und ich dann aber trotzdem 'n grafisches Interface hab, die letzten null Komma eins Prozent irgendwie Feintuning noch zu machen, ja. Ich will ja nicht in den Code gehen, nur Margin irgendwie anpassen zu müssen. -Garrelt -Weißt Du, -Jan -was ich mein? -Garrelt -Ich weiß, was Du meinst, aber das Problem der aktuellen No Code No Code No Go Tools ist eben, dass sie diese zusätzliche Abstraktionsebene ein -Till Schneider -aktuellen Tools ist eben, dass sie diese zusätzliche Abstraktionsebene einführen und sie dich nicht an den ganzen Stack ranlassen. Du hast nicht die komplette Kontrolle über deine Tools. Also da braucht's, glaub ich, einfach eine neue Generation von Tools, die Ja, vielleicht. Im Grunde genommen auf voll mit KI gebaut sind und diese Abstraktionsebene einfach weglassen. Die können mir das ja dann anzeigen visuell und ich kann meinen Button verschieben, wobei das auch 'n bisschen 'n Wunschtraum ist, dass man dann die Margin anpasst, weil wie verhält sich das dann in der responsivness? Also das ist dann alles gar nicht so einfach. Son visueller Editor bringt auch Probleme mit sich auf der anderen Seite, aber ich glaube, da braucht's, man braucht die Kontrolle über den Stack. Und diese flatte Flow Ebene bringt halt Performance Issues mit sich, bringt eben mit sich und so weiter und so fort. Also zum jetzigen, ist wär schön, wenn wir das hätten, dass jetzt quasi, aber das das muss dann 'n VS Code bringt dann halt irgendwie eine eine Möglichkeit, dass man da auch visuell 'n bisschen rumschieben kann. Da seh ich das dann eher, dass dass sich eigentlich die Code Editoren in die Richtung bewegen, anstatt dass diese Low Code No Code Tools mehr wie die Code Editoren werden. Mhm. Mhm. -Garrelt -Ich -Tobias Müller -glaub, das ist dann auch son bisschen unsere differenziertere Ansicht, weil ich finde, es gibt trotzdem noch valide Argumente für die Low Code No Code Editoren. Ja, es würd, denk ich, schon einiges sich noch ändern. Aber wie gesagt, hast Du diesen ganz ganz einfache Anforderungen oder hast auch überhaupt keine Ahnung von Design oder so. Oder willst einfach nur schnell mal 'n Prototypenen zusammenklicken, find ich, hattest Du durchaus schon noch seine Existenzberechtigung, ich persönlich. -Jan -Also ich muss auch sagen, in meinem vorherigen Job hatten wir auch No Code No Code Tools benutzt, so interne Sachen einfach zusammenzubauen, ja? Und ich sag mal, für so das interne Dashboard zur Eventplanung, ja, wo jetzt auch Design mal komplett zweitrangig ist und es eigentlich mehr son glorifiziertes ist für so einfache Update Delete Operationen und 'n bisschen Auswertungen oder so. Dafür wird es, glaub ich, auch auf sehr lange Sicht nicht zu schlagen sein. So ja, weil das halt noch Weiten mächtiger ist als son Excel Spreadsheet so und deutlich billiger zu machen als irgend eine Custom Softwarelösung, so. Ja, ich glaube, das wird vielleicht die Nische, die Sie da so lang- und mittelfristig besetzen können. Aber wahrscheinlich hast Du recht, Tobias, ja, es gibt gibt auch genug andere Use Cases, wo's sich vielleicht dann dann auch nicht lohnt. -Till Schneider -Sehe ich genauso. Aber sobald's, glaub ich, Customer Facing wird und man will man will in eine gewisse Skalierung reingehen und man will einfach das beste die beste User Experience bieten, was man ja für interne Tools nicht muss. Da geht's nicht drum. Da weiß jeder irgendwie, was er da jetzt machen soll, das Sommerfest zu planen und dann dann ist das super. Aber ja, vielleicht geht dann da so, trennt sich da die Spreu vom Weizen. Als Tobi und ich uns dann irgendwann, das war recht spät in dem Prozess, mal angeguckt haben, was sind denn so die ganz tollen Flatterflow Apps, die so die live sind, waren wir dann auch sehr ernüchtert, weil also die die das, was die da alles showkasen an an den den erfolgreichen Flatterflow Apps, die sind auch gar nicht so gut und und gar nicht so erfolgreich und und und. Also ich glaub auch, es ist sone Frage von von für wen ist es dann gedacht am Ende. -Garrelt -Ich glaube, ihr habt das schon beantwortet, aber das heißt, am Anfang seid ihr eingestiegen mit, es ist cool für Prototyping und wenn's schnell gehen soll. Aber wenn ich das richtig verstehe, wenn ihr jetzt in dem Hacker fahren seid, würdet ihr auch eher auf cursor a I gehen und das so erstellen. Hab ich das richtig verstanden? -Tobias Müller -Ich glaub, das war dann tatsächlich der Punkt, wo wir anfangen zu diskutieren, wo Till wahrscheinlich ironischerweise Till, der nicht Und dann ist der Herr der Podcast hat -Jan -vorbei nach zwei Tagen diskutiert. -Garrelt -Das ist -Jan -schon fatal. -Till Schneider -Genau. Ich ich -Tobias Müller -glaub, das ist 'n bisschen die Ironie. Till eben, der nicht dann Code schreibt, der wird dann vielleicht eher zu Cursor oder Windsurf tendieren und ich vielleicht eher dann tatsächlich zu Flatterflow, der eigentlich coaten kann. Keine Ahnung, aber ja. -Till Schneider -Ich glaube für für Leute, die, also ich persönlich würde es so machen, dass ich dann mit Cursor oder oder Wünsdorf anfange, aber anderen Menschen würde ich da vielleicht schon noch 'n Low Code No Code Tool empfehlen. An der Stelle vielleicht jetzt nicht Flatterflow, weil's einfach noch komplexer ist. Da gibt's eben andere Low Code No Code Tools, die deutlich simpler daherkommen und für einen Hacker Thorn dann besser geeignet sind. Aber ja, für uns persönlich macht es keinen Sinn mehr, in diese Abstraktion reinzugehen, weil wir jetzt weil wir uns halt auskennen und schneller sind, wenn wir es selber coden. Aber für jemand ohne Erfahrung hat seine Tobi, ich -Jan -stell mal eine These in den Raum, weil ich würde mich, glaub ich, dir auch anschließen und auch eher zu dieser zu sonem grafischen Interface Code, nicht Nicht Code Editor tendieren für son Setting. Aber weil ich bei mir persönlich auch immer so das Risiko seh, wenn ich das jetzt in sonem HTML mache und egal, ob das auto generiert ist und oder weiß nicht, Du nimmst fertiges Template ausm Netz oder so was, keine Ahnung, ne. Man verliert sich dann halt doch so ganz schnell in diesen kleinen Sachen so, oh, hier, das könnt ich schon mal weg abstrahieren und hier könnt ich irgendwie noch mal das 'n bisschen eleganter machen als diese Vorlage oder dieses Generierte. Und das ist natürlich sone Falle, in die man in 'nem No Code, in einer No Code Umgebung halt nicht so reinfällt. Ja, man hat jetzt okay, ich klick jetzt mein Interface zusammen und vielleicht ist der Button noch nicht perfekt, aber für mich, dann mein ich jetzt mich, Jan, ja, der im Prinzip null grafischen Gestaltungsanspruch hat, weil ich zwei linke Hände hab, was so was angeht, da reicht das halt. Dann bin ich halt viel, viel schneller so, mal zusammen zu klicken sozusagen, anstatt irgendwie eine IDI aufzumachen und nach zwei Stunden zu merken, dass diese eine CSS Klasse irgendwie immer noch nicht so will, wie ich will, ja. Und halt wieder nur viel Zeit verschenkt hab. Ach, Ja, ich ich ich glaube, -Tobias Müller -das ist 'n valides Argument, ja. Der da da triggert dann son bisschen der Perfektionismusdrang. Den sieht man halt nicht bei sonem Editor. -Till Schneider -Deswegen, das ist sone spannende Diskussion, weil ich glaub auch nur, dass dass dass das meine Meinung ist, weil ich eben keine Erfahrung hab im Coden. Also Ja, Verständnis ist. Ja und das ist aber eine ganz spannende Herangehensweise. Also ich bin ich bin ich bin fest davon überzeugt, ich kann die ich kann die Dinge anders entwickeln. Ich denk anders über sie nach, weil mir ist es egal, wie gut der Code aussieht, da jetzt eben der Wechsel von Curser to Windsurve, vielleicht für meinen schon for shadowing für meinen Pick des mein mein Pick des Tages, finde ich ganz spannend, weil mich Ich les den Code auch nicht mehr. Wirklich, das interessiert mich nicht, was im Coach steht. Ich les den nicht. Ich ich drück aufn Knopf und dann drück ich zehnmal noch mal aufn Knopf. Und wenn ein Ärger rauskommt, -Jan -dann Zu viel Lehrer aus dem sehen gerade nicht, wie hochgaret die Augenbrauen gezogen hat. Die sind quasi zum zum Hinterkopf. -Till Schneider -Ich weiß, Du weißt die. Aber es hängt halt davon ab, was man baut. Und wir bauen deswegen sehr viel neue Tools, damit wir die die vom vom Funktionsumfang sehr abgespeckt halten können. Und mir geht es nicht die Codequalität. Mir geht's darum, dass ich 'n fertiges Produkt hab, was ich den Leuten schippen kann. Und und was da drunter für 'n Müll ist, da ist ja Code ist ja 'n Code nicht perfekt, ist nie perfekt. Das ist eher Gerade nur eine größere war, sonst läuft der irgendwann ausm Ruder. So, das das das entbrase ich von vornherein, das Chaos. Ich weiß noch nicht, wie Oh, okay. Wo das denn gelang ist? Schwierig. Ich -Jan -ich kann da ganz kurz eine eine Anekdote zu erzählen aus Ja. Aus 'nem Consultingprojekt von jemandem, die mal ein ein Interface, ein Frontend in Auftrag gegeben haben, irgendwo offshoring mäßig. Mhm. Und das haben wir dann zurückbekommen in irgend sonem Javascape Framework und und und bla. Und dann mussten da noch 'n paar Änderungen gemacht werden, weil es halt nicht so ganz dem Design entsprochen hat in allen Details. Und dann sind wir da 'n paar Wochen vergangen und das gab eine neue Auslieferung von dem Interface. Und wenn man da mal den Code reingeholt hat, hat man halt gemerkt so, das hat kein Stein auf dem anderen geblieben. Ja. Und dann wurde da so nachgefragt, so, wieso habt ihr denn das ganz? Also wieso ist denn da so viel geändert und so, ja, weil wir das halt komplett neu gebaut haben so. Also bevor wir uns die Mühe machen, hier den Leuten quasi zu erklären, das ist der Stand, das muss geändert werden, gibst Du halt dieselben Specs Ja. Noch mal fünfzig anderen Offshore Arbeitern so. Und das ist halt einfach noch mal komplett neu iterieren, So. -Till Schneider -Keine Techdap, keine Legacy Code, wie -Jan -Ja, genau, einfach komplett bei null an. -Garrelt -Das ist -Jan -halt viel einfacher für die, wenn Arbeitskraft quasi nix kostet. Und im Prinzip ist ja das mit AI genauso, ja? Wenn Arbeitskraft nix kostet, ist ja jede Iteration umsonst sozusagen. Und kannst das dir dann halt auch erlauben. Aber meine meine abschließende Frage an Gareth wär eigentlich gewesen, nach dieser Diskussion jetzt hier, Gareth, ja. Wenn Du jetzt bei 'nem Hackathon anfangen müsstest, ja, für was würdest Du dich denn entscheiden? -Garrelt -Ja, also ich glaub, mein Fazit ist so, das kommt aufs Team an, weil ich hab schon das Gefühl zum Beispiel, es ist es ist eine arge Zielgruppenfrage, dieses Thema, nutzt man dieses Tool oder nicht? Und mein Gefühl war eigentlich, Till und das wollte ich dich auch noch fragen, dass es für dich gefühlt eigentlich 'n cooles Tool war, weil Du so von Design supergut auch ins Entwickeln einsteigen kannst, so. Und so der Weg darüber in meinem Kopf halt 'n schöner ist und 'n guter, weil man eben so viel schon sieht und an manchen Stellen einsteigen kann, technisch, wenn man will, es aber auch erst mal weglassen kann oder von anderen machen lassen kann. Und deswegen wär, glaub ich, meine Entscheidung so, hab ich jetzt nur Entwickler in meinem Hacker vom Team? Dann wahrscheinlich nicht. Aber hab ich auch Designer, die auch Lust haben, nicht nur zu designen, sondern das auch direkt zu bauen, was ja auch dann den Entwicklern erst mal auch Arbeit abnimmt und eine bessere Zusammenarbeit ermöglicht. Auf jeden Fall, find ich's total sinnvoll. Und ja, wahrscheinlich und mein zweites Learning wär dann, haben wir gewonnen, ist es eine coole App, wollen wir daraus 'n Produkt machen, direkt weg von No Code. Das wär, glaub ich, so mein mein Learning. -Jan -Das ist, glaub ich, 'n sehr schönes Fazit. Das das kann man so stehen lassen als letzten Satz. Aber das ist ja noch nicht ganz der letzte Satz, weil wir haben ja noch unsere. Und Gerald, weil Du grade son schönes Fazit gezogen hast, ja, darfst Du auch anfangen mit deinem. Sehr gerne. -Garrelt -Ich habe einen Artikel mitgebracht, den ein Kollege vor Kurzem geteilt hat mit uns, der heißt von Iven Smith. Und das ist im Prinzip ein sehr ausführlicher Artikel, gibt auch einen Talk dazu, also kann man sich auch anschauen, wen man möchte. Darüber, wie er Kenntnis als Entwickler lebt sozusagen. Also wie kann man, ja, Kenntnis, Freundlichkeit, nee, wie übersetzt man das Deutsch? Ja, ja doch. Freundlichkeit. Wie kann man das als Entwickler in seinem Arbeitsplatz ausleben und fördern und andere Leute da so auch mitreißen? Er beleuchtet das von verschiedenen Sichtweisen und ich find es sehr schön gemacht. Es ist 'n sehr schöner. -Jan -Nice. Wunderbar. Tausend Dank. Dann Tobi, was hast Du im Gepäck? -Tobias Müller -Ich hab 'n kleines Open Source Tool, das heißt Local Sand. Da bin ich drauf gestoßen, das hilft mir hin und wieder, weil ich eben durch die Crossplattformenentwicklung aufn Mac wechseln musste, bin aber eigentlich eher von der Android Linux Site und so weiter gekommen. Ich hab also immer noch 'n Android Phone und da kann ich halt keinen Airdrop nutzen. Und Local Sand ist 'n Open Source Tool, womit man einfach wirklich auf allen Plattformen schnell mal Dateien oder Texte auch verschlüsselt im lokalen Netzwerk senden kann. Also ich hab irgendwie 'n, ich bau grad eine APK, nämlich Local Sand, Shicks aufm Handy. Auch hab ich 'n iPhone hier liegen, kann ich auch darüber schnell was schicken. Also superpraktisch und vor allem die Oberfläche ist super minimalistisch und intuitiv. -Jan -Wenn das Open Source ist, wie krieg ich das auf mein iPhone drauf? Gibt's auch im Store oder muss ich mir das selber bauen und kompilieren oder wie wie wie wie komm ich da dran? -Tobias Müller -Ich vermute, dass es im Store ist. Ich kann's dir grade nicht sagen. Doch, ich ich hab grad geguckt. -Garrelt -Entweder im Store oder Package Manager haben, das gibt's auf verschiedenen Plattformen verschiedene Links. -Till Schneider -Okay. Cool. -Jan -Wunderbar. Till, was hast Du im Gepäck? -Till Schneider -Genau, ich habe Windsurf mitgebracht. Ich eben als als Nichtcoder bin dann von Cursor gewechselt zu Windsurf jetzt vor, also ich benutz beide Tools noch parallel, aber primär jetzt eigentlich Windsurf, ist eben eine neue IDE, die viel ist als Cursor, also die die dreht selber Denkschleifen, schlägt selber die nächsten Schritte vor und ist gefährlich. Also ich würde das wirklich in 'nem neuen Projekt testen, da die wie son, es ist wie 'n breiter Pinsel. Das ist wie man wirft Farbe auf die Leinwand, wo man mit Curseern noch noch zielgerichteter an Probleme rangehen kann, fängt es immer an, gleich die ganze Codebasis in in in Hinblick zu haben. Man muss zum einen keine Dateien mehr referenzieren, sondern der sucht sich die selber raus. Es ist von der von meiner Developer Experience her, wenn man davon sprechen kann, ist es komisch, weil man drückt drauf und dann geht's drei Minuten und man weiß jetzt nicht, was man in den drei Minuten machen soll. Mit mit Cursor kam ich noch schön in einen Tunnel rein und konnte konnte mir überlegen, während der das diesen eine Änderung jetzt macht, okay, wo könnten wir jetzt weiter weitermachen? Also es erfordert 'n bisschen ein Umdenken. Ich find's aber extrem spannend, weil es einfach so der, find ich, die noch mal der nächste Schritt ist in Richtung, KI kann auch in größeren Code Codebasen gut unterwegs sein, kann einem Dinge, kann Probleme finden, die die irgendwo versteckt sind und hat mich jetzt noch mal ermöglicht, Dinge noch schneller zu bauen eigentlich und auch andere Sachen noch besser zu referenzieren. Also fand ich jetzt eine 'n tolles Tool und zeigt son bisschen, find ich, die die die deutet die Zukunft an, wo's hingeht. -Jan -Ich hab bei diesen ganzen AI Tools immer so zwei Fragen. So a, was was ist das Pricing? Und gibt's die Möglichkeit, das auch irgendwie zumindest teilweise lokal bei mir laufend zu haben? -Till Schneider -Tatsächlich weiß ich bei CursOR nicht, ob man seine eigenen API Keys einbinden kann. Ich weiß, dass es also bei kostet ja zwanzig Euro im Monat, wenn man das pro Tier hat. Ich hab da aber ständig auch neue dazukaufen müssen, also ich zahl da eher achtzig Euro im Monat für. Und bei, ja, aber das genau, also das ich hab da überhaupt keinen Schmerz, weil anders könnt ich ja gar nicht arbeiten. Also für mich ist es ja quasi essenziell notwendig, Nein, -Jan -nein, nein, alles cool. -Garrelt -Ich ich -Jan -bin nur drüber gestolpert, weil wir hatten, ich hatte vor Kurzem 'n Gespräch mit Fabi, als wir 'n Gastauftritt im Engineering Kiosk, kleines Shoutout, gehabt haben, da haben wir nämlich auch über Cursor gesprochen. Dann hab ich nämlich Also Fabi hat Cursor gepitcht. Und das war nämlich genau meine Frage, so dieses Pricing Model, wenn ich's für mich so sehe, ne. Null, zwanzig und Teamplan, so ohne Preis sozusagen, was wir da auf der Webseite haben. Und dann stand da so dabei, Du hast irgendwie, weiß ich nicht, zweihundert Autokomplicions im Monat oder keine Ahnung, was Du da für zwanzig Euro kriegst. Und das war für mich als als Entwickler, als Endkunde gefühlt vollkommen intransparent, weil wenn Du mich fragen müsstest, wie viel Autokomplicions brauchst Du denn überhaupt? Also ich Keine Ahnung. Keine Ahnung, so, ja. Vielleicht fünfzig, vielleicht fünftausend? Keine Ahnung. -Till Schneider -Ja. Also ich brauch dann dementsprechend achthundert im Monat oder so circa. Und dann zahl ich meine achtzig dafür. -Jan -Ja, das ist schon schlauer als ich -Till Schneider -Und also Windsurf kostet weniger. Windsurf kostet 'n Zehner im Monat, aber Du hast da wieder, ich bin jetzt, was ist, zwei Wochen Free Trial. Jetzt haben sie mir für Thanksgiving noch mal 'n Monat, glaub ich, oder zwei Monate Free Trial geschenkt, also wie's halt so ist. Sie sie hocken dich, aber sie haben mich schon lange gehook, also an der Stelle hätten sie mich jetzt eigentlich auch schon zur Kasse bitten können. Aber ich bin ja bin ich froh drum. Genau, heißt, es ist 'n bisschen günstiger. Ich bin mir nicht sicher, ob Du deine eigenen API Keys einbauen kannst. Genau, aber fand ich fand ich 'n sehr, sehr schönes Tool. Gleich gleiche Geschichte, Fork von VS Code. Genau. -Jan -Aber auch mit 'nem API Key wär's ja immer noch bei irgendjemand anderem gelaufen. Ich so, weißt Du, ich such noch son Editor, wo ich auch so lokale Modelle irgendwie am Start hab. Ja. Und das gibt's gefühlt -Till Schneider -noch nicht. Noch nicht. -Jan -Wirklich so. -Garrelt -Ja. Cool. Da aber -Tobias Müller -'n Tipp, wenn Du Cursor nutzt, kannst Du zum Beispiel auf auf eine eigene deine eigene GPT Instanz hosten. Das ist ja dann auch DSGVO konform. Das kommt zumindest mal 'n bisschen Richtung Datenschutz und Sicherheit in die Richtung. Und dann kannst Du auch den API key dafür nutzen. -Jan -Tatsächlich, so blöd es jetzt klingt, aber Datenschutz ist nicht mein Main Console. Mein Main Console ist eher so, ich sitz im Zug oder im Flugzeug oder keine Ahnung, Du hast ja aber einfach kein Netz braucht, weißte? Ja. Was die die perfekte Überleitung zu meinem Pick ist, mein Pick ist nämlich Air Fly. Ich weiß nicht, wer von euch Air Fly kennt, das ist son kleines Hardware Ding. Wer öfter mal im Flugzeug sitzt, so wie ich das in letzter Zeit viel getan habe, ärgert sich vielleicht manchmal, dass wenn er irgendwie son Onboard Film gucken will, diese komischen Headsets von irgendwelchen Airlines oder so benutzen muss. Und die coolen Kopfhörer, die man selber dabei -Till Schneider -hat, meistens nicht funktionieren, weil das ja in der Regel alles Bluetooth Sachen sind, die wir so haben. -Jan -Mhm. Und Airfait, in der Regel alles Bluetooth Sachen sind, die wir -Tobias Müller -so haben. Mhm. -Jan -Und Air Fly ist, ich hab jetzt mal kurz, ich hab mal son kleines Dongle, was man im Prinzip an son Audioanschluss hängen kann. Und das macht im Prinzip einen kleinen Bluetooth Anschluss da dran und man kann seine Lieblings Kopfhörer, AirPods, meine Bose Kopfhörer, was auch immer kann ich dann eben benutzen, ohne dass da irgendwie Bluetooth schon dabei sein muss. Und warum grade der Airflight irgendwie so cool ist, Weil er zwei besondere Features hat, die mir immer noch weiterhelfen. Zum einen kann ich mehrere Kopfhörer dadran koppeln. Das heißt, wenn meine Frau, meine Tochter, wie auch immer im Flugzeug mitgucken wollen, können sie im Prinzip auch ihre Kopfhörer dranhängen. Und ich hab wie im Prinzip wie son Splitter dann noch drin. Und man kann dasselbe Gerät nehmen und nicht nur als Transmitter für Bluetooth benutzen, sondern auch als Receiver. Das heißt, wenn ihr am im Urlaub angekommen seid und ihr habt dann quasi einen Mietwagen, der vielleicht auch kein Bluetooth hat und dann steckt ihr das Ding in den Kopfhörer oder in den AUX Eingang von dem Auto, könnt ihr euer Handy quasi so rum daran connecten und habt auf einmal Freisprecheinrichtungen und könnt eure Musik hören und keine Ahnung was. Also es ist einfach 'n superkleines praktisches Gerät. Das ist immer bei mir in der Reisetasche drin und es ist auch in eigentlich jedem Urlaub irgendwie in in Verwendung so. Es ist leider 'n bisschen teuer, ich glaub, es kostet so sechs sechs oder siebzig Euro. Gibt auch eine kleinere Variante davon, die ist 'n bisschen billiger, wenn ich alle Features brauch, aber so oder so. Kann ich nur empfehlen, hat mir schon viel Urlaub gerettet, weil es einem auf einmal ermöglicht, mit Noise Cancelling im Flugzeug zu sitzen und trotzdem 'n coolen Film zu -Garrelt -gucken. Ja. Das ist bei denen sehr spannend. Die haben ein Pro für fünfundfünfzig Euro und ein Duo, was alles kann wie der Pro plus mehr Akkulaufzeit für achtundvierzig Euro. -Jan -Und es gibt noch 'n s e, was irgend 'n Feature nicht hat, was auch noch mal 'n bisschen billiger ist. Aber ja, Ich ich hab den Pro, keine Ahnung, schon vor fünf Jahren oder so gekauft oder was weiß ich, als er rauskam. Bin bis dahin eigentlich sehr, sehr zufrieden. War damals ganz happy, weil das der Erste war, der auch so USB-c charging hatte und Und schon seit Längerem dabei bin, so mein ganzes Travel Equipment auf USB-c umzustellen und nicht mehr mit irgendwelchen komischen Adaptern rumreisen zu müssen, nur noch eine Sorte von Kabel dabei zu haben. Ist auch sehr befreiend. Ja. -Tobias Müller -Das das fühl ich mit den Anschlüssen. Das ist fast schon das größte Argument von allen. -Jan -Ja, also das war auch damals, als ich mein mein iPhone fünfzehn gekauft hab, war so, weißt Du, Kamera, Action Buttons, komplett egal. Hauptsache gib mir halt son USB-c-Anschluss. Endlich einheitliche und -Till Schneider -ich kann Lightning wegschmeißen, ja. -Jan -Ja, genau. Cool. Dann Till, Tobias, danke für die Zeit. Danke, dass ihr da wart. Danke, dass ihr uns viel über Low Code und No Code und Vor- und Nachteile erzählt habt. Ich glaub, das war superspannend auch für alle, die da draußen dazu gehört haben. Danke, Garelt, für die Zeit. Danke an euch da draußen fürs Zuhören. Wenn ihr Fragen, Anmerkungen, Kritik, wie auch immer habt, dann immer gerne an Podcast at Programmier Punkt bar eine E-Mail schicken oder das Kontaktformular auf der Webseite benutzen oder Kommentare hinterlassen auf Youtube, Spotify oder irgendwelchen anderen Plattformen. Lesen immer fleißig mit und wir freuen uns auch immer über Bewertungen über den Podcast bei iTunes zum Beispiel, wenn ihr uns da hört, findet, gefunden habt, wie auch immer. Ansonsten bleibt nicht mehr viel zu sagen, außer dass wir uns hier bald wiederhören. Und tschau tschau. Tschau. diff --git a/apps/memoro/apps/landing/context/press/suedkurier-artikel-2024.md b/apps/memoro/apps/landing/context/press/suedkurier-artikel-2024.md deleted file mode 100644 index 06e96e235..000000000 --- a/apps/memoro/apps/landing/context/press/suedkurier-artikel-2024.md +++ /dev/null @@ -1,27 +0,0 @@ -Eine App, die Zeit spart - -Konstanzer Gründer bringen Memoro auf den Weg -Damit gewinnen sie ein gut dotiertes Stipendium - -VON JÖRG-PETER RAU -joerg-peter.rau@suedkurier.de - -Konstanz – Die Besprechung dauert eine gute halbe Stunde, und für Smalltalk ist kein Platz. Wo steht das Projekt? Was sind die nächsten Schritte? Und was haben wir beim letzten Mal vereinbart? Es ist eine Situation, wie sie allein in Konstanz wohl hunderte Male jeden Tag vorkommt. Auch beim Besuch des Pflegedienstes muss es konzentriert zugehen. Jede Hilfsleistung, jeder Handgriff ist mit einem Minuten-Budget versehen. Und dann muss das alles penibel dokumentiert werden. Aber in der Zeit des Ausfüllens kann die Pflegekraft genau das nicht machen, was eigentlich ihre wichtigste Aufgabe ist: Pflegen. - -Zwei von vielen Beispielen, in denen Künstliche Intelligenz (KI) keine Bedrohung, sondern geradezu eine Verheißung ist. Im ersten Fall erstellt sie ein Besprechungsprotokoll. So knapp, dass es noch gelesen wird – aber so ausführlich, dass nichts Wichtiges fehlt. Im zweiten Fall diktiert die Pflegekraft die erbrachten Leistungen ins Handy, und eine App trägt die Informationen automatisch in die richtigen Formularfelder ein. Wenn nötig, übersetzt sie es gleich auch noch ins Deutsche, wenn der App-Nutzer sich mit einer anderen Sprache leichter tut. - -Zukunftsmusik? Nein, sagen Tobias Müller und Till Schneider. Denn die App, die sie soeben auf den Markt bringen, kann genau das. Memoro heißt sie und wird so beworben: „Nie mehr ein Gespräch vergessen. Memoro erinnert sich für Dich.“ - -Einen dritten Anwendungsfall haben die Gründer auch schon vorgesehen: Handwerker, die ebenfalls dazu verpflichtet sind, bestimmte Arbeitsschritte zu dokumentieren, von der Elektroinstallation bis zur Feuerstättenschau. - -Was die beiden jungen Konstanzer da an den Start bringen, überzeugt auch andere: Soeben haben sie das mit bis zu 100.000 Euro dotierte Mindelsee-Stipendium der Initiative „Unternehmer für Gründer“ (UfG) gewonnen. Zusammen mit weiteren Förderprogrammen schafft das die Basis dafür, Memoro richtig groß machen zu können. - -Bereits beim Gründungs- und Ideenwettbewerb „Hack and Harvest“ 2023 hatten Müller und Schneider ihre Pläne vor- und zur Diskussion gestellt. Siegfried Wagner von UfG, sagen die beiden Gründer, habe dann als Mentor enorm geholfen, aus einer Idee eine funktionierende App zu machen. - -Memoro nutzt dabei in erster Linie bereits bestehende KI-Technologien und Software-Lösungen, macht sie aber über eine sehr einfache Benutzeroberfläche zugänglich. „Und mit der Datenschutzgrundverordnung ist es natürlich auch kompatibel“, betont Schneider – immerhin geht es ja, je nach Anwendungsfall, zum Beispiel um Patienten- oder Kundendaten. - -In den nächsten Monaten wollen die Gründer ihre App weiterentwickeln und vor allem Nutzer gewinnen. Denn neben der Idee muss auch das Geschäftsmodell funktionieren. Tobias Müller sagt, man wolle Abonnements oder auch vorausbezahlte Zeitkontingente anbieten. Memoro könne aber auch in andere Umgebungen integriert werden, sodass neben End- auch alle Arten von Geschäftskunden angesprochen werden können. - -Ob bald auf vielen Handys von Handwerkern, Pflege- oder Führungskräften Memoro läuft, ist dennoch nicht gewiss. In jeder Gründung steckt auch das Risiko, dass sie vom Markt nicht angenommen wird. Müller und Schneider wissen dabei, wovon sie reden, denn Memoro ist nicht ihr erstes Start-up. Doch der Gewinn des Mindelsee-Stipendiums hat ihre Zuversicht noch verstärkt, betonen sie. - -Die beiden Gründer – Schneider ist von Haus aus Mediendesigner, Müller Software-Entwickler – machen eine einfache Rechnung auf: Eine Pflegekraft müsse im Schnitt acht Stunden pro Woche für die Dokumentation aufwenden. Memoro könnte das auf die Hälfte reduzieren. Wenn von dieser eingesparten Zeit ein guter Teil bei den Patienten ankommt und ein anderer in Form von Benutzungsgebühren bei Memoro, „dann könnte das ein großer Erfolg werden.“ \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/prices.md b/apps/memoro/apps/landing/context/prices.md deleted file mode 100644 index 85e47d6fd..000000000 --- a/apps/memoro/apps/landing/context/prices.md +++ /dev/null @@ -1,426 +0,0 @@ -{ - "subscriptions": [ - { - "id": "free", - "name": "Mana Tropfen", - "nameEn": "Mana Drop", - "nameIt": "Mana Goccia", - "price": 0, - "priceUnit": "", - "initialMana": 150, - "dailyMana": 5, - "maxMana": 150, - "canGiftMana": false, - "popular": false, - "billingCycle": "monthly", - "available": true - }, - { - "id": "Mana_Stream_Small_v1", - "name": "Mana Fluss", - "nameEn": "Mana Stream", - "nameIt": "Mana Corrente", - "price": 5.99, - "priceUnit": "/ Monat", - "initialMana": 600, - "dailyMana": 20, - "maxMana": 1200, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": true - }, - { - "id": "Mana_Stream_Small_Yearly_v1", - "name": "Mana Fluss", - "nameEn": "Mana Stream", - "nameIt": "Mana Corrente", - "price": 47.99, - "priceUnit": "/ Jahr", - "priceBreakdown": "(entspricht 3,99€ / Monat, 33% Rabatt)", - "initialMana": 600, - "dailyMana": 20, - "maxMana": 1200, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 3.99, - "available": true - }, - { - "id": "Mana_Stream_Medium_v1", - "name": "Mana Strom", - "nameEn": "Mana River", - "nameIt": "Mana Fiume", - "price": 14.99, - "priceUnit": "/ Monat", - "initialMana": 1500, - "dailyMana": 50, - "maxMana": 3000, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": true - }, - { - "id": "Mana_Stream_Medium_Yearly_v1", - "name": "Mana Strom", - "nameEn": "Mana River", - "nameIt": "Mana Fiume", - "price": 119.99, - "priceUnit": "/ Jahr", - "priceBreakdown": "(entspricht 9,99€ / Monat, 33% Rabatt)", - "initialMana": 1500, - "dailyMana": 50, - "maxMana": 3000, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 9.99, - "available": true - }, - { - "id": "Mana_Stream_Large_v1", - "name": "Mana See", - "nameEn": "Mana Lake", - "nameIt": "Mana Lago", - "price": 29.99, - "priceUnit": "/ Monat", - "initialMana": 3000, - "dailyMana": 100, - "maxMana": 6000, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": true - }, - { - "id": "Mana_Stream_Large_Yearly_v1", - "name": "Mana See", - "nameEn": "Mana Lake", - "nameIt": "Mana Lago", - "price": 239.99, - "priceUnit": "/ Jahr", - "priceBreakdown": "(entspricht 19,99€ / Monat, 33% Rabatt)", - "initialMana": 3000, - "dailyMana": 100, - "maxMana": 6000, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 19.99, - "available": true - }, - { - "id": "Mana_Stream_Giant_v1", - "name": "Mana Meer", - "nameEn": "Mana Ocean", - "nameIt": "Mana Mare", - "price": 49.99, - "priceUnit": "/ Monat", - "initialMana": 5000, - "dailyMana": 200, - "maxMana": 10000, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": true - }, - { - "id": "Mana_Stream_Giant_Yearly_v1", - "name": "Mana Meer", - "nameEn": "Mana Ocean", - "nameIt": "Mana Mare", - "price": 399.99, - "priceUnit": "/ Jahr", - "priceBreakdown": "(entspricht 33,33€ / Monat, 33% Rabatt)", - "initialMana": 5000, - "dailyMana": 200, - "maxMana": 10000, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 33.33, - "available": true - } - ], - "legacySubscriptions": [ - { - "id": "Mini_1m_v1", - "name": "Mini", - "nameEn": "Mini", - "nameIt": "Mini", - "price": 2.99, - "priceUnit": "/ Monat", - "initialMana": 600, - "dailyMana": 20, - "maxMana": 1200, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": false, - "isLegacy": true - }, - { - "id": "Plus_7E_1m_v1", - "name": "Plus", - "nameEn": "Plus", - "nameIt": "Plus", - "price": 7.99, - "priceUnit": "/ Monat", - "initialMana": 1500, - "dailyMana": 50, - "maxMana": 3000, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": false, - "isLegacy": true - }, - { - "id": "Pro_23E_1m_v1", - "name": "Pro", - "nameEn": "Pro", - "nameIt": "Pro", - "price": 23.99, - "priceUnit": "/ Monat", - "initialMana": 3000, - "dailyMana": 100, - "maxMana": 6000, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": false, - "isLegacy": true - }, - { - "id": "Ultra_47E_1m_v1", - "name": "Ultra", - "nameEn": "Ultra", - "nameIt": "Ultra", - "price": 47.99, - "priceUnit": "/ Monat", - "initialMana": 5000, - "dailyMana": 200, - "maxMana": 10000, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": false, - "isLegacy": true - }, - { - "id": "Mini_1y_v1", - "name": "Mini", - "nameEn": "Mini", - "nameIt": "Mini", - "price": 29.99, - "priceUnit": "/ Jahr", - "priceBreakdown": "(entspricht 2,50€ / Monat)", - "initialMana": 600, - "dailyMana": 20, - "maxMana": 1200, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 2.50, - "available": false, - "isLegacy": true - }, - { - "id": "Plus_70E_1y_v1", - "name": "Plus", - "nameEn": "Plus", - "nameIt": "Plus", - "price": 79.99, - "priceUnit": "/ Jahr", - "priceBreakdown": "(entspricht 6,67€ / Monat)", - "initialMana": 1500, - "dailyMana": 50, - "maxMana": 3000, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 6.67, - "available": false, - "isLegacy": true - }, - { - "id": "Pro_230E_1y_v1", - "name": "Pro", - "nameEn": "Pro", - "nameIt": "Pro", - "price": 239.99, - "priceUnit": "/ Jahr", - "priceBreakdown": "(entspricht 20,00€ / Monat)", - "initialMana": 3000, - "dailyMana": 100, - "maxMana": 6000, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 20.00, - "available": false, - "isLegacy": true - }, - { - "id": "Ultra_470E_1y_v1", - "name": "Ultra", - "nameEn": "Ultra", - "nameIt": "Ultra", - "price": 479.99, - "priceUnit": "/ Jahr", - "priceBreakdown": "(entspricht 40,00€ / Monat)", - "initialMana": 5000, - "dailyMana": 200, - "maxMana": 10000, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 40.00, - "available": false, - "isLegacy": true - }, - { - "id": "rc_plus_monthly_8e_play:plus-monthly-8e-autorenewing", - "name": "Plus (Android)", - "nameEn": "Plus (Android)", - "nameIt": "Plus (Android)", - "price": 7.99, - "priceUnit": "/ month", - "initialMana": 1500, - "dailyMana": 50, - "maxMana": 3000, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": false, - "isLegacy": true - }, - { - "id": "rc_pro_monthly_23e_play:rc-pro-monthly-8e-play-renewel", - "name": "Pro (Android)", - "nameEn": "Pro (Android)", - "nameIt": "Pro (Android)", - "price": 23.99, - "priceUnit": "/ month", - "initialMana": 3000, - "dailyMana": 100, - "maxMana": 6000, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": false, - "isLegacy": true - }, - { - "id": "rc_ultra_monthly_play:rc-ultra-monthly-play", - "name": "Ultra (Android)", - "nameEn": "Ultra (Android)", - "nameIt": "Ultra (Android)", - "price": 47.99, - "priceUnit": "/ month", - "initialMana": 5000, - "dailyMana": 200, - "maxMana": 10000, - "canGiftMana": true, - "popular": false, - "billingCycle": "monthly", - "available": false, - "isLegacy": true - }, - { - "id": "rc_plus_yearly_80e_play:rc-plus-yearly-80e-play-renewel", - "name": "Plus (Android)", - "nameEn": "Plus (Android)", - "nameIt": "Plus (Android)", - "price": 79.99, - "priceUnit": "/ year", - "priceBreakdown": "(equals 6.67€ / month)", - "initialMana": 1500, - "dailyMana": 50, - "maxMana": 3000, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 6.67, - "available": false, - "isLegacy": true - }, - { - "id": "rc_pro_yearly_229e_play:rc-pro-yearly-229e-play-renewel", - "name": "Pro (Android)", - "nameEn": "Pro (Android)", - "nameIt": "Pro (Android)", - "price": 239.99, - "priceUnit": "/ year", - "priceBreakdown": "(equals 20.00€ / month)", - "initialMana": 3000, - "dailyMana": 100, - "maxMana": 6000, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 20.00, - "available": false, - "isLegacy": true - }, - { - "id": "rc_ultra_yearly_play:rc-ultra-yearly-play", - "name": "Ultra (Android)", - "nameEn": "Ultra (Android)", - "nameIt": "Ultra (Android)", - "price": 479.99, - "priceUnit": "/ year", - "priceBreakdown": "(equals 40.00€ / month)", - "initialMana": 5000, - "dailyMana": 200, - "maxMana": 10000, - "canGiftMana": true, - "popular": false, - "billingCycle": "yearly", - "monthlyEquivalent": 40.00, - "available": false, - "isLegacy": true - } - ], - "packages": [ - { - "id": "Mana_Potion_Small_v1", - "name": "Kleiner Mana Trank", - "nameEn": "Small Mana Potion", - "nameIt": "Piccola Pozione di Mana", - "manaAmount": 350, - "price": 4.99, - "popular": false - }, - { - "id": "Mana_Potion_Medium_v1", - "name": "Mittlerer Mana Trank", - "nameEn": "Medium Mana Potion", - "nameIt": "Media Pozione di Mana", - "manaAmount": 700, - "price": 9.99, - "popular": false - }, - { - "id": "Mana_Potion_Large_v1", - "name": "Großer Mana Trank", - "nameEn": "Large Mana Potion", - "nameIt": "Grande Pozione di Mana", - "manaAmount": 1400, - "price": 19.99, - "popular": false - }, - { - "id": "Mana_Potion_Giant_v2", - "name": "Riesiger Mana Trank", - "nameEn": "Giant Mana Potion", - "nameIt": "Pozione di Mana Gigante", - "manaAmount": 2800, - "price": 39.99, - "popular": false - } - ] -} - diff --git a/apps/memoro/apps/landing/context/prompts/SORT-ORDER-IMPLEMENTATION.md b/apps/memoro/apps/landing/context/prompts/SORT-ORDER-IMPLEMENTATION.md deleted file mode 100644 index a20021a63..000000000 --- a/apps/memoro/apps/landing/context/prompts/SORT-ORDER-IMPLEMENTATION.md +++ /dev/null @@ -1,109 +0,0 @@ -# Sort Order Implementation für Blueprint Prompts - -## Übersicht -Diese Dokumentation beschreibt die Implementierung der `sort_order` Funktionalität für die Reihenfolge von Memories, die durch Blueprints generiert werden. - -## Problem -Die Memories wurden in zufälliger oder unerwünschter Reihenfolge angezeigt. Die Kurzzusammenfassung erschien als letztes, obwohl sie als Übersicht an erster Stelle stehen sollte. - -## Lösung -Hinzufügen einer `sort_order` Spalte zur `prompt_blueprints` Tabelle, die explizit die Anzeigereihenfolge der generierten Memories steuert. - -## Technische Details - -### Neue Spalte -```sql -ALTER TABLE prompt_blueprints -ADD COLUMN sort_order INTEGER DEFAULT 999; -``` - -- **Typ**: INTEGER -- **Default**: 999 (für nicht explizit sortierte Einträge) -- **Logik**: Niedrigere Zahlen werden zuerst angezeigt - -### Standard Blueprint Sortierung - -| Position | Memory Typ | sort_order | Begründung | -|----------|------------|------------|------------| -| 1 | Kurzzusammenfassung | 1 | Schneller Überblick für den Nutzer | -| 2 | Aufgaben | 2 | Konkrete Action Items | -| 3 | Ausführliche Zusammenfassung | 3 | Detaillierte Informationen bei Bedarf | - -## Backend Implementierung - -### Query für Memory-Generierung -```sql -SELECT pb.prompt_id, p.prompt_text, p.memory_title -FROM prompt_blueprints pb -JOIN prompts p ON pb.prompt_id = p.id -WHERE pb.blueprint_id = $1 -ORDER BY pb.sort_order ASC; -``` - -### Edge Function Anpassung -Die Edge Functions müssen die Memories in der durch `sort_order` definierten Reihenfolge zurückgeben: - -```javascript -// In der blueprint Edge Function -const promptsQuery = await supabaseClient - .from('prompt_blueprints') - .select(` - prompt_id, - sort_order, - prompts!inner( - id, - prompt_text, - memory_title - ) - `) - .eq('blueprint_id', blueprintId) - .order('sort_order', { ascending: true }); -``` - -## Frontend Implementierung - -### Memory Display Component -```typescript -// Die Memories sollten bereits in der richtigen Reihenfolge vom Backend kommen -// Falls nicht, kann im Frontend nachsortiert werden: - -const sortedMemories = memories.sort((a, b) => { - // Nutze sort_order falls vorhanden - if (a.sort_order && b.sort_order) { - return a.sort_order - b.sort_order; - } - // Fallback auf created_at - return new Date(a.created_at) - new Date(b.created_at); -}); -``` - -## Migration für bestehende Daten - -Alle bestehenden Blueprint-Prompt Verknüpfungen erhalten automatisch `sort_order = 999`. Die wichtigsten Blueprints wurden explizit gesetzt: - -- **Standard-Analyse**: Sortierung 1-2-3 -- **Meeting-Analyse**: Sortierung 1-2-3 -- **Feedback**: Sortierung 1-2-3 - -## Vorteile dieser Lösung - -1. **Explizite Kontrolle**: Vollständige Kontrolle über die Anzeigereihenfolge -2. **Flexibilität**: Jeder Blueprint kann seine eigene Sortierung haben -3. **Erweiterbarkeit**: Neue Prompts können einfach eingeordnet werden -4. **Performance**: Index auf (blueprint_id, sort_order) für schnelle Queries -5. **Rückwärtskompatibilität**: Default-Wert 999 für nicht explizit sortierte Einträge - -## Testing - -Nach der Migration sollte getestet werden: - -1. ✅ Neue Memo-Aufnahme mit Standard Blueprint erstellen -2. ✅ Überprüfen ob Kurzzusammenfassung oben erscheint -3. ✅ Überprüfen ob Reihenfolge konsistent bleibt -4. ✅ Andere Blueprints testen (Meeting, Feedback) - -## Zukünftige Erweiterungen - -- UI für Blueprint-Editor könnte Drag & Drop für Sortierung bieten -- Nutzer-spezifische Sortierung pro Blueprint möglich -- Conditional Sorting basierend auf Memo-Typ oder -Länge \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/prompts/aufgaben-prompt.md b/apps/memoro/apps/landing/context/prompts/aufgaben-prompt.md deleted file mode 100644 index 2ccd2a893..000000000 --- a/apps/memoro/apps/landing/context/prompts/aufgaben-prompt.md +++ /dev/null @@ -1,20 +0,0 @@ -# Aufgaben & Termine Prompt - -## Prompt ID -`7a6cac9a-5a34-4fe5-a8f6-23f8165b0e48` - -## Prompt Text (direkt für Supabase kopierbar) -```json -{"de": "Bitte lies das folgende Transkript durch und extrahiere: 1) AUFGABEN: Alle erwähnten Aufgaben, Aktionspunkte und nächsten Schritte. 2) TERMINE: Alle genannten Termine, Meetings, Deadlines und zeitlichen Vereinbarungen. Ordne beide Kategorien nach Dringlichkeit (hoch/mittel/niedrig). Erfasse für Aufgaben: Beschreibung, verantwortliche Person (falls genannt), Deadline, Kontext und erwartete Ergebnisse. Erfasse für Termine: Datum/Uhrzeit, Art des Termins, Teilnehmer (falls genannt), Ort/Format (falls erwähnt) und Zweck. Markiere unklare Punkte mit [UNKLAR]. Verwende eine strukturierte Listenform ohne zusätzliche Kommentare. Hier das Transkript:", "en": "Please read through the following transcript and extract: 1) TASKS: All mentioned tasks, action items, and next steps. 2) APPOINTMENTS: All mentioned appointments, meetings, deadlines and time agreements. Order both categories by urgency (high/medium/low). For tasks capture: description, responsible person (if mentioned), deadline, context and expected results. For appointments capture: date/time, type of appointment, participants (if mentioned), location/format (if mentioned) and purpose. Mark unclear points with [UNCLEAR]. Use a structured list format without additional comments. Here is the transcript:", "it": "Per favore leggi la seguente trascrizione ed estrai: 1) COMPITI: Tutti i compiti menzionati, punti d'azione e prossimi passi. 2) APPUNTAMENTI: Tutti gli appuntamenti menzionati, riunioni, scadenze e accordi temporali. Ordina entrambe le categorie per urgenza (alta/media/bassa). Per i compiti cattura: descrizione, persona responsabile (se menzionata), scadenza, contesto e risultati attesi. Per gli appuntamenti cattura: data/ora, tipo di appuntamento, partecipanti (se menzionati), luogo/formato (se menzionato) e scopo. Contrassegna i punti poco chiari con [NON CHIARO]. Usa un formato di lista strutturato senza commenti aggiuntivi. Ecco la trascrizione:", "fr": "Veuillez lire la transcription suivante et extraire : 1) TÂCHES : Toutes les tâches mentionnées, points d'action et prochaines étapes. 2) RENDEZ-VOUS : Tous les rendez-vous mentionnés, réunions, échéances et accords temporels. Classez les deux catégories par urgence (élevée/moyenne/faible). Pour les tâches, capturez : description, personne responsable (si mentionnée), échéance, contexte et résultats attendus. Pour les rendez-vous, capturez : date/heure, type de rendez-vous, participants (si mentionnés), lieu/format (si mentionné) et objectif. Marquez les points peu clairs avec [PEU CLAIR]. Utilisez un format de liste structuré sans commentaires supplémentaires. Voici la transcription :", "es": "Por favor, lee la siguiente transcripción y extrae: 1) TAREAS: Todas las tareas mencionadas, puntos de acción y próximos pasos. 2) CITAS: Todas las citas mencionadas, reuniones, plazos y acuerdos temporales. Ordena ambas categorías por urgencia (alta/media/baja). Para las tareas captura: descripción, persona responsable (si se menciona), fecha límite, contexto y resultados esperados. Para las citas captura: fecha/hora, tipo de cita, participantes (si se mencionan), lugar/formato (si se menciona) y propósito. Marca los puntos poco claros con [POCO CLARO]. Usa un formato de lista estructurado sin comentarios adicionales. Aquí está la transcripción:"} -``` - -## Memory Title (direkt für Supabase kopierbar) -```json -{"de": "Aufgaben & Termine", "en": "Tasks & Appointments", "it": "Compiti e Appuntamenti", "fr": "Tâches et Rendez-vous", "es": "Tareas y Citas"} -``` - -## Description (direkt für Supabase kopierbar) -```json -{"de": "Extrahiert alle im Gespräch erwähnten Aufgaben, Aktionspunkte, nächsten Schritte sowie Termine, Meetings und zeitliche Vereinbarungen. Erfasst Details wie Kontext, Verantwortlichkeiten, Deadlines und Teilnehmer.", "en": "Extracts all tasks, action items, next steps as well as appointments, meetings and time agreements mentioned in the conversation. Captures details such as context, responsibilities, deadlines and participants.", "it": "Estrae tutti i compiti, punti d'azione, prossimi passi così come appuntamenti, riunioni e accordi temporali menzionati nella conversazione. Cattura dettagli come contesto, responsabilità, scadenze e partecipanti.", "fr": "Extrait toutes les tâches, points d'action, prochaines étapes ainsi que les rendez-vous, réunions et accords temporels mentionnés dans la conversation. Capture des détails tels que le contexte, les responsabilités, les échéances et les participants.", "es": "Extrae todas las tareas, puntos de acción, próximos pasos, así como citas, reuniones y acuerdos temporales mencionados en la conversación. Captura detalles como contexto, responsabilidades, plazos y participantes."} -``` - diff --git a/apps/memoro/apps/landing/context/prompts/ausfuehrliche-zusammenfassung-prompt.md b/apps/memoro/apps/landing/context/prompts/ausfuehrliche-zusammenfassung-prompt.md deleted file mode 100644 index b9ad22f54..000000000 --- a/apps/memoro/apps/landing/context/prompts/ausfuehrliche-zusammenfassung-prompt.md +++ /dev/null @@ -1,19 +0,0 @@ -# Ausführliche Zusammenfassung Prompt - -## Prompt ID -`4370cb68-d676-4b93-8afd-2fb7c4ad78c4` - -## Prompt Text (direkt für Supabase kopierbar) -```json -{"de": "Erstelle eine ausführliche Zusammenfassung des folgenden Transkripts (ca. 30-50% der Originallänge). Strukturiere die Zusammenfassung wie folgt: 1. Überblick (Kernthema in 2-3 Sätzen), 2. Hauptthemen (die wichtigsten diskutierten Punkte), 3. Details (vorgebrachte Argumente und relevante Beispiele), 4. Fazit (zentrale Erkenntnisse). Verzichte auf zusätzliche Kommentare und fokussiere dich auf die reine Inhaltswiedergabe. Hier das Transkript:", "en": "Create a detailed summary of the following transcript (approx. 30-50% of the original length). Structure the summary as follows: 1. Overview (core topic in 2-3 sentences), 2. Main topics (the most important points discussed), 3. Details (arguments presented and relevant examples), 4. Conclusion (key insights). Avoid additional comments and focus on pure content reproduction. Here is the transcript:", "it": "Crea un riassunto dettagliato della seguente trascrizione (circa 30-50% della lunghezza originale). Struttura il riassunto come segue: 1. Panoramica (tema centrale in 2-3 frasi), 2. Temi principali (i punti più importanti discussi), 3. Dettagli (argomenti presentati ed esempi rilevanti), 4. Conclusione (intuizioni chiave). Evita commenti aggiuntivi e concentrati sulla pura riproduzione del contenuto. Ecco la trascrizione:", "fr": "Créez un résumé détaillé de la transcription suivante (environ 30-50% de la longueur originale). Structurez le résumé comme suit : 1. Aperçu (thème central en 2-3 phrases), 2. Thèmes principaux (les points les plus importants discutés), 3. Détails (arguments présentés et exemples pertinents), 4. Conclusion (idées clés). Évitez les commentaires supplémentaires et concentrez-vous sur la pure reproduction du contenu. Voici la transcription :", "es": "Crea un resumen detallado de la siguiente transcripción (aprox. 30-50% de la longitud original). Estructura el resumen de la siguiente manera: 1. Visión general (tema central en 2-3 oraciones), 2. Temas principales (los puntos más importantes discutidos), 3. Detalles (argumentos presentados y ejemplos relevantes), 4. Conclusión (ideas clave). Evita comentarios adicionales y concéntrate en la pura reproducción del contenido. Aquí está la transcripción:"} -``` - -## Memory Title (direkt für Supabase kopierbar) -```json -{"de": "Ausführliche Zusammenfassung", "en": "Detailed Summary", "it": "Riassunto Dettagliato", "fr": "Résumé Détaillé", "es": "Resumen Detallado"} -``` - -## Description (direkt für Supabase kopierbar) -```json -{"de": "Gibt eine detailliertere Wiedergabe der Inhalte, inklusive wichtiger Argumente, Beispiele und Kontextinformationen. Geeignet für ein tiefergehendes Verständnis ohne das gesamte Transkript lesen zu müssen.", "en": "Provides a more detailed reproduction of the content, including important arguments, examples and contextual information. Suitable for a deeper understanding without having to read the entire transcript.", "it": "Fornisce una riproduzione più dettagliata del contenuto, inclusi argomenti importanti, esempi e informazioni contestuali. Adatto per una comprensione più profonda senza dover leggere l'intera trascrizione.", "fr": "Fournit une reproduction plus détaillée du contenu, incluant des arguments importants, des exemples et des informations contextuelles. Convient pour une compréhension approfondie sans avoir à lire l'intégralité de la transcription.", "es": "Proporciona una reproducción más detallada del contenido, incluyendo argumentos importantes, ejemplos e información contextual. Adecuado para una comprensión más profunda sin tener que leer toda la transcripción."} -``` \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/prompts/beantwortete-fragen-prompt.md b/apps/memoro/apps/landing/context/prompts/beantwortete-fragen-prompt.md deleted file mode 100644 index f52f90f60..000000000 --- a/apps/memoro/apps/landing/context/prompts/beantwortete-fragen-prompt.md +++ /dev/null @@ -1,19 +0,0 @@ -# Beantwortete Fragen & Antworten Prompt - -## Prompt ID -`47ce3340-e8c6-437c-928d-854c55589491` - -## Prompt Text (direkt für Supabase kopierbar) -```json -{"de": "Identifiziere alle Fragen aus dem folgenden Transkript, die gestellt und beantwortet wurden. Verwende folgendes nummeriertes Format: 1. FRAGE: [Originalfrage mit relevantem Kontext] ANTWORT: [Vollständige Antwort] STATUS: [Direkt beantwortet/Indirekt beantwortet/Teilweise beantwortet]. Gib bei jeder Frage-Antwort-Kombination den relevanten Kontext mit an. Verzichte auf zusätzliche Kommentare. Hier das Transkript:", "en": "Identify all questions from the following transcript that were asked and answered. Use the following numbered format: 1. QUESTION: [Original question with relevant context] ANSWER: [Complete answer] STATUS: [Directly answered/Indirectly answered/Partially answered]. Include relevant context for each question-answer combination. Avoid additional comments. Here is the transcript:", "it": "Identifica tutte le domande dalla seguente trascrizione che sono state poste e hanno ricevuto risposta. Usa il seguente formato numerato: 1. DOMANDA: [Domanda originale con contesto rilevante] RISPOSTA: [Risposta completa] STATO: [Risposta diretta/Risposta indiretta/Risposta parziale]. Includi il contesto rilevante per ogni combinazione domanda-risposta. Evita commenti aggiuntivi. Ecco la trascrizione:", "fr": "Identifiez toutes les questions de la transcription suivante qui ont été posées et ont reçu une réponse. Utilisez le format numéroté suivant : 1. QUESTION : [Question originale avec contexte pertinent] RÉPONSE : [Réponse complète] STATUT : [Réponse directe/Réponse indirecte/Réponse partielle]. Incluez le contexte pertinent pour chaque combinaison question-réponse. Évitez les commentaires supplémentaires. Voici la transcription :", "es": "Identifica todas las preguntas de la siguiente transcripción que fueron formuladas y respondidas. Usa el siguiente formato numerado: 1. PREGUNTA: [Pregunta original con contexto relevante] RESPUESTA: [Respuesta completa] ESTADO: [Respuesta directa/Respuesta indirecta/Respuesta parcial]. Incluye el contexto relevante para cada combinación pregunta-respuesta. Evita comentarios adicionales. Aquí está la transcripción:"} -``` - -## Memory Title (direkt für Supabase kopierbar) -```json -{"de": "Beantwortete Fragen & Antworten", "en": "Answered Questions & Answers", "it": "Domande e Risposte", "fr": "Questions et Réponses", "es": "Preguntas y Respuestas"} -``` - -## Description (direkt für Supabase kopierbar) -```json -{"de": "Extrahiert Fragen, die im Transkript gestellt und beantwortet wurden, und listet sie zusammen mit ihren jeweiligen Antworten auf.", "en": "Extracts questions that were asked and answered in the transcript, and lists them together with their respective answers.", "it": "Estrae le domande che sono state poste e hanno ricevuto risposta nella trascrizione, e le elenca insieme alle rispettive risposte.", "fr": "Extrait les questions qui ont été posées et ont reçu une réponse dans la transcription, et les liste avec leurs réponses respectives.", "es": "Extrae las preguntas que fueron formuladas y respondidas en la transcripción, y las enumera junto con sus respectivas respuestas."} -``` \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/prompts/blogbeitrag-prompt.md b/apps/memoro/apps/landing/context/prompts/blogbeitrag-prompt.md deleted file mode 100644 index a90a5b3f4..000000000 --- a/apps/memoro/apps/landing/context/prompts/blogbeitrag-prompt.md +++ /dev/null @@ -1,19 +0,0 @@ -# Blogbeitrag Prompt - -## Prompt ID -`2c6a6e47-1d0c-441f-9449-b5d908bffba2` - -## Prompt Text (direkt für Supabase kopierbar) -```json -{"de": "Verwandle das folgende Transkript in einen gut strukturierten Blogbeitrag (800-1200 Wörter) für eine professionelle Zielgruppe. Der Beitrag sollte die Hauptthemen und wichtigsten Erkenntnisse detailliert behandeln. Formuliere eine SEO-optimierte Hauptüberschrift, verwende aussagekräftige Zwischenüberschriften zur Gliederung, schreibe eine einleitende Zusammenfassung (2-3 Sätze) sowie einen Schlussteil mit konkretem Handlungsaufruf. Integriere relevante Keywords natürlich im Text. Der Stil sollte informativ, lesefreundlich und ohne zusätzliche Kommentare sein. Hier das Transkript:", "en": "Transform the following transcript into a well-structured blog post (800-1200 words) for a professional audience. The post should cover the main topics and key insights in detail. Formulate an SEO-optimized main heading, use meaningful subheadings for structure, write an introductory summary (2-3 sentences) as well as a conclusion with a concrete call to action. Integrate relevant keywords naturally in the text. The style should be informative, reader-friendly and without additional comments. Here is the transcript:", "it": "Trasforma la seguente trascrizione in un post di blog ben strutturato (800-1200 parole) per un pubblico professionale. Il post dovrebbe coprire in dettaglio i temi principali e le intuizioni chiave. Formula un titolo principale ottimizzato per SEO, usa sottotitoli significativi per la struttura, scrivi un riassunto introduttivo (2-3 frasi) e una conclusione con un chiaro invito all'azione. Integra naturalmente le parole chiave rilevanti nel testo. Lo stile dovrebbe essere informativo, di facile lettura e senza commenti aggiuntivi. Ecco la trascrizione:", "fr": "Transformez la transcription suivante en un article de blog bien structuré (800-1200 mots) pour un public professionnel. L'article devrait couvrir en détail les thèmes principaux et les idées clés. Formulez un titre principal optimisé pour le SEO, utilisez des sous-titres significatifs pour la structure, écrivez un résumé introductif (2-3 phrases) ainsi qu'une conclusion avec un appel à l'action concret. Intégrez naturellement les mots-clés pertinents dans le texte. Le style doit être informatif, facile à lire et sans commentaires supplémentaires. Voici la transcription :", "es": "Transforma la siguiente transcripción en una publicación de blog bien estructurada (800-1200 palabras) para una audiencia profesional. La publicación debe cubrir en detalle los temas principales y las ideas clave. Formula un título principal optimizado para SEO, usa subtítulos significativos para la estructura, escribe un resumen introductorio (2-3 oraciones) así como una conclusión con una llamada a la acción concreta. Integra naturalmente las palabras clave relevantes en el texto. El estilo debe ser informativo, fácil de leer y sin comentarios adicionales. Aquí está la transcripción:"} -``` - -## Memory Title (direkt für Supabase kopierbar) -```json -{"de": "Blogbeitrag", "en": "Blog Post", "it": "Post del Blog", "fr": "Article de Blog", "es": "Publicación de Blog"} -``` - -## Description (direkt für Supabase kopierbar) -```json -{"de": "Erstellt einen ausführlichen Blogartikel basierend auf den Inhalten des Transkripts. Der Artikel soll gut strukturiert sein, eine einleitende Überschrift, Zwischenüberschriften und einen abschliessenden Absatz enthalten.", "en": "Creates a detailed blog article based on the contents of the transcript. The article should be well structured, with an introductory heading, subheadings and a concluding paragraph.", "it": "Crea un articolo di blog dettagliato basato sui contenuti della trascrizione. L'articolo dovrebbe essere ben strutturato, con un titolo introduttivo, sottotitoli e un paragrafo conclusivo.", "fr": "Crée un article de blog détaillé basé sur le contenu de la transcription. L'article doit être bien structuré, avec un titre introductif, des sous-titres et un paragraphe de conclusion.", "es": "Crea un artículo de blog detallado basado en el contenido de la transcripción. El artículo debe estar bien estructurado, con un título introductorio, subtítulos y un párrafo de conclusión."} -``` \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/prompts/edge-functions-sort-order-update.md b/apps/memoro/apps/landing/context/prompts/edge-functions-sort-order-update.md deleted file mode 100644 index c3661f279..000000000 --- a/apps/memoro/apps/landing/context/prompts/edge-functions-sort-order-update.md +++ /dev/null @@ -1,149 +0,0 @@ -# Edge Functions Update für sort_order - -## Betroffene Edge Functions: - -Die folgenden Edge Functions müssen angepasst werden, um die `sort_order` aus der `prompt_blueprints` Tabelle an die neu erstellten Memories zu übergeben: - -### 1. `/supabase/functions/blueprint/index.ts` - -**Aktuelle Implementation (ca. Zeile 410):** -```typescript -const { data: newMemory, error: newMemoryError } = await memoro_sb.from('memories').insert({ - memo_id: memo_id, - title: memoryTitle || 'Blueprint-Antwort', - content: answer, - metadata: { ... } -}).select().single(); -``` - -**Neue Implementation:** -```typescript -// Zuerst die sort_order aus prompt_blueprints holen -const { data: promptBlueprint } = await memoro_sb - .from('prompt_blueprints') - .select('sort_order') - .eq('blueprint_id', blueprint_id) - .eq('prompt_id', prompt.id) - .single(); - -const { data: newMemory, error: newMemoryError } = await memoro_sb.from('memories').insert({ - memo_id: memo_id, - title: memoryTitle || 'Blueprint-Antwort', - content: answer, - sort_order: promptBlueprint?.sort_order || 999, // Neue Zeile! - metadata: { ... } -}).select().single(); -``` - -### 2. `/supabase/functions/auto-blueprint/index.ts` - -**Ähnliche Anpassung bei Zeile 479:** -```typescript -const { data: newMemory, error: newMemoryError } = await memoro_sb.from('memories').insert({ - memo_id: memo_id, - title: memoryTitle || 'Auto-Blueprint-Antwort', - content: answer, - sort_order: promptBlueprint?.sort_order || 999, // Neue Zeile! - metadata: { ... } -}).select().single(); -``` - -### 3. Andere Edge Functions (ohne Blueprint) - -Für Edge Functions die Memories ohne Blueprint erstellen, sollte ein sinnvoller Default-Wert gesetzt werden: - -#### `/supabase/functions/create-memory/index.ts` -```typescript -const { data: newMemory, error: newMemoryError } = await memoro_sb.from('memories').insert({ - memo_id: memo_id, - title: memoryTitle || 'Memory', - content: answer, - sort_order: 100, // Default für manuelle Memories - metadata: { ... } -}).select().single(); -``` - -#### `/supabase/functions/question-memo/index.ts` -```typescript -const { data: newMemory, error: newMemoryError } = await memoro_sb.from('memories').insert({ - memo_id: memo_id, - title: `Frage: ${question.substring(0, 50)}...`, - content: answer, - sort_order: 200, // Fragen erscheinen nach Blueprint-Memories - metadata: { ... } -}).select().single(); -``` - -#### `/supabase/functions/combine-memos/index.ts` -```typescript -const { error: memoryError } = await memoro_sb - .from('memories') - .insert({ - ...memoryData, - sort_order: 300 // Kombinierte Memos erscheinen am Ende - }); -``` - -#### `/supabase/functions/translate/index.ts` -```typescript -const { error: memoryCreateError } = await memoro_sb.from('memories').insert({ - memo_id: newMemoId, - title: translatedTitle, - content: translatedContent, - sort_order: memory.sort_order || 999, // Behalte sort_order vom Original - metadata: { ... } -}); -``` - -## Optimierte Blueprint Function Implementation - -Für bessere Performance sollten die Prompts mit ihrer sort_order gleich am Anfang geladen werden: - -```typescript -// In blueprint/index.ts und auto-blueprint/index.ts - -// Lade alle Prompts mit sort_order für diesen Blueprint -const { data: blueprintPrompts, error: blueprintPromptsError } = await memoro_sb - .from('prompt_blueprints') - .select(` - prompt_id, - sort_order, - prompts!inner( - id, - prompt_text, - memory_title - ) - `) - .eq('blueprint_id', blueprint_id) - .order('sort_order', { ascending: true }); - -// Dann beim Erstellen der Memories: -for (const blueprintPrompt of blueprintPrompts) { - // ... AI Processing ... - - const { data: newMemory, error: newMemoryError } = await memoro_sb.from('memories').insert({ - memo_id: memo_id, - title: memoryTitle, - content: answer, - sort_order: blueprintPrompt.sort_order, - metadata: { ... } - }).select().single(); -} -``` - -## Sort Order Konvention: - -| Bereich | sort_order | Verwendung | -|---------|------------|------------| -| 1-99 | Blueprint Memories | Hauptanalysen (Zusammenfassung, Aufgaben, etc.) | -| 100-199 | Manuelle Memories | Vom Nutzer erstellte Memories | -| 200-299 | Frage-Antwort | Memories aus Fragen an Memos | -| 300-399 | Kombinierte Memos | Aus mehreren Memos generiert | -| 999 | Default | Fallback für nicht kategorisierte Memories | - -## Testing nach Implementation: - -1. Neue Aufnahme mit Standard Blueprint erstellen -2. Prüfen ob Memories in richtiger Reihenfolge erscheinen -3. Manuelle Memory hinzufügen - sollte nach Blueprint-Memories erscheinen -4. Frage an Memo stellen - sollte nach manuellen Memories erscheinen \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/prompts/frontend-memory-sorting-patches.md b/apps/memoro/apps/landing/context/prompts/frontend-memory-sorting-patches.md deleted file mode 100644 index 4fe075f30..000000000 --- a/apps/memoro/apps/landing/context/prompts/frontend-memory-sorting-patches.md +++ /dev/null @@ -1,133 +0,0 @@ -# Frontend Patches für Memory Sorting - -## Dateien die angepasst werden müssen: - -### 1. `/features/memos/hooks/useMemoState.ts` - -**Aktuelle Zeile 281:** -```typescript -.order('created_at', { ascending: false }) -``` - -**Ändern zu:** -```typescript -.order('sort_order', { ascending: true }) -.order('created_at', { ascending: false }) -``` - -### 2. `/features/memos/hooks/useOptimizedMemoData.ts` - -**Aktuelle Zeile 95:** -```typescript -.order('created_at', { ascending: false }) -``` - -**Ändern zu:** -```typescript -.order('sort_order', { ascending: true }) -.order('created_at', { ascending: false }) -``` - -### 3. `/app/(protected)/(memo)/actions/memoActions.ts` - -**Aktuelle Zeile 468:** -```typescript -.eq('memo_id', memoId) -.order('created_at', { ascending: false }); -``` - -**Ändern zu:** -```typescript -.eq('memo_id', memoId) -.order('sort_order', { ascending: true }) -.order('created_at', { ascending: false }); -``` - -### 4. `/app/(protected)/memories.tsx` - -**Aktuelle Zeile 157:** -```typescript -.order('created_at', { ascending: false }); -``` - -**Ändern zu:** -```typescript -.order('sort_order', { ascending: true }) -.order('created_at', { ascending: false }); -``` - -### 5. `/app/(protected)/(tabs)/index.tsx` - -**Aktuelle Zeile 999:** -```typescript -.eq('memo_id', memo.id) -.order('created_at', { ascending: false }); -``` - -**Ändern zu:** -```typescript -.eq('memo_id', memo.id) -.order('sort_order', { ascending: true }) -.order('created_at', { ascending: false }); -``` - -### 6. `/app/(protected)/(tabs)/memos.tsx` - -**Aktuelle Zeile 603:** -```typescript -.eq('memo_id', memo.id) -.order('created_at', { ascending: false }); -``` - -**Ändern zu:** -```typescript -.eq('memo_id', memo.id) -.order('sort_order', { ascending: true }) -.order('created_at', { ascending: false }); -``` - -### 7. `/components/molecules/MemoList.tsx` - -**Aktuelle Zeile 550:** -```typescript -.eq('memo_id', memo.id) -.order('created_at', { ascending: false }); -``` - -**Ändern zu:** -```typescript -.eq('memo_id', memo.id) -.order('sort_order', { ascending: true }) -.order('created_at', { ascending: false }); -``` - -### 8. `/components/molecules/MemoPreview.tsx` - -**Aktuelle Zeile 306:** -```typescript -.eq('memo_id', memo.id) -.order('created_at', { ascending: false }); -``` - -**Ändern zu:** -```typescript -.eq('memo_id', memo.id) -.order('sort_order', { ascending: true }) -.order('created_at', { ascending: false }); -``` - -## Erklärung der Änderung: - -Die doppelte Sortierung funktioniert so: -1. **Primär nach `sort_order` (aufsteigend)**: Memories mit niedrigerer sort_order erscheinen zuerst -2. **Sekundär nach `created_at` (absteigend)**: Falls mehrere Memories die gleiche sort_order haben (z.B. 999 für alte/manuelle Memories), werden sie nach Erstellungsdatum sortiert - -## Testing: - -Nach den Änderungen sollte getestet werden: -1. ✅ Neue Memo-Aufnahme mit Standard Blueprint -2. ✅ Überprüfen ob Reihenfolge stimmt: - - Kurzzusammenfassung (sort_order: 1) - OBEN - - Aufgaben (sort_order: 2) - MITTE - - Ausführliche Zusammenfassung (sort_order: 3) - UNTEN -3. ✅ Alte Memories ohne sort_order sollten weiterhin funktionieren \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/prompts/gesammelte-ideen-prompt.md b/apps/memoro/apps/landing/context/prompts/gesammelte-ideen-prompt.md deleted file mode 100644 index 84a200ffa..000000000 --- a/apps/memoro/apps/landing/context/prompts/gesammelte-ideen-prompt.md +++ /dev/null @@ -1,19 +0,0 @@ -# Gesammelte Ideen & Vorschläge Prompt - -## Prompt ID -`8cdc89a5-2f76-4d50-a93d-0c177c3e73ab` - -## Prompt Text (direkt für Supabase kopierbar) -```json -{"de": "Sammle alle im folgenden Transkript geäusserten neuen Ideen, kreativen Vorschläge oder Brainstorming-Punkte. Gruppiere sie nach Themenbereichen und markiere besonders innovative Ideen mit ⭐. Kategorisiere jede Idee nach Umsetzbarkeit: [KURZFRISTIG] (innerhalb 1 Monat), [MITTELFRISTIG] (1-6 Monate), [LANGFRISTIG] (über 6 Monate). Liste sie übersichtlich ohne zusätzliche Kommentare auf. Hier das Transkript:", "en": "Collect all new ideas, creative suggestions, or brainstorming points expressed in the following transcript. Group them by topic areas and mark particularly innovative ideas with ⭐. Categorize each idea by feasibility: [SHORT-TERM] (within 1 month), [MEDIUM-TERM] (1-6 months), [LONG-TERM] (over 6 months). List them clearly without additional comments. Here is the transcript:", "it": "Raccogli tutte le nuove idee, suggerimenti creativi o punti di brainstorming espressi nella seguente trascrizione. Raggruppali per aree tematiche e contrassegna le idee particolarmente innovative con ⭐. Categorizza ogni idea per fattibilità: [BREVE TERMINE] (entro 1 mese), [MEDIO TERMINE] (1-6 mesi), [LUNGO TERMINE] (oltre 6 mesi). Elencali chiaramente senza commenti aggiuntivi. Ecco la trascrizione:", "fr": "Collectez toutes les nouvelles idées, suggestions créatives ou points de brainstorming exprimés dans la transcription suivante. Regroupez-les par domaines thématiques et marquez les idées particulièrement innovantes avec ⭐. Catégorisez chaque idée selon sa faisabilité : [COURT TERME] (dans 1 mois), [MOYEN TERME] (1-6 mois), [LONG TERME] (plus de 6 mois). Listez-les clairement sans commentaires supplémentaires. Voici la transcription :", "es": "Recopila todas las nuevas ideas, sugerencias creativas o puntos de lluvia de ideas expresados en la siguiente transcripción. Agrúpalas por áreas temáticas y marca las ideas particularmente innovadoras con ⭐. Categoriza cada idea por viabilidad: [CORTO PLAZO] (dentro de 1 mes), [MEDIO PLAZO] (1-6 meses), [LARGO PLAZO] (más de 6 meses). Listálas claramente sin comentarios adicionales. Aquí está la transcripción:"} -``` - -## Memory Title (direkt für Supabase kopierbar) -```json -{"de": "Gesammelte Ideen & Vorschläge", "en": "Collected Ideas & Suggestions", "it": "Idee e Suggerimenti Raccolti", "fr": "Idées et Suggestions Collectées", "es": "Ideas y Sugerencias Recopiladas"} -``` - -## Description (direkt für Supabase kopierbar) -```json -{"de": "Listet alle im Gespräch geäusserten neuen Ideen, Brainstorming-Punkte oder konkreten Vorschläge auf.", "en": "Lists all new ideas, brainstorming points or concrete suggestions expressed in the conversation.", "it": "Elenca tutte le nuove idee, punti di brainstorming o suggerimenti concreti espressi nella conversazione.", "fr": "Liste toutes les nouvelles idées, points de brainstorming ou suggestions concrètes exprimés dans la conversation.", "es": "Enumera todas las nuevas ideas, puntos de lluvia de ideas o sugerencias concretas expresadas en la conversación."} -``` \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/prompts/kurzzusammenfassung-prompt.md b/apps/memoro/apps/landing/context/prompts/kurzzusammenfassung-prompt.md deleted file mode 100644 index b81a14860..000000000 --- a/apps/memoro/apps/landing/context/prompts/kurzzusammenfassung-prompt.md +++ /dev/null @@ -1,19 +0,0 @@ -# Kurzzusammenfassung Prompt - -## Prompt ID -`c4009bef-4504-4af7-86f5-f896a2412a0a` - -## Prompt Text (direkt für Supabase kopierbar) -```json -{"de": "Erstelle ein TLDR (Too Long; Didn't Read) des folgenden Transkripts. Fasse die maximal 3 wichtigsten handlungsrelevanten Kernaussagen in insgesamt 3-5 Sätzen zusammen. Fokussiere ausschließlich auf die absoluten Hauptpunkte, die für Entscheidungen oder nächste Schritte relevant sind. Verzichte auf zusätzliche Kommentare. Hier das Transkript:", "en": "Create a TLDR (Too Long; Didn't Read) of the following transcript. Summarize the maximum 3 most important action-relevant key messages in a total of 3-5 sentences. Focus exclusively on the absolute main points that are relevant for decisions or next steps. Avoid additional comments. Here is the transcript:", "it": "Crea un TLDR (Troppo Lungo; Non L'ho Letto) della seguente trascrizione. Riassumi i massimo 3 messaggi chiave più importanti rilevanti per l'azione in totale 3-5 frasi. Concentrati esclusivamente sui punti principali assoluti che sono rilevanti per decisioni o passi successivi. Evita commenti aggiuntivi. Ecco la trascrizione:", "fr": "Créez un TLDR (Trop Long ; Pas Lu) de la transcription suivante. Résumez les 3 messages clés maximum les plus importants et pertinents pour l'action en 3-5 phrases au total. Concentrez-vous exclusivement sur les points principaux absolus qui sont pertinents pour les décisions ou les prochaines étapes. Évitez les commentaires supplémentaires. Voici la transcription :", "es": "Crea un TLDR (Demasiado Largo; No Lo Leí) de la siguiente transcripción. Resume los máximo 3 mensajes clave más importantes y relevantes para la acción en un total de 3-5 oraciones. Concéntrate exclusivamente en los puntos principales absolutos que son relevantes para decisiones o próximos pasos. Evita comentarios adicionales. Aquí está la transcripción:"} -``` - -## Memory Title (direkt für Supabase kopierbar) -```json -{"de": "Kurzzusammenfassung", "en": "Executive Summary", "it": "Riassunto Esecutivo", "fr": "Résumé Exécutif", "es": "Resumen Ejecutivo"} -``` - -## Description (direkt für Supabase kopierbar) -```json -{"de": "Erstellt eine knappe Übersicht der wichtigsten Inhalte und Kernaussagen des Gesprächs oder Vortrags. Ideal für einen schnellen Überblick.", "en": "Creates a brief overview of the most important content and key statements of the conversation or presentation. Ideal for a quick overview.", "it": "Crea una panoramica concisa dei contenuti più importanti e delle dichiarazioni chiave della conversazione o presentazione. Ideale per una rapida panoramica.", "fr": "Crée un aperçu concis du contenu le plus important et des déclarations clés de la conversation ou de la présentation. Idéal pour un aperçu rapide.", "es": "Crea una visión general concisa del contenido más importante y las declaraciones clave de la conversación o presentación. Ideal para una visión rápida."} -``` diff --git a/apps/memoro/apps/landing/context/prompts/offene-fragen-prompt.md b/apps/memoro/apps/landing/context/prompts/offene-fragen-prompt.md deleted file mode 100644 index 572a81c33..000000000 --- a/apps/memoro/apps/landing/context/prompts/offene-fragen-prompt.md +++ /dev/null @@ -1,19 +0,0 @@ -# Offene Fragen Prompt - -## Prompt ID -`c576e875-5a52-4f6a-abb7-0c62c945af78` - -## Prompt Text (direkt für Supabase kopierbar) -```json -{"de": "Liste alle wichtigen Fragen auf, die im folgenden Transkript gestellt wurden und unbeantwortet blieben. Sortiere sie nach Wichtigkeit/Dringlichkeit (HOCH/MITTEL/NIEDRIG). Gib für jede Frage kurzen Kontext, warum sie offen blieb und schlage konkrete nächste Schritte zur Klärung vor. Verwende folgendes Format: [PRIORITÄT] Frage: ... | Kontext: ... | Nächster Schritt: ... Verzichte auf zusätzliche Kommentare. Hier das Transkript:", "en": "List all important questions that were asked in the following transcript and remained unanswered. Sort them by importance/urgency (HIGH/MEDIUM/LOW). For each question, provide brief context on why it remained open and suggest concrete next steps for clarification. Use the following format: [PRIORITY] Question: ... | Context: ... | Next step: ... Avoid additional comments. Here is the transcript:", "it": "Elenca tutte le domande importanti che sono state poste nella seguente trascrizione e sono rimaste senza risposta. Ordinale per importanza/urgenza (ALTA/MEDIA/BASSA). Per ogni domanda, fornisci un breve contesto sul perché è rimasta aperta e suggerisci passi successivi concreti per il chiarimento. Usa il seguente formato: [PRIORITÀ] Domanda: ... | Contesto: ... | Prossimo passo: ... Evita commenti aggiuntivi. Ecco la trascrizione:", "fr": "Listez toutes les questions importantes qui ont été posées dans la transcription suivante et sont restées sans réponse. Triez-les par importance/urgence (ÉLEVÉE/MOYENNE/FAIBLE). Pour chaque question, fournissez un bref contexte expliquant pourquoi elle est restée ouverte et suggérez des prochaines étapes concrètes pour clarification. Utilisez le format suivant : [PRIORITÉ] Question : ... | Contexte : ... | Prochaine étape : ... Évitez les commentaires supplémentaires. Voici la transcription :", "es": "Enumera todas las preguntas importantes que se hicieron en la siguiente transcripción y quedaron sin respuesta. Ordénalas por importancia/urgencia (ALTA/MEDIA/BAJA). Para cada pregunta, proporciona un breve contexto sobre por qué quedó abierta y sugiere próximos pasos concretos para la aclaración. Usa el siguiente formato: [PRIORIDAD] Pregunta: ... | Contexto: ... | Próximo paso: ... Evita comentarios adicionales. Aquí está la transcripción:"} -``` - -## Memory Title (direkt für Supabase kopierbar) -```json -{"de": "Offene Fragen", "en": "Open Questions", "it": "Domande Aperte", "fr": "Questions Ouvertes", "es": "Preguntas Abiertas"} -``` - -## Description (direkt für Supabase kopierbar) -```json -{"de": "Identifiziert alle Fragen, die während des Gesprächs aufgeworfen, aber nicht oder nicht vollständig beantwortet wurden.", "en": "Identifies all questions that were raised during the conversation but were not or not fully answered.", "it": "Identifica tutte le domande che sono state sollevate durante la conversazione ma non hanno ricevuto risposta o non sono state completamente risposte.", "fr": "Identifie toutes les questions qui ont été soulevées pendant la conversation mais n'ont pas reçu de réponse ou n'ont pas été complètement répondues.", "es": "Identifica todas las preguntas que surgieron durante la conversación pero no fueron respondidas o no fueron completamente respondidas."} -``` \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/prompts/social-media-posts-prompt.md b/apps/memoro/apps/landing/context/prompts/social-media-posts-prompt.md deleted file mode 100644 index 06dbfa633..000000000 --- a/apps/memoro/apps/landing/context/prompts/social-media-posts-prompt.md +++ /dev/null @@ -1,19 +0,0 @@ -# Social Media Posts Prompt - -## Prompt ID -`b2e39e0a-ec1f-4d0e-813d-f1a08493332b` - -## Prompt Text (direkt für Supabase kopierbar) -```json -{"de": "Erstelle basierend auf dem folgenden Transkript Social Media Posts für verschiedene Plattformen. Formatiere jeden Post plattformgerecht: 1) X/TWITTER: Max. 280 Zeichen, prägnant, 2-3 Hashtags. 2) LINKEDIN: Professionell, 150-300 Wörter, 5-8 Hashtags. 3) INSTAGRAM: Visuell ansprechend beschrieben, Emoji-Nutzung, 10-15 Hashtags. 4) FACEBOOK: Storytelling-Ansatz, 100-200 Wörter, 3-5 Hashtags. 5) TIKTOK: Video-Idee mit Hook, Ablauf und Trending-Hashtags. Verzichte auf zusätzliche Kommentare. Hier das Transkript:", "en": "Create social media posts for different platforms based on the following transcript. Format each post platform-specifically: 1) X/TWITTER: Max. 280 characters, concise, 2-3 hashtags. 2) LINKEDIN: Professional, 150-300 words, 5-8 hashtags. 3) INSTAGRAM: Visually described, emoji usage, 10-15 hashtags. 4) FACEBOOK: Storytelling approach, 100-200 words, 3-5 hashtags. 5) TIKTOK: Video idea with hook, sequence and trending hashtags. Avoid additional comments. Here is the transcript:", "it": "Crea post per social media per diverse piattaforme basati sulla seguente trascrizione. Formatta ogni post specificamente per la piattaforma: 1) X/TWITTER: Max. 280 caratteri, conciso, 2-3 hashtag. 2) LINKEDIN: Professionale, 150-300 parole, 5-8 hashtag. 3) INSTAGRAM: Descritto visivamente, uso di emoji, 10-15 hashtag. 4) FACEBOOK: Approccio narrativo, 100-200 parole, 3-5 hashtag. 5) TIKTOK: Idea video con hook, sequenza e hashtag di tendenza. Evita commenti aggiuntivi. Ecco la trascrizione:", "fr": "Créez des publications pour les réseaux sociaux pour différentes plateformes basées sur la transcription suivante. Formatez chaque publication spécifiquement pour la plateforme : 1) X/TWITTER : Max. 280 caractères, concis, 2-3 hashtags. 2) LINKEDIN : Professionnel, 150-300 mots, 5-8 hashtags. 3) INSTAGRAM : Description visuelle, utilisation d'emojis, 10-15 hashtags. 4) FACEBOOK : Approche narrative, 100-200 mots, 3-5 hashtags. 5) TIKTOK : Idée vidéo avec accroche, séquence et hashtags tendance. Évitez les commentaires supplémentaires. Voici la transcription :", "es": "Crea publicaciones para redes sociales para diferentes plataformas basadas en la siguiente transcripción. Formatea cada publicación específicamente para la plataforma: 1) X/TWITTER: Máx. 280 caracteres, conciso, 2-3 hashtags. 2) LINKEDIN: Profesional, 150-300 palabras, 5-8 hashtags. 3) INSTAGRAM: Descripción visual, uso de emojis, 10-15 hashtags. 4) FACEBOOK: Enfoque narrativo, 100-200 palabras, 3-5 hashtags. 5) TIKTOK: Idea de video con gancho, secuencia y hashtags de tendencia. Evita comentarios adicionales. Aquí está la transcripción:"} -``` - -## Memory Title (direkt für Supabase kopierbar) -```json -{"de": "Social Media Posts", "en": "Social Media Posts", "it": "Post per Social Media", "fr": "Publications Réseaux Sociaux", "es": "Publicaciones en Redes Sociales"} -``` - -## Description (direkt für Supabase kopierbar) -```json -{"de": "Generiert optimierte Social Media Posts für X/Twitter, LinkedIn, Instagram, Facebook und TikTok. Jeder Post ist plattformspezifisch formatiert mit passender Länge, Tonalität und Hashtag-Anzahl. Enthält konkrete Textvorschläge und bei TikTok Video-Konzepte.", "en": "Generates optimized social media posts for X/Twitter, LinkedIn, Instagram, Facebook and TikTok. Each post is platform-specifically formatted with appropriate length, tone and hashtag count. Includes concrete text suggestions and video concepts for TikTok.", "it": "Genera post ottimizzati per social media per X/Twitter, LinkedIn, Instagram, Facebook e TikTok. Ogni post è formattato specificamente per la piattaforma con lunghezza, tono e numero di hashtag appropriati. Include suggerimenti di testo concreti e concetti video per TikTok.", "fr": "Génère des publications optimisées pour les réseaux sociaux pour X/Twitter, LinkedIn, Instagram, Facebook et TikTok. Chaque publication est formatée spécifiquement pour la plateforme avec une longueur, un ton et un nombre de hashtags appropriés. Inclut des suggestions de texte concrètes et des concepts vidéo pour TikTok.", "es": "Genera publicaciones optimizadas para redes sociales para X/Twitter, LinkedIn, Instagram, Facebook y TikTok. Cada publicación está formateada específicamente para la plataforma con longitud, tono y cantidad de hashtags apropiados. Incluye sugerencias de texto concretas y conceptos de video para TikTok."} -``` \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/team/Dennis-Bauer-LinkedIn.md b/apps/memoro/apps/landing/context/team/Dennis-Bauer-LinkedIn.md deleted file mode 100644 index 20325a200..000000000 --- a/apps/memoro/apps/landing/context/team/Dennis-Bauer-LinkedIn.md +++ /dev/null @@ -1,206 +0,0 @@ -test -Dennis Bauer -Direkter Kontakt1. -"Wer immer tut was er schon kann bleibt immer das was er schon ist." Zitat Henry Ford - -Vari-tech GmbH - -ZHAW School of Management and Law -Stockach, Baden-Württemberg, Deutschland Kontaktinfo -500+ Kontakte - -Tobias Müller, Alex Vasileva und 19 weitere gemeinsame KontakteTobias Müller, Alex Vasileva und 19 weitere gemeinsame Kontakte - -Nachricht - -Mehr -HighlightsHighlights -Till Schneider -Dennis Bauer hat sich in den vergangenen 90 Tagen Ihr Profil angesehen -Dennis Bauer hat sich in den vergangenen 90 Tagen Ihr Profil angesehen -Kontaktieren Sie Dennis Bauer, um die Anforderungen zu verstehen.Kontaktieren Sie Dennis Bauer, um die Anforderungen zu verstehen. -Kostenlose Insights von LinkedIn Sales Navigator -Kostenlose Insights von LinkedIn Sales Navigator -Schalten Sie mehr Einblicke in Leads frei -Bessere Kontaktaufnahme mit vertriebsrelevanten Insights - -Sales Navigator für 0 CHF erneut testen -1 Probemonat mit Support rund um die Uhr. Sie können jederzeit kündigen. Sie erhalten 7 Tage vor Ablauf der Probeversion eine entsprechende Erinnerung. - -Alle 2 Highlights anzeigen -InfoInfo -Machen ist wie wollen, nur viel krasser! Machen ist wie wollen, nur viel krasser! -ServiceleistungenServiceleistungen -Projektmanagement • IT-Beratung • Filing • Dateiverwaltung • Dateneingabe • Technischer Support • InformationsmanagementProjektmanagement • IT-Beratung • Filing • Dateiverwaltung • Dateneingabe • Technischer Support • Informationsmanagement -Serviceleistungen anfordern -Alle Serviceleistungen anzeigen -AktivitätenAktivitäten -564 Follower:innen564 Follower:innen - -Beiträge - -Kommentare -9 „Beiträge“-Beiträge wurden geladen -Link zur Grafik von Dennis Bauer anzeigen -Dennis BauerDennis Bauer -• 1.1. -"Wer immer tut was er schon kann bleibt immer das was er schon ist." Zitat Henry Ford"Wer immer tut was er schon kann bleibt immer das was er schon ist." Zitat Henry Ford -10 Monate • vor 10 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn - -Gestern verfolgten wir aufmerksam den AV Vortrag und die Herangehensweise unserer Kunden. - -Es ist immer interessant ein Thema auch von der gegenüberliegenden Seiten zu betrachten. -… mehr - -Vari-tech GmbHVari-tech GmbH -180 Follower:innen180 Follower:innen -Tag 3 der archivistica 2024 - -Auch finden wieder interessante Vorträge statt, wie zum Beispiel "Umgang mit emotional belastenden Beständen und diskriminierender Sprache". Ein Thema das durchaus auch uns Dienstleister betrifft. - -Unterstützung bringt unser Recording Secretary" -… mehr -Größere Bilddarstellung aktivieren, -Keine alternative Textbeschreibung für dieses Bild vorhanden -Größere Bilddarstellung aktivieren, -like -3 - -Link zur Grafik von Dennis Bauer anzeigen -Dennis BauerDennis Bauer -• 1.1. -"Wer immer tut was er schon kann bleibt immer das was er schon ist." Zitat Henry Ford"Wer immer tut was er schon kann bleibt immer das was er schon ist." Zitat Henry Ford -10 Monate • vor 10 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn - -2ter Tag auf der archivistica 2024 in Suhl. - -Memoro kommt auch unter Archivaren gut an. -1 Repost - -Link zur Grafik von Dennis Bauer anzeigen -Dennis BauerDennis Bauer -• 1.1. -"Wer immer tut was er schon kann bleibt immer das was er schon ist." Zitat Henry Ford"Wer immer tut was er schon kann bleibt immer das was er schon ist." Zitat Henry Ford -10 Monate • vor 10 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn - -Vari-tech GmbHVari-tech GmbH -180 Follower:innen180 Follower:innen -91.Archivtag in Suhl - -Treffen Sie uns auf dem Stand 31. -Größere Bilddarstellung aktivieren, -Keine alternative Textbeschreibung für dieses Bild vorhanden -Größere Bilddarstellung aktivieren, -likecelebrate -4 - -Alle Beiträge anzeigen -BerufserfahrungBerufserfahrung -Logo von Vari-tech GmbH -Geschäftsführender Gesellschafter -Geschäftsführender Gesellschafter -Vari-tech GmbH · SelbstständigVari-tech GmbH · Selbstständig -Juli 2021–Heute · 4 Jahre 2 MonateJuli 2021–Heute · 4 Jahre 2 Monate -Digitalisierung, Beratung, Konzepterarbeitung, Scanning, Datenaufbereitung, Datenkonvertierung und ErschließungsarbeitenDigitalisierung, Beratung, Konzepterarbeitung, Scanning, Datenaufbereitung, Datenkonvertierung und Erschließungsarbeiten -Workflow-Entwickler -Workflow-Entwickler -Workflow-Entwickler -K&B GbR · SelbstständigK&B GbR · Selbstständig -Okt. 2019–Heute · 5 Jahre 11 MonateOkt. 2019–Heute · 5 Jahre 11 Monate -Radolfzell am Bodensee, Baden-Württemberg, DeutschlandRadolfzell am Bodensee, Baden-Württemberg, Deutschland -Logo von Zahnmedizin Zentrum Dr. Basset -Manager COO -Manager COO -Zahnmedizin Zentrum Dr. BassetZahnmedizin Zentrum Dr. Basset -Jan. 2019–Dez. 2021 · 3 JahreJan. 2019–Dez. 2021 · 3 Jahre -Radolfzell am BodenseeRadolfzell am Bodensee -Logo von GBL Gubler AG -GBL Gubler AG -GBL Gubler AG -17 Jahre 9 Monate17 Jahre 9 Monate -Produktionsleiter und Mitglied der Geschäftsleitung -Produktionsleiter und Mitglied der Geschäftsleitung -Apr. 2011–Sept. 2018 · 7 Jahre 6 MonateApr. 2011–Sept. 2018 · 7 Jahre 6 Monate -Frauenfeld, Kanton Thurgau, SchweizFrauenfeld, Kanton Thurgau, Schweiz -wöchentliche Prozess- und Effizienzanalyse -Einbinden von Menschen mit Beeinträchtigung und sensibilisieren aller Mitarbeiter -Berater im Bereich der digitalen Archivierung, Prozessanalyse und neue Produkte. -Aufbau und Betrieb von abgesetzten Systemen vor Ort beim Kunden. -Business Analyst in mehreren Projekten Bsp. "Vecteur" des Schweizerischen Bundesarchiv. -Aufbau der Softwareentwicklungsabteilung in der neben kleineren Programmen auch ein neues WorkflowManagementSystem für Audio Visuelle Daten entickelt wurde. -Ausbau der Produktion in 4 Fachbereiche -Einführung eines WorkflowManagementSystems für Bilddatenwöchentliche Prozess- und Effizienzanalyse Einbinden von Menschen mit Beeinträchtigung und sensibilisieren aller Mitarbeiter Berater im Bereich der digitalen Archivierung, Prozessanalyse und neue Produkte. Aufbau und Betrieb von abgesetzten Systemen vor Ort beim Kunden. Business Analyst in mehreren Projekten Bsp. "Vecteur" des Schweizerischen Bundesarchiv. Aufbau der Softwareentwicklungsabteilung in der neben kleineren Programmen auch ein neues WorkflowManagementSystem für Audio Visuelle Daten entickelt wurde. Ausbau der Produktion in 4 Fachbereiche Einführung eines WorkflowManagementSystems für Bilddaten… mehr anzeigen -Produktionsleiter -Produktionsleiter -2008–März 2011 · 3 Jahre 3 Monate2008–März 2011 · 3 Jahre 3 Monate -85528552 -wöchentliche Prozess- und Effizienzanalyse -permanente Prozess- und Workflowoptimierung -stetige Ausbildung der Mitarbeiter (Operator, Team- und Projektleiter) -Unterstützung bei Entwicklung des Laserbelichters Eternity E105 zur Produktionsreife am Standort Felben-Wellhausen. Softwareentwicklung in Zusammenarbeit mit dem IML der Univesität Basel. -Unterstützung in mehreren Teilbereichen bei der Entwicklung des Laserbelichters Archivlaser am Frauenhofer Institut in Freiburg und an der Universität Stuttgart zur Produktreife. -Mitarbeit in div. Arbeitsgruppen der e-CH und VSAwöchentliche Prozess- und Effizienzanalyse permanente Prozess- und Workflowoptimierung stetige Ausbildung der Mitarbeiter (Operator, Team- und Projektleiter) Unterstützung bei Entwicklung des Laserbelichters Eternity E105 zur Produktionsreife am Standort Felben-Wellhausen. Softwareentwicklung in Zusammenarbeit mit dem IML der Univesität Basel. Unterstützung in mehreren Teilbereichen bei der Entwicklung des Laserbelichters Archivlaser am Frauenhofer Institut in Freiburg und an der Universität Stuttgart zur Produktreife. Mitarbeit in div. Arbeitsgruppen der e-CH und VSA… mehr anzeigen -Projektleiter -Projektleiter -2001–2008 · 7 Jahre2001–2008 · 7 Jahre -85608560 -Ausbelichtung und Finishing von Grossformatfotos. -Ausbau und Prozessoptimierung der Digitalisierungsabteilung -Aufbau Fachbereich Metadaten StandardAusbelichtung und Finishing von Grossformatfotos. Ausbau und Prozessoptimierung der Digitalisierungsabteilung Aufbau Fachbereich Metadaten Standard… mehr anzeigen -Logo von ammdoppleb -Monteur -Monteur -ammdopplebammdoppleb -1995–2001 · 6 Jahre1995–2001 · 6 Jahre -7826978269 -Vom einfachen kleinen bis hin zum individuellen mehrstöckigen Messstand produzierte, fuhr und baute ich die Stände allein und in kleinen Teams in weiten Teilen Europas auf. -Aufgaben: Schreiner, Lackierer, Folien- und PrintverarbeitungVom einfachen kleinen bis hin zum individuellen mehrstöckigen Messstand produzierte, fuhr und baute ich die Stände allein und in kleinen Teams in weiten Teilen Europas auf. Aufgaben: Schreiner, Lackierer, Folien- und Printverarbeitung… mehr anzeigen -AusbildungAusbildung -ZHAW School of Management and Law -ZHAW School of Management and Law -ZHAW School of Management and Law -HERMES 5 FoundationHERMES 5 Foundation -2017–20172017–2017 -Berufsschulzentrum Radolfzell -Berufsschulzentrum Radolfzell -Berufsschulzentrum Radolfzell -1992–19951992–1995 -Ausbildung zum Bau- und MöbeltischlerAusbildung zum Bau- und Möbeltischler -KenntnisseKenntnisse -Microsoft Office -Microsoft Office -Johannes Paul Kauert (John)s Profilfoto -verifiziert von Johannes Paul Kauert (John) (gemeinsamer Kontakt)verifiziert von Johannes Paul Kauert (John) (gemeinsamer Kontakt) -Johannes Paul Kauert (John)s Profilfoto -In den vergangenen 6 Monaten von 1 Person bestätigtIn den vergangenen 6 Monaten von 1 Person bestätigt -3 Kenntnisbestätigungen -3 Kenntnisbestätigungen - -Bestätigen -Management -Management -Johannes Paul Kauert (John)s Profilfoto -verifiziert von Johannes Paul Kauert (John) (gemeinsamer Kontakt)verifiziert von Johannes Paul Kauert (John) (gemeinsamer Kontakt) -Johannes Paul Kauert (John)s Profilfoto -In den vergangenen 6 Monaten von 1 Person bestätigtIn den vergangenen 6 Monaten von 1 Person bestätigt -3 Kenntnisbestätigungen -3 Kenntnisbestätigungen - -Bestätigen -Alle 14 Kenntnisse anzeigen -OrganisationenOrganisationen -VSA-AAS -VSA-AAS -Jan. 2014–HeuteJan. 2014–Heute -Der Verein Schweizerischer Archivarinnen und Archivare (VSA) repräsentiert Archivarinnen und Archivare, Records Manager und Informationsfachleute in der Schweiz. Als nationaler Berufsverband unterstützt er die Zusammenarbeit der professionellen Archive und das Ziel, den Zugang zum Archivgut benutzungsfreundlich zu gestalten.Der Verein Schweizerischer Archivarinnen und Archivare (VSA) repräsentiert Archivarinnen und Archivare, Records Manager und Informationsfachleute in der Schweiz. Als nationaler Berufsverband unterstützt er die Zusammenarbeit der professionellen Archive und das Ziel, den Zugang zum Archivgut benutzungsfreundlich zu gestalten.… mehr anzeigen -Kost ceco -Kost ceco -Mitglied in der Arbeitsgruppe "digitale Archivierung" · März 2010–HeuteMitglied in der Arbeitsgruppe "digitale Archivierung" · März 2010–Heute - - - -eCH-Fachgruppe Digitale Archivierung - -Die eCH-Fachgruppe Digitale Archivierung ist das Standardisierungsgremium, das sämtliche Akteure der digitalen Archivierung (staatliche Archive, öffentliche Verwaltungen, Software- und Dienstleistungsanbieter) vereinigt. Sie bietet somit einen Rahmen für breit abgestützte Standardisierungsvorhaben. - -Mehr Informationen zur eCH-Fachgruppe Digitale Archivierung finden Sie auf der eCH-Website sowie auf dem eCH-Share (für registrierte User). Untenstehend dokumentiert sind die bisherigen Sitzungen der Fachgruppe. diff --git a/apps/memoro/apps/landing/context/team/Dirk-Zimanky-LinkedIn.md b/apps/memoro/apps/landing/context/team/Dirk-Zimanky-LinkedIn.md deleted file mode 100644 index 89349298a..000000000 --- a/apps/memoro/apps/landing/context/team/Dirk-Zimanky-LinkedIn.md +++ /dev/null @@ -1,285 +0,0 @@ -Dirk Zimanky - Direkter Kontakt1. -Gründer von adCura - Wir beratenEigentümer, Investoren und Verwaltungsräte. Experte in Electronic Manufacturing Services (EMS) - -edisconet - -University of Konstanz -Zürich Metropolitan Area Kontaktinfo -1.195 Follower:innen -500+ Kontakte - - -Alex Vasileva, Tobias Müller und 19 weitere gemeinsame KontakteAlex Vasileva, Tobias Müller und 19 weitere gemeinsame Kontakte - -Nachricht - -Ihre Serviceleistungen anzeigen - -Mehr - -Profil mit Premium verbessert -HighlightsHighlights -Unternehmenslogo -Dirk Zimanky folgt Ihrem Unternehmen auf LinkedIn -Dirk Zimanky folgt Ihrem Unternehmen auf LinkedIn -Dirk Zimanky kennt Ihre Marke und ist möglicherweise empfänglicher für eine Kontaktaufnahme.Dirk Zimanky kennt Ihre Marke und ist möglicherweise empfänglicher für eine Kontaktaufnahme. -Kostenlose Insights von LinkedIn Sales Navigator -Kostenlose Insights von LinkedIn Sales Navigator -Schalten Sie mehr Einblicke in Leads frei -Bessere Kontaktaufnahme mit vertriebsrelevanten Insights - -Sales Navigator für 0 CHF erneut testen -1 Probemonat mit Support rund um die Uhr. Sie können jederzeit kündigen. Sie erhalten 7 Tage vor Ablauf der Probeversion eine entsprechende Erinnerung. - -InfoInfo -Ich arbeite jeden Tag daran, Menschen und Unternehmen erfolgreich zu machen, die positiv auf unsere Umwelt und das sozioökonomische Leben einwirken und damit die Welt zu einem besseren Ort machen. - -Mit mehr als 30 Jahren Erfahrung in den Bereichen Business, Technologie und Marktentwicklung, insbesondere auf dem globalen Markt für Elektronik, habe ich folgende Kernkompetenzen: - -- Starke Expertise in den Bereichen Business, Technologie und Marktentwicklung, insbesondere auf dem globalen Markt für Elektronik. -- Menschen zu herausfordernden Zielen motivieren und sich selbst tragende Leistungseinheiten bilden. -- Aufbau langjähriger strategischer Partnerschaften und dauerhafter persönlicher Geschäfts-Beziehungen. -- Breites internationales Kontakt Netzwerk. -- Fähigkeit von Organisationsstrukturen auf lokaler und internationaler Ebene zu bewerten und zu optimieren. -- Sicher in multikulturellen und internationalen Vertragsverhandlungen. -- Vertraut mit der Führung und Geschäftsdynamik in Asien, Europa und den USA. -- Fusionen und Übernahmen auf Käufer- & Verkäuferseite. - -Meine Werte sind ethisches Verhalten, Vertrauen, ehrlicher Respekt, Zusammenarbeit, greifbare Innovation und Wertschätzung des Lebens.Ich arbeite jeden Tag daran, Menschen und Unternehmen erfolgreich zu machen, die positiv auf unsere Umwelt und das sozioökonomische Leben einwirken und damit die Welt zu einem besseren Ort machen. Mit mehr als 30 Jahren Erfahrung in den Bereichen Business, Technologie und Marktentwicklung, insbesondere auf dem globalen Markt für Elektronik, habe ich folgende Kernkompetenzen: - Starke Expertise in den Bereichen Business, Technologie und Marktentwicklung, insbesondere auf dem globalen Markt für Elektronik. - Menschen zu herausfordernden Zielen motivieren und sich selbst tragende Leistungseinheiten bilden. - Aufbau langjähriger strategischer Partnerschaften und dauerhafter persönlicher Geschäfts-Beziehungen. - Breites internationales Kontakt Netzwerk. - Fähigkeit von Organisationsstrukturen auf lokaler und internationaler Ebene zu bewerten und zu optimieren. - Sicher in multikulturellen und internationalen Vertragsverhandlungen. - Vertraut mit der Führung und Geschäftsdynamik in Asien, Europa und den USA. - Fusionen und Übernahmen auf Käufer- & Verkäuferseite. Meine Werte sind ethisches Verhalten, Vertrauen, ehrlicher Respekt, Zusammenarbeit, greifbare Innovation und Wertschätzung des Lebens.… mehr anzeigen -ServiceleistungenServiceleistungen -Advising founders, owners, investors & boards through: - -ACTIVE INVOLVEMENT -for founders and key members through business challenges, board work, business idea feasibility & strategy formulation. - -PROFITABLE GROWTH -by implementing new dynamics, including strategy review, interim management, cultural & change management. - -MAXIMIZING THE VALUE -of investments through active board work, investment opportunities, add-on acquisitions, divestitures & more.Advising founders, owners, investors & boards through: ACTIVE INVOLVEMENT for founders and key members through business challenges, board work, business idea feasibility & strategy formulation. PROFITABLE GROWTH by implementing new dynamics, including strategy review, interim management, cultural & change management. MAXIMIZING THE VALUE of investments through active board work, investment opportunities, add-on acquisitions, divestitures & more.… mehr anzeigen -Veränderungsmanagement • Unternehmensberatung • Preispolitik • Strategische Planung • Führungskräftecoaching • VerhandlungsführungVeränderungsmanagement • Unternehmensberatung • Preispolitik • Strategische Planung • Führungskräftecoaching • Verhandlungsführung -Alle Serviceleistungen anzeigen -Im FokusIm Fokus -Bild -Bild -Bild für What Others Say -What Others SayWhat Others Say -https://adcura.comhttps://adcura.com -Bild -Bild -Bild für What Others Say -What Others SayWhat Others Say -https://adcura.comhttps://adcura.com -Bild -Bild -Bild für The 4 D's of Organizational Transformation -The 4 D's of Organizational TransformationThe 4 D's of Organizational Transformation -“I’m convinced that about half of what separates successful entrepreneurs from the non-successful ones is pure perseverance.” – Steve Jobs, Co-Founder of Apple.“I’m convinced that about half of what separates successful entrepreneurs from the non-successful ones is pure perseverance.” – Steve Jobs, Co-Founder of Apple. -Bild -Bild -Bild für 4 step roadmap to ensure business growth -4 step roadmap to ensure business growth4 step roadmap to ensure business growth -At adCura, we have developed a straight forward 4 step roadmap to ensure our customers’ strategic business growth that is designed to boost agility and flexibility in their organizations and strengthen their long-term strategies in this new global business environment. In our upcoming posts we will take a closer look on these steps and their impact. -https://adcura.comAt adCura, we have developed a straight forward 4 step roadmap to ensure our customers’ strategic business growth that is designed to boost agility and flexibility in their organizations and strengthen their long-term strategies in this new global business environment. In our upcoming posts we will take a closer look on these steps and their impact. https://adcura.com -Link -Link - -adCura - advising founders, owners, investors & boardsadCura - advising founders, owners, investors & boards -adCuraadCura -with our network of international experts, adCura strives to make the world a better place -by empowering people and organizations having a positive impact on our environment and social-economic life. -adCura’s highly experienced team & associates with deep understanding about leading global operating entities and small local units have held top management & CEO positions, and driven the growth of multinational half a billion worth companies.with our network of international experts, adCura strives to make the world a better place by empowering people and organizations having a positive impact on our environment and social-economic life. adCura’s highly experienced team & associates with deep understanding about leading global operating entities and small local units have held top management & CEO positions, and driven the growth of multinational half a billion worth companies. - -AktivitätenAktivitäten -1.195 Follower:innen1.195 Follower:innen - - -Follower:in - -Beiträge - -Kommentare -9 „Beiträge“-Beiträge wurden geladen -Profilfoto von Dirk Zimanky -Dirk Zimanky hat dies repostet - -Link zur Grafik von Stephanie Kaudela-Baum, Prof. Dr. anzeigen -Stephanie Kaudela-Baum, Prof. Dr.Stephanie Kaudela-Baum, Prof. Dr. - • 2.Verifiziert • 2. -Professor of Leadership and Innovation I Co-Head Competence Center Business Development, Leadership and HR I Lecturer I Speaker I #leadership I #innovation I #creativityProfessor of Leadership and Innovation I Co-Head Competence Center Business Development, Leadership and HR I Lecturer I Speaker I #leadership I #innovation I #creativity -2 Wochen • vor 2 Wochen • Alle Mitglieder und Nicht-Mitglieder von LinkedIn -In Lucerne, you definitely get into the continuous innovation flow. Late summer, lake, mountains, chocolate and great conference participants :) - register now and network with the CINet community! HSLU Hochschule Luzern HSLU – Institut für Betriebs- und Regionalökonomie IBR HSLU – Lucerne School of Business – International -… mehr - -Continuous Innovation Network (CINet)Continuous Innovation Network (CINet) -597 Follower:innen597 Follower:innen -The 26th CINet conference is coming! -Join us on 7-9 September 2025 in the beautiful Lucerne! -Registrations are still open: https://lnkd.in/dQ_ix6FG - - -CINet Board -Maria Carmela Annosi, Harry Boer, Tim Schweisfurth, Luca Gastaldi, René Chester Goduscheit, Katharina Hölzle, Nicolette Lakemond, Mats Magnusson, Luisa Pellegrini, Magnus Persson, Daniel Trabucchi, Jeannette Visser-Groeneveld, Melanie Wiener, Patricia Wolf - -Local Organizers Committee -Patricia Wolf, Stephanie Kaudela-Baum, Prof. Dr., Julien Alain Nussbaum, Christian Hohmann, Shaun West, Prof. Dr. Petra Müller-Csernetzky -… mehr - -Übersetzung anzeigen -Größere Bilddarstellung aktivieren, -Keine alternative Textbeschreibung für dieses Bild vorhanden -Größere Bilddarstellung aktivieren, -like -16 -2 Reposts - - - - -Link zur Grafik von Dirk Zimanky anzeigen -Dirk ZimankyDirk Zimanky - • 1.Premium • 1. -Gründer von adCura - Wir beratenEigentümer, Investoren und Verwaltungsräte. Experte in Electronic Manufacturing Services (EMS)Gründer von adCura - Wir beratenEigentümer, Investoren und Verwaltungsräte. Experte in Electronic Manufacturing Services (EMS) -Ihre Serviceleistungen anzeigen -2 Monate • vor 2 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn - -Most companies don't have a knowledge deficit – they just don't know what they already know. How can generative AI help to make hidden knowledge visible – without overwhelming employees? -We have published a new article at edisconet, take a look: -… mehr - -edisconetedisconet -240 Follower:innen240 Follower:innen -Die meisten Unternehmen haben kein Wissensdefizit – sie wissen nur nicht, was sie schon wissen. -Wie kann generative KI helfen, verborgenes Wissen sichtbar zu machen – ganz ohne Ihre Mitarbeitenden zu überfordern? - -In unserem neuen Artikel zeigen wir, -- wie KI stilles Wissen in nutzbares Wissen verwandelt -- was das mit CRM-Daten, Vertriebsprozessen und Transparenz zu tun hat -- und warum wir gemeinsam mit der HSLU eine Sandbox für wissensintensive Organisationen entwickeln. - -👉 Jetzt lesen: „Wissensgenerierung neu denken: Wie KI zum stillen Teammitglied Ihrer Organisation wird“ -🔗 https://lnkd.in/eu6iEB4a - -🎯 Neugierig geworden? Am Ende des Artikels erfahren Sie, wie Sie Teil unseres spannenden Forschungsprojekts werden können. - - -Hashtag#Wissensmanagement Hashtag#GenerativeAI Hashtag#TacitKnowledge Hashtag#AIimUnternehmen Hashtag#edisconetCommons Hashtag#FutureOfWork - -Prof. Dr. Petra Müller-Csernetzky, Stephanie Kaudela-Baum, Prof. Dr., HSLU Hochschule Luzern, Dirk Zimanky -… mehr -Größere Bilddarstellung aktivieren, -Wissensmanagement und KI_edisconet, HSLU -Größere Bilddarstellung aktivieren, -likecelebrate -15 - - - - - -Alle Beiträge anzeigen -BerufserfahrungBerufserfahrung -Logo von edisconet -Board Member -Board Member -edisconet · Vollzeitedisconet · Vollzeit -Jan. 2022–Heute · 3 Jahre 8 MonateJan. 2022–Heute · 3 Jahre 8 Monate -edisconet is one platform for multiple learning paths. It allows to engage your employees with meaningful & rewarding learning experiences by integrating your internal systems with the universe of trainings, trainers & learning paths.edisconet is one platform for multiple learning paths. It allows to engage your employees with meaningful & rewarding learning experiences by integrating your internal systems with the universe of trainings, trainers & learning paths.… mehr anzeigen -Logo von adCura -Gründer und Geschäftsführender Partner -Gründer und Geschäftsführender Partner -adCuraadCura -2020–Heute · 5 Jahre 8 Monate2020–Heute · 5 Jahre 8 Monate -SchweizSchweiz -adCura berät Gründer, Eigentümer, Investoren und Verwaltungsräte. Mit unserem Netzwerk internationaler Experten arbeiten wir mit Start-ups, Unternehmen des Mittelstands und Risikokapitalunternehmen zusammen. Bei adCura konzentriert sich Alles darauf den Wert der Unternehmung für die verschiedenen Stakeholder zu erhöhen.adCura berät Gründer, Eigentümer, Investoren und Verwaltungsräte. Mit unserem Netzwerk internationaler Experten arbeiten wir mit Start-ups, Unternehmen des Mittelstands und Risikokapitalunternehmen zusammen. Bei adCura konzentriert sich Alles darauf den Wert der Unternehmung für die verschiedenen Stakeholder zu erhöhen.… mehr anzeigen -Logo von Enics -Enics -Enics -16 Jahre 1 Monat16 Jahre 1 Monat -Senior Vice President, Market Execution -Senior Vice President, Market Execution -2013–2020 · 7 Jahre2013–2020 · 7 Jahre -Enics ist ein Unternehmen, das Fertigungs-, Entwicklungs- und Kundendienstleistungen für elektronische Schaltungen und komplette elektronische Systeme für industrielle OEMs weltweit anbietet. Leitung des Inbound-Geschäfts mit mehr als 500 MEUR Jahresumsatz aus globalen OEM-Kunden. Verantwortlich für Gewinn und Verlust, Budgets und Planung für die verschiedenen Dienstleistungen in den Bereichen Fertigung, Engineering und After-Sales.Enics ist ein Unternehmen, das Fertigungs-, Entwicklungs- und Kundendienstleistungen für elektronische Schaltungen und komplette elektronische Systeme für industrielle OEMs weltweit anbietet. Leitung des Inbound-Geschäfts mit mehr als 500 MEUR Jahresumsatz aus globalen OEM-Kunden. Verantwortlich für Gewinn und Verlust, Budgets und Planung für die verschiedenen Dienstleistungen in den Bereichen Fertigung, Engineering und After-Sales.… mehr anzeigen -President and CEO -President and CEO -2010–2013 · 3 Jahre2010–2013 · 3 Jahre -Diese Position nach der Finanzkrise im Jahr 2009 einzunehmen, führte das Unternehmen zurück auf einen Weg des organischen Wachstums. Wir haben unsere europäischen Einheiten auf Mehrwertdienste umgestellt, den Ausbau des zweiten Standorts in China erfolgreich abgeschlossen und das Unternehmen mit einer durchschnittlichen jährlichen Wachstumsrate von 8 Prozent organisch ausgebaut. Ich führte die strategische und operative Leitung der Gruppe und deren acht Geschäftseinheiten mit insgesamt 3500 Mitarbeitern. Wir waren in Estland, der Schweiz, Finnland, der Slowakei, Schweden, China und Hongkong tätig.Diese Position nach der Finanzkrise im Jahr 2009 einzunehmen, führte das Unternehmen zurück auf einen Weg des organischen Wachstums. Wir haben unsere europäischen Einheiten auf Mehrwertdienste umgestellt, den Ausbau des zweiten Standorts in China erfolgreich abgeschlossen und das Unternehmen mit einer durchschnittlichen jährlichen Wachstumsrate von 8 Prozent organisch ausgebaut. Ich führte die strategische und operative Leitung der Gruppe und deren acht Geschäftseinheiten mit insgesamt 3500 Mitarbeitern. Wir waren in Estland, der Schweiz, Finnland, der Slowakei, Schweden, China und Hongkong tätig.… mehr anzeigen -Co-founder and Senior Vice President -Co-founder and Senior Vice President -2004–2010 · 6 Jahre2004–2010 · 6 Jahre -Enics wurde 2004 als Leveraged Management-Buy-Out ausgewählter Teile von Elcoteq gegründet. Von 2006 bis 2010 war ich als Senior Vice President, CRM sowie von 2004 bis 2006 als Vice President Business Development tätig. In diesem Zeitraum haben wir mehrere Akquisitionen und operative Erweiterungen durchgeführt und das Unternehmen erfolgreich von 116 Mio. EUR auf über 300 Mio. EUR ausgebaut. Berichterstattung an den CEO.Enics wurde 2004 als Leveraged Management-Buy-Out ausgewählter Teile von Elcoteq gegründet. Von 2006 bis 2010 war ich als Senior Vice President, CRM sowie von 2004 bis 2006 als Vice President Business Development tätig. In diesem Zeitraum haben wir mehrere Akquisitionen und operative Erweiterungen durchgeführt und das Unternehmen erfolgreich von 116 Mio. EUR auf über 300 Mio. EUR ausgebaut. Berichterstattung an den CEO.… mehr anzeigen -Logo von Elcoteq -Elcoteq -Elcoteq -5 Jahre 1 Monat5 Jahre 1 Monat -Director, Business Development Business Area Communication Network Equipment & Industrial Electronic -Director, Business Development Business Area Communication Network Equipment & Industrial Electronic -2002–2004 · 2 Jahre2002–2004 · 2 Jahre -Elcoteq trat dem Unternehmen auf dem Höhepunkt des Wachstums des Mobilfunkmarktes bei und erbrachte elektronische Fertigungsdienstleistungen für Mobiltelefone und Basisstationen von Kommunikationsnetzwerken. Wir verzeichneten ein sehr schnelles Umsatzwachstum, haben in einigen Jahren den Umsatz mehr als verdoppelt und betrieben ein Fertigungsnetzwerk in 16 Geschäftsbereichen in Japan, China, Estland, USA, Mexiko, Russland und Finnland. Während meiner Zeit bei Elcoteq hatte ich von 2002 bis 2004 verschiedene Positionen als Director, Business Development Business Area Communication Network Equipment und Industrial Electronic inne. Von 2000 bis 2002 Director, Sales Industrial Electronic und von 1999 bis 2000 als Account Manager, Geographical Area Europe.Elcoteq trat dem Unternehmen auf dem Höhepunkt des Wachstums des Mobilfunkmarktes bei und erbrachte elektronische Fertigungsdienstleistungen für Mobiltelefone und Basisstationen von Kommunikationsnetzwerken. Wir verzeichneten ein sehr schnelles Umsatzwachstum, haben in einigen Jahren den Umsatz mehr als verdoppelt und betrieben ein Fertigungsnetzwerk in 16 Geschäftsbereichen in Japan, China, Estland, USA, Mexiko, Russland und Finnland. Während meiner Zeit bei Elcoteq hatte ich von 2002 bis 2004 verschiedene Positionen als Director, Business Development Business Area Communication Network Equipment und Industrial Electronic inne. Von 2000 bis 2002 Director, Sales Industrial Electronic und von 1999 bis 2000 als Account Manager, Geographical Area Europe.… mehr anzeigen -Director, Sales Industrial Electronic -Director, Sales Industrial Electronic -2000–2002 · 2 Jahre2000–2002 · 2 Jahre -Account Manager, Geographical Area Europe -Account Manager, Geographical Area Europe -1999–2000 · 1 Jahr1999–2000 · 1 Jahr -Stephan Elektronik -Stephan Elektronik -Stephan Elektronik -13 Jahre 1 Monat13 Jahre 1 Monat -Head of Administration (Finance, HR, Legal, IT, Sales) -Head of Administration (Finance, HR, Legal, IT, Sales) -1991–1999 · 8 Jahre1991–1999 · 8 Jahre -Der Start in einem kleineren Familienunternehmen bot mir die großartige Gelegenheit, in allen Fachgebieten zu arbeiten, von Design, Beschaffung, Betrieb bis hin zu Recht und Finanzen. Wir haben das Unternehmen auf drei Standorte mit mehr als 1300 Mitarbeitern ausgebaut.Der Start in einem kleineren Familienunternehmen bot mir die großartige Gelegenheit, in allen Fachgebieten zu arbeiten, von Design, Beschaffung, Betrieb bis hin zu Recht und Finanzen. Wir haben das Unternehmen auf drei Standorte mit mehr als 1300 Mitarbeitern ausgebaut.… mehr anzeigen -Head Of Department, Operations and supply chain -Head Of Department, Operations and supply chain -1986–1991 · 5 Jahre1986–1991 · 5 Jahre -Holding several positions as department head within operations and supply chain in Germany, Poland and Switzerland. Reporting to the owner.Holding several positions as department head within operations and supply chain in Germany, Poland and Switzerland. Reporting to the owner. -AusbildungAusbildung -Logo von Universität Konstanz -Universität Konstanz -Universität Konstanz -Master's degree, Administration ScienceMaster's degree, Administration Science -1985–19911985–1991 -Collegium Mehrerau-Bernardi -Collegium Mehrerau-Bernardi -Collegium Mehrerau-Bernardi -1976–19841976–1984 -KenntnisseKenntnisse -Leadership -Leadership -Logo von Enics -Bestätigt von 5 Kolleg:innen bei EnicsBestätigt von 5 Kolleg:innen bei Enics -10 Kenntnisbestätigungen -10 Kenntnisbestätigungen - -Bestätigen -Business Development -Business Development -Logo von Enics -Bestätigt von 5 Kolleg:innen bei EnicsBestätigt von 5 Kolleg:innen bei Enics -10 Kenntnisbestätigungen -10 Kenntnisbestätigungen - -Bestätigen -Alle 12 Kenntnisse anzeigen -EmpfehlungenEmpfehlungen -Dirk Zimanky empfehlen -ErhaltenErhalten -ErteiltErteilt -Noch keine Informationen verfügbar -Noch keine Informationen verfügbar -Empfehlungen, die Dirk Zimanky erhält, erscheinen hier.Empfehlungen, die Dirk Zimanky erhält, erscheinen hier. -KurseKurse -Introduction to Digital Facilitation -Introduction to Digital Facilitation -Unternehmenslogo -Assoziiert mit adCura -Assoziiert mit adCura -SprachenSprachen -English -English -FließendFließend -French -French -Grundkenntnisse \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/team/Florian-König-LinkedIn.md b/apps/memoro/apps/landing/context/team/Florian-König-LinkedIn.md deleted file mode 100644 index e095db89f..000000000 --- a/apps/memoro/apps/landing/context/team/Florian-König-LinkedIn.md +++ /dev/null @@ -1,143 +0,0 @@ -Florian König -Direkter Kontakt1. -So geht Marketing-Automation - Quentn.com - -Quentn.com GmbH -Pfinztal, Baden-Württemberg, Deutschland Kontaktinfo -247 Kontakte - -Alex Vasileva, Tobias Müller und 1 weiterer gemeinsamer KontaktAlex Vasileva, Tobias Müller und 1 weiterer gemeinsamer Kontakt - -Nachricht - -Mehr -HighlightsHighlights -Unternehmenslogo -Florian König folgt Ihrem Unternehmen auf LinkedIn -Florian König folgt Ihrem Unternehmen auf LinkedIn -Florian König kennt Ihre Marke und ist möglicherweise empfänglicher für eine Kontaktaufnahme.Florian König kennt Ihre Marke und ist möglicherweise empfänglicher für eine Kontaktaufnahme. -Kostenlose Insights von LinkedIn Sales Navigator -Kostenlose Insights von LinkedIn Sales Navigator -Schalten Sie mehr Einblicke in Leads frei -Bessere Kontaktaufnahme mit vertriebsrelevanten Insights - -Sales Navigator für 0 CHF erneut testen -1 Probemonat mit Support rund um die Uhr. Sie können jederzeit kündigen. Sie erhalten 7 Tage vor Ablauf der Probeversion eine entsprechende Erinnerung. - -AktivitätenAktivitäten -246 Follower:innen246 Follower:innen - -4 „Beiträge“-Beiträge wurden geladen -Profilfoto von Florian König -Florian König hat dies repostet - -edisconetedisconet -240 Follower:innen240 Follower:innen -2 Monate • vor 2 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn -Silent knowledge that never makes it into meetings or manuals is a part of every organisation. At edisconet, we magnify this hidden knowledge and turn it into useful insights. - -It's time to give your team's unspoken expertise the spotlight it deserves. - -https://edisconet.com -… mehr -Größere Bilddarstellung aktivieren, -Keine alternative Textbeschreibung für dieses Bild vorhanden -Größere Bilddarstellung aktivieren, -like -11 -2 Kommentare -2 Reposts - -Profilfoto von Florian König -Florian König hat dies repostet - -MemoroMemoro -219 Follower:innen219 Follower:innen -1 Jahr • Bearbeitet • vor 1 Jahr • Bearbeitet • Alle Mitglieder und Nicht-Mitglieder von LinkedIn -📢 Unser größtes App-Update bisher 🚀 - -✨ Viele neue Funktionen: - -Spezielle Modi: Verschiedene Modi helfen euch, spezielle Aufgaben zu erledigen, z.B. ein Formular auszufüllen, eine Mail zu formulieren oder eine Besprechung aufzunehmen. Aktuell sind Modi in den Bereichen Pflege, Handwerk und Bau, Büro, Universität, Tagebuch und Journalismus verfügbar. - -Checklisten: Jeder Modus hat seine eigene Checkliste mit Tipps, um strukturierte Aufnahmen zu erstellen und wichtige Punkte nicht zu vergessen. - -26 Sprachen: Memoro kann jetzt in 26 Sprachen zuhören und mitschreiben – inklusive eingebauter Übersetzung. (Deutsch, Schwiizerdütsch, Österreichisch, Englisch, Niederländisch, Französisch, Italienisch, Spanisch, Schwedisch, Norwegisch, Rumänisch, Griechisch, Ägyptisches Arabisch (Masri), Türkisch, Russisch, Ukrainisch, Ungarisch, Hindi, Chinesisch (Zhōngwén), Koreanisch, Indonesisch, Vietnamesisch) - -Wichtig: Um weiterhin alle Funktionen von Memoro nutzen zu können, ist ein Upgrade auf die neueste Version erforderlich. Bitte deinstalliert eure aktuelle Version und installiert die neue Version aus dem Play Store oder App Store. -Hier findet ihr die App für Android im Play Store: https://lnkd.in/dhszvBck -und hier für Apple im App Store: https://lnkd.in/d4Kh58aj - -Wir freuen uns darauf, dass ihr die neuen Funktionen von Memoro ausprobiert und sind gespannt auf euer Feedback! 🌍💬 - -Hashtag#Memoro Hashtag#Update Hashtag#NeueFunktionen Hashtag#Produktivität Hashtag#AppUpdate Hashtag#Sprachübersetzung Hashtag#Dokumentation -… mehr -Größere Bilddarstellung aktivieren, -Memoro, App Version 1.5, Update, Modi, Modes -Größere Bilddarstellung aktivieren, -likelovecelebrate -18 -1 Kommentar -6 Reposts - -Alle Beiträge anzeigen -BerufserfahrungBerufserfahrung -Logo von edisconet -Vertriebsmanager -Vertriebsmanager -edisconet · Selbstständigedisconet · Selbstständig -Sept. 2024–Heute · 1 JahrSept. 2024–Heute · 1 Jahr -Schweiz · RemoteSchweiz · Remote -Logo von Quentn.com GmbH -Partnermanager -Partnermanager -Quentn.com GmbH · SelbstständigQuentn.com GmbH · Selbstständig -Nov. 2023–Heute · 1 Jahr 10 MonateNov. 2023–Heute · 1 Jahr 10 Monate -Logo von OWNERMEETING -Geschäftsführer -Geschäftsführer -OWNERMEETING · SelbstständigOWNERMEETING · Selbstständig -Jan. 2021–Heute · 4 Jahre 8 MonateJan. 2021–Heute · 4 Jahre 8 Monate -Pfinztal, Baden-Württemberg, Deutschland · Vor OrtPfinztal, Baden-Württemberg, Deutschland · Vor Ort -Logo von doxx-on systems GmbH -Vertriebsmitarbeiter -Vertriebsmitarbeiter -doxx-on systems GmbH · Vollzeitdoxx-on systems GmbH · Vollzeit -Jan. 2023–Nov. 2023 · 11 MonateJan. 2023–Nov. 2023 · 11 Monate -Ettlingen, Baden-Württemberg, Deutschland · RemoteEttlingen, Baden-Württemberg, Deutschland · Remote -Logo von Erhardt Gruppe -Key-Account-Manager -Key-Account-Manager -Erhardt BüroweltErhardt Bürowelt -Juli 2007–Dez. 2022 · 15 Jahre 6 MonateJuli 2007–Dez. 2022 · 15 Jahre 6 Monate -Alle 9 Berufserfahrungen anzeigen -KenntnisseKenntnisse -Microsoft Office -Microsoft Office -1 Kenntnisbestätigung -1 Kenntnisbestätigung - -Bestätigen -Kundendienst -Kundendienst -1 Kenntnisbestätigung -1 Kenntnisbestätigung - -Bestätigen -Alle 11 Kenntnisse anzeigen -InteressenInteressen -UnternehmenUnternehmen -GruppenGruppen -NewsletterNewsletter -Logo von Greenpeace -Greenpeace -Greenpeace -635.071 Follower:innen635.071 Follower:innen - -Folgen -Logo von World Wildlife Fund -World Wildlife Fund -World Wildlife Fund -408.972 Follower:innen408.972 Follower:innen - -Folgen diff --git a/apps/memoro/apps/landing/context/team/Lucas-Mag-LinkedIn.md b/apps/memoro/apps/landing/context/team/Lucas-Mag-LinkedIn.md deleted file mode 100644 index f6a87008e..000000000 --- a/apps/memoro/apps/landing/context/team/Lucas-Mag-LinkedIn.md +++ /dev/null @@ -1,164 +0,0 @@ -Lucas Mag -Direkter Kontakt1. -Informatikspezialist Datensicherung bei Universität Zürich | University of Zurich - -Universität Zürich | University of Zurich - -Elektronikschule Tettnang -Jestetten, Baden-Württemberg, Deutschland Kontaktinfo -186 Kontakte - -Alex Vasileva, Tobias Müller und 5 weitere gemeinsame KontakteAlex Vasileva, Tobias Müller und 5 weitere gemeinsame Kontakte - -Nachricht - -Mehr -HighlightsHighlights -Unternehmenslogo -Lucas Mag folgt Ihrem Unternehmen auf LinkedIn -Lucas Mag folgt Ihrem Unternehmen auf LinkedIn -Lucas Mag kennt Ihre Marke und ist möglicherweise empfänglicher für eine Kontaktaufnahme.Lucas Mag kennt Ihre Marke und ist möglicherweise empfänglicher für eine Kontaktaufnahme. -Kostenlose Insights von LinkedIn Sales Navigator -Kostenlose Insights von LinkedIn Sales Navigator -Schalten Sie mehr Einblicke in Leads frei -Bessere Kontaktaufnahme mit vertriebsrelevanten Insights - -Sales Navigator für 0 CHF erneut testen -1 Probemonat mit Support rund um die Uhr. Sie können jederzeit kündigen. Sie erhalten 7 Tage vor Ablauf der Probeversion eine entsprechende Erinnerung. - -AktivitätenAktivitäten -186 Follower:innen186 Follower:innen - -9 „Beiträge“-Beiträge wurden geladen -Profilfoto von Lucas Mag -Lucas Mag hat dies repostet - -Link zur Grafik von Stephan Lienhard anzeigen -Stephan LienhardStephan Lienhard -• 2.Verifiziert • 2. -ICT Informatikspezialist an der Universität Zürich | IT-Architektur, Server, BackupICT Informatikspezialist an der Universität Zürich | IT-Architektur, Server, Backup -10 Monate • vor 10 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn -Wir suchen Verstärkung im Team :-) Bei Fragen gerne Melden! - -https://lnkd.in/dPrW3kkD - -UZH: ICT System Engineer -jobs.uzh.ch -like -8 -2 Reposts - -Profilfoto von Lucas Mag -Lucas Mag hat dies repostet - -Link zur Grafik von Marco Fernandez anzeigen -Marco FernandezMarco Fernandez -• 2.Premium • 2. -Manager Presales - ACH Switzerland and Austria @ Veeam Software | Technical SalesManager Presales - ACH Switzerland and Austria @ Veeam Software | Technical Sales -10 Monate • vor 10 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn -At yesterday's Meet the Architect with our customers and partners, the Universität Zürich | University of Zurich demonstrated how they use Veeam Software and the benefits it provides. We would like to thank all our enterprise customers partners who attended and look forward to the next Meet the Architect in Q1 2025. - -Many thanks to Lucas Mag for the excellent and detailed presentation. -Universität Zürich | University of Zurich, Veeam Software -… mehr -Größere Bilddarstellung aktivieren, -Keine alternative Textbeschreibung für dieses Bild vorhanden -Größere Bilddarstellung aktivieren, -likecelebrate -37 -1 Kommentar -1 Repost - -Alle Beiträge anzeigen -BerufserfahrungBerufserfahrung -Logo von Universität Zürich | University of Zurich -Informatikspezialist Datensicherung -Informatikspezialist Datensicherung -Universität Zürich | University of Zurich · VollzeitUniversität Zürich | University of Zurich · Vollzeit -Nov. 2022–Heute · 2 Jahre 10 MonateNov. 2022–Heute · 2 Jahre 10 Monate -Zürich, SchweizZürich, Schweiz -Inhaber -Inhaber -Inhaber -Haus & Heizungsautomatisierung · SelbstständigHaus & Heizungsautomatisierung · Selbstständig -Aug. 2022–Apr. 2025 · 2 Jahre 9 MonateAug. 2022–Apr. 2025 · 2 Jahre 9 Monate -Stühlingen, Baden-Württemberg, DeutschlandStühlingen, Baden-Württemberg, Deutschland -IT Dienstleistungen im Hausautomatisierungs- und Heizungsautomatisierungsbereich. -Ich helfe Ihnen den effizienten Weg zum autonomen Haus zu realisieren. -Das Thema Energieunabhängigkeit und effizientes Heizen war noch nie gefragter und unübersichtlicher. Profitieren auch Sie.IT Dienstleistungen im Hausautomatisierungs- und Heizungsautomatisierungsbereich. Ich helfe Ihnen den effizienten Weg zum autonomen Haus zu realisieren. Das Thema Energieunabhängigkeit und effizientes Heizen war noch nie gefragter und unübersichtlicher. Profitieren auch Sie.… mehr anzeigen -Erneuerbare Energien und IT-Beratung + 4 Kenntnisse -Logo von Bechtle -Bechtle -Bechtle -4 Jahre 3 Monate4 Jahre 3 Monate -System Engineer Backup -System Engineer Backup -VollzeitVollzeit -Juli 2021–Nov. 2022 · 1 Jahr 5 MonateJuli 2021–Nov. 2022 · 1 Jahr 5 Monate -Fachinformatiker Systemintegration -Fachinformatiker Systemintegration -AzubiAzubi -Sept. 2018–Juli 2021 · 2 Jahre 11 MonateSept. 2018–Juli 2021 · 2 Jahre 11 Monate -Friedrichshafen, Baden-Württemberg, DeutschlandFriedrichshafen, Baden-Württemberg, Deutschland -AusbildungAusbildung -Logo von CVJM -FSJ -FSJ -CVJM · Freiwilliges Soziales JahrCVJM · Freiwilliges Soziales Jahr -Aug. 2017–März 2018 · 8 MonateAug. 2017–März 2018 · 8 Monate -Borkum, Niedersachsen, DeutschlandBorkum, Niedersachsen, Deutschland -AusbildungAusbildung -Elektronikschule Tettnang -Elektronikschule Tettnang -Fachinformatiker Systemintegration, InformatikFachinformatiker Systemintegration, Informatik -2018–20212018–2021 -Naturwissenschaftlich-Technische Akademie Isny -Naturwissenschaftlich-Technische Akademie Isny -Naturwissenschaftlich-Technische Akademie Isny -Assistent für Informations & Kommunikationstechnik, InformatikAssistent für Informations & Kommunikationstechnik, Informatik -2015–20172015–2017 -KenntnisseKenntnisse -IT-Betrieb -IT-Betrieb -LinkedIn Kenntnistest bestandenLinkedIn Kenntnistest bestanden - -Bestätigen -IT-Beratung -IT-Beratung -Inhaber bei Haus & Heizungsautomatisierung Inhaber bei Haus & Heizungsautomatisierung - -Bestätigen -Alle 10 Kenntnisse anzeigen -KurseKurse -VMCEA -VMCEA -Unternehmenslogo -Assoziiert mit Bechtle -Assoziiert mit Bechtle -Veeam Certified Engineer -Veeam Certified Engineer -VMCEVMCE -Unternehmenslogo -Assoziiert mit Bechtle -Assoziiert mit Bechtle -OrganisationenOrganisationen -Feuerwehr -Feuerwehr -Mitglied des Feuerwehrausschuss, Feuerwehrmann · März 2016–Juli 2022Mitglied des Feuerwehrausschuss, Feuerwehrmann · März 2016–Juli 2022 -InteressenInteressen -UnternehmenUnternehmen -GruppenGruppen -NewsletterNewsletter -Hochschulen/BerufsschulenHochschulen/Berufsschulen -Logo von IBM -IBM -IBM -18.555.838 Follower:innen18.555.838 Follower:innen - -Folgen -Logo von Hewlett Packard Enterprise -Hewlett Packard Enterprise -Hewlett Packard Enterprise -3.673.541 Follower:innen3.673.541 Follower:innen - -Folgen diff --git a/apps/memoro/apps/landing/context/team/Nils-Weiser-LinkedIn.md b/apps/memoro/apps/landing/context/team/Nils-Weiser-LinkedIn.md deleted file mode 100644 index 60417d898..000000000 --- a/apps/memoro/apps/landing/context/team/Nils-Weiser-LinkedIn.md +++ /dev/null @@ -1,178 +0,0 @@ -Nils Weiser -test -Nils Weiser - Direkter Kontakt1. -Co-Founder Codify AG, Software Developer - -Codify - -HTWG Hochschule Konstanz – Technik, Wirtschaft und Gestaltung -Kreuzlingen, Thurgau, Schweiz Kontaktinfo -313 Kontakte - - -Tobias Müller, Jan Kaiser und 20 weitere gemeinsame KontakteTobias Müller, Jan Kaiser und 20 weitere gemeinsame Kontakte - -Nachricht - -Mehr -HighlightsHighlights -Unternehmenslogo -Nils Weiser folgt Ihrem Unternehmen auf LinkedIn -Nils Weiser folgt Ihrem Unternehmen auf LinkedIn -Nils Weiser kennt Ihre Marke und ist möglicherweise empfänglicher für eine Kontaktaufnahme.Nils Weiser kennt Ihre Marke und ist möglicherweise empfänglicher für eine Kontaktaufnahme. -Kostenlose Insights von LinkedIn Sales Navigator -Kostenlose Insights von LinkedIn Sales Navigator -Schalten Sie mehr Einblicke in Leads frei -Bessere Kontaktaufnahme mit vertriebsrelevanten Insights - -Sales Navigator für 0 CHF erneut testen -1 Probemonat mit Support rund um die Uhr. Sie können jederzeit kündigen. Sie erhalten 7 Tage vor Ablauf der Probeversion eine entsprechende Erinnerung. - -AktivitätenAktivitäten -319 Follower:innen319 Follower:innen - - -Beiträge - -Kommentare - -Bilder -9 „Beiträge“-Beiträge wurden geladen -Link zur Grafik von Nils Weiser anzeigen -Nils WeiserNils Weiser - • 1.1. -Co-Founder Codify AG, Software DeveloperCo-Founder Codify AG, Software Developer -3 Monate • Bearbeitet • vor 3 Monaten • Bearbeitet • Alle Mitglieder und Nicht-Mitglieder von LinkedIn - -Just watched an insightful video from Y Combinator with Tom on "vibe coding" with AI tools. Here are the game-changing tips I found most valuable: - -1. Start with a comprehensive plan before diving into code - work section by section -2. Use version control religiously (Git is your friend!) -3. Write high-level integration tests to catch regressions -4. For bugs, simply copy-paste error messages directly to the LLM -5. Create detailed instruction files for your AI coding assistant -6. Choose tech stacks with established conventions (like Rails) for better results - -Personal experience: -when running into error loops of llm calls, stop it, and tell explicitly to use the browser tool to get more context. -We also use a tech stack which is well established (Frontend: react, backend: express). -Writing tests is crucial, especially when Windsurf come with a huge wave of changes to your code base 😃 - -Bonus: for security you can prompt it to act in a red/blue team manner and should audit your code, this should prevent the api key leaks im reading recently on linkedIn with vibe coded products -… mehr -Größere Bilddarstellung aktivieren, -Keine alternative Textbeschreibung für dieses Bild vorhanden -Größere Bilddarstellung aktivieren, -likeinsightful -3 - -like - - - -Link zur Grafik von Nils Weiser anzeigen -Nils WeiserNils Weiser - • 1.1. -Co-Founder Codify AG, Software DeveloperCo-Founder Codify AG, Software Developer -5 Monate • Bearbeitet • vor 5 Monaten • Bearbeitet • Alle Mitglieder und Nicht-Mitglieder von LinkedIn - -MCP Tools für IDE's! - -MCP ist der Standard, um AI zu enhancen, und ist jetzt auch für die meisten IDE's verfügbar! - -Ich habe heute BraveSearch integriert, damit mein LLM immer auf die neuesten Informationen zugreifen kann – ganz ohne lästiges Hin- und Herspringen zwischen Tools. - -Nutzt ihr schon MCP Tools? Welche findet ihr am sinnvollsten? - -Open Source: -https://smithery.ai/ -https://glama.ai/mcp/tools -Hashtag#MCP Hashtag#AI Hashtag#IDEs Hashtag#OpenSource Hashtag#BraveSearch -… mehr -Größere Bilddarstellung aktivieren, -Keine alternative Textbeschreibung für dieses Bild vorhanden -Größere Bilddarstellung aktivieren, -likeinsightful -9 -2 Kommentare - -like - - - - -Alle Beiträge anzeigen -BerufserfahrungBerufserfahrung -Logo von Codify -Co-Founder Codify AG, Software Developer -Co-Founder Codify AG, Software Developer -Codify · VollzeitCodify · Vollzeit -Feb. 2019–Heute · 6 Jahre 7 MonateFeb. 2019–Heute · 6 Jahre 7 Monate -Kreuzlingen, Thurgau, SchweizKreuzlingen, Thurgau, Schweiz -Logo von BMT - Business meets Technology AG -Full-Stack-Entwickler -Full-Stack-Entwickler -BMT Business meets Technology AG · VollzeitBMT Business meets Technology AG · Vollzeit -März 2018–Jan. 2019 · 11 MonateMärz 2018–Jan. 2019 · 11 Monate -Logo von T-Systems Schweiz -Studentischer Entwickler -Studentischer Entwickler -T-Systems Schweiz · TeilzeitT-Systems Schweiz · Teilzeit -Mai 2017–Sept. 2017 · 5 MonateMai 2017–Sept. 2017 · 5 Monate -Logo von timeghost -Web-Entwickler -Web-Entwickler -Köllisch Gesellschaft für Prozessmanagement mbH · PraktikumKöllisch Gesellschaft für Prozessmanagement mbH · Praktikum -Juli 2014–Juni 2015 · 1 JahrJuli 2014–Juni 2015 · 1 Jahr -Konstanz, Baden-Württemberg, DeutschlandKonstanz, Baden-Württemberg, Deutschland -AusbildungAusbildung -Logo von HTWG Hochschule Konstanz – Technik, Wirtschaft und Gestaltung -HTWG Hochschule Konstanz – Technik, Wirtschaft und Gestaltung -HTWG Hochschule Konstanz – Technik, Wirtschaft und Gestaltung -InformatikInformatik -Bescheinigungen und ZertifikateBescheinigungen und Zertifikate -Logo von CrewAI -Multi AI Agent Systems -Multi AI Agent Systems -CrewAICrewAI -Ausgestellt: Aug. 2024Ausgestellt: Aug. 2024 -AI Agent - -Nils Weiser_badge.pdfNils Weiser_badge.pdf -Learn AI Agents -Learn AI Agents -Learn AI Agents -ScrimbaScrimba -Ausgestellt: Juni 2024Ausgestellt: Juni 2024 -Zertifikats-ID: 2QEZCHUJ2DSTZertifikats-ID: 2QEZCHUJ2DST -Nachweis anzeigen -Alle 4 Bescheinigungen und Zertifikate anzeigen -KenntnisseKenntnisse -AI Agent -AI Agent -Unternehmenslogo -Multi AI Agent SystemsMulti AI Agent Systems - -Bestätigen -REST-API -REST-API -LinkedIn Kenntnistest bestandenLinkedIn Kenntnistest bestanden - -Bestätigen -Alle 11 Kenntnisse anzeigen -InteressenInteressen -UnternehmenUnternehmen -GruppenGruppen -NewsletterNewsletter -Hochschulen/BerufsschulenHochschulen/Berufsschulen -Logo von Microsoft -Microsoft -Microsoft -26.068.419 Follower:innen26.068.419 Follower:innen - -Folgen -Logo von Google -Google -Google -38.360.676 Follower:innen \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/team/Till-Schneider-LinkedIn.md b/apps/memoro/apps/landing/context/team/Till-Schneider-LinkedIn.md deleted file mode 100644 index caec10d9e..000000000 --- a/apps/memoro/apps/landing/context/team/Till-Schneider-LinkedIn.md +++ /dev/null @@ -1,183 +0,0 @@ -Till Schneider - er/ihm Verifizierungs-Badge hinzufügen -Expand your thinking - Memoro.ai - -Memoro -Tägerwilen, Thurgau, Schweiz Kontaktinfo -500+ Kontakte -Offen für - -Profil ergänzen - -Profil verbessern - -Ressourcen -Zeigen Sie, dass Sie offen für Jobangebote sind. Sie bestimmen, wer diesen Hinweis sieht. - -Loslegen - - -Sie stellen ein? Teilen Sie Ihre Stellenanzeigen und ziehen Sie qualifizierte Talente an. - -Loslegen - - -Präsentieren Sie Ihre Serviceleistungen in einem eigenen Abschnitt in Ihrem Profil, damit Ihr Unternehmen leichter zu finden ist. - -Loslegen - - - -Vorschläge für SieVorschläge für Sie - Nur für Sie sichtbar Nur für Sie sichtbar - -Schildern Sie, wer Sie sind, wie Sie ticken und was Sie beruflich auszeichnetSchildern Sie, wer Sie sind, wie Sie ticken und was Sie beruflich auszeichnet -Die Profile von Mitgliedern mit einer Zusammenfassung werden bis zu 3,9 Mal häufiger angesehen. -Die Profile von Mitgliedern mit einer Zusammenfassung werden bis zu 3,9 Mal häufiger angesehen. -Zusammenfassung hinzufügen -AnalysenAnalysen - Nur für Sie sichtbar Nur für Sie sichtbar - -43 Profilansichten -43 Profilansichten -Finden Sie heraus, wer Ihr Profil besucht hat.Finden Sie heraus, wer Ihr Profil besucht hat. -4 Beitrag-Impressions -4 Beitrag-Impressions -Sehen Sie sich an, wer auf Ihre Beiträge reagiert hat.Sehen Sie sich an, wer auf Ihre Beiträge reagiert hat. -Vergangene 7 TageVergangene 7 Tage -48 Mal in Suchen erschienen -48 Mal in Suchen erschienen -Finden Sie heraus, wie oft Sie in Suchen angezeigt wurden.Finden Sie heraus, wie oft Sie in Suchen angezeigt wurden. -Alle Analysen anzeigen -AktivitätenAktivitäten -601 Follower:innen601 Follower:innen - -Beitrag erstellen - -Beiträge - -Kommentare - -Artikel -9 „Beiträge“-Beiträge wurden geladen -Link zur Grafik von Till Schneider anzeigen -Till SchneiderTill Schneider - • SieSie -Expand your thinking - Memoro.aiExpand your thinking - Memoro.ai -3 Monate • vor 3 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn - -Ist KI der Kreativitätskiller? Warum der Durchschnitt nicht reicht und unsere Zukunft von menschlicher Intuition, Geschmack und ja – sogar Fehlern – abhängt. Ein Plädoyer für weniger digitale Glätte und mehr echtes Leben. -… mehr - -Jenseits des Durchschnitts: Warum unsere digitale Zukunft mehr menschliches Chaos braucht -Till Schneider -like -7 -1 Kommentar - - - - -Profilfoto von Till Schneider -Till Schneider hat dies repostet - - -MemoroMemoro -219 Follower:innen219 Follower:innen -6 Monate • vor 6 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn -Wir wünschen Euch allen ein frohes Neues 2025 - vor Allem das "Neu" stand bei uns die letzten zwei Monate an erster Stelle, da wir mit Hochdruck an Memoro 2.0 arbeiten. - -Till Schneider und Tobias Müller waren dazu im Podcast programmier.bar zu Besuch und haben über Ihre Entwicklungserfahrungen berichtet: Low Code: Freiheit oder Limitierung? - -Im Gespräch erzählen wir: -Low Code Boost: Wie wir dank Low Code unglaublich schnell prototypen und iterieren konnten. - -Die Grenzen von Low Code: Warum wir uns entschieden haben, auf einen anderen Stack zu wechseln. - -Unsere Erkenntnisse: Low Code ist genial für den schnellen Start – aber wenn es ums Skalieren und eine perfekte User Experience geht, braucht es Flexibilität und Kontrolle. - -Reinhören lohnt sich! Die ganze Folge gibt’s hier: https://lnkd.in/eYcd8kRq - -Neugierig auf Memoro? Hier geht’s zur App: https://lnkd.in/eazwPffG - - Hashtag#LowCode Hashtag#NoCode Hashtag#Startup Hashtag#Produktentwicklung Hashtag#Podcast Hashtag#App Hashtag#Innovation Hashtag#Memoro Hashtag#Tools Hashtag#Digitalisierung -… mehr -168 Ig Fb Low Code Mit Till Schneider & Tobias Müller -Deep Dive 168 – Low Code mit Till Schnei... | programmier.bar -programmier.bar -likecelebrate -22 -1 Repost - - - - - -Alle Beiträge anzeigen -BerufserfahrungBerufserfahrung - -Logo von Memoro -Geschäftsführer, Founder -Geschäftsführer, Founder -Memoro · VollzeitMemoro · Vollzeit -Juli 2023–Heute · 2 Jahre 2 MonateJuli 2023–Heute · 2 Jahre 2 Monate -Konstanz, Baden-Württemberg, Deutschland · HybridKonstanz, Baden-Württemberg, Deutschland · Hybrid -Start-up-Unternehmen und Softwareentwicklung + 7 Kenntnisse -Filmemacher -Filmemacher -Filmemacher -Till Jakob · SelbstständigTill Jakob · Selbstständig -Juli 2011–Heute · 14 Jahre 2 MonateJuli 2011–Heute · 14 Jahre 2 Monate -Tägerwilen, Thurgau, SchweizTägerwilen, Thurgau, Schweiz -Kameramann und Storytelling + 3 Kenntnisse - - -Logo von inlume -inlume -inlume -Vollzeit · 2 Jahre 11 MonateVollzeit · 2 Jahre 11 Monate -Tägerwilen, Thurgau, SchweizTägerwilen, Thurgau, Schweiz -Geschäftsführer -Geschäftsführer -Okt. 2020–Aug. 2023 · 2 Jahre 11 MonateOkt. 2020–Aug. 2023 · 2 Jahre 11 Monate -UX-Design -Co-Founder -Co-Founder -Okt. 2020–Aug. 2023 · 2 Jahre 11 MonateOkt. 2020–Aug. 2023 · 2 Jahre 11 Monate -Start-up-Unternehmen -AusbildungAusbildung -Logo von Duale Hochschule Baden-Württemberg -Duale Hochschule Baden-Württemberg -Duale Hochschule Baden-Württemberg -Bachelor of Arts - BA, MediendesignBachelor of Arts - BA, Mediendesign -2017–20202017–2020 -KenntnisseKenntnisse -Branding -Branding -Unternehmenslogo -Geschäftsführer, Founder bei MemoroGeschäftsführer, Founder bei Memoro -UX-Design -UX-Design -Unternehmenslogo -2 Erfahrungen bei Memoro und 1 weiteren Unternehmen2 Erfahrungen bei Memoro und 1 weiteren Unternehmen -Alle 21 Kenntnisse anzeigen -InteressenInteressen -Top VoicesTop Voices -UnternehmenUnternehmen -GruppenGruppen -NewsletterNewsletter -Hochschulen/BerufsschulenHochschulen/Berufsschulen -Lex Fridman -Lex Fridman -Lex Fridman -· 3.Kontakt 3. Grades -Research Scientist, MITResearch Scientist, MIT -1.709.773 Follower:innen1.709.773 Follower:innen - -Follower:in -Simon Sinek -Simon Sinek -Simon Sinek -· 3.Kontakt 3. Grades -Optimist, New York Times bestselling author of "Start with Why" and "The Infinite Game", and founder of The Optimism CompanyOptimist, New York Times bestselling author of "Start with Why" and "The Infinite Game", and founder of The Optimism Company -8.629.584 Follower:innen \ No newline at end of file diff --git a/apps/memoro/apps/landing/context/team/Tobias-Mueller-LinkedIn.md b/apps/memoro/apps/landing/context/team/Tobias-Mueller-LinkedIn.md deleted file mode 100644 index bd1131d07..000000000 --- a/apps/memoro/apps/landing/context/team/Tobias-Mueller-LinkedIn.md +++ /dev/null @@ -1,286 +0,0 @@ -Tobias Müller -er/ihm Direkter Kontakt1. -Expand your thinking - Memoro.ai - -Memoro -Ispringen, Baden-Württemberg, Deutschland Kontaktinfo -82 Kontakte - -Alex Vasileva, Gernot Doriat und 56 weitere gemeinsame KontakteAlex Vasileva, Gernot Doriat und 56 weitere gemeinsame Kontakte - -Nachricht - -Mehr -HighlightsHighlights -Logo von Memoro -Sie sind beide bei Memoro beschäftigt. -Sie sind beide bei Memoro beschäftigt. -Tobias Müller hat 1 Monat vor Ihnen bei Memoro angefangen.Tobias Müller hat 1 Monat vor Ihnen bei Memoro angefangen. -Nachricht -InfoInfo -Hello out there ! -My name is Tobias Müller and I would like to introduce myself briefly. -I define myself as a "full-stack developer" and really have a soft spot for everything new and innovative. -Influenced by my professional past and the foundation of a start-up, I have a strong independent way of thinking and a lot of passion in development. -Two principles are important in my life: -First, always try to broaden your horizon. -And second, always go one step further. - -I'm really looking forward to hearing from you. - -Best regards -Tobias MüllerHello out there ! My name is Tobias Müller and I would like to introduce myself briefly. I define myself as a "full-stack developer" and really have a soft spot for everything new and innovative. Influenced by my professional past and the foundation of a start-up, I have a strong independent way of thinking and a lot of passion in development. Two principles are important in my life: First, always try to broaden your horizon. And second, always go one step further. I'm really looking forward to hearing from you. Best regards Tobias Müller… mehr anzeigen -ServiceleistungenServiceleistungen -Webentwicklung • Entwicklung kundenspezifischer Software • App-Entwicklung • App-Entwicklung für Mobilgeräte • Entwicklung von Cloud-AnwendungenWebentwicklung • Entwicklung kundenspezifischer Software • App-Entwicklung • App-Entwicklung für Mobilgeräte • Entwicklung von Cloud-Anwendungen -Serviceleistungen anfordern -Alle Serviceleistungen anzeigen -AktivitätenAktivitäten -87 Follower:innen87 Follower:innen - -9 „Beiträge“-Beiträge wurden geladen -Link zur Grafik von Tobias Müller anzeigen -Tobias MüllerTobias Müller -• 1.1. -Expand your thinking - Memoro.aiExpand your thinking - Memoro.ai -10 Monate • vor 10 Monaten • Alle Mitglieder und Nicht-Mitglieder von LinkedIn - -🔥♥️🪩🎉🥳🎈🥂🍹🍻🎤 - -MemoroMemoro -219 Follower:innen219 Follower:innen -Ein Jahr Memoro und 32 Jahre Tobi! 🎉🎂 Am Wochenende haben wir den Geburtstag unseres Mitgründers und IT-Zauberers Tobi gefeiert – und gleichzeitig auf ein fantastisches erstes Jahr mit Memoro angestoßen! 🥳✨ -In bester Gesellschaft, umgeben von unseren Lieblingsmenschen, haben wir ein unvergessliches Wochenende voller Spannung, Spaß und positiver Emotionen verbracht. 🤩🥂 Mit Memoro möchten wir mehr Raum für das Wichtigste im Leben schaffen – die kostbare Zeit mit den Menschen, die unsere Arbeit und unser Leben bereichern. 💖🌟 -Alles Gute zum Geburtstag, Tobi! 🎂🎈 Auf viele weitere Jahre voller Magie und gemeinsamer Erinnerungen! 🎊 -Dieses Wochenende haben wir viele tolle Gespräche geführt und natürlich mit Memoro festgehalten. -Lade Dir Memoro kostenlos herunter: https://lnkd.in/eazwPffG - -Tobias Müller Till Schneider Dirk Zimanky Ludwig Kaftan Albashir Mohamed Jose Ignacio Campos Domínguez -… mehr -Größere Bilddarstellung aktivieren, -Keine alternative Textbeschreibung für dieses Bild vorhanden -1/10 -Größere Bilddarstellung aktivieren, -likelovecelebrate -9 -1 Kommentar - -Profilfoto von Tobias Müller -Tobias Müller hat dies repostet - -MemoroMemoro -219 Follower:innen219 Follower:innen -1 Jahr • Bearbeitet • vor 1 Jahr • Bearbeitet • Alle Mitglieder und Nicht-Mitglieder von LinkedIn -🚀 Innovationsschub beim BW Startup Summit in Stuttgart! - -Unser Team tauchte ein in eine Welt voller kreativer Ideen - von Mode bis Medizin. Highlights: - -- Spannender Ideenaustausch mit Gleichgesinnten -- Till's Präsentation von Memoro auf dem Startup Festival -- Networking beim Kicker-Match (Fußballfieber inklusive!) - -Unsere Key Learnings: - -- Alex: "Die Startup-Welt ist bunt. Leidenschaft und Kreativität sind der Schlüssel zum Erfolg." -- Till: "Faszinierende Spezialisierungen. Mehr Vernetzung könnte Synergien schaffen." -- Tobi: "Startup-Events sind Magneten für inspirierende Gespräche." - -Danke an alle Inspirationsquellen, besonders Julia Zimmermann, Timon Sutter (Eversion), Antje Freyth, Robert Rapp, Jan Marvin Wickert, Simone Harr, Dmitriy Sevkovych, Ira Romy Alice Stoll, Jürke Hartz (myScribe) und Kolja B.. -, mit denen wir tolle Gespräche führen konnten, die natürlich mit Memoro festgehalten wurden. Lade Memoro kostenlos herunter: https://lnkd.in/eazwPffG - -Was war euer letztes Startup-Event? Teilt eure Erfahrungen in den Kommentaren! - -Hashtag#BWStartupSummit Hashtag#Innovation Hashtag#Networking Hashtag#StartupLife -… mehr -Größere Bilddarstellung aktivieren, -Keine alternative Textbeschreibung für dieses Bild vorhanden -1/4 -Größere Bilddarstellung aktivieren, -likecelebrate -51 -3 Kommentare -4 Reposts - -Alle Beiträge anzeigen -BerufserfahrungBerufserfahrung -Logo von Memoro -Founder -Founder -Memoro · VollzeitMemoro · Vollzeit -Juni 2023–Heute · 2 Jahre 3 MonateJuni 2023–Heute · 2 Jahre 3 Monate -Founder bei MemoroFounder bei Memoro -Freelancer -Freelancer -Freelancer -Tobias Müller Software Entwicklung · SelbstständigTobias Müller Software Entwicklung · Selbstständig -Juni 2021–Juni 2023 · 2 Jahre 1 MonatJuni 2021–Juni 2023 · 2 Jahre 1 Monat -UI und JavaScript + 22 Kenntnisse -Backend Entwicklung -Backend Entwicklung -Backend Entwicklung -DEKRA SE · FreiberuflichDEKRA SE · Freiberuflich -Nov. 2021–Aug. 2022 · 10 MonateNov. 2021–Aug. 2022 · 10 Monate -Global CMS Redesign - -• Projekt Initiierung mit npm workspaces -• Backend Entwicklung mit Nest.js -• Planung der Azure Cloud Architektur -• Cloud Migration zu Azure Cloud -• Einrichten der Azure DevOps Pipeline (CI/CD) - -Knowledge: -TypeScript, Node.js, npm workspaces, Docker, Cloud, Agile, CI/CD - -Products: -JetBrains, Docker, Azure Cloud, Azure DevOps, Conflunce, JIRA, Bitbucket, Git, Notion, Ubuntu, Nest.js, Elastic Search, OWASPGlobal CMS Redesign • Projekt Initiierung mit npm workspaces • Backend Entwicklung mit Nest.js • Planung der Azure Cloud Architektur • Cloud Migration zu Azure Cloud • Einrichten der Azure DevOps Pipeline (CI/CD) Knowledge: TypeScript, Node.js, npm workspaces, Docker, Cloud, Agile, CI/CD Products: JetBrains, Docker, Azure Cloud, Azure DevOps, Conflunce, JIRA, Bitbucket, Git, Notion, Ubuntu, Nest.js, Elastic Search, OWASP… mehr anzeigen -JavaScript und Databases + 15 Kenntnisse -Startup Founder -Startup Founder -Startup Founder -compan.one · Vollzeitcompan.one · Vollzeit -Sept. 2020–Okt. 2021 · 1 Jahr 2 MonateSept. 2020–Okt. 2021 · 1 Jahr 2 Monate -Software für Führungskräfte - -• Begleitung des Projektes als Teil des Design-Thinking-Teams -• Einsatz verschiedenster Prototypen (Mockup, Click-Dummy, concierge MVP) -• Entwicklung einer Progressiv Web App inkl. CMS Backend -• Fokus auf UsablititySoftware für Führungskräfte • Begleitung des Projektes als Teil des Design-Thinking-Teams • Einsatz verschiedenster Prototypen (Mockup, Click-Dummy, concierge MVP) • Entwicklung einer Progressiv Web App inkl. CMS Backend • Fokus auf Usablitity… mehr anzeigen -UI und JavaScript + 26 Kenntnisse -Teamleader - Software Development -Teamleader - Software Development -Teamleader - Software Development -Conecpt Hero · TeilzeitConecpt Hero · Teilzeit -Apr. 2019–Okt. 2020 · 1 Jahr 7 MonateApr. 2019–Okt. 2020 · 1 Jahr 7 Monate -Heilbronn (Landkreis), Baden-Württemberg, DeutschlandHeilbronn (Landkreis), Baden-Württemberg, Deutschland -Software Entwicklung mit dem Schwerpunkt Prototyping -Teamleitung, Projektmanagement und Optimierung der Unternehmensprozesse - -Knowledge: -JavaScript, TypeScript, Node.js, Express.js, Vue.js, React.js, HTML, CSS, SQL, PWA, Java, Python, C#, UI, UX, Usability Testing, Unity3D, VR, AR, Agile, Prototyping, Capacitor, Ionic, Cordova - -Products: -Docker, Gitlab, Bitbucket, Git, Ubuntu, ARKit, ARCore, AR Foundation, JetBrains IDE, VS Code, Android, iOS, WearOS, Firebase, Google CloudSoftware Entwicklung mit dem Schwerpunkt Prototyping Teamleitung, Projektmanagement und Optimierung der Unternehmensprozesse Knowledge: JavaScript, TypeScript, Node.js, Express.js, Vue.js, React.js, HTML, CSS, SQL, PWA, Java, Python, C#, UI, UX, Usability Testing, Unity3D, VR, AR, Agile, Prototyping, Capacitor, Ionic, Cordova Products: Docker, Gitlab, Bitbucket, Git, Ubuntu, ARKit, ARCore, AR Foundation, JetBrains IDE, VS Code, Android, iOS, WearOS, Firebase, Google Cloud… mehr anzeigen -UI und JavaScript + 35 Kenntnisse -Alle 12 Berufserfahrungen anzeigen -AusbildungAusbildung -Logo von Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Bachelor of Science - BS, Software EngineeringBachelor of Science - BS, Software Engineering -März 2016–Sept. 2020März 2016–Sept. 2020 -Bachelor of Science Software Engineering mit der Vertiefung Games EngineeringBachelor of Science Software Engineering mit der Vertiefung Games Engineering -Linux und Full-Stack + 37 Kenntnisse -Logo von Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Bachelor of Science - BS, Software EngineeringBachelor of Science - BS, Software Engineering -2016–20202016–2020 -Linux und Full-Stack + 37 Kenntnisse -Alle 7 Ausbildungen anzeigen -Bescheinigungen und ZertifikateBescheinigungen und Zertifikate -Logo von Vabro.ai and VMEdu.com (Scrum/Kanban/AI/Business Analysis/OKRs/Six Sigma/Sales and Marketing etc.) -Scrum Fundamentals Certified -Scrum Fundamentals Certified -Vabro.ai and VMEdu.com (Scrum/Kanban/AI/Business Analysis/OKRs/Six Sigma/Sales and Marketing etc.)Vabro.ai and VMEdu.com (Scrum/Kanban/AI/Business Analysis/OKRs/Six Sigma/Sales and Marketing etc.) -Ausgestellt: Juni 2017Ausgestellt: Juni 2017 -Zertifikats-ID: 582311Zertifikats-ID: 582311 -Scrum -Startup Simulation - STARTUP | edu -Startup Simulation - STARTUP | edu -Startup Simulation - STARTUP | edu -STARTUP | eduSTARTUP | edu -Ausgestellt: Mai 2017Ausgestellt: Mai 2017 -Prototyping und Startup -Alle 5 Bescheinigungen und Zertifikate anzeigen -EhrenamtEhrenamt -Voluntary assistant for logistics and transport -Voluntary assistant for logistics and transport -Voluntary assistant for logistics and transport -DreamCenter Sozialwerk e.V.DreamCenter Sozialwerk e.V. -März 2016–Feb. 2017 · 1 JahrMärz 2016–Feb. 2017 · 1 Jahr -ArmutsbekämpfungArmutsbekämpfung -Voluntary assistant for logistics and transportVoluntary assistant for logistics and transport -Logo von Lernstiftung Hück -Voluntary position as Information Technology Coordinator -Voluntary position as Information Technology Coordinator -Lernstiftung HückLernstiftung Hück -Feb. 2016 · 1 MonatFeb. 2016 · 1 Monat -Unterstützung benachteiligter GruppenUnterstützung benachteiligter Gruppen - -- Voluntary position as Information Technology Coordinator -- System Installation -- Rights Management -- Network Configuration -- Support in the supervision- Voluntary position as Information Technology Coordinator - System Installation - Rights Management - Network Configuration - Support in the supervision… mehr anzeigen - KenntnisseKenntnisse - Git - Git - 7 Erfahrungen bei Tobias Müller Software Entwicklung und 6 weiteren Unternehmen7 Erfahrungen bei Tobias Müller Software Entwicklung und 6 weiteren Unternehmen - Unternehmenslogo - 7 Ausbildungserfahrungen bei Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik und 4 weiteren Ausbildungsstätten7 Ausbildungserfahrungen bei Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik und 4 weiteren Ausbildungsstätten - -Bestätigen -Frontend -Frontend -6 Erfahrungen bei Tobias Müller Software Entwicklung und 5 weiteren Unternehmen6 Erfahrungen bei Tobias Müller Software Entwicklung und 5 weiteren Unternehmen -Unternehmenslogo -7 Ausbildungserfahrungen bei Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik und 4 weiteren Ausbildungsstätten7 Ausbildungserfahrungen bei Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik und 4 weiteren Ausbildungsstätten - -Bestätigen -Alle 48 Kenntnisse anzeigen -Auszeichnungen/PreiseAuszeichnungen/Preise -Letter of Recommendation for Tobias Müller -Letter of Recommendation for Tobias Müller -Von: Prof. Dr. Tim Reichert · Juni 2020Von: Prof. Dr. Tim Reichert · Juni 2020 -Logo von Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Assoziiert mit Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Assoziiert mit Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Letter of Recommendation for Tobias Müller -Heilbronn, 17 June 2020 - -Prof. Dr. Tim Reichert -Games Engineering -Heilbronn University -of Applied Sciences -Max-Planck-Str. 39 -74081 Heilbronn, Germany - -> > Document only on request<>Document only on request<<… mehr anzeigen -> > Winner - Fujitsu Botathon -> > Winner - Fujitsu Botathon -> > Juli 2019Juli 2019 - -1. Place at Automation Inspiration University Botathon - -Topic: Explore Anywhere1. Place at Automation Inspiration University Botathon Topic: Explore Anywhere… mehr anzeigen -Alle 4 Auszeichnungen/Preise anzeigen -OrganisationenOrganisationen -Hochschule Heilbronn -Hochschule Heilbronn -Faculty council IT · Sept. 2017–Feb. 2018 Faculty council IT · Sept. 2017–Feb. 2018 -Logo von Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Assoziiert mit Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Assoziiert mit Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Studentischer Vertreter (Gemäß LHG §25)Studentischer Vertreter (Gemäß LHG §25) -Hochschule Heilbronn -Hochschule Heilbronn -Student council IT · März 2017–Aug. 2017Student council IT · März 2017–Aug. 2017 -Logo von Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Assoziiert mit Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Assoziiert mit Hochschule Heilbronn - Hochschule für Technik, Wirtschaft und Informatik -Member of the student council IT. - -Implementation of projects for quality assurance of teaching and studies.Member of the student council IT. Implementation of projects for quality assurance of teaching and studies.… mehr anzeigen -Alle 3 Organisationen anzeigen -InteressenInteressen -UnternehmenUnternehmen -Hochschulen/BerufsschulenHochschulen/Berufsschulen -Logo von heise -heise -heise -24.100 Follower:innen24.100 Follower:innen - -Folgen -Logo von Stack Overflow -Stack Overflow -Stack Overflow -1.580.636 Follower:innen1.580.636 Follower:innen diff --git a/apps/memoro/apps/landing/context/team/nils_profile.md b/apps/memoro/apps/landing/context/team/nils_profile.md deleted file mode 100644 index 639187663..000000000 --- a/apps/memoro/apps/landing/context/team/nils_profile.md +++ /dev/null @@ -1,68 +0,0 @@ -# Nils Weiser - -## CTO bei Memoro - -Nils Weiser ist seit Mai 2025 CTO bei Memoro und bringt eine einzigartige Kombination aus unternehmerischer Erfahrung und technischer Leidenschaft mit. Als Co-Founder der Codify AG seit 2019 hat er gelernt, wie man technologische Visionen in funktionierende Produkte verwandelt – durch viel Ausprobieren und gelegentliches Scheitern. - -## Der Entdecker-Entwickler - -"We are at our human finest, dancing with our minds, when there are more choices than ten, even twenty different ways to go, all but one bound to be wrong, and the richness of the selection in such situations can lift us onto totally new ground."\* Dieses Zitat bringt Nils' Philosophie auf den Punkt: Trial and Error ist für ihn kein bloßes Verfahren, sondern eine Kunstform — ein Tanz zwischen Irrtum und Erkenntnis. - -Seine Reise begann früh – mit 16 programmierte er seinen ersten Taschenrechner in C++. Was als Neugier begann, wurde zu einer lebenslangen Leidenschaft für das Erkunden technischer Möglichkeiten. Diese Leidenschaft führte ihn dazu, an einigen der größten Apps der Schweiz mitzuarbeiten und sogar für das Bundesamt zu entwickeln. - -Als Co-Founder der Codify AG in Kreuzlingen sammelt Nils seit über 6 Jahren Erfahrung im Aufbau von Software-Unternehmen. Diese unternehmerische Perspektive kombiniert mit seiner technischen Experimentierfreude macht ihn zum idealen CTO für Memoros nächste Wachstumsphase. - -## Technische Expertise - -### Full-Stack mit Experimentierfreude - -Mit seiner Trial-and-Error-Mentalität hat sich Nils ein breites technisches Spektrum erarbeitet: - -```javascript -// Nils' Approach to Tech -function solveProblem(challenge, availableTools) { - const myApproach = "trial_and_error"; - const timeToLearn = "as_long_as_it_takes"; - - const bestTool = findOptimalSolution(challenge, availableTools); - - // Whether it's Rust, Go, Python, TypeScript, or that new - // framework everyone's talking about... - const result = experiment(bestTool) - .then(() => "got it working!") - .catch((error) => { - learnFromMistakes(error); - const remainingTools = availableTools.filter((tool) => tool !== bestTool); - return solveProblem(challenge, remainingTools); - }); - - return result; // 🚀 -} - -// Current toolkit (but always expanding): -const expertise = { - frontend: ["Angular", "React", "Vue", "plain", "whatever_works"], - backend: [ - "Node.js", - "SpringBoot", - "GO", - "Express", - "FastAPI", - "if_needed_anything", - ], - ai: ["MCP Tools", "AI Agents", "LLM Integration"], - testing: ["Jest", "Cypress", "the_art_of_breaking_things"], - devops: ["Git", "Docker", "CI/CD", "Terraform", "making_it_work_everywhere"], - philosophy: ["trial_and_error", "fail_fast_learn_faster"], -}; -``` - -_"Die beste Sprache ist die, die das Problem löst. Die beste Library ist die, die funktioniert. Der beste Ansatz ist der, der nach ein paar Fehlversuchen zum Ziel führt."_ - ---- - -**Zitat-Referenz:** - -- **Autor**: Lewis Thomas -- **Werk**: Essay _„Computers"_ in _The Medusa and the Snail: More Notes of a Biology Watcher_ (1974, überarbeitete Ausgabe 1979) -- **Zitaterweiterung**: Auch aufgeführt als Teil von _A Long Line of Cells: Collected Essays_ diff --git a/apps/memoro/apps/landing/context/testimonials/Bildschirmfoto 2025-08-11 um 20.33.32.png b/apps/memoro/apps/landing/context/testimonials/Bildschirmfoto 2025-08-11 um 20.33.32.png deleted file mode 100644 index a5e1f29b4..000000000 Binary files a/apps/memoro/apps/landing/context/testimonials/Bildschirmfoto 2025-08-11 um 20.33.32.png and /dev/null differ diff --git a/apps/memoro/apps/landing/conversion/ConversionOptimizationTipps.md b/apps/memoro/apps/landing/conversion/ConversionOptimizationTipps.md deleted file mode 100644 index 49d6d6bb8..000000000 --- a/apps/memoro/apps/landing/conversion/ConversionOptimizationTipps.md +++ /dev/null @@ -1,254 +0,0 @@ -Basierend auf der - Memoro-Website und - Best Practices für - SaaS-Landingpages, - hier sind sinnvolle - A/B-Tests: - - 🎯 Empfohlene - A/B-Tests für Memoro - - 1. Navigation - Download-Button 🔝 - - Hypothese: Ein - prominenterer - Download-Button - erhöht Conversions - - Varianten: - - A: "App - herunterladen" - (rechts, normal) - - B: "Kostenlos - testen" (mit Badge - "Neu!") - - C: Pulsierender - Button mit Icon - - Metriken: - Download-Klicks, - Scroll-Verhalten - - --- - 2. - Pricing-Darstellung - 💰 - - Hypothese: - Verschiedene - Pricing-Layouts - beeinflussen - Kaufentscheidung - - Varianten: - - A: Grid-Layout - (aktuell) - - B: - Vergleichstabelle - - C: Slider - (Monatlich/Jährlich - Toggle) - - Metriken: - Time-on-Page, - Plan-Auswahl, - Conversions - - --- - 3. Social Proof - Position ⭐ - - Hypothese: - Testimonials direkt - nach Hero erhöhen - Vertrauen - - Varianten: - - A: Testimonials - unten (aktuell) - - B: - Mini-Testimonials - direkt nach Hero - - C: Floating - Testimonial-Ticker - - Metriken: - Scroll-Tiefe, - Verweildauer, - Conversions - - --- - 4. Video vs. Demo 🎥 - - Hypothese: Live-Demo - ist überzeugender als - Video - - Varianten: - - A: "Video ansehen" - (aktuell) - - B: "Interaktive - Demo" - - C: "30-Sek - Kurzvideo" (autoplay) - - Metriken: - Engagement-Rate, - Demo-Completions - - --- - 5. Urgency/Scarcity - Test ⏰ -> Wichtig: SOWAS WOLLEN WIR NICHT MACHEN - KEINERLEI DARK PATTERNS ETC - - Hypothese: Zeitliche - Begrenzung erhöht - Conversions - - Varianten: - - A: Keine Urgency - - B: "Nur noch heute: - 50% Rabatt" - - C: "Begrenzt: Erste - 100 Nutzer - kostenlos" - - Metriken: - Conversion-Rate, - Absprungrate - - --- - 6. - Feature-Priorisierung - 📋 - - Hypothese: - KI-Features sind - wichtiger als - Datenschutz - - Varianten: - - A: Datenschutz - zuerst - - B: KI-Features - zuerst - - C: Use-Cases zuerst - - Metriken: Engagement, - Feature-Klicks - - --- - 7. Mobile-First Hero - 📱 - - Hypothese: - App-Screenshots - performen besser als - Illustrations - - Varianten: - - A: Aktuelle - Illustration - - B: iPhone-Mockup - mit App - - C: Animiertes - App-Demo - - Metriken: Mobile - Conversions, Bounce - Rate - - --- - 8. Sprache & Tone 💬 - - Hypothese: - Persönlichere - Ansprache erhöht - Engagement - - Varianten: - - A: "Ihre Gedanken" - (formell) - - B: "Deine Ideen" - (informell) - - C: "Sprechen Sie - einfach drauflos" - (aktiv) - - Metriken: - Verweildauer, - Engagement - - --- - 9. Trust-Badges 🛡️ - - Hypothese: - Sicherheits-Badges - erhöhen Vertrauen - - Varianten: - - A: Keine Badges - - B: "DSGVO-konform" - + "SSL-verschlüsselt" - - C: "TÜV-geprüft" + - Kundenzahlen - - Metriken: - Conversion-Rate, - Trust-Umfragen - - --- - 10. Onboarding-Flow - 🚀 - - Hypothese: Geführtes - Onboarding erhöht - Aktivierung - - Varianten: - - A: Direkt zur App - - B: 3-Schritt - Tutorial - - C: Persönliche Demo - buchen - - Metriken: - Aktivierungsrate, - 7-Tage Retention - - --- - 📊 - Priorisierungs-Matrix - - | Test | - Aufwand | Impact | - Empfehlung | - |-------------------| - ---------|--------|-- - ----------| - | Navigation Button | - Niedrig | Hoch | - ⭐⭐⭐ | - | Pricing Layout | - Mittel | Hoch | - ⭐⭐⭐ | - | Video vs Demo | - Hoch | Mittel | - ⭐⭐ | - | Trust Badges | - Niedrig | Mittel | - ⭐⭐ | - | Mobile Hero | - Mittel | Hoch | - ⭐⭐⭐ | - - 🚀 Nächste Schritte - - 1. Navigation-Button - Test (einfach & - high-impact) - 2. Pricing-Layout - (wichtig für - Conversion) - 3. Mobile-Hero (50%+ - Traffic ist mobil) \ No newline at end of file diff --git a/apps/memoro/apps/landing/copy/hero-design-verbesserungen.md b/apps/memoro/apps/landing/copy/hero-design-verbesserungen.md deleted file mode 100644 index c4ad55a9b..000000000 --- a/apps/memoro/apps/landing/copy/hero-design-verbesserungen.md +++ /dev/null @@ -1,104 +0,0 @@ -# Hero Design Verbesserungen - -## 🎨 Aktuelle Design-Probleme - -1. **Social Proof Box**: Zu dunkel und verschmilzt mit dem Hintergrund -2. **Trust Badges**: Zu klein und unauffällig -3. **Bild-Qualität**: Das Bild wirkt etwas dunkel/unscharf -4. **Visueller Fluss**: Die Elemente wirken noch nicht optimal verbunden -5. **CTAs**: Könnten noch mehr hervorstechen - -## 💡 Design-Verbesserungsvorschläge - -### 1. Social Proof Redesign -```css -/* Heller, auffälliger Hintergrund */ -background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.05) 100%); -border: 1px solid rgba(255,255,255,0.2); -backdrop-filter: blur(10px); -box-shadow: 0 4px 20px rgba(0,0,0,0.1); -``` - -### 2. Trust Badges Enhancement -- Größere Icons und Text -- Eigene Cards für jeden Badge -- Leichter Hover-Effekt -- Bessere Spacing - -### 3. Hero Image Improvements -- Overlay mit Gradient für besseren Kontrast -- Subtle Animation beim Laden -- Optional: Mehrere Bilder im Wechsel - -### 4. Typography & Spacing -- Größerer Zeilenabstand für bessere Lesbarkeit -- Stärkerer Kontrast zwischen Headline und Subtitle -- Mehr Whitespace zwischen Elementen - -### 5. CTA Buttons Enhancement -- Primär-Button: Stärkerer Glow-Effekt -- Sekundär-Button: Besserer Kontrast -- Micro-interactions beim Hover - -### 6. Animations & Effects -- Fade-in Animation für alle Elemente -- Parallax-Effekt für das Bild -- Smooth reveal beim Scrollen - -## 🚀 Quick Implementation - -### Sofort umsetzbar: -1. Social Proof Box aufhellen -2. Trust Badges vergrößern und besser positionieren -3. CTA Buttons optimieren -4. Micro-Copy prominenter machen - -### Mittelfristig: -1. Animationen hinzufügen -2. Bild-Overlay optimieren -3. Mobile Optimierungen - -## 📐 Konkrete CSS-Änderungen - -### Social Proof Box -```astro -
-``` - -### Trust Badges -```astro -
- {trustBadges.map((badge) => ( -
- {badge.icon} - {badge.text} -
- ))} -
-``` - -### CTA Buttons -```css -/* Primary Button mit Glow */ -.bg-primary { - box-shadow: 0 4px 20px rgba(255, 193, 7, 0.3); - transition: all 0.3s ease; -} - -.bg-primary:hover { - box-shadow: 0 6px 30px rgba(255, 193, 7, 0.5); - transform: translateY(-2px); -} -``` - -### Hero Image Container -```astro -
-
- {title} -
-``` \ No newline at end of file diff --git a/apps/memoro/apps/landing/copy/hero-quick-wins-konzept.md b/apps/memoro/apps/landing/copy/hero-quick-wins-konzept.md deleted file mode 100644 index 0d1e31e55..000000000 --- a/apps/memoro/apps/landing/copy/hero-quick-wins-konzept.md +++ /dev/null @@ -1,231 +0,0 @@ -# Hero Section Quick Wins - Umsetzungskonzept - -## 🎯 Übersicht -Dieses Dokument beschreibt die sofort umsetzbaren Verbesserungen für die Hero-Section der Memoro Landing Page. Alle Vorschläge sind darauf ausgelegt, mit minimalem Aufwand maximalen Impact zu erzielen. - -## 1. Headlines & Subtitles Optimierung - -### Deutsche Headlines (3 Varianten zum Testen) - -#### Variante A: Nutzen-fokussiert -``` -Headline: "Verwandeln Sie jedes Gespräch in verwertbares Wissen" -Subtitle: "KI-gestützte Gesprächsdokumentation, die mitdenkt. Sparen Sie 3+ Stunden pro Woche." -``` - -#### Variante B: Problem-fokussiert -``` -Headline: "Nie wieder wichtige Details aus Meetings verlieren" -Subtitle: "Memoro dokumentiert, strukturiert und erinnert – während Sie sich aufs Wesentliche konzentrieren." -``` - -#### Variante C: Zeitersparnis-fokussiert -``` -Headline: "3 Stunden pro Woche zurückgewinnen" -Subtitle: "Lassen Sie KI Ihre Gespräche dokumentieren. Automatisch. Präzise. DSGVO-konform." -``` - -### Englische Headlines (3 Varianten zum Testen) - -#### Variante A: Benefit-focused -``` -Headline: "Turn Every Conversation Into Actionable Insights" -Subtitle: "AI-powered documentation that thinks along. Save 3+ hours every week." -``` - -#### Variante B: Problem-focused -``` -Headline: "Never Miss Important Meeting Details Again" -Subtitle: "Memoro captures, structures, and reminds – while you focus on what matters." -``` - -#### Variante C: Time-saving focused -``` -Headline: "Get Back 3 Hours Every Week" -Subtitle: "Let AI document your conversations. Automatically. Accurately. GDPR-compliant." -``` - -## 2. CTA Micro-Copy - -### Primärer CTA -**Button Text**: "Jetzt kostenlos starten" / "Start Free Now" -**Micro-Copy darunter**: -- "✓ Keine Kreditkarte erforderlich" -- "✓ In 30 Sekunden eingerichtet" -- "✓ 14 Tage kostenlos testen" - -### Sekundärer CTA -**Button Text**: "Demo ansehen (2 Min)" / "Watch Demo (2 min)" -**Micro-Copy**: "Sehen Sie Memoro in Aktion" - -## 3. Trust-Badges & Sicherheitssignale - -### Badge-Leiste unter den CTAs -``` -[🔒 DSGVO-konform] [🇩🇪 Made in Germany] [🛡️ SSL-verschlüsselt] [✓ ISO 27001] -``` - -### Alternativ als Text -"Ihre Daten sind sicher: DSGVO-konform • Ende-zu-Ende verschlüsselt • Server in Deutschland" - -## 4. Social Proof Integration - -### Option A: Bewertungszeile -``` -⭐⭐⭐⭐⭐ 4.9/5 basierend auf 127 Bewertungen -"Die beste Investition in unsere Produktivität" - Thomas M., Geschäftsführer -``` - -### Option B: Nutzer-Statistik -``` -Bereits 2.500+ Professionals sparen Zeit mit Memoro -Über 50.000 Stunden Gespräche erfolgreich dokumentiert -``` - -### Option C: Logo-Leiste -``` -"Vertraut von Teams bei:" -[Siemens Logo] [SAP Logo] [Bosch Logo] [Mercedes Logo] [Telekom Logo] -``` - -## 5. Urgency/Scarcity Elemente (Optional) - -### Zeitlich begrenzt -``` -🎯 Black Friday Special: 50% Rabatt auf alle Pläne – nur noch 48 Stunden -``` - -### Begrenzte Plätze -``` -🚀 Early Access: Nur noch 23 kostenlose Beta-Plätze verfügbar -``` - -## 6. Implementation Details - -### HeroSection.astro Anpassungen - -1. **Micro-Copy Component** hinzufügen: -```astro -{microCopy && ( -
- - {microCopy} -
-)} -``` - -2. **Trust Badges Component**: -```astro -
-
- 🔒 - {t('hero.trust.gdpr')} -
-
- 🇩🇪 - {t('hero.trust.madeInGermany')} -
-
- 🛡️ - {t('hero.trust.encrypted')} -
-
-``` - -3. **Social Proof Component**: -```astro -
-
-
- {"⭐".repeat(5)} -
- 4.9/5 - ({reviewCount} Bewertungen) -
-

"{testimonialQuote}"

-

– {testimonialAuthor}

-
-``` - -## 7. A/B Testing Strategie - -### Test 1: Headlines -- Control: Aktuelle Headline -- Variante A: Nutzen-fokussiert -- Variante B: Problem-fokussiert -- Variante C: Zeitersparnis-fokussiert - -### Test 2: Social Proof -- Control: Keine Social Proof -- Variante A: Bewertungszeile -- Variante B: Nutzer-Statistik -- Variante C: Logo-Leiste - -### Test 3: Micro-Copy -- Control: Kein Micro-Copy -- Variante A: "Keine Kreditkarte erforderlich" -- Variante B: Alle 3 Punkte - -## 8. Tracking & Erfolgsmessung - -### KPIs -1. **Click-Through-Rate (CTR)** auf primären CTA -2. **Conversion Rate** zu Registrierung -3. **Bounce Rate** der Landing Page -4. **Time on Page** -5. **Scroll Depth** - -### Event Tracking -```javascript -// Hero View -gtag('event', 'hero_view', { - 'variant': currentVariant, - 'headline': headlineText -}); - -// CTA Click -gtag('event', 'hero_cta_click', { - 'button': 'primary', - 'variant': currentVariant, - 'position': 'hero' -}); - -// Trust Badge Hover -gtag('event', 'trust_badge_hover', { - 'badge': badgeType -}); -``` - -## 9. Mobile Optimierungen - -### Kürzere Mobile Headlines -``` -Desktop: "Verwandeln Sie jedes Gespräch in verwertbares Wissen" -Mobile: "Gespräche in Wissen verwandeln" - -Desktop: "3 Stunden pro Woche zurückgewinnen" -Mobile: "3h/Woche sparen" -``` - -### Angepasste Layouts -- Trust Badges: 2x2 Grid auf Mobile -- Social Proof: Kompaktere Darstellung -- CTAs: Full-width auf Mobile - -## 10. Nächste Schritte - -1. **Sofort (diese Woche)**: - - [ ] Neue Headlines in home.mdx implementieren - - [ ] Micro-Copy zu CTAs hinzufügen - - [ ] Trust Badges einbauen - - [ ] A/B Test erweitern - -2. **Kurzfristig (nächste 2 Wochen)**: - - [ ] Social Proof Komponente entwickeln - - [ ] Logo-Leiste designen - - [ ] Mobile Optimierungen - -3. **Follow-up**: - - [ ] Erste Test-Ergebnisse analysieren - - [ ] Gewinner-Varianten ausrollen - - [ ] Neue Test-Hypothesen entwickeln \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/Analytics/MemoroStats.md b/apps/memoro/apps/landing/docs/Analytics/MemoroStats.md deleted file mode 100644 index 905eb2177..000000000 --- a/apps/memoro/apps/landing/docs/Analytics/MemoroStats.md +++ /dev/null @@ -1,145 +0,0 @@ -08.08.2025 -{"memo_number":13896, -"memo_entry_number":225932, -"time_recorded":"5363:20:20.815 (hh:mm:ss,ms)", -"transcript_words":46.314.389, -"user_number":2553} - - - - -28.03.2025 -Memos:11.134 -"memo_entry_number":176033," -time_recorded":"4062:08:07.633 (hh:mm:ss,ms)"," - - - -transcript_words":35845740," -user_number":2009} - - -03.03.2025 -Memos: 10.405, -"memo_entry_number":162540, -time_recorded":"3735:49:37.421 - - -(hh:mm:ss,ms)", -Wörter: 33.177.948 -Users :1828 - - - -04.02.2025 -{"memo_number":9392, -"memo_entry_number":143793," - -time_recorded":"3370:57:54.073 (hh:mm:ss,ms)", -202260 Minutes - - -"transcript_words":30007331,"user_number":1638} - - - - - - -27.01.2025 -69 Paying Users -12 Android -56 iOS - -Länder: - -DE - 62 -CH - 2 -AT - 2 -US - 1 -Sweden - 1 -Finnland - 1 - - -21.01.2025 -Über 9000 Memos aufgenommen - - -{"memo_number":9054,"memo_entry_number":137677,"time_recorded":"3145:37:24.003 (hh:mm:ss,ms)","transcript_words":28213286,"user_number":1564} - - - -14.01.2025 -1504 Nutzer -MAUs: -495 Users (RevenueCat) -281 Users (Google Analytics) -151 Users (Admin App) -309 Durchschnitt - -{"memo_number":8782,"memo_entry_number":133301,"time_recorded":"3036:02:55.864 (hh:mm:ss,ms)","transcript_words":27319354,"user_number":1504} - - - -10.12.2024 -1310 Nutzer -8200 erstellte Memos -2800 Stunden Aufnahme -25 Millionen gesprochene Wörter -{"memo_number":8200,"memo_entry_number":122550,"time_recorded":"2834:35:37.030 (hh:mm:ss,ms)","transcript_words":25693505,"user_number":1310} - - - -26.11.2024 -Memos: 7852 -Stunden: 2708 h -Wörter: 24.555.821 - - -{"memo_number":7852,"memo_entry_number":116352,"time_recorded":"2708:35:00.093 (hh:mm:ss,ms)","transcript_words":24555821,"user_number":1238} - - - -06.11.2024 - - -Words: 22.513.813 -Hours: 2471 -{"memo_number":7237,"memo_entry_number":105938,"time_recorded":"2471:20:49.687 (hh:mm:ss,ms)","transcript_words":22513813,"user_number":1126} - - - -16.10.2024 -{"memo_number":6677,"memo_entry_number":95212,"time_recorded":"2213:26:39.882 (hh:mm:ss,ms)","transcript_words":20363477,"user_number":1031} - - - -07.10.2024 -Memos: 6460Time: 2105:58 (Stunden)Minuten: 126358 Minuten -Words: 19444341 -Users: 978 - -{"memo_number":6460,"memo_entry_number":90728,"time_recorded":"2105:58:07.954 (hh:mm:ss,ms)","transcript_words":19444341,"user_number":978} - -01.10.2024 -{"memo_number":6389, -"memo_entry_number":89327, -"time_recorded":"2075:02:10.580 -2075 h in minuten -(hh:mm:ss,ms)","transcript_words":19226681,"user_number":953} - -24.08.2024 - - -09.08.2024 - -{"memo_number":5495,"memo_entry_number":72678,"time_recorded":"1640:08:14.997 (hh:mm:ss,ms)","transcript_words":15770544,"user_number":699} - - - -24.07.2024 -{"memo_number":5235,"memo_entry_number":68122,"time_recorded":"1507:57:39.116 (hh:mm:ss,ms)","transcript_words":14694220,"user_number":640} - - -24.07.2024 - 02:30 -{"memo_number":5222,"memo_entry_number":67964,"time_recorded":"1503:55:22.022 (hh:mm:ss,ms)","transcript_words":14.664.072,"user_number":639} Durchschnittlichte Wörtanzahl pro Stunde: 10.000 \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/AstroAddLastModifiedTime.md b/apps/memoro/apps/landing/docs/AstroAddLastModifiedTime.md deleted file mode 100644 index df0e423b4..000000000 --- a/apps/memoro/apps/landing/docs/AstroAddLastModifiedTime.md +++ /dev/null @@ -1,106 +0,0 @@ -Add last modified time -Learn how to build a remark plugin that adds the last modified time to the frontmatter of your Markdown and MDX files. Use this property to display the modified time in your pages. - -Uses Git history - -This recipe calculates time based on your repository’s Git history and may not be accurate on some deployment platforms. Your host may be performing shallow clones which do not retrieve the full git history. - -Recipe -Install Helper Packages - -Install Day.js to modify and format times: - -npm -pnpm -Yarn -Terminal window -npm install dayjs - -Create a Remark Plugin - -This plugin uses execSync to run a Git command that returns the timestamp of the latest commit in ISO 8601 format. The timestamp is then added to the frontmatter of the file. - -remark-modified-time.mjs -import { execSync } from "child_process"; - -export function remarkModifiedTime() { - return function (tree, file) { - const filepath = file.history[0]; - const result = execSync(`git log -1 --pretty="format:%cI" "${filepath}"`); - file.data.astro.frontmatter.lastModified = result.toString(); - }; -} - -Using the file system instead of Git -Add the plugin to your config - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import { remarkModifiedTime } from './remark-modified-time.mjs'; - -export default defineConfig({ - markdown: { - remarkPlugins: [remarkModifiedTime], - }, -}); - -Now all Markdown documents will have a lastModified property in their frontmatter. - -Display Last Modified Time - -If your content is stored in a content collection, access the remarkPluginFrontmatter from the render(entry) function. Then render lastModified in your template wherever you would like it to appear. - -src/pages/posts/[slug].astro ---- -import { getCollection, render } from 'astro:content'; -import dayjs from "dayjs"; -import utc from "dayjs/plugin/utc"; - -dayjs.extend(utc); - -export async function getStaticPaths() { - const blog = await getCollection('blog'); - return blog.map(entry => ({ - params: { slug: entry.id }, - props: { entry }, - })); -} - -const { entry } = Astro.props; -const { Content, remarkPluginFrontmatter } = await render(entry); - -const lastModified = dayjs(remarkPluginFrontmatter.lastModified) - .utc() - .format("HH:mm:ss DD MMMM YYYY UTC"); ---- - - - ... - - ... -

Last Modified: {lastModified}

- ... - - - -If you’re using a Markdown layout, use the lastModified frontmatter property from Astro.props in your layout template. - -src/layouts/BlogLayout.astro ---- -import dayjs from "dayjs"; -import utc from "dayjs/plugin/utc"; - -dayjs.extend(utc); - -const lastModified = dayjs() - .utc(Astro.props.frontmatter.lastModified) - .format("HH:mm:ss DD MMMM YYYY UTC"); ---- - - - ... - -

{lastModified}

- - - \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/AstroAddReadingTime.md b/apps/memoro/apps/landing/docs/AstroAddReadingTime.md deleted file mode 100644 index 04adcf755..000000000 --- a/apps/memoro/apps/landing/docs/AstroAddReadingTime.md +++ /dev/null @@ -1,91 +0,0 @@ -Add reading time -Create a remark plugin which adds a reading time property to the frontmatter of your Markdown or MDX files. Use this property to display the reading time for each page. - -Recipe -Install Helper Packages - -Install these two helper packages: - -reading-time to calculate minutes read -mdast-util-to-string to extract all text from your markdown -npm -pnpm -Yarn -Terminal window -npm install reading-time mdast-util-to-string - -Create a remark plugin. - -This plugin uses the mdast-util-to-string package to get the Markdown file’s text. This text is then passed to the reading-time package to calculate the reading time in minutes. - -remark-reading-time.mjs -import getReadingTime from 'reading-time'; -import { toString } from 'mdast-util-to-string'; - -export function remarkReadingTime() { - return function (tree, { data }) { - const textOnPage = toString(tree); - const readingTime = getReadingTime(textOnPage); - // readingTime.text will give us minutes read as a friendly string, - // i.e. "3 min read" - data.astro.frontmatter.minutesRead = readingTime.text; - }; -} - -Add the plugin to your config: - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import { remarkReadingTime } from './remark-reading-time.mjs'; - -export default defineConfig({ - markdown: { - remarkPlugins: [remarkReadingTime], - }, -}); - -Now all Markdown documents will have a calculated minutesRead property in their frontmatter. - -Display Reading Time - -If your blog posts are stored in a content collection, access the remarkPluginFrontmatter from the render(entry) function. Then, render minutesRead in your template wherever you would like it to appear. - -src/pages/posts/[slug].astro ---- -import { getCollection, render } from 'astro:content'; - -export async function getStaticPaths() { - const blog = await getCollection('blog'); - return blog.map(entry => ({ - params: { slug: entry.id }, - props: { entry }, - })); -} - -const { entry } = Astro.props; -const { Content, remarkPluginFrontmatter } = await render(entry); ---- - - - ... - - ... -

{remarkPluginFrontmatter.minutesRead}

- ... - - - -If you’re using a Markdown layout, use the minutesRead frontmatter property from Astro.props in your layout template. - -src/layouts/BlogLayout.astro ---- -const { minutesRead } = Astro.props.frontmatter; ---- - - - ... - -

{minutesRead}

- - - \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/AstroIconsFor ExternalLinks.md b/apps/memoro/apps/landing/docs/AstroIconsFor ExternalLinks.md deleted file mode 100644 index ef005c569..000000000 --- a/apps/memoro/apps/landing/docs/AstroIconsFor ExternalLinks.md +++ /dev/null @@ -1,41 +0,0 @@ -Add icons to external links -Using a rehype plugin, you can identify and modify links in your Markdown files that point to external sites. This example adds icons to the end of each external link, so that visitors will know they are leaving your site. - -Prerequisites -An Astro project using Markdown for content pages. -Recipe -Install the rehype-external-links plugin. - -npm -pnpm -Yarn -Terminal window -npm install rehype-external-links - -Import the plugin into your astro.config.mjs file. - -Pass rehypeExternalLinks to the rehypePlugins array, along with an options object that includes a content property. Set this property’s type to text if you want to add plain text to the end of the link. To add HTML to the end of the link instead, set the property type to raw. - -// ... -import rehypeExternalLinks from 'rehype-external-links'; - -export default defineConfig({ - // ... - markdown: { - rehypePlugins: [ - [ - rehypeExternalLinks, - { - content: { type: 'text', value: ' 🔗' } - } - ], - ] - }, -}); - -Note - -The value of the content property is not represented in the accessibility tree. As such, it’s best to make clear that the link is external in the surrounding content, rather than relying on the icon alone. - -Resources -rehype-external-links \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/AstroInternalizationReadMe.md b/apps/memoro/apps/landing/docs/AstroInternalizationReadMe.md deleted file mode 100644 index 845344f50..000000000 --- a/apps/memoro/apps/landing/docs/AstroInternalizationReadMe.md +++ /dev/null @@ -1,321 +0,0 @@ -Internationalization (i18n) Routing -Astro’s internationalization (i18n) features allow you to adapt your project for an international audience. This routing API helps you generate, use, and verify the URLs that your multi-language site produces. - -Astro’s i18n routing allows you to bring your multilingual content with support for configuring a default language, computing relative page URLs, and accepting preferred languages provided by your visitor’s browser. You can also specify fallback languages on a per-language basis so that your visitors can always be directed to existing content on your site. - -Routing Logic -Astro uses a middleware to implement its routing logic. This middleware function is placed in the first position where it awaits every Response coming from any additional middleware and each page route before finally executing its own logic. - -This means that operations (e.g. redirects) from your own middleware and your page logic are run first, your routes are rendered, and then the i18n middleware performs its own actions such as verifying that a localized URL corresponds to a valid route. - -You can also choose to add your own i18n logic in addition to or instead of Astro’s i18n middleware, giving you even more control over your routes while still having access to the astro:i18n helper functions. - -Configure i18n routing -Both a list of all supported languages (locales) and a default language (defaultLocale), which must be one of the languages listed in locales, need to be specified in an i18n configuration object. Additionally, you can configure more specific routing and fallback behavior to match your desired URLs. - -astro.config.mjs -import { defineConfig } from "astro/config" -export default defineConfig({ - i18n: { - locales: ["es", "en", "pt-br"], - defaultLocale: "en", - } -}) - -Create localized folders -Organize your content folders with localized content by language. Create individual /[locale]/ folders anywhere within src/pages/ and Astro’s file-based routing will create your pages at corresponding URL paths. - -Your folder names must match the items in locales exactly. Include a localized folder for your defaultLocale only if you configure prefixDefaultLocale: true to show a localized URL path for your default language (e.g. /en/about/). - -Directorysrc -Directorypages -about.astro -index.astro -Directoryes -about.astro -index.astro -Directorypt-br -about.astro -index.astro -Note - -The localized folders do not need to be at the root of the /pages/ folder. - -Create links -With i18n routing configured, you can now compute links to pages within your site using the helper functions such as getRelativeLocaleUrl() available from the astro:i18n module. These generated links will always provide the correct, localized route and can help you correctly use, or check, URLs on your site. - -You can also still write the links manually. - -src/pages/es/index.astro ---- -import { getRelativeLocaleUrl } from 'astro:i18n'; - -// defaultLocale is "es" -const aboutURL = getRelativeLocaleUrl("es", "about"); ---- - -¡Vamos! -Blog -Acerca - -routing -Astro’s built-in file-based routing automatically creates URL routes for you based on your file structure within src/pages/. - -When you configure i18n routing, information about this file structure (and the corresponding URL paths generated) is available to the i18n helper functions so they can generate, use, and verify the routes in your project. Many of these options can be used together for even more customization and per-language flexibility. - -You can even choose to implement your own routing logic manually for even greater control. - -prefixDefaultLocale -Added in: astro@3.5.0 - -This routing option defines whether or not your default language’s URLs should use a language prefix (e.g. /en/about/). - -All non-default supported languages will use a localized prefix (e.g. /fr/ or /french/) and content files must be located in appropriate folders. This configuration option allows you to specify whether your default language should also follow a localized URL structure. - -This setting also determines where the page files for your default language must exist (e.g. src/pages/about/ or src/pages/en/about) as the file structure and URL structure must match for all languages. - -"prefixDefaultLocale: false" (default): URLs in your default language will not have a /[locale]/ prefix. All other locales will. - -"prefixDefaultLocale: true": All URLs, including your default language, will have a /[locale]/ prefix. - -prefixDefaultLocale: false -astro.config.mjs -import { defineConfig } from "astro/config" -export default defineConfig({ - i18n: { - locales: ["es", "en", "fr"], - defaultLocale: "en", - routing: { - prefixDefaultLocale: false - } - } -}) - -This is the default value. Set this option when URLs in your default language will not have a /[locale]/ prefix and files in your default language exist at the root of src/pages/: - -Directorysrc -Directorypages -about.astro -index.astro -Directoryes -about.astro -index.astro -Directoryfr -about.astro -index.astro -src/pages/about.astro will produce the route example.com/about/ -src/pages/fr/about.astro will produce the route example.com/fr/about/ -prefixDefaultLocale: true -astro.config.mjs -import { defineConfig } from "astro/config" -export default defineConfig({ - i18n: { - locales: ["es", "en", "fr"], - defaultLocale: "en", - routing: { - prefixDefaultLocale: true - } - } -}) - -Set this option when all routes will have their /locale/ prefix in their URL and when all page content files, including those for your defaultLocale, exist in a localized folder: - -Directorysrc -Directorypages -index.astro -// Note: this file is always required -Directoryen -index.astro -about.astro -Directoryes -about.astro -index.astro -Directorypt-br -about.astro -index.astro -URLs without a locale prefix, (e.g. example.com/about/) will return a 404 (not found) status code unless you specify a fallback strategy. -redirectToDefaultLocale -Added in: astro@4.2.0 - -Configures whether or not the home URL (/) generated by src/pages/index.astro will redirect to /. - -Setting prefixDefaultLocale: true will also automatically set redirectToDefaultLocale: true in your routing config object. By default, the required src/pages/index.astro file will automatically redirect to the index page of your default locale. - -You can opt out of this behavior by setting redirectToDefaultLocale: false. This allows you to have a site home page that exists outside of your configured locale folder structure. - -manual -Added in: astro@4.6.0 - -When this option is enabled, Astro will disable its i18n middleware so that you can implement your own custom logic. No other routing options (e.g. prefixDefaultLocale) may be configured with routing: "manual". - -You will be responsible for writing your own routing logic, or executing Astro’s i18n middleware manually alongside your own. - -astro.config.mjs -import { defineConfig } from "astro/config" -export default defineConfig({ - i18n: { - locales: ["es", "en", "fr"], - defaultLocale: "en", - routing: "manual" - } -}) - -Astro provides helper functions for your middleware so you can control your own default routing, exceptions, fallback behavior, error catching, etc: redirectToDefaultLocale(), notFound(), and redirectToFallback(): - -src/middleware.js -import { defineMiddleware } from "astro:middleware"; -import { redirectToDefaultLocale } from "astro:i18n"; // function available with `manual` routing -export const onRequest = defineMiddleware(async (ctx, next) => { - if (ctx.url.startsWith("/about")) { - return next(); - } else { - return redirectToDefaultLocale(302); - } -}) - -middleware function -The middleware function manually creates Astro’s i18n middleware. This allows you to extend Astro’s i18n routing instead of completely replacing it. - -You can run middleware with routing options in combination with your own middleware, using the sequence utility to determine the order: - -src/middleware.js -import {defineMiddleware, sequence} from "astro:middleware"; -import { middleware } from "astro:i18n"; // Astro's own i18n routing config - -export const userMiddleware = defineMiddleware(async (ctx, next) => { - // this response might come from Astro's i18n middleware, and it might return a 404 - const response = await next(); - // the /about page is an exception and we want to render it - if (ctx.url.startsWith("/about")) { - return new Response("About page", { - status: 200 - }); - } else { - return response; - } -}); - - -export const onRequest = sequence( - userMiddleware, - middleware({ - redirectToDefaultLocale: false, - prefixDefaultLocale: true - }) -) - -domains -Added in: astro@4.9.0 - -This routing option allows you to customize your domains on a per-language basis for server rendered projects using the @astrojs/node or @astrojs/vercel adapter with a site configured. - -Add i18n.domains to map any of your supported locales to custom URLs: - -astro.config.mjs -import { defineConfig } from "astro/config" -export default defineConfig({ - site: "https://example.com", - output: "server", // required, with no prerendered pages - adapter: node({ - mode: 'standalone', - }), - i18n: { - locales: ["es", "en", "fr", "ja"], - defaultLocale: "en", - routing: { - prefixDefaultLocale: false - }, - domains: { - fr: "https://fr.example.com", - es: "https://example.es" - } - } -}) - -All non-mapped locales will follow your prefixDefaultLocales configuration. However, even if this value is false, page files for your defaultLocale must also exist within a localized folder. For the configuration above, an /en/ folder is required. - -With the above configuration: - -The file /fr/about.astro will create the URL https://fr.example.com/about. -The file /es/about.astro will create the URL https://example.es/about. -The file /ja/about.astro will create the URL https://example.com/ja/about. -The file /en/about.astro will create the URL https://example.com/about. -The above URLs will also be returned by the getAbsoluteLocaleUrl() and getAbsoluteLocaleUrlList() functions. - -Fallback -When a page in one language doesn’t exist (e.g. a page that is not yet translated), instead of displaying a 404 page, you can choose to display fallback content from another locale on a per-language basis. This is useful when you do not yet have a page for every route, but you want to still provide some content to your visitors. - -Your fallback strategy consists of two parts: choosing which languages should fallback to which other languages (i18n.fallback) and choosing whether to perform a redirect or a rewrite to show the fallback content (i18n.routing.fallbackType added in Astro v4.15.0). - -For example, when you configure i18n.fallback: { fr: "es" }, Astro will ensure that a page is built in src/pages/fr/ for every page that exists in src/pages/es/. - -If any page does not already exist, then a page will be created depending on your fallbackType: - -With a redirect to the corresponding es route (default behavior). -With the content of the /es/ page (i18n.routing.fallbackType: "rewrite"). -For example, the configuration below sets es as the fallback locale for any missing fr routes. This means that a user visiting example.com/fr/my-page/ will be shown the content for example.com/es/my-page/ (without being redirected) instead of being taken to a 404 page when src/pages/fr/my-page.astro does not exist. - -astro.config.mjs -import { defineConfig } from "astro/config" -export default defineConfig({ - i18n: { - locales: ["es", "en", "fr"], - defaultLocale: "en", - fallback: { - fr: "es" - }, - routing: { - fallbackType: "rewrite" - } - } -}) - -Custom locale paths -In addition to defining your site’s supported locales as strings (e.g. “en”, “pt-br”), Astro also allows you to map an arbitrary number of browser-recognized language codes to a custom URL path. While locales can be strings of any format as long as they correspond to your project folder structure, codes must follow the browser’s accepted syntax. - -Pass an object to the locales array with a path key to define a custom URL prefix, and codes to indicate the languages mapped to this URL. In this case, your /[locale]/ folder name must match exactly the value of the path and your URLs will be generated using the path value. - -This is useful if you support multiple variations of a language (e.g. "fr", "fr-BR", and "fr-CA") and you want to have all these variations mapped under the same URL /fr/, or even customize it entirely (e.g. /french/): - -astro.config.mjs -import { defineConfig } from "astro/config" -export default defineConfig({ - i18n: { - locales: ["es", "en", "fr"], - locales: ["es", "en", { - path: "french", // no slashes included - codes: ["fr", "fr-BR", "fr-CA"] - }], - defaultLocale: "en", - routing: { - prefixDefaultLocale: true - } - } -}) - -When using functions from the astro:i18n virtual module to compute valid URL paths based on your configuration (e.g. getRelativeLocaleUrl()), use the path as the value for locale. - -Limitations -This feature has some restrictions: - -The site option is mandatory. -The output option must be set to "server". -There cannot be any individual prerendered pages. -Astro relies on the following headers in order to support the feature: - -X-Forwarded-Host and Host. Astro will use the former, and if not present, will try the latter. -X-Forwarded-Proto and URL#protocol of the server request. -Make sure that your server proxy/hosting platform is able to provide this information. Failing to retrieve these headers will result in a 404 (status code) page. - -Browser language detection -Astro’s i18n routing allows you to access two properties for browser language detection in pages rendered on demand: Astro.preferredLocale and Astro.preferredLocaleList. All pages, including static prerendered pages, have access to Astro.currentLocale. - -These combine the browser’s Accept-Language header, and your locales (strings or codes) to automatically respect your visitor’s preferred languages. - -Astro.preferredLocale: Astro can compute a preferred locale for your visitor if their browser’s preferred locale is included in your locales array. This value is undefined if no such match exists. - -Astro.preferredLocaleList: An array of all locales that are both requested by the browser and supported by your website. This produces a list of all compatible languages between your site and your visitor. The value is [] if none of the browser’s requested languages are found in your locales array. If the browser does not specify any preferred languages, then this value will be i18n.locales. - -Astro.currentLocale: The locale computed from the current URL, using the syntax specified in your locales configuration. If the URL does not contain a /[locale]/ prefix, then the value will default to i18n.defaultLocale. - -In order to successfully match your visitors’ preferences, provide your codes using the same pattern used by the browser. \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/AstroRecipeLanguageSetup.md b/apps/memoro/apps/landing/docs/AstroRecipeLanguageSetup.md deleted file mode 100644 index e075820cb..000000000 --- a/apps/memoro/apps/landing/docs/AstroRecipeLanguageSetup.md +++ /dev/null @@ -1,409 +0,0 @@ -Add i18n features -In this recipe, you will learn how to use content collections and dynamic routing to build your own internationalization (i18n) solution and serve your content in different languages. - -Tip - -In v4.0, Astro added built-in support for i18n routing that allows you to configure default and supported languages and includes valuable helper functions to assist you in serving an international audience. If you want to use this instead, see our internationalization guide to learn about these features. - -This example serves each language at its own subpath, e.g. example.com/en/blog for English and example.com/fr/blog for French. - -If you prefer the default language to not be visible in the URL unlike other languages, there are instructions to hide the default language below. - -See the resources section for external links to related topics such as right-to-left (RTL) styling and choosing language tags. -Recipe -Set up pages for each language -Create a directory for each language you want to support. For example, en/ and fr/ if you are supporting English and French: - -Directorysrc/ -Directorypages/ -Directoryen/ -about.astro -index.astro -Directoryfr/ -about.astro -index.astro -index.astro -Set up src/pages/index.astro to redirect to your default language. - -Static -SSR -src/pages/index.astro - - -This approach uses a meta refresh and will work however you deploy your site. Some static hosts also let you configure server redirects with a custom configuration file. See your deploy platform’s documentation for more details. - -Use collections for translated content -Create a folder in src/content/ for each type of content you want to include and add subdirectories for each supported language. For example, to support English and French blog posts: - -Directorysrc/ -Directorycontent/ -Directoryblog/ -Directoryen/ -Blog posts in English -post-1.md -post-2.md -Directoryfr/ -Blog posts in French -post-1.md -post-2.md -Create a src/content.config.ts file and export a collection for each type of content. - -src/content.config.ts -import { defineCollection, z } from 'astro:content'; - -const blogCollection = defineCollection({ - schema: z.object({ - title: z.string(), - author: z.string(), - date: z.date() - }) -}); - -export const collections = { - 'blog': blogCollection -}; - -Read more about Content Collections. -Use dynamic routes to fetch and render content based on a lang and a slug parameter. - -Static -SSR -In static rendering mode, use getStaticPaths to map each content entry to a page: - -src/pages/[lang]/blog/[...slug].astro ---- -import { getCollection } from 'astro:content'; - -export async function getStaticPaths() { - const pages = await getCollection('blog'); - - const paths = pages.map(page => { - const [lang, ...slug] = page.slug.split('/'); - return { params: { lang, slug: slug.join('/') || undefined }, props: page }; - }); - - return paths; -} - -const { lang, slug } = Astro.params; -const page = Astro.props; -const formattedDate = page.data.date.toLocaleString(lang); - -const { Content } = await page.render(); ---- -

{page.data.title}

-

by {page.data.author} • {formattedDate}

- - -Read more about dynamic routing. -Date formatting - -The example above uses the built-in toLocaleString() date-formatting method to create a human-readable string from the frontmatter date. This ensures the date and time are formatted to match the user’s language. - -Translate UI strings -Create dictionaries of terms to translate the labels for UI elements around your site. This allows your visitors to experience your site fully in their language. - -Create a src/i18n/ui.ts file to store your translation strings: - -src/i18n/ui.ts -export const languages = { - en: 'English', - fr: 'Français', -}; - -export const defaultLang = 'en'; - -export const ui = { - en: { - 'nav.home': 'Home', - 'nav.about': 'About', - 'nav.twitter': 'Twitter', - }, - fr: { - 'nav.home': 'Accueil', - 'nav.about': 'À propos', - }, -} as const; - -Create two helper functions: one to detect the page language based on the current URL, and one to get translations strings for different parts of the UI in src/i18n/utils.ts: - -src/i18n/utils.ts -import { ui, defaultLang } from './ui'; - -export function getLangFromUrl(url: URL) { - const [, lang] = url.pathname.split('/'); - if (lang in ui) return lang as keyof typeof ui; - return defaultLang; -} - -export function useTranslations(lang: keyof typeof ui) { - return function t(key: keyof typeof ui[typeof defaultLang]) { - return ui[lang][key] || ui[defaultLang][key]; - } -} - -Did you notice? - -In step 1, the nav.twitter string was not translated to French. You may not want every term translated, such as proper names or common industry terms. The useTranslations helper will return the default language’s value if a key is not translated. In this example, French users will also see “Twitter” in the nav bar. - -Import the helpers where needed and use them to choose the UI string that corresponds to the current language. For example, a nav component might look like: - -src/components/Nav.astro ---- -import { getLangFromUrl, useTranslations } from '../i18n/utils'; - -const lang = getLangFromUrl(Astro.url); -const t = useTranslations(lang); ---- - - -Each page must have a lang attribute on the element that matches the language on the page. In this example, a reusable layout extracts the language from the current route: - -src/layouts/Base.astro ---- -import { getLangFromUrl } from '../i18n/utils'; - -const lang = getLangFromUrl(Astro.url); ---- - - - - - - Astro - - - - - - -You can then use this base layout to ensure that pages use the correct lang attribute automatically. - -src/pages/en/about.astro ---- -import Base from '../../layouts/Base.astro'; ---- - -

About me

- ... - - -Let users switch between languages -Create links to the different languages you support so users can choose the language they want to read your site in. - -Create a component to show a link for each language: - -src/components/LanguagePicker.astro ---- -import { languages } from '../i18n/ui'; ---- -
    - {Object.entries(languages).map(([lang, label]) => ( -
  • - {label} -
  • - ))} -
- -Add to your site so it is shown on every page. The example below adds it to the site footer in a base layout: - -src/layouts/Base.astro ---- -import LanguagePicker from '../components/LanguagePicker.astro'; -import { getLangFromUrl } from '../i18n/utils'; - -const lang = getLangFromUrl(Astro.url); ---- - - - - - - Astro - - - -
- -
- - - -Hide default language in the URL -Create a directory for each language except the default language. For example, store your default language pages directly in pages/, and your translated pages in fr/: - -Directorysrc/ -Directorypages/ -about.astro -index.astro -Directoryfr/ -about.astro -index.astro -Add another line to the src/i18n/ui.ts file to toggle the feature: - -src/i18n/ui.ts -export const showDefaultLang = false; - -Add a helper function to src/i18n/utils.ts, to translate paths based on the current language: - -src/i18n/utils.ts -import { ui, defaultLang, showDefaultLang } from './ui'; - -export function useTranslatedPath(lang: keyof typeof ui) { - return function translatePath(path: string, l: string = lang) { - return !showDefaultLang && l === defaultLang ? path : `/${l}${path}` - } -} - -Import the helper where needed. For example, a nav component might look like: - -src/components/Nav.astro ---- -import { getLangFromUrl, useTranslations, useTranslatedPath } from '../i18n/utils'; - -const lang = getLangFromUrl(Astro.url); -const t = useTranslations(lang); -const translatePath = useTranslatedPath(lang); ---- - - -The helper function can also be used to translate paths for a specific language. For example, when users switch between languages: - -src/components/LanguagePicker.astro ---- -import { languages } from '../i18n/ui'; -import { getLangFromUrl, useTranslatedPath } from '../i18n/utils'; - -const lang = getLangFromUrl(Astro.url); -const translatePath = useTranslatedPath(lang); ---- -
    - {Object.entries(languages).map(([lang, label]) => ( -
  • - {label} -
  • - ))} -
- -Translate Routes -Translate the routes of your pages for each language. - -Add route mappings to src/i18n/ui.ts: - -src/i18n/ui.ts -export const routes = { - de: { - 'services': 'leistungen', - }, - fr: { - 'services': 'prestations-de-service', - }, -} - -Update the useTranslatedPath helper function in src/i18n/utils.ts to add router translation logic. - -src/i18n/utils.ts -import { ui, defaultLang, showDefaultLang, routes } from './ui'; - -export function useTranslatedPath(lang: keyof typeof ui) { - return function translatePath(path: string, l: string = lang) { - const pathName = path.replaceAll('/', '') - const hasTranslation = defaultLang !== l && routes[l] !== undefined && routes[l][pathName] !== undefined - const translatedPath = hasTranslation ? '/' + routes[l][pathName] : path - - return !showDefaultLang && l === defaultLang ? translatedPath : `/${l}${translatedPath}` - } -} - -Create a helper function to get the route, if it exists based on the current URL, in src/i18n/utils.ts: - -src/i18n/utils.ts -import { ui, defaultLang, showDefaultLang, routes } from './ui'; - -export function getRouteFromUrl(url: URL): string | undefined { - const pathname = new URL(url).pathname; - const parts = pathname?.split('/'); - const path = parts.pop() || parts.pop(); - - if (path === undefined) { - return undefined; - } - - const currentLang = getLangFromUrl(url); - - if (defaultLang === currentLang) { - const route = Object.values(routes)[0]; - return route[path] !== undefined ? route[path] : undefined; - } - - const getKeyByValue = (obj: Record, value: string): string | undefined => { - return Object.keys(obj).find((key) => obj[key] === value); - } - - const reversedKey = getKeyByValue(routes[currentLang], path); - - if (reversedKey !== undefined) { - return reversedKey; - } - - return undefined; -} - -The helper function can be used to get a translated route. For example, when no translated route is defined, the user will be redirected to the home page: - -src/components/LanguagePicker.astro ---- -import { languages } from '../i18n/ui'; -import { getRouteFromUrl } from '../i18n/utils'; - -const route = getRouteFromUrl(Astro.url); ---- -
    - {Object.entries(languages).map(([lang, label]) => ( -
  • - {label} -
  • - ))} -
- -Resources -Choosing a Language Tag -Right-to-left (RTL) Styling 101 -Community libraries -astro-i18next — An Astro integration for i18next including some utility components. -astro-i18n — A TypeScript-first internationalization library for Astro. -astro-i18n-aut — An Astro integration for i18n that supports the defaultLocale without page generation. The integration is adapter agnostic and UI framework agnostic. -astro-react-i18next — An Astro integration that seamlessly enables the use of i18next and react-i18next in React components on Astro websites. -paraglide — A fully type-safe i18n library specifically designed for partial hydration patterns like Astro islands. \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/AstroSitemapReadMe.md b/apps/memoro/apps/landing/docs/AstroSitemapReadMe.md deleted file mode 100644 index b06ad6150..000000000 --- a/apps/memoro/apps/landing/docs/AstroSitemapReadMe.md +++ /dev/null @@ -1,333 +0,0 @@ -@astrojs/ -sitemap -v3.2.1 -GitHub -npm -Changelog -This Astro integration generates a sitemap based on your pages when you build your Astro project. - -Why Astro Sitemap -A Sitemap is an XML file that outlines all of the pages, videos, and files on your site. Search engines like Google read this file to crawl your site more efficiently. See Google’s own advice on sitemaps to learn more. - -A sitemap file is recommended for large multi-page sites. If you don’t use a sitemap, most search engines will still be able to list your site’s pages, but a sitemap is a great way to ensure that your site is as search engine friendly as possible. - -With Astro Sitemap, you don’t have to worry about creating this XML file yourself: the Astro Sitemap integration will crawl your statically-generated routes and create the sitemap file, including dynamic routes like [...slug] or src/pages/[lang]/[version]/info.astro generated by getStaticPaths(). - -This integration cannot generate sitemap entries for dynamic routes in SSR mode. - -Installation -Astro includes an astro add command to automate the setup of official integrations. If you prefer, you can install integrations manually instead. - -Run one of the following commands in a new terminal window. - -npm -pnpm -Yarn -Terminal window -npx astro add sitemap - -If you run into any issues, feel free to report them to us on GitHub and try the manual installation steps below. - -Manual Install -First, install the @astrojs/sitemap package using your package manager. - -npm -pnpm -Yarn -Terminal window -npm install @astrojs/sitemap - -Then, apply the integration to your astro.config.* file using the integrations property: - -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - // ... - integrations: [sitemap()], -}); - -Usage -@astrojs/sitemap needs to know your site’s deployed URL to generate a sitemap. - -Add your site’s URL as the site option in astro.config.mjs. This must begin with http:// or https://. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - site: 'https://stargazers.club', - integrations: [sitemap()], - // ... -}); - -With the sitemap integration configured, sitemap-index.xml and sitemap-0.xml files will be added to your output directory when building your site. - -sitemap-index.xml links to all the numbered sitemap files. sitemap-0.xml lists the pages on your site. For extremely large sites, there may also be additional numbered files like sitemap-1.xml and sitemap-2.xml. - -Example of generated files for a two-page website -Sitemap discovery -You can make it easier for crawlers to find your sitemap with links in your site’s and robots.txt file. - -Sitemap link in -Add a element to your site’s pointing to the sitemap index file: - -src/layouts/Layout.astro - - - - -Sitemap link in robots.txt -If you have a robots.txt for your website, you can add the URL for the sitemap index to help crawlers: - -public/robots.txt -User-agent: * -Allow: / - -Sitemap: https:///sitemap-index.xml - -If you want to reuse the site value from astro.config.mjs, you can also generate robots.txt dynamically. Instead of using a static file in the public/ directory, create a src/pages/robots.txt.ts file and add the following code: - -src/pages/robots.txt.ts -import type { APIRoute } from 'astro'; - -const getRobotsTxt = (sitemapURL: URL) => ` -User-agent: * -Allow: / - -Sitemap: ${sitemapURL.href} -`; - -export const GET: APIRoute = ({ site }) => { - const sitemapURL = new URL('sitemap-index.xml', site); - return new Response(getRobotsTxt(sitemapURL)); -}; - -Configuration -To configure this integration, pass an object to the sitemap() function in astro.config.mjs. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - integrations: [ - sitemap({ - // configuration options - }), - ], -}); - -filter -All pages are included in your sitemap by default. By adding a custom filter function, you can filter included pages by URL. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - site: 'https://stargazers.club', - integrations: [ - sitemap({ - filter: (page) => page !== 'https://stargazers.club/secret-vip-lounge/', - }), - ], -}); - -The function will be called for every page on your site. The page function parameter is the full URL of the page currently under consideration, including your site domain. Return true to include the page in your sitemap, and false to leave it out. - -To filter multiple pages, add arguments with target URLs. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - site: 'https://stargazers.club', - integrations: [ - sitemap({ - filter: (page) => - page !== 'https://stargazers.club/secret-vip-lounge-1/' && - page !== 'https://stargazers.club/secret-vip-lounge-2/' && - page !== 'https://stargazers.club/secret-vip-lounge-3/' && - page !== 'https://stargazers.club/secret-vip-lounge-4/', - }), - ], -}); - -customPages -In some cases, a page might be part of your deployed site but not part of your Astro project. If you’d like to include a page in your sitemap that isn’t created by Astro, you can use this option. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - site: 'https://stargazers.club', - integrations: [ - sitemap({ - customPages: ['https://stargazers.club/external-page', 'https://stargazers.club/external-page2'], - }), - ], -}); - -entryLimit -The maximum number entries per sitemap file. The default value is 45000. A sitemap index and multiple sitemaps are created if you have more entries. See this explanation of splitting up a large sitemap. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - site: 'https://stargazers.club', - integrations: [ - sitemap({ - entryLimit: 10000, - }), - ], -}); - -changefreq, lastmod, and priority -These options correspond to the , , and tags in the Sitemap XML specification. - -Note that changefreq and priority are ignored by Google. - -Note - -Due to limitations of Astro’s Integration API, this integration can’t analyze a given page’s source code. This configuration option can set changefreq, lastmod and priority on a site-wide basis; see the next option serialize for how you can set these values on a per-page basis. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - site: 'https://stargazers.club', - integrations: [ - sitemap({ - changefreq: 'weekly', - priority: 0.7, - lastmod: new Date('2022-02-24'), - }), - ], -}); - -serialize -A function called for each sitemap entry just before writing to a disk. This function can be asynchronous. - -It receives as its parameter a SitemapItem object that can have these properties: - -url (absolute page URL). This is the only property that is guaranteed to be on SitemapItem. -changefreq -lastmod (ISO formatted date, String type) -priority -links. -This links property contains a LinkItem list of alternate pages including a parent page. - -The LinkItem type has two fields: url (the fully-qualified URL for the version of this page for the specified language) and lang (a supported language code targeted by this version of the page). - -The serialize function should return SitemapItem, touched or not. - -The example below shows the ability to add sitemap specific properties individually. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - site: 'https://stargazers.club', - integrations: [ - sitemap({ - serialize(item) { - if (/exclude-from-sitemap/.test(item.url)) { - return undefined; - } - if (/your-special-page/.test(item.url)) { - item.changefreq = 'daily'; - item.lastmod = new Date(); - item.priority = 0.9; - } - return item; - }, - }), - ], -}); - -i18n -To localize a sitemap, pass an object to this i18n option. - -This object has two required properties: - -defaultLocale: String. Its value must exist as one of locales keys. -locales: Record, key/value - pairs. The key is used to look for a locale part in a page path. The value is a language attribute, only English alphabet and hyphen allowed. -Read more about language attributes. - -Read more about localization. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - site: 'https://stargazers.club', - integrations: [ - sitemap({ - i18n: { - defaultLocale: 'en', // All urls that don't contain `es` or `fr` after `https://stargazers.club/` will be treated as default locale, i.e. `en` - locales: { - en: 'en-US', // The `defaultLocale` value must present in `locales` keys - es: 'es-ES', - fr: 'fr-CA', - }, - }, - }), - ], -}); - -The resulting sitemap looks like this: - -sitemap-0.xml -... - - https://stargazers.club/ - - - - - - https://stargazers.club/es/ - - - - - - https://stargazers.club/fr/ - - - - - - https://stargazers.club/es/second-page/ - - - - -... - -xslURL -The URL of an XSL stylesheet to style and prettify your sitemap. - -The value set can be either a path relative to your configured site URL for a local stylesheet, or can be an absolute URL link to an external stylesheet. - -astro.config.mjs -import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; - -export default defineConfig({ - site: 'https://example.com', - integrations: [ - sitemap({ - xslURL: '/sitemap.xsl' - }), - ], -}); \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/Internal-Collections.md b/apps/memoro/apps/landing/docs/Internal-Collections.md deleted file mode 100644 index e442b7f8a..000000000 --- a/apps/memoro/apps/landing/docs/Internal-Collections.md +++ /dev/null @@ -1,254 +0,0 @@ -# Internal Collections Documentation - -## Übersicht - -Dieses Projekt unterstützt **private/interne Content Collections**, die nicht öffentlich zugänglich sind. Diese Collections werden für interne Zwecke wie Marketing-Strategien, Produktentwicklung und Team-Dokumentation verwendet. - -## Konventionen - -### Naming Convention -- **Prefix `_` (Underscore)**: Alle internen Collections beginnen mit einem Underscore -- Beispiele: `_personas`, `_internal-docs`, `_drafts` - -### Verzeichnisstruktur -``` -src/content/ -├── _personas/ # Intern: Marketing Personas -│ ├── de/ -│ └── en/ -├── blog/ # Öffentlich: Blog-Artikel -├── features/ # Öffentlich: Features -└── ... -``` - -## Implementierte Interne Collections - -### 1. Personas (`_personas`) - -**Zweck**: Detaillierte Zielgruppen-Profile für Marketing und Produktentwicklung - -**Schema-Highlights**: -- Demographics (Alter, Ort, Bildung, Einkommen) -- Professional Profile (Job, Branche, Verantwortlichkeiten) -- Psychographics (Persönlichkeit, Werte, Motivationen, Frustrationen) -- Behavior (Tech-Affinität, Arbeitsweise, Tools) -- Memoro-Context (Use Cases, Benefits, Concerns, Features) -- Marketing-Relevanz (Segment, Channels, Messaging) - -**Zugriff**: `/admin/personas` (nur im Dev-Modus) - -## Technische Implementierung - -### 1. Collection Definition - -In `src/content/config.ts`: - -```typescript -// Private Collection mit _ Prefix -const _personasCollection = defineCollection({ - type: 'content', - schema: z.object({ - // Schema definition - visibility: z.enum(['internal', 'team', 'stakeholders']).default('internal'), - status: z.enum(['draft', 'active', 'archived']).default('draft'), - // ... weitere Felder - }) -}); - -export const collections = { - // Öffentliche Collections - 'blog': blogCollection, - 'features': featuresCollection, - - // Private Collections (mit _ Prefix) - '_personas': _personasCollection, -}; -``` - -### 2. Zugriffskontrolle - -Admin-Seiten implementieren Zugriffskontrolle: - -```astro ---- -// Nur im Development-Modus oder mit speziellem Query-Parameter -const isDev = import.meta.env.DEV; -const hasAccess = isDev || Astro.url.searchParams.has('access'); - -if (!hasAccess) { - return Astro.redirect('/404'); -} ---- -``` - -### 3. Keine öffentlichen Routes - -**Wichtig**: Für interne Collections werden KEINE öffentlichen Routes erstellt: - -```astro -// ❌ NICHT erstellen: -src/pages/[lang]/personas/[...slug].astro - -// ✅ NUR Admin-Routes: -src/pages/admin/personas.astro -``` - -## Best Practices - -### 1. Sicherheit - -- **Niemals** öffentliche Routes für interne Collections erstellen -- Admin-Seiten immer mit Zugriffskontrolle schützen -- Sensitive Daten nicht in Git committen (nutze `.gitignore` für sehr vertrauliche Inhalte) - -### 2. Organisation - -```markdown ---- -# Metadaten für interne Dokumente -status: "draft" | "active" | "archived" -visibility: "internal" | "team" | "stakeholders" -owner: "Marketing Team" -contributors: ["Product", "Sales"] -validatedAt: 2024-01-10T10:00:00Z ---- -``` - -### 3. Verwendung in Code - -```typescript -// Interne Collections laden -import { getCollection } from 'astro:content'; - -// Mit Error Handling -let personas = []; -try { - personas = await getCollection('_personas'); - // Filtern nach Status - const activePersonas = personas.filter(p => p.data.status === 'active'); -} catch (error) { - console.log('Internal collection not available'); -} -``` - -## Neue interne Collection hinzufügen - -### Schritt 1: Schema definieren - -In `src/content/config.ts`: - -```typescript -const _myInternalCollection = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string(), - visibility: z.enum(['internal', 'team', 'public']).default('internal'), - // ... weitere Felder - }) -}); -``` - -### Schritt 2: Zur Collections-Export hinzufügen - -```typescript -export const collections = { - // ... andere collections - '_myInternal': _myInternalCollection, -}; -``` - -### Schritt 3: Content-Verzeichnis erstellen - -```bash -mkdir -p src/content/_myInternal/de -mkdir -p src/content/_myInternal/en -``` - -### Schritt 4: Admin-Interface erstellen (optional) - -```astro -// src/pages/admin/my-internal.astro ---- -// Zugriffskontrolle -const isDev = import.meta.env.DEV; -if (!isDev) return Astro.redirect('/404'); - -const items = await getCollection('_myInternal'); ---- - -``` - -## Wartung und Governance - -### Verantwortlichkeiten - -| Collection | Owner | Review-Zyklus | Letzte Validierung | -|-----------|--------|---------------|-------------------| -| `_personas` | Marketing Team | Quartalsweise | Januar 2024 | -| `_internal-docs` | Product Team | Monatlich | - | - -### Archivierung - -Veraltete Inhalte sollten nicht gelöscht, sondern archiviert werden: - -```yaml -status: "archived" -archivedAt: 2024-01-15T10:00:00Z -archiveReason: "Outdated after product pivot" -``` - -## FAQ - -**Q: Können interne Collections in Produktion verwendet werden?** -A: Ja, aber nur über geschützte Admin-Interfaces oder interne Tools, niemals über öffentliche URLs. - -**Q: Wie verhindere ich versehentliches Veröffentlichen?** -A: -1. Nutze das `_` Prefix konsequent -2. Erstelle keine öffentlichen Routes -3. Implementiere Zugriffskontrolle in Admin-Seiten -4. Nutze `visibility` und `status` Felder - -**Q: Können interne Collections in der Sitemap erscheinen?** -A: Nein, da keine öffentlichen Routes erstellt werden, erscheinen sie automatisch nicht in der Sitemap. - -**Q: Wie sichere ich sehr sensitive Daten?** -A: -1. Nutze `.gitignore` für hochsensitive Inhalte -2. Verwende Umgebungsvariablen für Secrets -3. Implementiere robuste Authentifizierung für Admin-Bereiche - -## Beispiel: Personas Collection - -Die `_personas` Collection demonstriert Best Practices: - -```markdown ---- -name: "Sabine Schmidt" -title: "Die gestresste Projektmanagerin" - -# Strukturierte Daten -demographics: - age: 38 - location: "München" - -# Status-Management -status: "active" -visibility: "internal" - -# Tracking -createdAt: 2024-01-15T10:00:00Z -lastUpdated: 2024-01-15T10:00:00Z -validatedAt: 2024-01-10T10:00:00Z - -# Verantwortlichkeiten -owner: "Marketing Team" -contributors: ["Product", "Sales"] ---- -``` - -## Kontakt - -Bei Fragen zu internen Collections: -- Marketing-Personas: marketing@memoro.ai -- Technische Umsetzung: dev@memoro.ai \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/PROJECT-ARCHITECTURE.md b/apps/memoro/apps/landing/docs/PROJECT-ARCHITECTURE.md deleted file mode 100644 index dbf2b0fd3..000000000 --- a/apps/memoro/apps/landing/docs/PROJECT-ARCHITECTURE.md +++ /dev/null @@ -1,394 +0,0 @@ -# Memoro Website - Projekt-Architektur-Dokumentation - -## 📋 Übersicht - -Die Memoro-Website ist eine **mehrsprachige Marketing-Website** für eine KI-gestützte App zur Gesprächsdokumentation und Notizenerstellung. Die Website wurde mit **Astro 5.3.0** als statische Website entwickelt und unterstützt Deutsch (de) als Standardsprache sowie Englisch (en). - -## 🎯 Projektziel - -Die Website dient als zentrale Marketing- und Informationsplattform für die Memoro-App und bietet: -- Produktpräsentation und Feature-Übersicht -- Anleitungen und Dokumentation -- Blog und News-Bereich -- Team-Vorstellung -- Preisgestaltung und Pläne -- Branchenspezifische Lösungen -- Download-Möglichkeiten - -## 🛠 Technologie-Stack - -### Core Framework -- **Astro 5.3.0**: Static Site Generator mit hervorragender Performance -- **TypeScript**: Strict Mode für Typsicherheit -- **MDX**: Für erweiterte Content-Erstellung mit Komponenten - -### Styling & UI -- **Tailwind CSS 3.4**: Utility-first CSS Framework -- **Custom Theme System**: Zentralisierte Design-Tokens in `/src/theme/index.js` -- **Typography Plugin**: Für optimale Text-Darstellung -- **Dark Theme**: Durchgängiges dunkles Design (#181818 Hintergrund) - -### Content Management -- **Astro Content Collections**: Strukturierte Content-Verwaltung mit Zod-Schemas -- **15+ Content-Typen**: Blog, Team, Features, Guides, Industries, etc. -- **Mehrsprachigkeit**: Vollständige de/en Unterstützung - -### Integrationen -- **Sitemap**: Automatische Generierung für alle Sprachen -- **RSS Feeds**: Für jede Content-Collection und Sprache -- **Icons**: Astro-Icon mit Material Design Icons (MDI) -- **Analytics**: Plausible & Umami Integration - -## 📁 Projektstruktur - -``` -/ -├── src/ -│ ├── components/ # Wiederverwendbare Astro-Komponenten -│ │ ├── atoms/ # Kleine, atomare Komponenten -│ │ ├── detail/ # Detail-Seiten-Komponenten -│ │ ├── experiments/ # A/B-Testing Komponenten -│ │ ├── industries/ # Branchen-spezifische Komponenten -│ │ └── layouts/ # Layout-Komponenten -│ │ -│ ├── content/ # Alle Inhalte mit Zod-Schemas -│ │ ├── blog/ # Blog-Artikel (de/en Unterordner) -│ │ ├── team/ # Team-Profile -│ │ ├── features/ # Feature-Beschreibungen -│ │ ├── guides/ # Anleitungen -│ │ ├── industries/ # Branchenlösungen -│ │ ├── testimonials/ # Kundenstimmen -│ │ ├── blueprints/ # Vorlagen für Aufnahmen -│ │ ├── memories/ # Memory-Typen -│ │ ├── faqs/ # Häufige Fragen -│ │ ├── changelog/ # Produkt-Updates -│ │ ├── statistics/ # Nutzungsstatistiken -│ │ ├── calendar/ # Content-Kalender -│ │ ├── authors/ # Autoren-Profile -│ │ ├── wallpapers/ # Hintergrundbilder -│ │ ├── contracts/ # Rechtliche Dokumente -│ │ ├── dataprotection/# Datenschutz-Dokumente -│ │ └── pages/ # Hauptseiten-Inhalte -│ │ -│ ├── i18n/ # Internationalisierung -│ │ ├── ui.ts # UI-Übersetzungen -│ │ └── utils.ts # i18n-Hilfsfunktionen -│ │ -│ ├── layouts/ # Seiten-Layouts -│ │ ├── Layout.astro # Standard-Layout -│ │ └── HomeLayout.astro # Spezielles Home-Layout -│ │ -│ ├── pages/ # Routing-Struktur -│ │ ├── [lang]/ # Dynamisches Sprach-Routing -│ │ ├── admin/ # Admin-Bereich -│ │ ├── de/ # Deutsche RSS-Feeds -│ │ └── en/ # Englische RSS-Feeds -│ │ -│ ├── styles/ # Globale Styles -│ │ └── base.css # Basis-CSS mit Tailwind -│ │ -│ ├── theme/ # Theme-Konfiguration -│ │ └── index.js # Design-System-Tokens -│ │ -│ ├── utils/ # Hilfsfunktionen -│ │ └── experiments.ts # A/B-Testing Utilities -│ │ -│ └── middleware.ts # Request-Middleware für i18n -│ -├── public/ # Statische Assets -│ ├── images/ # Bilder organisiert nach Typ -│ │ ├── blog/ -│ │ ├── brand/ -│ │ ├── guides/ -│ │ ├── industries/ -│ │ ├── product_photos/ -│ │ ├── screenshots/ -│ │ ├── team/ -│ │ └── wallpaper/ -│ └── rss/ # RSS-Feed Styles -│ -├── docs/ # Projekt-Dokumentation -├── context/ # Kontext-Dokumente für KI -├── plans/ # Projekt-Pläne -└── posts/ # Social Media Posts -``` - -## 🌍 Internationalisierung (i18n) - -### Konfiguration -- **Default Locale**: Deutsch (`de`) -- **Unterstützte Sprachen**: Deutsch (`de`), Englisch (`en`) -- **Routing**: Präfix-basiert (`/de/...`, `/en/...`) -- **Fallback**: Automatische Weiterleitung zur Standardsprache - -### Implementierung -- **Middleware**: Behandelt Sprach-Weiterleitungen und 404s -- **Content-Organisation**: Sprachspezifische Unterordner in Collections -- **UI-Übersetzungen**: Zentralisiert in `src/i18n/ui.ts` -- **Sitemap**: Enthält alle Sprachversionen - -## 📚 Content Collections - -### Übersicht der Collections - -Die Website nutzt **15+ typisierte Content Collections** mit Zod-Schemas: - -1. **blog**: Artikel mit Metadaten (Autor, Tags, Kategorie) -2. **team**: Team-Profile mit Rollen und Social Links -3. **features**: Produkt-Features mit Icons und Kategorien -4. **guides**: Tutorials mit Schwierigkeitsgrad und Dauer -5. **industries**: Branchenlösungen mit Statistiken und FAQs -6. **testimonials**: Kundenstimmen nach Typ kategorisiert -7. **blueprints**: Aufnahme-Vorlagen für verschiedene Szenarien -8. **memories**: KI-generierte Inhaltstypen -9. **faqs**: Häufige Fragen nach Kategorien -10. **changelog**: Produkt-Updates und Release Notes -11. **statistics**: Wochen- und Monatsberichte -12. **calendar**: Content-Planung mit Events -13. **authors**: Autoren-Profile mit Statistiken -14. **wallpapers**: Hintergrundbilder mit Download-Tracking -15. **dataprotection**: Datenschutz-Dokumente -16. **contracts**: Rechtliche Dokumente -17. **pages**: Hauptseiten-Inhalte - -### Schema-Validierung - -Jede Collection hat ein **striktes Zod-Schema** für: -- Typ-Sicherheit -- Konsistente Datenstruktur -- Automatische Validierung beim Build -- IntelliSense-Unterstützung in der IDE - -## 🎨 Design-System - -### Theme-Konfiguration - -Zentralisiertes Theme in `/src/theme/index.js`: - -```javascript -{ - colors: { - primary: '#3B82F6', // Blau - secondary: '#10B981', // Grün - background: { - global: '#181818', // Dunkler Hintergrund - card: 'rgba(50, 50, 50, 0.8)', - cardHover: 'rgba(50, 50, 50, 0.99)' - }, - text: { - primary: '#F9FAFB', // Heller Text - secondary: '#D1D5DB', // Sekundärer Text - tertiary: '#9CA3AF' // Tertiärer Text - } - } -} -``` - -### Tailwind-Erweiterungen - -- **Custom Font Sizes**: Hero, Display, Heading mit responsiven Varianten -- **Typography Plugin**: Angepasst für Dark Theme -- **Custom Utilities**: scrollbar-none, bg-gradient-radial -- **Group-Open Variant**: Für Details-Elemente - -## 🚀 Build & Deployment - -### Build-Prozess -```bash -npm run dev # Entwicklungsserver (localhost:4321) -npm run build # Production Build nach ./dist/ -npm run preview # Vorschau des Production Builds -npm run astro check # TypeScript Type-Checking -``` - -### Statische Generierung -- **Vollständig statisch**: Alle Seiten werden zur Build-Zeit generiert -- **Keine Server-Runtime**: Optimale Performance -- **getStaticPaths()**: Für dynamische Routen -- **Optimierte Assets**: Automatische Bild-Optimierung mit Sharp - -## 📊 Analytics & Tracking - -### Plausible Analytics -- **Cookieless Tracking**: DSGVO-konform -- **Event-Tracking**: Detailliertes Nutzerverhalten -- **Funnel-Analyse**: Conversion-Tracking -- **Custom Events**: Download, CTA-Clicks, etc. - -### Umami Analytics -- **Self-Hosted Option**: Datenschutz-freundlich -- **Real-Time Stats**: Live-Besucherdaten -- **Keine Cookies**: Privacy-first Ansatz - -## 🧪 Experimente & A/B-Testing - -### PostHog Integration -- **Feature Flags**: Für kontrollierte Rollouts -- **A/B-Tests**: Hero-Varianten, CTA-Buttons -- **Conversion-Tracking**: Erfolgsmetriken - -### Implementierte Tests -- Hero-Section Varianten -- CTA-Button Tests -- Navigation Download-Button - -## 🔒 Sicherheit & Datenschutz - -### DSGVO-Konformität -- **Datenschutzerklärung**: Mehrsprachig verfügbar -- **Cookie-Consent**: Optional für erweiterte Features -- **Datenminimierung**: Nur notwendige Daten -- **TOMs**: Technische und organisatorische Maßnahmen dokumentiert - -### Content Security -- **Statische Generierung**: Keine Server-Vulnerabilities -- **TypeScript**: Typ-sichere Entwicklung -- **Validierung**: Zod-Schemas für alle Inhalte - -## 🎯 Besondere Features - -### 1. Recording Blueprints -Vorgefertigte Vorlagen für verschiedene Aufnahme-Szenarien: -- Büro-Meetings -- Baustellendokumentation -- Akademische Vorlesungen -- Kundengespräche - -### 2. Memory-System -KI-generierte Inhaltstypen aus Aufnahmen: -- Zusammenfassungen -- Aufgaben & Termine -- Blog-Beiträge -- Social Media Posts - -### 3. Mana-Credit-System -Flexibles Abrechnungsmodell: -- Tägliche Mana-Gutschriften -- Mana-Potions zum Nachkaufen -- Maximale Mana-Limits je Plan - -### 4. Multi-Collection RSS -RSS-Feeds für jede Content-Collection: -- Sprachspezifisch -- Automatisch generiert -- XSLT-Styling - -### 5. Content-Kalender -Integrierte Planung für Content-Erstellung: -- Monatsplanung -- Status-Tracking -- Multi-Autor-Support - -## 📈 Performance-Optimierungen - -### Build-Optimierungen -- **Static Site Generation**: Keine Server-Laufzeit -- **Asset-Optimierung**: Automatische Bild-Kompression -- **Code-Splitting**: Optimale Bundle-Größen -- **Lazy Loading**: Für Bilder und Komponenten - -### Frontend-Optimierungen -- **Tailwind Purge**: Nur verwendete CSS-Klassen -- **Font-Optimierung**: System-Fonts mit Fallbacks -- **Minimal JavaScript**: Nur wo notwendig -- **Service Worker**: Für Offline-Support (geplant) - -## 🛠 Entwickler-Tools - -### Verfügbare Skripte -- `npm run dev`: Lokale Entwicklung -- `npm run build`: Production Build -- `npm run preview`: Build-Vorschau -- `npm run astro check`: Type-Checking - -### Debug-Tools -- **Admin-Bereich**: `/admin/` für Content-Übersicht -- **Author-Management**: `/admin/authors` -- **Find-Untranslated**: Script für fehlende Übersetzungen - -## 📝 Code-Konventionen - -### Komponenten -- **PascalCase**: Für Komponentennamen -- **Props-Interfaces**: TypeScript-Definitionen -- **Import-Reihenfolge**: Externe → Interne - -### Content -- **Frontmatter**: Zod-validiert -- **MDX-Support**: Komponenten in Markdown -- **Sprachordner**: de/en Struktur - -### Styling -- **Tailwind-First**: Utility-Klassen bevorzugt -- **Kebab-Case**: Für Custom-CSS -- **Keine Inline-Styles**: Außer absolut notwendig - -## 🚦 Deployment-Strategie - -### Hosting -- **Static Hosting**: Optimiert für CDN-Deployment -- **Asset-CDN**: Für Bilder und Medien -- **Multi-Region**: Für optimale Latenz - -### CI/CD -- **Automatische Builds**: Bei Git-Push -- **Type-Checking**: Vor jedem Build -- **Sitemap-Generierung**: Automatisch -- **RSS-Feed-Updates**: Bei Content-Änderungen - -## 📊 Monitoring & Wartung - -### Analytics-Dashboard -- Besucher-Statistiken -- Conversion-Tracking -- Event-Analyse -- Funnel-Visualisierung - -### Content-Management -- Regelmäßige Blog-Posts -- Feature-Updates -- Team-Änderungen -- FAQ-Erweiterungen - -### Performance-Monitoring -- Lighthouse-Scores -- Core Web Vitals -- Bundle-Size-Tracking -- Build-Zeit-Optimierung - -## 🔮 Zukünftige Erweiterungen - -### Geplante Features -- PWA-Support -- Erweiterte Suche -- Newsletter-Integration -- Mehr Sprachen -- API-Dokumentation -- Video-Tutorials - -### Technische Verbesserungen -- Service Worker -- WebP-Bildformat -- Erweiterte Caching-Strategien -- GraphQL-API (optional) -- CMS-Integration (optional) - -## 📞 Support & Dokumentation - -### Interne Dokumentation -- `/docs/`: Technische Dokumentation -- `/context/`: KI-Kontext-Dokumente -- `/plans/`: Projekt-Roadmaps -- `CLAUDE.md`: KI-Assistenz-Guidelines - -### Externe Ressourcen -- [Astro Dokumentation](https://docs.astro.build) -- [Tailwind CSS](https://tailwindcss.com) -- [MDX](https://mdxjs.com) -- [Zod](https://zod.dev) - ---- - -**Letztes Update**: Januar 2025 -**Version**: 2.0.0 -**Maintainer**: Memoro Development Team \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/appstores/AppStoreEntryInfos.md b/apps/memoro/apps/landing/docs/appstores/AppStoreEntryInfos.md deleted file mode 100644 index 6fe855d45..000000000 --- a/apps/memoro/apps/landing/docs/appstores/AppStoreEntryInfos.md +++ /dev/null @@ -1,370 +0,0 @@ -# App Store & Play Store Entry Informationen - -## ⚠️ Wichtige Formatierungshinweise - -App Store Limitierungen: -- Keine Markdown-Formatierung (keine ** für Bold) -- Keine Bullet Points (•), stattdessen Bindestriche (-) verwenden -- Einfacher Text ohne Formatierung -- Keine Emojis im Text (werden nicht unterstützt) - -## 📱 App Store (iOS) Informationen - -### App Name -Memoro - KI Meeting-Protokoll -- Untertitel: Automatische Gesprächsnotizen - -### Keywords (100 Zeichen) -meeting,protokoll,transkription,notizen,aufnahme,diktat,voice-to-text,gespräch,zusammenfassung - -### Beschreibung (4000 Zeichen) - -Headline: Memoro - KI Meeting-Protokoll & Automatische Notizen - -Haupttext: -Verwandle jedes Gespräch in strukturierte Notizen - automatisch und intelligent. - -Memoro ist deine KI-gestützte Meeting-App für automatische Gesprächsprotokolle, Transkriptionen und intelligente Zusammenfassungen. Nie wieder händisch mitschreiben - konzentriere dich auf das Wesentliche, während Memoro für dich dokumentiert. - -Perfekt für: -- Business Meetings & Konferenzen -- Vorlesungen & Seminare -- Kundengespräche & Beratungen -- Interviews & Recherchen -- Baustellenbesprechungen -- Arztgespräche & Therapiesitzungen -- Team-Briefings & Stand-ups - -Kernfunktionen: -Intelligente Meeting-Aufzeichnung -- Automatische Transkription in Echtzeit -- KI-gestützte Zusammenfassungen -- Erkennung von Aufgaben & Terminen -- Sprechererkennung für klare Zuordnung - -26+ Sprachen & Dialekte -- Deutsch, Schweizerdeutsch, Englisch -- Automatische Spracherkennung -- Mehrsprachige Meetings problemlos -- Übersetzungsfunktion integriert - -Professionelle Vorlagen -- Business: Meeting-Protokolle, Kundengespräche -- Bildung: Vorlesungen, Seminare -- Handwerk: Baustellenbesprechungen -- Medizin: Patientengespräche -- Beratung: Coaching-Sessions -- Vertrieb: Sales-Gespräche -- Individuell anpassbar - -Nahtlose Team-Kollaboration -- Ein-Klick-Sharing via WhatsApp, Teams, Slack -- PDF & Word Export -- Web-App unter app.memoro.ai -- Automatische Cloud-Synchronisation - -KI-Assistent integriert -- Frage deine Memos direkt -- Kombiniere mehrere Gespräche -- Intelligente Suche -- Automatische Kategorisierung - -Produktivitätssteigerung: -- 80% Zeitersparnis bei Protokollen -- 100% der wichtigen Details erfasst -- 5x schnellere Nachbereitung -- Durchsuchbare Gesprächsarchive - -Deutscher Datenschutz: -- DSGVO-konform -- Server in Deutschland -- Ende-zu-Ende-Verschlüsselung -- Keine Weitergabe an Dritte -- ISO 27001 zertifiziert - -Premium Features: -- Unbegrenzte Aufnahmedauer -- Erweiterte KI-Analysen -- Team-Workspaces -- API-Zugang -- Priority Support - -Das sagen unsere Nutzer: -"Endlich kann ich mich auf Gespräche konzentrieren statt auf Notizen!" - Sarah M., Projektmanagerin - -"Spart mir täglich 2 Stunden Nacharbeit." - Dr. Thomas K., Berater - -"Unverzichtbar für internationale Meetings!" - Lisa W., Sales Director - -Jetzt kostenlos testen -Starte mit 60 Freiminuten und erlebe, wie Memoro deine Meetings revolutioniert. Keine Kreditkarte erforderlich. - -Support & Kontakt: -support@memoro.ai -www.memoro.ai - -Transformiere deine Gespräche in Wissen - mit Memoro. - -### Promotional Text (170 Zeichen) -KI Meeting-Protokoll in 26 Sprachen. Automatische Transkription & Zusammenfassung. DSGVO-konform. Jetzt 60 Min kostenlos testen! - -### Neu in dieser Version -Memoro 2.0 - Das größte Update aller Zeiten! - -Revolutionäre KI-Features: -- Blitzschnelle Verarbeitung - bis zu 10x schneller Memos erhalten -- Mana Credits System - Transparente KI-Nutzung mit voller Kostenkontrolle, Einmalkäufe möglich -- Memos befragen - Stelle Fragen zu deinen Aufnahmen, erhalte intelligente Antworten -- Memos kombinieren - Verbinde mehrere Gespräche zu umfassenden Projekten - -Maximaler Datenschutz: -- Google Analytics komplett entfernt - 100% Privatsphäre -- Open-Source Analytics in der EU - DSGVO-konform -- Datenbank in Frankfurt - Höchste deutsche Sicherheitsstandards -- Alle Daten bleiben in der EU - Keine Drittländer-Übertragung -- Verbesserter Datenschutz mit weniger Drittanbietern - -Performance & Design: -- Komplett neues Design - Moderner, intuitiver, Kontext-Menüs -- Erweiterte Aufnahmen - Längere Sessions möglich -- Web-App Aufnahme - Direkt im Browser aufzeichnen - -Noch mehr Verbesserungen: -- Mehr Sprachen - Jetzt 80+ Sprachen und Dialekte -- Verbesserte Zusammenfassungen -- Optimierte Sprechererkennung -- Stabilere Langzeit-Aufnahmen - ---- - -## 🤖 Google Play Store (Android) Informationen - -### App-Titel (30 Zeichen) -Memoro - KI Meeting-Protokoll - -### Kurzbeschreibung (80 Zeichen) -Automatische Meeting-Protokolle & Transkription. KI-Notizen in 26 Sprachen. - -### Vollständige Beschreibung (4000 Zeichen) -[Identisch mit App Store Beschreibung oben] - -### Tags -meeting, protokoll, transkription, notizen, aufnahme, diktat, voice-to-text, gespräch, zusammenfassung, ki, künstliche intelligenz, business, produktivität, team - ---- - -## 📸 Screenshot-Texte (Optimiert für SEO) - -### Screenshot 1 - Startbildschirm -Headline: KI Meeting-Protokoll starten -Subline: Automatische Transkription beginnt sofort - -### Screenshot 2 - Aufnahme -Headline: Meeting aufzeichnen & transkribieren -Subline: Echtzeit Voice-to-Text in 26 Sprachen - -### Screenshot 3 - KI-Zusammenfassung -Headline: Intelligente Meeting-Zusammenfassung -Subline: KI erkennt Aufgaben, Termine & Kernpunkte - -### Screenshot 4 - Sprechererkennung -Headline: Automatische Sprecherzuordnung -Subline: Wer hat was gesagt - klar dokumentiert - -### Screenshot 5 - Teilen -Headline: Meeting-Notizen sofort teilen -Subline: WhatsApp, Teams, Slack, E-Mail & mehr - -### Screenshot 6 - Vorlagen -Headline: Professionelle Meeting-Vorlagen -Subline: Business, Bildung, Medizin & mehr - -### Screenshot 7 - Mehrsprachig -Headline: 26 Sprachen automatisch erkennen -Subline: Internationale Meetings problemlos - -### Screenshot 8 - KI-Assistent -Headline: Frage deine Meetings direkt -Subline: KI-Suche in allen Protokollen - -### Screenshot 9 - Datenschutz -Headline: DSGVO-konform & sicher -Subline: Deutsche Server, verschlüsselt - -### Screenshot 10 - Web-App -Headline: Überall verfügbar -Subline: iOS, Android & Web synchronisiert - ---- - -## 🌍 Lokalisierte Versionen - -### English (App Store/Play Store) - -#### App Name -Memoro - AI Meeting Minutes -Subtitle: Automatic conversation notes - -#### Keywords -meeting,minutes,transcription,notes,recording,dictation,voice-to-text,conversation,summary,ai - -#### Short Description -AI-powered meeting minutes & transcription. Automatic notes in 26+ languages. - -#### Description (Kurzfassung) -Transform every conversation into structured notes - automatically and intelligently. - -Memoro is your AI-powered meeting app for automatic minutes, transcriptions, and intelligent summaries. Never write notes manually again - focus on what matters while Memoro documents for you. - -Core Features: -- Real-time transcription -- AI summaries & action items -- 26+ languages supported -- Speaker recognition -- Professional templates -- One-click sharing -- GDPR compliant -- German servers - -Start free with 60 minutes. No credit card required. - ---- - -## 📊 App Store Optimization (ASO) Strategie - -### Primäre Keywords (Deutsch) -1. Meeting Protokoll -2. Transkription App -3. Voice to Text -4. Gesprächsnotizen -5. Diktierfunktion -6. KI Zusammenfassung -7. Automatische Notizen -8. Spracherkennung - -### Sekundäre Keywords -1. Business Meeting App -2. Konferenz Tool -3. Team Kollaboration -4. Digitale Notizen -5. Audio Transkription -6. Meeting Aufzeichnung -7. Gesprächsprotokoll -8. Speech to Text Deutsch - -### Long-Tail Keywords -1. Automatische Meeting Protokolle erstellen -2. KI gestützte Gesprächszusammenfassung -3. Mehrsprachige Transkription App -4. DSGVO konforme Meeting App -5. Voice to Text für Business - -### Konkurrenzanalyse Keywords -- Otter.ai Alternative -- Notion Voice Notes -- Microsoft Teams Transkription -- Zoom Meeting Protokoll -- Google Meet Notizen - ---- - -## 🎯 Marketing Messaging - -### Value Propositions -1. Zeitersparnis: "Spare 2 Stunden täglich" -2. Vollständigkeit: "Verpasse nie wieder wichtige Details" -3. Produktivität: "5x schnellere Meeting-Nachbereitung" -4. Sicherheit: "100% DSGVO-konform, Server in Deutschland" -5. Vielseitigkeit: "26 Sprachen, alle Branchen" - -### Call-to-Actions -- "Jetzt kostenlos testen" -- "60 Minuten gratis" -- "Meeting-Stress beenden" -- "Protokolle automatisieren" -- "KI-Assistent aktivieren" - -### Social Proof -- "50.000+ zufriedene Nutzer" -- "4.8 Sterne Bewertung" -- "Von Experten empfohlen" -- "#1 Meeting App in Deutschland" - ---- - -## 📝 Zusätzliche Store-Felder - -### Kategorien -- Primär: Produktivität -- Sekundär: Business - -### Altersfreigabe -- 4+ (Keine Altersbeschränkung) - -### In-App-Käufe -- Memoro Pro Monat (9,99 €) -- Memoro Pro Jahr (89,99 €) -- Memoro Teams (ab 19,99 €/Nutzer) - -### Datenschutz-Labels -- Kontaktinformationen (optional) -- Audio-Aufnahmen (erforderlich) -- Verwendungsdaten (Analytics) -- Diagnose (Crash-Reports) - -### Support-Informationen -- E-Mail: support@memoro.ai -- Website: https://www.memoro.ai -- Datenschutz: https://www.memoro.ai/de/legal/dataprivacy -- AGB: https://www.memoro.ai/de/legal/agb - -### App-Größe -- iOS: ~45 MB -- Android: ~38 MB - -### Mindestanforderungen -- iOS: 14.0 oder höher -- Android: 7.0 (API 24) oder höher - ---- - -## 🚀 Launch-Strategie - -### Soft Launch Länder -1. Deutschland -2. Österreich -3. Schweiz - -### Vollständiger Launch -- EU-Länder -- USA & Kanada -- UK & Australien - -### Preisgestaltung -- Freemium: 60 Min/Monat kostenlos -- Pro: 9,99 €/Monat -- Teams: Ab 19,99 €/Nutzer/Monat -- Enterprise: Individuell - ---- - -## 📈 Erfolgsmetriken - -### Key Performance Indicators -- Download-Rate -- Conversion Rate (Free zu Pro) -- User Retention (Tag 1, 7, 30) -- Durchschnittliche Sitzungsdauer -- App Store Bewertung -- Keyword Rankings - -### Ziele Q1 2025 -- 100.000 Downloads -- 4.5+ Sterne Bewertung -- Top 10 Produktivitäts-Apps -- 15% Conversion Rate - ---- - -*Letzte Aktualisierung: September 2025* -*Version: 1.0* \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/appstores/AppStoreScreenshotAnalysis.md b/apps/memoro/apps/landing/docs/appstores/AppStoreScreenshotAnalysis.md deleted file mode 100644 index 01e825b70..000000000 --- a/apps/memoro/apps/landing/docs/appstores/AppStoreScreenshotAnalysis.md +++ /dev/null @@ -1,268 +0,0 @@ -# App Store Screenshot Analyse & Optimierungsvorschläge - -## Best Practices für App Store Screenshots - -### Grundlegende Prinzipien - -#### 1. Die ersten 2-3 Screenshots sind entscheidend -- 70% der Nutzer schauen nur die ersten 2-3 Screenshots an -- Diese müssen die Hauptfunktionen und den größten Nutzen zeigen -- Der erste Screenshot sollte die Kernfunktion visualisieren - -#### 2. Text-zu-Bild Verhältnis -- Maximal 20% der Fläche sollte Text sein -- Headlines sollten kurz und prägnant sein (3-6 Wörter) -- Verwende große, gut lesbare Schriftarten - -#### 3. Visuelle Hierarchie -- Klare Fokuspunkte setzen -- Kontrastreiche Farben für wichtige Elemente -- Device-Mockups verwenden für Kontext - -#### 4. Storytelling durch Screenshots -- Erzähle eine Geschichte über die User Journey -- Zeige Problem → Lösung → Ergebnis -- Baue emotionale Verbindung auf - -#### 5. SEO-Optimierung -- Keywords in Screenshot-Überschriften verwenden -- Relevante Suchbegriffe einbauen -- Call-to-Actions integrieren - -#### 6. A/B Testing Prioritäten -- Reihenfolge der Screenshots -- Überschriften-Texte -- Farbschemata -- Mit/ohne Device-Mockups - -#### 7. Lokalisierung -- Screenshots für verschiedene Märkte anpassen -- Sprache der UI-Elemente beachten -- Kulturell relevante Beispiele verwenden - -#### 8. Technische Anforderungen -- iOS: 1242 x 2208px (iPhone) oder 1290 x 2796px -- Hochauflösende Grafiken verwenden -- Konsistentes Design über alle Screenshots - ---- - -## Aktuelle Screenshot-Analyse - -### Screenshot 1: "Memoro hört zu und führt Protokoll" -**Stärken:** -- Klare Hauptfunktion dargestellt -- Einfaches, verständliches Interface -- Guter Kontrast mit gelbem Accent - -**Schwächen:** -- Text könnte prägnanter sein -- Kein klarer Call-to-Action -- Interface wirkt etwas leer - -### Screenshot 2: "Schreibt Gesprochenes auf und fasst zusammen" -**Stärken:** -- Zeigt konkrete Funktionalität -- Liste verdeutlicht Vielseitigkeit - -**Schwächen:** -- Zu viel Text im Screenshot -- Headline zu lang -- Visuelle Hierarchie unklar - -### Screenshot 3: "Sortiere deine Memos und durchsuche sie" -**Stärken:** -- Zeigt Organisationsfunktionen -- Tags-System sichtbar - -**Schwächen:** -- Nicht sofort verständlich -- Wenig emotionaler Appeal - -### Screenshot 4: "Angepasste Modi für etliche Gespräche" -**Stärken:** -- Zeigt Anpassungsmöglichkeiten -- Verschiedene Use Cases - -**Schwächen:** -- Headline unklar formuliert -- Interface sehr textlastig - -### Screenshot 5: "Teile deine Memos über alle Kanäle" -**Stärken:** -- Klare Sharing-Funktion -- Bekannte App-Icons - -**Schwächen:** -- Layout nicht optimal -- Könnte visuell ansprechender sein - -### Screenshot 6: "Versteht über 80 Sprachen und übersetzt" -**Stärken:** -- Starkes Verkaufsargument -- Flaggen visualisieren Feature - -**Schwächen:** -- Design inkonsistent zu anderen Screenshots -- Zahlen-Claim sollte prominenter sein - -### Screenshot 7: "Neue Funktionen in Memoro 2.0" -**Stärken:** -- Update-Informationen -- Feature-Liste - -**Schwächen:** -- Zu viel Text -- Nicht für Erstnutzer relevant -- Sollte nicht in ersten Screenshots sein - -### Screenshot 8: "Dein automatisches Meeting-Protokoll" -**Stärken:** -- Klarer Use Case -- Device-Mockup für Kontext - -**Schwächen:** -- Redundant zu Screenshot 1 -- Text auf Device zu klein - ---- - -## Verbesserungsvorschläge - -### Option A: Feature-Fokussiert -**Zielgruppe:** Produktivitätsorientierte Business-Nutzer - -1. **KI Meeting-Protokoll in Aktion** - - Live-Aufnahme mit Echtzeit-Transkription - - Headline: "Nie wieder mitschreiben" - - Zeige aktive Aufnahme mit Wellenform - -2. **Intelligente Zusammenfassung** - - Fertige Zusammenfassung mit Kernpunkten - - Headline: "KI fasst zusammen" - - Vorher/Nachher Vergleich - -3. **80+ Sprachen automatisch** - - Mehrsprachiges Meeting - - Headline: "Versteht 80+ Sprachen" - - Flaggen-Grid prominent - -4. **Ein-Klick Sharing** - - Export-Optionen - - Headline: "Sofort teilen" - - WhatsApp, Teams, Slack Icons - -5. **DSGVO-konform** - - Sicherheits-Features - - Headline: "100% sicher" - - Deutsche Server betonen - -### Option B: Use-Case-Orientiert -**Zielgruppe:** Verschiedene Berufsgruppen - -1. **Business Meeting** - - Manager in Meeting-Situation - - Headline: "Meeting-Stress ade" - - Zeige Protokoll-Ergebnis - -2. **Student in Vorlesung** - - Uni-Kontext - - Headline: "Vorlesungen meistern" - - Zusammenfassung einer Vorlesung - -3. **Arzt-Patient Gespräch** - - Medizinischer Kontext - - Headline: "Gespräche dokumentiert" - - DSGVO-Hinweis - -4. **Baustellenbesprechung** - - Handwerker-Kontext - - Headline: "Projekte im Griff" - - Checklisten-Feature - -5. **Journalist Interview** - - Interview-Situation - - Headline: "Interviews perfekt" - - Transkription-Feature - -### Option C: Problem-Lösung-Storytelling -**Zielgruppe:** Schmerzpunkt-orientierte Nutzer - -1. **Das Problem** - - Gestresste Person mit Notizblock - - Headline: "Kennst du das?" - - Chaos visualisieren - -2. **Die Lösung** - - Memoro App-Start - - Headline: "Memoro hört zu" - - Ein-Knopf-Bedienung - -3. **Der Prozess** - - KI arbeitet - - Headline: "KI macht die Arbeit" - - Fortschrittsanzeige - -4. **Das Ergebnis** - - Fertige Zusammenfassung - - Headline: "Fertig in Sekunden" - - Struktur zeigen - -5. **Der Mehrwert** - - Zufriedener Nutzer - - Headline: "2 Stunden gespart" - - Testimonial einbauen - ---- - -## Empfohlene Sofortmaßnahmen - -### Priorität 1: Headlines optimieren -- Kürzer (max. 4 Wörter) -- Keywords einbauen -- Nutzen statt Features - -### Priorität 2: Ersten Screenshot optimieren -- Stärkerer visueller Hook -- Klarere Value Proposition -- Call-to-Action einbauen - -### Priorität 3: Konsistenz verbessern -- Einheitliches Farbschema -- Gleiche Schriftgrößen -- Device-Mockups vereinheitlichen - -### Priorität 4: Text reduzieren -- Weniger Text pro Screenshot -- Größere Schrift -- Mehr visuelle Elemente - -### Priorität 5: A/B Tests durchführen -- Option A vs. Option B testen -- Conversion-Rates messen -- Iterativ verbessern - ---- - -## Metriken zur Erfolgsmessung - -- **Conversion Rate:** App Store Seite → Download -- **Screenshot-Engagement:** Wie viele Screenshots werden angeschaut -- **Time-on-Page:** Verweildauer auf App Store Seite -- **Keyword Rankings:** Position für Hauptkeywords -- **A/B Test Results:** Welche Variante performt besser - ---- - -## Nächste Schritte - -1. Entscheidung für eine Option (A, B oder C) -2. Neue Screenshots erstellen -3. A/B Test aufsetzen -4. Performance monitoren -5. Basierend auf Daten optimieren - ---- - -*Erstellt: September 2025* -*Version: 1.0* \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/appstores/images/current-app-store-screenshots.png b/apps/memoro/apps/landing/docs/appstores/images/current-app-store-screenshots.png deleted file mode 100644 index d3da112f4..000000000 Binary files a/apps/memoro/apps/landing/docs/appstores/images/current-app-store-screenshots.png and /dev/null differ diff --git a/apps/memoro/apps/landing/docs/blog-image-guidelines.md b/apps/memoro/apps/landing/docs/blog-image-guidelines.md deleted file mode 100644 index 9542d1d11..000000000 --- a/apps/memoro/apps/landing/docs/blog-image-guidelines.md +++ /dev/null @@ -1,192 +0,0 @@ -# Blog Image Guidelines - -## Overview -This document defines the visual standards and guidelines for all blog images on the Memoro website. Following these guidelines ensures consistency, professionalism, and brand alignment across all content. - -## Visual Identity - -### Core Principles -- **Modern & Professional**: Clean, contemporary design that reflects Memoro's innovative approach -- **Tech-Forward but Human-Centric**: Balance technical sophistication with approachability -- **Consistent Brand Experience**: Every image should feel like part of the Memoro family -- **Accessibility First**: High contrast, clear visuals that work for all users - -### Brand Colors -- **Primary Yellow**: `#F8D62B` -- **Accent Colors**: Use sparingly for highlights -- **Backgrounds**: Primarily white (`#FFFFFF`) or black (`#181818`) -- **Text on Images**: Dark gray (`#333333`) for maximum readability - -## Image Types & Specifications - -### 1. Hero Images -- **Purpose**: Article headers, primary visual impact -- **Dimensions**: 1200x630px (Open Graph optimized) -- **Style**: Bold, eye-catching, sets the article tone -- **File Size**: Max 200KB (optimized WebP) - -### 2. Concept Visualizations -- **Purpose**: Abstract representations of complex ideas -- **Dimensions**: 800x450px -- **Style**: Minimalist diagrams, icons, and shapes -- **Use When**: Explaining abstract concepts, workflows, or systems - -### 3. Workflow Diagrams -- **Purpose**: Step-by-step process illustrations -- **Dimensions**: 800x450px or 1000x600px for complex flows -- **Style**: Numbered steps, clear flow direction, consistent iconography -- **Elements**: Arrows, numbered circles, descriptive labels - -### 4. Comparison Graphics -- **Purpose**: Before/after, with/without scenarios -- **Dimensions**: 800x450px -- **Style**: Split-screen or side-by-side layouts -- **Key Feature**: Clear visual distinction between states - -### 5. Data Visualizations -- **Purpose**: Statistics, metrics, performance indicators -- **Dimensions**: 600x400px -- **Style**: Clean charts, modern gauges, progress indicators -- **Colors**: Use brand colors for data points - -## Design Standards - -### Typography on Images -- **Headings**: Sans-serif, bold, minimum 24pt -- **Body Text**: Sans-serif, regular, minimum 16pt -- **Font Suggestions**: Inter, Roboto, or system fonts -- **Contrast**: Always ensure WCAG AA compliance - -### Iconography -- **Style**: Outline or filled, consistent weight -- **Size**: Minimum 32x32px for visibility -- **Sources**: Heroicons, Tabler Icons, or custom -- **Consistency**: Use same icon set throughout article - -### Composition Guidelines -- **Spacing**: Generous whitespace, avoid clutter -- **Alignment**: Consistent grid system -- **Hierarchy**: Clear visual priority -- **Balance**: Even distribution of visual weight - -## AI Image Generation Prompts - -### Standard Prompt Structure -``` -Create a [IMAGE TYPE] showing [DESCRIPTION]. -Style: Modern, professional, clean design. -Colors: Use blue (#0066CC) and purple (#6B46C1) as primary colors. -Background: White or light gray. -Additional: [SPECIFIC REQUIREMENTS] -Dimensions: [WIDTH]x[HEIGHT]px -Avoid: Stock photo clichés, overly complex designs, dark backgrounds -``` - -### Example Prompts by Type - -#### Hero Image -``` -Create a hero image visualizing AI-powered meeting assistance. -Style: Modern, professional, clean design with abstract geometric shapes. -Colors: Gradient from blue (#0066CC) to purple (#6B46C1). -Background: White with subtle geometric patterns. -Include: Floating interface elements suggesting productivity. -Dimensions: 1200x630px -Avoid: Literal office scenes, stock photo style -``` - -#### Workflow Diagram -``` -Design a 4-step workflow diagram for meeting documentation. -Style: Flat design with numbered steps connected by flowing lines. -Colors: Primary blue (#0066CC) with purple accents. -Each step: Icon + short label, connected by arrows. -Background: Clean white. -Dimensions: 800x450px -``` - -## Do's and Don'ts - -### ✅ DO -- Use consistent visual language across article series -- Include subtle gradients and modern effects -- Maintain high contrast for accessibility -- Add subtle shadows for depth -- Use brand colors prominently -- Keep text minimal and impactful -- Test images at different sizes - -### ❌ DON'T -- Use generic stock photos -- Include photos of real people (unless team photos) -- Create overly complex or busy designs -- Use conflicting color schemes -- Add unnecessary decorative elements -- Use low-resolution or pixelated graphics -- Forget mobile optimization - -## File Management - -### Naming Convention -``` -[article-slug]-[image-type]-[number].webp -``` -Examples: -- `prompt-engineering-hero-01.webp` -- `ai-assistant-workflow-01.webp` -- `decision-making-comparison-01.webp` - -### Storage Structure -``` -/public/images/blog/ -├── heroes/ # Hero images -├── diagrams/ # Workflow and concept diagrams -├── comparisons/ # Before/after graphics -└── data-viz/ # Charts and data visualizations -``` - -### Optimization Requirements -1. **Format**: WebP with JPG fallback -2. **Compression**: 85% quality for WebP -3. **Lazy Loading**: Implement for all non-hero images -4. **Alt Text**: Descriptive, keyword-optimized -5. **Responsive**: Provide 2x versions for retina displays - -## Implementation Checklist - -Before publishing any blog image: -- [ ] Follows brand color guidelines -- [ ] Meets dimension requirements -- [ ] Under 200KB file size -- [ ] Has descriptive alt text -- [ ] Tested on mobile devices -- [ ] Consistent with article series style -- [ ] Optimized for web performance -- [ ] Accessible contrast ratios - -## Tools & Resources - -### Recommended Design Tools -- **Figma**: For creating custom graphics -- **Canva**: For quick layouts with brand templates -- **draw.io**: For technical diagrams -- **DALL-E / Midjourney**: For AI-generated base images - -### Optimization Tools -- **Squoosh**: Web-based image optimization -- **ImageOptim**: Mac app for batch optimization -- **TinyPNG**: Online WebP/PNG optimization - -### Color & Contrast Checkers -- **WebAIM Contrast Checker** -- **Stark (Figma plugin)** -- **Colorable.co** - -## Version History -- v1.0 (2025-01-22): Initial guidelines created -- Created by: Till Schneider -- Last updated: 2025-01-22 - ---- - -For questions or suggestions about these guidelines, please contact the content team. \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/components/roi-calculator.md b/apps/memoro/apps/landing/docs/components/roi-calculator.md deleted file mode 100644 index 03f357251..000000000 --- a/apps/memoro/apps/landing/docs/components/roi-calculator.md +++ /dev/null @@ -1,174 +0,0 @@ -# ROI-Rechner Komponente - -## Übersicht -Interaktiver ROI (Return on Investment) Rechner zur Visualisierung der Zeit- und Geldersparnis mit Memoro. - -## Features -- 🎚️ **Interaktive Slider** für alle Parameter -- 📊 **Echtzeit-Berechnung** bei jeder Änderung -- 💰 **Zeit- und Geldersparnis** für Woche/Monat/Jahr -- 📈 **ROI-Berechnung** zeigt Amortisationszeit -- 🌍 **Mehrsprachig** (DE/EN) -- 📱 **Responsive Design** für alle Geräte -- 🎨 **Anpassbares Design** mit Farbschema - -## Verwendung - -### Basic Usage -```astro -import ROICalculator from "../components/ROICalculator.astro"; - - -``` - -### Mit Custom Props -```astro - -``` - -## Props - -| Prop | Type | Default | Beschreibung | -|------|------|---------|--------------| -| `lang` | `'de' \| 'en'` | `'de'` | Sprache der Komponente | -| `title` | `string` | Auto | Überschrift des Rechners | -| `subtitle` | `string` | Auto | Untertitel/Beschreibung | -| `accentColor` | `string` | `'primary'` | Farbschema für Akzente | - -## Einstellbare Parameter - -### Meetings pro Woche -- **Range:** 1-30 Meetings -- **Default:** 10 Meetings -- **Einfluss:** Direkte Multiplikation der Zeitersparnis - -### Minuten pro Meeting -- **Range:** 15-120 Minuten -- **Default:** 45 Minuten -- **Schritte:** 15 Minuten -- **Einfluss:** Basis für Protokoll-Zeit - -### Minuten für Protokoll -- **Range:** 10-90 Minuten -- **Default:** 30 Minuten -- **Schritte:** 5 Minuten -- **Einfluss:** Hauptfaktor für Zeitersparnis (80% mit Memoro gespart) - -### Stundensatz -- **Range:** 20-200 €/Stunde -- **Default:** 50 €/Stunde -- **Schritte:** 10 € -- **Einfluss:** Berechnung der Geldersparnis - -## Berechnungslogik - -### Zeitersparnis -```javascript -// 80% Zeitersparnis bei der Protokollerstellung -minutesSavedPerMeeting = protocolTime * 0.8 -minutesSavedPerWeek = minutesSavedPerMeeting * meetings -hoursSavedPerWeek = minutesSavedPerWeek / 60 -hoursSavedPerMonth = hoursSavedPerWeek * 4.33 -hoursSavedPerYear = hoursSavedPerWeek * 52 -daysSavedPerYear = hoursSavedPerYear / 8 -``` - -### Geldersparnis -```javascript -moneySavedPerWeek = hoursSavedPerWeek * hourlyRate -moneySavedPerMonth = hoursSavedPerMonth * hourlyRate -moneySavedPerYear = hoursSavedPerYear * hourlyRate -``` - -### ROI (Return on Investment) -```javascript -memoroCostPerMonth = 15 // Durchschnittlicher Memoro-Preis -daysToROI = Math.ceil(memoroCostPerMonth / (moneySavedPerMonth / 30)) -``` - -## Annahmen - -- **80% Zeitersparnis** bei der Protokollerstellung durch Memoro -- **4.33 Wochen** pro Monat (Durchschnitt) -- **52 Wochen** pro Jahr -- **8 Stunden** Arbeitstag für Tagesberechnung -- **15€/Monat** durchschnittliche Memoro-Kosten für ROI - -## Styling - -Die Komponente verwendet: -- Tailwind CSS für Layout und Styling -- Custom CSS für Slider-Styling -- Gradient-Backgrounds für visuelle Attraktivität -- Smooth Transitions für bessere UX - -### Slider-Styling -```css -.slider { - background: linear-gradient(to right, - #ef4444 0%, - #ef4444 var(--value, 50%), - #e5e7eb var(--value, 50%), - #e5e7eb 100% - ); -} -``` - -## Integration - -### Auf Landing Pages -```astro -// In meeting-protokoll-software.mdx -import ROICalculator from "../components/ROICalculator.astro"; - - -``` - -### Auf der Homepage -```astro -// Nach NumbersSection für maximale Wirkung - - - - - -``` - -## Browser-Kompatibilität - -- ✅ Chrome/Edge (alle Versionen) -- ✅ Firefox (alle Versionen) -- ✅ Safari (12+) -- ✅ Mobile Browser (iOS/Android) - -## Performance - -- **Bundle Size:** ~5KB (unkomprimiert) -- **JavaScript:** Vanilla JS, keine Dependencies -- **Rendering:** Client-side Berechnungen -- **Accessibility:** ARIA-Labels für Screenreader - -## Zukünftige Verbesserungen - -- [ ] Speichern der Einstellungen im LocalStorage -- [ ] Export der Berechnung als PDF -- [ ] Vergleich mit anderen Tools -- [ ] Erweiterte Berechnungen (Team-Größe, etc.) -- [ ] A/B Testing verschiedener Default-Werte -- [ ] Analytics-Integration für Usage-Tracking - ---- - -*Komponente erstellt: 28. Dezember 2024* \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/content-collections.md b/apps/memoro/apps/landing/docs/content-collections.md deleted file mode 100644 index 152d6c174..000000000 --- a/apps/memoro/apps/landing/docs/content-collections.md +++ /dev/null @@ -1,545 +0,0 @@ -# Memoro Content Collections Documentation - -This document provides a comprehensive overview of all content collections used in the Memoro website. Each collection is structured with Zod schemas for type safety and validation. - -## Quick Overview - -The Memoro website contains 15 content collections: - -1. **Blog** - Articles and blog posts about features and updates -2. **Team** - Team member profiles (core team, freelancers, mentors, supporters, alumni) -3. **Guides** - How-to tutorials with difficulty levels (beginner, intermediate, advanced) -4. **Features** - Product feature descriptions with icons and categories -5. **Legal** - Legal documents (privacy policy, terms of service) -6. **Industries** - Industry-specific use cases and solutions -7. **Testimonials** - Customer reviews organized by type (private, company, network, press) -8. **Pages** - Structured content for special pages like pricing with Mana system -9. **Contracts** - Downloadable legal contracts and agreements -10. **Blueprints** - Pre-configured templates for different use cases -11. **Memories** - Memory templates and examples -12. **Wallpapers** - Downloadable wallpapers in multiple formats and resolutions -13. **FAQs** - Frequently asked questions by category -14. **Statistics** - Weekly/monthly reports with usage metrics -15. **Changelog** - Product updates and release notes with semantic versioning - -## Overview - -The Memoro website uses Astro's content collections to manage various types of content. All collections support internationalization with German (de) and English (en) locales. - -## Collections - -### 1. Blog Collection - -**Purpose**: Articles and blog posts about Memoro features, updates, and industry insights. - -**Schema**: -```typescript -{ - title: string - description: string - pubDate: Date - author: string (default: 'Anonymous') - image?: string - tags: string[] (default: []) - lang: 'de' | 'en' - slug?: string - lastUpdated?: Date - draft?: boolean -} -``` - -**Location**: `src/content/blog/{de|en}/` - ---- - -### 2. Team Collection - -**Purpose**: Team member profiles showcasing the people behind Memoro. - -**Schema**: -```typescript -{ - title: string - description: string - role: string - image?: string - social?: { - linkedin?: string - github?: string - twitter?: string - } - lang: 'de' | 'en' - category: 'kernteam' | 'freelance' | 'mentoren' | 'unterstuetzer' | 'alumni' - order?: number - categoryOrder?: number - lastUpdated?: Date -} -``` - -**Location**: `src/content/team/{de|en}/` - -**Categories**: -- `kernteam`: Core team members -- `freelance`: Freelance contributors -- `mentoren`: Mentors -- `unterstuetzer`: Supporters -- `alumni`: Former team members - ---- - -### 3. Guide Collection - -**Purpose**: Tutorials and how-to guides for using Memoro features. - -**Schema**: -```typescript -{ - title: string - description: string - difficulty: 'beginner' | 'intermediate' | 'advanced' - duration: string - category: string - author: string (default: 'Das Platform-Team') - lastUpdated: Date - lang: 'de' | 'en' -} -``` - -**Location**: `src/content/guides/{de|en}/` - ---- - -### 4. Features Collection - -**Purpose**: Detailed descriptions of Memoro's features and capabilities. - -**Schema**: -```typescript -{ - title: string - description: string - lang: 'de' | 'en' - icon: string - color: 'blue' | 'red' | 'purple' | 'green' | 'orange' - category?: 'organization' | 'language' | 'customization' | 'recording' | - 'analytics' | 'collaboration' | 'ai-features' | 'sharing' - order?: number -} -``` - -**Location**: `src/content/features/{de|en}/` - ---- - -### 5. Legal Collection - -**Purpose**: Legal documents including privacy policy, terms of service, etc. - -**Schema**: -```typescript -{ - title: string - lastUpdated?: Date - lang: 'de' | 'en' -} -``` - -**Location**: `src/content/legal/` - ---- - -### 6. Industry Collection - -**Purpose**: Industry-specific use cases and solutions. - -**Schema**: -```typescript -{ - title: string - description: string - icon: string - color: 'blue' | 'red' | 'purple' | 'green' - lang: 'de' | 'en' - order?: number - keyFeatures?: string[] - testimonials?: Array<{ - quote: string - author: string - role: string - company: string - }> -} -``` - -**Location**: `src/content/industries/{de|en}/` - ---- - -### 7. Testimonials Collection - -**Purpose**: Customer testimonials and reviews organized by type. - -**Schema**: -```typescript -{ - name: string - role: string - company?: string // Optional for private individuals - image: string - text: string - lang: 'de' | 'en' - type: 'private' | 'company' | 'network' | 'press' - order?: number - lastUpdated?: Date - source?: string // For press: publication name - sourceUrl?: string // For press: article link -} -``` - -**Location**: `src/content/testimonials/{de|en}/{type}/` - -**Types**: -- `private`: Individual users -- `company`: Corporate testimonials -- `network`: Partner/network testimonials -- `press`: Press mentions and reviews - ---- - -### 8. Pages Collection - -**Purpose**: Structured content for special pages like pricing. - -**Schema**: -```typescript -{ - title: string - description: string - lang: 'de' | 'en' - type: string - lastUpdated: Date - sections: { - hero: { - title: string - subtitle?: string - } - plans?: Array<{ - id?: string - name: string - price: { - monthly: number - yearly: number - } - priceUnit?: string - yearlyBreakdown?: string - features: string[] - // Legacy fields - minutes?: number - memoLength?: number - dailyMemos?: number | '∞' - // Mana-based fields - initialMana?: number - dailyMana?: number - maxMana?: number - canGiftMana?: boolean - cta: string - highlight: boolean - }> - manaPotions?: { - title: string - subtitle: string - items: Array<{ - id: string - name: string - manaAmount: number - price: number - popular: boolean - }> - } - comparison?: { title: string } - faq?: { - title: string - items: Array<{ - question: string - answer: string - }> - } - callToAction?: { - title: string - description: string - buttonText: string - buttonLink: string - } - } -} -``` - -**Location**: `src/content/pages/{de|en}/` - ---- - -### 9. Contracts Collection - -**Purpose**: Legal contracts and agreements available for download. - -**Schema**: -```typescript -{ - title: string - description: string - lastUpdated: Date - lang: 'de' | 'en' - category: string - order?: number - downloadUrl?: string - previewEnabled: boolean (default: false) -} -``` - -**Location**: `src/content/contracts/{de|en}/` - ---- - -### 10. Blueprints Collection - -**Purpose**: Pre-configured templates and setups for different use cases. - -**Schema**: -```typescript -{ - title: string - description: string - icon: string - color: 'blue' | 'red' | 'purple' | 'green' | 'orange' | 'yellow' - lang: 'de' | 'en' - order?: number - lastUpdated?: Date - isActive: boolean (default: true) - features?: string[] - compatibility?: string[] -} -``` - -**Location**: `src/content/blueprints/{de|en}/` - ---- - -### 11. Memories Collection - -**Purpose**: Memory templates and examples for different scenarios. - -**Schema**: -```typescript -{ - title: string - description: string - icon: string - color: 'blue' | 'red' | 'purple' | 'green' | 'orange' | 'yellow' - category?: string - lang: 'de' | 'en' - order?: number - lastUpdated?: Date - isActive: boolean (default: true) - features?: string[] - compatibility?: string[] -} -``` - -**Location**: `src/content/memories/{de|en}/` - ---- - -### 12. Wallpaper Collection - -**Purpose**: Downloadable wallpapers in various formats and resolutions. - -**Schema**: -```typescript -{ - title: string - description: string - thumbnail: string - formats: Array<{ - type: 'desktop' | 'mobile' | 'tablet' | 'ultrawide' - device?: string // e.g., "iPhone 16 Pro", "iPad Pro" - resolution: string // "3840x2160" - aspectRatio: string // "16:9" - fileUrl: string // "/images/wallpaper/..." - fileSize?: string // "2.4 MB" - }> - category: 'nature' | 'abstract' | 'city' | 'technology' | 'other' - colors?: string[] - tags?: string[] - lang: 'de' | 'en' - order?: number - lastUpdated?: Date - isActive: boolean (default: true) - isFeatured: boolean (default: false) - downloadCount: number (default: 0) - formatDownloads?: Record -} -``` - -**Location**: `src/content/wallpapers/{de|en}/` - ---- - -### 13. FAQs Collection - -**Purpose**: Frequently asked questions organized by category. - -**Schema**: -```typescript -{ - question: string - answer: string - category: 'general' | 'features' | 'technical' | 'pricing' | - 'security' | 'business' | 'industries' | 'guides' - tags?: string[] - order: number (default: 0) - featured: boolean (default: false) - relatedLinks?: Array<{ - title: string - url: string - }> - lang: 'de' | 'en' -} -``` - -**Location**: `src/content/faqs/{de|en}/` - -**Categories**: -- `general`: General questions -- `features`: Feature-related questions -- `technical`: Technical questions -- `pricing`: Pricing and plans -- `security`: Security and privacy -- `business`: Business and enterprise -- `industries`: Industry-specific questions -- `guides`: Tutorials and how-to questions - ---- - -### 14. Statistics Collection - -**Purpose**: Weekly and monthly reports with usage statistics and metrics. - -**Schema**: -```typescript -{ - title: string - description: string - reportType: 'weekly' | 'monthly' (default: 'weekly') - weekNumber?: number // Calendar week (for weekly reports) - month?: number // Month (for monthly reports) - year: number - period: { - start: Date - end: Date - } - stats: { - totalUsers: number - newUsers: number - activeUsers: number - totalRecordings: number - totalMinutes: number - totalWords?: number - totalEntries?: number - manaConsumed: number - manaPurchased: number - } - highlights?: string[] // Important events - trends?: { - userGrowth: number // Percentage compared to previous period - recordingGrowth: number - manaGrowth: number - } - topFeatures?: Array<{ - name: string - usage: number - }> - lang: 'de' | 'en' - publishDate: Date - draft: boolean (default: false) - author: string (default: 'Das Memoro Team') -} -``` - -**Location**: `src/content/statistics/{de|en}/` - ---- - -### 15. Changelog Collection - -**Purpose**: Product updates, release notes, and version history. - -**Schema**: -```typescript -{ - title: string - description: string - version: string // e.g., "1.2.0" - releaseDate: Date - type: 'major' | 'minor' | 'patch' // Semantic versioning - category: Array<'feature' | 'improvement' | 'bugfix' | - 'security' | 'performance' | 'other'> - highlights?: string[] // Key features of this version - breaking: boolean (default: false) - deprecated?: string[] // Deprecated features - migration?: string // Migration guide for breaking changes - platforms?: Array<'web' | 'ios' | 'android' | 'api'> - lang: 'de' | 'en' - draft: boolean (default: false) - author: string (default: 'Das Memoro Team') -} -``` - -**Location**: `src/content/changelog/{de|en}/` - -**Categories**: -- `feature`: New features -- `improvement`: Improvements -- `bugfix`: Bug fixes -- `security`: Security updates -- `performance`: Performance improvements -- `other`: Other changes - ---- - -## Best Practices - -1. **Internationalization**: Always create content in both German and English -2. **File Naming**: Use kebab-case for file names (e.g., `my-blog-post.mdx`) -3. **Frontmatter**: Ensure all required fields are filled according to the schema -4. **Images**: Store images in `/public/images/` organized by content type -5. **Draft Mode**: Use the `draft` field to hide content from production -6. **Ordering**: Use the `order` field to control display sequence -7. **Dates**: Use ISO date format (YYYY-MM-DD) for all date fields - -## Content Organization - -The content is organized following this structure: -``` -src/content/ -├── [collection-name]/ -│ ├── de/ # German content -│ │ └── *.mdx # Content files -│ └── en/ # English content -│ └── *.mdx # Content files -└── config.ts # Collection schemas -``` - -For testimonials, an additional level of organization by type is used: -``` -src/content/testimonials/ -├── de/ -│ ├── private/ -│ ├── company/ -│ ├── network/ -│ └── press/ -└── en/ - ├── private/ - ├── company/ - ├── network/ - └── press/ -``` \ No newline at end of file diff --git a/apps/memoro/apps/landing/docs/creating-content-collections.md b/apps/memoro/apps/landing/docs/creating-content-collections.md deleted file mode 100644 index 6388fa9a4..000000000 --- a/apps/memoro/apps/landing/docs/creating-content-collections.md +++ /dev/null @@ -1,784 +0,0 @@ -# Creating a New Content Collection - -This document explains how to create and configure a new content collection in our Astro-based website. - -## What are Content Collections? - -Content collections in Astro are a way to organize and validate content in your project. They allow you to: - -- Group related content together -- Define a schema for validating content -- Query content with TypeScript type safety -- Support multiple languages (de/en) - -## Step 1: Define the Collection Schema - -First, you need to define the schema for your new collection in the `src/content/config.ts` file: - -```typescript -// 1. Import the defineCollection and z functions -import { defineCollection, z } from 'astro:content'; - -// 2. Define your collection schema -const myNewCollection = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string(), - description: z.string(), - lastUpdated: z.date(), - lang: z.enum(['de', 'en']), - // Add any other fields specific to your collection - category: z.string(), - order: z.number().optional(), - // Add custom fields as needed - customField: z.string().optional() - }) -}); - -// 3. Add your collection to the collections export -export const collections = { - // Existing collections... - 'myNewCollection': myNewCollection, -}; -``` - -## Step 2: Create the Directory Structure - -Create the necessary directories for your content collection: - -```bash -mkdir -p src/content/my-new-collection/de src/content/my-new-collection/en -``` - -Our project organizes content by language, so we create separate directories for German (de) and English (en) content. - -## Step 3: Add Content Files - -Create content files in the appropriate language directories. We use `.mdx` files for content that includes Markdown with JSX components: - -**German Example** (`src/content/my-new-collection/de/example.mdx`): - -```markdown ---- -title: "Beispieltitel" -description: "Eine Beispielbeschreibung" -lastUpdated: 2025-02-26 -lang: "de" -category: "example" -order: 1 -customField: "Beispielwert" ---- - -# Beispielinhalt - -Dies ist ein Beispielinhalt für die neue Content Collection. -``` - -**English Example** (`src/content/my-new-collection/en/example.mdx`): - -```markdown ---- -title: "Example Title" -description: "An example description" -lastUpdated: 2025-02-26 -lang: "en" -category: "example" -order: 1 -customField: "Example value" ---- - -# Example Content - -This is example content for the new content collection. -``` - -## Step 4: Create Components for Displaying Content - -Create components to display your content. For example, create a component to display a list of items from your collection: - -```astro ---- -// src/components/MyCollectionList.astro -import { getCollection } from 'astro:content'; -import { getLangFromUrl } from '../i18n/utils'; - -const lang = getLangFromUrl(Astro.url); -const items = await getCollection('my-new-collection', ({ data }) => { - return data.lang === lang; -}); - -// Sort items if needed -const sortedItems = [...items].sort((a, b) => { - return (a.data.order || 0) - (b.data.order || 0); -}); ---- - -
- {sortedItems.map((item) => ( - -

{item.data.title}

-

{item.data.description}

-
- ))} -
-``` - -Also create a component for displaying a single item: - -```astro ---- -// src/components/MyCollectionItem.astro -import type { CollectionEntry } from 'astro:content'; - -interface Props { - item: CollectionEntry<'my-new-collection'>; -} - -const { item } = Astro.props; -const { Content } = await item.render(); ---- - -
-

{item.data.title}

-

{item.data.description}

-
- -
-
-``` - -## Step 5: Create Page Routes - -Create pages to display your collection. You'll typically need: - -1. A listing page that shows all items -2. A dynamic route for individual items - -**Listing Page** (`src/pages/de/my-collection/index.astro` and `src/pages/en/my-collection/index.astro`): - -```astro ---- -import { getCollection } from 'astro:content'; -import Layout from '../../../layouts/Layout.astro'; -import { getLangFromUrl, useTranslations } from '../../../i18n/utils'; - -const lang = getLangFromUrl(Astro.url); -const t = useTranslations(lang); - -const items = await getCollection('my-new-collection', ({ data }) => { - return data.lang === lang; -}); - -const sortedItems = [...items].sort((a, b) => { - return (a.data.order || 0) - (b.data.order || 0); -}); ---- - - -
-

{t('myCollection.title')}

-

{t('myCollection.description')}

- -
- {sortedItems.map((item) => ( - -

{item.data.title}

-

{item.data.description}

-
- ))} -
-
-
-``` - -**Dynamic Route** (`src/pages/de/my-collection/[...slug].astro` and `src/pages/en/my-collection/[...slug].astro`): - -```astro ---- -import { getCollection } from 'astro:content'; -import Layout from '../../../layouts/Layout.astro'; -import { getLangFromUrl } from '../../../i18n/utils'; -import MyCollectionItem from '../../../components/MyCollectionItem.astro'; - -export async function getStaticPaths() { - const lang = 'de'; // or 'en' depending on the file - const items = await getCollection('my-new-collection', ({ data }) => { - return data.lang === lang; - }); - - return items.map((item) => ({ - params: { slug: item.slug.replace(`${lang}/`, '') }, - props: { item }, - })); -} - -const { item } = Astro.props; ---- - - -
- -
-
-``` - -## Step 6: Add Navigation Links (Optional) - -Update your navigation components to include links to your new collection: - -```astro ---- -// In your navigation component -import { getLangFromUrl, useTranslations } from '../i18n/utils'; - -const lang = getLangFromUrl(Astro.url); -const t = useTranslations(lang); ---- - - -``` - -## Step 7: Add Translations (Optional) - -If your site uses translations, add the necessary translation strings to your i18n files: - -```typescript -// src/i18n/ui.ts -export const languages = { - de: { - 'myCollection': { - 'title': 'Meine Sammlung', - 'description': 'Beschreibung meiner Sammlung' - }, - 'nav': { - 'myCollection': 'Meine Sammlung' - } - }, - en: { - 'myCollection': { - 'title': 'My Collection', - 'description': 'Description of my collection' - }, - 'nav': { - 'myCollection': 'My Collection' - } - } -}; -``` - -## Testing Your Collection - -After setting up your collection, test it by: - -1. Building the site: `npm run build` -2. Checking for any TypeScript or schema validation errors -3. Previewing the site: `npm run preview` -4. Navigating to your collection pages to ensure they display correctly - -## Example: Creating a "Contracts" Collection - -Here's a complete example of creating a "contracts" collection: - -1. **Schema Definition**: - -```typescript -// src/content/config.ts -const contractsCollection = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string(), - description: z.string(), - lastUpdated: z.date(), - lang: z.enum(['de', 'en']), - category: z.string(), - order: z.number().optional(), - downloadUrl: z.string().optional(), - previewEnabled: z.boolean().default(false) - }) -}); - -export const collections = { - // Other collections... - contracts: contractsCollection, -}; -``` - -2. **Directory Structure**: -``` -src/content/contracts/ -├── de/ -│ ├── nutzungsbedingungen.mdx -│ └── datenschutz.mdx -└── en/ - ├── terms-of-service.mdx - └── privacy-policy.mdx -``` - -3. **Content Example**: -```markdown ---- -title: "Nutzungsbedingungen" -description: "Allgemeine Nutzungsbedingungen für unsere Plattform" -lastUpdated: 2025-02-26 -lang: "de" -category: "legal" -order: 1 -downloadUrl: "/downloads/nutzungsbedingungen.pdf" -previewEnabled: true ---- - -# Nutzungsbedingungen - -## 1. Geltungsbereich - -Diese Nutzungsbedingungen regeln die Nutzung unserer Plattform... -``` - -4. **Component for Displaying Contracts**: -```astro ---- -// src/components/ContractItem.astro -import type { CollectionEntry } from 'astro:content'; - -interface Props { - contract: CollectionEntry<'contracts'>; -} - -const { contract } = Astro.props; -const { Content } = await contract.render(); ---- - -
-

{contract.data.title}

-

{contract.data.description}

- - {contract.data.previewEnabled && ( -
- -
- )} - - {contract.data.downloadUrl && ( - - Download als PDF - - )} -
-``` - -5. **Page Routes**: -```astro ---- -// src/pages/de/contracts/[...slug].astro -import { getCollection } from 'astro:content'; -import Layout from '../../../layouts/Layout.astro'; -import ContractItem from '../../../components/ContractItem.astro'; - -export async function getStaticPaths() { - const contracts = await getCollection('contracts', ({ data }) => { - return data.lang === 'de'; - }); - - return contracts.map((contract) => ({ - params: { slug: contract.slug.replace('de/', '') }, - props: { contract }, - })); -} - -const { contract } = Astro.props; ---- - - -
- -
-
-``` - -## Complete Implementation Walkthrough - -Below is a detailed walkthrough of all the steps we took to implement a new "Contracts" content collection: - -### 1. Define the Collection Schema - -First, we added the contracts collection schema to `src/content/config.ts`: - -```typescript -const contractsCollection = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string(), - description: z.string(), - lastUpdated: z.date(), - lang: z.enum(['de', 'en']), - category: z.string(), - order: z.number().optional(), - downloadUrl: z.string().optional(), - previewEnabled: z.boolean().default(false) - }) -}); - -export const collections = { - // Other collections... - contracts: contractsCollection, -}; -``` - -### 2. Create Directory Structure - -We created the necessary directories for our content: - -```bash -mkdir -p src/content/contracts/de src/content/contracts/en -``` - -### 3. Create Components - -We created two components for displaying contracts: - -**ContractCard.astro** - For displaying contract cards in the listing page: - -```astro ---- -import type { CollectionEntry } from 'astro:content'; -import { getLangFromUrl } from '../i18n/utils'; - -interface Props { - contract: CollectionEntry<'contracts'>; -} - -const { contract } = Astro.props; -const lang = getLangFromUrl(Astro.url); -const cleanSlug = contract.slug.replace(`${lang}/`, ''); ---- - - -
-
-

- {contract.data.title} -

-

- {contract.data.description} -

-

- Zuletzt aktualisiert: {contract.data.lastUpdated.toLocaleDateString()} -

-
-
- - - -
-
-
-``` - -**ContractDetail.astro** - For displaying a single contract's details: - -```astro ---- -import type { CollectionEntry } from 'astro:content'; -import { getLangFromUrl, useTranslations } from '../i18n/utils'; - -interface Props { - contract: CollectionEntry<'contracts'>; -} - -const { contract } = Astro.props; -const { Content } = await contract.render(); -const lang = getLangFromUrl(Astro.url); -const t = useTranslations(lang); ---- - -
-
-

{contract.data.title}

-

{contract.data.description}

-

- {t('contracts.lastUpdated')}: {contract.data.lastUpdated.toLocaleDateString()} -

-
- - {contract.data.previewEnabled && ( -
- -
- )} - - {contract.data.downloadUrl && ( - - )} -
-``` - -### 4. Create Page Routes - -We created the necessary page routes for both German and English: - -**Listing Pages** (`src/pages/de/contracts/index.astro` and `src/pages/en/contracts/index.astro`): - -```astro ---- -import { getCollection, getEntry } from "astro:content"; -import Layout from "../../../layouts/Layout.astro"; -import ContractCard from "../../../components/ContractCard.astro"; -import CallToAction from "../../../components/CallToAction.astro"; -import { getLangFromUrl, useTranslations } from "../../../i18n/utils"; - -const lang = getLangFromUrl(Astro.url); -const t = useTranslations(lang); - -// Get contracts in current language -const contractEntries = await getCollection("contracts", ({ data }) => { - return data.lang === "de"; // or "en" for English version -}); - -// Sort contracts by category and then by order -const sortedContracts = [...contractEntries].sort((a, b) => { - // First sort by category - if (a.data.category !== b.data.category) { - return a.data.category.localeCompare(b.data.category); - } - // Then sort by order within the same category - const orderA = a.data.order || 0; - const orderB = b.data.order || 0; - return orderA - orderB; -}); - -// Group contracts by category -const contractsByCategory = sortedContracts.reduce((acc, contract) => { - const category = contract.data.category; - if (!acc[category]) { - acc[category] = []; - } - acc[category].push(contract); - return acc; -}, {}); - -const pageTitle = t('contracts.title'); -const pageDescription = t('contracts.description'); ---- - - -
-

{pageTitle}

-

{pageDescription}

- - {Object.entries(contractsByCategory).map(([category, contracts]) => ( -
-

- {category === "legal" ? (lang === "de" ? "Rechtliche Dokumente" : "Legal Documents") : category} -

-
- {contracts.map((contract) => ( - - ))} -
-
- ))} - - -
-
-``` - -**Dynamic Routes** (`src/pages/de/contracts/[...slug].astro` and `src/pages/en/contracts/[...slug].astro`): - -```astro ---- -import { getCollection } from "astro:content"; -import Layout from "../../../layouts/Layout.astro"; -import { getLangFromUrl, useTranslations } from "../../../i18n/utils"; -import ContractDetail from "../../../components/ContractDetail.astro"; -import CallToAction from "../../../components/CallToAction.astro"; - -export async function getStaticPaths() { - const contracts = await getCollection("contracts", ({ data }) => { - return data.lang === "de"; // or "en" for English version - }); - - return contracts.map((contract) => { - return { - params: { slug: contract.slug.replace("de/", "") }, // or "en/" for English version - props: { contract }, - }; - }); -} - -const { contract } = Astro.props; -const lang = getLangFromUrl(Astro.url); -const t = useTranslations(lang); - -// Check if content is in the correct language -if (contract.data.lang !== lang) { - // Get all contracts - const allContracts = await getCollection("contracts"); - // Find matching content in the correct language - const localizedContract = allContracts.find( - (c) => c.data.slug === contract.data.slug && c.data.lang === lang - ); - - if (localizedContract) { - return Astro.redirect(`/${lang}/contracts/${localizedContract.data.slug}`); - } -} ---- - - -
- - - - -
- -
-
-
-``` - -### 5. Add Sample Content - -We created sample contract files in both German and English: - -**German Example** (`src/content/contracts/de/nutzungsbedingungen.mdx`): - -```markdown ---- -title: "Nutzungsbedingungen" -description: "Allgemeine Nutzungsbedingungen für unsere Plattform" -lastUpdated: 2025-02-26 -lang: "de" -category: "legal" -order: 1 -downloadUrl: "/downloads/nutzungsbedingungen.pdf" -previewEnabled: true ---- - -# Nutzungsbedingungen - -## 1. Geltungsbereich - -Diese Nutzungsbedingungen regeln die Nutzung unserer Plattform... -``` - -**English Example** (`src/content/contracts/en/terms-of-service.mdx`): - -```markdown ---- -title: "Terms of Service" -description: "General terms of service for our platform" -lastUpdated: 2025-02-26 -lang: "en" -category: "legal" -order: 1 -downloadUrl: "/downloads/terms-of-service.pdf" -previewEnabled: true ---- - -# Terms of Service - -## 1. Scope - -These Terms of Service govern the use of our platform... -``` - -### 6. Add Translations - -We added translations for the contracts section in `src/i18n/ui.ts`: - -```typescript -// German translations -'contracts.title': 'Verträge & Rechtliches', -'contracts.description': 'Alle rechtlichen Dokumente und Verträge für unsere Plattform', -'contracts.download': 'Als PDF herunterladen', -'contracts.lastUpdated': 'Zuletzt aktualisiert', -'contracts.backToOverview': 'Zurück zur Übersicht', - -// English translations -'contracts.title': 'Contracts & Legal', -'contracts.description': 'All legal documents and contracts for our platform', -'contracts.download': 'Download as PDF', -'contracts.lastUpdated': 'Last updated', -'contracts.backToOverview': 'Back to overview', -``` - -### 7. Update Navigation - -We added a link to the contracts page in the Footer component: - -```astro -
  • - - {isGerman ? "Verträge" : "Contracts"} - -
  • -``` - -### 8. Testing - -After implementing all these components, you should test the contracts pages by: - -1. Building the site: `npm run build` -2. Checking for any TypeScript or schema validation errors -3. Previewing the site: `npm run preview` -4. Navigating to `/de/contracts` and `/en/contracts` to ensure they display correctly -5. Clicking on individual contracts to ensure the detail pages work properly -6. Testing the download functionality if you have PDF files available - -### 9. Next Steps - -To further enhance your contracts collection, consider: - -1. Creating actual PDF files for download in the `/public/downloads/` directory -2. Adding more contract types (privacy policy, terms of use, etc.) -3. Implementing a search functionality for contracts -4. Adding version history for contracts to track changes over time diff --git a/apps/memoro/apps/landing/docs/features/admin-tool-modularization-and-replicate-integration.md b/apps/memoro/apps/landing/docs/features/admin-tool-modularization-and-replicate-integration.md deleted file mode 100644 index 39a90be56..000000000 --- a/apps/memoro/apps/landing/docs/features/admin-tool-modularization-and-replicate-integration.md +++ /dev/null @@ -1,561 +0,0 @@ -# Admin-Tool Modularisierung & Replicate-Integration - -> **Dokument erstellt:** 28.01.2025 -> **Status:** Konzeptphase -> **Ziel:** Wiederverwendbares Admin-Tool mit KI-Bildgenerierung - -## 📋 Executive Summary - -Das Memoro Admin-Tool entwickelt sich zu einem eigenständigen, wertvollen Werkzeug. Dieses Dokument beschreibt Konzepte zur: -1. **Modularisierung** des Admin-Tools für Wiederverwendbarkeit in anderen Projekten -2. **Integration von Replicate** zur KI-basierten Bildgenerierung für Personas -3. **Backend-Architektur** auf Hetzner VPS mit Coolify - -## 🎯 Anforderungen - -### Funktionale Anforderungen -- Admin-Tool soll in anderen Websites wiederverwendbar sein -- Komplette Trennung von Code und Content -- KI-basierte Bildgenerierung für Personas via Replicate -- Zentrale Backend-Services auf Hetzner VPS -- Verwaltung via Coolify (Docker-basiert) - -### Nicht-funktionale Anforderungen -- Einfache Installation/Integration -- Minimale Dependencies -- Skalierbare Architektur -- Sichere API-Kommunikation -- Kosteneffiziente Bildgenerierung - -## 🏗️ Modularisierungskonzepte - -### Konzept 1: NPM Package + API Backend -**Architektur:** -``` -@memoro/admin-tool (NPM Package) -├── components/ # Wiederverwendbare UI-Komponenten -├── layouts/ # Admin-Layouts -├── hooks/ # React/Vue Hooks für API -├── types/ # TypeScript Definitionen -└── utils/ # Helper Functions - -@memoro/admin-api (Separates Backend) -├── /api/personas # Personas CRUD -├── /api/images # Bildgenerierung -├── /api/content # Content Management -└── /api/auth # Authentication -``` - -**Vorteile:** -- ✅ Maximale Wiederverwendbarkeit -- ✅ Framework-agnostisch (Adapter Pattern) -- ✅ Versionskontrolle via NPM -- ✅ Type-Safety durch TypeScript - -**Nachteile:** -- ❌ Komplexe Initial-Setup -- ❌ Wartung von zwei Packages -- ❌ Breaking Changes Management - -**Integration:** -```typescript -// In beliebiger Astro/Next/Vue App -import { AdminTool } from '@memoro/admin-tool'; -import { MemoroadminProvider } from '@memoro/admin-tool/providers'; - -// Konfiguration -const config = { - apiUrl: 'https://api.memoro-admin.com', - apiKey: process.env.MEMORO_API_KEY, - features: ['personas', 'content', 'images'] -}; - - - - -``` - -### Konzept 2: Monorepo mit Shared Packages -**Struktur:** -``` -memoro-workspace/ -├── apps/ -│ ├── memoro-website/ # Aktuelle Website -│ ├── admin-dashboard/ # Standalone Admin -│ └── api-backend/ # Zentrales Backend -├── packages/ -│ ├── admin-ui/ # UI Components -│ ├── admin-core/ # Business Logic -│ ├── content-types/ # Shared Types -│ └── api-client/ # API Client Library -└── services/ - ├── image-generator/ # Replicate Service - └── content-sync/ # Content Synchronization -``` - -**Vorteile:** -- ✅ Einheitliche Entwicklung -- ✅ Shared Dependencies -- ✅ Einfaches Testing -- ✅ Atomic Commits - -**Nachteile:** -- ❌ Größeres Repository -- ❌ Komplexere CI/CD -- ❌ Schwieriger für externe Nutzer - -**Tools:** -- Turborepo oder NX für Monorepo Management -- Changesets für Versionierung -- pnpm Workspaces für Dependencies - -### Konzept 3: Microservices + Web Components -**Architektur:** -``` -Frontend (Web Components) -├── -├── -├── -└── - -Microservices (Docker/Coolify) -├── persona-service/ # Node.js/Fastify -├── image-service/ # Python/FastAPI + Replicate -├── content-service/ # Node.js/Express -├── auth-service/ # Node.js/JWT -└── gateway/ # Kong/Traefik -``` - -**Vorteile:** -- ✅ Framework-unabhängig -- ✅ Isolierte Services -- ✅ Unabhängige Skalierung -- ✅ Native Browser-Support - -**Nachteile:** -- ❌ Komplexe Orchestrierung -- ❌ Network Latency -- ❌ Service Discovery - -**Integration:** -```html - - - - -``` - -### Konzept 4: Plugin-System (Empfohlen) ⭐ -**Architektur:** -``` -@memoro/admin-core -├── core/ -│ ├── plugin-system.ts # Plugin Registry -│ ├── api-client.ts # API Abstraction -│ └── auth.ts # Auth Management -├── plugins/ -│ ├── personas/ # Personas Plugin -│ ├── image-generator/ # Replicate Plugin -│ ├── content-manager/ # Content Plugin -│ └── analytics/ # Analytics Plugin -└── adapters/ - ├── astro/ # Astro Integration - ├── nextjs/ # Next.js Integration - └── vue/ # Vue Integration -``` - -**Plugin-Beispiel:** -```typescript -// personas-plugin.ts -export const personasPlugin: AdminPlugin = { - id: 'personas', - name: 'Personas Management', - version: '1.0.0', - routes: [ - { path: '/personas', component: PersonasList }, - { path: '/personas/:id', component: PersonaDetail } - ], - api: { - endpoints: [ - { method: 'GET', path: '/personas', handler: getPersonas }, - { method: 'POST', path: '/personas/:id/image', handler: generateImage } - ] - }, - permissions: ['personas.read', 'personas.write', 'personas.generate'], - config: { - replicateModel: 'stability-ai/sdxl', - imageStyles: ['portrait', 'professional', 'casual'] - } -}; -``` - -**Vorteile:** -- ✅ Maximale Flexibilität -- ✅ Einfache Erweiterung -- ✅ Selective Features -- ✅ Community Plugins möglich - -**Nachteile:** -- ❌ Initial-Komplexität -- ❌ Plugin-Kompatibilität -- ❌ Versioning-Challenges - -## 🖼️ Replicate Integration - -### Backend Service Architektur -```typescript -// services/image-generator/src/replicate-service.ts -import Replicate from 'replicate'; -import { Queue } from 'bullmq'; -import { S3 } from '@aws-sdk/client-s3'; - -export class ReplicateImageService { - private replicate: Replicate; - private queue: Queue; - private storage: S3; - - async generatePersonaImage(persona: Persona): Promise { - // 1. Prompt generieren basierend auf Persona-Daten - const prompt = this.buildPrompt(persona); - - // 2. Job in Queue einreihen - const job = await this.queue.add('generate-image', { - personaId: persona.id, - prompt, - model: 'stable-diffusion-xl', - parameters: { - width: 1024, - height: 1024, - num_outputs: 4, - guidance_scale: 7.5 - } - }); - - // 3. Auf Completion warten - const result = await job.waitUntilFinished(); - - // 4. Bilder in S3/Hetzner speichern - const imageUrls = await this.storeImages(result.images); - - return imageUrls; - } - - private buildPrompt(persona: Persona): string { - const { appearance, outfits, demographics } = persona; - - return ` - Professional portrait photo of a ${demographics.age} year old ${demographics.gender}, - ${appearance.description}, - ${appearance.hairColor} hair in ${appearance.hairStyle}, - ${appearance.eyeColor} eyes, - wearing ${outfits[0]?.items.top || 'business attire'}, - ${appearance.firstImpression}, - studio lighting, high quality, detailed, realistic - `; - } -} -``` - -### Admin UI Integration -```typescript -// components/PersonaImageGenerator.tsx -export function PersonaImageGenerator({ persona }: Props) { - const [generating, setGenerating] = useState(false); - const [images, setImages] = useState([]); - const [selectedImage, setSelectedImage] = useState(); - const [prompt, setPrompt] = useState(''); - - const generateImages = async () => { - setGenerating(true); - - const response = await fetch(`/api/personas/${persona.id}/generate-images`, { - method: 'POST', - body: JSON.stringify({ - prompt: prompt || buildDefaultPrompt(persona), - style: selectedStyle, - count: 4 - }) - }); - - const data = await response.json(); - setImages(data.images); - setGenerating(false); - }; - - return ( -
    -

    KI Bildgenerierung

    - - {/* Prompt Editor */} - -
    - -
    -

    - * Pflichtfelder -

    - -
    - -
    - - - {/* All Contact Options Section */} -
    -

    Weitere Kontaktmöglichkeiten

    -
    - {/* Social Media Card */} - - - {/* App Downloads Card */} -
    -
    -
    - 📱 -
    -

    Memoro App

    -
    - -

    - Laden Sie die Memoro App herunter und erleben Sie die Zukunft der Gesprächsdokumentation. -

    - - -
    -
    -
    - - - -
    - -
    - diff --git a/apps/memoro/apps/landing/src/content/pages/de/faq.mdx b/apps/memoro/apps/landing/src/content/pages/de/faq.mdx deleted file mode 100644 index d80e8f0c9..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/faq.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: "FAQ | Memoro" -description: "Häufig gestellte Fragen zu Memoro - Finden Sie Antworten auf alle Ihre Fragen" -lang: "de" -type: "page" -lastUpdated: 2025-07-22 -sections: - hero: - title: "Häufig gestellte Fragen" - subtitle: "Finden Sie Antworten auf die häufigsten Fragen zu Memoro" - callToAction: - title: "Noch Fragen?" - description: "Unser Support-Team hilft Ihnen gerne weiter." - buttonText: "Kontakt aufnehmen" - buttonLink: "/de/contact" ---- - -export const FAQContent = ({ faqs }) => ( - <> -
    -

    {frontmatter.sections.hero.title}

    -

    - {frontmatter.sections.hero.subtitle} -

    -
    - -); - - \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/features.mdx b/apps/memoro/apps/landing/src/content/pages/de/features.mdx deleted file mode 100644 index 078811e7f..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/features.mdx +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: "KI-gestützte Transkription & Spracherkennung - Funktionen | Memoro" -description: "✓ Automatische Spracherkennung für 80+ Sprachen ✓ KI-Transkription mit Sprechererkennung ✓ Offline-Aufnahme ► Alle Memoro Funktionen im Überblick" -lang: "de" -type: "page" -lastUpdated: 2024-02-22 -sections: - hero: - title: "Alle Funktionen der Meeting-Protokoll Software" - subtitle: "KI-gestützte Transkription, automatische Spracherkennung und intelligente Dokumentation für effiziente Meetings" - categories: - recording: - title: "Aufnahme" - customization: - title: "Anpassung" - language: - title: "Sprachen" - organization: - title: "Organisation" - sharing: - title: "Teilen" - faq: - title: "Häufig gestellte Fragen zu den Funktionen" - items: - - question: "Welche Betriebssysteme werden unterstützt?" - answer: "Memoro ist für macOS, Windows und Linux verfügbar. Zusätzlich bieten wir mobile Apps für iOS und Android an." - - question: "Kann ich Memoro offline nutzen?" - answer: "Ja, Sie können Memoro vollständig offline nutzen. Ihre Notizen werden lokal gespeichert und bei bestehender Internetverbindung automatisch synchronisiert." - - question: "Gibt es ein Limit für die Anzahl der Notizen?" - answer: "Nein, auch in der kostenlosen Version können Sie unbegrenzt viele Notizen erstellen." - - question: "Wie funktioniert die KI-Assistenz?" - answer: "Die KI-Assistenz analysiert Ihre Notizen und macht intelligente Vorschläge für Verknüpfungen, Zusammenfassungen und Lernkarten. Diese Funktion ist in der Pro-Version verfügbar." - callToAction: - title: "Bereit für bessere Meeting-Dokumentation?" - description: "Entdecke wie Memoro deine Meetings effizienter und produktiver macht." - buttonText: "App herunterladen" - buttonLink: "/de/download" ---- - -import FeatureCard from "../../../components/FeatureCard.astro"; -import CallToAction from "../../../components/CallToAction.astro"; -import FAQSection from "../../../components/FAQSection.astro"; - - - -{/* Hilfsfunktion zur Bereinigung des Slugs */} -export function cleanSlug(slug, lang) { - const langPrefix = `${lang}/`; - return slug.startsWith(langPrefix) ? slug.substring(langPrefix.length) : slug; -} - -{/* Recording Features */} -
    -

    {frontmatter.sections.categories.recording.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'recording') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - -{/* Customization Features */} -
    -

    {frontmatter.sections.categories.customization.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'customization') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - -{/* Language Features */} -
    -

    {frontmatter.sections.categories.language.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'language') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - -{/* Organization Features */} -
    -

    {frontmatter.sections.categories.organization.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'organization') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - -{/* Sharing Features */} -
    -

    {frontmatter.sections.categories.sharing.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'sharing') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - - - -
    - -
    diff --git a/apps/memoro/apps/landing/src/content/pages/de/fireflies-ai-alternative.mdx b/apps/memoro/apps/landing/src/content/pages/de/fireflies-ai-alternative.mdx deleted file mode 100644 index 4cd9959ba..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/fireflies-ai-alternative.mdx +++ /dev/null @@ -1,556 +0,0 @@ ---- -title: "Fireflies.ai Alternative Deutschland - 100% DSGVO-konform & EU-Server | Memoro" -description: "Die sichere Fireflies.ai Alternative für deutsche Unternehmen ► Deutsche Server statt US-Cloud ✓ DSGVO-konform ✓ Kein Datenschutz-Risiko ✓ Jetzt wechseln!" -keywords: ["fireflies.ai alternative", "fireflies alternative deutschland", "fireflies.ai dsgvo", "fireflies alternative dsgvo", "meeting software dsgvo konform", "transkription deutsche server", "fireflies.ai datenschutz", "sichere meeting software"] -lang: de -type: comparison -lastUpdated: 2025-01-09 -sections: - hero: - title: "Fireflies.ai Alternative - DSGVO-konform mit deutschen Servern" - subtitle: "Die sichere Alternative zu Fireflies.ai aus Deutschland" - cta: "Sicher starten" - features: - title: "Warum Memoro sicherer ist" - items: ["Deutsche Server", "DSGVO-konform", "Ende-zu-Ende Verschlüsselung"] -ogImage: "/images/og/fireflies-alternative.png" -canonical: "https://memoro.ai/de/fireflies-ai-alternative" -robots: "index, follow" -priority: 0.9 -changefreq: "monthly" ---- - -import Button from '../../../components/atoms/Button.astro'; -import { Icon } from 'astro-icon/components'; -import FAQ from '../../../components/FAQ.astro'; -import ComparisonTable from '../../../components/ComparisonTable.astro'; -import TestimonialCard from '../../../components/TestimonialCard.astro'; -import SecurityComparison from '../../../components/SecurityComparison.astro'; -import ROICalculator from '../../../components/ROICalculator.astro'; - -# Fireflies.ai Alternative - DSGVO-konform mit deutschen Servern - -
    -
    - -
    -

    ⚠️ Datenschutz-Warnung: Fireflies.ai verarbeitet Ihre Daten in den USA

    -

    - Fireflies.ai nutzt Google Cloud Server in den USA für die Datenverarbeitung. - Auch wenn sie "GDPR-compliant" behaupten, bleiben erhebliche rechtliche Risiken für deutsche Unternehmen. -

    -

    - Nach dem Schrems-II-Urteil des EuGH kann dies zu Bußgeldern bis zu 20 Mio. € oder 4% des Jahresumsatzes führen. -

    -
    -
    -
    - -
    -
    -

    Die sichere Alternative zu Fireflies.ai aus Deutschland

    -

    - Memoro bietet alle Vorteile von Fireflies.ai - aber mit 100% DSGVO-Konformität, - deutschen Servern und ohne Datenschutz-Risiken. Schützen Sie Ihre Unternehmensdaten und bleiben Sie compliant. -

    -
    - - -
    -
    -
    - - Deutsche Server -
    -
    - - ISO 27001 -
    -
    - - DSGVO-Zertifikat -
    -
    - - E2E-Verschlüsselung -
    -
    -
    -
    - Memoro Sicherheits-Dashboard - DSGVO-konforme Alternative zu Fireflies -
    -
    - -## Das Datenschutz-Problem mit Fireflies.ai für deutsche Unternehmen - - -
    -

    🚨 Kritische Datenschutz-Risiken bei Fireflies.ai

    - -
    -

    1. US-Datenverarbeitung trotz "GDPR-Compliance"

    -

    Fireflies speichert Daten optional in der EU, aber verarbeitet sie in den USA. - Dies verstößt potentiell gegen DSGVO Art. 44-49.

    -
    - -
    -

    2. Google Cloud Infrastructure

    -

    Nutzung von Google Cloud bedeutet, dass US-Behörden theoretisch Zugriff auf Ihre Daten haben könnten (CLOUD Act).

    -
    - -
    -

    3. Unklare Subprozessoren

    -

    Fireflies nutzt verschiedene US-basierte Drittanbieter für KI-Verarbeitung - oft ohne transparente Auflistung.

    -
    - -
    -

    4. Betriebsrat & Mitbestimmung

    -

    US-Software mit Mitarbeiterüberwachungs-Potential kann in Deutschland zu arbeitsrechtlichen Problemen führen.

    -
    - -
    -

    5. Keine lokale Rechtsprechung

    -

    Bei Datenschutzverletzungen müssen Sie in den USA klagen - teuer und aussichtslos.

    -
    -
    - -
    -

    ✅ Memoros rechtssichere Lösung

    - -
    -

    1. 100% deutsche Datenverarbeitung

    -

    Alle Daten werden ausschließlich in Deutschland gespeichert UND verarbeitet (Hetzner Datacenter).

    -
    - -
    -

    2. Keine US-Cloud-Anbieter

    -

    Vollständig europäische Infrastruktur ohne Abhängigkeit von US-Unternehmen.

    -
    - -
    -

    3. Transparente Datenverarbeitung

    -

    Klare Auftragsverarbeitungsverträge (AVV) nach deutschem Recht mit allen Subprozessoren.

    -
    - -
    -

    4. Betriebsrat-konform

    -

    Speziell für deutsche Mitbestimmung entwickelt - mit Betriebsvereinbarungs-Vorlagen.

    -
    - -
    -

    5. Deutscher Gerichtsstand

    -

    Bei Fragen oder Problemen gilt deutsches Recht mit Gerichtsstand München.

    -
    -
    -
    - -## Fireflies.ai vs. Memoro - Der Compliance-Vergleich - - - -## Was Datenschutzbeauftragte über den Wechsel sagen - -
    - - - - - - - -
    - -## Rechtliche Risiken vermeiden - Der Wechsel-Guide - -
    -

    🔒 In 4 Schritten zu rechtssicherer Meeting-Dokumentation

    - -
    -
    -
    -
    1
    -
    -

    Fireflies.ai rechtssicher beenden

    -
      -
    • • Daten-Export anfordern (DSGVO Art. 20)
    • -
    • • Löschung verlangen & bestätigen lassen
    • -
    • • Dokumentation für Compliance aufbewahren
    • -
    -
    -
    -
    - -
    -
    -
    2
    -
    -

    Memoro DSGVO-konform einrichten

    -
      -
    • • AVV (Auftragsverarbeitung) abschließen
    • -
    • • Technische Maßnahmen dokumentieren
    • -
    • • Mitarbeiter-Einwilligungen einholen
    • -
    -
    -
    -
    - -
    -
    -
    3
    -
    -

    Betriebsrat einbinden

    -
      -
    • • Betriebsvereinbarungs-Vorlage nutzen
    • -
    • • Deutsche Server als Argument
    • -
    • • Keine Mitarbeiterüberwachung möglich
    • -
    -
    -
    -
    - -
    -
    -
    4
    -
    -

    Compliance dokumentieren

    -
      -
    • • Verarbeitungsverzeichnis aktualisieren
    • -
    • • Datenschutz-Folgenabschätzung
    • -
    • • Audit-Trail aktivieren
    • -
    -
    -
    -
    -
    -
    - -## Die wahren Kosten von Datenschutz-Verstößen - - - -## Memoro's Sicherheits-Features im Detail - -
    -
    - -

    Deutsche Infrastruktur

    -
      -
    • ✓ Hetzner Datacenter Nürnberg
    • -
    • ✓ Keine US-Cloud-Dienste
    • -
    • ✓ Georedundante Backups in DE
    • -
    • ✓ 99.9% Verfügbarkeit SLA
    • -
    -
    - -
    - -

    Verschlüsselung

    -
      -
    • ✓ Ende-zu-Ende Verschlüsselung
    • -
    • ✓ AES-256 für Daten at Rest
    • -
    • ✓ TLS 1.3 für Transport
    • -
    • ✓ Zero-Knowledge Option
    • -
    -
    - -
    - -

    Zertifizierungen

    -
      -
    • ✓ ISO 27001 zertifiziert
    • -
    • ✓ DSGVO-Zertifikat
    • -
    • ✓ BSI Grundschutz konform
    • -
    • ✓ TISAX Level 2 (Automotive)
    • -
    -
    - -
    - -

    Zugriffskontrolle

    -
      -
    • ✓ Rollenbasierte Rechte (RBAC)
    • -
    • ✓ 2-Faktor-Authentifizierung
    • -
    • ✓ SSO mit SAML 2.0
    • -
    • ✓ Audit-Logs (unveränderbar)
    • -
    -
    - -
    - -

    Rechtssicherheit

    -
      -
    • ✓ Deutscher AVV Standard
    • -
    • ✓ Betriebsvereinbarungs-Vorlagen
    • -
    • ✓ Löschkonzept nach DSGVO
    • -
    • ✓ Deutscher Gerichtsstand
    • -
    -
    - -
    - -

    Datenhoheit

    -
      -
    • ✓ Jederzeit exportierbar
    • -
    • ✓ Sofortige Löschung möglich
    • -
    • ✓ On-Premise Option verfügbar
    • -
    • ✓ Keine Daten für KI-Training
    • -
    -
    -
    - -## Häufige Fragen zum Datenschutz-Wechsel - - - -## Sofort handeln - Schützen Sie Ihr Unternehmen - -
    - -

    - Jeder Tag mit Fireflies.ai ist ein Compliance-Risiko -

    -

    - Wechseln Sie jetzt zu Memoro und schützen Sie Ihr Unternehmen vor Bußgeldern, - Datenschutz-Verstößen und rechtlichen Konsequenzen. -

    - -
    - - -
    - -
    -

    🎁 Wechsel-Bonus für Fireflies-Nutzer:

    -
      -
    • - - Kostenlose Datenmigration im Wert von €500 -
    • -
    • - - 3 Monate Premium kostenlos testen -
    • -
    • - - Persönliche Compliance-Beratung inklusive -
    • -
    • - - Fertige Betriebsvereinbarungs-Vorlagen -
    • -
    -
    -
    - -## Trusted by Compliance-bewusste Unternehmen - -
    -

    Unternehmen die bereits gewechselt haben

    -
    - Deutsche Bank - Siemens - BMW - SAP - Volkswagen - Bosch -
    -

    - + über 5.000 weitere Unternehmen vertrauen auf Memoros DSGVO-konforme Lösung -

    -
    - -## Weitere sichere Alternativen zu US-Tools - - \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/granola-ai-alternative.mdx b/apps/memoro/apps/landing/src/content/pages/de/granola-ai-alternative.mdx deleted file mode 100644 index c8d08af19..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/granola-ai-alternative.mdx +++ /dev/null @@ -1,392 +0,0 @@ ---- -title: "Granola AI Alternative für Deutschland 2025 - DSGVO-konform & ohne Bot | Memoro" -description: "Die bessere Granola AI Alternative für deutsche Teams ► Keine störenden Bots ✓ DSGVO-konform ✓ Deutsche Server ✓ Offline-Modus ✓ Jetzt wechseln!" -keywords: ["granola ai alternative", "granola alternative deutschland", "granola ai deutsch", "granola alternative dsgvo", "meeting notizen ohne bot", "lokale transkription", "granola ai konkurrenz", "bessere alternative zu granola"] -lang: de -type: comparison -lastUpdated: 2025-01-09 -sections: - hero: - title: "Granola AI Alternative - DSGVO-konform mit deutschen Servern" - subtitle: "Die sichere Alternative zu Granola AI - ohne Einschränkungen" - cta: "Kostenlos testen" - features: - title: "Warum Memoro die bessere Wahl ist" - items: ["Echte DSGVO-Compliance", "Deutsche Server", "Unbegrenzte Meetings", "Alle Plattformen"] -ogImage: "/images/og/granola-alternative.png" -canonical: "https://memoro.ai/de/granola-ai-alternative" -robots: "index, follow" -priority: 0.9 -changefreq: "monthly" ---- - -import Button from '../../../components/atoms/Button.astro'; -import { Icon } from 'astro-icon/components'; -import TestimonialCard from '../../../components/TestimonialCard.astro'; -import ROICalculator from '../../../components/ROICalculator.astro'; - -# Granola AI Alternative für Deutschland - Ohne Bot, mit voller DSGVO-Compliance - -
    -
    -

    Die bessere Alternative zu Granola AI - Made in Germany

    -

    - Erleben Sie diskrete Meeting-Dokumentation ohne Bot, mit unbegrenzten Meetings, - echter DSGVO-Compliance und Support für alle Plattformen - nicht nur Mac. -

    -
    - - -
    -
    -
    - - 600 Min kostenlos -
    -
    - - DSGVO-konform -
    -
    - - Unbegrenzte Meetings -
    -
    -
    -
    - Memoro vs Granola AI Vergleich -
    -
    - -## 🚨 Die Grenzen von Granola AI für deutsche Unternehmen - -
    -
    - -

    Nur 25 kostenlose Meetings

    -

    - Nach nur 25 Meetings ist Schluss mit dem kostenlosen Plan. - Das sind weniger als 2 Wochen normaler Geschäftsbetrieb! -

    -
    - -
    - -

    Hauptsächlich für Mac

    -

    - Windows-Version noch in Beta mit vielen fehlenden Features. - Android-App? Nicht in Sicht. -

    -
    - -
    - -

    Keine Aufzeichnungen

    -

    - Kein Zugriff auf Audio- oder Video-Aufzeichnungen. - Meetings sind nach der Transkription verloren. -

    -
    - -
    - -

    Unzuverlässige Suche

    -

    - Die Suchfunktion findet oft keine Meetings, selbst bei exakten Suchbegriffen. - Frustrierend bei vielen Meetings. -

    -
    -
    - -## 📊 Memoro vs. Granola AI - Der direkte Vergleich - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FeatureGranola AIMemoroVorteil
    Kostenlose Meetings❌ 25 insgesamt✅ 600 Min/Monat✅ Memoro
    DSGVO-Compliance⚠️ Unklar✅ 100% konform✅ Memoro
    Server-Standort🌍 International🇩🇪 Deutschland✅ Memoro
    Plattform-Support⚠️ Mac (Windows Beta)✅ Alle Plattformen✅ Memoro
    Audio-Aufzeichnung❌ Nicht verfügbar✅ Verfügbar✅ Memoro
    Suchfunktion❌ Unzuverlässig✅ Präzise & schnell✅ Memoro
    Meeting Bot✅ Kein Bot✅ Optional ohne Bot= Beide
    Offline-Modus⚠️ Teilweise✅ Vollständig✅ Memoro
    Integrationen❌ Sehr begrenzt✅ 30+ Tools✅ Memoro
    Preis Pro/Monat$10€9,99✅ Memoro
    -
    - -## 🎯 Warum Teams von Granola AI zu Memoro wechseln - -
    -
    - -

    Unbegrenzte Meetings

    -

    - Keine künstliche Begrenzung auf 25 Meetings. - Bei uns bekommen Sie 600 Minuten pro Monat kostenlos - das sind über 200 Meetings! -

    -
    - -
    - -

    Deutsche Server & DSGVO

    -

    - 100% DSGVO-konform mit Servern in Deutschland. - Ihre Daten verlassen niemals die EU - garantiert. -

    -
    - -
    - -

    Alle Plattformen

    -

    - Funktioniert perfekt auf Windows, Mac, iOS und Android. - Keine Beta-Versionen, keine Einschränkungen. -

    -
    -
    - -## 💡 Exklusive Memoro Features die Granola AI fehlen - -
    -

    Was Sie mit Memoro zusätzlich bekommen:

    - -
    -
    - -
    -

    Audio & Video Aufzeichnung

    -

    Greifen Sie jederzeit auf Original-Aufnahmen zu - perfekt für wichtige Details.

    -
    -
    - -
    - -
    -

    Intelligente Suche

    -

    Finden Sie jedes Meeting, jeden Teilnehmer, jedes Thema in Sekunden.

    -
    -
    - -
    - -
    -

    50+ Sprachen & Dialekte

    -

    Inklusive Schweizerdeutsch, Österreichisch und Fachjargon.

    -
    -
    - -
    - -
    -

    30+ Integrationen

    -

    Nahtlose Integration mit Slack, Teams, Asana, ClickUp, Zapier und mehr.

    -
    -
    - -
    - -
    -

    Meeting Analytics

    -

    Verstehen Sie Meeting-Muster und optimieren Sie Ihre Zeit.

    -
    -
    - -
    - -
    -

    Deutscher Support

    -

    24/7 Support in deutscher Sprache - keine Sprachbarrieren.

    -
    -
    -
    -
    - -## 🚀 So einfach wechseln Sie von Granola AI zu Memoro - -
    -

    In 5 Minuten startklar:

    - -
    -
    -
    1
    -
    -

    Memoro Account erstellen

    -

    Kostenlos registrieren und 600 Minuten pro Monat erhalten

    -
    -
    - -
    -
    2
    -
    -

    Desktop & Mobile Apps installieren

    -

    Verfügbar für alle Plattformen - keine Beta-Versionen

    -
    -
    - -
    -
    3
    -
    -

    Meeting-Plattformen verbinden

    -

    Ein-Klick Integration mit Zoom, Teams, Google Meet etc.

    -
    -
    - -
    -
    4
    -
    -

    Team einladen

    -

    Kollegen hinzufügen und gemeinsam produktiver werden

    -
    -
    - -
    -
    5
    -
    -

    Erste Meeting-Notizen genießen

    -

    Automatische Protokolle mit 98% Genauigkeit ab dem ersten Meeting

    -
    -
    -
    -
    - - - -## ❓ Häufig gestellte Fragen - -
    -
    - Kann ich Memoro auch ohne Bot nutzen wie bei Granola? -

    - Ja! Memoro bietet beide Optionen: Sie können diskret ohne Bot aufzeichnen (wie Granola) oder - optional einen Bot für automatische Aufnahmen nutzen. Sie haben die volle Kontrolle. -

    -
    - -
    - Wie viele Meetings sind bei Memoro kostenlos? -

    - Sie erhalten 600 Minuten pro Monat kostenlos - das sind typischerweise 200+ Meetings. - Im Gegensatz zu Granolas einmaligen 25 Meetings erneuert sich Ihr Kontingent jeden Monat. -

    -
    - -
    - Funktioniert Memoro auch auf Windows und Android? -

    - Absolut! Memoro funktioniert vollständig auf Windows, Mac, Linux, iOS und Android. - Keine Beta-Versionen, keine Einschränkungen - volle Funktionalität auf allen Plattformen. -

    -
    - -
    - Kann ich meine alten Meeting-Notizen importieren? -

    - Ja, wir bieten einen kostenlosen Import-Service für Ihre bestehenden Meeting-Notizen. - Unser Support-Team hilft Ihnen beim nahtlosen Übergang. -

    -
    - -
    - Ist Memoro wirklich DSGVO-konform? -

    - Ja, zu 100%. Unsere Server stehen in Deutschland, wir haben einen deutschen Datenschutzbeauftragten - und erfüllen alle DSGVO-Anforderungen. Ihre Daten verlassen niemals die EU. -

    -
    -
    - -
    -

    Bereit für unbegrenzte, sichere Meeting-Notizen?

    -

    - Starten Sie jetzt mit 600 kostenlosen Minuten pro Monat und erleben Sie den Unterschied. -

    -
    - - -
    -

    - Keine Kreditkarte erforderlich · 600 Min/Monat kostenlos · DSGVO-konform -

    -
    \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/guides.mdx b/apps/memoro/apps/landing/src/content/pages/de/guides.mdx deleted file mode 100644 index 32d981895..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/guides.mdx +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "Anleitungen | Memoro" -description: "Entdecken Sie hilfreiche Anleitungen und Tutorials für Memoro" -lang: "de" -type: "page" -lastUpdated: 2024-02-22 -sections: - hero: - title: "Anleitungen" - subtitle: "Entdecken Sie hilfreiche Anleitungen und Tutorials für Memoro" - faq: - title: "Häufig gestellte Fragen zu den Anleitungen" - items: - - question: "Sind die Anleitungen für Anfänger geeignet?" - answer: "Ja, unsere Anleitungen sind nach Schwierigkeitsgrad kategorisiert. Beginnen Sie einfach mit den Anfänger-Guides und arbeiten Sie sich nach Ihrem eigenen Tempo vor." - - question: "Wie aktuell sind die Anleitungen?" - answer: "Wir aktualisieren unsere Anleitungen regelmäßig, um sie mit den neuesten Funktionen von Memoro abzustimmen. Das letzte Update-Datum finden Sie jeweils am Ende der Anleitung." - - question: "Kann ich eigene Anleitungen vorschlagen?" - answer: "Natürlich! Wir freuen uns über Vorschläge aus der Community. Kontaktieren Sie uns einfach mit Ihren Ideen oder Verbesserungsvorschlägen." - - question: "Gibt es Video-Tutorials?" - answer: "Ja, zu vielen Anleitungen bieten wir ergänzende Video-Tutorials an. Diese finden Sie direkt bei der jeweiligen schriftlichen Anleitung." - callToAction: - title: "Bereit für bessere Meeting-Dokumentation?" - description: "Entdecke wie Memoro deine Meetings effizienter und produktiver macht." - buttonText: "App herunterladen" - buttonLink: "/de/download" ---- - -import GuideCard from "../../../components/GuideCard.astro"; -import CallToAction from "../../../components/CallToAction.astro"; -import FAQSection from "../../../components/FAQSection.astro"; - -export const GuidesContent = ({ guides }) => ( - <> -
    -

    {frontmatter.sections.hero.title}

    -

    - {frontmatter.sections.hero.subtitle} -

    -
    - - {/* Guide Grid */} -
    - {guides.map(guide => ( - - ))} -
    - - - -
    - -
    - - -); - -{" "} diff --git a/apps/memoro/apps/landing/src/content/pages/de/home.mdx b/apps/memoro/apps/landing/src/content/pages/de/home.mdx deleted file mode 100644 index a4eda57ce..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/home.mdx +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: "Meeting Protokoll Software - Automatische Protokollerstellung | Memoro" -description: "✓ Automatische Meeting-Protokolle in Minuten ✓ 80+ Sprachen ✓ DSGVO-konform ► Sparen Sie 3+ Stunden/Woche mit KI-Transkription. Jetzt 14 Tage kostenlos testen!" -lang: "de" -type: "home" -lastUpdated: 2024-12-21 -sections: - hero: - title: "Einfach sprechen. Memoro schreibt das Protokoll." - subtitle: "Konzentrieren Sie sich aufs Gespräch – Memoro erledigt die Dokumentation. Fertige Protokolle in Minuten statt Stunden." - image: "/images/product_photos/Memoro-Conversation-TopDown.jpg" - cta: - primary: - text: "Kostenlos herunterladen" - link: "/de/download" - secondary: - text: "Video ansehen" - videoId: "u05nEBNy7bk" - socialProof: - rating: 4.9 - reviewCount: 127 - quote: "Die beste Investition in unsere Produktivität" - author: "Thomas M., Geschäftsführer" - trustBadges: - - icon: "🔒" - text: "DSGVO-konform" - - icon: "🇩🇪" - text: "Made in Germany" - - icon: "🛡️" - text: "SSL-verschlüsselt" - callToAction: - title: "Nie wieder Meetings nacharbeiten" - description: "Schließen Sie sich tausenden Professionals an, die mit Memoro produktiver arbeiten." - buttonText: "Jetzt ausprobieren" - buttonLink: "/de/download" - image: "/images/product_photos/Memoro-App-Smartphone.jpg" - imageAlt: "Meeting Protokoll Software Memoro - Automatische Aufnahme und Transkription im Büro" ---- - -
    - -
    - - - - - - - - - - - - - -
    - -
    - -
    - -
    - diff --git a/apps/memoro/apps/landing/src/content/pages/de/imprint.mdx b/apps/memoro/apps/landing/src/content/pages/de/imprint.mdx deleted file mode 100644 index eecb3b374..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/imprint.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Impressum | Memoro" -description: "Die Impressumseite von Memoro" -lang: "de" -type: "legal" -lastUpdated: 2024-02-22 -sections: - hero: - title: "Impressum" - subtitle: "Rechtliche Informationen und Kontaktdaten" - contact: - company: "Memoro GmbH" - street: "Münzgasse 19" - city: "78462 Konstanz" - phone: "0049 176 444 343 85" - email: "kontakt@memoro.ai" - responsible: "Till Schneider" ---- - -## {frontmatter.sections.contact.company} - -{frontmatter.sections.contact.street} -{frontmatter.sections.contact.city} - -Telefon: [{frontmatter.sections.contact.phone}](tel:{frontmatter.sections.contact.phone.replace(/\s/g,)}) -E-Mail: [{frontmatter.sections.contact.email}](mailto:{frontmatter.sections.contact.email}) - -Redaktionell verantwortlich: {frontmatter.sections.contact.responsible} - -## EU-Streitschlichtung - -Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung -(OS) bereit: [https://ec.europa.eu/consumers/odr/](https://ec.europa.eu/consumers/odr/). -Unsere E-Mail-Adresse finden Sie oben im Impressum. - -Verbraucher­streit­beilegung/Universal­schlichtungs­stelle: Wir sind nicht -bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer -Verbraucherschlichtungsstelle teilzunehmen. - -## Zentrale Kontaktstelle nach dem Digital Services Act - DSA - -Unsere zentrale Kontaktstelle für Nutzer und Behörden nach Art. 11, 12 DSA (Verordnung (EU) 2022/265) erreichen Sie wie folgt: - -E-Mail: [{frontmatter.sections.contact.email}](mailto:{frontmatter.sections.contact.email}) -Telefon: [{frontmatter.sections.contact.phone}](tel:{frontmatter.sections.contact.phone.replace(/\s/g,)}) - -Die für den Kontakt zur Verfügung stehenden Sprachen sind: Deutsch, Englisch. diff --git a/apps/memoro/apps/landing/src/content/pages/de/industries.mdx b/apps/memoro/apps/landing/src/content/pages/de/industries.mdx deleted file mode 100644 index cbd479610..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/industries.mdx +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "Meeting-Software für Büro, Bildung & Handwerk | Memoro" -description: "✓ Baustellendokumentation App ✓ Vorlesungsmitschrift Software ✓ Büro-Protokoll Tool ► Branchen-spezifische Lösungen für automatische Gesprächsdokumentation" -lang: "de" -type: "page" -lastUpdated: 2024-02-22 -sections: - hero: - title: "Meeting-Software für jede Branche" - subtitle: "Automatische Protokollerstellung und KI-Transkription für Büro, Bildung, Handwerk und mehr" - faq: - title: "Häufig gestellte Fragen" - items: - - question: "Wie unterstützt Memoro beim Wissensaustausch?" - answer: "Memoro nutzt KI, um das Wissen Ihres Teams automatisch zu organisieren und zu verknüpfen, sodass Informationen abteilungsübergreifend leicht zu finden und zu teilen sind." - - question: "Kann Memoro mit unseren bestehenden Tools integriert werden?" - answer: "Ja, Memoro lässt sich nahtlos in beliebte Tools wie Slack, Microsoft Teams und Google Workspace integrieren, um Wissen dort zu erfassen und zu teilen, wo Ihr Team bereits arbeitet." - - question: "Sind unsere Daten bei Memoro sicher?" - answer: "Absolut. Wir verwenden Verschlüsselung auf Unternehmensniveau und folgen strengen Sicherheitsprotokollen. Ihre Daten werden in EU-basierten Servern gespeichert und entsprechen den DSGVO-Anforderungen." - - question: "Wie schnell können wir loslegen?" - answer: "Sie können Memoro direkt nach der Anmeldung nutzen. Unser Onboarding-Prozess ist einfach, und die meisten Teams sind innerhalb eines Tages einsatzbereit." - callToAction: - title: "Bereit für bessere Meeting-Dokumentation?" - description: "Entdecke wie Memoro deine Meetings effizienter und produktiver macht." - buttonText: "App herunterladen" - buttonLink: "/de/download" ---- - -import IndustryCard from "../../../components/IndustryCard.astro"; -import TestimonialPreview from "../../../components/TestimonialPreview.astro"; -import FAQSection from "../../../components/FAQSection.astro"; -import CallToAction from "../../../components/CallToAction.astro"; - -export const IndustriesContent = ({ industries, lang }) => ( - <> -
    -

    {frontmatter.sections.hero.title}

    -

    - {frontmatter.sections.hero.subtitle} -

    -
    - -
    - {industries.map((industry) => ( - - ))} -
    - - - - - -
    - -
    - - -); - -{" "} diff --git a/apps/memoro/apps/landing/src/content/pages/de/ki-transkription-software.mdx b/apps/memoro/apps/landing/src/content/pages/de/ki-transkription-software.mdx deleted file mode 100644 index c345ec42c..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/ki-transkription-software.mdx +++ /dev/null @@ -1,451 +0,0 @@ ---- -title: "KI-Transkription-Software 2025 - Automatische Audio zu Text Konvertierung | Memoro" -description: "Professionelle KI-Transkription für deutsche Unternehmen ► 98% Genauigkeit ✓ 50+ Sprachen ✓ DSGVO-konform ✓ Deutsche Server ✓ Jetzt kostenlos testen!" -keywords: ["ki transkription", "automatische transkription", "audio zu text ki", "transkriptionssoftware deutsch", "speech to text deutsch", "ki transkription software", "automatische transkription deutsch", "transkription ki kostenlos"] -lang: de -type: product -lastUpdated: 2025-01-09 -sections: - hero: - title: "KI-Transkription-Software - Präzise & DSGVO-konform" - subtitle: "Verwandeln Sie Ihre Audio- und Video-Dateien in nur wenigen Sekunden in perfekte Texte" - cta: "Kostenlos testen" - features: - title: "Warum unsere KI-Transkription führend ist" - items: ["98% Genauigkeit", "50+ Sprachen", "Echtzeit-Verarbeitung", "DSGVO-konform"] -ogImage: "/images/og/ki-transkription-software.png" -canonical: "https://memoro.ai/de/ki-transkription-software" -robots: "index, follow" -priority: 0.9 -changefreq: "monthly" ---- - -import Button from '../../../components/atoms/Button.astro'; -import { Icon } from 'astro-icon/components'; -import FAQ from '../../../components/FAQ.astro'; -import ComparisonTable from '../../../components/ComparisonTable.astro'; - -
    -
    -

    - KI-Transkription-Software für perfekte Audio-zu-Text Konvertierung -

    -

    - Verwandeln Sie Interviews, Podcasts, Vorlesungen und Meetings in präzise Texte. - Mit 98% Genauigkeit, 50+ Sprachen und vollständiger DSGVO-Konformität. -

    -
    - - -
    -
    -
    - - 600 Min kostenlos -
    -
    - - DSGVO-konform -
    -
    - - 5x schneller als manuell -
    -
    -
    -
    - -## Das Problem mit manueller Transkription - -**Stunden verschwendet, Fehler garantiert:** Jede Stunde Audio bedeutet 4-6 Stunden manueller Arbeit. Bei einem Stundenlohn von 25€ kostet die Transkription eines einstündigen Interviews bereits 100-150€ - und das ohne Gewähr für Genauigkeit. - -### Die 5 größten Probleme manueller Transkription: - -
    -
    -

    ⏰ Extrem zeitaufwendig

    -

    4-6 Stunden Arbeit für 1 Stunde Audio

    -
    -
    -

    💸 Hohe Kosten

    -

    100-150€ pro Stunde Audio bei Freelancern

    -
    -
    -

    ❌ Fehleranfällig

    -

    Müdigkeit führt zu Hörfehlern und Auslassungen

    -
    -
    -

    🔒 Datenschutz-Risiken

    -

    Sensible Inhalte an externe Dienstleister

    -
    -
    - -## Die Memoro KI-Transkription Lösung - -### Wie funktioniert KI-Transkription? - -
    -
    -
    -
    - -
    -

    1. Audio hochladen

    -

    MP3, WAV, MP4 oder live aufnehmen

    -
    -
    -
    - -
    -

    2. KI analysiert

    -

    Neurale Netzwerke erkennen Sprache präzise

    -
    -
    -
    - -
    -

    3. Perfekter Text

    -

    Formatiert, strukturiert und exportbereit

    -
    -
    -
    - -### Memoro vs. Konkurrenz - Der Vergleich - - - -## Anwendungsbereiche für KI-Transkription - -### Journalismus & Medien - -**Interview-Transkription in Minuten statt Stunden:** -- Experteninterviews sofort verschriftlichen -- Podcast-Inhalte für SEO optimieren -- Pressekonferenzen dokumentieren -- O-Töne schnell extrahieren - -*"Als freier Journalist spare ich mit Memoro 15 Stunden pro Woche. Interviews sind sofort verfügbar und ich kann mich aufs Schreiben konzentrieren."* - **Michael K., Journalist** - -### Forschung & Wissenschaft - -**Qualitative Forschung revolutionieren:** -- Experteninterviews analysieren -- Fokusgruppen auswerten -- Vorlesungen dokumentieren -- Feldforschung verschriftlichen - -### Podcasting & Content - -**Content-Produktion beschleunigen:** -- Podcast-Episoden zu Blog-Posts -- YouTube-Videos untertiteln -- Social Media Clips erstellen -- Newsletter-Content generieren - -### Business & Beratung - -**Kundeninteraktionen dokumentieren:** -- Beratungsgespräche protokollieren -- Marktforschungsinterviews -- Produktfeedback sammeln -- Schulungsvideos verschriftlichen - -## Einzigartige Memoro Features - -### Deutsche Sprachoptimierung - -**98% Genauigkeit bei deutschen Inhalten:** -- Erkennung österreichischer/schweizer Dialekte -- Fachbegriffe aus 20+ Branchen -- Umgangssprache und Anglizismen -- Präzise Interpunktion - -### Intelligente Nachbearbeitung - -**KI macht mehr als nur transkribieren:** -- Automatische Absatzformatierung -- Sprecherwechsel erkennen -- Füllwörter entfernen -- Grammatik korrigieren - -### Flexible Export-Optionen - -**Ihre Texte, wie Sie sie brauchen:** -- Word, PDF, TXT -- Untertitel (SRT, VTT) -- JSON für Entwickler -- HTML für Web - -## ROI-Kalkulator: So viel sparen Sie - -
    -

    Beispiel: Freier Journalist

    - -
    -
    -

    Vorher (Manuell)

    -
      -
    • • 5 Interviews à 60 Min/Woche
    • -
    • • 20 Stunden Transkription
    • -
    • • 20h × 25€ = 500€/Woche
    • -
    • 2.000€/Monat Zeitkosten
    • -
    -
    -
    -

    Nachher (Memoro)

    -
      -
    • • 5 Stunden × 1,20€ = 6€/Woche
    • -
    • • 1 Stunde Nachbearbeitung
    • -
    • • Gesamt: 31€/Woche
    • -
    • 124€/Monat
    • -
    -
    -
    - -
    -

    Ersparnis: 1.876€/Monat (94%)

    -
    -
    - -## Datenschutz & Sicherheit - -### 100% DSGVO-konform - -**Ihre sensiblen Inhalte sind sicher:** -- Server-Standort Deutschland (Hetzner) -- Ende-zu-Ende Verschlüsselung -- Automatische Löschung nach 30 Tagen -- Keine Weitergabe an Dritte - -### Compliance-Zertifizierungen - -- ✅ ISO 27001 (Informationssicherheit) -- ✅ DSGVO-Auftragsdatenverarbeitung -- ✅ SOC 2 Type II -- ✅ Betriebsratkonform - -## Erfolgsgeschichten unserer Kunden - -### Case Study: Podcast-Netzwerk - -**Herausforderung:** 50 Podcast-Episoden pro Monat transkribieren für SEO und Accessibility. - -**Lösung:** Automatische Transkription mit Memoro, Integration in WordPress. - -**Ergebnisse:** -- **70% Zeitersparnis** bei der Content-Produktion -- **300% mehr SEO-Traffic** durch transkribierte Inhalte -- **15.000€ jährliche Einsparungen** bei Freelancer-Kosten - -*"Memoro hat unser Content-Game revolutioniert. Wir können jetzt jede Episode in Blog-Posts, Social Media Content und Newsletter verwandeln."* - **Sarah L., Podcast-Produzentin** - -### Case Study: Marktforschungsagentur - -**Herausforderung:** 200 Kundeninterviews pro Quartal auswerten. - -**Vorher:** -- 800 Stunden manuelle Transkription -- 20.000€ Kosten pro Quartal -- 3 Wochen Verzögerung - -**Mit Memoro:** -- 2 Stunden Upload + KI-Verarbeitung -- 240€ Kosten pro Quartal -- Sofortige Verfügbarkeit - -**ROI: 8.233% Kostenersparnis** - -## Preise & Pakete - -
    -
    -

    Starter

    -

    Kostenlos

    -

    600 Minuten/Monat

    -
      -
    • ✅ 98% Genauigkeit
    • -
    • ✅ 10 Sprachen
    • -
    • ✅ Export als Text/Word
    • -
    • ✅ 30 Tage Speicherung
    • -
    -
    -
    -
    - Beliebteste -
    -

    Professional

    -

    €29/Monat

    -

    1.500 Minuten/Monat

    -
      -
    • ✅ Alles aus Starter
    • -
    • ✅ 50+ Sprachen
    • -
    • ✅ Alle Export-Formate
    • -
    • ✅ Prioritäts-Support
    • -
    • ✅ API-Zugang
    • -
    -
    -
    -

    Enterprise

    -

    €99/Monat

    -

    Unlimited Minuten

    -
      -
    • ✅ Alles aus Professional
    • -
    • ✅ Unbegrenzte Transkription
    • -
    • ✅ White-Label Option
    • -
    • ✅ Dedicated Support
    • -
    • ✅ Custom Integration
    • -
    -
    -
    - -## Integration & API - -### Nahtlose Workflows - -**Verbinden Sie Memoro mit Ihren Tools:** -- **Zapier:** 2.000+ App-Integrationen -- **WordPress:** Plugin für automatische Posts -- **Google Drive:** Direkte Dateisynchronisation -- **Slack:** Transkripte ins Team teilen - -### Developer-API - -```javascript -// Einfache API-Integration -const transcription = await memoro.transcribe({ - audioFile: 'interview.mp3', - language: 'de', - format: 'json' -}); -``` - -**Features:** -- REST API & WebSocket -- Echtzeit-Transkription -- Batch-Processing -- Webhook-Benachrichtigungen - -## Häufige Fragen zur KI-Transkription - - - -## Jetzt mit KI-Transkription starten - -
    -

    Bereit für 5x schnellere Transkription?

    -

    - Starten Sie jetzt mit 600 kostenlosen Minuten und erleben Sie die Zukunft der Audio-zu-Text Konvertierung. -

    -
    - - -
    -

    - Keine Kreditkarte erforderlich • 600 Min kostenlos • Jederzeit kündbar -

    -
    - ---- - -*Letzte Aktualisierung: Januar 2025 | Alle Preise zzgl. MwSt.* \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/meeting-protokoll-software.mdx b/apps/memoro/apps/landing/src/content/pages/de/meeting-protokoll-software.mdx deleted file mode 100644 index 86f725b5e..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/meeting-protokoll-software.mdx +++ /dev/null @@ -1,329 +0,0 @@ ---- -title: "Meeting-Protokoll Software | Automatische Protokollerstellung mit KI | Memoro" -description: "✓ Automatische Meeting-Protokolle in Minuten ✓ Sprechererkennung für 15+ Personen ✓ 80+ Sprachen ✓ DSGVO-konform ► Sparen Sie 3+ Stunden pro Woche. Jetzt kostenlos testen!" -lang: "de" -type: "landing" -lastUpdated: 2024-12-28 -sections: - hero: - title: "Die Meeting-Protokoll Software, die mitdenkt" - subtitle: "Automatische Protokollerstellung mit KI-Transkription. Konzentrieren Sie sich aufs Gespräch – Memoro erledigt die Dokumentation." - image: "/images/industries/Office-Businessman-Recording-Memoro-AI-App-Transcription.png" - imageAlt: "Memoro Meeting-Protokoll Software - Automatische Aufnahme und Transkription im Büro" - cta: - primary: - text: "Jetzt mit 150 Mana starten" - link: "/de/download" - secondary: - text: "Live-Demo ansehen" - videoId: "u05nEBNy7bk" - problems: - title: "Schluss mit stundenlanger Nacharbeit" - items: - - icon: "⏰" - title: "3+ Stunden pro Woche verschwendet" - description: "Manuelle Protokollerstellung kostet Zeit, die Sie produktiver nutzen könnten." - - icon: "😤" - title: "Unvollständige Notizen" - description: "Während Sie schreiben, verpassen Sie wichtige Gesprächsinhalte." - - icon: "🔍" - title: "Verlorene Informationen" - description: "Handschriftliche Notizen sind schwer durchsuchbar und gehen oft verloren." - solution: - title: "Ihre Lösung: Automatische Meeting-Protokolle mit Memoro" - subtitle: "Von der Aufnahme zum fertigen Protokoll in drei Schritten" - steps: - - number: "1" - title: "Ein Klick genügt" - description: "Starten Sie die Aufnahme zu Beginn des Meetings – egal ob vor Ort oder remote." - icon: "🎙️" - - number: "2" - title: "KI analysiert in Echtzeit" - description: "Automatische Sprechererkennung, Transkription und intelligente Strukturierung." - icon: "🤖" - - number: "3" - title: "Fertiges Protokoll sofort verfügbar" - description: "Strukturierte Zusammenfassung mit Aufgaben, Beschlüssen und Kernpunkten." - icon: "📄" - features: - title: "Funktionen der Meeting-Protokoll Software" - items: - - icon: "👥" - title: "Automatische Sprechererkennung" - description: "Erkennt bis zu 15 verschiedene Sprecher und ordnet Aussagen automatisch zu." - - icon: "🌍" - title: "80+ Sprachen" - description: "Transkription in über 80 Sprachen und Dialekten, inklusive Schweizerdeutsch." - - icon: "📝" - title: "Intelligente Aufgabenerkennung" - description: "Extrahiert automatisch To-Dos, Termine und Verantwortlichkeiten." - - icon: "🔒" - title: "DSGVO-konform & sicher" - description: "Deutsche Server, Ende-zu-Ende-Verschlüsselung, höchste Datenschutzstandards." - - icon: "📱" - title: "Offline-fähig" - description: "Funktioniert auch ohne Internet – perfekt für vertrauliche Meetings." - - icon: "🔄" - title: "Nahtlose Integration" - description: "Funktioniert mit Teams, Zoom, WebEx und allen anderen Meeting-Tools." - comparison: - title: "Meeting-Protokoll Software im Vergleich" - subtitle: "Warum Memoro die beste Wahl für deutsche Unternehmen ist" - competitors: - - name: "Memoro" - features: - - "✓ DSGVO-konform" - - "✓ Deutsche Server" - - "✓ Offline-Modus" - - "✓ 80+ Sprachen" - - "✓ Automatische Aufgaben" - - "✓ Ab 0€/Monat" - highlight: true - - name: "Otter.ai" - features: - - "✗ US-Server" - - "✗ Nur Cloud" - - "✗ Nur online" - - "○ Hauptsächlich Englisch" - - "○ Begrenzt" - - "Ab 16€/Monat" - - name: "Fireflies.ai" - features: - - "✗ US-Server" - - "✗ Datenschutz fraglich" - - "✗ Nur online" - - "○ Wenige Sprachen" - - "✓ Vorhanden" - - "Ab 18€/Monat" - testimonials: - title: "Was Nutzer über unsere Meeting-Protokoll Software sagen" - items: - - quote: "Seit wir Memoro nutzen, spare ich mindestens 10 Stunden pro Woche. Die automatische Aufgabenerkennung ist ein Game-Changer!" - author: "Sandra M." - role: "Projektmanagerin, DAX-Konzern" - rating: 5 - - quote: "Endlich kann ich mich voll auf die Gespräche konzentrieren, statt mitzuschreiben. Die Protokolle sind besser als handgeschriebene." - author: "Thomas K." - role: "Geschäftsführer, Mittelstand" - rating: 5 - - quote: "Die DSGVO-Konformität war für uns entscheidend. Mit Memoro haben wir eine sichere, deutsche Lösung gefunden." - author: "Julia R." - role: "Compliance Officer, Versicherung" - rating: 5 - useCases: - title: "Meeting-Protokoll Software für jeden Anwendungsfall" - cases: - - title: "Projekt-Meetings" - description: "Statusupdates, Meilensteine und Aufgaben automatisch dokumentiert" - icon: "📊" - - title: "Kunden-Gespräche" - description: "Anforderungen und Vereinbarungen rechtssicher festhalten" - icon: "🤝" - - title: "Team-Besprechungen" - description: "Wöchentliche Meetings effizient protokollieren" - icon: "👥" - - title: "Vorstandssitzungen" - description: "Formelle Protokolle mit allen Beschlüssen" - icon: "🏢" - - title: "Workshops & Trainings" - description: "Lerninhalte und Action Items erfassen" - icon: "🎓" - - title: "Remote-Meetings" - description: "Videokonferenzen lückenlos dokumentieren" - icon: "💻" - roi: - title: "Berechnen Sie Ihre Zeitersparnis" - subtitle: "Finden Sie heraus, wie viel Zeit und Geld Sie mit automatischen Meeting-Protokollen sparen" - calculator: - meetings_per_week: 10 - minutes_per_protocol: 30 - hourly_rate: 50 - result: - time_saved: "5 Stunden/Woche" - money_saved: "1.000€/Monat" - roi_text: "Die Investition amortisiert sich bereits nach 3 Tagen" - faq: - title: "Häufige Fragen zur Meeting-Protokoll Software" - items: - - question: "Wie genau ist die automatische Transkription?" - answer: "Memoro erreicht eine Genauigkeit von über 95% bei deutscher Sprache und guten Audiobedingungen. Die KI verbessert sich kontinuierlich durch maschinelles Lernen." - - question: "Funktioniert die Software auch bei Videokonferenzen?" - answer: "Ja, Memoro funktioniert perfekt mit Teams, Zoom, WebEx und allen anderen Videokonferenz-Tools. Die Software erkennt alle Sprecher automatisch." - - question: "Wie schnell ist das Protokoll verfügbar?" - answer: "Bei kurzen Meetings (bis 30 Minuten) ist das Protokoll sofort nach Beendigung verfügbar. Bei längeren Meetings dauert die Verarbeitung etwa 2-5 Minuten." - - question: "Kann ich das Format der Protokolle anpassen?" - answer: "Ja, Sie können aus verschiedenen Vorlagen wählen oder eigene Vorlagen erstellen. Die Protokolle können als Word, PDF oder Markdown exportiert werden." - - question: "Was kostet die Meeting-Protokoll Software?" - answer: "Memoro startet bei 0€/Monat mit 150 kostenlosen Minuten. Für Teams gibt es flexible Pakete ab 5,99€/Nutzer/Monat. Enterprise-Lösungen auf Anfrage." - - question: "Sind meine Daten sicher?" - answer: "Absolut. Memoro ist DSGVO-konform, nutzt deutsche Server und Ende-zu-Ende-Verschlüsselung. Ihre Daten gehören nur Ihnen." - cta: - title: "Starten Sie noch heute mit automatischen Meeting-Protokollen" - subtitle: "150 Mana geschenkt zum Ausprobieren – kostenlos starten" - button: - text: "Jetzt kostenlos starten" - link: "/de/download" - features: - - "✓ 150 Mana geschenkt" - - "✓ Voller Funktionsumfang" - - "✓ DSGVO-konform" - - "✓ Deutscher Support" ---- - -import HeroSection from "../../../components/HeroSection.astro"; -import FAQSection from "../../../components/FAQSection.astro"; -import CallToAction from "../../../components/CallToAction.astro"; -import ROICalculator from "../../../components/ROICalculator.astro"; - - - -## {frontmatter.sections.problems.title} - -
    - {frontmatter.sections.problems.items.map((item) => ( -
    -
    {item.icon}
    -

    {item.title}

    -

    {item.description}

    -
    - ))} -
    - -## {frontmatter.sections.solution.title} - -

    {frontmatter.sections.solution.subtitle}

    - -
    - {frontmatter.sections.solution.steps.map((step) => ( -
    -
    - {step.number} -
    -
    -

    - {step.icon} - {step.title} -

    -

    {step.description}

    -
    -
    - ))} -
    - -## {frontmatter.sections.features.title} - -
    - {frontmatter.sections.features.items.map((feature) => ( -
    -
    {feature.icon}
    -

    {feature.title}

    -

    {feature.description}

    -
    - ))} -
    - -## {frontmatter.sections.comparison.title} - -

    {frontmatter.sections.comparison.subtitle}

    - -
    - - - - - {frontmatter.sections.comparison.competitors.map((comp) => ( - - ))} - - - - {[0, 1, 2, 3, 4, 5].map((index) => ( - - - {frontmatter.sections.comparison.competitors.map((comp) => ( - - ))} - - ))} - -
    Funktion - {comp.name} -
    - {index === 0 && "DSGVO & Datenschutz"} - {index === 1 && "Server-Standort"} - {index === 2 && "Offline-Modus"} - {index === 3 && "Sprachunterstützung"} - {index === 4 && "Aufgabenerkennung"} - {index === 5 && "Preis"} - - {comp.features[index]} -
    -
    - -## {frontmatter.sections.testimonials.title} - -
    - {frontmatter.sections.testimonials.items.map((testimonial) => ( -
    -
    - {[...Array(testimonial.rating)].map(() => ( - - ))} -
    -

    "{testimonial.quote}"

    -
    -

    {testimonial.author}

    -

    {testimonial.role}

    -
    -
    - ))} -
    - -## {frontmatter.sections.useCases.title} - -
    - {frontmatter.sections.useCases.cases.map((useCase) => ( -
    -
    {useCase.icon}
    -

    {useCase.title}

    -

    {useCase.description}

    -
    - ))} -
    - - - - - -
    -

    {frontmatter.sections.cta.title}

    -

    {frontmatter.sections.cta.subtitle}

    - - - {frontmatter.sections.cta.button.text} - - -
    - {frontmatter.sections.cta.features.map((feature) => ( - {feature} - ))} -
    -
    \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/otter-ai-alternative.mdx b/apps/memoro/apps/landing/src/content/pages/de/otter-ai-alternative.mdx deleted file mode 100644 index 3690ba6f2..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/otter-ai-alternative.mdx +++ /dev/null @@ -1,493 +0,0 @@ ---- -title: "Otter.ai Alternative für Deutschland 2025 - DSGVO-konform & Made in Germany | Memoro" -description: "Die beste Otter.ai Alternative für deutsche Unternehmen ► 98% Genauigkeit ✓ Deutsche Server ✓ DSGVO-konform ✓ 50+ Sprachen ✓ Jetzt wechseln & sparen!" -keywords: ["otter.ai alternative", "otter.ai alternative deutschland", "otter alternative deutsch", "otter.ai alternative dsgvo", "meeting protokoll software", "transkriptionssoftware deutsch", "otter.ai konkurrenz", "bessere alternative zu otter"] -lang: de -type: comparison -lastUpdated: 2025-01-09 -sections: - hero: - title: "Otter.ai Alternative für Deutschland - 100% DSGVO-konform mit Memoro" - subtitle: "Warum 73% der deutschen Unternehmen von Otter.ai zu Memoro wechseln" - cta: "Kostenlos testen" - features: - title: "Die 5 größten Probleme mit Otter.ai in Deutschland" - items: ["Nur 3 Sprachen", "US-Server", "90% Genauigkeit", "Kein deutscher Support"] -ogImage: "/images/og/otter-alternative.png" -canonical: "https://memoro.ai/de/otter-ai-alternative" -robots: "index, follow" -priority: 0.9 -changefreq: "monthly" ---- - -import Button from '../../../components/atoms/Button.astro'; -import { Icon } from 'astro-icon/components'; -import FAQ from '../../../components/FAQ.astro'; -import ComparisonTable from '../../../components/ComparisonTable.astro'; -import TestimonialCard from '../../../components/TestimonialCard.astro'; -import MigrationGuide from '../../../components/MigrationGuide.astro'; -import ROICalculator from '../../../components/ROICalculator.astro'; - -# Otter.ai Alternative für Deutschland - 100% DSGVO-konform mit Memoro - -
    -
    -

    Warum 73% der deutschen Unternehmen von Otter.ai zu Memoro wechseln

    -

    - Erleben Sie überlegene Spracherkennung mit 98% Genauigkeit, deutsche Server und echten DSGVO-Schutz - - alles zu einem faireren Preis als Otter.ai. -

    -
    - - -
    -
    -
    - - 100% DSGVO -
    -
    - - Deutsche Server -
    -
    - - 4.9/5 Bewertung -
    -
    -
    -
    - Memoro Dashboard - Bessere Alternative zu Otter.ai -
    -
    - -## Die 5 größten Probleme mit Otter.ai in Deutschland - -
    -
    - -

    Nur 3 Sprachen

    -

    Otter.ai unterstützt nur Englisch, Spanisch und Französisch. Kein echtes Deutsch, keine Dialekte.

    -
    - -
    - -

    US-Server

    -

    Ihre sensiblen Meeting-Daten werden auf amerikanischen Servern gespeichert - ein DSGVO-Risiko.

    -
    - -
    - -

    Nur 300 Minuten kostenlos

    -

    Die kostenlose Version ist mit 300 Minuten pro Monat für Teams praktisch unbrauchbar.

    -
    - -
    - -

    90% Genauigkeit

    -

    Bei wichtigen Meetings bedeuten 10% Fehlerquote verpasste Details und Missverständnisse.

    -
    - -
    - -

    Kein deutscher Support

    -

    Support nur auf Englisch und in US-Zeitzonen - unpraktisch für deutsche Teams.

    -
    - -
    - -

    Versteckte Kosten

    -

    $16.99 USD pro Monat + Währungsgebühren + begrenzte Minuten = teurer als gedacht.

    -
    -
    - -## Memoro vs. Otter.ai - Der direkte Vergleich - - - -## Was echte Wechsler sagen - -
    - - - - - - - -
    - -## So einfach ist der Wechsel von Otter.ai zu Memoro - - - -## Exklusive Memoro-Features, die Otter.ai nicht bietet - -
    -

    Was Sie nur bei Memoro bekommen

    - -
    -
    - -

    Echte deutsche Spracherkennung

    -

    Trainiert auf deutschen Meetings, versteht Fachbegriffe und Dialekte perfekt.

    -
    - -
    - -

    Ende-zu-Ende Verschlüsselung

    -

    Ihre Daten sind bereits bei der Aufnahme verschlüsselt - maximale Sicherheit.

    -
    - -
    - -

    Offline-Aufnahme & Sync

    -

    Nehmen Sie ohne Internet auf und synchronisieren Sie später - perfekt für unterwegs.

    -
    - -
    - -

    Branchenspezifische Vorlagen

    -

    Vorgefertigte Templates für Ihre Branche - von Anwälten bis Zahnärzte.

    -
    - -
    - -

    KI-Assistent auf Deutsch

    -

    Fragen Sie die KI auf Deutsch und erhalten Sie präzise Antworten aus Ihren Meetings.

    -
    - -
    - -

    ISO 27001 zertifiziert

    -

    Höchste Sicherheitsstandards, von deutschen Auditoren geprüft und zertifiziert.

    -
    -
    -
    - -## ROI: So viel sparen Sie mit dem Wechsel - - - -## Warum Memoro die bessere Wahl für Deutschland ist - -
    -

    Die Vorteile auf einen Blick

    - -
    -
    -

    ✅ Memoro Vorteile

    -
      -
    • - - 100% DSGVO-konform mit deutschen Servern -
    • -
    • - - 98%+ Genauigkeit bei deutschen Gesprächen -
    • -
    • - - 50+ Sprachen inklusive alle deutschen Dialekte -
    • -
    • - - Deutscher Support in Ihrer Zeitzone -
    • -
    • - - Offline-Modus für maximale Flexibilität -
    • -
    • - - 600 Minuten kostenlos (doppelt so viel) -
    • -
    • - - Faire Preise in EUR ohne versteckte Kosten -
    • -
    -
    - -
    -

    ❌ Otter.ai Nachteile

    -
      -
    • - - US-Server mit DSGVO-Risiken -
    • -
    • - - Nur 90% Genauigkeit -
    • -
    • - - Nur 3 Sprachen (kein Deutsch) -
    • -
    • - - Support nur auf Englisch -
    • -
    • - - Kein Offline-Modus -
    • -
    • - - Nur 300 Minuten kostenlos -
    • -
    • - - Teure USD-Preise + Währungsgebühren -
    • -
    -
    -
    -
    - -## Häufig gestellte Fragen zum Wechsel - - - -## Überzeugt? Starten Sie jetzt mit Memoro! - -
    -

    - Schließen Sie sich 10.000+ deutschen Unternehmen an -

    -

    - Wechseln Sie heute von Otter.ai zu Memoro und erleben Sie den Unterschied -

    - -
    - - -
    - -
    -
    -
    98%+
    -
    Genauigkeit
    -
    -
    -
    50+
    -
    Sprachen
    -
    -
    -
    100%
    -
    DSGVO
    -
    -
    -
    24/7
    -
    Support
    -
    -
    -
    - -## Weitere Otter.ai Alternativen im Vergleich - -Sie möchten auch andere Alternativen kennenlernen? Hier finden Sie weitere Vergleiche: - - \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/presskit.mdx b/apps/memoro/apps/landing/src/content/pages/de/presskit.mdx deleted file mode 100644 index a18925201..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/presskit.mdx +++ /dev/null @@ -1,250 +0,0 @@ ---- -title: "Pressekit | Memoro" -description: "Alle Ressourcen für Medienvertreter und Partner an einem Ort" -lang: "de" -type: "page" -lastUpdated: 2024-12-10 -sections: - hero: - title: "Pressekit" - subtitle: "Alle Ressourcen für Medienvertreter und Partner an einem Ort" - brandAssets: - title: "Logos und Markenelemente" - items: - - title: "Memoro Logo" - image: "/images/brand/logo.svg" - downloads: - - format: "SVG" - url: "/assets/press/memoro-logo.svg" - - format: "PNG" - url: "/assets/press/memoro-logo.png" - companyInfo: - title: "Unternehmensinformationen" - about: - title: "Über Memoro" - description: "Memoro ist eine innovative mobile Anwendung, die die Art und Weise revolutioniert, wie Menschen Gespräche dokumentieren und Gedanken festhalten. Entwickelt als Antwort auf die Herausforderungen des manuellen Mitschreibens und der Protokollführung, bietet Memoro eine intuitive Lösung für die automatisierte Erfassung, Transkription und Zusammenfassung von gesprochenen Inhalten." - facts: - title: "Fakten & Zahlen" - items: - - "Gründung: 2024" - - "Hauptsitz: Konstanz, Deutschland" - - "Mitarbeiter: 3-5 (Kernteam)" - - "Angemeldete Nutzer: 2.500+" - - "Unterstützte Sprachen: Über 80 Sprachen" - - "Zeitersparnis: 2-6 Stunden pro Woche" - pressContact: - title: "Pressekontakt" - intro: "Für Presseanfragen wenden Sie sich bitte an:" - contact: - name: "Aleksandra Vasileva" - role: "Marketing & Kommunikation" - email: "kontakt@memoro.ai" - phone: "" - callToAction: - title: "Bereit für effizientere Gesprächsdokumentation?" - description: "Schließen Sie sich Hunderten von Nutzern an, die bereits von Memoros KI-gestützter Dokumentationsplattform profitieren." - buttonText: "Jetzt starten" - buttonLink: "https://memoro.ai" ---- - -## {frontmatter.sections.brandAssets.title} - -
    - {frontmatter.sections.brandAssets.items.map((item) => ( -
    -

    {item.title}

    - {item.image && ( -
    - {item.title} -
    - )} - {item.description && ( -

    {item.description}

    - )} -
    - {item.downloads.map((download) => ( - - {download.text || download.format} - - ))} -
    -
    - ))} -
    - -## {frontmatter.sections.companyInfo.title} - -
    -
    -
    -

    - {frontmatter.sections.companyInfo.about.title} -

    -

    - {frontmatter.sections.companyInfo.about.description} -

    -
    -
    -

    - {frontmatter.sections.companyInfo.facts.title} -

    -
      - {frontmatter.sections.companyInfo.facts.items.map((item) => ( -
    • {item}
    • - ))} -
    -
    -
    -
    - - -## {frontmatter.sections.pressContact.title} - -
    -
    -

    {frontmatter.sections.pressContact.intro}

    -
    -

    - {frontmatter.sections.pressContact.contact.name} -

    -

    - {frontmatter.sections.pressContact.contact.role} -

    -

    - - {frontmatter.sections.pressContact.contact.email} - -

    -
    -
    -
    - -## Alle Kontaktmöglichkeiten - -
    -
    - {/* Direkte Kontakte */} -
    -
    -
    - 📞 -
    -

    Direkte Kontakte

    -
    - -
    - -
    - 📧 -
    -
    -

    E-Mail

    -

    kontakt@memoro.ai

    -
    -
    - - -
    - 💬 -
    -
    -

    WhatsApp

    -

    +41 79 370 88 99

    -
    -
    - - -
    - 🌐 -
    -
    -

    Website

    -

    www.memoro.ai

    -
    -
    - -
    -
    - 📍 -
    -
    -

    Hauptsitz

    -

    - Münzgasse 19
    - 78462 Konstanz
    - Deutschland -

    -
    -
    -
    -
    - - {/* Social Media */} - -
    -
    - diff --git a/apps/memoro/apps/landing/src/content/pages/de/prices.mdx b/apps/memoro/apps/landing/src/content/pages/de/prices.mdx deleted file mode 100644 index fc93593e1..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/prices.mdx +++ /dev/null @@ -1,292 +0,0 @@ ---- -title: "Preise & Kostenlose Testversion - Meeting Software | Memoro" -description: "✓ 14 Tage kostenlos testen ✓ Keine Kreditkarte erforderlich ✓ Ab 0€/Monat ► Flexible Preispläne für automatische Meeting-Protokolle und KI-Transkription" -lang: "de" -type: "page" -lastUpdated: 2025-01-22 -sections: - hero: - title: "Wählen Sie Ihren Mana-Plan" - subtitle: "Monatliche Mana-Pakete für Ihre individuellen Bedürfnisse" - plans: - - id: "free" - name: "Mana Tropfen" - price: - monthly: 0 - yearly: 0 - priceUnit: "" - features: - - "150 Mana pro Monat" - - "Grundlegende Funktionen" - monthlyMana: 150 - canGiftMana: false - cta: "Kostenlos starten" - highlight: false - - id: "Mana_Stream_Small_v1" - name: "Kleiner Mana Stream" - price: - monthly: 5.99 - yearly: 47.99 - priceUnit: "/ Monat" - yearlyBreakdown: "(entspricht 3,99€ / Monat, 33% Rabatt)" - features: - - "600 Mana pro Monat" - - "Mana verschenken möglich" - - "Erweiterte Funktionen" - monthlyMana: 600 - canGiftMana: true - cta: "Kleiner Mana Stream wählen" - highlight: false - - id: "Mana_Stream_Medium_v1" - name: "Mittlerer Mana Stream" - price: - monthly: 14.99 - yearly: 119.99 - priceUnit: "/ Monat" - yearlyBreakdown: "(entspricht 9,99€ / Monat, 33% Rabatt)" - features: - - "1500 Mana pro Monat" - - "Mana verschenken möglich" - - "Prioritäts-Support" - - "Alle Premium-Funktionen" - monthlyMana: 1500 - canGiftMana: true - cta: "Mittlerer Mana Stream wählen" - highlight: false - - id: "Mana_Stream_Large_v1" - name: "Großer Mana Stream" - price: - monthly: 29.99 - yearly: 239.99 - priceUnit: "/ Monat" - yearlyBreakdown: "(entspricht 19,99€ / Monat, 33% Rabatt)" - features: - - "3000 Mana pro Monat" - - "Mana verschenken möglich" - - "Premium-Support" - - "Erweiterte Analysen" - - "Team-Funktionen" - monthlyMana: 3000 - canGiftMana: true - cta: "Großer Mana Stream wählen" - highlight: false - - id: "Mana_Stream_Giant_v1" - name: "Riesiger Mana Stream" - price: - monthly: 49.99 - yearly: 399.99 - priceUnit: "/ Monat" - yearlyBreakdown: "(entspricht 33,33€ / Monat, 33% Rabatt)" - features: - - "5000 Mana pro Monat" - - "Mana verschenken möglich" - - "VIP-Support" - - "Alle Funktionen" - - "Enterprise-Features" - - "API-Zugang" - monthlyMana: 5000 - canGiftMana: true - cta: "Riesiger Mana Stream wählen" - highlight: false - manaPotions: - title: "Mana Tränke" - subtitle: "Einmalige Mana-Pakete für zusätzliche Power" - items: - - id: "Mana_Potion_Small_v1" - name: "Kleiner Mana Trank" - manaAmount: 350 - price: 4.99 - popular: false - - id: "Mana_Potion_Medium_v1" - name: "Mittlerer Mana Trank" - manaAmount: 700 - price: 9.99 - popular: false - - id: "Mana_Potion_Large_v1" - name: "Großer Mana Trank" - manaAmount: 1400 - price: 19.99 - popular: false - - id: "Mana_Potion_Giant_v2" - name: "Riesiger Mana Trank" - manaAmount: 2800 - price: 39.99 - popular: false - comparison: - title: "Detaillierter Vergleich" - faq: - title: "Häufig gestellte Fragen" - items: - - question: "Was ist Mana und wie funktioniert es?" - answer: "Mana ist unsere flexible Währung für die Nutzung von Memoro. Jede Aktion (Aufnahme, Transkription, KI-Analyse) verbraucht Mana. Je nach Ihrem Plan erhalten Sie monatlich ein festes Kontingent an Mana." - - question: "Was passiert mit ungenutztem Mana?" - answer: "Ungenutztes Mana verfällt am Ende des Monats. Ihr Kontingent wird jeden Monat komplett erneuert. Mit Mana-Tränken können Sie zusätzliches Mana für den aktuellen Monat erwerben." - - question: "Kann ich Mana an andere Nutzer verschenken?" - answer: "Ja, ab dem Kleinen Mana Stream Plan können Sie Mana an andere Memoro-Nutzer verschenken. Dies ist ideal für Teams oder wenn Sie Freunden aushelfen möchten." - - question: "Wie spare ich mit der jährlichen Abrechnung?" - answer: "Mit einem Jahresabonnement sparen Sie 33% im Vergleich zur monatlichen Abrechnung. Der Betrag wird jährlich im Voraus berechnet." - - question: "Kann ich zwischen den Plänen wechseln?" - answer: "Ja, Sie können jederzeit zu einem höheren oder niedrigeren Plan wechseln. Bei einem Upgrade wird Ihr Mana-Kontingent entsprechend angepasst. Die Abrechnung erfolgt anteilig." - - question: "Was sind Mana Tränke?" - answer: "Mana Tränke sind einmalige Mana-Pakete, die Sie zusätzlich zu Ihrem monatlichen Kontingent kaufen können. Sie sind ideal, wenn Sie in einem Monat mehr Mana benötigen, ohne Ihr Abo zu ändern." - callToAction: - title: "Starten Sie noch heute mit Memoro" - description: "Erleben Sie die Zukunft der KI-gestützten Dokumentation. Beginnen Sie kostenlos mit dem Mana Tropfen Plan!" - buttonText: "Jetzt kostenlos starten" - buttonLink: "/de/download" ---- - -import FAQSection from "../../../components/FAQSection.astro"; -import CallToAction from "../../../components/CallToAction.astro"; -import PricingToggle from "../../../components/PricingToggle.astro"; -import PricingBreakdown from "../../../components/PricingBreakdown.astro"; - -
    -

    {frontmatter.sections.hero.title}

    -

    {frontmatter.sections.hero.subtitle}

    -
    - - - - - -
    -
    - {frontmatter.sections.plans.map((plan) => ( -
    - {plan.highlight && ( -
    - Beliebt -
    - )} -
    -

    {plan.name}

    -
    -
    - - {plan.price.monthly === 0 ? 'Kostenlos' : `${plan.price.monthly}€`} - - {plan.priceUnit && / Monat} -
    -
    - {plan.yearlyBreakdown && ( - - )} -
    - -
    -
    -

    Monatliches Mana

    -

    {plan.monthlyMana}

    -
    -
    - - - Herunterladen - -
    - ))} -
    -
    - -
    -
    -

    {frontmatter.sections.manaPotions.title}

    -

    1 Mana = 1 Cent

    -

    {frontmatter.sections.manaPotions.subtitle}

    -
    - -
    - {frontmatter.sections.manaPotions.items.map((potion) => ( -
    - {potion.popular && ( -
    - Beliebt -
    - )} -

    {potion.name}

    -

    {potion.manaAmount}

    -

    Mana

    -

    {potion.price}€

    -
    - ))} -
    -
    - -
    -

    {frontmatter.sections.comparison.title}

    -
    - - - - - {frontmatter.sections.plans.map((plan) => ( - - ))} - - - - - - {frontmatter.sections.plans.map((plan) => ( - - ))} - - - - {frontmatter.sections.plans.map((plan) => ( - - ))} - - - - {frontmatter.sections.plans.map((plan) => ( - - ))} - - -
    Feature{plan.name}
    Preis - - {plan.price.monthly === 0 ? '✓' : `${plan.price.monthly}€ / Monat`} - -
    Monatliches Mana{plan.monthlyMana}
    Mana verschenken - {plan.canGiftMana ? ( - - - - ) : ( - - - - )} -
    -
    -
    - - - - diff --git a/apps/memoro/apps/landing/src/content/pages/de/privacy.mdx b/apps/memoro/apps/landing/src/content/pages/de/privacy.mdx deleted file mode 100644 index 8ec69ed7b..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/privacy.mdx +++ /dev/null @@ -1,341 +0,0 @@ ---- -title: "Datenschutz | Memoro" -description: "Datenschutzerklärung der Memoro GmbH" -lang: "de" -type: "legal" -lastUpdated: 2024-08-27 -sections: - hero: - title: "Datenschutzerklärung" - subtitle: "Informationen zum Schutz Ihrer Daten" ---- - -## Datenschutzerklärung für die Memoro Website - -### 1. Einleitung - -Diese Datenschutzerklärung informiert Sie über die Art, den Umfang und Zweck der Verarbeitung personenbezogener Daten auf unserer Website www.memoro.ai. Wir nehmen den Schutz Ihrer persönlichen Daten sehr ernst und behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung. - -### 2. Verantwortliche Stelle - -Verantwortlich für die Datenverarbeitung auf dieser Website ist: - -Memoro GmbH -Münzgasse 19 -78462 Konstanz -Telefon: 0049 176 444 343 85 -E-Mail: [kontakt@memoro.ai](mailto:kontakt@memoro.ai) - -Redaktionell verantwortlich: Till Schneider - -### 3. Arten der verarbeiteten Daten - -Wir verarbeiten personenbezogene Daten, die wir im Rahmen Ihrer Nutzung unserer Website erheben. Zu den verarbeiteten Daten gehören: - -- Nutzungsdaten (z.B. besuchte Webseiten, Zugriffszeiten) -- Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen) - -### 4. Zweck der Datenverarbeitung - -Wir verarbeiten Ihre personenbezogenen Daten zu folgenden Zwecken: - -- Bereitstellung und Optimierung unserer Website -- Durchführung von Analysen und Statistiken -- Marketing und Werbung -- Verbesserung der Nutzererfahrung - -### 5. Rechtsgrundlage der Verarbeitung - -Die Verarbeitung Ihrer personenbezogenen Daten erfolgt auf Grundlage Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) und/oder unserer berechtigten Interessen (Art. 6 Abs. 1 lit. f DSGVO), welche darin bestehen, unser Angebot zu optimieren und die Nutzererfahrung zu verbessern. - -### 6. Empfänger der Daten - -Ihre Daten können an folgende Empfänger weitergegeben werden: - -- Dienstleister und Auftragsverarbeiter, die für uns tätig sind - -### 7. Dauer der Speicherung - -Wir speichern Ihre personenbezogenen Daten nur so lange, wie es für die Zwecke, für die sie erhoben wurden, erforderlich ist oder wie es gesetzlich vorgeschrieben ist. - -### 8. Ihre Rechte - -Sie haben das Recht: - -- Auskunft über Ihre von uns verarbeiteten personenbezogenen Daten zu verlangen -- Die Berichtigung unrichtiger oder Vervollständigung Ihrer bei uns gespeicherten personenbezogenen Daten zu verlangen -- Die Löschung Ihrer bei uns gespeicherten personenbezogenen Daten zu verlangen -- Die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen -- Ihre Einwilligung jederzeit zu widerrufen -- Sich bei einer Aufsichtsbehörde zu beschweren - -### 9. Einsatz von Analyse- und Tracking-Tools - -Wir setzen auf unserer Website verschiedene Analyse- und Tracking-Tools ein, um die Nutzung unserer Website zu analysieren und zu verbessern. Im Folgenden informieren wir Sie über diese Tools: - -#### 9.1. Vercel Analytics - -Wir nutzen Vercel Analytics, einen Webanalysedienst der Vercel Inc. Vercel Analytics verwendet keine Cookies und sammelt keine personenbezogenen Daten. Es werden lediglich anonymisierte Nutzungsdaten erfasst, um die Performance und Nutzung unserer Website zu verbessern. - -#### 9.2. Google Analytics - -Wir nutzen Google Analytics, einen Webanalysedienst der Google LLC. Google Analytics verwendet Cookies, die eine Analyse der Benutzung der Website durch Sie ermöglichen. Die durch das Cookie erzeugten Informationen über Ihre Benutzung dieser Website werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert. - -Wir haben die IP-Anonymisierung aktiviert. Dadurch wird Ihre IP-Adresse von Google innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum zuvor gekürzt. - -Mehr Informationen zum Umgang mit Nutzerdaten bei Google Analytics finden Sie in der Datenschutzerklärung von Google: [https://policies.google.com/privacy](https://policies.google.com/privacy) - -#### 9.3. Plausible Analytics - -Wir verwenden Plausible Analytics, einen datenschutzfreundlichen Webanalysedienst. Plausible Analytics sammelt keine personenbezogenen Daten und verwendet keine Cookies. Es werden lediglich anonymisierte Nutzungsdaten erfasst, um die Performance und Nutzung unserer Website zu analysieren. - -Weitere Informationen zu Plausible Analytics und deren Datenschutzpraktiken finden Sie unter: [https://plausible.io/data-policy](https://plausible.io/data-policy) - -#### 9.4. Hotjar - -Wir nutzen Hotjar, um die Bedürfnisse unserer Nutzer besser zu verstehen und das Angebot auf dieser Website zu optimieren. Mithilfe der Technologie von Hotjar bekommen wir ein besseres Verständnis von den Erfahrungen unserer Nutzer (z.B. wieviel Zeit Nutzer auf welchen Seiten verbringen, welche Links sie anklicken, was sie mögen und was nicht etc.) und das hilft uns, unser Angebot am Feedback unserer Nutzer auszurichten. - -Hotjar arbeitet mit Cookies und anderen Technologien, um Informationen über das Verhalten unserer Nutzer und über ihre Endgeräte zu sammeln (insbesondere IP Adresse des Geräts (wird nur in anonymisierter Form erfasst und gespeichert), Bildschirmgröße, Gerätetyp (Unique Device Identifiers), Informationen über den verwendeten Browser, Standort (nur Land), zum Anzeigen unserer Website bevorzugte Sprache). - -Weitere Informationen finden Sie in der Datenschutzerklärung von Hotjar: [https://www.hotjar.com/legal/policies/privacy](https://www.hotjar.com/legal/policies/privacy) - -#### 9.5. PostHog - -Wir verwenden PostHog, eine Open-Source-Plattform für Produktanalysen. PostHog sammelt Informationen über die Nutzung unserer Website, einschließlich Seitenaufrufe, Klicks und Benutzerinteraktionen. Diese Daten helfen uns, unser Produkt zu verbessern und die Benutzererfahrung zu optimieren. - -PostHog verwendet Cookies, um Benutzer über mehrere Besuche hinweg zu identifizieren. Sie können die Verwendung von Cookies in Ihren Browsereinstellungen deaktivieren. - -Wir nutzen die EU-Cloud von PostHog, was bedeutet, dass alle von PostHog gesammelten Daten innerhalb der Europäischen Union verarbeitet und gespeichert werden. Dies trägt dazu bei, die Einhaltung der Datenschutz-Grundverordnung (DSGVO) zu gewährleisten. - -Weitere Informationen zu den Datenschutzpraktiken von PostHog finden Sie unter: [https://posthog.com/privacy](https://posthog.com/privacy) - -### 10. Opt-Out-Möglichkeiten - -Sie haben jederzeit die Möglichkeit, der Datenerfassung durch die oben genannten Dienste zu widersprechen: - -- Für Google Analytics können Sie das Browser-Add-on zur Deaktivierung von Google Analytics verwenden: [https://tools.google.com/dlpage/gaoptout](https://tools.google.com/dlpage/gaoptout) -- Für Hotjar können Sie das Opt-Out hier setzen: [https://www.hotjar.com/legal/compliance/opt-out](https://www.hotjar.com/legal/compliance/opt-out) -- Für PostHog können Sie das Tracking in Ihren Kontoeinstellungen deaktivieren oder Cookies in Ihrem Browser blockieren - -### 11. Änderungen dieser Datenschutzerklärung - -Wir behalten uns vor, diese Datenschutzerklärung anzupassen, damit sie stets den aktuellen rechtlichen Anforderungen entspricht oder um Änderungen unserer Leistungen in der Datenschutzerklärung umzusetzen, z.B. bei der Einführung neuer Services. Für Ihren erneuten Besuch gilt dann die neue Datenschutzerklärung. - -### 12. Fragen zum Datenschutz - -Wenn Sie Fragen zum Datenschutz haben, schreiben Sie uns bitte eine E-Mail oder wenden Sie sich direkt an die für den Datenschutz verantwortliche Person in unserer Organisation: - -Memoro GmbH -z.Hd. Datenschutzbeauftragter -Münzgasse 19 -78462 Konstanz -E-Mail: [datenschutz@memoro.ai](mailto:datenschutz@memoro.ai) - -Stand: 15.12.2024 - ---- - -## Datenschutzerklärung für die Memoro App - -### Einleitung - -Wir freuen uns sehr über Ihr Interesse an unserer App. Datenschutz hat einen besonders hohen Stellenwert für die Geschäftsleitung der Memoro GmbH. Diese Datenschutzerklärung soll Sie über die Art, den Umfang und den Zweck der Erhebung und Verwendung personenbezogener Daten bei der Nutzung unserer App informieren. - -**Unser Versprechen**: Wir werden Ihre Daten niemals einsehen oder verkaufen. Wir setzen gezielt auf Lösungen, die höchsten europäischen Datenschutzstandards entsprechen und reduzieren stetig die Abhängigkeit von außereuropäischen Anbietern. - -### 1. Verantwortlicher - -Verantwortlicher im Sinne der Datenschutz-Grundverordnung (DSGVO) ist die: - -Memoro GmbH -Münzgasse 19 -78462 Konstanz -Telefon: 0049 176 444 343 85 -E-Mail: [kontakt@memoro.ai](mailto:kontakt@memoro.ai) - -### 2. Begriffsbestimmungen - -Diese Datenschutzerklärung beruht auf den Begrifflichkeiten der Datenschutz-Grundverordnung (DSGVO). Unsere Datenschutzerklärung soll sowohl für die Öffentlichkeit als auch für unsere Kunden und Geschäftspartner einfach lesbar und verständlich sein. Um dies zu gewährleisten, möchten wir vorab die verwendeten Begrifflichkeiten erläutern: - -- **personenbezogene Daten**: Alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person beziehen. -- **betroffene Person**: Jede identifizierte oder identifizierbare natürliche Person, deren personenbezogene Daten von dem Verantwortlichen verarbeitet werden. -- **Verarbeitung**: Jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführte Vorgang im Zusammenhang mit personenbezogenen Daten. -- **Einschränkung der Verarbeitung**: Die Markierung gespeicherter personenbezogener Daten mit dem Ziel, ihre künftige Verarbeitung einzuschränken. -- **Profiling**: Jede Art der automatisierten Verarbeitung personenbezogener Daten zur Bewertung bestimmter persönlicher Aspekte. -- **Pseudonymisierung**: Die Verarbeitung personenbezogener Daten in einer Weise, auf welche die personenbezogenen Daten ohne Hinzuziehung zusätzlicher Informationen nicht mehr einer spezifischen betroffenen Person zugeordnet werden können. -- **Verantwortlicher**: Die natürliche oder juristische Person, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten entscheidet. -- **Auftragsverarbeiter**: Eine natürliche oder juristische Person, die personenbezogene Daten im Auftrag des Verantwortlichen verarbeitet. -- **Empfänger**: Eine natürliche oder juristische Person, der personenbezogene Daten offengelegt werden. -- **Dritter**: Eine natürliche oder juristische Person außer der betroffenen Person, dem Verantwortlichen, dem Auftragsverarbeiter und den Personen, die unter der unmittelbaren Verantwortung des Verantwortlichen oder des Auftragsverarbeiters befugt sind, die personenbezogenen Daten zu verarbeiten. -- **Einwilligung**: Jede freiwillig für den bestimmten Fall in informierter Weise und unmissverständlich abgegebene Willensbekundung der betroffenen Person, mit der diese zu verstehen gibt, dass sie mit der Verarbeitung der sie betreffenden personenbezogenen Daten einverstanden ist. - -### 3. Zwecke der Datenverarbeitung - -#### 3.1. Verarbeitung von Sprachaufnahmen, Transkriptionen und Zusammenfassungen - -**Zweck der Datenverarbeitung**: Die Verarbeitung Ihrer Sprachaufnahmen erfolgt zum Zweck der Transkription und anschließenden Erstellung von Zusammenfassungen ("Memories"). Diese Datenverarbeitung erfolgt ausschließlich zu Ihrem persönlichen Gebrauch und die Ergebnisse werden nur Ihnen zur Verfügung gestellt. - -**Art der verarbeiteten Daten**: -- Sprachaufnahmen -- Transkriptionen der Sprachaufnahmen -- Zusammenfassungen der Transkriptionen ("Memories") - -**Der Weg Ihrer Daten**: -1. **Aufnahme**: Die Audiodatei wird zunächst sicher auf Ihrem Endgerät gespeichert -2. **Upload**: Verschlüsselte Übertragung zu Supabase (Frankfurt, Deutschland) -3. **Transkription**: Verarbeitung durch Microsoft Azure (Schweden, EU) -4. **Konvertierung** (bei Bedarf): Google Cloud (Frankfurt, Deutschland) -5. **Analyse**: Erstellung von "Memories" durch Google Gemini (Belgien, EU) oder Azure OpenAI (Schweden, EU) -6. **Speicherung**: Finale Analysen in Supabase (Frankfurt, Deutschland) - -**Hinweis zur Aufnahme anderer Personen**: Bitte beachten Sie, dass die Aufnahme von Sprachaufnahmen anderer Personen ohne deren ausdrückliche Einwilligung gegen die DSGVO verstößt. Sie sind verpflichtet, sicherzustellen, dass alle aufgenommenen Personen ihre Einwilligung zur Verarbeitung der Sprachaufnahmen gegeben haben. Es liegt in Ihrer Verantwortung, diese Einwilligung einzuholen und nachzuweisen. - -#### 3.2. Verarbeitung von Nutzungsdaten - -**Zweck der Datenverarbeitung**: Die Nutzungsdaten werden erhoben, um die Funktionalität und Benutzerfreundlichkeit unserer App zu verbessern. - -**Art der verarbeiteten Daten**: -- IP-Adresse des Mobilgeräts -- Gerätetyp -- Eindeutige Gerätekennung -- Betriebssystem des Mobilgeräts -- Typ des mobilen Internetbrowsers -- Eindeutige Gerätekennungen -- Diagnosedaten - -### 4. Rechtsgrundlagen der Verarbeitung - -- Art. 6 I lit. a DSGVO dient unserem Unternehmen als Rechtsgrundlage für Verarbeitungsvorgänge, bei denen wir eine Einwilligung für einen bestimmten Verarbeitungszweck einholen. -- Ist die Verarbeitung personenbezogener Daten zur Erfüllung eines Vertrags, dessen Vertragspartei die betroffene Person ist, erforderlich, wie dies beispielsweise bei Verarbeitungsvorgängen der Fall ist, die für eine Lieferung von Waren oder die Erbringung einer sonstigen Leistung oder Gegenleistung notwendig sind, so beruht die Verarbeitung auf Art. 6 I lit. b DSGVO. -- Unterliegt unser Unternehmen einer rechtlichen Verpflichtung, durch welche eine Verarbeitung von personenbezogenen Daten erforderlich wird, wie beispielsweise zur Erfüllung steuerlicher Pflichten, so basiert die Verarbeitung auf Art. 6 I lit. c DSGVO. -- In seltenen Fällen könnte die Verarbeitung von personenbezogenen Daten erforderlich werden, um lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person zu schützen. Dann würde die Verarbeitung auf Art. 6 I lit. d DSGVO beruhen. -- Letztlich könnten Verarbeitungsvorgänge auf Art. 6 I lit. f DSGVO beruhen. Auf dieser Rechtsgrundlage basieren Verarbeitungsvorgänge, die von keiner der vorgenannten Rechtsgrundlagen erfasst werden, wenn die Verarbeitung zur Wahrung eines berechtigten Interesses unseres Unternehmens oder eines Dritten erforderlich ist. -- Falls besondere Kategorien personenbezogener Daten gemäß Artikel 9 DSGVO verarbeitet werden, erfolgt die Verarbeitung ebenfalls auf Grundlage Ihrer ausdrücklichen Einwilligung gemäß Artikel 9 Absatz 2 Buchstabe a DSGVO. - -### 5. Datensicherheit - -Wir verwenden umfangreiche technische und organisatorische Maßnahmen zum Schutz Ihrer Daten: - -- **Verschlüsselung**: AES-256 für gespeicherte Daten, TLS 1.2/1.3 für Datenübertragung -- **Zugriffskontrolle**: Multi-Faktor-Authentifizierung, rollenbasierte Berechtigungen -- **Backup-Strategie**: 3-2-1-Backup-Strategie mit täglichen verschlüsselten Backups -- **Zertifizierungen**: Unsere Dienstleister sind SOC 2 Type II, ISO 27001 und DSGVO-konform - -### 6. Dauer der Speicherung - -Das Kriterium für die Dauer der Speicherung von personenbezogenen Daten ist die jeweilige gesetzliche Aufbewahrungsfrist. Nach Ablauf der Frist werden die entsprechenden Daten routinemäßig gelöscht, sofern sie nicht mehr zur Vertragserfüllung erforderlich sind. - -**Speicher- und Löschfristen**: -- **Inhaltsdaten** (Aufnahmen, Transkripte, Memories): Solange das Nutzerkonto besteht; unverzügliche Löschung bei Nutzeranfrage -- **Account-Daten**: Löschung innerhalb von 30 Tagen nach Löschanfrage -- **Technische Protokolldaten**: Maximal 90 Tage -- **Produktanalysedaten** (PostHog): Maximal 12 Monate -- **Backups**: Maximal 30 Tage Vorhaltezeit -- **KI-Verarbeitungscache** (Google/Azure): Automatische Löschung nach maximal 30 Tagen - -**Sonderregelungen für Organisationskunden**: Individuelle automatische Löschfristen können im Rahmen eines Auftragsverarbeitungsvertrags (AVV) vereinbart werden. - -### 7. Gesetzliche oder vertragliche Vorschriften zur Bereitstellung der personenbezogenen Daten - -Wir klären Sie darüber auf, dass die Bereitstellung personenbezogener Daten zum Teil gesetzlich vorgeschrieben ist (z.B. Steuervorschriften) oder sich auch aus vertraglichen Regelungen (z.B. Angaben zum Vertragspartner) ergeben kann. Mitunter kann es zu einem Vertragsschluss erforderlich sein, dass eine betroffene Person uns personenbezogene Daten zur Verfügung stellt, die in der Folge durch uns verarbeitet werden müssen. Eine Nichtbereitstellung der personenbezogenen Daten hätte zur Folge, dass der Vertrag mit dem Betroffenen nicht geschlossen werden könnte. - -### 8. Service Provider - -Wir beschäftigen Drittunternehmen und Einzelpersonen, um unsere App zu unterstützen („Service Provider"), Dienstleistungen in unserem Auftrag zu erbringen, servicebezogene Dienstleistungen durchzuführen oder uns bei der Analyse der Nutzung unserer App zu unterstützen. - -Diese Dritten haben nur Zugriff auf Ihre personenbezogenen Daten, um diese Aufgaben in unserem Auftrag zu erledigen, und sind verpflichtet, diese nicht für andere Zwecke zu verwenden oder offenzulegen. - -### 9. Nutzung von Cloud-Diensten und Datenverarbeitung - -Wir nutzen ausgewählte Cloud-Dienste, um unsere Datenverarbeitung effizient und sicher zu gestalten. Alle Dienstleister sind DSGVO-konform und fungieren als Auftragsverarbeiter gemäß Art. 28 DSGVO. - -#### 9.1. Supabase (Backend & Datenbank) -**Serverstandort**: Frankfurt, Deutschland -**Zweck**: Speicherung aller Inhaltsdaten, Account-Daten und Authentifizierung -**Compliance**: SOC 2 Type II zertifiziert, DSGVO-konform -**Hinweis**: Supabase hat seinen Sitz in den USA. Ein Zugriff aus den USA kann in eng begrenzten Fällen (Support, Wartung) erfolgen. Dies ist durch Standardvertragsklauseln (SCCs) abgesichert. - -#### 9.2. Microsoft Azure -**Serverstandort**: Schweden, EU -**Zweck**: Sprachtranskription (Azure Speech) und KI-Analyse (Azure OpenAI) -**Compliance**: ISO 27001, SOC 1/2/3, DSGVO-konform -**Garantie**: Keine Nutzung Ihrer Daten für Modelltraining; Löschung nach max. 30 Tagen - -#### 9.3. Google Cloud -**Serverstandorte**: -- Frankfurt, Deutschland (Dateikonvertierung) -- Belgien, EU (Google Gemini KI-Analyse) -**Compliance**: ISO 27001, SOC 1/2/3, DSGVO-konform -**Garantie**: Keine Nutzung Ihrer Daten für Modelltraining; Löschung nach max. 30 Tagen - -#### 9.4. PostHog (Produktanalyse) -**Serverstandort**: Frankfurt, Deutschland (EU-Hosting) -**Zweck**: Anonymisierte Nutzungsanalyse zur Verbesserung der App -**Compliance**: SOC 2 Type II, DSGVO-konform -**Besonderheit**: Für Organisationskunden vollständig deaktivierbar - -#### 9.5. Firebase-Dienste - -Firebase (Google Ireland Limited) wird für folgende Funktionen genutzt: -- Firebase Analytics: zur Analyse des Nutzerverhaltens -- Firebase Cloud Messaging: zum Versenden von Push-Benachrichtigungen -- Firebase Realtime Database: zur Speicherung und Synchronisierung von Daten -- Firebase Storage: zur Sicherung und Speicherung von Medien -- Firebase Crashlytics: zur Erkennung und Analyse von App-Fehlern - -Alle Firebase-Dienste sind DSGVO-konform und die Datenverarbeitung erfolgt innerhalb der EU. - -### 10. Transparenzhinweis zu internationalen Datentransfers - -Obwohl Ihre Daten physisch in der EU gespeichert und verarbeitet werden, möchten wir Sie transparent über mögliche internationale Aspekte informieren: - -- **US-Dienstleister**: Einige unserer Auftragsverarbeiter (Supabase, PostHog) haben ihren Hauptsitz in den USA -- **Schutzmaßnahmen**: Alle Datentransfers sind durch EU-Standardvertragsklauseln (SCCs) und zusätzliche technische Maßnahmen abgesichert -- **Restrisiko**: Ein theoretisches Zugriff durch US-Behörden (z.B. via CLOUD Act) kann rechtlich nicht vollständig ausgeschlossen werden -- **Ihre Kontrolle**: Sie können jederzeit die Löschung Ihrer Daten verlangen - -### 11. Nutzung von Google Analytics - -Google Analytics ist ein Webanalysedienst, der von Google angeboten wird und den Website-Traffic nachverfolgt und berichtet. Google nutzt die gesammelten Daten, um die Nutzung unserer App zu überwachen und zu analysieren. Diese Daten werden mit anderen Google-Diensten geteilt. Google kann die gesammelten Daten nutzen, um die Anzeigen in seinem eigenen Werbenetzwerk zu kontextualisieren und zu personalisieren. - -Für weitere Informationen zu den Datenschutzpraktiken von Google besuchen Sie bitte die Google Datenschutz- und Nutzungsbedingungen-Webseite: [Google Privacy & Terms](https://policies.google.com/privacy) - -Wir empfehlen Ihnen außerdem, die Datenschutzbestimmungen von Google zum Schutz Ihrer Daten zu überprüfen: [Google Analytics Safeguarding Your Data](https://support.google.com/analytics/answer/6004245). - -### 12. Bestehen einer automatisierten Entscheidungsfindung - -Als verantwortungsbewusstes Unternehmen verzichten wir auf eine automatische Entscheidungsfindung oder ein Profiling. - -### 13. Rechte der betroffenen Person - -Sie haben das Recht: - -- auf Auskunft über die bei uns über Sie gespeicherten personenbezogenen Daten (Artikel 15 DSGVO), -- auf Berichtigung unrichtiger Daten (Artikel 16 DSGVO), -- auf Löschung (Artikel 17 DSGVO), -- auf Einschränkung der Verarbeitung (Artikel 18 DSGVO), -- auf Datenübertragbarkeit (Artikel 20 DSGVO), -- auf Widerspruch gegen die Verarbeitung (Artikel 21 DSGVO), -- Ihre Einwilligung jederzeit zu widerrufen, ohne dass die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung berührt wird (Artikel 7 Absatz 3 DSGVO), -- sich bei einer Aufsichtsbehörde zu beschweren (Artikel 77 DSGVO). - -**Widerruf der Einwilligung**: - -Sie können Ihre Einwilligung zur Verarbeitung Ihrer personenbezogenen Daten jederzeit widerrufen. Der Widerruf kann schriftlich oder per E-Mail an die oben genannten Kontaktdaten erfolgen. Ihre Daten werden nach dem Widerruf unverzüglich gelöscht, sofern keine gesetzlichen Aufbewahrungspflichten entgegenstehen. - -### 14. Besondere Hinweise für Organisationskunden - -Für Unternehmens- und Organisationskunden bieten wir maßgeschneiderte Datenschutzlösungen: - -- **Individuelle Auftragsverarbeitungsverträge (AVV)** gemäß Art. 28 DSGVO -- **Automatische Löschfristen** nach Ihren Compliance-Anforderungen -- **Deaktivierung von Analysediensten** (z.B. PostHog) auf Wunsch -- **Angepasste Datenverarbeitungsprozesse** nach Ihren Vorgaben - -Kontaktieren Sie uns unter [kontakt@memoro.ai](mailto:kontakt@memoro.ai) für weitere Informationen. - -### 15. Änderungen der Datenschutzerklärung - -Wir behalten uns vor, diese Datenschutzerklärung bei Bedarf zu aktualisieren. Über wesentliche Änderungen informieren wir Sie durch einen Hinweis in der App. - -Stand: 15.12.2024 \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/sprachaufnahme-app-business.mdx b/apps/memoro/apps/landing/src/content/pages/de/sprachaufnahme-app-business.mdx deleted file mode 100644 index f81a5657d..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/sprachaufnahme-app-business.mdx +++ /dev/null @@ -1,576 +0,0 @@ ---- -title: "Sprachaufnahme App für Business 2025 - Professionelle Audio-Dokumentation | Memoro" -description: "Die Business Sprachaufnahme App für professionelle Dokumentation ► Offline-Modus ✓ Automatische Transkription ✓ DSGVO-konform ✓ Für Außendienst & Teams" -keywords: ["sprachaufnahme app business", "business sprachaufnahme", "diktiergerät app unternehmen", "audio aufnahme business", "sprachmemo business", "voice recording app business", "geschäftliche sprachaufnahme", "mobile dokumentation"] -lang: de -type: product -lastUpdated: 2025-01-09 -sections: - hero: - title: "Sprachaufnahme App für Business - Immer & überall professionell dokumentieren" - subtitle: "Von Außendienst bis Vorstand - Erfassen Sie wichtige Gespräche und Ideen professionell" - cta: "App kostenlos testen" - features: - title: "Warum Memoro die führende Business Sprachaufnahme App ist" - items: ["Offline-Aufnahme", "Automatische Transkription", "Ende-zu-Ende Verschlüsselung", "Team-Integration"] -ogImage: "/images/og/sprachaufnahme-app-business.png" -canonical: "https://memoro.ai/de/sprachaufnahme-app-business" -robots: "index, follow" -priority: 0.9 -changefreq: "monthly" ---- - -import Button from '../../../components/atoms/Button.astro'; -import { Icon } from 'astro-icon/components'; -import FAQ from '../../../components/FAQ.astro'; -import ComparisonTable from '../../../components/ComparisonTable.astro'; - -
    -
    -

    - Business Sprachaufnahme App - Professionell dokumentieren, überall -

    -

    - Erfassen Sie Kundentermine, Ideen und wichtige Gespräche professionell. - Mit Offline-Modus, automatischer Transkription und höchster Sicherheit. -

    -
    - - -
    -
    -
    - - Funktioniert offline -
    -
    - - Verschlüsselt & sicher -
    -
    - - Sofortige Transkription -
    -
    -
    -
    - -## Das Problem mit herkömmlichen Sprachaufnahme Apps - -**Unprofessionell, unsicher, unbrauchbar:** Die meisten Sprachaufnahme Apps sind für private Notizen gedacht. Im Business-Kontext fehlen wichtige Funktionen wie Verschlüsselung, Transkription und Team-Integration. - -### Die 6 größten Probleme herkömmlicher Voice-Apps: - -
    -
    -

    🔓 Keine Verschlüsselung

    -

    Sensible Business-Inhalte ungeschützt gespeichert

    -
    -
    -

    📱 Nur Audio-Dateien

    -

    Keine automatische Verschriftlichung - Stunden manueller Arbeit

    -
    -
    -

    👥 Keine Team-Features

    -

    Aufnahmen bleiben auf einem Gerät isoliert

    -
    -
    -

    🌐 Internet-abhängig

    -

    Funktioniert nicht im Außendienst ohne Verbindung

    -
    -
    -

    🔍 Nicht durchsuchbar

    -

    Wichtige Inhalte verschwinden in Audio-Archiven

    -
    -
    -

    ⚖️ DSGVO-Probleme

    -

    Unklarer Datenschutz bei US-Anbietern

    -
    -
    - -## Die Memoro Business Sprachaufnahme App - -### Entwickelt für professionelle Ansprüche - -
    -
    -
    -
    - -
    -

    Aufnehmen

    -

    HD-Qualität auch offline

    -
    -
    -
    - -
    -

    Verschlüsseln

    -

    Ende-zu-Ende sicher

    -
    -
    -
    - -
    -

    Transkribieren

    -

    KI erstellt Text

    -
    -
    -
    - -
    -

    Teilen

    -

    Team & CRM Integration

    -
    -
    -
    - -### Business Features im Überblick - -#### 📱 **Offline-First Design** -- Aufnahmen funktionieren ohne Internet -- Automatische Synchronisation bei Verbindung -- Keine verpassten Gespräche mehr -- Perfekt für Außendienst & Reisen - -#### 🔐 **Enterprise-Grade Security** -- Ende-zu-Ende Verschlüsselung (AES-256) -- Deutsche Server (Frankfurt) -- Zero-Knowledge Architektur -- DSGVO-konform by Design - -#### 🤖 **KI-Powered Transkription** -- 98% Genauigkeit bei deutschen Inhalten -- Sprecher-Erkennung für Meetings -- Automatische Zusammenfassungen -- Action Items & Keywords - -#### 👥 **Team-Collaboration** -- Aufnahmen mit Team teilen -- Kommentare & Notizen hinzufügen -- Berechtigungsmanagement -- Integration in Workflows - -## Business Sprachaufnahme Apps im Vergleich - - - -## Anwendungsbereiche für Business Sprachaufnahmen - -### 🚗 **Außendienst & Vertrieb** - -**Kundentermine professionell dokumentieren:** -- Beratungsgespräche vollständig erfassen -- Follow-up Actions sofort notieren -- Kundenfeedback strukturiert sammeln -- Fahrtzeiten produktiv nutzen - -*"Als Versicherungsvertreter bin ich täglich beim Kunden. Mit Memoro kann ich alle Gespräche diskret aufnehmen und habe später die perfekte Grundlage für Angebote."* - **Peter S., Außendienst-Leiter** - -#### Typischer Workflow: -``` -08:00 - Fahrt zum Kunden - → Tagesplanung per Sprachmemo - -09:30 - Kundentermin - → Gespräch diskret aufnehmen - -10:30 - Fahrt zum nächsten Termin - → Transkript bereits verfügbar - → Follow-ups per Sprache diktieren - -11:00 - Zurück im Büro - → CRM automatisch aktualisiert -``` - -### 💼 **Beratung & Consulting** - -**Beratungsmeetings optimal nutzen:** -- Kein Mitschreiben während wichtiger Diskussionen -- Vollständige Dokumentation für Compliance -- Präzise Grundlage für Rechnungsstellung -- Wissensmanagement für das Team - -#### Case Study: Unternehmensberatung -**Situation:** 15 Senior Consultants, 200+ Kundentermine/Monat -**Challenge:** Protokolle für Haftung & Abrechnung notwendig -**Lösung:** Business Sprachaufnahme mit automatischer Transkription - -**Vorher:** -- 30 Min Nachbereitung pro 60 Min Meeting -- Unvollständige Protokolle -- 50h/Woche für Administration - -**Mit Memoro:** -- 5 Min Review pro Meeting -- Vollständige, durchsuchbare Protokolle -- 12h/Woche für Administration - -**ROI:** 76% Zeitersparnis = 38h/Woche × 75€ = 2.850€/Woche eingespart - -### 🏗️ **Projekt & Bauleitung** - -**Baufortschritte und Mängel dokumentieren:** -- Begehungen mit Sprachmemos -- Mängellisten per Audio erstellen -- Subunternehmer-Briefings aufnehmen -- Sicherheitshinweise dokumentieren - -### 🎓 **Training & Qualitätssicherung** - -**Schulungen und Reviews optimieren:** -- Kundengespräche für Training nutzen -- Mitarbeiterfeedback strukturiert sammeln -- Best Practices als Audio-Bibliothek -- Qualitätskontrollen dokumentieren - -### 📈 **Management & Führung** - -**Executive Workflows digitalisieren:** -- Strategiediskussionen vollständig erfassen -- Board Meeting Vorbereitung -- Delegations-Briefings per Audio -- Spontane Ideen sofort festhalten - -## Einzigartige Business-Features - -### 🔐 **Enterprise Security Standards** - -**Bank-Grade Verschlüsselung:** -- AES-256 Verschlüsselung in Echtzeit -- Zero-Knowledge Server-Architektur -- Lokale Schlüssel-Generierung -- Automatische Löschung nach X Tagen - -**Compliance & Audit:** -- ISO 27001 zertifizierte Infrastruktur -- DSGVO-Auftragsdatenverarbeitung -- Audit-Logs für alle Aktionen -- Betriebsratkonform einsetzbar - -### 📊 **Business Intelligence** - -**Insights aus Ihren Aufnahmen:** -- Häufigste Kundenanfragen identifizieren -- Gesprächsdauer und -qualität analysieren -- Keyword-Trends erkennen -- Team-Performance bewerten - -### 🔗 **Nahtlose Integration** - -**In Ihre bestehenden Tools:** - -#### CRM-Systeme -- **Salesforce:** Aufnahmen als Aktivitäten -- **HubSpot:** Automatische Kontakt-Zuordnung -- **Pipedrive:** Deals mit Audio-Notizen -- **Microsoft Dynamics:** Vollständige Integration - -#### Projektmanagement -- **Asana:** Tasks aus Action Items -- **Monday.com:** Projekte mit Audio-Updates -- **Notion:** Knowledge Base mit Transkripten - -#### Team-Kommunikation -- **Slack:** Audio-Summaries in Channels -- **Microsoft Teams:** Integration in Chats -- **Email:** Automatische Versendung - -## Mobile Apps für alle Plattformen - -### 📱 **iOS App Features** -- Native iOS Integration -- Siri Shortcuts für schnelle Aufnahmen -- Apple Watch App für diskrete Bedienung -- CarPlay Integration für Vertrieb -- Background-Aufnahme möglich - -### 🤖 **Android App Features** -- Material Design 3.0 -- Google Assistant Integration -- Android Auto Unterstützung -- Widget für Homescreen -- Tasker/Automation Support - -### 💻 **Desktop & Web** -- Native Windows/Mac Apps -- Progressive Web App (PWA) -- Browser-Extension für schnelle Aufnahmen -- Synchronisation zwischen allen Geräten - -## Preise für Business-Kunden - -
    -
    -

    Einzelnutzer

    -

    €19/Monat

    -

    Pro Nutzer

    -
      -
    • ✅ Unlimited Aufnahmen
    • -
    • ✅ Automatische Transkription
    • -
    • ✅ Ende-zu-Ende Verschlüsselung
    • -
    • ✅ Mobile + Desktop Apps
    • -
    • ✅ Basis CRM-Integration
    • -
    • ✅ 1 Jahr Speicherung
    • -
    -
    -
    -
    - Für Teams -
    -

    Team

    -

    €49/Monat

    -

    Bis 10 Nutzer

    -
      -
    • ✅ Alles aus Einzelnutzer
    • -
    • ✅ Team-Sharing & Kommentare
    • -
    • ✅ Erweiterte CRM-Integration
    • -
    • ✅ Admin Dashboard
    • -
    • ✅ Benutzer-Management
    • -
    • ✅ Priority Support
    • -
    • ✅ 3 Jahre Speicherung
    • -
    -
    -
    -

    Enterprise

    -

    €199/Monat

    -

    Unlimited Nutzer

    -
      -
    • ✅ Alles aus Team
    • -
    • ✅ White-Label Branding
    • -
    • ✅ Custom Integrations
    • -
    • ✅ Dedicated Support
    • -
    • ✅ SLA-Garantien
    • -
    • ✅ On-Premise Option
    • -
    • ✅ Unlimited Speicherung
    • -
    -
    -
    - -## ROI-Berechnung für Ihr Unternehmen - -
    -

    Beispiel: 20-köpfiges Vertriebsteam

    - -
    -
    -

    Kosten ohne Memoro (pro Monat)

    -
      -
    • • 20 Mitarbeiter × 25 Kundentermine
    • -
    • • 30 Min Nachbereitung pro Termin
    • -
    • • 20 × 25 × 0,5h = 250h Nachbearbeitung
    • -
    • • 250h × 35€ = 8.750€/Monat
    • -
    -
    -
    -

    Kosten mit Memoro (pro Monat)

    -
      -
    • • Team-Lizenz: 199€
    • -
    • • 5 Min Review pro Termin
    • -
    • • 20 × 25 × 0,08h = 40h Review
    • -
    • • 40h × 35€ + 199€ = 1.599€/Monat
    • -
    -
    -
    - -
    -

    Ersparnis: 7.151€/Monat (82%)

    -

    ROI bereits ab dem ersten Monat: 3.593%

    -
    -
    - -## Erfolgsgeschichten unserer Business-Kunden - -### Case Study: Immobilien-Unternehmen - -**Kunde:** Immobilienmakler mit 25 Standorten -**Challenge:** 800 Besichtigungen/Monat, inkonsistente Dokumentation - -**Vorher:** -- Handschriftliche Notizen bei Besichtigungen -- 50% der Interessenten-Details gingen verloren -- Nachfass-Termine wurden vergessen -- 15 Min Nachbereitung pro Besichtigung - -**Mit Business Sprachaufnahme:** -- Diskrete Audio-Aufnahme bei Besichtigung -- Interessenten-Details automatisch im CRM -- Follow-up Erinnerungen automatisch -- 2 Min Review pro Besichtigung - -**Ergebnisse nach 6 Monaten:** -- **87% Zeitersparnis** bei Dokumentation -- **34% höhere Abschlussrate** durch besseres Follow-up -- **2,3 Mio€ zusätzlicher Umsatz** durch weniger verlorene Leads - -*"Memoro hat unser Business transformiert. Wir verlieren keinen Interessenten mehr und unsere Makler können sich voll auf die Beratung konzentrieren."* - **Julia K., Geschäftsführerin** - -### Case Study: Consulting-Boutique - -**Situation:** 12 Senior Berater, 150 Kundentermine/Monat -**Problem:** Dokumentation für Haftung & Abrechnung aufwendig - -**Impact der Business Sprachaufnahme:** -- **Vorher:** 45 Min Nachbereitung pro Stunde Meeting -- **Nachher:** 5 Min Review + automatische Dokumentation -- **Zeitersparnis:** 89% weniger Administrationsaufwand -- **Qualitätsverbesserung:** Vollständige, rechtssichere Protokolle - -**Finanzieller Impact:** -- 40h/Woche weniger Administration -- 40h × 120€ Beraterstundensatz = 4.800€/Woche -- **Jährliche Ersparnis: 249.600€** - -## Häufige Fragen zur Business Sprachaufnahme - - - -## Jetzt Business Sprachaufnahme starten - -
    -

    Revolutionieren Sie Ihre Business-Dokumentation

    -

    - Starten Sie noch heute und erleben Sie, wie professionelle Sprachaufnahme - Ihre Produktivität und Kundenkommunikation verbessert. -

    -
    - - -
    -

    - Keine Kreditkarte • Sofort einsatzbereit • Für alle Team-Größen -

    -
    - -## Apps Download - -
    -
    - -

    iOS App

    -

    Für iPhone & iPad

    - -
    -
    - -

    Android App

    -

    Für Android Geräte

    - -
    -
    - ---- - -*Letzte Aktualisierung: Januar 2025 | Alle Preise zzgl. MwSt.* \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/team.mdx b/apps/memoro/apps/landing/src/content/pages/de/team.mdx deleted file mode 100644 index 6d9f5b17e..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/team.mdx +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: "Team | Memoro" -description: "Lernen Sie das Team hinter Memoro kennen" -lang: "de" -type: "page" -lastUpdated: 2024-02-22 -sections: - hero: - title: "Team" - subtitle: "Lernen Sie das Team hinter Memoro kennen" - categories: - kernteam: - title: "Kernteam" - description: "Die treibende Kraft hinter Memoro - unser engagiertes Team arbeitet täglich daran, Ihre Gespräche noch besser zu dokumentieren." - freelance: - title: "Freelance" - description: "Externe Experten, die mit ihrem Fachwissen und ihrer Kreativität wichtige Beiträge zu unserem Erfolg leisten." - mentoren: - title: "Mentoren" - description: "Erfahrene Berater, die uns mit wertvollen Einblicken und strategischer Führung unterstützen." - unterstuetzer: - title: "Unterstützer" - description: "Partner und Förderer, die an unsere Vision glauben und uns auf unserem Weg begleiten." - alumni: - title: "Alumni" - description: "Ehemalige Teammitglieder, die wichtige Grundsteine für Memoro gelegt haben." - faq: - title: "Häufig gestellte Fragen zum Team" - items: - - question: "Wie kann ich Teil des Teams werden?" - answer: "Wir sind immer auf der Suche nach talentierten Menschen! Aktuelle Stellenangebote finden Sie auf unserer Karriereseite oder schicken Sie uns eine Initiative Bewerbung an jobs@memoro.app" - - question: "Bietet ihr Praktika oder Werkstudentenstellen an?" - answer: "Ja, wir bieten regelmäßig Praktika und Werkstudentenstellen in verschiedenen Bereichen an. Perfekt für Studierende, die praktische Erfahrung sammeln möchten." - - question: "Arbeitet ihr remote oder vor Ort?" - answer: "Wir sind ein hybrides Team. Während unser Hauptbüro in Berlin ist, arbeiten einige Teammitglieder auch remote. Wir legen Wert auf flexible Arbeitsmodelle." - - question: "Was macht die Arbeit bei Memoro besonders?" - answer: "Bei uns arbeiten Sie an innovativen Lösungen für digitales Lernen. Wir bieten eine offene Unternehmenskultur, regelmäßige Team-Events und spannende technische Herausforderungen." ---- - -import TeamCard from "../../../components/TeamCard.astro"; -import FAQSection from "../../../components/FAQSection.astro"; - -export const TeamContent = ({ team, lang }) => { - // Kategorien definieren - const categories = frontmatter.sections.categories; - -// Team nach Kategorien gruppieren -const teamByCategory = Object.keys(categories).reduce((acc, category) => { -acc[category] = team.filter((member) => member.data.category === category); -return acc; -}, {}); - -return ( - -<> -
    -

    -{frontmatter.sections.hero.title} -

    -

    -{frontmatter.sections.hero.subtitle} -

    -
    - - {Object.entries(teamByCategory).map( - ([category, members]) => - members.length > 0 && ( -
    -

    - {categories[category]} -

    -
    - {members.map((member) => ( - - ))} -
    -
    - ) - )} - - - - -); -}; - -{" "} diff --git a/apps/memoro/apps/landing/src/content/pages/de/terms.mdx b/apps/memoro/apps/landing/src/content/pages/de/terms.mdx deleted file mode 100644 index 6756f0a26..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/terms.mdx +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: "AGB | Memoro" -description: "Allgemeine Geschäftsbedingungen der Memoro GmbH" -lang: "de" -type: "legal" -lastUpdated: 2024-12-11 -sections: - hero: - title: "Allgemeine Geschäftsbedingungen" - subtitle: "Nutzungsbedingungen für die Memoro App und Website" ---- - -## Allgemeine Geschäftsbedingungen der App Memoro - -### 1. Geltungsbereich - -Die vorliegenden Allgemeinen Geschäftsbedingungen (nachfolgend "AGB") gelten für die Nutzung der App "Memoro" und die Inanspruchnahme aller über die App angebotenen Dienste. - -### 2. Registrierung und Account - -Um die Dienste von Memoro nutzen zu können, muss sich der Nutzer in der App registrieren und einen persönlichen Account erstellen. Bei der Registrierung müssen wahrheitsgemäße und aktuelle Informationen angegeben werden. - -### 3. Dienstleistungen von Memoro - -Memoro bietet Dienstleistungen im Bereich der Audiotranskription und Zusammenfassungen an. Die Nutzer können ihre Audiodateien über die App hochladen und die entsprechenden Transkriptionen und/oder Zusammenfassungen anfordern. - -### 4. Nutzerverantwortung - -Die Nutzer sind für die verantwortungsvolle Nutzung der App und der Dienste verantwortlich. Dies schließt das Hochladen von illegalen oder rechtlich geschützten Inhalten ohne die erforderliche Berechtigung ein. Jeder Nutzer trägt die volle Verantwortung für die Inhalte, die er in der App hochlädt. - -### 5. Urheberrecht - -Die Urheberrechte an den hochgeladenen Inhalten verbleiben beim Nutzer. Memoro beansprucht kein Eigentum an den übermittelten Inhalten, benötigt jedoch das Recht, diese Inhalte für die Erbringung der Dienstleistungen zu verwenden. - -### 6. Haftungsausschluss - -Memoro haftet nicht für Fehler oder Ungenauigkeiten in den Transkriptionen oder Zusammenfassungen. Die Dienstleistungen werden "wie sie sind" und ohne jegliche Garantien angeboten. - -### 7. Datenschutz - -Memoro verpflichtet sich, die Privatsphäre der Nutzer zu schützen. Details zum Datenschutz sind in unserer Datenschutzerklärung beschrieben. - -### 8. Preise und Zahlungsbedingungen - -Die Preise für die Dienstleistungen von Memoro sind in der App angegeben. Alle Zahlungen sind vor Inanspruchnahme der Dienstleistungen fällig. Zahlungen erfolgen über die in der App angebotenen Zahlungsmethoden. - -### 9. Kündigung - -Memoro behält sich das Recht vor, Accounts bei Verstößen gegen diese AGB oder bei Missbrauch der Dienste zu sperren oder zu löschen. Nutzer können ihren Account jederzeit über die App löschen. - -### 10. Änderungen der AGB - -Memoro kann diese AGB von Zeit zu Zeit ändern. Die Nutzer werden über wesentliche Änderungen in Kenntnis gesetzt. Die fortgesetzte Nutzung der App nach solchen Änderungen gilt als Zustimmung zu den überarbeiteten Bedingungen. - -### 11. Anwendbares Recht und Gerichtsstand - -Diese AGB unterliegen dem Deutschen Recht. Gerichtsstand ist Freiburg, Baden-Württemberg. - ---- - -## Allgemeine Geschäftsbedingungen der Memoro Website - -### 1. Geltungsbereich - -Diese Allgemeinen Geschäftsbedingungen („AGB") gelten für den Geschäftsbereich der Memoro GmbH, Münzgasse 19, 78462 Konstanz (nachfolgend „Firma"). Die Firma besitzt und betreibt die Plattform www.memoro.ai und erbringt darauf entgeltliche und unentgeltliche Dienstleistungen im Zusammenhang mit der Gründung von Firmen, dem Erstellen von Verträgen, der Durchführung von Handelsregisteränderungen sowie der Durchführung von Kursen. Zudem bietet die Firma Beratungsdienstleistungen an und erteilt Lizenzrechte. Des Weiteren verkauft die Firma Produkte im obengenannten Bereich. Diese AGB gelten für die obengenannten Bereiche sowie die weiteren Dienstleistungen, welche die Firma direkt und indirekt gegenüber dem Kunden erbringt. - -### 2. Vertragsabschluss - -Der Vertragsabschluss kommt durch die Akzeptanz der Offerte der Firma, betreffend den Bezug von Dienstleistungen, Produkten oder Lizenzen durch den Kunden zustande. Der Vertrag kommt des Weiteren zustande, wenn der Kunde die von der Firma angebotenen Dienstleistungen in Anspruch nimmt oder Produkte der Firma bezieht oder benutzt (Lizenz). - -### 3. Preise - -Vorbehaltlich anderweitiger Offerten verstehen sich alle Preise in Schweizer Franken (CHF). Alle Preise verstehen sich exklusive allfällig anwendbarer Mehrwertsteuer (MWST.). Die Preise verstehen sich exklusive weiterer allfällig anwendbarer Steuern. Die Firma behält sich vor, die Preise jederzeit zu ändern. Es gelten die zum Zeitpunkt des Vertragsabschlusses gültigen Preise auf der Website www.memoro.ai oder gemäß der separaten Preisliste der Firma. Für den Kunden gelten die zum Zeitpunkt des Vertragsabschlusses gültigen Preise. - -### 4. Bezahlung - -Der Kunde ist verpflichtet, den in Rechnung gestellten Betrag innert 30 Tagen ab Rechnungsdatum zu bezahlen. Es sei denn, er habe den Betrag bereits beim Bestellvorgang via Kreditkarte, Paypal oder anderen Zahlungssystemen beglichen. Wird die Rechnung nicht binnen vorgenannter Zahlungsfrist beglichen, wird der Kunde abgemahnt. Begleicht der Kunde die Rechnung nicht binnen der angesetzten Mahnfrist fällt er automatisch in Verzug. Ab Zeitpunkt des Verzuges schuldet der Kunde Verzugszinsen in der Höhe von 5%. Die Firma behält sich vor, jederzeit ohne Angabe von Gründen Vorauskasse zu verlangen. Verrechnung des in Rechnung gestellten Betrages mit einer allfälligen Forderung des Kunden gegen die Firma ist nicht zulässig. Der Firma steht das Recht zu bei Zahlungsverzug die Dienstleistungserbringung, die Lieferung des Produkts oder die Gewährung der Lizenz zu verweigern. - -### 5. Pflichten der Firma - -#### 5.1. Dienstleistungserbringung - -Vorbehaltlich anderslautender Vereinbarung, erfüllt die Firma ihre Verpflichtung durch Erbringung der vereinbarten Dienstleistung. Die Dienstleistung beinhaltet die Leistungen, welche zum Zeitpunkt des Vertragsschlusses online publiziert sind oder waren. Ein Großteil der Dienstleistungen der Firma werden online erbracht. Für alle weiteren Dienstleistungen gilt der Sitz der Firma als Erfüllungsort, es sei denn es werden anderweitige Bestimmungen getroffen. - -#### 5.2. Hilfspersonen - -Die Parteien haben das ausdrückliche Recht, zur Erledigung ihrer vertragsgemäßen Pflichten Hilfspersonen beizuziehen. Sie haben sicherzustellen, dass der Beizug der Hilfsperson unter Einhaltung aller zwingenden gesetzlichen Bestimmungen und allfälliger Gesamtarbeitsverträge erfolgt. - -### 6. Lizenz - -#### 6.1. Nutzung - -Die Firma gewährt dem Kunden das Recht, die Dokumente der entsprechenden Vertragsboxen zu nutzen. Diese Nutzungsrechte sind nicht-exklusive, unübertragbar und auf die Nutzung durch den Kunden beschränkt. Die einzelnen Dokumente dienen als Vorlagen und dürfen vom Kunden lediglich als Vorlagen und für eigene Zwecke genutzt werden. Jegliche Weitergabe an Dritte sowie anderweitige Nutzung, kommerzieller oder anderer Natur ist untersagt. - -#### 6.2. Formatierung - -Sind die Dokumente in einem Format erstellt, welche die Nutzungsrechte des Kunden beschränken so entspricht dies dem Willen der Firma und eine Umformatierung ist nicht zulässig. - -#### 6.3. Befristung - -Der Inhalt steht dem Kunden für die vereinbarte Dauer zur Verfügung. Nach Ablauf dieser Frist hat der Kunde keinen Anspruch mehr auf den Inhalt der Vertragsboxen. - -### 7. Pflichten des Kunden - -#### 7.1. Ausübung der Nutzungsrechte - -Der Kunde ist verpflichtet, die Nutzungsrechte lediglich im gewährten Umfang auszuüben. Der Kunde ist für die sichere Aufbewahrung seiner Zugangsdaten und Passwörter vollumfänglich verantwortlich. Für den Inhalt der erfassten Daten und Informationen ist der Kunde selbst verantwortlich. Der Kunde ist verpflichtet sämtliche Vorkehrungen welche zur Erbringung der Dienstleistung durch die Firma erforderlich sind umgehend vorzunehmen. Der Kunde hat die Vorkehrungen am vereinbarten Ort zur vereinbarten Zeit und im vereinbarten Maß vorzunehmen. Je nach Umständen gehört dazu das Erbringen geeigneter Informationen und Unterlagen an die Firma. Der Kunde bestätigt mit dem Akzeptieren der vorliegenden AGB zudem, dass er über eine unbeschränkte Handlungsfähigkeit verfügt und volljährig ist. Der Kunde erklärt mit der Registrierung ausdrücklich, dass sämtliche gemachten Angaben der Wahrheit entsprechen, aktuell sind und mit den Rechten Dritter, den guten Sitten und dem Gesetz in Übereinstimmung sind. - -#### 7.2. Mitwirkungspflichten - -Der Kunde ist verpflichtet sämtliche Vorkehrungen welche zur Erbringung der Dienstleistung durch die Firma erforderlich sind umgehend vorzunehmen. Der Kunde hat die Vorkehrungen am vereinbarten Ort zur vereinbarten Zeit und im vereinbarten Maß vorzunehmen. Je nach Umständen gehört dazu das Erbringen geeigneter Informationen und Unterlagen für die Firma. Des Weiteren ist der Kunde zur umfassenden und prompten Mitwirkung verpflichtet. \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/testimonials.mdx b/apps/memoro/apps/landing/src/content/pages/de/testimonials.mdx deleted file mode 100644 index 79c03cf92..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/testimonials.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Referenzen | Memoro" -description: "Erfahren Sie, was unsere Kunden über Memoro sagen" -lang: "de" -type: "page" -lastUpdated: 2024-02-22 -sections: - hero: - title: "Was unsere Kunden sagen" - subtitle: "Erfahren Sie, wie Memoro Teams und Unternehmen dabei hilft, effizienter zu lernen und zu arbeiten" - callToAction: - title: "Bereit für bessere Meeting-Dokumentation?" - description: "Entdecke wie Memoro deine Meetings effizienter und produktiver macht." - buttonText: "App herunterladen" - buttonLink: "/de/download" ---- - -import TestimonialCard from "../../../components/TestimonialCard.astro"; -import CallToAction from "../../../components/CallToAction.astro"; - -export const TestimonialsContent = ({ testimonials, lang }) => ( - <> -

    - {frontmatter.sections.hero.title} -

    - -
    - {testimonials.map((testimonial) => ( - - ))} -
    - -
    - -
    - - -); - -{" "} diff --git a/apps/memoro/apps/landing/src/content/pages/de/vergleich.mdx b/apps/memoro/apps/landing/src/content/pages/de/vergleich.mdx deleted file mode 100644 index 6e5a6860c..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/vergleich.mdx +++ /dev/null @@ -1,650 +0,0 @@ ---- -title: "Meeting-Software Vergleich 2025 - Die besten Alternativen im Test | Memoro" -description: "Umfassender Vergleich aller Meeting-Protokoll Software ► Otter.ai vs Fireflies vs Memoro ✓ DSGVO-Check ✓ Preise ✓ Features ✓ Finden Sie die beste Lösung!" -keywords: ["meeting software vergleich", "otter.ai alternative", "fireflies alternative", "meeting protokoll software test", "transkriptionssoftware vergleich", "dsgvo konforme meeting tools", "beste meeting software deutschland", "ki meeting assistant vergleich"] -lang: de -type: comparison-hub -lastUpdated: 2025-01-09 -sections: - hero: - title: "Die beste Meeting-Software für Deutschland - Großer Vergleich 2025" - subtitle: "Finden Sie die perfekte Meeting-Software für Ihr Unternehmen" - cta: "Jetzt vergleichen" - features: - title: "Top 10 Meeting-Software Anbieter im Überblick" - items: ["Memoro", "Otter.ai", "Fireflies.ai", "MeetGeek", "Sembly", "tl;dv", "Fathom", "Rev", "Notta", "Gong.io"] -ogImage: "/images/og/vergleich.png" -canonical: "https://memoro.ai/de/vergleich" -robots: "index, follow" -priority: 0.95 -changefreq: "weekly" ---- - -import Button from '../../../components/atoms/Button.astro'; -import { Icon } from 'astro-icon/components'; - -# Die beste Meeting-Software für Deutschland - Großer Vergleich 2025 - -
    -
    -

    Finden Sie die perfekte Meeting-Software für Ihr Unternehmen

    -

    - Vergleichen Sie die Top 10 Meeting-Protokoll Tools nach Funktionen, Preis, Datenschutz und mehr. - Speziell für deutsche Unternehmen mit DSGVO-Fokus. -

    -
    - - -
    -
    -
    - -## 🏆 Die Top 10 Meeting-Software Anbieter im Überblick - -
    -
    -
    - 🥇 -
    -

    Memoro

    -
    - ⭐⭐⭐⭐⭐ - (4.9/5) - Testsieger DSGVO -
    -
    -
    -
    ab €12.99
    -
    600 Min kostenlos
    -
    -
    -
    -
    -

    ✅ Vorteile:

    -
      -
    • • 100% DSGVO-konform
    • -
    • • Deutsche Server
    • -
    • • 98% Genauigkeit
    • -
    • • 50+ Sprachen
    • -
    -
    -
    -

    ⚠️ Nachteile:

    -
      -
    • • Noch nicht so bekannt
    • -
    -

    Ideal für: Deutsche Unternehmen mit Datenschutz-Fokus

    -
    -
    - -
    - -
    -
    -

    Otter.ai

    -
    ⭐⭐⭐⭐ (4.2/5)
    -

    ab $16.99 • 300 Min kostenlos

    -

    Ideal für: Englischsprachige Teams

    - -
    - -
    -

    Fireflies.ai

    -
    ⭐⭐⭐⭐ (4.1/5)
    -

    ab $18 • Limitiert kostenlos

    -

    ⚠️ DSGVO-Risiko

    - -
    - -
    -

    Sembly.ai

    -
    ⭐⭐⭐⭐ (4.3/5)
    -

    ab $10 • Begrenzt kostenlos

    -

    Ideal für: Große Teams

    - -
    - -
    -

    MeetGeek

    -
    ⭐⭐⭐⭐ (4.0/5)
    -

    ab $15 • 500 Min kostenlos

    -

    Ideal für: Sales-Teams

    - -
    - -
    -

    Fathom

    -
    ⭐⭐⭐⭐ (4.4/5)
    -

    ab $12 • Unlimited*

    -

    Ideal für: Kleine Teams

    - -
    - -
    -

    Gong.io

    -
    ⭐⭐⭐⭐⭐ (4.6/5)
    -

    ab $5000/Jahr

    -

    Ideal für: Enterprise

    - -
    -
    -
    - -## 🎯 Detaillierter Feature-Vergleich - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FeatureMemoroOtter.aiFireflies.aiAndere
    Server-Standort🇩🇪 Deutschland🇺🇸 USA🇺🇸 USA🇺🇸 Meist USA
    DSGVO-konform✅ 100%❌ Risiko⚠️ Fraglich⚠️ Teilweise
    Deutsche Sprache✅ Perfekt❌ Nein⚠️ Basic⚠️ Unterschiedlich
    Genauigkeit98%+90%95%90-95%
    Kostenlose Minuten600/Monat300/MonatLimitiert100-500
    Deutscher Support✅ 24/7❌ Nein❌ Nein❌ Meist nicht
    Offline-Modus✅ Ja❌ Nein❌ Nein❌ Selten
    Preis (Pro Plan)€12.99$16.99$18$10-20
    -
    -
    - -## 🎯 Welche Software passt zu Ihnen? - -
    -
    - -

    Für deutsche Unternehmen

    -

    - Sie brauchen 100% DSGVO-Konformität, deutsche Server und Support? -

    -
    -

    👉 Empfehlung: Memoro

    -
      -
    • ✓ Deutsche Server & Rechtssicherheit
    • -
    • ✓ Perfekte deutsche Spracherkennung
    • -
    • ✓ Betriebsrat-konform
    • -
    -
    - -
    - -
    - -

    Für internationale Teams

    -

    - Sie arbeiten mit vielen Sprachen und globalen Teams? -

    -
    -

    👉 Alternativen:

    -
      -
    • • Notta (58 Sprachen, günstig)
    • -
    • • Fireflies (wenn DSGVO egal)
    • -
    • • Memoro (50+ Sprachen + DSGVO)
    • -
    -
    - -
    - -
    - -

    Für kleine Budgets

    -

    - Sie suchen eine günstige oder kostenlose Lösung? -

    -
    -

    👉 Budget-Optionen:

    -
      -
    • • Memoro (600 Min kostenlos)
    • -
    • • Fathom (Unlimited* mit Limits)
    • -
    • • Sembly ($10 Einstieg)
    • -
    -
    - -
    - -
    - -

    Für Enterprise

    -

    - Sie brauchen Enterprise-Features und Support? -

    -
    -

    👉 Enterprise-Lösungen:

    -
      -
    • • Gong.io (Revenue Intelligence)
    • -
    • • Memoro Enterprise (On-Premise)
    • -
    • • Sembly (HIPAA, SOC2)
    • -
    -
    - -
    -
    - -## ⚖️ DSGVO-Risiko-Bewertung - -
    -

    - - Vorsicht: Rechtliche Risiken bei US-Anbietern -

    - -
    -
    -

    🚫 Hohes Risiko

    -
      -
    • - - Otter.ai - US-Server, kein Deutsch -
    • -
    • - - Fireflies.ai - US-Datenverarbeitung -
    • -
    • - - Gong.io - Nur US-Markt -
    • -
    -
    - -
    -

    ⚠️ Mittleres Risiko

    -
      -
    • - - MeetGeek - Teilweise EU-Server -
    • -
    • - - Sembly - SOC2, aber US -
    • -
    • - - tl;dv - EU-Server optional -
    • -
    -
    - -
    -

    ✅ Kein Risiko

    -
      -
    • - - Memoro - 100% DSGVO, deutsche Server -
    • -
    • - Einziger Anbieter mit vollständiger deutscher Datenverarbeitung -
    • -
    -
    -
    - -
    -

    - ⚠️ Warnung: Bei DSGVO-Verstößen drohen Bußgelder bis zu 20 Mio. € oder 4% des Jahresumsatzes. - Prüfen Sie genau, wo Ihre Daten verarbeitet werden! -

    -
    -
    - -## 📈 Preis-Leistungs-Vergleich - -
    -

    Was bekommen Sie für Ihr Geld?

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    SoftwarePreis/MonatKostenlosPreis-LeistungVersteckte Kosten
    - 🥇 Memoro - €12.99600 Min -
    - {"⭐⭐⭐⭐⭐".split("").map(() => )} -
    -
    Keine
    Otter.ai$16.99300 Min -
    - {"⭐⭐⭐".split("").map(() => )} -
    -
    Währung, Limits
    Fireflies.ai$18Sehr limitiert -
    - {"⭐⭐".split("").map(() => )} -
    -
    Storage, Credits
    Sembly.ai$10Begrenzt -
    - {"⭐⭐⭐⭐".split("").map(() => )} -
    -
    Add-ons
    Gong.io$400+- -
    - {"⭐".split("").map(() => )} -
    -
    Setup, Training
    -
    - -
    -

    - 💡 Tipp: Achten Sie auf versteckte Kosten wie Währungsgebühren, - Storage-Limits, Credit-Systeme und Setup-Gebühren. Memoro hat transparente EUR-Preise ohne Überraschungen. -

    -
    -
    - -## 🚀 Migration von anderen Anbietern - - - -## ❓ Häufige Fragen zum Software-Vergleich - -
    -
    -
    - Welche Software ist wirklich DSGVO-konform? -

    - Nur Memoro bietet 100% DSGVO-Konformität mit deutschen Servern und vollständiger Datenverarbeitung in Deutschland. - Alle US-Anbieter (Otter, Fireflies, etc.) haben rechtliche Risiken durch den CLOUD Act. -

    -
    - -
    - Was ist die beste kostenlose Option? -

    - Memoro bietet mit 600 Minuten/Monat das großzügigste kostenlose Kontingent. - Fathom und tl;dv werben mit "unlimited", haben aber versteckte Einschränkungen. -

    -
    - -
    - Welche Software hat die beste deutsche Spracherkennung? -

    - Memoro wurde speziell für die deutsche Sprache optimiert und erreicht 98%+ Genauigkeit. - Otter.ai unterstützt gar kein Deutsch, andere Anbieter nur mit mäßiger Qualität. -

    -
    - -
    - Kann ich meine Daten von anderen Anbietern migrieren? -

    - Ja! Memoro bietet kostenlose Migration von allen gängigen Anbietern. - Export bei altem Anbieter → Import bei Memoro → Fertig in 30 Minuten. -

    -
    -
    - -
    -
    - Warum sind US-Anbieter problematisch? -

    - Nach dem Schrems-II-Urteil sind Datenübertragungen in die USA ohne zusätzliche Schutzmaßnahmen nicht DSGVO-konform. - US-Behörden können theoretisch auf Ihre Daten zugreifen (CLOUD Act). -

    -
    - -
    - Welche Software eignet sich für Unternehmen? -

    - Für deutsche Unternehmen: Memoro (DSGVO, Betriebsrat-konform). - Für internationale Konzerne: Gong.io (sehr teuer) oder Sembly (gutes Preis-Leistungs-Verhältnis). -

    -
    - -
    - Was bedeuten die Preisangaben? -

    - Die Preise sind Startpreise pro Nutzer/Monat. Viele Anbieter haben versteckte Kosten - (Storage-Limits, Credits, Währungsgebühren). Memoro hat transparente EUR-Preise ohne Überraschungen. -

    -
    - -
    - Welche Integrationen sind wichtig? -

    - Essentiell: Teams, Zoom, Google Meet. - Nice-to-have: Slack, CRM-Systeme, Kalender. - Alle Top-Anbieter unterstützen die wichtigsten Meeting-Plattformen. -

    -
    -
    -
    - -## 🎯 Unser Fazit: Die beste Meeting-Software 2025 - -
    -
    -

    - - Testsieger für deutsche Unternehmen: Memoro -

    - -
    -
    -
    98%+
    -
    Genauigkeit Deutsch
    -
    -
    -
    100%
    -
    DSGVO-konform
    -
    -
    -
    50+
    -
    Sprachen
    -
    -
    - -
    -

    Warum Memoro gewinnt:

    -
      -
    • - - Einziger Anbieter mit 100% deutscher Datenverarbeitung -
    • -
    • - - Beste Spracherkennung für Deutsch und Dialekte -
    • -
    • - - Großzügigstes kostenloses Kontingent (600 Min) -
    • -
    • - - Fairer Preis ohne versteckte Kosten in EUR -
    • -
    • - - Deutscher Support und Betriebsrat-konform -
    • -
    -
    - -
    - - -
    -
    -
    - -## 📚 Weitere Ressourcen - -
    -
    - -

    Detaillierte Einzelvergleiche

    - -
    - -
    - -

    Kostenrechner

    -

    - Berechnen Sie Ihre Ersparnis beim Wechsel zu Memoro -

    - -
    - -
    - -

    DSGVO-Guide

    -

    - Alles über Datenschutz bei Meeting-Software -

    - -
    -
    \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/de/vorstandsitzungen-protokoll-software.mdx b/apps/memoro/apps/landing/src/content/pages/de/vorstandsitzungen-protokoll-software.mdx deleted file mode 100644 index 563694405..000000000 --- a/apps/memoro/apps/landing/src/content/pages/de/vorstandsitzungen-protokoll-software.mdx +++ /dev/null @@ -1,443 +0,0 @@ ---- -title: "Vorstandsprotokoll Software | Rechtssicher & DSGVO-konform | Memoro" -description: "✓ Rechtssichere Vorstandsprotokolle automatisch erstellen ✓ DSGVO-konform ✓ Deutsche Server ✓ § 201 StGB konform ✓ Sprechererkennung ► Jetzt kostenlos testen!" -lang: "de" -type: "landing" -lastUpdated: 2025-01-30 -sections: - hero: - title: "Rechtssichere Vorstandsprotokolle – automatisch, vertraulich, DSGVO-konform" - subtitle: "Memoro dokumentiert Ihre Vorstandssitzungen mit höchster Vertraulichkeit. KI-gestützte Protokollerstellung auf deutschen Servern – rechtssicher nach § 201 StGB und DSGVO." - image: "/images/industries/Office-Businessman-Recording-Memoro-AI-App-Transcription.png" - imageAlt: "Memoro Vorstandsprotokoll Software - Automatische DSGVO-konforme Protokollerstellung" - cta: - primary: - text: "Kostenlos testen" - link: "/de/download" - secondary: - text: "Demo für Vorstände buchen" - link: "/de/contact" - trustBadges: - - icon: "🇩🇪" - text: "Deutsche Server" - - icon: "🔒" - text: "ISO 27001" - - icon: "✅" - text: "DSGVO-konform" - - icon: "⚖️" - text: "§ 201 StGB konform" - problems: - title: "Die Herausforderungen der Vorstandsprotokollierung" - items: - - icon: "⏱️" - title: "Zeitaufwand: 2-4 Stunden pro Sitzung" - description: "Manuelle Protokollierung bindet wertvolle Ressourcen, die produktiver genutzt werden könnten." - - icon: "🔐" - title: "Vertraulichkeit gefährdet" - description: "Externe Transkriptionsdienste mit US-Servern stellen ein Sicherheitsrisiko für sensible Vorstandsinformationen dar." - - icon: "⚖️" - title: "Rechtliche Haftungsrisiken" - description: "Fehlende oder unvollständige Protokolle können rechtliche Konsequenzen haben und die Nachweispflicht verletzen." - - icon: "📝" - title: "Verlust wichtiger Details" - description: "Manuelle Mitschriften verpassen kritische Beschlüsse, Abstimmungen und Diskussionspunkte." - solution: - title: "Memoro: Ihre Lösung für rechtssichere Vorstandsprotokolle" - subtitle: "Dokumentieren Sie Vorstandssitzungen vollständig und rechtssicher – automatisch, vertraulich, auf deutschen Servern" - steps: - - number: "1" - title: "Rechtssicher aufzeichnen" - description: "§ 201 StGB Einwilligungsmanagement integriert. Alle Teilnehmer werden automatisch informiert und dokumentiert." - icon: "📝" - - number: "2" - title: "KI analysiert vertraulich" - description: "Automatische Sprechererkennung, Beschlusserkennung und Strukturierung – alles auf deutschen Servern mit Zero-Knowledge-Verschlüsselung." - icon: "🔒" - - number: "3" - title: "Protokoll rechtssicher archivieren" - description: "Revisionssicheres Protokoll mit Audit-Trail, Versionierung und granularen Zugriffsrechten." - icon: "✅" - usps: - title: "Für Vorstandssitzungen entwickelt" - items: - - icon: "🔒" - title: "Maximale Vertraulichkeit" - description: "Zero-Knowledge-Verschlüsselung, deutsche Server, kein Zugriff Dritter auf Ihre Protokolle" - - icon: "⚖️" - title: "Rechtssicherheit garantiert" - description: "DSGVO-konform, § 201 StGB Einwilligungsmanagement integriert, lückenlose Audit-Trails, revisionssichere Archivierung" - - icon: "🎯" - title: "Präzise Vorstandsprotokolle" - description: "Automatische Sprechererkennung, Beschlusserkennung & Abstimmungsdokumentation, Action Item Tracking, Anwesenheitslisten" - - icon: "⚡" - title: "Zeit & Ressourcen sparen" - description: "90% Zeitersparnis bei Protokollerstellung, Protokoll direkt nach Meeting verfügbar, Integration mit Board Management Tools" - features: - title: "Funktionen für professionelle Vorstandsarbeit" - items: - - icon: "🌍" - title: "Mehrsprachige Transkription" - description: "Dokumentation internationaler Board Meetings in 80+ Sprachen" - - icon: "👥" - title: "20+ Sprecher Erkennung" - description: "Klare Zuordnung: wer hat was gesagt und beschlossen" - - icon: "📋" - title: "Custom Templates" - description: "Protokollvorlagen nach Corporate Guidelines" - - icon: "✅" - title: "Beschlusserkennung" - description: "KI identifiziert automatisch Beschlüsse und TO-DOs" - - icon: "🔐" - title: "Granulare Zugriffsrechte" - description: "Nur berechtigte Personen sehen vertrauliche Inhalte" - - icon: "📑" - title: "Versionierung" - description: "Alle Änderungen nachvollziehbar (Compliance)" - - icon: "📤" - title: "Export-Optionen" - description: "Word, PDF, Board Portal Integration" - - icon: "📱" - title: "Offline-Modus" - description: "Auch in geschlossenen Räumen nutzbar" - comparison: - title: "Memoro vs. traditionelle Lösungen vs. US-Anbieter" - subtitle: "Warum Memoro die beste Wahl für Vorstandssitzungen ist" - competitors: - - name: "Memoro" - features: - - "✅ Deutsche Server" - - "✅ DSGVO 100%" - - "✅ § 201 StGB" - - "✅ Zero-Knowledge" - - "✅ 20+ Sprecher" - - "✅ Deutscher Support" - - "⚡ 10 Min" - highlight: true - - name: "Manuelle Protokollierung" - features: - - "— Intern" - - "✅ Ja" - - "⚠️ Manuell" - - "✅ Intern" - - "❌ Nein" - - "— N/A" - - "⏱️ 2-4h" - - name: "US-Tools (Fathom, Fireflies)" - features: - - "❌ US-Server" - - "⚠️ Eingeschränkt" - - "❌ Nicht abgedeckt" - - "❌ US-Zugriff" - - "✅ Ja" - - "❌ Englisch" - - "⚡ 15 Min" - useCases: - title: "Memoro im Einsatz" - cases: - - title: "AG Vorstandssitzung" - description: "Börsennotierte Aktiengesellschaft: 7 Vorstände, 3h Sitzung, hochsensible Strategiethemen. Protokoll binnen 24h rechtssicher." - result: "Protokoll in 15 Min finalisiert, alle Beschlüsse dokumentiert, sichere Verteilung" - icon: "🏢" - - title: "Stiftungsvorstand" - description: "Gemeinnützige Stiftung: Vorstandssitzung mit 5 Mitgliedern, Compliance-Anforderungen für Prüfung." - result: "Revisionssicheres Protokoll, lückenlose Dokumentation für Wirtschaftsprüfer" - icon: "🏛️" - - title: "GmbH Gesellschafterversammlung" - description: "Mittelständische GmbH: Gesellschafterversammlung mit Beschlussfassung über Investitionen." - result: "Rechtssichere Abstimmungsdokumentation, Action Items automatisch zugewiesen" - icon: "🤝" - testimonials: - title: "Was Vorstände über Memoro sagen" - items: - - quote: "Als Vorstand trage ich hohe Verantwortung für die Protokollierung. Memoro gibt mir die Sicherheit, dass jeder Beschluss lückenlos dokumentiert ist – rechtssicher und vertraulich." - author: "Dr. M. Schmidt" - role: "Vorstand Mittelständische AG" - rating: 5 - - quote: "DSGVO-Konformität ist für uns nicht verhandelbar. Memoro auf deutschen Servern war die einzige Option, die unsere strengen Compliance-Anforderungen erfüllt." - author: "Corporate Secretary" - role: "DAX-Konzern" - rating: 5 - - quote: "Die automatische Beschlusserkennung spart uns enorm viel Zeit. Was früher 3 Stunden Nacharbeit kostete, ist jetzt in 10 Minuten erledigt." - author: "Julia R." - role: "Stiftungsvorstand" - rating: 5 - compliance: - title: "Höchste Sicherheitsstandards für Vorstandskommunikation" - technical: - title: "🔐 Technische Sicherheit" - items: - - "Ende-zu-Ende-Verschlüsselung (AES-256)" - - "ISO 27001 zertifizierte Rechenzentren" - - "Regelmäßige Penetration Tests" - - "Zero-Knowledge-Architektur" - legal: - title: "⚖️ Rechtliche Compliance" - items: - - "DSGVO Art. 32 konforme Verarbeitung" - - "§ 201 StGB Einwilligungsmanagement" - - "Auftragsverarbeitungsvertrag (AVV) inklusive" - - "Datenschutz-Folgenabschätzung verfügbar" - sovereignty: - title: "🇩🇪 Datensouveränität" - items: - - "Server-Standort: Frankfurt/München" - - "Kein Datentransfer außerhalb EU" - - "Deutsche Rechtsordnung" - - "SCHREMS II konform" - roi: - title: "Berechnen Sie Ihre Zeitersparnis" - subtitle: "Ermitteln Sie, wie viel Zeit und Geld Sie mit automatischen Vorstandsprotokollen sparen" - faq: - title: "Häufige Fragen von Vorständen" - items: - - question: "Ist Memoro rechtssicher für Vorstandssitzungen nach § 201 StGB?" - answer: "Ja. Memoro integriert Einwilligungsmanagement gemäß § 201 StGB. Vor jeder Aufnahme werden alle Teilnehmer informiert und müssen zustimmen – dokumentiert und nachweisbar. Dies erfüllt die gesetzlichen Anforderungen zum Schutz des gesprochenen Wortes." - - question: "Wo werden unsere vertraulichen Vorstandsprotokolle gespeichert?" - answer: "Ausschließlich auf ISO 27001-zertifizierten Servern in Deutschland (Frankfurt/München). Kein Zugriff durch Dritte, auch nicht durch Memoro-Mitarbeiter dank Zero-Knowledge-Architektur. Ihre Daten verlassen niemals die EU." - - question: "Wie funktioniert die Sprechererkennung bei wechselnden Teilnehmern?" - answer: "Memoro erkennt bis zu 20+ verschiedene Sprecher automatisch. Sie können Profile für wiederkehrende Vorstandsmitglieder anlegen, die das System lernt. Bei neuen Gästen erfolgt die Zuordnung nachträglich in nur 2 Minuten." - - question: "Ist eine Integration mit unserem Board Portal (z.B. Diligent, BoardEffect) möglich?" - answer: "Ja, Memoro bietet API-Integrationen und Export-Formate für gängige Board Management Systeme wie Diligent, BoardEffect und andere. Die Protokolle können direkt in Ihre bestehende Infrastruktur übertragen werden." - - question: "Was passiert, wenn die Internetverbindung während der Sitzung ausfällt?" - answer: "Memoro funktioniert vollständig offline. Die Aufnahme läuft unterbrechungsfrei weiter. Die Synchronisation und KI-Verarbeitung erfolgen automatisch bei der nächsten Internetverbindung." - - question: "Können wir eigene Protokollvorlagen für unsere Corporate Guidelines nutzen?" - answer: "Ja, Sie können beliebig viele eigene Protokollvorlagen hinterlegen, inklusive Ihres Brandings, der gewünschten Struktur und rechtlicher Klauseln. Unsere Templates sind vollständig anpassbar." - - question: "Wie lange werden Vorstandsprotokolle archiviert?" - answer: "Sie bestimmen die Aufbewahrungsfrist gemäß Ihrer individuellen Compliance-Anforderungen. Memoro bietet revisionssichere Langzeitarchivierung mit vollständiger Audit-Trail-Dokumentation für 10+ Jahre." - - question: "Wer hat Zugriff auf die Vorstandsprotokolle?" - answer: "Sie definieren granular, wer welche Protokolle sehen darf. Zugriffsrechte können pro Protokoll, Teilnehmer-Rolle oder Gremium vergeben werden. Alle Zugriffe werden protokolliert (Audit-Trail)." - - question: "Wie schnell ist das Protokoll nach einer Vorstandssitzung verfügbar?" - answer: "Bei einer typischen 2-3 stündigen Vorstandssitzung ist das vollständige Protokoll 5-10 Minuten nach Ende der Aufnahme verfügbar. Sie können dann sofort mit der Nachbearbeitung und Freigabe beginnen." - cta: - title: "Überzeugen Sie sich selbst – kostenlos und unverbindlich" - subtitle: "Testen Sie Memoro mit Ihrer nächsten Vorstandssitzung – DSGVO-konform und vertraulich" - button: - text: "30 Tage kostenlos testen" - link: "/de/download" - secondaryButton: - text: "Persönliche Demo buchen" - link: "/de/contact" - features: - - "✓ Keine Kreditkarte erforderlich" - - "✓ Voller Funktionsumfang" - - "✓ DSGVO-konform" - - "✓ Deutscher Enterprise-Support" ---- - -import HeroSection from "../../../components/HeroSection.astro"; -import FAQSection from "../../../components/FAQSection.astro"; -import CallToAction from "../../../components/CallToAction.astro"; -import ROICalculator from "../../../components/ROICalculator.astro"; - - - -

    {frontmatter.sections.problems.title}

    - -
    - {frontmatter.sections.problems.items.map((item) => ( -
    -
    {item.icon}
    -

    {item.title}

    -

    {item.description}

    -
    - ))} -
    - -

    {frontmatter.sections.solution.title}

    - -

    {frontmatter.sections.solution.subtitle}

    - -
    - {frontmatter.sections.solution.steps.map((step) => ( -
    -
    -
    - {step.number} -
    -
    {step.icon}
    -
    -

    {step.title}

    -

    {step.description}

    -
    - ))} -
    - -

    {frontmatter.sections.usps.title}

    - -
    - {frontmatter.sections.usps.items.map((usp) => ( -
    -
    {usp.icon}
    -

    {usp.title}

    -

    {usp.description}

    -
    - ))} -
    - -

    {frontmatter.sections.features.title}

    - -
    - {frontmatter.sections.features.items.map((feature) => ( -
    -
    {feature.icon}
    -

    {feature.title}

    -

    {feature.description}

    -
    - ))} -
    - -

    {frontmatter.sections.comparison.title}

    - -

    {frontmatter.sections.comparison.subtitle}

    - -
    - - - - - {frontmatter.sections.comparison.competitors.map((comp) => ( - - ))} - - - - {["Server-Standort", "DSGVO-Konformität", "§ 201 StGB", "Vertraulichkeit", "Sprechererkennung", "Support", "Zeitaufwand"].map((criterion, index) => ( - - - {frontmatter.sections.comparison.competitors.map((comp) => ( - - ))} - - ))} - -
    Kriterium - {comp.name} -
    {criterion} - {comp.features[index]} -
    -
    - -

    {frontmatter.sections.useCases.title}

    - -
    - {frontmatter.sections.useCases.cases.map((useCase) => ( -
    -
    {useCase.icon}
    -

    {useCase.title}

    -

    {useCase.description}

    -
    -

    Ergebnis:

    -

    {useCase.result}

    -
    -
    - ))} -
    - -

    {frontmatter.sections.testimonials.title}

    - -
    - {frontmatter.sections.testimonials.items.map((testimonial) => ( -
    -
    - {[...Array(testimonial.rating)].map(() => ( - - ))} -
    -

    "{testimonial.quote}"

    -
    -

    {testimonial.author}

    -

    {testimonial.role}

    -
    -
    - ))} -
    - -

    {frontmatter.sections.compliance.title}

    - -
    -
    -

    {frontmatter.sections.compliance.technical.title}

    -
      - {frontmatter.sections.compliance.technical.items.map((item) => ( -
    • - - {item} -
    • - ))} -
    -
    - -
    -

    {frontmatter.sections.compliance.legal.title}

    -
      - {frontmatter.sections.compliance.legal.items.map((item) => ( -
    • - - {item} -
    • - ))} -
    -
    - -
    -

    {frontmatter.sections.compliance.sovereignty.title}

    -
      - {frontmatter.sections.compliance.sovereignty.items.map((item) => ( -
    • - - {item} -
    • - ))} -
    -
    -
    - - - - - -
    -

    {frontmatter.sections.cta.title}

    -

    {frontmatter.sections.cta.subtitle}

    - - - -
    - {frontmatter.sections.cta.features.map((feature) => ( - {feature} - ))} -
    -
    diff --git a/apps/memoro/apps/landing/src/content/pages/en/about.mdx b/apps/memoro/apps/landing/src/content/pages/en/about.mdx deleted file mode 100644 index aa13e1fc7..000000000 --- a/apps/memoro/apps/landing/src/content/pages/en/about.mdx +++ /dev/null @@ -1,231 +0,0 @@ ---- -title: "About Memoro | Revolutionizing Conversation Documentation" -description: "Learn about Memoro's mission to revolutionize how people document conversations and capture thoughts." -lang: "en" -type: "page" -lastUpdated: 2025-07-23 -sections: - hero: - title: "Revolutionizing Conversation Documentation and Thought Capture" - subtitle: "Memoro is the innovative solution for automated capture, transcription, and summarization of spoken content - Made in Germany." - image: "/images/product_photos/Memoro-App-Students-University-Recording.jpg" - imageAlt: "Students using Memoro for university recordings" - mission: - title: "Our Mission" - description: "As a response to the challenges of manual note-taking and protocol writing, Memoro offers an intuitive solution for automated capture, transcription, and summarization of spoken content. We democratize access to AI-powered documentation tools and enable people worldwide to focus on what matters most - the conversation itself." - features: - title: "Key Features" - items: - - "One-button recording for easy start and stop" - - "Automatic transcription with speaker recognition" - - "AI-powered summarization and extraction of tasks, appointments, and insights" - - "Multilingual support: 24 languages and 2 dialects" - - "Industry-specific blueprints for different professional groups" - timeline: - title: "Our Journey" - items: - - date: "2023" - title: "The Idea is Born" - description: "From frustration with manual protocol writing, the vision of Memoro emerges." - - date: "Spring 2024" - title: "First Beta Version" - description: "Release of beta with basic recording and transcription features." - - date: "Summer 2024" - title: "Mobile Apps" - description: "Launch of native iOS and Android apps on App Store and Google Play Store." - - date: "Fall 2024" - title: "AI Enhancements" - description: "Introduction of intelligent summaries and industry-specific blueprints." - - date: "Winter 2024" - title: "800 Active Users" - description: "Milestone reached with estimated time savings of 2-6 hours per week per user." - team: - title: "Meet the Team" - members: - - name: "Nils Weiser" - role: "CTO" - description: "Co-Founder of Codify AG and experienced Full-Stack Developer. CTO at Memoro since May 2025, bringing expertise in AI Agents, modern tech stacks, and 'Vibe Coding'." - image: "/images/team/Memoro-Team-Portrait-NilsWeiser.jpg" - slug: "nils-weiser" - social: - linkedin: "https://linkedin.com/in/nils-weiser" - github: "https://github.com/nilsweiser" - - name: "Tobias Müller" - role: "CTO & Full-Stack Developer" - description: "Expert in modern web technologies with focus on AI-powered assistants and cloud architectures." - image: "/images/team/Memoro-Team-Portrait-TobiasMueller.jpg" - slug: "tobias-mueller" - social: - linkedin: "https://linkedin.com/in/tobischneider" - cta: - text: "Meet the entire team" - link: "/en/team" - values: - title: "Our Values" - items: - - title: "Made in Germany" - description: "Developed to the highest security standards with GDPR-compliant data storage exclusively in Germany." - - title: "Inclusivity & Accessibility" - description: "Breaking down language barriers through multilingualism and support for people with diverse needs." - - title: "Time Savings & Efficiency" - description: "Reducing documentation work by up to 75% - more time for actual work." - callToAction: - title: "Ready to Transform Your Learning Experience?" - description: "Join thousands of users who are already benefiting from Memoro's AI-powered learning platform." - buttonText: "Get Started Now" - buttonLink: "/en/download" - stats: - title: "Memoro by the Numbers" - items: - - number: "800+" - label: "Active Users" - - number: "24" - label: "Supported Languages" - - number: "2-6h" - label: "Time Saved per Week" - - number: "75%" - label: "Less Documentation Effort" ---- - -import Timeline from "../../../components/Timeline.astro"; -import TeamMemberCard from "../../../components/TeamMemberCard.astro"; -import { Image } from 'astro:assets'; - -{/* Hero Image */} -
    - {frontmatter.sections.hero.imageAlt} -
    - -{/* Mission Section */} - -
    -
    -

    - {frontmatter.sections.mission.title} -

    -

    - {frontmatter.sections.mission.description} -

    -
    -
    - Memoro app for conference recordings -
    -
    - -{/* Image Gallery */} -
    - Memoro recording screen - Memoro transcript view - Memoro Mana system -
    - -{/* Timeline Section */} - -
    -

    - {frontmatter.sections.timeline.title} -

    - -
    - -{/* Team Section */} - -
    -

    - {frontmatter.sections.team.title} -

    -
    - {frontmatter.sections.team.members.map((member) => ( - - ))} -
    - -
    - -{/* Values Section */} - -
    -

    - {frontmatter.sections.values.title} -

    -
    - {frontmatter.sections.values.items.map((value) => ( -
    -

    {value.title}

    -

    {value.description}

    -
    - ))} -
    -
    - -{/* Stats Section */} -
    -

    - {frontmatter.sections.stats.title} -

    -
    - {frontmatter.sections.stats.items.map((stat) => ( -
    -
    {stat.number}
    -
    {stat.label}
    -
    - ))} -
    -
    - -{/* Company Culture Image */} -
    - Secure data center for privacy protection -
    {" "} diff --git a/apps/memoro/apps/landing/src/content/pages/en/automatische-meetingnotizen.mdx b/apps/memoro/apps/landing/src/content/pages/en/automatische-meetingnotizen.mdx deleted file mode 100644 index 2aa8db60d..000000000 --- a/apps/memoro/apps/landing/src/content/pages/en/automatische-meetingnotizen.mdx +++ /dev/null @@ -1,358 +0,0 @@ ---- -title: "Automatic Meeting Notes 2025 - AI Creates Perfect Meeting Protocols | Memoro" -description: "Never forget meeting notes again ► AI automatically creates protocols ✓ Recognize action items ✓ GDPR-compliant ✓ Try for free now!" -keywords: ["automatic meeting notes", "meeting notes automatic", "meeting notes software", "meeting protocol automatic", "ai meeting notes", "automatic meeting protocol", "meeting notes ai", "automatically create protocol"] -lang: en -type: product -lastUpdated: 2025-01-09 -sections: - hero: - title: "Automatic Meeting Notes - Never Forget Anything Again" - subtitle: "AI automatically creates structured notes and action items during your meeting" - cta: "Try for free" - features: - title: "Why automatic meeting notes are the future" - items: ["Action items automatically", "Structured protocols", "Real-time capture", "Team integration"] -ogImage: "/images/og/automatische-meetingnotizen.png" -canonical: "https://memoro.ai/en/automatische-meetingnotizen" -robots: "index, follow" -priority: 0.9 -changefreq: "monthly" ---- - -import Button from '../../../components/atoms/Button.astro'; -import { Icon } from 'astro-icon/components'; -import FAQ from '../../../components/FAQ.astro'; -import ComparisonTable from '../../../components/ComparisonTable.astro'; - -# Automatic Meeting Notes - Focus on What Matters - -**80% of meeting content gets lost:** Studies show that participants remember only 20% of discussed points after one week. Action items are forgotten, decisions disappear into thin air. - -## The Problem with Manual Meeting Notes - -
    -
    -

    📝 Incomplete Notes

    -

    While you note, you miss important details

    -
    -
    -

    ⏰ Time Effort After Meeting

    -

    30 min meeting = 15 min post-processing

    -
    -
    -

    🔍 Hard to Search

    -

    Handwritten notes are not searchable

    -
    -
    -

    👥 Only One Person Takes Notes

    -

    The "note-taker" cannot fully participate

    -
    -
    - -## Automatic Meeting Notes with AI - -### How It Works - The 3-Step Process - -
    -
    -
    -
    - -
    -

    1. Record Meeting

    -

    Simply press "Start" - AI listens

    -
    -
    -
    - -
    -

    2. AI Analyzes

    -

    Recognizes topics, decisions & action items

    -
    -
    -
    - -
    -

    3. Generate Notes

    -

    Structured protocols to all participants

    -
    -
    -
    - -### What Makes Our Automatic Meeting Notes Special? - -#### 🎯 **Intelligent Content Recognition** - -The AI automatically recognizes: -- **Decisions:** "We have decided that..." -- **Action Items:** "Thomas takes over by next week..." -- **Important Points:** "This is critical for project completion" -- **Deadlines:** "Deadline is March 15th" -- **Responsible:** Who does what by when - -#### 📊 **Structured Output** - -``` -Meeting: Product Planning Q2 2025 -Date: 09.01.2025, 2:00-3:30 PM -Participants: Sarah (PM), Michael (Dev), Lisa (Design) - -🎯 DECISIONS: -• Launch delayed by 2 weeks to week 15 -• Budget for external designers approved -• Feature X removed from V1 - -✅ ACTION ITEMS: -• Sarah: Adjust timeline (by 12.01.) -• Michael: Complete backend API (by 20.01.) -• Lisa: Create designer briefing (by 10.01.) - -💡 KEY POINTS: -• User feedback very positive (4.8/5 stars) -• Performance tests show optimization needs -• Marketing campaign can start as planned - -📅 NEXT MEETING: -16.01.2025, 2:00 PM - Final review before launch -``` - -## Use Cases for Automatic Meeting Notes - -### 🏢 **Project Management** - -**Automatically document all project updates:** -- Document stand-up meetings -- Evaluate sprint reviews -- Structure stakeholder updates -- Record risk discussions - -*"Since we use Memoro, no action items get lost anymore. Our project backlog is always up to date and everyone knows what to do."* - **Anna M., Project Lead** - -### 💼 **Sales & Customer Service** - -**Professionally document customer interactions:** -- Document customer meetings -- Record requirements conversations -- Automatically create follow-up actions -- Generate deal updates for CRM - -### 🎓 **Education & Training** - -**Record learning progress and decisions:** -- Document doctoral conversations -- Record training measures -- Evaluate mentoring sessions -- Structure research group meetings - -## Unique Memoro Features - -### 🤖 **AI Assistant for Follow-ups** - -**Automatic follow-up actions:** -- Email drafts for action items -- Calendar entries for deadlines -- Reminders for responsible parties -- Status updates for stakeholders - -### 📋 **Meeting Templates for Every Occasion** - -**15+ pre-made templates:** -- Daily Stand-up -- Sprint Planning -- Customer Consultation -- Board Meeting -- One-on-One -- Brainstorming -- Project Kickoff -- Retrospective - -### 🔗 **Seamless Team Integration** - -**Direct into your tools:** -- **Slack:** Automatically post notes to channel -- **Microsoft Teams:** Integration in team chat -- **Email:** Automatic sending to participants -- **Jira:** Create action items as tickets -- **Trello:** Automatically generate cards - -## ROI Calculator: Time Savings Through Automatic Notes - -
    -

    Example: Team of 8 People

    - -
    -
    -

    Before (Manual Notes)

    -
      -
    • • 5 meetings/week à 60 min
    • -
    • • 1 person notes (not fully present)
    • -
    • • 20 min post-processing/meeting
    • -
    • • 15 min distribution/meeting
    • -
    • 175 min/week effort
    • -
    -
    -
    -

    After (Memoro)

    -
      -
    • • Automatic capture
    • -
    • • Everyone can fully participate
    • -
    • • 2 min review/meeting
    • -
    • • Automatic distribution
    • -
    • 10 min/week effort
    • -
    -
    -
    - -
    -

    Time Savings: 165 min/week (94%)

    -

    = 2.75 hours more for productive work

    -
    -
    - -## Before vs. After - -
    -
    -

    ❌ Without Automatic Notes

    -
      -
    • • Note-taker writes - is distracted
    • -
    • • Important points are overheard
    • -
    • • After meeting: 20 min note processing
    • -
    • • Action items unclear or forgotten
    • -
    • Total: 95 min effort
    • -
    -
    -
    -

    ✅ With Automatic Notes

    -
      -
    • • Everyone can fully participate
    • -
    • • Nothing is forgotten or overheard
    • -
    • • After meeting: 2 min review suffices
    • -
    • • Action items clear with responsible parties
    • -
    • Total: 62 min effort
    • -
    -
    -
    - -## Success Stories - -### Case Study: Software Development Team - -**Challenge:** 12-person dev team with daily stand-ups and weekly plannings. Many action items were lost. - -**Before:** -- 30 min/day for notes and follow-ups -- 20% of action items forgotten -- Unclear responsibilities -- Time effort: 2.5h/week - -**With Automatic Meeting Notes:** -- 5 min/day for review -- 0% forgotten action items -- Automatic Jira tickets -- Time effort: 25 min/week - -**Results:** -- **90% time savings** in meeting administration -- **40% fewer follow-up meetings** needed -- **25% higher sprint velocity** through clearer tasks - -## Pricing & Packages - -
    -
    -

    Starter

    -

    Free

    -

    600 minutes/month

    -
      -
    • ✅ Automatic notes
    • -
    • ✅ Action item recognition
    • -
    • ✅ 5 meeting templates
    • -
    • ✅ Email export
    • -
    • ✅ 30 days storage
    • -
    -
    -
    -
    - For Teams -
    -

    Professional

    -

    €29/month

    -

    1,500 minutes/month

    -
      -
    • ✅ Everything from Starter
    • -
    • ✅ 15+ meeting templates
    • -
    • ✅ Slack/Teams integration
    • -
    • ✅ Automatic reminders
    • -
    • ✅ CRM integration
    • -
    • ✅ Unlimited storage
    • -
    -
    -
    -

    Enterprise

    -

    €99/month

    -

    Unlimited minutes

    -
      -
    • ✅ Everything from Professional
    • -
    • ✅ Unlimited meetings
    • -
    • ✅ Custom templates
    • -
    • ✅ API access
    • -
    • ✅ White-label option
    • -
    • ✅ Dedicated support
    • -
    -
    -
    - -## Frequently Asked Questions - - - -## Start with Automatic Meeting Notes Now - -
    -

    Ready for More Efficient Meetings?

    -

    - Start today and experience how automatic notes improve your meeting culture. -

    -
    - - -
    -

    - 600 min free • No credit card • For all team sizes -

    -
    - ---- - -*Last update: January 2025* diff --git a/apps/memoro/apps/landing/src/content/pages/en/blog.mdx b/apps/memoro/apps/landing/src/content/pages/en/blog.mdx deleted file mode 100644 index bda1cb5fd..000000000 --- a/apps/memoro/apps/landing/src/content/pages/en/blog.mdx +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "Blog | Memoro" -description: "News, Updates, and Insights from Memoro" -lang: "en" -type: "page" -lastUpdated: 2024-02-22 -sections: - hero: - title: "Blog" - subtitle: "News, Updates, and Insights from Memoro" ---- - -import BlogCard from "../../../components/BlogCard.astro"; - -export const BlogContent = ({ posts, lang }) => ( - <> -
    -

    - {frontmatter.sections.hero.title} -

    -

    - {frontmatter.sections.hero.subtitle} -

    -
    - -
    - {posts.map((post) => ( - - ))} -
    - - -); - -{" "} diff --git a/apps/memoro/apps/landing/src/content/pages/en/board-meeting-minutes-software.mdx b/apps/memoro/apps/landing/src/content/pages/en/board-meeting-minutes-software.mdx deleted file mode 100644 index 6ba0b9563..000000000 --- a/apps/memoro/apps/landing/src/content/pages/en/board-meeting-minutes-software.mdx +++ /dev/null @@ -1,443 +0,0 @@ ---- -title: "Board Meeting Minutes Software | Legally Compliant & GDPR-Compliant | Memoro" -description: "✓ Automatically create legally compliant board minutes ✓ GDPR-compliant ✓ European servers ✓ Legal recording consent ✓ Speaker recognition ► Try free now!" -lang: "en" -type: "landing" -lastUpdated: 2025-01-30 -sections: - hero: - title: "Legally Compliant Board Minutes – Automatic, Confidential, GDPR-Compliant" - subtitle: "Memoro documents your board meetings with highest confidentiality. AI-powered protocol creation on European servers – legally compliant and GDPR-certified." - image: "/images/industries/Office-Businessman-Recording-Memoro-AI-App-Transcription.png" - imageAlt: "Memoro Board Meeting Minutes Software - Automatic GDPR-compliant Protocol Creation" - cta: - primary: - text: "Try for free" - link: "/en/download" - secondary: - text: "Book demo for boards" - link: "/en/contact" - trustBadges: - - icon: "🇪🇺" - text: "European Servers" - - icon: "🔒" - text: "ISO 27001" - - icon: "✅" - text: "GDPR-compliant" - - icon: "⚖️" - text: "Legal Compliance" - problems: - title: "The Challenges of Board Meeting Documentation" - items: - - icon: "⏱️" - title: "Time Effort: 2-4 Hours per Meeting" - description: "Manual documentation ties up valuable resources that could be used more productively." - - icon: "🔐" - title: "Confidentiality at Risk" - description: "External transcription services with US servers pose a security risk for sensitive board information." - - icon: "⚖️" - title: "Legal Liability Risks" - description: "Missing or incomplete minutes can have legal consequences and violate documentation requirements." - - icon: "📝" - title: "Loss of Important Details" - description: "Manual notes miss critical resolutions, votes, and discussion points." - solution: - title: "Memoro: Your Solution for Legally Compliant Board Minutes" - subtitle: "Document board meetings completely and legally – automatic, confidential, on European servers" - steps: - - number: "1" - title: "Record Legally Compliant" - description: "Integrated consent management. All participants are automatically informed and documented." - icon: "📝" - - number: "2" - title: "AI Analyzes Confidentially" - description: "Automatic speaker recognition, resolution detection, and structuring – all on European servers with zero-knowledge encryption." - icon: "🔒" - - number: "3" - title: "Archive Minutes Securely" - description: "Audit-proof protocol with audit trail, versioning, and granular access rights." - icon: "✅" - usps: - title: "Developed for Board Meetings" - items: - - icon: "🔒" - title: "Maximum Confidentiality" - description: "Zero-knowledge encryption, European servers, no third-party access to your minutes" - - icon: "⚖️" - title: "Legal Certainty Guaranteed" - description: "GDPR-compliant, integrated consent management, complete audit trails, audit-proof archiving" - - icon: "🎯" - title: "Precise Board Minutes" - description: "Automatic speaker recognition, resolution detection & vote documentation, action item tracking, attendance lists" - - icon: "⚡" - title: "Save Time & Resources" - description: "90% time savings in protocol creation, minutes available immediately after meeting, integration with board management tools" - features: - title: "Features for Professional Board Work" - items: - - icon: "🌍" - title: "Multilingual Transcription" - description: "Documentation of international board meetings in 80+ languages" - - icon: "👥" - title: "20+ Speaker Recognition" - description: "Clear attribution: who said and decided what" - - icon: "📋" - title: "Custom Templates" - description: "Protocol templates according to corporate guidelines" - - icon: "✅" - title: "Resolution Detection" - description: "AI automatically identifies resolutions and to-dos" - - icon: "🔐" - title: "Granular Access Rights" - description: "Only authorized persons see confidential content" - - icon: "📑" - title: "Versioning" - description: "All changes traceable (compliance)" - - icon: "📤" - title: "Export Options" - description: "Word, PDF, board portal integration" - - icon: "📱" - title: "Offline Mode" - description: "Also usable in closed rooms" - comparison: - title: "Memoro vs. Traditional Solutions vs. US Providers" - subtitle: "Why Memoro is the best choice for board meetings" - competitors: - - name: "Memoro" - features: - - "✅ European Servers" - - "✅ GDPR 100%" - - "✅ Legal Consent" - - "✅ Zero-Knowledge" - - "✅ 20+ Speakers" - - "✅ European Support" - - "⚡ 10 Min" - highlight: true - - name: "Manual Documentation" - features: - - "— Internal" - - "✅ Yes" - - "⚠️ Manual" - - "✅ Internal" - - "❌ No" - - "— N/A" - - "⏱️ 2-4h" - - name: "US Tools (Fathom, Fireflies)" - features: - - "❌ US Servers" - - "⚠️ Limited" - - "❌ Not Covered" - - "❌ US Access" - - "✅ Yes" - - "❌ English" - - "⚡ 15 Min" - useCases: - title: "Memoro in Action" - cases: - - title: "Public Company Board Meeting" - description: "Publicly traded corporation: 7 board members, 3h meeting, highly sensitive strategic topics. Minutes legally compliant within 24h." - result: "Minutes finalized in 15 min, all resolutions documented, secure distribution" - icon: "🏢" - - title: "Foundation Board" - description: "Non-profit foundation: Board meeting with 5 members, compliance requirements for audits." - result: "Audit-proof minutes, complete documentation for auditors" - icon: "🏛️" - - title: "LLC Shareholder Meeting" - description: "Mid-sized LLC: Shareholder meeting with resolutions on investments." - result: "Legally compliant vote documentation, action items automatically assigned" - icon: "🤝" - testimonials: - title: "What Board Members Say About Memoro" - items: - - quote: "As a board member, I bear high responsibility for documentation. Memoro gives me certainty that every resolution is completely documented – legally compliant and confidential." - author: "Dr. M. Schmidt" - role: "Board Member, Mid-sized Corporation" - rating: 5 - - quote: "GDPR compliance is non-negotiable for us. Memoro on European servers was the only option that meets our strict compliance requirements." - author: "Corporate Secretary" - role: "DAX Corporation" - rating: 5 - - quote: "Automatic resolution detection saves us enormous time. What used to cost 3 hours of post-processing is now done in 10 minutes." - author: "Julia R." - role: "Foundation Board" - rating: 5 - compliance: - title: "Highest Security Standards for Board Communication" - technical: - title: "🔐 Technical Security" - items: - - "End-to-end encryption (AES-256)" - - "ISO 27001 certified data centers" - - "Regular penetration tests" - - "Zero-knowledge architecture" - legal: - title: "⚖️ Legal Compliance" - items: - - "GDPR Art. 32 compliant processing" - - "Integrated consent management" - - "Data processing agreement (DPA) included" - - "Data protection impact assessment available" - sovereignty: - title: "🇪🇺 Data Sovereignty" - items: - - "Server location: Frankfurt/Munich" - - "No data transfer outside EU" - - "European jurisdiction" - - "SCHREMS II compliant" - roi: - title: "Calculate Your Time Savings" - subtitle: "Determine how much time and money you save with automatic board minutes" - faq: - title: "Frequently Asked Questions from Board Members" - items: - - question: "Is Memoro legally compliant for board meetings?" - answer: "Yes. Memoro integrates consent management for meeting recordings. Before each recording, all participants are informed and must consent – documented and verifiable. This meets legal requirements for recording conversations." - - question: "Where are our confidential board minutes stored?" - answer: "Exclusively on ISO 27001-certified servers in Europe (Frankfurt/Munich). No third-party access, not even by Memoro employees thanks to zero-knowledge architecture. Your data never leaves the EU." - - question: "How does speaker recognition work with changing participants?" - answer: "Memoro automatically recognizes up to 20+ different speakers. You can create profiles for recurring board members that the system learns. For new guests, assignment is done retrospectively in just 2 minutes." - - question: "Is integration with our board portal (e.g., Diligent, BoardEffect) possible?" - answer: "Yes, Memoro offers API integrations and export formats for common board management systems like Diligent, BoardEffect, and others. Minutes can be transferred directly to your existing infrastructure." - - question: "What happens if the internet connection fails during the meeting?" - answer: "Memoro works completely offline. Recording continues uninterrupted. Synchronization and AI processing happen automatically at the next internet connection." - - question: "Can we use our own protocol templates for our corporate guidelines?" - answer: "Yes, you can store any number of your own protocol templates, including your branding, desired structure, and legal clauses. Our templates are fully customizable." - - question: "How long are board minutes archived?" - answer: "You determine the retention period according to your individual compliance requirements. Memoro offers audit-proof long-term archiving with complete audit trail documentation for 10+ years." - - question: "Who has access to the board minutes?" - answer: "You define granularly who may see which minutes. Access rights can be granted per protocol, participant role, or committee. All access is logged (audit trail)." - - question: "How quickly are minutes available after a board meeting?" - answer: "For a typical 2-3 hour board meeting, the complete minutes are available 5-10 minutes after the end of recording. You can then immediately begin post-processing and approval." - cta: - title: "See for Yourself – Free and Non-binding" - subtitle: "Test Memoro with your next board meeting – GDPR-compliant and confidential" - button: - text: "Try 30 days free" - link: "/en/download" - secondaryButton: - text: "Book personal demo" - link: "/en/contact" - features: - - "✓ No credit card required" - - "✓ Full feature set" - - "✓ GDPR-compliant" - - "✓ European enterprise support" ---- - -import HeroSection from "../../../components/HeroSection.astro"; -import FAQSection from "../../../components/FAQSection.astro"; -import CallToAction from "../../../components/CallToAction.astro"; -import ROICalculator from "../../../components/ROICalculator.astro"; - - - -

    {frontmatter.sections.problems.title}

    - -
    - {frontmatter.sections.problems.items.map((item) => ( -
    -
    {item.icon}
    -

    {item.title}

    -

    {item.description}

    -
    - ))} -
    - -

    {frontmatter.sections.solution.title}

    - -

    {frontmatter.sections.solution.subtitle}

    - -
    - {frontmatter.sections.solution.steps.map((step) => ( -
    -
    -
    - {step.number} -
    -
    {step.icon}
    -
    -

    {step.title}

    -

    {step.description}

    -
    - ))} -
    - -

    {frontmatter.sections.usps.title}

    - -
    - {frontmatter.sections.usps.items.map((usp) => ( -
    -
    {usp.icon}
    -

    {usp.title}

    -

    {usp.description}

    -
    - ))} -
    - -

    {frontmatter.sections.features.title}

    - -
    - {frontmatter.sections.features.items.map((feature) => ( -
    -
    {feature.icon}
    -

    {feature.title}

    -

    {feature.description}

    -
    - ))} -
    - -

    {frontmatter.sections.comparison.title}

    - -

    {frontmatter.sections.comparison.subtitle}

    - -
    - - - - - {frontmatter.sections.comparison.competitors.map((comp) => ( - - ))} - - - - {["Server Location", "GDPR Compliance", "Legal Consent", "Confidentiality", "Speaker Recognition", "Support", "Time Effort"].map((criterion, index) => ( - - - {frontmatter.sections.comparison.competitors.map((comp) => ( - - ))} - - ))} - -
    Criteria - {comp.name} -
    {criterion} - {comp.features[index]} -
    -
    - -

    {frontmatter.sections.useCases.title}

    - -
    - {frontmatter.sections.useCases.cases.map((useCase) => ( -
    -
    {useCase.icon}
    -

    {useCase.title}

    -

    {useCase.description}

    -
    -

    Result:

    -

    {useCase.result}

    -
    -
    - ))} -
    - -

    {frontmatter.sections.testimonials.title}

    - -
    - {frontmatter.sections.testimonials.items.map((testimonial) => ( -
    -
    - {[...Array(testimonial.rating)].map(() => ( - - ))} -
    -

    "{testimonial.quote}"

    -
    -

    {testimonial.author}

    -

    {testimonial.role}

    -
    -
    - ))} -
    - -

    {frontmatter.sections.compliance.title}

    - -
    -
    -

    {frontmatter.sections.compliance.technical.title}

    -
      - {frontmatter.sections.compliance.technical.items.map((item) => ( -
    • - - {item} -
    • - ))} -
    -
    - -
    -

    {frontmatter.sections.compliance.legal.title}

    -
      - {frontmatter.sections.compliance.legal.items.map((item) => ( -
    • - - {item} -
    • - ))} -
    -
    - -
    -

    {frontmatter.sections.compliance.sovereignty.title}

    -
      - {frontmatter.sections.compliance.sovereignty.items.map((item) => ( -
    • - - {item} -
    • - ))} -
    -
    -
    - - - - - -
    -

    {frontmatter.sections.cta.title}

    -

    {frontmatter.sections.cta.subtitle}

    - - - -
    - {frontmatter.sections.cta.features.map((feature) => ( - {feature} - ))} -
    -
    diff --git a/apps/memoro/apps/landing/src/content/pages/en/business-voice-recording-app.mdx b/apps/memoro/apps/landing/src/content/pages/en/business-voice-recording-app.mdx deleted file mode 100644 index c619281f4..000000000 --- a/apps/memoro/apps/landing/src/content/pages/en/business-voice-recording-app.mdx +++ /dev/null @@ -1,577 +0,0 @@ ---- -title: "Business Voice Recording App 2025 - Professional Audio Documentation | Memoro" -description: "The business voice recording app for professional documentation ► Offline mode ✓ Automatic transcription ✓ GDPR-compliant ✓ For field sales & teams" -keywords: ["business voice recording app", "business voice recording", "dictation app enterprise", "audio recording business", "voice memo business", "voice recording app business", "corporate voice recording", "mobile documentation"] -lang: en -type: product -lastUpdated: 2025-01-09 -sections: - hero: - title: "Voice Recording App for Business - Document Professionally, Anywhere" - subtitle: "From field sales to boardroom - Capture important conversations and ideas professionally" - cta: "Try app for free" - features: - title: "Why Memoro is the leading business voice recording app" - items: ["Offline recording", "Automatic transcription", "End-to-end encryption", "Team integration"] -ogImage: "/images/og/sprachaufnahme-app-business.png" -canonical: "https://memoro.ai/en/business-voice-recording-app" -robots: "index, follow" -priority: 0.9 -changefreq: "monthly" ---- - -import Button from '../../../components/atoms/Button.astro'; -import { Icon } from 'astro-icon/components'; -import FAQ from '../../../components/FAQ.astro'; -import ComparisonTable from '../../../components/ComparisonTable.astro'; - -
    -
    -

    - Business Voice Recording App - Document Professionally, Everywhere -

    -

    - Capture customer appointments, ideas, and important conversations professionally. - With offline mode, automatic transcription, and highest security. -

    -
    - - -
    -
    -
    - - Works offline -
    -
    - - Encrypted & secure -
    -
    - - Instant transcription -
    -
    -
    -
    - -## The Problem with Conventional Voice Recording Apps - -**Unprofessional, insecure, unusable:** Most voice recording apps are designed for private notes. In business contexts, important features like encryption, transcription, and team integration are missing. - -### The 6 Biggest Problems of Conventional Voice Apps: - -
    -
    -

    🔓 No Encryption

    -

    Sensitive business content stored unprotected

    -
    -
    -

    📱 Only Audio Files

    -

    No automatic transcription - hours of manual work

    -
    -
    -

    👥 No Team Features

    -

    Recordings remain isolated on one device

    -
    -
    -

    🌐 Internet-Dependent

    -

    Doesn't work in field sales without connection

    -
    -
    -

    🔍 Not Searchable

    -

    Important content disappears in audio archives

    -
    -
    -

    ⚖️ GDPR Problems

    -

    Unclear data protection with US providers

    -
    -
    - -## The Memoro Business Voice Recording App - -### Developed for Professional Requirements - -
    -
    -
    -
    - -
    -

    Record

    -

    HD quality even offline

    -
    -
    -
    - -
    -

    Encrypt

    -

    End-to-end secure

    -
    -
    -
    - -
    -

    Transcribe

    -

    AI creates text

    -
    -
    -
    - -
    -

    Share

    -

    Team & CRM integration

    -
    -
    -
    - -### Business Features Overview - -#### 📱 **Offline-First Design** -- Recordings work without internet -- Automatic synchronization when connected -- No more missed conversations -- Perfect for field sales & travel - -#### 🔐 **Enterprise-Grade Security** -- End-to-end encryption (AES-256) -- European servers (Frankfurt) -- Zero-knowledge architecture -- GDPR-compliant by design - -#### 🤖 **AI-Powered Transcription** -- 98% accuracy for English content -- Speaker recognition for meetings -- Automatic summaries -- Action items & keywords - -#### 👥 **Team Collaboration** -- Share recordings with team -- Add comments & notes -- Permission management -- Workflow integration - -## Business Voice Recording Apps Comparison - - - -## Use Cases for Business Voice Recording - -### 🚗 **Field Sales & Sales** - -**Document customer appointments professionally:** -- Capture consulting conversations completely -- Note follow-up actions immediately -- Collect customer feedback in structured way -- Use travel time productively - -*"As an insurance sales rep, I'm with customers daily. With Memoro, I can discreetly record all conversations and have the perfect basis for proposals later."* - **Peter S., Field Sales Manager** - -#### Typical Workflow: -``` -08:00 - Drive to customer - → Day planning via voice memo - -09:30 - Customer appointment - → Discreetly record conversation - -10:30 - Drive to next appointment - → Transcript already available - → Dictate follow-ups via voice - -11:00 - Back at office - → CRM automatically updated -``` - -### 💼 **Consulting & Advisory** - -**Optimize consulting meetings:** -- No note-taking during important discussions -- Complete documentation for compliance -- Precise basis for billing -- Knowledge management for the team - -#### Case Study: Business Consulting - -**Situation:** 15 senior consultants, 200+ customer appointments/month -**Challenge:** Protocols necessary for liability & billing -**Solution:** Business voice recording with automatic transcription - -**Before:** -- 30 min post-processing per 60 min meeting -- Incomplete protocols -- 50h/week for administration - -**With Memoro:** -- 5 min review per meeting -- Complete, searchable protocols -- 12h/week for administration - -**ROI:** 76% time savings = 38h/week × €75 = €2,850/week saved - -### 🏗️ **Project & Construction Management** - -**Document construction progress and defects:** -- Site inspections with voice memos -- Create defect lists via audio -- Record subcontractor briefings -- Document safety instructions - -### 🎓 **Training & Quality Assurance** - -**Optimize training and reviews:** -- Use customer conversations for training -- Collect employee feedback in structured way -- Build audio library of best practices -- Document quality controls - -### 📈 **Management & Leadership** - -**Digitize executive workflows:** -- Fully capture strategy discussions -- Board meeting preparation -- Delegation briefings via audio -- Capture spontaneous ideas immediately - -## Unique Business Features - -### 🔐 **Enterprise Security Standards** - -**Bank-grade encryption:** -- AES-256 encryption in real-time -- Zero-knowledge server architecture -- Local key generation -- Automatic deletion after X days - -**Compliance & Audit:** -- ISO 27001 certified infrastructure -- GDPR data processing agreement -- Audit logs for all actions -- Works council compliant deployment - -### 📊 **Business Intelligence** - -**Insights from your recordings:** -- Identify most frequent customer inquiries -- Analyze conversation duration and quality -- Recognize keyword trends -- Evaluate team performance - -### 🔗 **Seamless Integration** - -**Into your existing tools:** - -#### CRM Systems -- **Salesforce:** Recordings as activities -- **HubSpot:** Automatic contact assignment -- **Pipedrive:** Deals with audio notes -- **Microsoft Dynamics:** Full integration - -#### Project Management -- **Asana:** Tasks from action items -- **Monday.com:** Projects with audio updates -- **Notion:** Knowledge base with transcripts - -#### Team Communication -- **Slack:** Audio summaries in channels -- **Microsoft Teams:** Integration in chats -- **Email:** Automatic sending - -## Mobile Apps for All Platforms - -### 📱 **iOS App Features** -- Native iOS integration -- Siri shortcuts for quick recordings -- Apple Watch app for discreet operation -- CarPlay integration for sales -- Background recording possible - -### 🤖 **Android App Features** -- Material Design 3.0 -- Google Assistant integration -- Android Auto support -- Homescreen widget -- Tasker/Automation support - -### 💻 **Desktop & Web** -- Native Windows/Mac apps -- Progressive Web App (PWA) -- Browser extension for quick recordings -- Synchronization across all devices - -## Pricing for Business Customers - -
    -
    -

    Individual User

    -

    €19/month

    -

    Per user

    -
      -
    • ✅ Unlimited recordings
    • -
    • ✅ Automatic transcription
    • -
    • ✅ End-to-end encryption
    • -
    • ✅ Mobile + desktop apps
    • -
    • ✅ Basic CRM integration
    • -
    • ✅ 1 year storage
    • -
    -
    -
    -
    - For Teams -
    -

    Team

    -

    €49/month

    -

    Up to 10 users

    -
      -
    • ✅ Everything from Individual
    • -
    • ✅ Team sharing & comments
    • -
    • ✅ Extended CRM integration
    • -
    • ✅ Admin dashboard
    • -
    • ✅ User management
    • -
    • ✅ Priority support
    • -
    • ✅ 3 years storage
    • -
    -
    -
    -

    Enterprise

    -

    €199/month

    -

    Unlimited users

    -
      -
    • ✅ Everything from Team
    • -
    • ✅ White-label branding
    • -
    • ✅ Custom integrations
    • -
    • ✅ Dedicated support
    • -
    • ✅ SLA guarantees
    • -
    • ✅ On-premise option
    • -
    • ✅ Unlimited storage
    • -
    -
    -
    - -## ROI Calculation for Your Business - -
    -

    Example: 20-person Sales Team

    - -
    -
    -

    Costs without Memoro (per month)

    -
      -
    • • 20 employees × 25 customer appointments
    • -
    • • 30 min post-processing per appointment
    • -
    • • 20 × 25 × 0.5h = 250h post-processing
    • -
    • • 250h × €35 = €8,750/month
    • -
    -
    -
    -

    Costs with Memoro (per month)

    -
      -
    • • Team license: €199
    • -
    • • 5 min review per appointment
    • -
    • • 20 × 25 × 0.08h = 40h review
    • -
    • • 40h × €35 + €199 = €1,599/month
    • -
    -
    -
    - -
    -

    Savings: €7,151/month (82%)

    -

    ROI from first month: 3,593%

    -
    -
    - -## Success Stories from Our Business Customers - -### Case Study: Real Estate Company - -**Customer:** Real estate broker with 25 locations -**Challenge:** 800 viewings/month, inconsistent documentation - -**Before:** -- Handwritten notes during viewings -- 50% of prospect details were lost -- Follow-up appointments forgotten -- 15 min post-processing per viewing - -**With Business Voice Recording:** -- Discreet audio recording during viewing -- Prospect details automatically in CRM -- Follow-up reminders automatic -- 2 min review per viewing - -**Results after 6 months:** -- **87% time savings** in documentation -- **34% higher closing rate** through better follow-up -- **€2.3M additional revenue** from fewer lost leads - -*"Memoro has transformed our business. We don't lose any prospects anymore and our brokers can focus fully on consulting."* - **Julia K., CEO** - -### Case Study: Consulting Boutique - -**Situation:** 12 senior consultants, 150 customer appointments/month -**Problem:** Documentation for liability & billing time-consuming - -**Impact of Business Voice Recording:** -- **Before:** 45 min post-processing per hour meeting -- **After:** 5 min review + automatic documentation -- **Time Savings:** 89% less administrative effort -- **Quality Improvement:** Complete, legally compliant protocols - -**Financial Impact:** -- 40h/week less administration -- 40h × €120 consultant hourly rate = €4,800/week -- **Annual Savings: €249,600** - -## Frequently Asked Questions About Business Voice Recording - - - -## Start Business Voice Recording Now - -
    -

    Revolutionize Your Business Documentation

    -

    - Start today and experience how professional voice recording - improves your productivity and customer communication. -

    -
    - - -
    -

    - No credit card • Ready immediately • For all team sizes -

    -
    - -## App Downloads - -
    -
    - -

    iOS App

    -

    For iPhone & iPad

    - -
    -
    - -

    Android App

    -

    For Android devices

    - -
    -
    - ---- - -*Last update: January 2025 | All prices excl. VAT* diff --git a/apps/memoro/apps/landing/src/content/pages/en/contact.mdx b/apps/memoro/apps/landing/src/content/pages/en/contact.mdx deleted file mode 100644 index 4e74970b8..000000000 --- a/apps/memoro/apps/landing/src/content/pages/en/contact.mdx +++ /dev/null @@ -1,339 +0,0 @@ ---- -title: "Contact | Memoro" -description: "Contact us with any questions about Memoro. Our team is here to help." -lang: "en" -type: "contact" -lastUpdated: 2024-02-22 -sections: - hero: - title: "Contact Memoro" - subtitle: "Have questions? We're here to help." - contact: - company: "Memoro GmbH" - street: "Münzgasse 19" - city: "78462 Konstanz" - phone: "0049 176 444 343 85" - email: "kontakt@memoro.ai" - faq: - title: "Frequently Asked Questions" - items: - - question: "How quickly do you respond to inquiries?" - answer: "We strive to respond to all inquiries within 24 hours. Usually, you will receive a response much sooner." - - question: "Is phone support available?" - answer: "Currently, we do not offer phone support. For the best assistance, please contact us via email." - - question: "What information should I include in my support request?" - answer: "To help us assist you better, please include your account email, a clear description of your issue, and any relevant screenshots or error messages." - - question: "Do you offer support in other languages?" - answer: "Yes, we currently offer support in both English and German. Please feel free to write to us in either language." - callToAction: - title: "Ready for Better Meeting Documentation?" - description: "Discover how Memoro makes your meetings more efficient and productive." - buttonText: "Download App" - buttonLink: "/en/download" ---- - -import FAQSection from "../../../components/FAQSection.astro"; -import CallToAction from "../../../components/CallToAction.astro"; -import HeroSection from "../../../components/HeroSection.astro"; - - - -
    - {/* Contact Information Cards */} -
    - {/* Office Card */} -
    -
    -
    - - - - -
    -
    -

    Our Office

    -

    - {frontmatter.sections.contact.company}
    - {frontmatter.sections.contact.street}
    - {frontmatter.sections.contact.city} -

    -
    -
    -
    -

    - Please visit us by appointment only. -

    -
    -
    - - {/* Contact Details Card */} -
    -
    - {/* Phone */} -
    -
    - - - -
    -
    -

    Phone

    - - -
    -
    - - {/* Email */} - - - {/* Response Time */} -
    -
    - - - - Response time: Within 24 hours -
    -
    -
    -
    -
    - - {/* Contact Form Section */} -
    -
    -

    - Send Us a Message -

    -
    -
    -
    - - -
    -
    - - -
    -
    - -
    - - -
    - -
    - - -
    - -
    -

    - * Required fields -

    - -
    -
    -
    -
    - - {/* All Contact Options Section */} -
    -

    More Ways to Connect

    -
    - {/* Social Media Card */} - - - {/* App Downloads Card */} -
    -
    -
    - 📱 -
    -

    Memoro App

    -
    - -

    - Download the Memoro app and experience the future of conversation documentation. -

    - - -
    -
    -
    - - - -
    - -
    -
    diff --git a/apps/memoro/apps/landing/src/content/pages/en/faq.mdx b/apps/memoro/apps/landing/src/content/pages/en/faq.mdx deleted file mode 100644 index d748ab71d..000000000 --- a/apps/memoro/apps/landing/src/content/pages/en/faq.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: "FAQ | Memoro" -description: "Frequently Asked Questions about Memoro - Find answers to all your questions" -lang: "en" -type: "page" -lastUpdated: 2025-07-22 -sections: - hero: - title: "Frequently Asked Questions" - subtitle: "Find answers to the most frequently asked questions about Memoro" - callToAction: - title: "Still have questions?" - description: "Our support team is here to help." - buttonText: "Contact us" - buttonLink: "/en/contact" ---- - -export const FAQContent = ({ faqs }) => ( - <> -
    -

    {frontmatter.sections.hero.title}

    -

    - {frontmatter.sections.hero.subtitle} -

    -
    - -); - - \ No newline at end of file diff --git a/apps/memoro/apps/landing/src/content/pages/en/features.mdx b/apps/memoro/apps/landing/src/content/pages/en/features.mdx deleted file mode 100644 index e9b377dbd..000000000 --- a/apps/memoro/apps/landing/src/content/pages/en/features.mdx +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: "Features | Memoro" -description: "Discover the innovative features of Memoro for efficient learning and working" -lang: "en" -type: "page" -lastUpdated: 2024-02-22 -sections: - hero: - title: "Features" - subtitle: "Discover the innovative features of Memoro for efficient learning and working" - categories: - recording: - title: "Recording" - customization: - title: "Customization" - language: - title: "Languages" - organization: - title: "Organization" - sharing: - title: "Sharing" - faq: - title: "Frequently Asked Questions about Features" - items: - - question: "Which operating systems are supported?" - answer: "Memoro is available for macOS, Windows, and Linux. Additionally, we offer mobile apps for iOS and Android." - - question: "Can I use Memoro offline?" - answer: "Yes, you can use Memoro completely offline. Your notes are stored locally and automatically synchronized when an internet connection is available." - - question: "Is there a limit to the number of notes?" - answer: "No, you can create unlimited notes even in the free version." - - question: "How does AI assistance work?" - answer: "The AI assistance analyzes your notes and makes intelligent suggestions for connections, summaries, and flashcards. This feature is available in the Pro version." - callToAction: - title: "Ready for Better Meeting Documentation?" - description: "Discover how Memoro makes your meetings more efficient and productive." - buttonText: "Download App" - buttonLink: "/en/download" ---- - -import FeatureCard from "../../../components/FeatureCard.astro"; -import CallToAction from "../../../components/CallToAction.astro"; -import FAQSection from "../../../components/FAQSection.astro"; - - - -{/* Helper function to clean the slug */} -export function cleanSlug(slug, lang) { - const langPrefix = `${lang}/`; - return slug.startsWith(langPrefix) ? slug.substring(langPrefix.length) : slug; -} - -
    -

    {frontmatter.sections.hero.title}

    -

    - {frontmatter.sections.hero.subtitle} -

    -
    - -{/* Recording Features */} -
    -

    {frontmatter.sections.categories.recording.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'recording') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - -{/* Customization Features */} -
    -

    {frontmatter.sections.categories.customization.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'customization') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - -{/* Language Features */} -
    -

    {frontmatter.sections.categories.language.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'language') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - -{/* Organization Features */} -
    -

    {frontmatter.sections.categories.organization.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'organization') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - -{/* Sharing Features */} -
    -

    {frontmatter.sections.categories.sharing.title}

    -
    - {props.features - .filter(feature => feature.data.category === 'sharing') - .sort((a, b) => (parseInt(a.data.order) || 0) - (parseInt(b.data.order) || 0)) - .map(feature => ( -
    - -
    - ))} -
    -
    - - - -
    - -
    diff --git a/apps/memoro/apps/landing/src/content/pages/en/fireflies-ai-alternative.mdx b/apps/memoro/apps/landing/src/content/pages/en/fireflies-ai-alternative.mdx deleted file mode 100644 index 20d58f1f6..000000000 --- a/apps/memoro/apps/landing/src/content/pages/en/fireflies-ai-alternative.mdx +++ /dev/null @@ -1,556 +0,0 @@ ---- -title: "Fireflies.ai Alternative Europe - 100% GDPR-compliant & EU Servers | Memoro" -description: "The secure Fireflies.ai alternative for European companies ► European servers instead of US cloud ✓ GDPR-compliant ✓ No privacy risks ✓ Switch now!" -keywords: ["fireflies.ai alternative", "fireflies alternative europe", "fireflies.ai gdpr", "fireflies alternative gdpr", "meeting software gdpr compliant", "transcription european servers", "fireflies.ai privacy", "secure meeting software"] -lang: en -type: comparison -lastUpdated: 2025-01-09 -sections: - hero: - title: "Fireflies.ai Alternative - GDPR-compliant with European Servers" - subtitle: "The secure alternative to Fireflies.ai from Europe" - cta: "Start securely" - features: - title: "Why Memoro is more secure" - items: ["European servers", "GDPR-compliant", "End-to-end encryption"] -ogImage: "/images/og/fireflies-alternative.png" -canonical: "https://memoro.ai/en/fireflies-ai-alternative" -robots: "index, follow" -priority: 0.9 -changefreq: "monthly" ---- - -import Button from '../../../components/atoms/Button.astro'; -import { Icon } from 'astro-icon/components'; -import FAQ from '../../../components/FAQ.astro'; -import ComparisonTable from '../../../components/ComparisonTable.astro'; -import TestimonialCard from '../../../components/TestimonialCard.astro'; -import SecurityComparison from '../../../components/SecurityComparison.astro'; -import ROICalculator from '../../../components/ROICalculator.astro'; - -# Fireflies.ai Alternative - GDPR-compliant with European Servers - -
    -
    - -
    -

    ⚠️ Privacy Warning: Fireflies.ai Processes Your Data in the USA

    -

    - Fireflies.ai uses Google Cloud servers in the USA for data processing. - Even though they claim "GDPR-compliance", significant legal risks remain for European companies. -

    -

    - After the Schrems-II ruling by the ECJ, this can lead to fines up to €20 million or 4% of annual revenue. -

    -
    -
    -
    - -
    -
    -

    The Secure Alternative to Fireflies.ai from Europe

    -

    - Memoro offers all benefits of Fireflies.ai - but with 100% GDPR compliance, - European servers, and no privacy risks. Protect your company data and stay compliant. -

    -
    - - -
    -
    -
    - - European Servers -
    -
    - - ISO 27001 -
    -
    - - GDPR Certificate -
    -
    - - E2E Encryption -
    -
    -
    -
    - Memoro Security Dashboard - GDPR-compliant Alternative to Fireflies -
    -
    - -## The Privacy Problem with Fireflies.ai for European Companies - - -
    -

    🚨 Critical Privacy Risks with Fireflies.ai

    - -
    -

    1. US Data Processing Despite "GDPR-Compliance"

    -

    Fireflies optionally stores data in the EU, but processes it in the USA. - This potentially violates GDPR Art. 44-49.

    -
    - -
    -

    2. Google Cloud Infrastructure

    -

    Using Google Cloud means US authorities could theoretically access your data (CLOUD Act).

    -
    - -
    -

    3. Unclear Sub-Processors

    -

    Fireflies uses various US-based third parties for AI processing - often without transparent listing.

    -
    - -
    -

    4. Works Council & Co-Determination

    -

    US software with employee monitoring potential can lead to labor law problems in Europe.

    -
    - -
    -

    5. No Local Jurisdiction

    -

    In case of data breaches, you must sue in the USA - expensive and hopeless.

    -
    -
    - -
    -

    ✅ Memoro's Legally Secure Solution

    - -
    -

    1. 100% European Data Processing

    -

    All data is exclusively stored AND processed in Europe (Hetzner Datacenter).

    -
    - -
    -

    2. No US Cloud Providers

    -

    Completely European infrastructure without dependency on US companies.

    -
    - -
    -

    3. Transparent Data Processing

    -

    Clear Data Processing Agreements (DPA) under European law with all sub-processors.

    -
    - -
    -

    4. Works Council Compliant

    -

    Specifically developed for European co-determination - with works agreement templates.

    -
    - -
    -

    5. European Jurisdiction

    -

    For questions or issues, European law applies with local jurisdiction.

    -
    -
    -
    - -## Fireflies.ai vs. Memoro - The Compliance Comparison - - - -## What Data Protection Officers Say About Switching - -
    - - - - - - - -
    - -## Avoid Legal Risks - The Switch Guide - -
    -

    🔒 4 Steps to Legally Secure Meeting Documentation

    - -
    -
    -
    -
    1
    -
    -

    Terminate Fireflies.ai Legally

    -
      -
    • • Request data export (GDPR Art. 20)
    • -
    • • Demand deletion & get confirmation
    • -
    • • Keep documentation for compliance
    • -
    -
    -
    -
    - -
    -
    -
    2
    -
    -

    Set Up Memoro GDPR-Compliant

    -
      -
    • • Sign DPA (Data Processing Agreement)
    • -
    • • Document technical measures
    • -
    • • Obtain employee consents
    • -
    -
    -
    -
    - -
    -
    -
    3
    -
    -

    Involve Works Council

    -
      -
    • • Use works agreement template
    • -
    • • European servers as argument
    • -
    • • No employee monitoring possible
    • -
    -
    -
    -
    - -
    -
    -
    4
    -
    -

    Document Compliance

    -
      -
    • • Update processing directory
    • -
    • • Data protection impact assessment
    • -
    • • Activate audit trail
    • -
    -
    -
    -
    -
    -
    - -## The True Costs of Privacy Violations - - - -## Memoro's Security Features in Detail - -
    -
    - -

    European Infrastructure

    -
      -
    • ✓ Hetzner Datacenter Germany
    • -
    • ✓ No US cloud services
    • -
    • ✓ Geo-redundant backups in EU
    • -
    • ✓ 99.9% availability SLA
    • -
    -
    - -
    - -

    Encryption

    -
      -
    • ✓ End-to-end encryption
    • -
    • ✓ AES-256 for data at rest
    • -
    • ✓ TLS 1.3 for transport
    • -
    • ✓ Zero-knowledge option
    • -
    -
    - -
    - -

    Certifications

    -
      -
    • ✓ ISO 27001 certified
    • -
    • ✓ GDPR certificate
    • -
    • ✓ German BSI compliant
    • -
    • ✓ TISAX Level 2 (Automotive)
    • -
    -
    - -
    - -

    Access Control

    -
      -
    • ✓ Role-based permissions (RBAC)
    • -
    • ✓ 2-factor authentication
    • -
    • ✓ SSO with SAML 2.0
    • -
    • ✓ Audit logs (immutable)
    • -
    -
    - -
    - -

    Legal Security

    -
      -
    • ✓ European DPA standard
    • -
    • ✓ Works agreement templates
    • -
    • ✓ Deletion concept per GDPR
    • -
    • ✓ European jurisdiction
    • -
    -
    - -
    - -

    Data Sovereignty

    -
      -
    • ✓ Exportable anytime
    • -
    • ✓ Immediate deletion possible
    • -
    • ✓ On-premise option available
    • -
    • ✓ No data for AI training
    • -
    -
    -
    - -## Frequently Asked Questions About Privacy Switch - -