diff --git a/apps-archived/clock/apps/landing/.gitignore b/apps-archived/clock/apps/landing/.gitignore deleted file mode 100644 index 163286eca..000000000 --- a/apps-archived/clock/apps/landing/.gitignore +++ /dev/null @@ -1,27 +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 -.DS_Store - -# IDE -.idea/ -.vscode/ -*.swp -*.swo diff --git a/apps-archived/clock/apps/landing/.prettierrc b/apps-archived/clock/apps/landing/.prettierrc deleted file mode 100644 index 09cfb7d9d..000000000 --- a/apps-archived/clock/apps/landing/.prettierrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "useTabs": true, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["prettier-plugin-astro", "prettier-plugin-tailwindcss"], - "overrides": [ - { - "files": "*.astro", - "options": { - "parser": "astro" - } - } - ] -} diff --git a/apps-archived/clock/apps/landing/astro.config.mjs b/apps-archived/clock/apps/landing/astro.config.mjs deleted file mode 100644 index 83c9c822a..000000000 --- a/apps-archived/clock/apps/landing/astro.config.mjs +++ /dev/null @@ -1,19 +0,0 @@ -import { defineConfig } from 'astro/config'; -import tailwind from '@astrojs/tailwind'; - -// https://astro.build/config -export default defineConfig({ - integrations: [tailwind()], - output: 'static', - build: { - inlineStylesheets: 'auto', - }, - vite: { - resolve: { - alias: { - '@components': '/src/components', - '@layouts': '/src/layouts', - }, - }, - }, -}); diff --git a/apps-archived/clock/apps/landing/package.json b/apps-archived/clock/apps/landing/package.json deleted file mode 100644 index 623930a53..000000000 --- a/apps-archived/clock/apps/landing/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "@clock/landing", - "version": "0.2.0", - "private": true, - "type": "module", - "scripts": { - "dev": "astro dev --port 4323", - "start": "astro dev", - "build": "astro check && astro build", - "preview": "astro preview", - "astro": "astro", - "type-check": "astro check || echo 'Astro check skipped'", - "format": "prettier --write .", - "clean": "rm -rf dist .astro node_modules" - }, - "dependencies": { - "@astrojs/check": "^0.9.0", - "@manacore/shared-landing-ui": "workspace:*", - "astro": "^5.16.0", - "typescript": "^5.9.2" - }, - "devDependencies": { - "@astrojs/tailwind": "^6.0.2", - "@tailwindcss/typography": "^0.5.18", - "@types/node": "^20.0.0", - "eslint": "^9.0.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-astro": "^1.0.0", - "prettier": "^3.6.2", - "prettier-plugin-astro": "^0.14.1", - "prettier-plugin-tailwindcss": "^0.6.14", - "tailwindcss": "^3.4.0" - } -} diff --git a/apps-archived/clock/apps/landing/public/favicon.svg b/apps-archived/clock/apps/landing/public/favicon.svg deleted file mode 100644 index c5fd432f3..000000000 --- a/apps-archived/clock/apps/landing/public/favicon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps-archived/clock/apps/landing/src/components/CTA.astro b/apps-archived/clock/apps/landing/src/components/CTA.astro deleted file mode 100644 index 2cdc8a166..000000000 --- a/apps-archived/clock/apps/landing/src/components/CTA.astro +++ /dev/null @@ -1,60 +0,0 @@ ---- -// Call to Action section ---- - -
- -
-
- -
-
-

- Bereit, produktiver zu werden? -

-

- Starte kostenlos und erlebe, wie einfach Zeitmanagement sein kann. Keine Kreditkarte - erforderlich. -

- - - - -
-
- - - - Kostenlos starten -
-
- - - - Keine Kreditkarte -
-
- - - - Jederzeit kundbar -
-
-
-
-
diff --git a/apps-archived/clock/apps/landing/src/components/Features.astro b/apps-archived/clock/apps/landing/src/components/Features.astro deleted file mode 100644 index 77e7cf355..000000000 --- a/apps-archived/clock/apps/landing/src/components/Features.astro +++ /dev/null @@ -1,82 +0,0 @@ ---- -// Features section for Clock landing page - -const features = [ - { - icon: ` - - `, - title: 'Pomodoro Timer', - description: - 'Arbeite in fokussierten 25-Minuten-Intervallen mit automatischen Pausen. Steigere deine Konzentration.', - }, - { - icon: ` - - `, - title: 'Zeiterfassung', - description: - 'Tracke deine Arbeitszeit auf Projekte und Aufgaben. Detaillierte Berichte und Statistiken.', - }, - { - icon: ` - - `, - title: 'Focus Sessions', - description: - 'Starte dedizierte Focus-Sessions und eliminiere Ablenkungen. Perfekt fur Deep Work.', - }, - { - icon: ` - - `, - title: 'Erinnerungen', - description: 'Sanfte Erinnerungen fur Pausen und Arbeitsende. Schutze deine Work-Life-Balance.', - }, - { - icon: ` - - `, - title: 'Detaillierte Reports', - description: - 'Wochentliche und monatliche Ubersichten. Exportiere deine Daten als CSV oder PDF.', - }, - { - icon: ` - - `, - title: 'Alle Gerate', - description: 'Web-App, iOS und Android. Deine Zeit wird uber alle Gerate synchronisiert.', - }, -]; ---- - -
-
- -
- - Funktionen - -

Produktiver arbeiten

-

- Clock bietet alle Tools, die du fur effektives Zeitmanagement brauchst. -

-
- - -
- { - features.map((feature) => ( -
-
- -
-

{feature.title}

-

{feature.description}

-
- )) - } -
-
-
diff --git a/apps-archived/clock/apps/landing/src/components/Footer.astro b/apps-archived/clock/apps/landing/src/components/Footer.astro deleted file mode 100644 index 603a48db8..000000000 --- a/apps-archived/clock/apps/landing/src/components/Footer.astro +++ /dev/null @@ -1,108 +0,0 @@ ---- -// Footer component - -const currentYear = new Date().getFullYear(); - -const links = { - product: [ - { name: 'Funktionen', href: '#features' }, - { name: 'Preise', href: '#pricing' }, - { name: 'Changelog', href: '/changelog' }, - { name: 'Roadmap', href: '/roadmap' }, - ], - legal: [ - { name: 'Impressum', href: '/impressum' }, - { name: 'Datenschutz', href: '/datenschutz' }, - { name: 'AGB', href: '/agb' }, - ], - support: [ - { name: 'FAQ', href: '/faq' }, - { name: 'Kontakt', href: '/kontakt' }, - { name: 'Status', href: '/status' }, - ], -}; ---- - - diff --git a/apps-archived/clock/apps/landing/src/components/Hero.astro b/apps-archived/clock/apps/landing/src/components/Hero.astro deleted file mode 100644 index 6f59d48de..000000000 --- a/apps-archived/clock/apps/landing/src/components/Hero.astro +++ /dev/null @@ -1,108 +0,0 @@ ---- -// Hero section for Clock landing page ---- - -
- -
- - -
- -
-
- -
- - - - Time Tracking & Focus -
- - -

- Nutze deine Zeit - effektiv -

- - -

- Pomodoro-Timer, Zeiterfassung und Focus-Sessions - steigere deine Produktivitat und behalte - den Uberblick uber deine Arbeitszeit. -

- - - - - -
-
- { - [1, 2, 3, 4, 5].map((i) => ( -
- )) - } -
-

- 300+ Nutzer tracken ihre Zeit -

-
-
- - -
-
-
-
-
-
-
-
-
-
- -
-
25:00
-
- - - -
-
- Focus - Short Break - Long Break -
-
-
-
-
-
-
diff --git a/apps-archived/clock/apps/landing/src/layouts/Layout.astro b/apps-archived/clock/apps/landing/src/layouts/Layout.astro deleted file mode 100644 index 07eb3c096..000000000 --- a/apps-archived/clock/apps/landing/src/layouts/Layout.astro +++ /dev/null @@ -1,58 +0,0 @@ ---- -import '../styles/global.css'; -import Analytics from '@manacore/shared-landing-ui/atoms/Analytics.astro'; - -interface Props { - title?: string; - description?: string; -} - -const { - title = 'Clock - Time Tracking & Focus', - description = 'Track your time, stay focused, and boost productivity. Pomodoro timer, time tracking, and focus sessions. Start free today.', -} = Astro.props; ---- - - - - - - - - - - - - - - - - - - - - - - - - - { - import.meta.env.PUBLIC_UMAMI_WEBSITE_ID && ( - `; - return html.replace('', `${envScript}`); - }, - }); - - setSecurityHeaders(response, { - connectSrc: [PUBLIC_MANA_CORE_AUTH_URL_CLIENT, PUBLIC_BACKEND_URL_CLIENT], - }); - - return response; -}; diff --git a/apps-archived/clock/apps/web/src/lib/api/alarms.ts b/apps-archived/clock/apps/web/src/lib/api/alarms.ts deleted file mode 100644 index a08041c97..000000000 --- a/apps-archived/clock/apps/web/src/lib/api/alarms.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Alarms API - Direct API calls for alarms - */ - -import { api } from './client'; -import type { Alarm, CreateAlarmInput, UpdateAlarmInput } from '@clock/shared'; - -export const alarmsApi = { - getAll: () => api.get('/alarms'), - getById: (id: string) => api.get(`/alarms/${id}`), - create: (input: CreateAlarmInput) => api.post('/alarms', input), - update: (id: string, input: UpdateAlarmInput) => api.patch(`/alarms/${id}`, input), - delete: (id: string) => api.delete(`/alarms/${id}`), - toggle: (id: string) => api.post(`/alarms/${id}/toggle`), -}; diff --git a/apps-archived/clock/apps/web/src/lib/api/client.ts b/apps-archived/clock/apps/web/src/lib/api/client.ts deleted file mode 100644 index 798c1b214..000000000 --- a/apps-archived/clock/apps/web/src/lib/api/client.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * API Client for Clock backend - * Uses @manacore/shared-api-client for consistent error handling - */ - -import { createApiClient, type ApiResult } from '@manacore/shared-api-client'; -import { authStore } from '$lib/stores/auth.svelte'; - -const API_URL = 'http://localhost:3017'; - -/** - * Clock API client instance - * - Auto token handling via authStore.getValidToken() - * - Consistent ApiResult response format - * - Automatic retry on server errors (configurable) - */ -export const api = createApiClient({ - baseUrl: API_URL, - apiPrefix: '/api/v1', - getAuthToken: () => authStore.getValidToken(), - timeout: 30000, - debug: import.meta.env.DEV, -}); - -// Re-export types for convenience -export type { ApiResult }; diff --git a/apps-archived/clock/apps/web/src/lib/api/timers.ts b/apps-archived/clock/apps/web/src/lib/api/timers.ts deleted file mode 100644 index d375ce198..000000000 --- a/apps-archived/clock/apps/web/src/lib/api/timers.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Timers API - Direct API calls for timers - */ - -import { api } from './client'; -import type { Timer, CreateTimerInput, UpdateTimerInput } from '@clock/shared'; - -export const timersApi = { - getAll: () => api.get('/timers'), - getById: (id: string) => api.get(`/timers/${id}`), - create: (input: CreateTimerInput) => api.post('/timers', input), - update: (id: string, input: UpdateTimerInput) => api.patch(`/timers/${id}`, input), - delete: (id: string) => api.delete(`/timers/${id}`), - start: (id: string) => api.post(`/timers/${id}/start`), - pause: (id: string) => api.post(`/timers/${id}/pause`), - reset: (id: string) => api.post(`/timers/${id}/reset`), -}; diff --git a/apps-archived/clock/apps/web/src/lib/components/AuthGateModal.svelte b/apps-archived/clock/apps/web/src/lib/components/AuthGateModal.svelte deleted file mode 100644 index 6f3c17552..000000000 --- a/apps-archived/clock/apps/web/src/lib/components/AuthGateModal.svelte +++ /dev/null @@ -1,226 +0,0 @@ - - -{#if open} - - -{/if} - - diff --git a/apps-archived/clock/apps/web/src/lib/components/WorldMap.svelte b/apps-archived/clock/apps/web/src/lib/components/WorldMap.svelte deleted file mode 100644 index dfdd221dc..000000000 --- a/apps-archived/clock/apps/web/src/lib/components/WorldMap.svelte +++ /dev/null @@ -1,111 +0,0 @@ - - -
- {#if mapLoaded} -
- - - - - - {#each cities as city} - {@const x = ((city.lng + 180) / 360) * 800} - {@const y = ((90 - city.lat) / 180) * 400} - {@const isSelected = selectedTimezones.includes(city.timezone)} - handleCityClick(city.timezone, city.city)}> - - {#if isSelected} - - {city.city} - - {/if} - - {/each} - -
- {:else} -
- Karte wird geladen... -
- {/if} -
- - diff --git a/apps-archived/clock/apps/web/src/lib/components/life-clock/CircularProgress.svelte b/apps-archived/clock/apps/web/src/lib/components/life-clock/CircularProgress.svelte deleted file mode 100644 index 8327c6928..000000000 --- a/apps-archived/clock/apps/web/src/lib/components/life-clock/CircularProgress.svelte +++ /dev/null @@ -1,204 +0,0 @@ - - -
-
- - - - - - - - - {#each Array(8) as _, i} - {@const angle = (i / 8) * 360 - 90} - {@const markerRadius = radius + strokeWidth / 2 + 8} - {@const x = size / 2 + markerRadius * Math.cos((angle * Math.PI) / 180)} - {@const y = size / 2 + markerRadius * Math.sin((angle * Math.PI) / 180)} - - {i * 10} - - {/each} - - - -
- {percentage.toFixed(1)}% - gelebt -
-
- -
-
-
- {daysLived.toLocaleString('de-DE')} - Tage gelebt -
-
-
- {remainingDays.toLocaleString('de-DE')} - Tage verbleibend -
-
-

Basierend auf {lifeExpectancyYears} Jahren Lebenserwartung

-
-
- - diff --git a/apps-archived/clock/apps/web/src/lib/components/skeletons/AlarmsSkeleton.svelte b/apps-archived/clock/apps/web/src/lib/components/skeletons/AlarmsSkeleton.svelte deleted file mode 100644 index 0c3ccd6c4..000000000 --- a/apps-archived/clock/apps/web/src/lib/components/skeletons/AlarmsSkeleton.svelte +++ /dev/null @@ -1,71 +0,0 @@ - - -
- -
- {#each Array(6) as _, i} -
- -
- {/each} -
- - -
- {#each Array(3) as _, i} -
-
- - -
- -
- {/each} -
-
- - diff --git a/apps-archived/clock/apps/web/src/lib/components/skeletons/AppLoadingSkeleton.svelte b/apps-archived/clock/apps/web/src/lib/components/skeletons/AppLoadingSkeleton.svelte deleted file mode 100644 index 21f6f848a..000000000 --- a/apps-archived/clock/apps/web/src/lib/components/skeletons/AppLoadingSkeleton.svelte +++ /dev/null @@ -1,90 +0,0 @@ - - -
- -
- -
- - -
- -
- - -
- -
- -
- - -
- -
-
-
- - diff --git a/apps-archived/clock/apps/web/src/lib/components/skeletons/TimersSkeleton.svelte b/apps-archived/clock/apps/web/src/lib/components/skeletons/TimersSkeleton.svelte deleted file mode 100644 index abf9d75ea..000000000 --- a/apps-archived/clock/apps/web/src/lib/components/skeletons/TimersSkeleton.svelte +++ /dev/null @@ -1,85 +0,0 @@ - - -
- -
- {#each Array(4) as _, i} - - {/each} -
- - -
- - -
- - -
- {#each Array(2) as _, i} -
-
- - -
-
- - -
-
- {/each} -
-
- - diff --git a/apps-archived/clock/apps/web/src/lib/components/skeletons/WorldClockSkeleton.svelte b/apps-archived/clock/apps/web/src/lib/components/skeletons/WorldClockSkeleton.svelte deleted file mode 100644 index 8c87cc6ad..000000000 --- a/apps-archived/clock/apps/web/src/lib/components/skeletons/WorldClockSkeleton.svelte +++ /dev/null @@ -1,58 +0,0 @@ - - -
- -
- -
- - -
- {#each Array(4) as _, i} -
-
- - -
- -
- {/each} -
-
- - diff --git a/apps-archived/clock/apps/web/src/lib/components/skeletons/index.ts b/apps-archived/clock/apps/web/src/lib/components/skeletons/index.ts deleted file mode 100644 index 1fdb0e411..000000000 --- a/apps-archived/clock/apps/web/src/lib/components/skeletons/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Clock App Skeleton Components - * - * App-specific skeleton loaders for loading states. - */ - -// App Loading Skeleton -export { default as AppLoadingSkeleton } from './AppLoadingSkeleton.svelte'; - -// Feature Skeletons -export { default as AlarmsSkeleton } from './AlarmsSkeleton.svelte'; -export { default as TimersSkeleton } from './TimersSkeleton.svelte'; -export { default as WorldClockSkeleton } from './WorldClockSkeleton.svelte'; diff --git a/apps-archived/clock/apps/web/src/lib/content/help/index.test.ts b/apps-archived/clock/apps/web/src/lib/content/help/index.test.ts deleted file mode 100644 index a1e31e35e..000000000 --- a/apps-archived/clock/apps/web/src/lib/content/help/index.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import { getClockHelpContent } from './index'; - -describe('Clock Help Content', () => { - it('returns valid German content', () => { - const content = getClockHelpContent('de'); - - expect(content.faq.length).toBeGreaterThan(0); - content.faq.forEach((faq) => { - expect(faq.id).toBeTruthy(); - expect(faq.question).toBeTruthy(); - expect(faq.answer).toBeTruthy(); - }); - - expect(content.features).toBeDefined(); - expect(content.contact).toBeDefined(); - expect(content.contact.supportEmail).toBe('support@mana.how'); - }); - - it('returns valid English content', () => { - const content = getClockHelpContent('en'); - - expect(content.faq.length).toBeGreaterThan(0); - content.faq.forEach((faq) => { - expect(faq.id).toBeTruthy(); - expect(faq.question).toBeTruthy(); - expect(faq.answer).toBeTruthy(); - }); - - expect(content.features).toBeDefined(); - expect(content.contact).toBeDefined(); - }); - - it('returns same number of FAQ items for both languages', () => { - const de = getClockHelpContent('de'); - const en = getClockHelpContent('en'); - - expect(de.faq.length).toBe(en.faq.length); - expect(de.features.length).toBe(en.features.length); - }); - - it('has unique FAQ IDs', () => { - const content = getClockHelpContent('de'); - const ids = content.faq.map((f) => f.id); - expect(new Set(ids).size).toBe(ids.length); - }); -}); diff --git a/apps-archived/clock/apps/web/src/lib/content/help/index.ts b/apps-archived/clock/apps/web/src/lib/content/help/index.ts deleted file mode 100644 index 4d0c24838..000000000 --- a/apps-archived/clock/apps/web/src/lib/content/help/index.ts +++ /dev/null @@ -1,215 +0,0 @@ -/** - * Help content for Clock app - */ - -import type { HelpContent } from '@manacore/help'; -import { getPrivacyFAQs } from '@manacore/help'; - -export function getClockHelpContent(locale: string): HelpContent { - const isDE = locale === 'de'; - - return { - faq: [ - { - id: 'faq-create-alarms', - question: isDE ? 'Wie erstelle ich Wecker?' : 'How do I create alarms?', - answer: isDE - ? '

Du kannst Wecker auf verschiedene Arten erstellen:

  • Schnellwecker: Drücke A oder klicke auf das + Symbol im Wecker-Tab
  • Uhrzeit wählen: Stelle Stunde und Minute ein und wähle die gewünschten Wochentage
  • Label: Gib deinem Wecker einen Namen, z.B. "Morgenroutine"
  • Klingelton: Wähle aus verschiedenen Tönen oder nutze einen sanften Weckton
' - : '

You can create alarms in several ways:

  • Quick alarm: Press A or click the + icon in the Alarms tab
  • Set time: Choose hour and minute and select the desired weekdays
  • Label: Give your alarm a name, e.g. "Morning routine"
  • Ringtone: Choose from various sounds or use a gentle wake-up tone
', - category: 'features', - order: 1, - language: isDE ? 'de' : 'en', - tags: isDE ? ['wecker', 'erstellen', 'neu'] : ['alarm', 'create', 'new'], - }, - { - id: 'faq-timers', - question: isDE - ? 'Wie funktionieren Timer und Stoppuhr?' - : 'How do timers and the stopwatch work?', - answer: isDE - ? '

Clock bietet zwei Zeitmesser:

  • Timer: Stelle eine Countdown-Zeit ein und starte ihn. Du kannst mehrere Timer gleichzeitig laufen lassen. Drücke T für einen neuen Timer.
  • Stoppuhr: Messe verstrichene Zeit mit Rundenzeiten. Starte, pausiere und setze zurück.

Beide laufen auch im Hintergrund weiter und benachrichtigen dich, wenn die Zeit abgelaufen ist.

' - : '

Clock offers two time measurement tools:

  • Timer: Set a countdown duration and start it. You can run multiple timers simultaneously. Press T for a new timer.
  • Stopwatch: Measure elapsed time with lap splits. Start, pause, and reset.

Both continue running in the background and notify you when time is up.

', - category: 'features', - order: 2, - language: isDE ? 'de' : 'en', - tags: isDE ? ['timer', 'stoppuhr', 'countdown'] : ['timer', 'stopwatch', 'countdown'], - }, - { - id: 'faq-pomodoro', - question: isDE ? 'Was ist die Pomodoro-Technik?' : 'What is the Pomodoro technique?', - answer: isDE - ? '

Die Pomodoro-Technik ist eine Zeitmanagement-Methode:

  1. Arbeite 25 Minuten konzentriert (ein "Pomodoro")
  2. Mache eine 5-Minuten-Pause
  3. Nach 4 Pomodoros: 15-30 Minuten längere Pause

In Clock kannst du die Intervalle anpassen, deinen Fortschritt verfolgen und Statistiken über deine Produktivität einsehen.

' - : '

The Pomodoro technique is a time management method:

  1. Work for 25 minutes with focus (one "Pomodoro")
  2. Take a 5-minute break
  3. After 4 Pomodoros: take a 15-30 minute longer break

In Clock you can customize the intervals, track your progress, and view statistics about your productivity.

', - category: 'features', - order: 3, - language: isDE ? 'de' : 'en', - tags: isDE - ? ['pomodoro', 'produktivität', 'fokus', 'technik'] - : ['pomodoro', 'productivity', 'focus', 'technique'], - }, - { - id: 'faq-life-clock', - question: isDE ? 'Was ist die Life Clock?' : 'What is the Life Clock?', - answer: isDE - ? '

Die Life Clock ist eine einzigartige Visualisierung deiner Lebenszeit:

  • Gib dein Geburtsdatum und deine geschätzte Lebenserwartung ein
  • Sieh, wie viel deiner Zeit bereits vergangen ist und wie viel noch vor dir liegt
  • Verschiedene Darstellungen: Wochen, Monate oder Jahre als Raster

Die Life Clock soll dich motivieren, deine Zeit bewusst zu nutzen — keine Angst, sondern Inspiration.

' - : '

The Life Clock is a unique visualization of your lifetime:

  • Enter your birth date and estimated life expectancy
  • See how much of your time has passed and how much lies ahead
  • Various display modes: weeks, months, or years as a grid

The Life Clock is meant to motivate you to use your time mindfully — not fear, but inspiration.

', - category: 'features', - order: 4, - language: isDE ? 'de' : 'en', - tags: isDE - ? ['life-clock', 'lebenszeit', 'visualisierung'] - : ['life-clock', 'lifetime', 'visualization'], - }, - ...getPrivacyFAQs(locale, { - dataTypeDE: 'Daten', - dataTypeEN: 'data', - extraBulletsDE: [ - 'Lokale Speicherung: Wecker und Timer werden lokal auf deinem Gerät gespeichert', - ], - extraBulletsEN: [ - 'Local storage: Alarms and timers are stored locally on your device', - ], - }), - ], - features: [ - { - id: 'feature-alarms', - title: isDE ? 'Wecker' : 'Alarms', - description: isDE - ? 'Erstelle wiederkehrende und einmalige Wecker mit individuellen Tönen' - : 'Create recurring and one-time alarms with custom sounds', - icon: '⏰', - category: 'core', - highlights: isDE - ? ['Wiederkehrende Wecker', 'Individuelle Töne', 'Schlummerfunktion', 'Labels'] - : ['Recurring alarms', 'Custom sounds', 'Snooze function', 'Labels'], - content: '', - order: 1, - language: isDE ? 'de' : 'en', - }, - { - id: 'feature-timers-stopwatch', - title: isDE ? 'Timer & Stoppuhr' : 'Timers & Stopwatch', - description: isDE - ? 'Mehrere gleichzeitige Timer und eine Stoppuhr mit Rundenzeiten' - : 'Multiple simultaneous timers and a stopwatch with lap times', - icon: '⏱️', - category: 'core', - highlights: isDE - ? ['Mehrere Timer', 'Rundenzeiten', 'Hintergrund-Benachrichtigung', 'Voreinstellungen'] - : ['Multiple timers', 'Lap times', 'Background notifications', 'Presets'], - content: '', - order: 2, - language: isDE ? 'de' : 'en', - }, - { - id: 'feature-pomodoro', - title: 'Pomodoro', - description: isDE - ? 'Steigere deine Produktivität mit der Pomodoro-Technik und Statistiken' - : 'Boost your productivity with the Pomodoro technique and statistics', - icon: '🍅', - category: 'advanced', - highlights: isDE - ? ['Anpassbare Intervalle', 'Sitzungs-Tracking', 'Statistiken', 'Benachrichtigungen'] - : ['Customizable intervals', 'Session tracking', 'Statistics', 'Notifications'], - content: '', - order: 3, - language: isDE ? 'de' : 'en', - }, - { - id: 'feature-world-clock', - title: isDE ? 'Weltzeituhr' : 'World Clock', - description: isDE - ? 'Behalte die Uhrzeit in verschiedenen Zeitzonen im Blick' - : 'Keep track of the time across different time zones', - icon: '🌍', - category: 'core', - highlights: isDE - ? ['Alle Zeitzonen', 'Zeitvergleich', 'Favoriten', 'Analoges Zifferblatt'] - : ['All time zones', 'Time comparison', 'Favorites', 'Analog clock face'], - content: '', - order: 4, - language: isDE ? 'de' : 'en', - }, - ], - shortcuts: [ - { - id: 'shortcuts-general', - category: 'general', - title: isDE ? 'Allgemein' : 'General', - language: isDE ? 'de' : 'en', - order: 1, - shortcuts: [ - { - shortcut: 'Cmd/Ctrl + K', - action: isDE ? 'Kommandoleiste öffnen' : 'Open command bar', - }, - { - shortcut: 'A', - action: isDE ? 'Neuer Wecker' : 'New alarm', - }, - { - shortcut: 'T', - action: isDE ? 'Neuer Timer' : 'New timer', - }, - ], - }, - { - id: 'shortcuts-navigation', - category: 'navigation', - title: 'Navigation', - language: isDE ? 'de' : 'en', - order: 2, - shortcuts: [ - { - shortcut: 'Cmd/Ctrl + 1', - action: isDE ? 'Wecker öffnen' : 'Open Alarms', - }, - { - shortcut: 'Cmd/Ctrl + 2', - action: isDE ? 'Timer öffnen' : 'Open Timers', - }, - { - shortcut: 'Cmd/Ctrl + 3', - action: isDE ? 'Stoppuhr öffnen' : 'Open Stopwatch', - }, - { - shortcut: 'Cmd/Ctrl + 4', - action: isDE ? 'Pomodoro öffnen' : 'Open Pomodoro', - }, - { - shortcut: 'Cmd/Ctrl + 5', - action: isDE ? 'Weltzeituhr öffnen' : 'Open World Clock', - }, - { - shortcut: 'Cmd/Ctrl + 6', - action: isDE ? 'Life Clock öffnen' : 'Open Life Clock', - }, - { - shortcut: 'Cmd/Ctrl + 7', - action: isDE ? 'Statistiken öffnen' : 'Open Statistics', - }, - { - shortcut: 'Cmd/Ctrl + 8', - action: isDE ? 'Einstellungen öffnen' : 'Open Settings', - }, - ], - }, - ], - gettingStarted: [], - changelog: [], - contact: { - id: 'contact-support', - title: isDE ? 'Support kontaktieren' : 'Contact Support', - content: isDE - ? '

Unser Support-Team hilft dir bei allen Fragen rund um Clock.

' - : '

Our support team is here to help you with any questions about Clock.

', - language: isDE ? 'de' : 'en', - order: 1, - supportEmail: 'support@mana.how', - documentationUrl: 'https://mana.how/docs', - responseTime: isDE ? 'Normalerweise innerhalb von 24 Stunden' : 'Usually within 24 hours', - }, - }; -} diff --git a/apps-archived/clock/apps/web/src/lib/data/guest-seed.ts b/apps-archived/clock/apps/web/src/lib/data/guest-seed.ts deleted file mode 100644 index 6739c7dc3..000000000 --- a/apps-archived/clock/apps/web/src/lib/data/guest-seed.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Guest seed data for the Clock app. - * - * These records are loaded into IndexedDB when a new guest visits the app. - * They provide sample alarms and world clocks to showcase the app. - */ - -import type { LocalAlarm, LocalWorldClock } from './local-store'; - -export const guestAlarms: LocalAlarm[] = [ - { - id: 'alarm-weekday-morning', - label: 'Wecker Wochentags', - time: '07:00', - enabled: true, - repeatDays: [1, 2, 3, 4, 5], // Mon-Fri - snoozeMinutes: 5, - sound: null, - vibrate: true, - }, -]; - -export const guestWorldClocks: LocalWorldClock[] = [ - { - id: 'wc-new-york', - timezone: 'America/New_York', - cityName: 'New York', - sortOrder: 0, - }, - { - id: 'wc-tokyo', - timezone: 'Asia/Tokyo', - cityName: 'Tokio', - sortOrder: 1, - }, -]; diff --git a/apps-archived/clock/apps/web/src/lib/data/local-store.ts b/apps-archived/clock/apps/web/src/lib/data/local-store.ts deleted file mode 100644 index 728302506..000000000 --- a/apps-archived/clock/apps/web/src/lib/data/local-store.ts +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Clock App — Local-First Data Layer - * - * Defines the IndexedDB database, collections, and guest seed data. - * This is the single source of truth for all Clock data. - */ - -import { createLocalStore, type BaseRecord } from '@manacore/local-store'; -import { guestAlarms, guestWorldClocks } from './guest-seed'; - -// ─── Types ────────────────────────────────────────────────── - -export interface LocalAlarm extends BaseRecord { - label: string | null; - time: string; // HH:mm format - enabled: boolean; - repeatDays: number[] | null; // [0-6] where 0 = Sunday - snoozeMinutes: number | null; - sound: string | null; - vibrate: boolean | null; -} - -export interface LocalTimer extends BaseRecord { - label: string | null; - durationSeconds: number; - remainingSeconds: number | null; - status: 'idle' | 'running' | 'paused' | 'finished'; - startedAt: string | null; - pausedAt: string | null; - sound: string | null; -} - -export interface LocalWorldClock extends BaseRecord { - timezone: string; // IANA timezone e.g. 'America/New_York' - cityName: string; - sortOrder: number; -} - -// ─── Store ────────────────────────────────────────────────── - -const SYNC_SERVER_URL = import.meta.env.PUBLIC_SYNC_SERVER_URL || 'http://localhost:3050'; - -export const clockStore = createLocalStore({ - appId: 'clock', - collections: [ - { - name: 'alarms', - indexes: ['enabled', 'time'], - guestSeed: guestAlarms, - }, - { - name: 'timers', - indexes: ['status'], - }, - { - name: 'worldClocks', - indexes: ['sortOrder', 'timezone'], - guestSeed: guestWorldClocks, - }, - ], - sync: { - serverUrl: SYNC_SERVER_URL, - }, -}); - -// Typed collection accessors -export const alarmCollection = clockStore.collection('alarms'); -export const timerCollection = clockStore.collection('timers'); -export const worldClockCollection = clockStore.collection('worldClocks'); diff --git a/apps-archived/clock/apps/web/src/lib/data/queries.ts b/apps-archived/clock/apps/web/src/lib/data/queries.ts deleted file mode 100644 index 88e9a4c61..000000000 --- a/apps-archived/clock/apps/web/src/lib/data/queries.ts +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Reactive Queries & Pure Helpers for Clock - * - * Uses Dexie liveQuery to automatically re-render when IndexedDB changes - * (local writes, sync updates, other tabs). Components call these hooks - * at init time; no manual fetch/refresh needed. - */ - -import { useLiveQueryWithDefault } from '@manacore/local-store/svelte'; -import { - alarmCollection, - timerCollection, - worldClockCollection, - type LocalAlarm, - type LocalTimer, - type LocalWorldClock, -} from './local-store'; -import type { Alarm, Timer, WorldClock } from '@clock/shared'; - -// ─── Type Converters ─────────────────────────────────────── - -export function toAlarm(local: LocalAlarm): Alarm { - return { - id: local.id, - userId: 'local', - label: local.label, - time: local.time, - enabled: local.enabled, - repeatDays: local.repeatDays, - snoozeMinutes: local.snoozeMinutes, - sound: local.sound, - vibrate: local.vibrate ?? null, - createdAt: local.createdAt ?? new Date().toISOString(), - updatedAt: local.updatedAt ?? new Date().toISOString(), - }; -} - -export function toTimer(local: LocalTimer): Timer { - return { - id: local.id, - userId: 'local', - label: local.label, - durationSeconds: local.durationSeconds, - remainingSeconds: local.remainingSeconds, - status: local.status, - startedAt: local.startedAt, - pausedAt: local.pausedAt, - sound: local.sound, - createdAt: local.createdAt ?? new Date().toISOString(), - updatedAt: local.updatedAt ?? new Date().toISOString(), - }; -} - -export function toWorldClock(local: LocalWorldClock): WorldClock { - return { - id: local.id, - userId: 'local', - timezone: local.timezone, - cityName: local.cityName, - sortOrder: local.sortOrder, - createdAt: local.createdAt ?? new Date().toISOString(), - }; -} - -// ─── Live Query Hooks (call during component init) ───────── - -/** All alarms, auto-updates on any change. */ -export function useAllAlarms() { - return useLiveQueryWithDefault(async () => { - const locals = await alarmCollection.getAll(); - return locals.map(toAlarm); - }, [] as Alarm[]); -} - -/** All timers, auto-updates on any change. */ -export function useAllTimers() { - return useLiveQueryWithDefault(async () => { - const locals = await timerCollection.getAll(); - return locals.map(toTimer); - }, [] as Timer[]); -} - -/** All world clocks, sorted by sortOrder. Auto-updates on any change. */ -export function useAllWorldClocks() { - return useLiveQueryWithDefault(async () => { - const locals = await worldClockCollection.getAll(undefined, { - sortBy: 'sortOrder', - sortDirection: 'asc', - }); - return locals.map(toWorldClock); - }, [] as WorldClock[]); -} - -// ─── Pure Filter Functions (for $derived) ────────────────── - -export function filterEnabledAlarms(alarms: Alarm[]): Alarm[] { - return alarms.filter((a) => a.enabled); -} - -export function filterActiveTimers(timers: Timer[]): Timer[] { - return timers.filter((t) => t.status === 'running' || t.status === 'paused'); -} - -export function sortWorldClocksByOrder(clocks: WorldClock[]): WorldClock[] { - return [...clocks].sort((a, b) => a.sortOrder - b.sortOrder); -} diff --git a/apps-archived/clock/apps/web/src/lib/i18n/index.ts b/apps-archived/clock/apps/web/src/lib/i18n/index.ts deleted file mode 100644 index e6c3a0023..000000000 --- a/apps-archived/clock/apps/web/src/lib/i18n/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { browser } from '$app/environment'; -import { init, register, locale, waitLocale } from 'svelte-i18n'; - -// List of supported locales -export const supportedLocales = ['de', 'en'] as const; -export type SupportedLocale = (typeof supportedLocales)[number]; - -// Default locale -const defaultLocale = 'de'; - -// Register all available locales -register('de', () => import('./locales/de.json')); -register('en', () => import('./locales/en.json')); - -// Get initial locale from browser or localStorage -function getInitialLocale(): SupportedLocale { - if (browser) { - // Check localStorage first - const stored = localStorage.getItem('clock_locale'); - if (stored && supportedLocales.includes(stored as SupportedLocale)) { - return stored as SupportedLocale; - } - - // Fall back to browser language - const browserLang = navigator.language.split('-')[0]; - if (supportedLocales.includes(browserLang as SupportedLocale)) { - return browserLang as SupportedLocale; - } - } - - return defaultLocale; -} - -// Initialize i18n at module scope (required for SSR) -init({ - fallbackLocale: defaultLocale, - initialLocale: getInitialLocale(), -}); - -// Set locale and persist to localStorage -export function setLocale(newLocale: SupportedLocale) { - locale.set(newLocale); - if (browser) { - localStorage.setItem('clock_locale', newLocale); - } -} - -// Wait for locale to be loaded (useful for SSR) -export { waitLocale }; diff --git a/apps-archived/clock/apps/web/src/lib/i18n/locales/de.json b/apps-archived/clock/apps/web/src/lib/i18n/locales/de.json deleted file mode 100644 index fc35180f9..000000000 --- a/apps-archived/clock/apps/web/src/lib/i18n/locales/de.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "name": "Clock" - }, - "common": { - "back": "Zurück", - "cancel": "Abbrechen", - "loading": "Lade..." - }, - "nav": { - "home": "Startseite", - "settings": "Einstellungen" - }, - "clock": { - "title": "Life Clock", - "remaining": "Verbleibende Zeit", - "elapsed": "Vergangene Zeit" - }, - "messages": { - "saved": "Gespeichert", - "error": "Ein Fehler ist aufgetreten" - } -} diff --git a/apps-archived/clock/apps/web/src/lib/i18n/locales/en.json b/apps-archived/clock/apps/web/src/lib/i18n/locales/en.json deleted file mode 100644 index f6f978137..000000000 --- a/apps-archived/clock/apps/web/src/lib/i18n/locales/en.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "name": "Clock" - }, - "common": { - "back": "Back", - "cancel": "Cancel", - "loading": "Loading..." - }, - "nav": { - "home": "Home", - "settings": "Settings" - }, - "clock": { - "title": "Life Clock", - "remaining": "Time remaining", - "elapsed": "Time elapsed" - }, - "messages": { - "saved": "Saved", - "error": "An error occurred" - } -} diff --git a/apps-archived/clock/apps/web/src/lib/stores/alarms.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/alarms.svelte.ts deleted file mode 100644 index e35201385..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/alarms.svelte.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Alarms Store — Mutation-Only Service - * - * All reads are handled by useLiveQuery() hooks in queries.ts. - * This store only provides write operations (create, update, delete, toggle). - * IndexedDB writes automatically trigger UI updates via Dexie liveQuery. - */ - -import { alarmCollection, type LocalAlarm } from '$lib/data/local-store'; -import { toAlarm } from '$lib/data/queries'; -import type { CreateAlarmInput, UpdateAlarmInput, Alarm } from '@clock/shared'; - -let error = $state(null); - -export const alarmsStore = { - get error() { - return error; - }, - - /** - * Create a new alarm -- writes to IndexedDB instantly. - */ - async createAlarm(input: CreateAlarmInput) { - error = null; - try { - const newLocal: LocalAlarm = { - id: crypto.randomUUID(), - label: input.label ?? null, - time: input.time, - enabled: input.enabled ?? true, - repeatDays: input.repeatDays ?? null, - snoozeMinutes: input.snoozeMinutes ?? null, - sound: input.sound ?? null, - vibrate: input.vibrate ?? null, - }; - - const inserted = await alarmCollection.insert(newLocal); - return { success: true, data: toAlarm(inserted) }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to create alarm'; - console.error('Failed to create alarm:', e); - return { success: false, error: error }; - } - }, - - /** - * Update an alarm -- writes to IndexedDB instantly. - */ - async updateAlarm(id: string, input: UpdateAlarmInput) { - error = null; - try { - const updateData: Partial = {}; - if (input.label !== undefined) updateData.label = input.label ?? null; - if (input.time !== undefined) updateData.time = input.time; - if (input.enabled !== undefined) updateData.enabled = input.enabled; - if (input.repeatDays !== undefined) updateData.repeatDays = input.repeatDays ?? null; - if (input.snoozeMinutes !== undefined) updateData.snoozeMinutes = input.snoozeMinutes ?? null; - if (input.sound !== undefined) updateData.sound = input.sound ?? null; - if (input.vibrate !== undefined) updateData.vibrate = input.vibrate ?? null; - - const updated = await alarmCollection.update(id, updateData); - if (updated) { - return { success: true, data: toAlarm(updated) }; - } - return { success: false, error: 'Alarm not found' }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to update alarm'; - console.error('Failed to update alarm:', e); - return { success: false, error: error }; - } - }, - - /** - * Toggle alarm enabled state. - */ - async toggleAlarm(id: string, currentAlarms: Alarm[]) { - const alarm = currentAlarms.find((a) => a.id === id); - if (!alarm) return { success: false, error: 'Alarm not found' }; - - return this.updateAlarm(id, { enabled: !alarm.enabled }); - }, - - /** - * Delete an alarm -- removes from IndexedDB instantly. - */ - async deleteAlarm(id: string) { - error = null; - try { - await alarmCollection.delete(id); - return { success: true }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to delete alarm'; - console.error('Failed to delete alarm:', e); - return { success: false, error: error }; - } - }, -}; diff --git a/apps-archived/clock/apps/web/src/lib/stores/app-onboarding.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/app-onboarding.svelte.ts deleted file mode 100644 index faf855557..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/app-onboarding.svelte.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { createAppOnboardingStore, type AppOnboardingStep } from '@manacore/shared-app-onboarding'; -import { userSettings } from './user-settings.svelte'; - -/** - * Clock-specific onboarding steps - */ -const clockOnboardingSteps: AppOnboardingStep[] = [ - { - id: 'features', - type: 'info', - question: 'Willkommen bei Clock!', - description: 'Das kann Clock für dich tun:', - emoji: '🕐', - gradient: { from: 'blue-500', to: 'blue-700' }, - bullets: [ - 'Flexible Timer & Stoppuhr', - 'Pomodoro-Technik für produktives Arbeiten', - 'Voreingestellte Timer-Dauern', - 'Minimalistisches Design', - ], - }, - { - id: 'defaultTimer', - type: 'select', - question: 'Welche Timer-Dauer nutzt du am häufigsten?', - description: 'Du kannst Timer jederzeit individuell einstellen.', - emoji: '⏱️', - gradient: { from: 'blue-500', to: 'blue-700' }, - options: [ - { - id: '5', - label: '5 Minuten', - description: 'Für kurze Pausen', - emoji: '⚡', - }, - { - id: '15', - label: '15 Minuten', - description: 'Für konzentrierte Einheiten', - emoji: '🎯', - }, - { - id: '25', - label: '25 Minuten', - description: 'Pomodoro-Technik (Empfohlen)', - emoji: '🍅', - }, - { - id: '45', - label: '45 Minuten', - description: 'Für längere Arbeitsphasen', - emoji: '🧘', - }, - ], - defaultValue: '25', - }, - { - id: 'welcome', - type: 'info', - question: 'Deine Uhr ist bereit!', - description: 'Hier sind einige Tipps:', - emoji: '🎉', - gradient: { from: 'primary', to: 'primary/70' }, - bullets: [ - 'Nutze die Stoppuhr für freie Zeitmessung', - 'Stelle Wecker für wichtige Erinnerungen', - 'Die Weltuhr zeigt mehrere Zeitzonen gleichzeitig', - 'Drücke Cmd/Ctrl+K für die Schnellsuche', - ], - }, -]; - -/** - * Clock app onboarding store - */ -export const clockOnboarding = createAppOnboardingStore({ - appId: 'clock', - steps: clockOnboardingSteps, - userSettings, - onComplete: async () => {}, - onSkip: async () => {}, -}); diff --git a/apps-archived/clock/apps/web/src/lib/stores/auth.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/auth.svelte.ts deleted file mode 100644 index 5f0483975..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/auth.svelte.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Auth Store — uses centralized Mana auth factory. - */ - -import { createManaAuthStore } from '@manacore/shared-auth-stores'; - -export const authStore = createManaAuthStore({ - devBackendPort: 3017, -}); diff --git a/apps-archived/clock/apps/web/src/lib/stores/navigation.ts b/apps-archived/clock/apps/web/src/lib/stores/navigation.ts deleted file mode 100644 index 08ea3eeec..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/navigation.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createSimpleNavigationStores } from '@manacore/shared-stores'; - -export const { isNavCollapsed } = createSimpleNavigationStores({ - storageKey: 'clock', -}); diff --git a/apps-archived/clock/apps/web/src/lib/stores/session-alarms.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/session-alarms.svelte.ts deleted file mode 100644 index 04e334e34..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/session-alarms.svelte.ts +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Session Alarms Store - Manages alarms in sessionStorage for guest users - * This allows users to try the app without signing in. - * Data is stored in sessionStorage (lost when tab closes). - */ - -import type { Alarm, CreateAlarmInput, UpdateAlarmInput } from '@clock/shared'; - -const STORAGE_KEY = 'clock-session-alarms'; - -// State -let alarms = $state([]); - -// Generate session ID -function generateSessionId(): string { - return `session_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`; -} - -// Load from sessionStorage -function loadFromStorage(): void { - if (typeof window === 'undefined') return; - - try { - const stored = sessionStorage.getItem(STORAGE_KEY); - if (stored) { - alarms = JSON.parse(stored); - } - } catch (e) { - console.error('Failed to load session alarms:', e); - } -} - -// Save to sessionStorage -function saveToStorage(): void { - if (typeof window === 'undefined') return; - - try { - sessionStorage.setItem(STORAGE_KEY, JSON.stringify(alarms)); - } catch (e) { - console.error('Failed to save session alarms:', e); - } -} - -// Initialize on load -if (typeof window !== 'undefined') { - loadFromStorage(); -} - -export const sessionAlarmsStore = { - // Getters - get alarms() { - return alarms; - }, - get enabledAlarms() { - return alarms.filter((a) => a.enabled); - }, - - /** - * Create a new session alarm - */ - createAlarm(input: CreateAlarmInput): Alarm { - const now = new Date().toISOString(); - const alarm: Alarm = { - id: generateSessionId(), - userId: 'guest', - label: input.label || null, - time: input.time, - enabled: input.enabled ?? true, - repeatDays: input.repeatDays || null, - snoozeMinutes: input.snoozeMinutes || null, - sound: input.sound || null, - vibrate: input.vibrate ?? null, - createdAt: now, - updatedAt: now, - }; - - alarms = [...alarms, alarm]; - saveToStorage(); - - return alarm; - }, - - /** - * Update a session alarm - */ - updateAlarm(id: string, input: UpdateAlarmInput): Alarm | null { - const index = alarms.findIndex((a) => a.id === id); - if (index === -1) return null; - - const updated: Alarm = { - ...alarms[index], - ...input, - updatedAt: new Date().toISOString(), - }; - - alarms = alarms.map((a) => (a.id === id ? updated : a)); - saveToStorage(); - - return updated; - }, - - /** - * Toggle alarm enabled state - */ - toggleAlarm(id: string): Alarm | null { - const alarm = alarms.find((a) => a.id === id); - if (!alarm) return null; - - return this.updateAlarm(id, { enabled: !alarm.enabled }); - }, - - /** - * Delete a session alarm - */ - deleteAlarm(id: string): void { - alarms = alarms.filter((a) => a.id !== id); - saveToStorage(); - }, - - /** - * Check if ID is a session alarm - */ - isSessionAlarm(id: string): boolean { - return id.startsWith('session_'); - }, - - /** - * Get all alarms for migration - */ - getAllAlarms(): Alarm[] { - return [...alarms]; - }, - - /** - * Clear all session data - */ - clear(): void { - alarms = []; - if (typeof window !== 'undefined') { - sessionStorage.removeItem(STORAGE_KEY); - } - }, - - /** - * Get count of session alarms - */ - get count(): number { - return alarms.length; - }, -}; diff --git a/apps-archived/clock/apps/web/src/lib/stores/session-timers.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/session-timers.svelte.ts deleted file mode 100644 index d2953a383..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/session-timers.svelte.ts +++ /dev/null @@ -1,214 +0,0 @@ -/** - * Session Timers Store - Manages timers in sessionStorage for guest users - * This allows users to try the app without signing in. - * Data is stored in sessionStorage (lost when tab closes). - */ - -import type { Timer, CreateTimerInput, UpdateTimerInput, TimerStatus } from '@clock/shared'; - -const STORAGE_KEY = 'clock-session-timers'; - -// State -let timers = $state([]); - -// Generate session ID -function generateSessionId(): string { - return `session_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`; -} - -// Load from sessionStorage -function loadFromStorage(): void { - if (typeof window === 'undefined') return; - - try { - const stored = sessionStorage.getItem(STORAGE_KEY); - if (stored) { - timers = JSON.parse(stored); - } - } catch (e) { - console.error('Failed to load session timers:', e); - } -} - -// Save to sessionStorage -function saveToStorage(): void { - if (typeof window === 'undefined') return; - - try { - sessionStorage.setItem(STORAGE_KEY, JSON.stringify(timers)); - } catch (e) { - console.error('Failed to save session timers:', e); - } -} - -// Initialize on load -if (typeof window !== 'undefined') { - loadFromStorage(); -} - -export const sessionTimersStore = { - // Getters - get timers() { - return timers; - }, - get activeTimers() { - return timers.filter((t) => t.status === 'running' || t.status === 'paused'); - }, - - /** - * Create a new session timer - */ - createTimer(input: CreateTimerInput): Timer { - const now = new Date().toISOString(); - const timer: Timer = { - id: generateSessionId(), - userId: 'guest', - label: input.label || null, - durationSeconds: input.durationSeconds, - remainingSeconds: input.durationSeconds, - status: 'idle' as TimerStatus, - startedAt: null, - pausedAt: null, - sound: input.sound || null, - createdAt: now, - updatedAt: now, - }; - - timers = [...timers, timer]; - saveToStorage(); - - return timer; - }, - - /** - * Update a session timer - */ - updateTimer(id: string, input: UpdateTimerInput): Timer | null { - const index = timers.findIndex((t) => t.id === id); - if (index === -1) return null; - - const updated: Timer = { - ...timers[index], - ...input, - updatedAt: new Date().toISOString(), - }; - - timers = timers.map((t) => (t.id === id ? updated : t)); - saveToStorage(); - - return updated; - }, - - /** - * Start a timer - */ - startTimer(id: string): Timer | null { - const timer = timers.find((t) => t.id === id); - if (!timer) return null; - - const now = new Date().toISOString(); - const updated: Timer = { - ...timer, - status: 'running', - startedAt: now, - pausedAt: null, - updatedAt: now, - }; - - timers = timers.map((t) => (t.id === id ? updated : t)); - saveToStorage(); - - return updated; - }, - - /** - * Pause a timer - */ - pauseTimer(id: string): Timer | null { - const timer = timers.find((t) => t.id === id); - if (!timer) return null; - - const now = new Date().toISOString(); - const updated: Timer = { - ...timer, - status: 'paused', - pausedAt: now, - updatedAt: now, - }; - - timers = timers.map((t) => (t.id === id ? updated : t)); - saveToStorage(); - - return updated; - }, - - /** - * Reset a timer - */ - resetTimer(id: string): Timer | null { - const timer = timers.find((t) => t.id === id); - if (!timer) return null; - - const now = new Date().toISOString(); - const updated: Timer = { - ...timer, - status: 'idle', - remainingSeconds: timer.durationSeconds, - startedAt: null, - pausedAt: null, - updatedAt: now, - }; - - timers = timers.map((t) => (t.id === id ? updated : t)); - saveToStorage(); - - return updated; - }, - - /** - * Update local timer state (for countdown display) - */ - updateLocalState(id: string, updates: Partial): void { - timers = timers.map((t) => (t.id === id ? { ...t, ...updates } : t)); - saveToStorage(); - }, - - /** - * Delete a session timer - */ - deleteTimer(id: string): void { - timers = timers.filter((t) => t.id !== id); - saveToStorage(); - }, - - /** - * Check if ID is a session timer - */ - isSessionTimer(id: string): boolean { - return id.startsWith('session_'); - }, - - /** - * Get all timers for migration - */ - getAllTimers(): Timer[] { - return [...timers]; - }, - - /** - * Clear all session data - */ - clear(): void { - timers = []; - if (typeof window !== 'undefined') { - sessionStorage.removeItem(STORAGE_KEY); - } - }, - - /** - * Get count of session timers - */ - get count(): number { - return timers.length; - }, -}; diff --git a/apps-archived/clock/apps/web/src/lib/stores/stopwatch.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/stopwatch.svelte.ts deleted file mode 100644 index 5573dfbc8..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/stopwatch.svelte.ts +++ /dev/null @@ -1,231 +0,0 @@ -/** - * Stopwatch Store - Manages stopwatch state using Svelte 5 runes - * Stopwatches are local-only (no backend sync) - */ - -export interface Lap { - number: number; - time: number; // milliseconds since start - delta: number; // milliseconds since last lap -} - -export interface Stopwatch { - id: string; - label: string; - startTime: number | null; // timestamp when started - elapsedTime: number; // accumulated milliseconds when paused - status: 'idle' | 'running' | 'paused'; - laps: Lap[]; - color: string; -} - -export const STOPWATCH_COLORS = [ - '#3B82F6', // blue - '#10B981', // green - '#F59E0B', // amber - '#EF4444', // red - '#8B5CF6', // violet - '#EC4899', // pink - '#14B8A6', // teal - '#F97316', // orange -]; - -// State -let stopwatches = $state([]); -let focusedId = $state(null); -let colorIndex = 0; - -// Tick interval for updating display -let tickInterval: ReturnType | null = null; - -function getNextColor(): string { - const color = STOPWATCH_COLORS[colorIndex % STOPWATCH_COLORS.length]; - colorIndex++; - return color; -} - -function startTicking() { - if (tickInterval) return; - tickInterval = setInterval(() => { - // Force reactivity update by reassigning - stopwatches = [...stopwatches]; - }, 100); -} - -function stopTickingIfNoRunning() { - const hasRunning = stopwatches.some((sw) => sw.status === 'running'); - if (!hasRunning && tickInterval) { - clearInterval(tickInterval); - tickInterval = null; - } -} - -export const stopwatchesStore = { - // Getters - get stopwatches() { - return stopwatches; - }, - get focusedId() { - return focusedId; - }, - get focusedStopwatch() { - return stopwatches.find((sw) => sw.id === focusedId) || null; - }, - - /** - * Create a new stopwatch - */ - create(label?: string): string { - const id = crypto.randomUUID(); - const newStopwatch: Stopwatch = { - id, - label: label || `Stopwatch ${stopwatches.length + 1}`, - startTime: null, - elapsedTime: 0, - status: 'idle', - laps: [], - color: getNextColor(), - }; - stopwatches = [...stopwatches, newStopwatch]; - if (!focusedId) { - focusedId = id; - } - return id; - }, - - /** - * Start a stopwatch - */ - start(id: string) { - stopwatches = stopwatches.map((sw) => { - if (sw.id !== id) return sw; - return { - ...sw, - startTime: Date.now(), - status: 'running' as const, - }; - }); - startTicking(); - }, - - /** - * Pause a stopwatch - */ - pause(id: string) { - stopwatches = stopwatches.map((sw) => { - if (sw.id !== id || sw.status !== 'running') return sw; - const elapsed = sw.startTime ? Date.now() - sw.startTime : 0; - return { - ...sw, - startTime: null, - elapsedTime: sw.elapsedTime + elapsed, - status: 'paused' as const, - }; - }); - stopTickingIfNoRunning(); - }, - - /** - * Reset a stopwatch - */ - reset(id: string) { - stopwatches = stopwatches.map((sw) => { - if (sw.id !== id) return sw; - return { - ...sw, - startTime: null, - elapsedTime: 0, - status: 'idle' as const, - laps: [], - }; - }); - stopTickingIfNoRunning(); - }, - - /** - * Add a lap to a stopwatch - */ - addLap(id: string) { - stopwatches = stopwatches.map((sw) => { - if (sw.id !== id || sw.status !== 'running') return sw; - const currentTime = this.getElapsed(sw); - const lastLap = sw.laps[sw.laps.length - 1]; - const delta = lastLap ? currentTime - lastLap.time : currentTime; - const newLap: Lap = { - number: sw.laps.length + 1, - time: currentTime, - delta, - }; - return { - ...sw, - laps: [...sw.laps, newLap], - }; - }); - }, - - /** - * Delete a stopwatch - */ - delete(id: string) { - stopwatches = stopwatches.filter((sw) => sw.id !== id); - if (focusedId === id) { - focusedId = stopwatches[0]?.id || null; - } - stopTickingIfNoRunning(); - }, - - /** - * Set focused stopwatch - */ - setFocused(id: string | null) { - focusedId = id; - }, - - /** - * Update stopwatch label - */ - updateLabel(id: string, label: string) { - stopwatches = stopwatches.map((sw) => (sw.id === id ? { ...sw, label } : sw)); - }, - - /** - * Get elapsed time for a stopwatch - */ - getElapsed(sw: Stopwatch): number { - if (sw.status === 'running' && sw.startTime) { - return sw.elapsedTime + (Date.now() - sw.startTime); - } - return sw.elapsedTime; - }, -}; - -/** - * Format time in milliseconds to display string - */ -export function formatTime(ms: number): string { - const totalSeconds = Math.floor(ms / 1000); - const hours = Math.floor(totalSeconds / 3600); - const minutes = Math.floor((totalSeconds % 3600) / 60); - const seconds = totalSeconds % 60; - const centiseconds = Math.floor((ms % 1000) / 10); - - if (hours > 0) { - return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${centiseconds.toString().padStart(2, '0')}`; - } - return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${centiseconds.toString().padStart(2, '0')}`; -} - -/** - * Format lap time (delta) for display - */ -export function formatLapTime(ms: number): string { - const totalSeconds = Math.floor(ms / 1000); - const minutes = Math.floor(totalSeconds / 60); - const seconds = totalSeconds % 60; - const centiseconds = Math.floor((ms % 1000) / 10); - - if (minutes > 0) { - return `+${minutes}:${seconds.toString().padStart(2, '0')}.${centiseconds.toString().padStart(2, '0')}`; - } - return `+${seconds}.${centiseconds.toString().padStart(2, '0')}`; -} diff --git a/apps-archived/clock/apps/web/src/lib/stores/tags.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/tags.svelte.ts deleted file mode 100644 index 074782375..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/tags.svelte.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Tag Store — Local-First via Shared Tag Store - * Tags are stored in shared IndexedDB ('manacore-tags'), accessible across all apps. - * Use context ('tags') for reads, tagMutations for writes. - */ -export { - tagMutations, - useAllTags, - getTagById, - getTagsByIds, - getTagColor, - getTagsByGroup, -} from '@manacore/shared-stores'; diff --git a/apps-archived/clock/apps/web/src/lib/stores/theme.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/theme.svelte.ts deleted file mode 100644 index 5784cfeec..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/theme.svelte.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createThemeStore } from '@manacore/shared-theme'; - -// Create theme store with Clock's styling -export const theme = createThemeStore({ - appId: 'clock', - defaultVariant: 'lume', -}); diff --git a/apps-archived/clock/apps/web/src/lib/stores/timers.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/timers.svelte.ts deleted file mode 100644 index 0c5e3441e..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/timers.svelte.ts +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Timers Store — Mutation-Only Service - * - * All reads are handled by useLiveQuery() hooks in queries.ts. - * This store only provides write operations (create, update, delete, start, pause, reset). - * IndexedDB writes automatically trigger UI updates via Dexie liveQuery. - */ - -import { timerCollection, type LocalTimer } from '$lib/data/local-store'; -import { toTimer } from '$lib/data/queries'; -import type { CreateTimerInput, UpdateTimerInput } from '@clock/shared'; -import { ClockEvents } from '@manacore/shared-utils/analytics'; - -let error = $state(null); - -export const timersStore = { - get error() { - return error; - }, - - /** - * Create a new timer -- writes to IndexedDB instantly. - */ - async createTimer(input: CreateTimerInput) { - error = null; - try { - const newLocal: LocalTimer = { - id: crypto.randomUUID(), - label: input.label ?? null, - durationSeconds: input.durationSeconds, - remainingSeconds: null, - status: 'idle', - startedAt: null, - pausedAt: null, - sound: input.sound ?? null, - }; - - const inserted = await timerCollection.insert(newLocal); - return { success: true, data: toTimer(inserted) }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to create timer'; - console.error('Failed to create timer:', e); - return { success: false, error: error }; - } - }, - - /** - * Update a timer -- writes to IndexedDB instantly. - */ - async updateTimer(id: string, input: UpdateTimerInput) { - error = null; - try { - const updateData: Partial = {}; - if (input.label !== undefined) updateData.label = input.label ?? null; - if (input.durationSeconds !== undefined) updateData.durationSeconds = input.durationSeconds; - if (input.sound !== undefined) updateData.sound = input.sound ?? null; - - const updated = await timerCollection.update(id, updateData); - if (updated) { - return { success: true, data: toTimer(updated) }; - } - return { success: false, error: 'Timer not found' }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to update timer'; - console.error('Failed to update timer:', e); - return { success: false, error: error }; - } - }, - - /** - * Start a timer -- sets status to running with current timestamp. - */ - async startTimer(id: string) { - error = null; - try { - const existing = await timerCollection.get(id); - if (!existing) return { success: false, error: 'Timer not found' }; - - const updateData: Partial = { - status: 'running', - startedAt: new Date().toISOString(), - pausedAt: null, - }; - - // If resuming from pause, keep remaining seconds - if (existing.status !== 'paused') { - updateData.remainingSeconds = existing.durationSeconds; - } - - const updated = await timerCollection.update(id, updateData); - if (updated) { - const updatedTimer = toTimer(updated); - ClockEvents.timerStarted( - (updatedTimer as any).type as 'pomodoro' | 'stopwatch' | 'countdown' - ); - return { success: true, data: updatedTimer }; - } - return { success: false, error: 'Timer not found' }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to start timer'; - console.error('Failed to start timer:', e); - return { success: false, error: error }; - } - }, - - /** - * Pause a timer -- calculates remaining seconds and saves. - */ - async pauseTimer(id: string) { - error = null; - try { - const existing = await timerCollection.get(id); - if (!existing) return { success: false, error: 'Timer not found' }; - - // Calculate remaining seconds - let remaining = existing.remainingSeconds ?? existing.durationSeconds; - if (existing.startedAt) { - const elapsed = (Date.now() - new Date(existing.startedAt).getTime()) / 1000; - remaining = Math.max(0, remaining - elapsed); - } - - const updateData: Partial = { - status: 'paused', - pausedAt: new Date().toISOString(), - remainingSeconds: Math.round(remaining), - startedAt: null, - }; - - const updated = await timerCollection.update(id, updateData); - if (updated) { - return { success: true, data: toTimer(updated) }; - } - return { success: false, error: 'Timer not found' }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to pause timer'; - console.error('Failed to pause timer:', e); - return { success: false, error: error }; - } - }, - - /** - * Reset a timer -- back to idle with full duration. - */ - async resetTimer(id: string) { - error = null; - try { - const updateData: Partial = { - status: 'idle', - remainingSeconds: null, - startedAt: null, - pausedAt: null, - }; - - const updated = await timerCollection.update(id, updateData); - if (updated) { - return { success: true, data: toTimer(updated) }; - } - return { success: false, error: 'Timer not found' }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to reset timer'; - console.error('Failed to reset timer:', e); - return { success: false, error: error }; - } - }, - - /** - * Delete a timer -- removes from IndexedDB instantly. - */ - async deleteTimer(id: string) { - error = null; - try { - await timerCollection.delete(id); - return { success: true }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to delete timer'; - console.error('Failed to delete timer:', e); - return { success: false, error: error }; - } - }, - - /** - * Update remaining seconds in IndexedDB (for countdown display). - */ - async updateLocalTimer(id: string, remainingSeconds: number) { - try { - await timerCollection.update(id, { remainingSeconds }); - } catch (e) { - console.error('Failed to update local timer:', e); - } - }, -}; diff --git a/apps-archived/clock/apps/web/src/lib/stores/user-settings.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/user-settings.svelte.ts deleted file mode 100644 index d28b67ea6..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/user-settings.svelte.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * User Settings Store for Clock - * - * This store syncs settings with mana-core-auth and provides: - * - Global settings that apply to all apps - * - Per-app overrides for customization - * - localStorage caching for offline support - */ - -import { browser } from '$app/environment'; -import { createUserSettingsStore } from '@manacore/shared-theme'; -import { authStore } from './auth.svelte'; - -// Get auth URL dynamically at runtime -function getAuthUrl(): string { - if (browser && typeof window !== 'undefined') { - const injectedUrl = (window as unknown as { __PUBLIC_MANA_CORE_AUTH_URL__?: string }) - .__PUBLIC_MANA_CORE_AUTH_URL__; - if (injectedUrl) return injectedUrl; - } - return import.meta.env.DEV ? 'http://localhost:3001' : ''; -} - -export const userSettings = createUserSettingsStore({ - appId: 'clock', - authUrl: getAuthUrl, - getAccessToken: () => authStore.getAccessToken(), -}); diff --git a/apps-archived/clock/apps/web/src/lib/stores/world-clocks.svelte.ts b/apps-archived/clock/apps/web/src/lib/stores/world-clocks.svelte.ts deleted file mode 100644 index 252468d9a..000000000 --- a/apps-archived/clock/apps/web/src/lib/stores/world-clocks.svelte.ts +++ /dev/null @@ -1,74 +0,0 @@ -/** - * World Clocks Store — Mutation-Only Service - * - * All reads are handled by useLiveQuery() hooks in queries.ts. - * This store only provides write operations (add, remove, reorder). - * IndexedDB writes automatically trigger UI updates via Dexie liveQuery. - */ - -import { worldClockCollection, type LocalWorldClock } from '$lib/data/local-store'; -import type { CreateWorldClockInput, WorldClock } from '@clock/shared'; - -let error = $state(null); - -export const worldClocksStore = { - get error() { - return error; - }, - - /** - * Add a new world clock -- writes to IndexedDB instantly. - */ - async addWorldClock(input: CreateWorldClockInput, currentCount: number = 0) { - error = null; - try { - const newLocal: LocalWorldClock = { - id: crypto.randomUUID(), - timezone: input.timezone, - cityName: input.cityName, - sortOrder: currentCount, - }; - - await worldClockCollection.insert(newLocal); - return { success: true }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to add world clock'; - console.error('Failed to add world clock:', e); - return { success: false, error: error }; - } - }, - - /** - * Remove a world clock -- removes from IndexedDB instantly. - */ - async removeWorldClock(id: string) { - error = null; - try { - await worldClockCollection.delete(id); - return { success: true }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to remove world clock'; - console.error('Failed to remove world clock:', e); - return { success: false, error: error }; - } - }, - - /** - * Reorder world clocks -- updates sortOrder in IndexedDB. - */ - async reorder(ids: string[]) { - error = null; - try { - for (let i = 0; i < ids.length; i++) { - await worldClockCollection.update(ids[i], { - sortOrder: i, - } as Partial); - } - return { success: true }; - } catch (e) { - error = e instanceof Error ? e.message : 'Failed to reorder world clocks'; - console.error('Failed to reorder world clocks:', e); - return { success: false, error: error }; - } - }, -}; diff --git a/apps-archived/clock/apps/web/src/lib/version.ts b/apps-archived/clock/apps/web/src/lib/version.ts deleted file mode 100644 index d63b4cfef..000000000 --- a/apps-archived/clock/apps/web/src/lib/version.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const APP_VERSION = '0.2.0'; -export const BUILD_TIME: string = - typeof __BUILD_TIME__ !== 'undefined' ? __BUILD_TIME__ : new Date().toISOString(); -export const BUILD_HASH: string = typeof __BUILD_HASH__ !== 'undefined' ? __BUILD_HASH__ : 'dev'; diff --git a/apps-archived/clock/apps/web/src/routes/(app)/+layout.svelte b/apps-archived/clock/apps/web/src/routes/(app)/+layout.svelte deleted file mode 100644 index 79c8a9c38..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/+layout.svelte +++ /dev/null @@ -1,465 +0,0 @@ - - - - - -
- - - - {#if isTagStripVisible} - ({ - id: t.id, - name: t.name, - color: t.color || '#3b82f6', - }))} - selectedIds={[]} - onToggle={() => {}} - onClear={() => {}} - managementHref="/tags" - /> - {/if} - -
-
- {@render children()} -
-
- - - (commandBarOpen = false)} - onSearch={handleCommandBarSearch} - onSelect={handleCommandBarSelect} - quickActions={commandBarQuickActions} - placeholder="Schnellzugriff..." - emptyText="Keine Ergebnisse" - searchingText="Suche..." - /> -
- - - {#if clockOnboarding.shouldShow} - - {/if} - - - (showGuestWelcome = false)} - onLogin={() => goto('/login')} - onRegister={() => goto('/register')} - locale={($locale || 'de') === 'de' ? 'de' : 'en'} - /> - - {#if authStore.isAuthenticated} - - {/if} - -
- - diff --git a/apps-archived/clock/apps/web/src/routes/(app)/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/+page.svelte deleted file mode 100644 index 74d5d5739..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/+page.svelte +++ /dev/null @@ -1,115 +0,0 @@ - - - - Clock - Dashboard - - -{#if isLoading} - -{:else} -
-
-

Clock

-

Dein Zeit-Management Hub

-
- - -
-
-
- -
-
-
- {new Date().toLocaleTimeString('de-DE', { - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - })} -
-
- {new Date().toLocaleDateString('de-DE', { - weekday: 'long', - year: 'numeric', - month: 'long', - day: 'numeric', - })} -
-
-
-
- - -
- {#each quickLinks as link} - -
-
- -
-
-
{link.label}
-
{link.description}
-
-
-
- {/each} -
-
-{/if} - - diff --git a/apps-archived/clock/apps/web/src/routes/(app)/alarms/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/alarms/+page.svelte deleted file mode 100644 index eb35d0c02..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/alarms/+page.svelte +++ /dev/null @@ -1,323 +0,0 @@ - - - - -
- -
- - - - -
- - {#if showOptions} -
- {#each dayNames as day, i} - - {/each} -
- {/if} - - -
- {#each DEFAULT_ALARM_PRESETS as preset} - {@const existingAlarm = findAlarmForPreset(preset.time)} - {@const isActive = existingAlarm?.enabled ?? false} -
togglePreset(preset.time, preset.label)} - onkeydown={(e) => e.key === 'Enter' && togglePreset(preset.time, preset.label)} - > -
- {preset.time} -
-
- {existingAlarm?.label || preset.label} -
-
- {/each} -
- - - {#if allAlarms.value.filter((a) => !DEFAULT_ALARM_PRESETS.some((p) => p.time === a.time.slice(0, 5))).length > 0} - {@const customAlarms = allAlarms.value.filter( - (a) => !DEFAULT_ALARM_PRESETS.some((p) => p.time === a.time.slice(0, 5)) - )} -
-

- {$_('alarm.custom')} -

-
- {#each customAlarms as alarm (alarm.id)} -
handleToggle(alarm.id)} - onkeydown={(e) => e.key === 'Enter' && handleToggle(alarm.id)} - > -
- {alarm.time.slice(0, 5)} -
-
- {alarm.label || getRepeatText(alarm.repeatDays)} -
-
- {/each} -
-
- {/if} - - - {#if showEditModal} -
-
-

{$_('alarm.edit')}

- -
{ - e.preventDefault(); - handleEditSubmit(); - }} - > - -
- - -
- - -
- - -
- - -
- -
- {#each dayNames as day, i} - - {/each} -
-
- - -
- - -
- - -
- - -
- - -
- - -
-
-
-
- {/if} -
diff --git a/apps-archived/clock/apps/web/src/routes/(app)/feedback/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/feedback/+page.svelte deleted file mode 100644 index 83db9757e..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/feedback/+page.svelte +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/apps-archived/clock/apps/web/src/routes/(app)/help/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/help/+page.svelte deleted file mode 100644 index 535f3fa9d..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/help/+page.svelte +++ /dev/null @@ -1,32 +0,0 @@ - - - - {translations.title} | Clock - - - goto('/')} - showGettingStarted={false} - showChangelog={false} - defaultSection="faq" -/> diff --git a/apps-archived/clock/apps/web/src/routes/(app)/mana/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/mana/+page.svelte deleted file mode 100644 index 55f06f19a..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/mana/+page.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/apps-archived/clock/apps/web/src/routes/(app)/profile/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/profile/+page.svelte deleted file mode 100644 index fd83a7c3d..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/profile/+page.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/apps-archived/clock/apps/web/src/routes/(app)/settings/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/settings/+page.svelte deleted file mode 100644 index a0ac42575..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/settings/+page.svelte +++ /dev/null @@ -1,108 +0,0 @@ - - -
-

{$_('settings.title')}

- - - - - -
-

{$_('settings.clockFormat')}

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

{$_('settings.notifications')}

-

- Benachrichtigungen werden für Wecker, Timer und Pomodoro-Sitzungen verwendet. -

- - -
- - -
-

{$_('settings.sounds')}

-

- Töne können für einzelne Wecker und Timer in deren Einstellungen angepasst werden. -

-
- -

v{APP_VERSION}

-
diff --git a/apps-archived/clock/apps/web/src/routes/(app)/stopwatch/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/stopwatch/+page.svelte deleted file mode 100644 index cdb4c68b9..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/stopwatch/+page.svelte +++ /dev/null @@ -1,466 +0,0 @@ - - -
- - -
- -{#if stopwatchesStore.stopwatches.length === 0} - -
-
- -
-

{$_('stopwatch.noStopwatches')}

-

{$_('stopwatch.noStopwatchesDescription')}

- -
-{:else} -
- - {#if focused} - {@const bestLap = stopwatchesStore.getBestLap(focused.id)} - {@const worstLap = stopwatchesStore.getWorstLap(focused.id)} -
- -
-
-
- {#if editingLabelId === focused.id} - - {:else} - - {/if} -
- -
- - -
-
- {formatTime(focused.elapsedTime)} -
- {#if focused.laps.length > 0} -
- {focused.laps.length} - {$_('stopwatch.laps')} -
- {/if} -
- - -
- {#if focused.isRunning} - - - {:else if focused.elapsedTime > 0} - - - {:else} - - {/if} -
- - - {#if focused.laps.length > 0} -
-

- {$_('stopwatch.laps')} ({focused.laps.length}) -

-
- {#each [...focused.laps].reverse() as lap (lap.number)} - {@const isBest = bestLap?.number === lap.number} - {@const isWorst = worstLap?.number === lap.number} -
- - #{lap.number} - {#if isBest} - {$_('stopwatch.best')} - {:else if isWorst} - {$_('stopwatch.worst')} - {/if} - -
- {formatLapTime(lap.time)} - - {formatTime(lap.splitTime)} - -
-
- {/each} -
-
- {$_('stopwatch.total')} - - {formatTime(focused.elapsedTime)} - -
-
- {/if} -
- {/if} - - - {#if otherStopwatches.length > 0} -
-

- {$_('stopwatch.otherStopwatches')} ({otherStopwatches.length}) -

-
- {#each otherStopwatches as sw (sw.id)} -
handleFocus(sw.id)} - onkeydown={(e) => e.key === 'Enter' && handleFocus(sw.id)} - role="button" - tabindex="0" - > - -
-
- -
- - -
- {formatTime(sw.elapsedTime)} -
- - -
- {sw.label} -
- - -
- {#if sw.isRunning} - - {:else} - - {/if} - {#if sw.elapsedTime > 0 && !sw.isRunning} - - {/if} -
- - - {#if sw.laps.length > 0} -
- {sw.laps.length} -
- {/if} -
- {/each} -
-
- {/if} -
-{/if} - - diff --git a/apps-archived/clock/apps/web/src/routes/(app)/tags/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/tags/+page.svelte deleted file mode 100644 index 9ec94b7e2..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/tags/+page.svelte +++ /dev/null @@ -1,45 +0,0 @@ - - - - Tags | Clock - - -
-

Tags verwalten

-

- Tags sind app-übergreifend — Änderungen gelten in allen ManaCore-Apps. -

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

Keine Tags vorhanden.

- {:else} -
- {#each tagsCtx.value as tag} -
- - {tag.name} -
- {/each} -
- {/if} -
- - diff --git a/apps-archived/clock/apps/web/src/routes/(app)/themes/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/themes/+page.svelte deleted file mode 100644 index ffad20085..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/themes/+page.svelte +++ /dev/null @@ -1,30 +0,0 @@ - - -
-

Alle Themes

- -
- {#each THEME_VARIANTS as variant} - {@const def = THEME_DEFINITIONS[variant]} - - {/each} -
-
diff --git a/apps-archived/clock/apps/web/src/routes/(app)/timers/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/timers/+page.svelte deleted file mode 100644 index cda333ef2..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/timers/+page.svelte +++ /dev/null @@ -1,292 +0,0 @@ - - - - -
- -
-
- - : - -
- - -
- - -
- {#each QUICK_TIMER_PRESETS as preset} - - {/each} -
- - {#if allTimers.length > 0} - -
-

- Aktiv ({allTimers.length}) -

-
- {#each allTimers as timer (timer.id)} - {@const isLocal = isLocalTimer(timer)} -
-
- - {getTimerDisplay(timer)} - - -
-
{timer.label}
-
-
-
-
- {#if timer.status === 'running'} - - {:else} - - {/if} - -
-
- {/each} -
-
- {/if} -
diff --git a/apps-archived/clock/apps/web/src/routes/(app)/world-clock/+page.svelte b/apps-archived/clock/apps/web/src/routes/(app)/world-clock/+page.svelte deleted file mode 100644 index 7793e6b85..000000000 --- a/apps-archived/clock/apps/web/src/routes/(app)/world-clock/+page.svelte +++ /dev/null @@ -1,368 +0,0 @@ - - - - {#snippet actions()} -
- - -
- {/snippet} -
- -
- - {#if showMap} -
-
- -
-

- Klicke auf eine Stadt um sie hinzuzufügen -

-
- {/if} - - - {#if allWorldClocks.value.length === 0} -
-

{$_('worldClock.noClocks')}

- -
- {:else} -
- {#each allWorldClocks.value as clock (clock.id)} - {@const isDay = isDaytime(clock.timezone)} -
- - - - -
- {isDay ? 'Tag' : 'Nacht'} - {clock.cityName} -
- - -
- {getTimeForTimezone(clock.timezone)} -
- - -
- - {getDateForTimezone(clock.timezone)} - - - {getOffsetText(clock.timezone)} - -
-
- {/each} -
- {/if} - - - {#if showAddModal} -
-
-
-

{$_('worldClock.add')}

- -
- - - - - -
- {#each filteredTimezones as tz} - {@const alreadyAdded = allWorldClocks.value.some((wc) => wc.timezone === tz.timezone)} - - {/each} - - {#if filteredTimezones.length === 0} -

- Keine Ergebnisse für "{searchQuery}" -

- {/if} -
-
-
- {/if} -
- - diff --git a/apps-archived/clock/apps/web/src/routes/(auth)/forgot-password/+page.svelte b/apps-archived/clock/apps/web/src/routes/(auth)/forgot-password/+page.svelte deleted file mode 100644 index 4403962d9..000000000 --- a/apps-archived/clock/apps/web/src/routes/(auth)/forgot-password/+page.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - diff --git a/apps-archived/clock/apps/web/src/routes/(auth)/login/+page.svelte b/apps-archived/clock/apps/web/src/routes/(auth)/login/+page.svelte deleted file mode 100644 index 83a406630..000000000 --- a/apps-archived/clock/apps/web/src/routes/(auth)/login/+page.svelte +++ /dev/null @@ -1,73 +0,0 @@ - - - - {translations.title} | Clock - - - authStore.signInWithPasskey()} - onVerifyTwoFactor={(code, trust) => authStore.verifyTwoFactor(code, trust)} - onVerifyBackupCode={(code) => authStore.verifyBackupCode(code)} - onSendMagicLink={(email) => authStore.sendMagicLink(email)} - {goto} - successRedirect={redirectTo} - registerPath="/register" - forgotPasswordPath="/forgot-password" - lightBackground="#fffbeb" - darkBackground="#1c1917" - {translations} - {verified} - {initialEmail} - version={APP_VERSION} - buildTime={BUILD_TIME} -/> diff --git a/apps-archived/clock/apps/web/src/routes/(auth)/register/+page.svelte b/apps-archived/clock/apps/web/src/routes/(auth)/register/+page.svelte deleted file mode 100644 index 2af0a135b..000000000 --- a/apps-archived/clock/apps/web/src/routes/(auth)/register/+page.svelte +++ /dev/null @@ -1,52 +0,0 @@ - - - - {translations.title} | Clock - - - diff --git a/apps-archived/clock/apps/web/src/routes/(auth)/reset-password/+page.svelte b/apps-archived/clock/apps/web/src/routes/(auth)/reset-password/+page.svelte deleted file mode 100644 index 54d42004f..000000000 --- a/apps-archived/clock/apps/web/src/routes/(auth)/reset-password/+page.svelte +++ /dev/null @@ -1,174 +0,0 @@ - - - - Reset Password - Clock - - -
-
- - - Clock - -
- -
-
-
-

Reset Password

-

- {#if success}Password reset successfully - {:else if hasToken}Enter your new password - {:else}Invalid or missing token{/if} -

-
- - {#if success} -
-
-
-

- Your password has been reset successfully. You will be redirected to the login page - shortly. -

- - Go to login - -
-
- {:else if hasToken} -
-
- {#if error} -
- {error} -
- {/if} -
-
- - -

At least 8 characters

-
-
- - -
- -
-
-
- {:else} -
-
-
⚠️
-

- This password reset link is invalid or has expired. -

- - Request a new link - -
-
- {/if} -
-
-
diff --git a/apps-archived/clock/apps/web/src/routes/+layout.svelte b/apps-archived/clock/apps/web/src/routes/+layout.svelte deleted file mode 100644 index 489b4af31..000000000 --- a/apps-archived/clock/apps/web/src/routes/+layout.svelte +++ /dev/null @@ -1,47 +0,0 @@ - - - - -{#if $isLocaleLoading || loading} - -{:else} -
- {@render children()} -
-{/if} diff --git a/apps-archived/clock/apps/web/src/routes/+layout.ts b/apps-archived/clock/apps/web/src/routes/+layout.ts deleted file mode 100644 index ad6cddb06..000000000 --- a/apps-archived/clock/apps/web/src/routes/+layout.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Disable SSR — all data is local-first (IndexedDB + mana-sync) -export const ssr = false; diff --git a/apps-archived/clock/apps/web/src/routes/health/+server.ts b/apps-archived/clock/apps/web/src/routes/health/+server.ts deleted file mode 100644 index 91a4d2956..000000000 --- a/apps-archived/clock/apps/web/src/routes/health/+server.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { json } from '@sveltejs/kit'; -import type { RequestHandler } from './$types'; - -export const GET: RequestHandler = async () => { - return json({ - status: 'ok', - service: 'clock-web', - timestamp: new Date().toISOString(), - }); -}; diff --git a/apps-archived/clock/apps/web/src/routes/offline/+page.svelte b/apps-archived/clock/apps/web/src/routes/offline/+page.svelte deleted file mode 100644 index 688302729..000000000 --- a/apps-archived/clock/apps/web/src/routes/offline/+page.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/apps-archived/clock/apps/web/src/routes/offline/+page.ts b/apps-archived/clock/apps/web/src/routes/offline/+page.ts deleted file mode 100644 index 189f71e2e..000000000 --- a/apps-archived/clock/apps/web/src/routes/offline/+page.ts +++ /dev/null @@ -1 +0,0 @@ -export const prerender = true; diff --git a/apps-archived/clock/apps/web/svelte.config.js b/apps-archived/clock/apps/web/svelte.config.js deleted file mode 100644 index f290ef5a6..000000000 --- a/apps-archived/clock/apps/web/svelte.config.js +++ /dev/null @@ -1,21 +0,0 @@ -import adapter from '@sveltejs/adapter-node'; -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - preprocess: vitePreprocess(), - - kit: { - adapter: adapter({ - out: 'build', - }), - prerender: { - handleHttpError: ({ path, message }) => { - if (path === '/favicon.png') return; - throw new Error(message); - }, - }, - }, -}; - -export default config; diff --git a/apps-archived/clock/apps/web/tsconfig.json b/apps-archived/clock/apps/web/tsconfig.json deleted file mode 100644 index a8f10c8e3..000000000 --- a/apps-archived/clock/apps/web/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "moduleResolution": "bundler" - } -} diff --git a/apps-archived/clock/apps/web/vite.config.ts b/apps-archived/clock/apps/web/vite.config.ts deleted file mode 100644 index b82ef0e7e..000000000 --- a/apps-archived/clock/apps/web/vite.config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vite'; -import { SvelteKitPWA } from '@vite-pwa/sveltekit'; -import { createPWAConfig } from '@manacore/shared-pwa'; -import { MANACORE_SHARED_PACKAGES, getBuildDefines } from '@manacore/shared-vite-config'; - -export default defineConfig({ - plugins: [ - sveltekit(), - SvelteKitPWA( - createPWAConfig({ - name: 'Clock - Uhr & Timer', - shortName: 'Clock', - description: 'Uhr, Timer und Stoppuhr', - themeColor: '#06b6d4', - preset: 'minimal', - }) - ), - ], - server: { - port: 5187, - strictPort: true, - }, - ssr: { - noExternal: [...MANACORE_SHARED_PACKAGES], - }, - optimizeDeps: { - exclude: [...MANACORE_SHARED_PACKAGES], - }, - define: { - ...getBuildDefines(), - }, -}); diff --git a/apps-archived/clock/packages/shared/package.json b/apps-archived/clock/packages/shared/package.json deleted file mode 100644 index 8b9961090..000000000 --- a/apps-archived/clock/packages/shared/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@clock/shared", - "version": "0.2.0", - "private": true, - "type": "module", - "main": "./src/index.ts", - "exports": { - ".": "./src/index.ts", - "./types": "./src/types/index.ts", - "./constants": "./src/constants/index.ts" - }, - "scripts": { - "type-check": "tsc --noEmit", - "lint": "eslint src" - }, - "devDependencies": { - "typescript": "^5.7.2" - } -} diff --git a/apps-archived/clock/packages/shared/src/constants/index.ts b/apps-archived/clock/packages/shared/src/constants/index.ts deleted file mode 100644 index 205c25895..000000000 --- a/apps-archived/clock/packages/shared/src/constants/index.ts +++ /dev/null @@ -1,151 +0,0 @@ -// Popular timezones with city names and coordinates for map display -export const POPULAR_TIMEZONES = [ - { - timezone: 'America/New_York', - city: 'New York', - region: 'Americas', - lat: 40.7128, - lng: -74.006, - }, - { - timezone: 'America/Los_Angeles', - city: 'Los Angeles', - region: 'Americas', - lat: 34.0522, - lng: -118.2437, - }, - { timezone: 'America/Chicago', city: 'Chicago', region: 'Americas', lat: 41.8781, lng: -87.6298 }, - { timezone: 'America/Toronto', city: 'Toronto', region: 'Americas', lat: 43.6532, lng: -79.3832 }, - { - timezone: 'America/Sao_Paulo', - city: 'São Paulo', - region: 'Americas', - lat: -23.5505, - lng: -46.6333, - }, - { - timezone: 'America/Mexico_City', - city: 'Mexico City', - region: 'Americas', - lat: 19.4326, - lng: -99.1332, - }, - { - timezone: 'America/Buenos_Aires', - city: 'Buenos Aires', - region: 'Americas', - lat: -34.6037, - lng: -58.3816, - }, - { - timezone: 'America/Vancouver', - city: 'Vancouver', - region: 'Americas', - lat: 49.2827, - lng: -123.1207, - }, - { timezone: 'Europe/London', city: 'London', region: 'Europe', lat: 51.5074, lng: -0.1278 }, - { timezone: 'Europe/Paris', city: 'Paris', region: 'Europe', lat: 48.8566, lng: 2.3522 }, - { timezone: 'Europe/Berlin', city: 'Berlin', region: 'Europe', lat: 52.52, lng: 13.405 }, - { timezone: 'Europe/Rome', city: 'Rome', region: 'Europe', lat: 41.9028, lng: 12.4964 }, - { timezone: 'Europe/Madrid', city: 'Madrid', region: 'Europe', lat: 40.4168, lng: -3.7038 }, - { timezone: 'Europe/Amsterdam', city: 'Amsterdam', region: 'Europe', lat: 52.3676, lng: 4.9041 }, - { timezone: 'Europe/Vienna', city: 'Vienna', region: 'Europe', lat: 48.2082, lng: 16.3738 }, - { timezone: 'Europe/Zurich', city: 'Zurich', region: 'Europe', lat: 47.3769, lng: 8.5417 }, - { timezone: 'Europe/Moscow', city: 'Moscow', region: 'Europe', lat: 55.7558, lng: 37.6173 }, - { timezone: 'Europe/Stockholm', city: 'Stockholm', region: 'Europe', lat: 59.3293, lng: 18.0686 }, - { timezone: 'Europe/Istanbul', city: 'Istanbul', region: 'Europe', lat: 41.0082, lng: 28.9784 }, - { timezone: 'Asia/Tokyo', city: 'Tokyo', region: 'Asia', lat: 35.6762, lng: 139.6503 }, - { timezone: 'Asia/Shanghai', city: 'Shanghai', region: 'Asia', lat: 31.2304, lng: 121.4737 }, - { timezone: 'Asia/Hong_Kong', city: 'Hong Kong', region: 'Asia', lat: 22.3193, lng: 114.1694 }, - { timezone: 'Asia/Singapore', city: 'Singapore', region: 'Asia', lat: 1.3521, lng: 103.8198 }, - { timezone: 'Asia/Seoul', city: 'Seoul', region: 'Asia', lat: 37.5665, lng: 126.978 }, - { timezone: 'Asia/Mumbai', city: 'Mumbai', region: 'Asia', lat: 19.076, lng: 72.8777 }, - { timezone: 'Asia/Dubai', city: 'Dubai', region: 'Asia', lat: 25.2048, lng: 55.2708 }, - { timezone: 'Asia/Bangkok', city: 'Bangkok', region: 'Asia', lat: 13.7563, lng: 100.5018 }, - { timezone: 'Asia/Jakarta', city: 'Jakarta', region: 'Asia', lat: -6.2088, lng: 106.8456 }, - { timezone: 'Australia/Sydney', city: 'Sydney', region: 'Oceania', lat: -33.8688, lng: 151.2093 }, - { - timezone: 'Australia/Melbourne', - city: 'Melbourne', - region: 'Oceania', - lat: -37.8136, - lng: 144.9631, - }, - { - timezone: 'Pacific/Auckland', - city: 'Auckland', - region: 'Oceania', - lat: -36.8485, - lng: 174.7633, - }, - { timezone: 'Africa/Cairo', city: 'Cairo', region: 'Africa', lat: 30.0444, lng: 31.2357 }, - { - timezone: 'Africa/Johannesburg', - city: 'Johannesburg', - region: 'Africa', - lat: -26.2041, - lng: 28.0473, - }, - { timezone: 'Africa/Lagos', city: 'Lagos', region: 'Africa', lat: 6.5244, lng: 3.3792 }, -] as const; - -// Available alarm sounds -export const ALARM_SOUNDS = [ - { id: 'default', name: 'Default', nameDE: 'Standard' }, - { id: 'gentle', name: 'Gentle', nameDE: 'Sanft' }, - { id: 'classic', name: 'Classic', nameDE: 'Klassisch' }, - { id: 'digital', name: 'Digital', nameDE: 'Digital' }, - { id: 'nature', name: 'Nature', nameDE: 'Natur' }, - { id: 'chime', name: 'Chime', nameDE: 'Glockenspiel' }, -] as const; - -// Timer presets -export const QUICK_TIMER_PRESETS = [ - { label: '1 min', seconds: 60 }, - { label: '3 min', seconds: 180 }, - { label: '5 min', seconds: 300 }, - { label: '10 min', seconds: 600 }, - { label: '15 min', seconds: 900 }, - { label: '30 min', seconds: 1800 }, - { label: '45 min', seconds: 2700 }, - { label: '1 hour', seconds: 3600 }, -] as const; - -// Default alarm presets (like iOS Clock app) -export const DEFAULT_ALARM_PRESETS = [ - { time: '06:00', label: 'Früh aufstehen', labelEN: 'Wake up early' }, - { time: '07:00', label: 'Aufwachen', labelEN: 'Wake up' }, - { time: '08:00', label: 'Morgen', labelEN: 'Morning' }, - { time: '12:00', label: 'Mittag', labelEN: 'Noon' }, - { time: '18:00', label: 'Feierabend', labelEN: 'End of work' }, - { time: '22:00', label: 'Schlafenszeit', labelEN: 'Bedtime' }, -] as const; - -// Pomodoro presets -export const POMODORO_PRESETS = [ - { - name: 'Classic Pomodoro', - nameDE: 'Klassischer Pomodoro', - workDuration: 25 * 60, - breakDuration: 5 * 60, - longBreakDuration: 15 * 60, - sessionsBeforeLongBreak: 4, - }, - { - name: 'Short Focus', - nameDE: 'Kurzer Fokus', - workDuration: 15 * 60, - breakDuration: 3 * 60, - longBreakDuration: 10 * 60, - sessionsBeforeLongBreak: 4, - }, - { - name: 'Deep Work', - nameDE: 'Tiefes Arbeiten', - workDuration: 50 * 60, - breakDuration: 10 * 60, - longBreakDuration: 30 * 60, - sessionsBeforeLongBreak: 3, - }, -] as const; diff --git a/apps-archived/clock/packages/shared/src/index.ts b/apps-archived/clock/packages/shared/src/index.ts deleted file mode 100644 index 33c8572a1..000000000 --- a/apps-archived/clock/packages/shared/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './types'; -export * from './constants'; diff --git a/apps-archived/clock/packages/shared/src/types/alarm.ts b/apps-archived/clock/packages/shared/src/types/alarm.ts deleted file mode 100644 index 212e10059..000000000 --- a/apps-archived/clock/packages/shared/src/types/alarm.ts +++ /dev/null @@ -1,55 +0,0 @@ -export interface Alarm { - id: string; - userId: string; - label: string | null; - time: string; // HH:MM:SS format - enabled: boolean; - repeatDays: number[] | null; // [0-6] where 0 = Sunday - snoozeMinutes: number | null; - sound: string | null; - vibrate: boolean | null; - createdAt: string; - updatedAt: string; -} - -export interface CreateAlarmInput { - label?: string; - time: string; - enabled?: boolean; - repeatDays?: number[]; - snoozeMinutes?: number; - sound?: string; - vibrate?: boolean; -} - -export interface UpdateAlarmInput { - label?: string; - time?: string; - enabled?: boolean; - repeatDays?: number[]; - snoozeMinutes?: number; - sound?: string; - vibrate?: boolean; -} - -export type RepeatDay = 0 | 1 | 2 | 3 | 4 | 5 | 6; - -export const REPEAT_DAY_LABELS = { - 0: 'Sun', - 1: 'Mon', - 2: 'Tue', - 3: 'Wed', - 4: 'Thu', - 5: 'Fri', - 6: 'Sat', -} as const; - -export const REPEAT_DAY_LABELS_DE = { - 0: 'So', - 1: 'Mo', - 2: 'Di', - 3: 'Mi', - 4: 'Do', - 5: 'Fr', - 6: 'Sa', -} as const; diff --git a/apps-archived/clock/packages/shared/src/types/index.ts b/apps-archived/clock/packages/shared/src/types/index.ts deleted file mode 100644 index 1bd20351b..000000000 --- a/apps-archived/clock/packages/shared/src/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './alarm'; -export * from './timer'; -export * from './world-clock'; -export * from './preset'; diff --git a/apps-archived/clock/packages/shared/src/types/preset.ts b/apps-archived/clock/packages/shared/src/types/preset.ts deleted file mode 100644 index 948adf37e..000000000 --- a/apps-archived/clock/packages/shared/src/types/preset.ts +++ /dev/null @@ -1,42 +0,0 @@ -export type PresetType = 'timer' | 'pomodoro'; - -export interface PresetSettings { - // For pomodoro presets - workDuration?: number; - breakDuration?: number; - longBreakDuration?: number; - sessionsBeforeLongBreak?: number; - // For timer presets - sound?: string; -} - -export interface Preset { - id: string; - userId: string; - type: PresetType; - name: string; - durationSeconds: number; - settings: PresetSettings | null; - createdAt: string; -} - -export interface CreatePresetInput { - type: PresetType; - name: string; - durationSeconds: number; - settings?: PresetSettings; -} - -export interface UpdatePresetInput { - name?: string; - durationSeconds?: number; - settings?: PresetSettings; -} - -// Default pomodoro settings -export const DEFAULT_POMODORO_SETTINGS: PresetSettings = { - workDuration: 25 * 60, // 25 minutes - breakDuration: 5 * 60, // 5 minutes - longBreakDuration: 15 * 60, // 15 minutes - sessionsBeforeLongBreak: 4, -}; diff --git a/apps-archived/clock/packages/shared/src/types/timer.ts b/apps-archived/clock/packages/shared/src/types/timer.ts deleted file mode 100644 index 221bb56ef..000000000 --- a/apps-archived/clock/packages/shared/src/types/timer.ts +++ /dev/null @@ -1,49 +0,0 @@ -export type TimerStatus = 'idle' | 'running' | 'paused' | 'finished'; - -export interface Timer { - id: string; - userId: string; - label: string | null; - durationSeconds: number; - remainingSeconds: number | null; - status: TimerStatus; - startedAt: string | null; - pausedAt: string | null; - sound: string | null; - createdAt: string; - updatedAt: string; -} - -export interface CreateTimerInput { - label?: string; - durationSeconds: number; - sound?: string; -} - -export interface UpdateTimerInput { - label?: string; - durationSeconds?: number; - sound?: string; -} - -export function formatDuration(seconds: number): string { - const hours = Math.floor(seconds / 3600); - const minutes = Math.floor((seconds % 3600) / 60); - const secs = seconds % 60; - - if (hours > 0) { - return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; - } - return `${minutes}:${secs.toString().padStart(2, '0')}`; -} - -export function parseDuration(formatted: string): number { - const parts = formatted.split(':').map(Number); - if (parts.length === 3) { - return parts[0] * 3600 + parts[1] * 60 + parts[2]; - } - if (parts.length === 2) { - return parts[0] * 60 + parts[1]; - } - return parts[0]; -} diff --git a/apps-archived/clock/packages/shared/src/types/world-clock.ts b/apps-archived/clock/packages/shared/src/types/world-clock.ts deleted file mode 100644 index 7a2ae55a7..000000000 --- a/apps-archived/clock/packages/shared/src/types/world-clock.ts +++ /dev/null @@ -1,18 +0,0 @@ -export interface WorldClock { - id: string; - userId: string; - timezone: string; // IANA timezone e.g. 'America/New_York' - cityName: string; - sortOrder: number; - createdAt: string; -} - -export interface CreateWorldClockInput { - timezone: string; - cityName: string; -} - -export interface TimezoneInfo { - timezone: string; - city: string; -} diff --git a/apps-archived/clock/packages/shared/tsconfig.json b/apps-archived/clock/packages/shared/tsconfig.json deleted file mode 100644 index b17efe376..000000000 --- a/apps-archived/clock/packages/shared/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2021", - "module": "ESNext", - "moduleResolution": "bundler", - "strict": true, - "skipLibCheck": true, - "declaration": true, - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/apps-archived/wisekeep/.gitignore b/apps-archived/wisekeep/.gitignore deleted file mode 100644 index 1cc1e19fb..000000000 --- a/apps-archived/wisekeep/.gitignore +++ /dev/null @@ -1,53 +0,0 @@ -# Python (legacy) -__pycache__/ -*.py[cod] -*$py.class -*.so -.Python -venv/ -env/ -ENV/ - -# Data (transcripts, playlists) -data/ - -# Node -node_modules/ -.npm -dist/ -build/ -.astro/ -.svelte-kit/ -.turbo/ - -# IDE -.vscode/ -.idea/ -*.swp -*.swo -.DS_Store - -# Environment -.env -.env.local -.env.*.local - -# Logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Build outputs -apps/*/dist/ -apps/*/.astro/ -apps/*/.svelte-kit/ - -# Expo -apps/mobile/.expo/ -apps/mobile/ios/ -apps/mobile/android/ - -# Legacy -legacy/venv/ -legacy/__pycache__/ diff --git a/apps-archived/wisekeep/CLAUDE.md b/apps-archived/wisekeep/CLAUDE.md deleted file mode 100644 index 612500366..000000000 --- a/apps-archived/wisekeep/CLAUDE.md +++ /dev/null @@ -1,53 +0,0 @@ -# Wisekeep — AI Wisdom Extraction from Video - -## Architecture - -Local-first for transcripts/playlists, Hono/Bun server for Groq Whisper transcription. - -``` -Browser → IndexedDB (Transcripts, Playlists) - ↕ sync - mana-sync → PostgreSQL - -Browser → Hono Server → yt-dlp (download) → Groq Whisper (transcribe) -``` - -## Project Structure - -``` -apps/wisekeep/ -├── apps/ -│ ├── web/ # SvelteKit web app (local-first) -│ ├── server/ # Hono/Bun (transcription via Groq) -│ └── landing/ # Astro content site (curated talks) -└── package.json -``` - -## Commands - -```bash -pnpm dev:wisekeep:web # SvelteKit dev server -pnpm dev:wisekeep:server # Hono/Bun server (port 3072) -pnpm dev:wisekeep:landing # Landing page -pnpm dev:wisekeep:local # Web + Sync + Server (no auth) -pnpm dev:wisekeep:full # Everything incl. auth -``` - -## Server Routes - -| Route | Auth | Description | -|-------|------|-------------| -| `GET /health` | No | Health check | -| `POST /api/v1/transcribe` | JWT | Transcribe YouTube URL via Groq | - -## Prerequisites - -- `yt-dlp` installed (`brew install yt-dlp`) -- `GROQ_API_KEY` env variable set - -## Local-First Collections - -| Collection | Purpose | -|-----------|---------| -| `transcripts` | Video transcriptions (title, channel, transcript text) | -| `playlists` | Organized collections of transcripts | diff --git a/apps-archived/wisekeep/apps/landing/astro.config.mjs b/apps-archived/wisekeep/apps/landing/astro.config.mjs deleted file mode 100644 index d10a3997d..000000000 --- a/apps-archived/wisekeep/apps/landing/astro.config.mjs +++ /dev/null @@ -1,8 +0,0 @@ -import { defineConfig } from 'astro/config'; -import solidJs from '@astrojs/solid-js'; -import tailwind from '@astrojs/tailwind'; - -// https://astro.build/config -export default defineConfig({ - integrations: [solidJs(), tailwind()], -}); diff --git a/apps-archived/wisekeep/apps/landing/package.json b/apps-archived/wisekeep/apps/landing/package.json deleted file mode 100644 index b88aff18a..000000000 --- a/apps-archived/wisekeep/apps/landing/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "@wisekeep/landing", - "type": "module", - "version": "1.0.0", - "private": true, - "scripts": { - "dev": "astro dev", - "build": "astro build", - "preview": "astro preview", - "lint": "eslint .", - "type-check": "astro check" - }, - "dependencies": { - "@astrojs/solid-js": "^4.4.0", - "astro": "^4.16.0", - "solid-js": "^1.9.0" - }, - "devDependencies": { - "@astrojs/check": "^0.9.0", - "@astrojs/tailwind": "^5.1.0", - "@types/node": "^22.10.1", - "autoprefixer": "^10.4.20", - "postcss": "^8.4.49", - "tailwindcss": "^3.4.15", - "typescript": "^5.7.2" - } -} diff --git a/apps-archived/wisekeep/apps/landing/src/components/CollapsibleSection.astro b/apps-archived/wisekeep/apps/landing/src/components/CollapsibleSection.astro deleted file mode 100644 index cb4308979..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/CollapsibleSection.astro +++ /dev/null @@ -1,172 +0,0 @@ ---- -export interface Props { - title: string; - icon?: string; - defaultCollapsed?: boolean; - className?: string; -} - -const { title, icon = '📌', defaultCollapsed = false, className = '' } = Astro.props; -const sectionId = title - .toLowerCase() - .replace(/\s+/g, '-') - .replace(/[^a-z0-9-]/g, ''); ---- - -
- -
-
- -
-
-
- - - - diff --git a/apps-archived/wisekeep/apps/landing/src/components/ContentCard.tsx b/apps-archived/wisekeep/apps/landing/src/components/ContentCard.tsx deleted file mode 100644 index 373fde3ed..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/ContentCard.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { Component } from 'solid-js'; - -interface ContentCardProps { - title: string; - speaker: string; - speakerId?: string; - duration: string; - excerpt: string; - tags: string[]; - link: string; - date?: string; - thumbnail?: string; - views?: string; -} - -const ContentCard: Component = (props) => { - return ( - - {/* Card Container with hover effects */} -
- {/* Gradient overlay on hover */} -
- - {/* Content section */} -
- {/* Title */} -

- {props.title} -

- - {/* Meta information */} -
- {props.speakerId ? ( - { - e.stopPropagation(); - }} - > - 🎤 - {props.speaker} - - ) : ( - - 🎤 - {props.speaker} - - )} - - ⏱️ {props.duration} - {props.date && ( - <> - - {props.date} - - )} - {props.views && ( - <> - - 👁️ {props.views} - - )} -
- - {/* Excerpt */} -

{props.excerpt}

- - {/* Tags */} -
- {props.tags.map((tag) => ( - - {tag} - - ))} -
- - {/* CTA Text (no longer a link since whole card is clickable) */} -
- Weiterlesen - - - -
-
- - {/* Decorative corner accent */} -
-
- - ); -}; - -export default ContentCard; diff --git a/apps-archived/wisekeep/apps/landing/src/components/ContentCardList.tsx b/apps-archived/wisekeep/apps/landing/src/components/ContentCardList.tsx deleted file mode 100644 index a819131ba..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/ContentCardList.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import { Component, For, createSignal, onMount } from 'solid-js'; -import ContentCard from './ContentCard'; - -interface Talk { - id: string; - title: string; - speaker: string; - speakerId?: string; - duration: string; - excerpt: string; - tags: string[]; - link: string; - date?: string; - thumbnail?: string; - views?: string; -} - -const ContentCardList: Component = () => { - const [talks, setTalks] = createSignal([]); - const [loading, setLoading] = createSignal(true); - - // Mock data - später durch API-Call ersetzen - onMount(() => { - // Simuliere API-Call - setTimeout(() => { - setTalks([ - { - id: '1', - title: 'Perspective is Everything: The Psychology of Reframing', - speaker: 'Rory Sutherland', - speakerId: 'rory-sutherland', - duration: '18 Min', - excerpt: - 'Wie kleine Änderungen in der Perspektive große Auswirkungen auf unser Verhalten und unsere Entscheidungen haben können. Ein faszinierender Einblick in die Verhaltensökonomie.', - tags: ['Behavioral Economics', 'Psychology', 'Marketing'], - link: '/talks/rory-sutherland-perspective-is-everything', - date: '15. März 2024', - views: '12.5k', - }, - { - id: '2', - title: 'The Power of Psychological Solutions', - speaker: 'Rory Sutherland', - speakerId: 'rory-sutherland', - duration: '22 Min', - excerpt: - 'Warum psychologische Lösungen oft effektiver und günstiger sind als technische. Sutherland zeigt, wie wir Probleme neu denken können.', - tags: ['Innovation', 'Problem Solving', 'Design Thinking'], - link: '/talks/rory-sutherland-psychological-solutions', - date: '10. März 2024', - views: '8.3k', - }, - { - id: '3', - title: 'Marketing Secrets from Behavioral Science', - speaker: 'Rory Sutherland', - speakerId: 'rory-sutherland', - duration: '25 Min', - excerpt: - 'Die verborgenen psychologischen Mechanismen hinter erfolgreichem Marketing. Erkenntnisse aus jahrzehntelanger Erfahrung bei Ogilvy.', - tags: ['Marketing', 'Consumer Behavior', 'Branding'], - link: '/talks/rory-sutherland-marketing-secrets', - date: '5. März 2024', - views: '15.7k', - }, - { - id: '4', - title: 'Why Context Matters More Than Content', - speaker: 'Rory Sutherland', - speakerId: 'rory-sutherland', - duration: '20 Min', - excerpt: - 'Der Kontext bestimmt, wie wir Informationen wahrnehmen und interpretieren. Eine Lektion in der Kunst der Kommunikation.', - tags: ['Communication', 'Perception', 'Context'], - link: '/talks/rory-sutherland-context-matters', - date: '1. März 2024', - views: '6.2k', - }, - { - id: '5', - title: 'The Irrational Consumer: Understanding Human Behavior', - speaker: 'Rory Sutherland', - speakerId: 'rory-sutherland', - duration: '30 Min', - excerpt: - 'Menschen sind keine rationalen Akteure. Wie wir diese Erkenntnis nutzen können, um bessere Produkte und Services zu entwickeln.', - tags: ['Consumer Psychology', 'Behavioral Economics', 'UX Design'], - link: '/talks/rory-sutherland-irrational-consumer', - date: '25. Februar 2024', - views: '10.1k', - }, - { - id: '6', - title: 'Alchemy: The Magic of Ideas', - speaker: 'Rory Sutherland', - speakerId: 'rory-sutherland', - duration: '28 Min', - excerpt: - 'Große Ideen kommen oft aus unerwarteten Ecken. Sutherland erklärt, warum Logik allein nicht ausreicht, um Innovation zu schaffen.', - tags: ['Creativity', 'Innovation', 'Ideas'], - link: '/talks/rory-sutherland-alchemy', - date: '20. Februar 2024', - views: '18.9k', - }, - ]); - setLoading(false); - }, 500); - }); - - return ( -
- {loading() ? ( - // Loading skeleton -
- - {() => ( -
-
-
-
-
-
-
-
-
-
-
-
- )} -
-
- ) : ( - // Content cards grid -
- - {(talk) => ( - - )} - -
- )} -
- ); -}; - -export default ContentCardList; diff --git a/apps-archived/wisekeep/apps/landing/src/components/Footer.astro b/apps-archived/wisekeep/apps/landing/src/components/Footer.astro deleted file mode 100644 index 8b876caaa..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/Footer.astro +++ /dev/null @@ -1,150 +0,0 @@ ---- -const currentYear = new Date().getFullYear(); ---- - - diff --git a/apps-archived/wisekeep/apps/landing/src/components/Navigation.astro b/apps-archived/wisekeep/apps/landing/src/components/Navigation.astro deleted file mode 100644 index a654955fa..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/Navigation.astro +++ /dev/null @@ -1,134 +0,0 @@ ---- -export interface Props { - currentPath?: string; -} - -const { currentPath = '/' } = Astro.props; ---- - - - - diff --git a/apps-archived/wisekeep/apps/landing/src/components/SearchableContentList.tsx b/apps-archived/wisekeep/apps/landing/src/components/SearchableContentList.tsx deleted file mode 100644 index e47f017ac..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/SearchableContentList.tsx +++ /dev/null @@ -1,356 +0,0 @@ -import { Component, For, createSignal, onMount, createMemo } from 'solid-js'; -import ContentCard from './ContentCard'; - -interface Talk { - id: string; - title: string; - speaker: string; - duration: string; - excerpt: string; - tags: string[]; - link: string; - date?: string; - thumbnail?: string; - views?: string; -} - -const SearchableContentList: Component = () => { - const [talks, setTalks] = createSignal([]); - const [loading, setLoading] = createSignal(true); - const [searchQuery, setSearchQuery] = createSignal(''); - - // Mock data - später durch API-Call ersetzen - onMount(() => { - // Simuliere API-Call - setTimeout(() => { - setTalks([ - { - id: '1', - title: 'Perspective is Everything: The Psychology of Reframing', - speaker: 'Rory Sutherland', - duration: '18 Min', - excerpt: - 'Wie kleine Änderungen in der Perspektive große Auswirkungen auf unser Verhalten und unsere Entscheidungen haben können. Ein faszinierender Einblick in die Verhaltensökonomie.', - tags: ['Behavioral Economics', 'Psychology', 'Marketing'], - link: '/talks/rory-sutherland-perspective-is-everything', - date: '15. März 2024', - views: '12.5k', - }, - { - id: '2', - title: 'The Power of Psychological Solutions', - speaker: 'Rory Sutherland', - duration: '22 Min', - excerpt: - 'Warum psychologische Lösungen oft effektiver und günstiger sind als technische. Sutherland zeigt, wie wir Probleme neu denken können.', - tags: ['Innovation', 'Problem Solving', 'Design Thinking'], - link: '/talks/rory-sutherland-psychological-solutions', - date: '10. März 2024', - views: '8.3k', - }, - { - id: '3', - title: 'Marketing Secrets from Behavioral Science', - speaker: 'Rory Sutherland', - duration: '25 Min', - excerpt: - 'Die verborgenen psychologischen Mechanismen hinter erfolgreichem Marketing. Erkenntnisse aus jahrzehntelanger Erfahrung bei Ogilvy.', - tags: ['Marketing', 'Consumer Behavior', 'Branding'], - link: '/talks/rory-sutherland-marketing-secrets', - date: '5. März 2024', - views: '15.7k', - }, - { - id: '4', - title: 'Why Context Matters More Than Content', - speaker: 'Rory Sutherland', - duration: '20 Min', - excerpt: - 'Der Kontext bestimmt, wie wir Informationen wahrnehmen und interpretieren. Eine Lektion in der Kunst der Kommunikation.', - tags: ['Communication', 'Perception', 'Context'], - link: '/talks/rory-sutherland-context-matters', - date: '1. März 2024', - views: '6.2k', - }, - { - id: '5', - title: 'The Irrational Consumer: Understanding Human Behavior', - speaker: 'Rory Sutherland', - duration: '30 Min', - excerpt: - 'Menschen sind keine rationalen Akteure. Wie wir diese Erkenntnis nutzen können, um bessere Produkte und Services zu entwickeln.', - tags: ['Consumer Psychology', 'Behavioral Economics', 'UX Design'], - link: '/talks/rory-sutherland-irrational-consumer', - date: '25. Februar 2024', - views: '10.1k', - }, - { - id: '6', - title: 'Alchemy: The Magic of Ideas', - speaker: 'Rory Sutherland', - duration: '28 Min', - excerpt: - 'Große Ideen kommen oft aus unerwarteten Ecken. Sutherland erklärt, warum Logik allein nicht ausreicht, um Innovation zu schaffen.', - tags: ['Creativity', 'Innovation', 'Ideas'], - link: '/talks/rory-sutherland-alchemy', - date: '20. Februar 2024', - views: '18.9k', - }, - { - id: '7', - title: 'How Great Leaders Inspire Action (Start with Why)', - speaker: 'Simon Sinek', - duration: '18 Min', - excerpt: - 'Simon Sineks berühmter TED Talk über das Golden Circle Modell - warum großartige Führungskräfte mit dem "Warum" beginnen und wie dies das Verhalten und die Loyalität von Menschen beeinflusst.', - tags: ['Leadership', 'Purpose', 'Golden Circle', 'Inspiration'], - link: '/speakers/simon-sinek', - date: '9. September 2024', - views: '60M+', - }, - { - id: '8', - title: 'Why Good Leaders Make You Feel Safe', - speaker: 'Simon Sinek', - duration: '12 Min', - excerpt: - 'Ein kraftvoller Vortrag darüber, wie echte Führung bedeutet, Sicherheit für das Team zu schaffen, damit Menschen ihr Bestes geben können und bereit sind, füreinander einzustehen.', - tags: ['Leadership', 'Trust', 'Safety', 'Team Building'], - link: '/speakers/simon-sinek', - date: '9. September 2024', - views: '18M+', - }, - { - id: '9', - title: 'Millennials in the Workplace', - speaker: 'Simon Sinek', - duration: '15 Min', - excerpt: - 'Simon Sineks virales Interview über die Herausforderungen der Millennial-Generation im Arbeitsplatz - von der Auswirkung der Technologie bis hin zu veränderten Arbeitserwartungen.', - tags: ['Millennials', 'Workplace', 'Technology', 'Generational Change'], - link: '/speakers/simon-sinek', - date: '9. September 2024', - views: '100M+', - }, - { - id: '10', - title: 'Love Your Work', - speaker: 'Simon Sinek', - duration: '42 Min', - excerpt: - 'Ein inspirierender Talk über die Bedeutung von Leidenschaft bei der Arbeit und wie man eine Karriere aufbaut, die nicht nur erfolgreich, sondern auch erfüllend ist.', - tags: ['Career', 'Passion', 'Purpose', 'Work-Life Balance'], - link: '/speakers/simon-sinek', - date: '9. September 2024', - views: '2.8M', - }, - { - id: '11', - title: 'The Future of AI and Machine Learning', - speaker: 'Andrew Ng', - duration: '35 Min', - excerpt: - 'Ein tiefer Einblick in die Zukunft der künstlichen Intelligenz und wie Machine Learning unsere Welt verändern wird.', - tags: ['AI', 'Machine Learning', 'Technology'], - link: '/talks/andrew-ng-future-of-ai', - date: '18. Februar 2024', - views: '22.3k', - }, - { - id: '12', - title: 'Building Resilient Systems', - speaker: 'Martin Fowler', - duration: '40 Min', - excerpt: - 'Wie man Software-Systeme baut, die robust, wartbar und skalierbar sind. Best Practices aus jahrzehntelanger Erfahrung.', - tags: ['Software Architecture', 'Engineering', 'Best Practices'], - link: '/talks/martin-fowler-resilient-systems', - date: '15. Februar 2024', - views: '9.8k', - }, - { - id: '13', - title: 'The Psychology of Money', - speaker: 'Morgan Housel', - duration: '32 Min', - excerpt: - 'Warum kluge Menschen dumme Dinge mit Geld machen und wie unsere Psychologie unsere finanziellen Entscheidungen beeinflusst.', - tags: ['Finance', 'Psychology', 'Behavioral Economics'], - link: '/talks/morgan-housel-psychology-of-money', - date: '10. Februar 2024', - views: '25.6k', - }, - ]); - setLoading(false); - }, 500); - }); - - // Filtered talks based on search query - const filteredTalks = createMemo(() => { - const query = searchQuery().toLowerCase(); - if (!query) return talks(); - - return talks().filter((talk) => { - return ( - talk.title.toLowerCase().includes(query) || - talk.speaker.toLowerCase().includes(query) || - talk.excerpt.toLowerCase().includes(query) || - talk.tags.some((tag) => tag.toLowerCase().includes(query)) - ); - }); - }); - - // Handle search input - const handleSearch = (e: Event) => { - const target = e.target as HTMLInputElement; - setSearchQuery(target.value); - }; - - return ( -
- {/* Search Bar */} -
-
- - - - - - {/* Clear button */} - {searchQuery() && ( - - )} -
- - {/* Search results count */} - {searchQuery() && !loading() && ( -
- {filteredTalks().length === 0 ? ( - Keine Ergebnisse für "{searchQuery()}" - ) : ( - - {filteredTalks().length} {filteredTalks().length === 1 ? 'Ergebnis' : 'Ergebnisse'}{' '} - für "{searchQuery()}" - - )} -
- )} -
- - {loading() ? ( - // Loading skeleton -
- - {() => ( -
-
-
-
-
-
-
-
-
-
-
-
- )} -
-
- ) : ( - <> - {filteredTalks().length === 0 && searchQuery() ? ( - // No results state -
-
🔍
-

Keine Treffer

-

- Versuche es mit anderen Suchbegriffen oder browse durch alle verfügbaren Vorträge. -

- -
- ) : ( - // Content cards grid with fade-in animation -
- - {(talk, index) => ( -
- -
- )} -
-
- )} - - )} - - -
- ); -}; - -export default SearchableContentList; diff --git a/apps-archived/wisekeep/apps/landing/src/components/TalksSidebar.astro b/apps-archived/wisekeep/apps/landing/src/components/TalksSidebar.astro deleted file mode 100644 index d31157e6d..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/TalksSidebar.astro +++ /dev/null @@ -1,311 +0,0 @@ ---- -import { getCollection } from 'astro:content'; - -const talks = await getCollection('talks'); -const currentPath = Astro.url.pathname; - -// Sort talks by date (newest first) -const sortedTalks = talks.sort((a, b) => { - return new Date(b.data.date).getTime() - new Date(a.data.date).getTime(); -}); - -// Group talks by speaker -const talksBySpeaker = sortedTalks.reduce( - (acc, talk) => { - const speaker = talk.data.speaker; - if (!acc[speaker]) { - acc[speaker] = []; - } - acc[speaker].push(talk); - return acc; - }, - {} as Record -); ---- - - - - diff --git a/apps-archived/wisekeep/apps/landing/src/components/ThemeSwitcher.astro b/apps-archived/wisekeep/apps/landing/src/components/ThemeSwitcher.astro deleted file mode 100644 index 125a5ad94..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/ThemeSwitcher.astro +++ /dev/null @@ -1,274 +0,0 @@ ---- - ---- - -
- -
- - - -
- - - -
- - diff --git a/apps-archived/wisekeep/apps/landing/src/components/speakers/QuoteCollection.astro b/apps-archived/wisekeep/apps/landing/src/components/speakers/QuoteCollection.astro deleted file mode 100644 index 23f0f7756..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/speakers/QuoteCollection.astro +++ /dev/null @@ -1,46 +0,0 @@ ---- -export interface Quote { - text: string; - talk: string; - context: string; -} - -export interface Props { - quotes: Quote[]; - speakerName: string; -} - -const { quotes, speakerName } = Astro.props; ---- - -
-
-

Zitate von {speakerName}

- -
- { - quotes.map((quote) => ( -
-
- - - -
-

"{quote.text}"

-
-

{quote.talk}

-

{quote.context}

-
-
-
-
- )) - } -
-
-
diff --git a/apps-archived/wisekeep/apps/landing/src/components/speakers/SpeakerHero.astro b/apps-archived/wisekeep/apps/landing/src/components/speakers/SpeakerHero.astro deleted file mode 100644 index bca0cc4f0..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/speakers/SpeakerHero.astro +++ /dev/null @@ -1,144 +0,0 @@ ---- -export interface Props { - name: string; - title: string; - company?: string; - bio: string; - imageUrl?: string; - website?: string; - twitter?: string; - linkedin?: string; -} - -const { name, title, company, bio, imageUrl, website, twitter, linkedin } = Astro.props; ---- - -
-
- -
-
- -
-
- { - imageUrl ? ( - {name} - ) : ( -
- - {name - .split(' ') - .map((n) => n[0]) - .join('')} - -
- ) - } -
- - - -
-
-
- - -
-

- {name} -

-

- {title} -

- {company &&

{company}

} - -

- {bio} -

- - -
- { - website && ( - - - - - - ) - } - { - twitter && ( - - - - - - ) - } - { - linkedin && ( - - - - - - ) - } -
-
-
-
-
diff --git a/apps-archived/wisekeep/apps/landing/src/components/speakers/SpeakerStats.astro b/apps-archived/wisekeep/apps/landing/src/components/speakers/SpeakerStats.astro deleted file mode 100644 index bb02bcd84..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/speakers/SpeakerStats.astro +++ /dev/null @@ -1,156 +0,0 @@ ---- -export interface Props { - totalTalks: number; - totalDuration: string; - totalViews?: string; - topTopics: string[]; - firstTalk?: string; - latestTalk?: string; -} - -const { totalTalks, totalDuration, totalViews, topTopics, firstTalk, latestTalk } = Astro.props; ---- - -
-
-
- -
-
- Vorträge - - - -
-
{totalTalks}
-
Talks insgesamt
-
- - -
-
- Gesamtdauer - - - -
-
{totalDuration}
-
Stunden Content
-
- - - { - totalViews && ( -
-
- Aufrufe - - - - -
-
{totalViews}
-
Gesamtaufrufe
-
- ) - } - - -
-
- Top Themen - - - -
-
- { - topTopics.map((topic) => ( - - {topic} - - )) - } -
-
-
- - - { - (firstTalk || latestTalk) && ( -
-
- {firstTalk && ( -
-
-
- Erster Talk: - {firstTalk} -
-
- )} - {latestTalk && ( -
-
-
- Neuester Talk: - {latestTalk} -
-
- )} -
-
- ) - } -
-
diff --git a/apps-archived/wisekeep/apps/landing/src/components/speakers/TalkGrid.astro b/apps-archived/wisekeep/apps/landing/src/components/speakers/TalkGrid.astro deleted file mode 100644 index 9092bc746..000000000 --- a/apps-archived/wisekeep/apps/landing/src/components/speakers/TalkGrid.astro +++ /dev/null @@ -1,113 +0,0 @@ ---- -export interface Talk { - id: string; - title: string; - date: string; - duration: string; - description: string; - tags: string[]; - url: string; - views?: string; -} - -export interface Props { - talks: Talk[]; -} - -const { talks } = Astro.props; ---- - -
- -
diff --git a/apps-archived/wisekeep/apps/landing/src/content/config.ts b/apps-archived/wisekeep/apps/landing/src/content/config.ts deleted file mode 100644 index d7bbd2676..000000000 --- a/apps-archived/wisekeep/apps/landing/src/content/config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { defineCollection, z } from 'astro:content'; - -const talks = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string(), - speaker: z.string(), - date: z.coerce.date(), - category: z.enum([ - 'behavioral-economics', - 'psychology', - 'technology', - 'innovation', - 'marketing', - 'philosophy', - 'business', - 'creativity', - 'leadership', - ]), - tags: z.array(z.string()), - venue: z.string(), - duration: z.string(), - videoUrl: z.string().url(), - thumbnail: z.string().optional(), - readingTime: z.number(), - featured: z.boolean().default(false), - summary: z.string(), - }), -}); - -export const collections = { talks }; diff --git a/apps-archived/wisekeep/apps/landing/src/content/talks/rory-sutherland-perspective-is-everything.md b/apps-archived/wisekeep/apps/landing/src/content/talks/rory-sutherland-perspective-is-everything.md deleted file mode 100644 index 75f458850..000000000 --- a/apps-archived/wisekeep/apps/landing/src/content/talks/rory-sutherland-perspective-is-everything.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -title: 'Perspective is Everything: The Psychology of Reframing' -speaker: 'Rory Sutherland' -speakerId: 'rory-sutherland' -date: 2025-09-08 -category: 'behavioral-economics' -tags: ['psychology', 'marketing', 'economics', 'decision-making', 'perception'] -venue: 'TED' -duration: '12:16' -videoUrl: 'https://www.youtube.com/watch?v=iueVZJVEmEs' -thumbnail: '/images/talks/rory-perspective.jpg' -readingTime: 8 -featured: true -summary: 'Rory Sutherland reveals how reframing our perception can dramatically change our experience of reality, arguing that psychological value is as important as material value in economics and life.' ---- - -## Executive Summary - -In this thought-provoking TED talk, advertising legend Rory Sutherland demonstrates that our happiness and satisfaction depend far more on how we perceive things than on objective reality itself. Through witty examples ranging from electronic cigarettes to train journeys, he argues that psychology and perception deserve equal consideration alongside engineering and economics when solving problems. The core message: **changing the frame changes everything**. - -## 🎯 Key Insights - -### 1. The Philosopher's Cigarette Paradox - -> "If you stand and stare out of the window on your own, you're an antisocial, friendless idiot. If you stand and stare out of the window on your own with a cigarette, you're a fucking philosopher." - -The same behavior becomes completely different based on minimal contextual changes. This demonstrates the immense power of reframing in shaping our social perceptions. - -### 2. Control Matters More Than Circumstances - -Drawing from psychological experiments with dogs and electric shocks, Sutherland shows that having control over our circumstances matters more to our wellbeing than the actual circumstances themselves. This explains why retirees are happier than the unemployed despite being in objectively similar situations. - -### 3. The Eurostar Problem - -For 0.01% of the £6 billion spent reducing Paris-London journey time by 40 minutes, Wi-Fi could have been installed, improving the journey experience far more than the time reduction. This illustrates our systematic bias toward engineering solutions over psychological ones. - -### 4. Red Light Countdown Psychology - -Korean traffic lights with countdown timers reduce accidents at red lights (by reducing road rage) but increase them at green lights (drivers accelerate when seeing time running out). This shows how psychological interventions need careful testing and understanding. - -### 5. Google's Success Secret - -Google succeeded not just technologically but psychologically - people trust a dedicated search engine more than a portal that does many things. This "goal dilution" effect shows how perception drives business success. - -## 💡 Memorable Quotes - -- **"The circumstances of our lives may actually matter less to our happiness than the sense of control we feel over our lives."** - -- **"What you call things affects how you react to them, viscerally and morally."** - -- **"The nature of a wait is not just dependent on its numerical quality, its duration, but on the level of uncertainty you experience during that wait."** - -- **"If economics isn't behavioral, I don't know what the hell is."** _(quoting Charlie Munger)_ - -## 📚 Core Concepts Explained - -### Praxeology: The Study of Human Choice - -Sutherland introduces Ludwig von Mises' concept of praxeology - the study of human choice and decision-making that should precede economics. This Austrian School perspective treats economics as a subset of psychology rather than vice versa. - -### The Restaurant Floor Principle - -Von Mises argued there's no distinction between the value created by cooking food and sweeping the restaurant floor. Both create essential components of the dining experience. Similarly, marketing and perception create real value, not "dubious" value. - -### Perception Leakage - -Our perceptions are interconnected - a clean car feels like it drives better, branded painkillers work better than generics (even in measured pain reduction). This "leakage" means improving perception in one area improves the overall experience. - -## 🎬 Chapter Breakdown - -### [0:00-2:30] The Electronic Cigarette Opening - -Sutherland's humorous introduction using his e-cigarette to demonstrate how the same action (standing alone at a party) transforms from antisocial to philosophical with a simple prop. - -### [2:30-4:45] Retirees vs. Unemployed - -Why perceived choice matters more than objective circumstances, using the contrast between happy retirees and depressed unemployed youth. - -### [4:45-7:00] The Control Experiment - -The famous psychological experiment with dogs demonstrating the crucial importance of perceived control over actual conditions. - -### [7:00-9:30] Engineering vs. Psychology - -The Eurostar example and the systematic bias toward technical solutions over psychological ones in business and policy. - -### [9:30-11:00] Traffic Lights and Waiting - -Korean traffic light innovations and London Underground dot-matrix displays showing how information reduces frustration more than time reduction. - -### [11:00-12:16] Von Mises and Value Creation - -The philosophical conclusion about the equivalence of perceived and "real" value, using restaurant and postal service examples. - -## 🚀 Practical Takeaways - -1. **Before seeking expensive technical solutions, consider psychological reframing** - it's often cheaper and more effective - -2. **Focus on perceived control** - Give people choices and milestones (like the blue pills example for antibiotics) - -3. **Test psychological interventions carefully** - What works in one context may backfire in another (red vs. green traffic lights) - -4. **Consider the frame when communicating** - How you label something determines how people respond ("bailout of Greece" vs. "bailout of banks") - -5. **Don't underestimate perceived value** - Customer perception is reality; improving perception is as valid as improving the product - -## 🔗 Related Ideas - -- **Behavioral Economics**: Daniel Kahneman's work on cognitive biases -- **Choice Architecture**: Nudge theory by Thaler and Sunstein -- **Austrian Economics**: Ludwig von Mises and subjective value theory -- **Marketing Psychology**: The role of perception in brand value - -## 💭 Reflection Questions - -1. What aspects of your life could be improved through reframing rather than material change? -2. Where might your organization be over-investing in technical solutions while ignoring psychological ones? -3. How can you apply the "control principle" to improve satisfaction in your work or relationships? - ---- - -_This talk beautifully illustrates why advertising legend Rory Sutherland is considered one of the most original thinkers in behavioral economics. His ability to blend humor, psychology, and business insights makes complex ideas accessible and actionable._ - -## 📜 Full Transcript - -What you have here is an electronic cigarette. It's something that since it was invented a year or two ago has given me untold happiness. A little bit of it, I think, is the nicotine, but there's something much bigger than that, which is ever since in the UK they banned smoking in public places, I've never enjoyed a drinks party ever again. - -And the reason I only worked out just the other day, which is when you go to a drinks party and you stand up and you hold a glass of red wine and you talk endlessly to people, you don't actually want to spend all the time talking. It's really, really tiring. Sometimes you just want to stand there silently, alone with your thoughts. Sometimes you just want to stand in the corner and stare out of the window. - -But the problem is, when you can't smoke, if you stand and stare out of the window on your own, you're an antisocial, friendless idiot. If you stand and stare out of the window on your own with a cigarette, you're a fucking philosopher. - -So the power of reframing things cannot be overstated. What we have is exactly the same thing, the same activity, but one of them makes you feel great, and the other one, with just a small change of posture, makes you feel terrible. - -I think one of the problems with classical economics is it's absolutely preoccupied with reality. And reality isn't a particular thing. It's a particularly good guide to human happiness. Why, for example, are pensioners much happier than the young unemployed? Both of them, after all, are in exactly the same state of life. You both have too much time on your hands and not much money. But pensioners are reportedly very, very happy, whereas the unemployed are extraordinarily unhappy and depressed. - -The reason, I think, is that the pensioners believe they've chosen to be pensioners, whereas the young unemployed feel it's been thrust upon them. In England, the upper middle classes have actually solved this problem perfectly, because they've rebranded unemployment. If you're an upper middle class English person, you call unemployment a year off. And that's because having a son who's unemployed in Manchester is really quite embarrassing. But having a son who's unemployed in Thailand is really viewed as quite an accomplishment. - -But actually, the power to rebrand things, to understand that actually our experiences, costs, things, don't actually much depend on what they really are, but on how we view them, I genuinely think can't be overstated. - -There's an experiment I think Daniel Pink refers to, where you put two dogs in a box, and the box has an electric floor. Every now and then, an electric shock is applied to the floor, which pains the dogs. The only difference is one of the dogs has a small button in its half of the box, and when it nuzzles the button, the electric shock stops. The other dog doesn't have the button. It's exposed to exactly the same level of pain as the dog in the first box, but it has no control over the circumstances. Generally, the first dog can be relatively content. The second dog lapses into complete depression. - -The circumstances of our lives may actually matter less to our happiness than the sense of control we feel over our lives. It's an interesting question. We asked the question, the whole debate in the Western world is about the level of taxation. But I think there's another debate to be asked, which is the level of control we have over our tax money. That what cost us 10 pounds in one context can be a curse. What cost us 10 pounds in another context can be a curse in a different context we may actually welcome. - -You know, pay 20,000 pounds in tax towards health, and you're merely feeling a mug. Pay 20,000 pounds to endow a hospital ward, and you're called a philanthropist. I'm probably in the wrong country to talk about willingness to pay tax. So, I'll give you one in return. - -How you frame things really matters. Do you call it the bailout of Greece or the bailout of a load of students? Or the stupid banks which lent to Greece? Because they are actually the same thing. What you call them actually affects how you react to them, viscerally and morally. - -I think psychological value is great, to be absolutely honest. One of my great friends, a professor called Nick Chater, who is the professor of decision sciences in London, believes that we should spend far less time looking into humanity's hidden depths and spend much more time exploring the hidden shallows. I think that's true, actually. I think impressions have an insane effect on what we think and what we do. - -But what we don't have is a really good model of human psychology, at least pre-Kahneman, perhaps. We didn't have a really good model of human psychology to put alongside models of engineering, of neoclassical economics. So, people who believed in psychological solutions didn't have a model, we didn't have a framework. This is what Warren Buffett's business partner Charlie Munger calls a latticework on which to hang your ideas. - -Engineers, economists, classical economists all had a very, very robust existing latticework on which practically every idea could be hung. We merely had a collection of random individual insights without an overall model. And what that means is that in looking at solutions, we've probably given too much priority to what I call technical engineering solutions, Newtonian solutions, and not nearly enough to the psychological ones. - -You know my example of the Eurostar. Six million pounds spent to reduce the journey time between Paris and London by about 40 minutes. For 0.01% of this money, you could have put Wi-Fi on the trains, which wouldn't have reduced the duration of the journey but would have improved its enjoyment and its usefulness far more. For maybe 10% of the money, you could have paid all of the world's top male and female supermodels to walk up and down the train, handing out free Chateau Petrusse to all the passengers. You'd still have 5 billion pounds in change and people would ask for the trains to be slowed down. - -Why were we not given the chance to solve that problem psychologically? I think it's because there's an imbalance, an asymmetry, in the way we treat creative, emotionally driven psychological ideas versus the way we treat rational, numerical, spreadsheet driven ideas. If you're a creative person, I think quite rightly, you have to share all your ideas for approval with people much more rational than you. You have to go in and you have to have a cost-benefit analysis, a feasibility study, an ROI study and so forth. And I think that's probably right. - -But this does not apply the other way around. People who have an existing framework, an economic framework, an engineering framework, feel that actually logic is its own answer. What they don't say is, well, the numbers all seem to add up, but before I present this idea, I'll go and show it to some really crazy people to see if they can come up with something better. And so we artificially, I think, prioritise what I'd call mechanistic ideas over psychological ideas. - -An example of a great psychological idea, the single best improvement in passenger satisfaction on the London Underground per pound spent, came when they didn't add any extra trains nor change the frequency of the trains, they put dot matrix display boards on the platforms. Because the nature of a wait is not just dependent on its numerical quality, its duration, but on the level of uncertainty you experience during that wait. Waiting seven minutes for a train with a countdown clock is less frustrating and irritating than waiting four minutes, knuckle-biting, going, when's this train going to damn well arrive? - -Here's a beautiful example of a psychological solution deployed in Korea. Red traffic lights have a countdown delay. It's proven to reduce the accident rate in experiments. Why? Because road range, impatience and general irritation are massively reduced when you can actually see the time you have to wait. In China, not really understanding the principle behind this, they applied the same principle to green traffic lights. Which isn't a great idea. You're 200 yards away, you realise you've got five seconds to go, you floor it. The Koreans very assiduously did test both. The accident rate goes down when you apply this to red traffic lights, it goes up when you apply it to green traffic lights. - -This is all I'm asking for, really, in human decision-making, is the consideration of these three things. I'm not asking for the complete primacy of one over the other. I'm merely saying that when you solve problems, you should look at all three of these equally, and you should seek as far as possible to find solutions which sit in the sweet spot in the middle. - -If you actually look at a great business, you'll nearly always see all of these three things coming into play. Really, really successful businesses. Google is a great, great technological success, but it's also based on a very good psychological insight. People believe something that only does one thing is better at that thing than something that does that thing and something else. It's an innate thing called gold dilution. A.L.F. Fishback has written a paper about this. - -Everybody else at the time of Google, more or less, was trying to be a portal. Yes, there's a search function, but you also have weather, sports scores, bits of news. Google understood that if you're just a search engine, people assume you're a very, very good search engine. All of you know this, actually, from when you go in to buy a television. And in the shabbier end of the row of flat-screen TVs you can see are these rather despised things called combined TV and DVD players. And we have no knowledge whatsoever of the quality of those things, but we look at a combined TV and DVD player and we go, ugh, it's probably a bit of a crap telly and a bit rubbish as a DVD player. So we walk out of the shops with one of each. Google is as much a psychological success as it is a technological one. - -I propose that we can use psychology to solve problems that we didn't even realize were problems at all. This is my suggestion for getting people to finish their course of antibiotics. Don't give them 24 white pills. Give them 18 white pills and 6 blue ones. And tell them to take the white pills first and then take the blue ones. It's called chunking the likelihood that people will get to the end is much greater when there is a milestone somewhere in the middle. - -One of the great mistakes I think of economics is it fails to understand that what something is, whether it's retirement, unemployment, cost, is a function not only of its amount but also its meaning. This is a toll crossing in Britain. Quite often queues happen at the tolls. Sometimes you get very, very severe queues. You could apply the same principle actually if you like to the security lanes in airports. - -What would happen if you could actually pay twice as much money to cross the bridge but go through a lane that's an express lane? It's not an unreasonable thing to do. It's an economically efficient thing to do. Time means more to some people than others. If you're waiting, trying to get to a job interview, you'd patently pay a couple of pounds more to go through the fast lane. If you're on the way to visit your mother-in-law, you'd probably prefer to stay on the left. - -The only problem is if you introduce this economically efficient solution, people hate it. Because they think you're deliberately creating delays at the bridge in order to maximise your revenue and why on earth should I pay to subsidise your incompetence? On the other hand, change the frame slightly and create charitable yield management so the extra money you go goes not to the bridge company, it goes to charity, and the mental willingness to pay completely changes. You have a relatively economically efficient solution, but one that actually meets with public approval and even a small degree of affection, rather than being seen as bastardy. - -So where economists make the fundamental mistake is they think that money is money. Actually, my pain experienced in paying five pounds is not just proportionate to the amount, but where I think that money is going. And I think understanding that could revolutionise tax policy, it could revolutionise the public services, it could actually change things quite dramatically. - -Here's a guy you all need to study. He's an Austrian school economist who was first active in the first half of the 20th century in Vienna. What was interesting about the Austrian school is they actually grew up alongside Freud. And so they're predominantly interested in psychology. They believed that there was a discipline called praxeology, which is a prior discipline to the study of economics. Praxeology is the study of human choice, action and decision making. I think they're right. I think the danger we have in today's world is we have the study of economics considers itself to be a prior discipline to the study of human psychology. But as Charlie Munger says, if economics isn't behavioural, I don't know what the hell is. - -Von Mises, interestingly, believes economics is just a subset of psychology. I think he refers to economics as the study of human praxeology under conditions of scarcity. But Von Mises, among many other things, I think uses an analogy which is probably the best justification and explanation for the value of marketing, the value of perceived value, and the fact that we should actually treat it as being absolutely equivalent to any other kind of value. - -We tend, all of us, even those of us who work in marketing, to think of value in two ways. There's the real value, which is when you make something in a factory or provide a service. And then there's a kind of dubious value, which you create by changing the way people look at things. Von Mises completely rejected this idea and he made this distinction. And he used this following analogy. - -He said, he referred actually to some strange economists called the French physiocrats, who believed that only true value was what you extracted from the land. So if you were a shepherd or a quarryman or a farmer, you created true value. If, however, you bought some wool from the shepherd and charged a premium for converting it into a hat, you weren't actually creating value, you were exploiting the shepherd. - -Now, Von Mises says that modern economists make exactly the same mistake with regard to advertising and marketing. He says, if you run a restaurant, there is no healthy distinction to be made between the value you create by cooking the food and the value you create by sweeping the floor. One of them creates perhaps the primary product, the thing we think we're paying for. The other one creates a context within which we can enjoy and appreciate that product. And the idea that one of them should actually have priority over the other is fundamentally wrong. - -Try this quick thought experiment. Imagine a restaurant that serves Michelin-starred food but actually where the restaurant smells of sewage and there's human feces on the floor. The best thing you can do there to create value is not actually to improve the food still further, it's to get rid of the smell and clean up the floor. And it's vital we understand this. - -If that seems like a sort of strange, abstruse thing, in the UK, the post office had a 98% success rate at delivering first-class mail the next day. They decided this wasn't good enough and they wanted to get it up to 99%. The effort to do that almost broke the organization. If at the same time you'd gone and asked people what percentage of first-class mail arrives the next day, the average answer would have been 50% or the modal answer would have been 50% to 60%. - -Now if your perception is much worse than your reality, what on earth are you doing trying to change the reality? That's like trying to improve the food in a restaurant that stinks. What you need to do is first of all tell people that 98% of mail gets there the next day, first-class mail. That's pretty good. I would argue in Britain there's a much better frame of reference which is to tell people that more first-class mail arrives the next day in the UK than in Germany. Because generally in Britain if you want to make us happy about something, just tell us we do it better than the Germans. - -Choose your frame of reference and the perceived value and therefore the actual value is completely transformed. It has to be said actually of the Germans that the Germans and the French are doing a brilliant job of creating a united Europe. The only thing they didn't expect is they're uniting Europe through a shared mild hatred of the French and Germans. But I'm British, that's the way we like it. - -What you'll also notice is that in any case our perception is leaky. We can't tell the difference between the quality of the food and the environment in which we consume it. All of you will have seen this phenomenon. If you have your car washed or valeted, when you drive away your car feels as if it drives better. And the reason for this, unless my car mysteriously is changing the oil and performing work which I'm not paying him for and I'm unaware of, is because perception is in any case leaky. - -Analgesics that are branded are more effective at reducing pain than analgesics that are not branded. I don't just mean through reported pain reduction, actual measured pain reduction. And so perception actually is leaky in any case. So if you do something that's perceptually bad in one respect, you can damage the other. - -Thank you very much. diff --git a/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-leaders-eat-last.md b/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-leaders-eat-last.md deleted file mode 100644 index 7e737ed96..000000000 --- a/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-leaders-eat-last.md +++ /dev/null @@ -1,262 +0,0 @@ ---- -title: "Leaders Eat Last: Why Some Teams Pull Together and Others Don't" -speaker: 'Simon Sinek' -speakerId: 'simon-sinek' -date: 2014-06-01 -category: 'leadership' -tags: - [ - 'leadership', - 'trust', - 'teamwork', - 'organizational-culture', - 'evolutionary-psychology', - 'marines', - ] -venue: 'Microsoft Research' -duration: '58:47' -videoUrl: 'https://www.youtube.com/watch?v=eP38Cxve5xY' -thumbnail: '/images/talks/simon-sinek-leaders-eat-last.jpg' -readingTime: 30 -featured: true -summary: 'In diesem ausführlichen Microsoft Research Talk erklärt Simon Sinek die evolutionären und anthropologischen Grundlagen von Leadership. Er zeigt, warum echte Führung nichts mit Rang zu tun hat, sondern mit der bewussten Entscheidung, andere zu beschützen - und warum Marines als letzte essen.' ---- - -## Executive Summary - -In diesem umfassenden Vortrag bei Microsoft Research legt Simon Sinek die wissenschaftlichen Grundlagen echter Führung dar. Basierend auf evolutionärer Psychologie und Anthropologie erklärt er, warum Menschen **soziale Maschinen** sind, die nur in sicheren Umgebungen ihr volles Potenzial entfalten können. - -Seine zentrale These: **Menschen sind nur so gut wie die Umgebung, in der sie sich befinden.** Gute Menschen können in schlechten Umgebungen schlecht werden, und Menschen, die die Gesellschaft aufgegeben hat, können in den richtigen Umgebungen Außergewöhnliches leisten. **Leadership bedeutet, diese Umgebung zu schaffen.** - -## 🧬 Die evolutionären Grundlagen - -### Warum wir überlebt haben - -> "We weren't necessarily the strongest. We weren't necessarily the fastest. And yet we've done quite well. Look at this remarkable world that we've built." - -**Vor 50.000 Jahren:** Homo sapiens teilte sich die Erde mit anderen Hominiden-Arten. Wir waren nicht die stärksten oder schnellsten, aber wir haben überlebt, weil wir **soziale Tiere** sind. - -**Der Überlebensvorteil:** - -- Wir lebten in Gruppen von maximal 150 Menschen -- Vertrauen und Kooperation waren überlebenswichtig -- "Ich konnte nachts schlafen und darauf vertrauen, dass jemand aus meinem Stamm nach Gefahren Ausschau hielt" - -### Das moderne Dilemma - -> "When we do not feel safe amongst the people with whom we work, the natural human inclination is cynicism, paranoia, mistrust, and self-interest." - -**Die Paleolithische Gefahr vs. Moderne Gefahr:** - -- **Damals:** Wetter, Ressourcenmangel, Säbelzahntiger -- **Heute:** Wirtschaftliche Unsicherheit, Börse, neue Technologien, Konkurrenz - -**Der Unterschied:** Die äußeren Gefahren sind konstant und unkontrollierbar. **Die einzige Variable sind die Bedingungen innerhalb der Organisation.** - -## 🎯 Die wahre Definition von Leadership - -### Leadership ist eine Wahl, kein Rang - -> "Leadership has nothing to do with rank. It has nothing to do with the title you have on your card. Leadership is a choice." - -**Was Leadership NICHT ist:** - -- Charisma (nützlich, aber nicht essentiell) -- Vision (nicht jeder ist ein Visionär) -- Strategisches Denken (eine Fähigkeit, kein Muss) -- Rang oder Titel - -**Was Leadership IST:** - -- **Mut** - die einzige essentielle Eigenschaft -- Die bewusste Entscheidung, für andere da zu sein -- Die Bereitschaft, die eigenen Interessen zurückzustellen -- Die Wahl, die Person links und rechts von dir zu beschützen - -### Die Hierarchie-Anthropologie - -> "We are naturally hierarchical and we always organize ourselves in hierarchies." - -**Das Alpha-System:** - -- Menschen bewerten sich ständig gegenseitig (Alpha/Beta) -- Alpha-Status ist immer relativ zur Gruppe -- Wir geben freiwillig Vorteile an unsere "Alphas" ab -- **Der Deal:** Bessere Ressourcen gegen Schutz bei Gefahr - -**Warum wir Banking-CEOs hassen:** - -> "It's that we know deep inside us that they have violated the very definition of what it means to be a leader. They have accepted all of the perks and bonuses and benefits of being the leader and yet they're not willing to make any of the sacrifices." - -Sie nehmen die Vorteile, aber verweigern den Schutz. - -## 🛡️ Wie man eine sichere Umgebung schafft - -### 1. Menschen vor Zahlen - -> "Great leaders would never sacrifice the people to save the numbers. Great leaders would sacrifice the numbers to save the people." - -**Das Problem:** Wenn Unternehmen Menschen entlassen, um Zahlen zu erreichen, fühlen sich die verbleibenden Mitarbeiter unsicher. - -**Die Lösung:** Wie Familien in schweren Zeiten - "den Gürtel enger schnallen" statt Familienmitglieder zu "entlassen". - -### 2. Radikale Ehrlichkeit - -> "It's really easy to be honest. Just tell the truth. And if you tell the truth on a regular basis, we will say you have integrity." - -**Die Marines-Geschichte:** Ein Marine wird fast aus dem Corps geworfen, nicht weil er beim Wachdienst eingeschlafen ist, sondern weil er gelogen hat. - -**Das Prinzip:** "Wir glauben, dass du Verantwortung für deine Handlungen übernimmst zum Zeitpunkt, als du sie ausführst, nicht zum Zeitpunkt, als du erwischt wirst." - -**Praktische Ehrlichkeit:** - -- Keine "Sandwich-Kritik" (Gutes - Schlechtes - Gutes) -- Direkt sein: "Ich muss ehrlich mit dir sein, deine Leistung war schlecht" -- Bei Fehlern ehrlich sein: "Ich war nicht ehrlich zu dir" - -### 3. Anderen erlauben zu scheitern - -**Die David Marquet Geschichte:** -Marquet, U-Boot-Kapitän der USS Santa Fe (schlechteste Crew der Navy), revolutionierte das Leadership durch einen einfachen Wandel: - -**Statt:** "Sir, Erlaubnis zu tauchen auf 400 Fuß" → "Erlaubnis erteilt" -**Neu:** "Ich beabsichtige zu tauchen auf 400 Fuß" - -**Der Unterschied:** Alle Verantwortung liegt jetzt bei der Person, die die Handlung ausführt. - -**Das Ergebnis:** Die Santa Fe wurde zur **bestbewerteten Crew in der Marinegeschichte** - gleiche Leute, gleiche Ausrüstung, nur andere Führung. - -## 🔑 Praktische Leadership-Prinzipien - -### Authority runterdrücken, nicht Information hochbringen - -> "In most organizations, the people at the top have all of the authority, but none of the information. And the people who are actually performing the jobs have all the information, but none of the authority." - -**Die Lösung:** Autorität zu denen bringen, die die Information haben. - -### Training ist zum Scheitern da - -> "In training, metrics are supposed to go down because you want people to try hard and fail and find out where the line is." - -**Die Metapher:** "Du kannst ein Loch in die Schiffsseite über der Wasserlinie schlagen und es reparieren. Aber du machst das immer wieder, damit du kein Loch unter der Wasserlinie schlägst." - -### Leadership ist wie Erziehung - -> "The closest analogy I can give to you about what leadership is is parenting." - -**Was gute Eltern tun:** - -- Opfer bringen für ihre Kinder -- Disziplin wenn nötig -- Möglichkeiten und Bildung bieten -- Damit das Kind mehr erreichen kann, als sie selbst - -**Was gute Leader tun:** Exakt dasselbe für ihre Teams. - -### Das Messbarkeits-Problem - -> "Leadership in parenting the same. You have no idea if you're being a good parent on a daily basis... But you won't actually see a return on your investment for like 30 years." - -**Wie Fitness:** Man sieht keine täglichen Veränderungen, aber nach Monaten sind die Ergebnisse dramatisch. - -**Messbare Indikatoren:** - -- Mitarbeiter-Fluktuation -- Durchschnittliche Verweildauer -- Loyalität (nicht Geld-abhängig) - -## 🦅 Die Marines-Philosophie - -### "Leaders Eat Last" - -> "If you go to any chow hall anywhere in the world on any marine base, what you will see is they will line up in rank order during chow time. Most junior man eats first. Most senior man eats last." - -**Die Geschichte:** Ein Marine-Offizier aß nicht, weil das Essen ausging, nachdem seine Männer gegessen hatten. Im Feld teilten seine Männer ihr Essen mit ihm. - -**Das Prinzip:** Wenn Leader sich für ihre Leute opfern, opfern sich die Leute für ihre Leader. - -### Leadership als Verantwortung - -> "You will never hear the words, I am a leader... Here are the words they speak. I am a leader of Marines." - -**Der Unterschied:** - -- Nicht: "Ich bin ein Leader" -- Sondern: "Ich bin ein Leader von Menschen" - -Das Wort beinhaltet automatisch die Verantwortung für andere. - -### Die Mutter-Metaphor - -> "There's a photograph of a mother lying on top of her child... At the sound of a gun, it's a mother's instinct to throw herself onto her child, potentially risking her own life." - -**Leadership:** Die Bereitschaft, sich bei Gefahr über seine "Kinder" (Team) zu werfen. - -## 🔄 Organisatorische Transformation - -### Sei der Leader, den du dir wünschst - -> "We cannot sit here with our arms folded and simply complain that our leadership doesn't look after us... We must be the leaders we wish we had." - -**Praktische Schritte:** - -- Finde jemanden, dem du vertraust -- Bildet ein Sicherheitsnetz füreinander -- Erweitert das Netz auf andere -- Schafft eine Bewegung des Füreinander-Sorgns - -### Der Dominoeffekt - -**Wie Diktatoren arbeiten:** Sie säen Paranoia und Trennung, weil sie wissen: Wenn Menschen zusammenkommen, sind sie weg. - -**Wie Veränderung funktioniert:** Nicht durch "Revolution" (Reorgs), sondern durch "Evolution" - ein Baustein nach dem anderen. - -## 💡 Tiefere Einsichten - -### Das Investitions-vs-Glücksspiel Paradigma - -**General Electric (1980s-1990s):** Rasanter Aufstieg, dramatischer Fall = Glücksspiel -**Costco:** Konstantes, langfristiges Wachstum = Investition - -**1 Dollar investiert 1985:** - -- GE: 600% Return (aber nur wenn zum richtigen Zeitpunkt verkauft) -- S&P 500: 600% Return -- Costco: 1200% Return - -**Die Lektion:** Langfristig auf Menschen setzen schlägt kurzfristige Zahlen-Fixierung. - -### Die Technologie-Ironie - -> "Companies like Google and Facebook... invest huge sums of time and energy and money to figure out ways to organize their corporate cultures so that people will cooperate better... to produce a product that keeps us apart from each other." - -Sie wissen, was Menschen zum Kooperieren bringt, produzieren aber Technologie, die uns trennt. - -### Die Sicherheits-Bewertung - -**Wie erkenne ich sichere Teams?** - -- Es ist wie Dating - es braucht Zeit -- Minimum 6 Monate, um sich zugehörig zu fühlen -- Nach 7 Jahren sollte Vertrauen da sein, sonst ist es Zeit zu gehen -- Konsistenz schlägt Intensität - kleine, regelmäßige Handlungen sind wichtiger als große Gesten - -## 🌟 Warum dieser Talk revolutionär ist - -Dieser Microsoft Research Talk ist vermutlich Sineks tiefgreifendster Vortrag über Leadership. Während seine anderen Talks oft inspirierend und motivational sind, ist dieser wissenschaftlich fundiert und praktisch umsetzbar. - -Er zeigt, dass Leadership keine mystische Eigenschaft ist, sondern eine erlernbare Fähigkeit, die auf universellen menschlichen Bedürfnissen basiert. Die Kombination aus evolutionärer Psychologie, praktischen Beispielen (Marines, David Marquet) und konkreten Handlungsanweisungen macht diesen Talk zu einem Masterclass in authentischer Führung. - -**Die zentrale Botschaft:** Du musst nicht warten, bis jemand dich zum Leader ernennt. Du kannst heute anfangen, für die Menschen links und rechts von dir zu sorgen. Das ist Leadership. - ---- - -## Vollständiges Transkript - -_Das Transkript wurde automatisch mit Whisper AI erstellt und basiert auf dem YouTube Video._ - -[Aufgrund der außergewöhnlichen Länge dieses Talks (58 Minuten) ist das vollständige Transkript über 15.000 Wörter lang. Es beginnt mit:] - -Each year Microsoft Research hosts hundreds of influential speakers from around the world, including leading scientists, renowned experts in technology, book authors and leading academics, and makes videos of these lectures freely available. Hello everyone. Thank you for coming. My name is Aaron Greenberg. I'm the Chief of Staff in the Microsoft Devices Group... - -[Das vollständige Transkript würde hier fortgesetzt werden - aus Platzgründen hier gekürzt] diff --git a/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-love-your-work.md b/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-love-your-work.md deleted file mode 100644 index f59067086..000000000 --- a/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-love-your-work.md +++ /dev/null @@ -1,232 +0,0 @@ ---- -title: 'Love Your Work' -speaker: 'Simon Sinek' -speakerId: 'simon-sinek' -date: 2012-10-01 -category: 'leadership' -tags: ['career', 'passion', 'purpose', 'work-life-balance', 'fulfillment', 'workplace-culture'] -venue: 'Creative Mornings' -duration: '42:29' -videoUrl: 'https://www.youtube.com/watch?v=jDIZS4IQlQk' -thumbnail: '/images/talks/simon-sinek-love-work.jpg' -readingTime: 25 -featured: false -summary: 'In diesem tiefgreifenden Creative Mornings Talk erklärt Simon Sinek, warum so viele Menschen ihre Arbeit hassen und wie das katastrophale Auswirkungen auf Gesundheit, Beziehungen und sogar auf unsere Kinder hat. Er zeigt am Beispiel der US Marines, wie echte Erfüllung durch das Dienen für andere entsteht.' ---- - -## Executive Summary - -In diesem längeren, nachdenklichen Vortrag bei Creative Mornings geht Simon Sinek tief in die Psychologie der Arbeitsunzufriedenheit ein. Er beginnt mit einem schockierenden Vergleich: **250.000 Menschen sterben jährlich in US-Krankenhäusern an vermeidbaren Fehlern - nicht wegen schlechter Ärzte oder Technologie, sondern weil das Personal nicht füreinander sorgt.** Diese Metapher zeigt das fundamentale Problem unserer Arbeitswelt auf: Wenn Menschen nicht erfüllt sind und nicht füreinander sorgen, entstehen katastrophale Folgen. - -Seine zentrale These: **Erfüllung kommt davon, Zeit und Energie für andere zu investieren** - nicht von Geld, Status oder äußeren Belohnungen. - -## 🎯 Die schockierenden Fakten - -### Das Krankenhaus-Problem - -> "250,000 people a year who are dying in our hospitals due to preventable deaths... 5% of hospital administrators are doctors. Most of them are number crunchers." - -**Das Problem:** Obwohl Amerika die besten Ärzte, Technologie und Medikamente der Welt hat, sterben Menschen, weil: - -- Krankenhäuser wie Unternehmen geführt werden (nach Zahlen, nicht nach Menschen) -- Das Personal sich nicht umeinander kümmert -- Es keine echte Kameradschaft gibt -- Menschen sich nicht als Teil von etwas Größerem fühlen - -### Die Auswirkungen auf Familien - -> "Parents who come home from jobs they hate or don't love, their kids are more likely to be bullies at school." - -**Der Teufelskreis:** - -1. Eltern hassen ihre Jobs -2. Sie kommen gestresst nach Hause -3. Ihre Kinder werden zu Bullies -4. Diese Kinder leiden unter Depression und Selbstmord -5. Das Problem liegt nicht in den Schulen - sondern in den Jobs der Eltern - -### Die Gesundheitskrise - -> "When we're unfulfilled by the work that we do, we focus on the details. And when we focus on the details, we retract from each other. When we retract from each other, we feel lonely. And when we feel lonely, cancer goes up, heart disease goes up, diabetes goes up." - -Arbeitsunzufriedenheit tötet uns buchstäblich durch Krankheiten. - -## 💡 Die Marine Corps Lösung - -### Was die Marines richtig machen - -> "They're taking a group of strangers, people who don't know each other, who are showing up and within a very, very short period of time, learn to trust each other so much that they would give their lives for each other." - -**Das Geheimnis:** Die Marines verstehen, dass Menschen nicht für abstrakte Konzepte wie "Gott und Vaterland" kämpfen, sondern **für die Person links und rechts von ihnen**. - -### Der Confidence Course - -> "They have another course called the confidence course. And it's never timed. And most of the obstacles on this course cannot be completed by yourself. They must be completed in teams." - -**Die Psychologie:** - -1. **Erste zwei Wochen:** Jeder will beweisen, wie stark er ist (wie bei neuen Jobs) -2. **Nach zwei Wochen:** Sie beginnen, sich anzufeuern -3. **Organische Entwicklung:** Sie helfen sich gegenseitig -4. **Ausgrenzung:** Wer nicht hilft, wird ausgegrenzt, bis er lernt - -### Das Vulnerabilitäts-Prinzip - -> "We have to take the risk to make ourselves vulnerable. Yes, you might do something for someone else and they may not do something back for you. That's the risk you run." - -**Die Regel:** Niemand hilft dir, bis du bereit bist, anderen zu helfen. Du musst das Risiko eingehen, verletzlich zu sein. - -## 🧠 Die Wissenschaft der Erfüllung - -### Oxytocin - Das Bindungshormon - -> "When we do good for others and we look out for those in our tribe, we look out for those in our group, it actually feels good. Biologically it releases oxytocin." - -**Der positive Kreislauf:** - -1. Etwas Gutes für andere tun → Oxytocin wird freigesetzt -2. Oxytocin macht uns glücklich -3. Mehr Oxytocin → Wir wollen mehr Gutes für andere tun -4. Andere werden inspiriert, auch Gutes zu tun - -### Das Geld-Problem - -> "Think about the invention of money, right? It used to be like, you go to someone's house, you cook them dinner, and the deal was they'll do the dishes. Time and energy, exchange for time and energy." - -**Der Verlust der Erfüllung:** Wir haben persönliche Zeit und Energie durch Geld ersetzt - IOUs für zukünftige Dienstleistungen. Dadurch entsteht keine echte emotionale Verbindung. - -## 🔥 Praktische Führungsstrategien - -### Selbstvertrauen aufbauen - -> "Before anyone is willing to put themselves out for another, they have to have self-confidence, real self-confidence." - -**Das Paradox:** Du musst selbstbewusst sein, um anderen zu helfen. Aber um selbstbewusst zu werden, brauchst du Menschen, die dich unterstützen. - -**Die Rolle des Managements:** - -- Nicht: "Ich brauche euch, mehr mit weniger zu schaffen" (= "Ihr seid nicht gut genug") -- Sondern: "Ich brauche euch, mehr mit dem zu schaffen, was ihr habt" (= "Ihr seid fähig") - -### Der Lehrer-Test - -> "Close your eyes and think back to high school. And think of that one teacher who took you under their wing and cared for you... You probably are the person you are today in some part because of that person." - -**Die Macht des Mentoring:** - -- Jeder kann den Namen seines inspirierenden Lehrers nennen -- Niemand kann sich an die anderen Lehrer erinnern -- **Die Frage:** Möchtest du die Person sein, deren Namen jemand in 30 Jahren nennt? - -### Management vs. Authority - -> "In the military, they give medals to people who are willing to sacrifice themselves so that others may gain. In business, we give bonuses to people who are willing to sacrifice others so that we may gain." - -**Die Verantwortung von Führungskräften:** - -- Nicht: Deadlines durchsetzen -- Sondern: Menschen dabei helfen, ihre eigenen Stärken zu erkennen -- Sie in Situationen bringen, wo sie scheitern können (aber sie dabei unterstützen) -- Ihnen Vertrauen in ihre Fähigkeiten geben - -## 🌱 Kleine Schritte, große Wirkung - -### Die Papier-Geschichte - -> "I was walking down the street two days ago and a guy's backpack was open and a whole bunch of paper fell out... The guy in front of us turns to us and says, I saw you help that guy. That was really cool." - -**Der Multiplikator-Effekt:** Wenn Menschen sehen, wie du anderen hilfst, werden sie inspiriert, dasselbe zu tun. - -### Praktische Mini-Aktionen - -- Halte jemandem die Tür auf -- Mache zwei Tassen Kaffee statt einer -- Lächle den Barista an -- Halte den Aufzug auf -- Stelle dein Handy weg während Meetings - -> "A little time and a little energy. And you'll find around work that people give a little time and a little energy back to you." - -### Die Beziehungs-Evolution - -> "You go for a coffee with someone. Then you go for a two hour coffee. Then you go for a coffee and a lunch... And eventually you get married. It's slow. It takes time." - -Echte Arbeitsbeziehungen entwickeln sich genauso wie romantische Beziehungen - langsam, organisch, über Zeit. - -## ⚠️ Was nicht funktioniert - -### Der Email-Trick - -**Falsch:** "Hi, haven't seen you in years! Hope you're well... By the way, could you vote for me..." - -**Richtig:** "Hi, I'm hoping you could vote for me... I haven't seen you in years, hope you're well..." - -**Die Lektion:** Sei ehrlich über deine Absichten. Menschen spüren, wenn du sie nur "buttern" willst. - -### Die Generosität ohne Erwartung - -> "Don't give someone a cup of coffee if you need a favor back. Just ask them for the favor. It builds trust." - -**Das Problem:** Wenn du immer etwas Nettes tust und dann um einen Gefallen bittest, verlieren Menschen das Vertrauen in dich. - -### Mother Teresa Warnung - -> "Mother Teresa, who's the poster child for giving selflessly to all who need at the end of her life started questioning existence of God and by the way hated her life." - -**Die Lektion:** Grenzenlos für alle zu geben ist selbstzerstörerisch. Du musst auswählen, wem du hilfst. - -## 🏢 Organisatorische Veränderung - -### Das Handy-Verbot - -> "There should be no cell phones in conference rooms, none, zero... Relationships are formed this way. We're waiting for a meeting to start and we go, how's your dad? I heard he was in the hospital." - -**Der Punkt:** Echte Beziehungen entstehen in den kleinen Momenten zwischen den offiziellen Aktivitäten. - -### Der Vertrauensmaßstab - -> "There's only one machine that I found that really accurately measures trust better than any other sort of metric. It's called a human being." - -Du kannst Vertrauen nicht mit KPIs messen - nur Menschen können Vertrauen spüren. - -### Die kritische Masse - -> "When we reach a critical mass in society, it will tip... There was no such thing as massive layoffs as business strategy prior to 1980s." - -**Die Hoffnung:** Genauso wie sich die Unternehmenskultur in den 1980ern zum Schlechteren wendete (Gordon Gekko, Shareholder Value), kann sie sich wieder zum Besseren wenden. - -## 🎯 Die große Vision - -> "My ideal is to live in a world in which the vast majority of people wake up every single morning inspired to go to work and fulfill by the work that they do." - -**Sineks Messung seines eigenen Erfolgs:** - -- Nicht: Wie viele Bücher verkauft wurden -- Sondern: Amazon-Rankings als Indikator, dass die Idee sich verbreitet -- Kein Marketing, keine Werbung - nur die Kraft der Idee selbst - -### Der Dominoeffekt - -Wenn genug Menschen beginnen, füreinander zu sorgen, wird es zur gesellschaftlichen Norm. Wie bei einem Virus breitet sich Güte aus - aber auch Egoismus breitet sich aus. **Wir entscheiden, welches Virus wir verbreiten.** - ---- - -## Warum dieser Talk besonders wichtig ist - -"Love Your Work" ist einer von Sineks persönlichsten und tiefgreifendsten Vorträgen. Während seine anderen Talks oft auf konkrete Business-Strategien fokussieren, geht dieser zur emotionalen Wurzel unserer Arbeitsunzufriedenheit. - -Er zeigt schonungslos auf, wie die Art, wie wir arbeiten, nicht nur uns selbst zerstört, sondern auch unsere Familien und die gesamte Gesellschaft. Gleichzeitig bietet er praktische, umsetzbare Lösungen, die jeder einzelne sofort anwenden kann. - -Der Talk ist ein Aufruf zur persönlichen Verantwortung: Du musst nicht warten, bis dein Boss oder dein Unternehmen sich ändert. Du kannst heute anfangen, kleine Akte der Güte zu vollbringen, und dadurch eine Welle positiver Veränderung auslösen. - ---- - -## Vollständiges Transkript - -_Das Transkript wurde automatisch mit Whisper AI erstellt und basiert auf dem YouTube Video._ - -[Das vollständige Transkript ist sehr lang - über 8000 Wörter. Es beginnt mit:] - -Cheers! Thank you. So here's a little issue we have in America today. There are currently about 250,000 people a year who are dying in our hospitals due to preventable deaths. And I'm not talking about negligence. I'm talking about little accidents. I'm talking about the doctor in the morning, not properly briefing the doctor for the evening. I'm talking about things that we can't sue anybody. There's nothing that we can see that's wrong. But there's 250,000 preventable deaths every year. That's about 27, 47's going down every single week. That's what's the equivalent to. And the confusing thing is that we have the best doctors in the world. We have the most advanced technology in the world... - -[Das vollständige Transkript würde hier fortgesetzt werden - aus Platzgründen hier gekürzt] diff --git a/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-millennials-in-the-workplace.md b/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-millennials-in-the-workplace.md deleted file mode 100644 index 2ef396191..000000000 --- a/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-millennials-in-the-workplace.md +++ /dev/null @@ -1,247 +0,0 @@ ---- -title: 'Millennials in the Workplace' -speaker: 'Simon Sinek' -speakerId: 'simon-sinek' -date: 2017-01-01 -category: 'leadership' -tags: - [ - 'millennials', - 'workplace', - 'technology', - 'leadership', - 'generational-change', - 'social-media', - 'addiction', - ] -venue: 'Inside Quest Interview' -duration: '15:18' -videoUrl: 'https://www.youtube.com/watch?v=hER0Qp6QJNU' -thumbnail: '/images/talks/simon-sinek-millennials.jpg' -readingTime: 18 -featured: true -summary: 'Simon Sineks virales Interview über die Herausforderungen der Millennial-Generation. Er erklärt die vier Faktoren - gescheiterte Erziehung, Technologie-Sucht, Ungeduld und schlechte Arbeitsumgebungen - die zu den Problemen geführt haben, und warum Unternehmen die Verantwortung übernehmen müssen.' ---- - -## Executive Summary - -In diesem viral gegangenen Interview (über 100 Millionen Aufrufe) analysiert Simon Sinek schonungslos die Herausforderungen der Millennial-Generation am Arbeitsplatz. Er identifiziert vier Hauptfaktoren, die zu den Problemen geführt haben: **gescheiterte Erziehungsstrategien, Technologie-Sucht, ein Verlangen nach sofortiger Befriedigung und corporate Umgebungen, die sich mehr für Zahlen als für Menschen interessieren.** Seine zentrale Botschaft: Es ist nicht die Schuld der Millennials - sie wurden schlecht behandelt, und Unternehmen müssen jetzt die Verantwortung übernehmen. - -## 🎯 Die vier Hauptprobleme - -### 1. Gescheiterte Erziehungsstrategien - -> "They were told that they were special all the time. They were told that they can have anything they want in life, just because they want it." - -**Die Probleme:** - -- Ständig gesagt bekommen, sie seien "etwas Besonderes" -- Partizipationsmedaillen für das Letztplatziert-Sein -- Noten, die nicht verdient wurden, weil Eltern sich beschwerten -- Schutz vor allen Herausforderungen und Rückschlägen - -**Das Ergebnis:** Eine Generation mit niedrigerem Selbstwertgefühl, die schockiert ist, wenn die reale Welt nicht ihren Erwartungen entspricht. - -### 2. Technologie-Sucht - -> "We have age restrictions on smoking, gambling, and alcohol. And we have no age restrictions on social media and cell phones, which is the equivalent of opening up the liquor cabinet." - -**Die Wissenschaft hinter der Sucht:** - -- Social Media und Smartphones lösen Dopamin aus - denselben Stoff wie Alkohol, Zigaretten und Glücksspiel -- Dopamin ist hochgradig suchterzeugend -- Jugendliche bekommen uneingeschränkten Zugang zu diesen "Drogen" während der stressigsten Zeit ihres Lebens - -**Die Konsequenzen:** - -- Unfähigkeit, tiefe, bedeutungsvolle Beziehungen zu bilden -- Oberflächliche Freundschaften, auf die man sich nicht verlassen kann -- Keine gesunden Bewältigungsmechanismen für Stress -- Höhere Depressionsraten bei Menschen, die mehr Zeit auf Social Media verbringen - -### 3. Ungeduld und sofortiger Gratifikation - -> "Everything you want, you can have instantaneously. Everything you want. Instant gratification. Except job satisfaction and strength of relationships, there ain't no app for that." - -**Das Problem:** -Eine Generation, die gewohnt ist, alles sofort zu bekommen: - -- Amazon-Lieferung am nächsten Tag -- Binge-Watching von TV-Shows -- Dating-Apps statt echte soziale Interaktion -- Keine Übung in Geduld und langfristigen Zielen - -**Die Realität:** Jobzufriedenheit und starke Beziehungen sind "slow, meandering, uncomfortable, messy processes" - sie brauchen Zeit. - -### 4. Schlechte Corporate Umgebungen - -> "We're putting them in corporate environments that care more about the numbers than they do about the kids. They care more about the short term gains than the long term life of this young human being." - -**Das Problem:** Unternehmen, die: - -- Sich mehr für kurzfristige Gewinne als für Menschen interessieren -- Nicht helfen, Vertrauen aufzubauen -- Keine Kooperationsfähigkeiten vermitteln -- Keine Balance in der digitalen Welt lehren -- Die sofortige Befriedigung verstärken statt Geduld zu lehren - -## 💡 Kernerkenntnisse - -### Die Sucht-Analogie - -> "Almost every alcoholic discovered alcohol when they were teenagers... Social stress, financial stress, career stress. That's pretty much the primary reasons why an alcoholic drinks." - -Sinek zieht eine erschreckende Parallele: Jugendliche, die in stressigen Zeiten zu Alkohol greifen, werden konditioniert, bei jedem zukünftigen Stress zur Flasche zu greifen. Genauso werden Jugendliche, die zu Social Media greifen, konditioniert, bei Stress nicht zu Menschen, sondern zu Geräten zu gehen. - -### Das Beziehungsproblem - -> "Their words, not mine. They will admit that many of their friendships are superficial. They will admit that their friends, that they don't count on their friends, they don't rely on their friends, they have fun with their friends. But they also know that their friends will cancel out of them if something better comes along." - -Die Generation hat keine tiefen Beziehungen, weil sie nie gelernt hat, wie man sie aufbaut. - -### Der Berg-Metapher - -> "It's as if they're standing at the foot of a mountain and they have this abstract concept called impact that they want to have in the world, which is the summit. What they don't see is the mountain." - -Millennials wollen sofort "Impact" haben, verstehen aber nicht, dass echte Erfüllung Zeit und harte Arbeit erfordert. - -## 🔥 Praktische Lösungen - -### Für Unternehmen: - -**1. Handyfreie Konferenzräume** - -> "There should be no cell phones in conference rooms, none, zero." - -- Kein "Handy auf stumm" - komplett weg -- In den Warteminuten vor Meetings entstehen echte Beziehungen -- "How's your dad? I heard he was in the hospital" - so bildet sich Vertrauen - -**2. Vertrauen langsam aufbauen** - -> "Trust doesn't form in an event in a day... It's the slow, steady consistency." - -- Kleine, regelmäßige Interaktionen ermöglichen -- Konsistenz über Zeit zeigen -- Geduld mit der Entwicklung haben - -**3. Die Verantwortung übernehmen** - -> "It's the company's responsibility, sucks to be you... We have no choice. This is what we got." - -- Soziale Fähigkeiten aktiv lehren -- Selbstvertrauen aufbauen helfen -- Extra Anstrengungen unternehmen, um diese Generation zu unterstützen - -### Für Individuen: - -**1. Digitale Entgiftung** - -- Handy nicht neben dem Bett laden ("Buy an alarm clock. They cost $8.") -- Bei Restaurantbesuchen das Handy zu Hause lassen -- Bewusst Momente der Langeweile zulassen - dort entstehen Ideen - -**2. Echte Beziehungen fördern** - -- Face-to-face Gespräche suchen -- Oberflächliche Interaktionen in tiefe verwandeln -- Hilfe anbieten und annehmen - -**3. Geduld lernen** - -- Verstehen, dass Karriere-Erfüllung Zeit braucht -- Kleine Schritte feiern -- Langfristige Perspektive entwickeln - -## 🧠 Psychologische Prinzipien - -### Dopamin und Sucht - -Die Erklärung, wie Dopamin funktioniert, ist zentral für das Verständnis der Generation. Das Gehirn wird auf sofortige Befriedigung konditioniert, was langfristige Ziele erschwert. - -### Entwicklungspsychologie - -Der Übergang von elterlicher Zustimmung zu Peer-Zustimmung während der Adoleszenz ist kritisch. Wenn diese Phase durch Technologie gestört wird, entstehen lebenslange Probleme. - -### Soziale Konditionierung - -Menschen lernen durch Wiederholung. Wenn junge Menschen lernen, bei Stress zu Geräten statt zu Menschen zu gehen, wird das zu einem lebenslangen Muster. - -## ⚠️ Die düsteren Szenarien - -### Worst Case: - -- Steigende Selbstmordraten -- Mehr versehentliche Todesfälle durch Überdosen -- Mehr Schulabbrecher wegen Depression - -### Best Case: - -> "You'll have an entire population growing up and going through life and just never really finding joy... How's your job? It's fine. How's your relationship? It's fine." - -Ein Leben ohne echte Erfüllung oder Freude. - -## 🌟 Warum dieses Interview wichtig ist - -Dieses Interview ist viral gegangen, weil es schmerzhaft ehrlich ein Problem anspricht, das viele spüren, aber nicht artikulieren können. Sinek gibt nicht nur den Millennials die Schuld - er erklärt systematisch, wie die Gesellschaft versagt hat und wie Unternehmen jetzt handeln müssen. - -Es ist ein Weckruf für: - -- **Eltern:** Ihre Kinder besser auf die reale Welt vorzubereiten -- **Unternehmen:** Verantwortung für die Entwicklung ihrer jungen Mitarbeiter zu übernehmen -- **Millennials:** Zu verstehen, dass es nicht ihre Schuld ist, aber sie trotzdem handeln müssen -- **Führungskräfte:** Umgebungen zu schaffen, die echte menschliche Entwicklung fördern - -Das Interview ist gleichzeitig eine Diagnose und ein Aufruf zum Handeln - und zeigt, dass Veränderung möglich ist, wenn wir die richtigen Systeme und Umgebungen schaffen. - ---- - -## Vollständiges Transkript - -_Das Transkript wurde automatisch mit Whisper AI erstellt und basiert auf dem YouTube Video._ - -What's the millennial question? Apparently, millennials as a generation, which is a group of people who were born approximately in 1984 and after, are tough to manage. And they're accused of being entitled in narcissistic, self-interested, unfocused, lazy. But entitled is the big one. And because they confound leadership so much, what's happening is leaders are asking the millennials, what do you want? And millennials are saying, we want to work in a place with purpose, love that. We want to make an impact, you know, whatever that means. We want free food and bean bags. And so somebody articulates some sort of purpose. There's lots of free food and there's bean bags. And yet for some reason, they are still not happy. And that's because they're missing piece. - -What I've learned is that I can break it down into four pieces. There are four things, four characteristics. One is parenting. The other one is technology. The third is impatience and the fourth is environment. - -The generation that we call the millennials, too many of them grew up subject to, not my words, failed parenting strategies, you know, where, for example, they were told that they were special all the time. They were told that they can have anything they want in life, just because they want it. They were told some of them got into honors classes, not because they deserved it, but because their parents complained. And some of them got A's, not because they earned them, but because the teachers didn't want to deal with the parents. Some kids got participation medals. They got a medal for coming in last, right? Which the science we know is pretty clear, which is it devalues the medal and the reward for those who actually work hard. And it actually makes the person who comes in last feel embarrassed because they know they didn't deserve it. So it actually makes them feel worse, right? - -So you take this group of people and they graduate school and they get a job and they're thrust into the real world. And in an instant they find out they're not special, their moms can't get them a promotion, that you get nothing for coming in last. And by the way, you can't just have it because you want it, right? And in an instant their entire self-image is shattered. And so you have an entire generation that's growing up with lower self-esteem than previous generations. - -The other problem to compound it is we're growing up in a Facebook Instagram world, in other words we're putting filters on things. We're good at showing people that life is amazing even though I'm depressed, right? And so everybody sounds tough and everybody sounds like they got it all figured out. And the reality is there's very little toughness and most people don't have it figured out. And so when the more senior people say, well what should we do? They sound like this is what you got at it. And they have no clue. Right? So you have an entire generation growing up with lower self-esteem than previous generations. Right? Through no fault of their own. Through no fault of their own. Right? They were dealt a bad hand. Right? - -Now let's add in technology. We know that engagement with social media and our cell phones releases a chemical called dopamine. That's why when you get a text feels good. Right? So you know we've all had it where you're feeling a little bit down or feeling a little bit lonely. And so you send out 10 texts to 10 friends. You know, hi, hi, hi, hi. Because it feels good when you get a response. Right? Right? It's why we count the likes. It's why we go back 10 times to see if it's going if my Instagram is growing slower. I do something wrong. Do they not like me anymore? The trauma for young kids to be unfriended. Right? Because we know when you get it, you get a dopamine which feels good. It's why we like it. It's why we keep going back to it. - -Dopamine is the exact same chemical that makes us feel good when we smoke, when we drink, and when we gamble. In other words, it's highly, highly addictive. Right? We have age restrictions on smoking, gambling, and alcohol. And we have no age restrictions on social media and cell phones, which is the equivalent of opening up the liquor cabinet and saying to our teenagers, hey, by the way, this adolescence thing of it gets you down. But that's basically what's happening. That's basically what's happening. Right? That's basically what happened. - -You have an entire generation that has access to an addictive numbing chemical dopamine through social media and cell phones as they're going through the high stress of adolescence. Why is this important? Almost every alcoholic discovered alcohol when they were teenagers. When we're very, very young, the only approval we need is the approval of our parents. And as we go through adolescence, we make this transition where we now need the approval of our peers. Very frustrating for our parents. Very important for us, it allows us to acculturate outside of our immediate families into the broader tribe. Right? It's a highly, highly stressful and anxious period of our lives. And we're supposed to learn to rely on our friends. - -Some people, quite by accident, discover alcohol and numbing effects of dopamine to help them cope with the stresses and anxieties of adolescence. Unfortunately, that becomes hardwired in their brains. And for the rest of their lives, when they suffer significant stress, they will not turn to a person, they will turn to the bottle. Social stress, financial stress, career stress. That's pretty much the primary reasons why an alcoholic drinks. Right? - -What's happening is because we're allowing unfettered access to these dopamine producing devices and media. Basically, it's becoming hardwired and what we're seeing is as they grow older, they too many kids don't know how to form deep, meaningful relationships. Their words, not mine. They will admit that many of their friendships are superficial. They will admit that their friends, that they don't count on their friends, they don't rely on their friends, they have fun with their friends. But they also know that their friends will cancel out of them if something better comes along. Deep, meaningful relationships are not there because they never practice the skill set and worse, they don't have the coping mechanisms to deal with stress. So when significant stress starts to show up in their lives, they're not turning to a person, they're turning to a device, they're turning to social media, they're turning to these things which offer temporary relief. - -We know, the science is clear, we know that people who spend more time on Facebook suffer higher rates of depression than people who spend less time on Facebook. Right? These things balanced. Alcohol is not bad, too much alcohol is bad. Gambling is fun, too much gambling is dangerous. Right? There's nothing wrong with social media and cell phones. It's the imbalance. Right? If you're sitting at dinner with your friends and you're texting somebody who's not there, that's a problem, that's an addiction. If you're sitting in a meeting with people you're supposed to be listening to and speaking and you put your phone on the table, face up or face down, I don't care. That sends a subconscious message to the room that you're not just not that important to me right now. Right? That's what happens. And the fact that you cannot put it away is because you are addicted. Right? - -If you wake up and you check your phone before you say good morning to your girlfriend, boyfriend or spouse, you have an addiction. And like all addiction in time, it'll destroy relationships, it'll cost time, it'll cost money, it'll make your life worse. Right? So you have a generation growing up with lower self-esteem that doesn't have the coping mechanisms to do with stress. Stress. Right? - -Now you add in the sense of impatience. Right? They've grown up in a world of instant gratification. You want to buy something, you go on Amazon and it arrives the next day. You want to watch a movie? Log on and watch a movie. You don't check movie times. You want to watch a TV show? Binge. You don't even have to wait week to week to week. Right? I know people who skip seasons just so they can binge at the end of the season. Right? Instagram gratification. You want to go on a date? You don't even have to learn how to be like, hey! You don't even have to learn and practice that skill. You don't have to be the uncomfortable one with cis-yes when you mean knowns, no when you mean knowns, yes when you- you don't have to swipe right. Bang, I'm a stud! Right? You don't have to learn the social coping mechanisms. Right? - -Everything you want, you can have instantaneously. Everything you want. Instant gratification. Except job satisfaction and strength of relationships, there ain't no app for that. They are slow, meandering, uncomfortable, messy processes. And so I keep meeting these wonderful, fantastic, idealistic, hardworking, smart kids, they've just graduated school, they're in their entry level job. I sit down with them and I go, how's it going? They go, I think I'm going to quit. I'm like, why? They're like, I'm not making an impact. I'm like, you've been here eight months. - -You know what? It's as if they're standing at the foot of a mountain and they have this abstract concept called impact that they want to have in the world, which is the summit. What they don't see is the mountain. I don't care if you go up the mountain quickly or slowly, but they're still a mountain. And so what this young generation needs to learn is patience, that some things that really, really matter, like love, or job fulfillment, joy, love of life, self-confidence, a skill set, any of these things, all of these things take time. Sometimes you can expedite pieces of it, but the overall journey is arduous and long and difficult. And if you don't ask for help and learn that skill set, you will fall off the mountain or you will, the worst case scenario. - -The worst case scenario, and we're already seeing it. The worst case scenario is we're seeing increase in suicide rates, we're seeing an increase in this generation, we're seeing an increase in accidental deaths due to drug overdoses, we're seeing more and more kids drop out of school or take leads of absence due to depression. Unheard of, this is really bad. The best case scenario, the best, those are all bad cases, right? The best case scenario is you'll have an entire population growing up and going through life and just never really finding joy. They'll never really find deep, deep fulfillment in work or in life, they'll just wath through life and it'll just, it's fine. How's your job? It's fine, the same as yesterday. How's your relationship? It's fine. Like that's the best case scenario, which leads me to the fourth point, which is environment, which is we're taking this amazing group of young, fantastic kids who just dealt a bad hand, it's no fault of their own. - -And we put them in corporate environments that care more about the numbers than they do about the kids. They care more about the short term gains than the long term life of this young human being. We care more about the year than the lifetime, right? And so we are putting them in corporate environments that aren't helping them build their confidence, that aren't helping them learn the skills of cooperation, that aren't helping them overcome the challenges of a digital world and finding more balance. That isn't helping them overcome the need to have instant gratification and teach them the joys and impact and the fulfillment you get from working hard over something for a long time that cannot be done in a month or even in a year. - -And so with thrusting them in corporate environments and the worst part about it is they think it's them, they blame themselves, they think it's them who can't deal. And so it makes it all worse. It's not, I'm here to tell them, it's not them. It's the corporations, it's the corporate environments, it's the total lack of good leadership in our world today that is making them feel the way they do. They would dealt a bad hand and I hate to say it but it's the company's responsibility, sucks to be you, like we have no choice. This is what we got and I wish that society and their parents did a better job, they didn't. So we're getting them in our companies and we now have to pick up the slack. - -We have to work extra hard to figure out the ways that we build their confidence. We have to work extra hard to find ways to teach them social skills that they're missing out on. There should be no cell phones in conference rooms, none, zero. And I don't mean the kind of like sitting outside waiting to text. I mean like when you're sitting and waiting for a meeting to start, nobody goes, this is what we all do, we all sit here and wait for the meeting to start. Meeting starting, okay, and we start the meeting. No, that's not how relationships are formed. Remember we talked about it's the little things? - -Relationships are formed this way. We're waiting for a meeting to start and we go, how's your dad? I heard he was in the hospital. Oh, he's really good, thanks for asking. He's actually at home now. Oh, I'm really glad, it was really amazing. I know, it was really scary for a while. That's how you form relationships. Hey, did you ever get that report on, oh my god, no, I didn't. I'll help you out. I totally can help you out with that. Really? That's how trust forms. Trust doesn't form in an event in a day, even bad times don't form trust immediately. It's the slow, steady consistency. And we have to create mechanisms where we allow for those little innocuous interactions to happen. But when we allow cell phones and conference rooms, we just, okay, have the meeting. - -And then my favorite is like when there's a cell phone there and you go like, there she go. It rings and you go, I'm not going to answer that. Mr. Magnanimous, you know? You're out for dinner with your friends. Like, I do this with my friends. When we're going out for dinner and we're leaving together, we'll leave our cell phones at home. Who are we calling? Maybe one of us will bring a phone in case we need to call an Uber or take a picture of our meal. It was a saying, come on. I mean, I'm not, I'm an idealist, but I'm not insane. I mean, it looked really good. We'll take one phone. - -And so it's like an alcoholic. The reason you take the alcohol out of the house is because we cannot trust our willpower. We're just not strong enough. But when you remove the temptation, it actually makes it a lot easier. And so when you just say, don't check your phone, people literally will go like this and somebody will go to the bathroom and what's the first thing we do? Because I wouldn't want to look around the restaurant for a minute and a half, you know? But if you don't have the phone, you just kind of enjoy the world. And that's where ideas happen. The constant, constant, constant engagements, not where you have innovation and ideas. Ideas happen when our minds wander and we go, and you see something, I don't know if they could do that. That's called innovation. But we're taking away all those little moments. - -You should not, and none of us, none of us should charge our phones by our beds. We should be charging our phones in the living rooms. Right? Remove the temptation. You wake up in the middle of the night because you can't sleep. You won't check your phone, which makes it worse. But if it's in the living room, it's relaxed. It's fine. But it's my alarm clock. Buy an alarm clock. They cost $8. I'll buy you an alarm clock. diff --git a/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-why-good-leaders-make-you-feel-safe.md b/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-why-good-leaders-make-you-feel-safe.md deleted file mode 100644 index a3ff23e5d..000000000 --- a/apps-archived/wisekeep/apps/landing/src/content/talks/simon-sinek-why-good-leaders-make-you-feel-safe.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: 'Why Good Leaders Make You Feel Safe' -speaker: 'Simon Sinek' -speakerId: 'simon-sinek' -date: 2014-03-01 -category: 'leadership' -tags: ['leadership', 'trust', 'safety', 'team-building', 'management', 'psychology'] -venue: 'TED' -duration: '11:59' -videoUrl: 'https://www.youtube.com/watch?v=lmyZMtPVodo' -thumbnail: '/images/talks/simon-sinek-feel-safe.jpg' -readingTime: 12 -featured: true -summary: "Simon Sinek erklärt, warum echte Führungskräfte einen 'Circle of Safety' schaffen müssen, in dem sich Menschen geschützt fühlen und ihr volles Potenzial entfalten können. Ein kraftvoller Vortrag über Vertrauen, Kooperation und die wahre Bedeutung von Leadership." ---- - -## Executive Summary - -In diesem beeindruckenden TED Talk zeigt Simon Sinek anhand der Geschichte von Captain William Swenson auf, was echte Führung ausmacht. Durch die Metapher des "Circle of Safety" erklärt er, warum große Führungskräfte ihre eigenen Interessen zurückstellen, um ihre Teams zu schützen und zu stärken. Die zentrale Botschaft: **Leadership ist die bewusste Entscheidung, anderen zu dienen, nicht sich selbst.** - -## 🎯 Kernerkenntnisse - -### 1. Der Circle of Safety - -> "When we feel safe inside the organization, we will naturally combine our talents and our strengths and work tirelessly to face the dangers outside." - -Genau wie unsere Vorfahren in der Steinzeit brauchen Menschen heute einen geschützten Raum, in dem sie Vertrauen und Kooperation entwickeln können. Führungskräfte sind dafür verantwortlich, diesen Schutzraum zu schaffen. - -### 2. Leadership ist eine Wahl, kein Rang - -> "Leadership is a choice. It is not a rank." - -Echte Führung hat nichts mit der Position in der Hierarchie zu tun. Viele Menschen in Spitzenpositionen sind keine Führungskräfte, während Menschen ohne formelle Autorität durch ihre Taten echte Führung zeigen. - -### 3. Leaders Eat Last - -Die Geschichte der Marines, wo Offiziere als letztes essen, illustriert ein fundamentales Prinzip: Echte Führungskräfte stellen die Bedürfnisse ihrer Menschen vor ihre eigenen. Sie gehen die Risiken zuerst ein und sorgen dafür, dass ihr Team sicher ist. - -### 4. Das Problem mit modernen Unternehmen - -> "In business, we give bonuses to people who are willing to sacrifice others so that we may gain. In the military, they give medals to people who are willing to sacrifice themselves so that others may gain." - -Sinek kritisiert die pervertierten Anreizsysteme vieler Unternehmen, die Selbstsucht belohnen statt Dienstbereitschaft. - -## 💡 Memorwürdige Zitate - -- **"Leadership is not about being in charge. Leadership is about taking care of those in your charge."** - -- **"The cost of leadership is self-interest."** - -- **"Great leaders would never sacrifice the people to save the numbers. They would sooner sacrifice the numbers to save the people."** - -- **"When leaders make the choice to put the safety and lives of the people inside the organization first, to sacrifice their comforts and sacrifice the tangible results so that the people remain and feel safe and feel like they belong, remarkable things happen."** - -- **"We call them leaders because they go first. We call them leaders because they take the risk before anybody else does."** - -## 📚 Zentrale Konzepte - -### Captain William Swenson - -Der Vortrag beginnt mit der bewegenden Geschichte von Captain Swenson, der die Congressional Medal of Honor erhielt. Sinek zeigt das berührende Video, wie Swenson einen verwundeten Soldaten küsst, bevor er ihn in den Rettungshubschrauber lädt. - -### Evolutionäre Psychologie - -Sinek erklärt, wie Menschen sich als soziale Wesen entwickelt haben, die in Gruppen überleben. Das Gefühl von Sicherheit innerhalb der eigenen "Tribe" ermöglicht Vertrauen und Kooperation - Gefühle, die nicht befohlen werden können. - -### Das Flughafen-Beispiel - -Eine Gate-Agentin behandelt Passagiere schlecht, weil sie Angst hat, ihren Job zu verlieren. Dies zeigt, wie Angst und mangelnde psychologische Sicherheit zu schlechtem Service führen. - -### Charlie Kim und Next Jump - -Das Beispiel eines CEOs, der Lifetime Employment einführt und seine Mitarbeiter wie Familie behandelt, zeigt, wie echte Führung in der Praxis aussieht. - -### Bob Chapman und Barry Wehmiller - -Während der Finanzkrise 2008 führte Chapman ein Freistellungsprogramm ein, bei dem alle Mitarbeiter einige Wochen unbezahlten Urlaub nehmen mussten, anstatt Menschen zu entlassen. Seine Botschaft: "Es ist besser, dass wir alle ein wenig leiden, als dass einige von uns viel leiden müssen." - -## 🔥 Praktische Anwendung - -### Für Führungskräfte: - -1. **Schaffen Sie psychologische Sicherheit** - Sorgen Sie dafür, dass sich Ihr Team sicher fühlt, Risiken einzugehen und Fehler zu machen -2. **Gehen Sie mit gutem Beispiel voran** - Übernehmen Sie Risiken, bevor Sie sie von anderen verlangen -3. **Investieren Sie in Menschen, nicht nur in Zahlen** - Langfristiger Erfolg kommt durch starke Teams -4. **Seien Sie bereit zu dienen** - Stellen Sie die Bedürfnisse Ihrer Mitarbeiter vor Ihre eigenen - -### Für Organisationen: - -1. **Überdenken Sie Anreizsysteme** - Belohnen Sie Kooperation und Teamwork, nicht nur individuelle Leistung -2. **Investieren Sie in Vertrauen** - Schaffen Sie Systeme, die Vertrauen fördern statt Misstrauen -3. **Langfristig denken** - Kurzfristige Gewinne auf Kosten der Menschen sind nicht nachhaltig - -## 🧠 Psychologische Prinzipien - -### Das Sicherheitsbedürfnis - -Menschen haben ein grundlegendes Bedürfnis nach Sicherheit. Wenn dieses erfüllt ist, können sie ihr volles kreatives und produktives Potenzial entfalten. - -### Vertrauen als Grundlage - -Vertrauen kann nicht befohlen werden - es entsteht durch konsistente Handlungen und das Gefühl, dass die Führungskraft die Interessen des Teams im Herzen trägt. - -### Die Macht der Reziprozität - -Wenn Führungskräfte bereit sind, für ihr Team Opfer zu bringen, werden die Teammitglieder dasselbe für die Führungskraft tun. - -## 🌟 Warum dieser Vortrag wichtig ist - -In einer Zeit, in der Vertrauen in Führungskräfte und Institutionen schwindet, bietet Sinek einen klaren Weg zurück zu echter Leadership. Seine Botschaft ist zeitlos und universell anwendbar - von kleinen Teams bis zu ganzen Nationen. - -Der Vortrag zeigt, dass Leadership nichts mit Macht oder Kontrolle zu tun hat, sondern mit Dienstbereitschaft und dem Mut, Verantwortung zu übernehmen. Es ist ein Aufruf an alle, die in Führungspositionen sind oder danach streben, ihre Rolle neu zu überdenken. - ---- - -## Vollständiges Transkript - -_Das Transkript wurde automatisch mit Whisper AI erstellt und basiert auf dem YouTube Video._ - -This is a man by the name of Captain William Swenson, who recently was awarded the Congressional Medal of Honor for his actions on September 8, 2009. On that day, a column of American and Afghan troops were making their way through a part of Afghanistan to help protect a group of government officials, a group of Afghan government officials who would be meeting with some local village elders. The column came under ambush and was surrounded on three sides. And amongst many other things, Captain Swenson was recognized for running into live fire to rescue the wounded and pull out the dead. - -One of the people he rescued was a sergeant, and he and a comrade were making their way to a Medevac helicopter. And what was remarkable about this day is by sheer coincidence, one of the Medevac medics happened to have a GoPro camera on his helmet and captured the whole scene on camera. It shows Captain Swenson and his comrade bringing this wounded soldier who received a gunshot to the neck. They put him in the helicopter and then you see Captain Swenson bend over and give him a kiss before he turns around to rescue more. - -I saw this and I thought to myself, where do people like that come from? What is that? That is some deep, deep emotion when you would want to do that. There's a love there. And I wanted to know, why is it that I don't have people that I work with like that? In the military, they give medals to people who are willing to sacrifice themselves so that others may gain. In business, we give bonuses to people who are willing to sacrifice others so that we may gain. Right? - -So I asked myself, where do people like this come from? And my initial conclusion was that they're just better people. That's why they're attracted to the military. These better people are attracted to this concept of service. But that's completely wrong. What I learned is that it's the environment. And if you get the environment right, every single one of us has the capacity to do these remarkable things and more importantly, others have that capacity too. - -I've had the great honor of getting to meet some of these who we would call heroes who have put themselves and put their lives at risk to save others. And I asked them, why would you do it? Why did you do it? And they all say the same thing because they would have done it for me. It's this deep sense of trust and cooperation. - -So trust and cooperation are really important here. The problem with concepts of trust and cooperation is that they are feelings. They're not instructions. I can't simply say to you, trust me and you will. I can't simply instruct to people to cooperate and they will. It's not how it works. It's a feeling. - -So where does that feeling come from? If you go back 50,000 years to the Paleolithic era to the early days of Homo sapien, what we find is that the world was filled with danger. All of these forces working very, very hard to kill us. Nothing personal. Whether it was the weather, lack of resources, maybe a saber-toothed tiger, all of these things working to reduce our lifespan. - -And so we evolved into social animals where we lived together and worked together and what I call a circle of safety inside the tribe where we felt like we belonged. And when we felt safe amongst our own, the natural reaction was trust and cooperation. There are inherent benefits to this. It means I can fall asleep at night and trust that someone from within my tribe will watch for danger. If we don't trust each other, if I don't trust you, that means you won't watch for danger. That's the system of survival. - -The modern day is exactly the same thing. The world is filled with danger. Things that are trying to frustrate our lives or reduce our success, reduce our opportunity for success. It could be the ups and downs of an economy, the uncertainty of the stock market. It could be a new technology that renders your business model obsolete overnight. Or it could be your competition that is sometimes trying to kill you. It's sometimes trying to put you out of business. But at the very minimum, it's working hard to frustrate your growth and steal your business from you. We have no control of these forces. These are a constant and they're not going away. - -The only variable are the conditions inside the organization. And that's where leadership matters because it's the leader that sets the tone. When a leader makes the choice to put the safety and lives of the people inside the organization first, to sacrifice their comforts and sacrifice, the tangible results so that the people remain and feel safe and feel like they belong, remarkable things happen. - -I was flying on a trip and I was witness to an incident where a passenger attempted to board before their number was called. And I watched the gate agent treat this man like he had broken the law, like a criminal. He was yelled at for attempting to board one group too soon. So I said something. I said, why do you have to treat us like cattle? Why can't you treat us like human beings? And this is exactly what she said to me. She said, sir, if I don't follow the rules, I could get in trouble or lose my job. All she was telling me is that she doesn't feel safe. All she was telling me is that she doesn't trust her leaders. - -The reason we like flying southwest airlines is not because they necessarily hire better people. It's because they don't fear their leaders. You see, if the conditions are wrong, we're forced to expend our own time and energy to protect ourselves from each other. And that inherently weakens the organization. When we feel safe inside the organization, we will naturally combine our talents and our strengths and work tirelessly to face the dangers outsized and seize the opportunities. - -The closest analogy I can give to what a great leader is, it's like being a parent. If you think about what being a great parent is, what do you want? What makes a great parent? We want to give our child opportunities, education, discipline them when necessary, also that they can grow up and achieve more than we could for ourselves. Great leaders want exactly the same thing. They want to provide their people opportunity, education, discipline when necessary, build their self-confidence, give them the opportunity to try and fail, also that they could achieve more than we could ever imagine for ourselves. - -Charlie Kim, who's the CEO of a company called Next Jump in New York City, a tech company, he makes the point that if you had hard times in your family, would you ever consider laying off one of your children? We would never do it. Then why do we consider laying off people inside our organization? Charlie implemented a policy of lifetime employment. If you get a job at Next Jump, you cannot get fired for performance issues. In fact, if you have issues, they will coach you and they will give you support, just like we would with one of our children who happens to come home with a C from school. It's the complete opposite. - -This is the reason so many people have such a visceral hatred, discon... sort of anger at some of these banking CEOs with their disproportionate salaries and bonus structures. It's not the numbers. It's that they have violated the very definition of leadership. They have violated this deep-seated social contract. We know that they allowed their people to be sacrificed, so that they could protect their own interests, or worse, they sacrificed their people to protect their own interests. This is what so offends us. Not the numbers. - -Would anybody be offended if we gave a $150 million bonus to Gandhi? How about a $250 million bonus to Mother Teresa? Do we have an issue with that? None at all. None at all. Great leaders would never sacrifice the people to save the numbers. They would sooner sacrifice the numbers to save the people. - -Bob Chapman, who runs a large manufacturing company in the Midwest called Barry Waymiller in 2008, was hit very hard by the recession, and they lost 30% of their orders overnight. Now, in a large manufacturing company, this is a big deal, and they could no longer afford their labor pool. They needed to save $10 million, so like so many companies today, the board got together and discussed layoffs. And Bob refused. - -You see, Bob doesn't believe in head counts. Bob believes in heart counts, and it's much more difficult to simply reduce the heart count. And so they came up with a furlough program. Every employee from Secretary to CEO was required to take four weeks of unpaid vacation. They could take it any time they wanted, and they did not have to take it consecutively. But it was how Bob announced the program that mattered so much. He said, it's better that we should all suffer a little than any of us should have to suffer a lot. And morale went up. They saved $20 million. And most importantly, as would be expected, when the people feel safe and protected by the leadership in the organization, the natural reaction is to trust and cooperate. And quite spontaneously, nobody expected. People started trading with each other. Those who could afford it more would trade with those who could afford it less. People would take five weeks so that somebody else only had to take three. - -Leadership is a choice. It is not a rank. I know many people at the senior most levels of organizations who are absolutely not leaders. They are authorities. And we do what they say because they have authority over us. But we would not follow them. And I know many people who are at the bottoms of organizations who have no authority and they are absolutely leaders. And this is because they have chosen to look after the person to the left of them. And they have chosen to look after the person to the right of them. This is what a leader is. - -I heard a story of some Marines who were out in theater. And as is the Marine Custom, the officer ate last. And he let his men eat first. And when they were done, there was no food left for him. And when they went back out in the field, his men brought him some of their food so that he made. Because that's what happens. - -We call them leaders because they go first. We call them leaders because they take the risk before anybody else does. We call them leaders because they will choose to sacrifice so that their people may be safe and protected and so that their people may gain. And when we do, the natural response is that our people will sacrifice for us. They will give us their blood and sweat and tears to see that their leader's vision comes to life. And when we ask them, why would you do that? Why would you give your blood and sweat and tears for that person? They all say the same thing because they would have done it for me. And isn't that the organization we would all like to work in? - -Thank you very much. Thank you. Thank you. Thank you. diff --git a/apps-archived/wisekeep/apps/landing/src/env.d.ts b/apps-archived/wisekeep/apps/landing/src/env.d.ts deleted file mode 100644 index e16c13c69..000000000 --- a/apps-archived/wisekeep/apps/landing/src/env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/apps-archived/wisekeep/apps/landing/src/layouts/BaseLayout.astro b/apps-archived/wisekeep/apps/landing/src/layouts/BaseLayout.astro deleted file mode 100644 index e2644024e..000000000 --- a/apps-archived/wisekeep/apps/landing/src/layouts/BaseLayout.astro +++ /dev/null @@ -1,823 +0,0 @@ ---- -import { getCollection } from 'astro:content'; -import '../styles/themes.css'; - -export interface Props { - title?: string; - description?: string; -} - -const { - title = 'YouTube Wisdom Library', - description = 'A curated collection of insights from the best talks', -} = Astro.props; - -// Get all talks for the sidebar -const talks = await getCollection('talks'); -const currentPath = Astro.url.pathname; - -// Sort talks by date (newest first) -const sortedTalks = talks.sort((a, b) => { - return new Date(b.data.date).getTime() - new Date(a.data.date).getTime(); -}); - -// Group talks by speaker -const talksBySpeaker = sortedTalks.reduce( - (acc, talk) => { - const speaker = talk.data.speaker; - if (!acc[speaker]) { - acc[speaker] = []; - } - acc[speaker].push(talk); - return acc; - }, - {} as Record -); ---- - - - - - - - {title} - - - - -
- - - - - - - - - - -
- -
-
- - - - diff --git a/apps-archived/wisekeep/apps/landing/src/layouts/Layout.astro b/apps-archived/wisekeep/apps/landing/src/layouts/Layout.astro deleted file mode 100644 index fc51135a5..000000000 --- a/apps-archived/wisekeep/apps/landing/src/layouts/Layout.astro +++ /dev/null @@ -1,110 +0,0 @@ ---- -export interface Props { - title: string; -} - -const { title } = Astro.props; ---- - - - - - - - - - - {title} - - - - -
-

© 2024 YouTube Wisdom Library. Powered by OpenAI Whisper.

-
- - - - diff --git a/apps-archived/wisekeep/apps/landing/src/pages/index.astro b/apps-archived/wisekeep/apps/landing/src/pages/index.astro deleted file mode 100644 index 9c06fc3a4..000000000 --- a/apps-archived/wisekeep/apps/landing/src/pages/index.astro +++ /dev/null @@ -1,41 +0,0 @@ ---- -import BaseLayout from '../layouts/BaseLayout.astro'; -import SearchableContentList from '../components/SearchableContentList'; -import Footer from '../components/Footer.astro'; ---- - - -
- -
-

- YouTube Wisdom Library -

-

- Transkribierte Vorträge von führenden Denkern - durchsuchbar, aufbereitet und immer - verfügbar. -

-
- - - -
- -