refactor: rename zitare -> quotes (Zitate)

Zitare was opaque Latin/Italian-flavored branding. Renamed to clear
English "quotes" (DE: Zitate) matching short-concrete-noun cluster.

- Module, routes, API, i18n, standalone landing app, plans dirs
- Dexie tables: quotesFavorites, quotesLists, quotesListTags,
  customQuotes (dropped redundant "quotes" prefix on the last)
- Logo QuotesLogo, theme quotes.css, search provider, dashboard
  widget QuoteWidget
- German user-facing label "Zitate" (English brand stays Quotes)

Pre-launch, no data migration needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-14 20:59:16 +02:00
parent 7a1f11c971
commit 851a281e5a
196 changed files with 891 additions and 776 deletions

View file

@ -818,7 +818,7 @@ All web apps with backends now use the runtime injection pattern:
- ✅ `chat/apps/web` - ✅ `chat/apps/web`
- ✅ `picture/apps/web` - ✅ `picture/apps/web`
- ✅ `zitare/apps/web` - ✅ `quotes/apps/web`
- ✅ `contacts/apps/web` - ✅ `contacts/apps/web`
- ✅ `calendar/apps/web` - ✅ `calendar/apps/web`
- ✅ `clock/apps/web` - ✅ `clock/apps/web`

View file

@ -14,7 +14,7 @@
| # | App | Collections | Stores umgeschrieben? | | # | App | Collections | Stores umgeschrieben? |
| --- | --------------- | ---------------------------------------------------- | ------------------------------------------------------------ | | --- | --------------- | ---------------------------------------------------- | ------------------------------------------------------------ |
| 1 | Todo | tasks, projects, labels, taskLabels, reminders | Ja (komplett) | | 1 | Todo | tasks, projects, labels, taskLabels, reminders | Ja (komplett) |
| 2 | Zitare | favorites, lists | Ja (komplett) | | 2 | Quotes | favorites, lists | Ja (komplett) |
| 3 | Calendar | calendars, events | Ja (komplett) | | 3 | Calendar | calendars, events | Ja (komplett) |
| 4 | Clock | alarms, timers, worldClocks | Ja (komplett) | | 4 | Clock | alarms, timers, worldClocks | Ja (komplett) |
| 5 | Contacts | contacts | Ja (komplett) | | 5 | Contacts | contacts | Ja (komplett) |

View file

@ -325,7 +325,7 @@ Alle Web-Apps mit CRUD-Datenmodell wurden auf Local-First migriert:
| App | Collections | Server-Logik verbleibt | | App | Collections | Server-Logik verbleibt |
|---|---|---| |---|---|---|
| **Todo** | tasks, projects, labels, taskLabels, reminders | RRULE, Reminders (Hono/Bun) | | **Todo** | tasks, projects, labels, taskLabels, reminders | RRULE, Reminders (Hono/Bun) |
| **Zitare** | favorites, lists | Nur Sync | | **Quotes** | favorites, lists | Nur Sync |
| **Calendar** | calendars, events | RRULE, Google Calendar OAuth | | **Calendar** | calendars, events | RRULE, Google Calendar OAuth |
| **Clock** | alarms, timers, worldClocks | Nur Sync | | **Clock** | alarms, timers, worldClocks | Nur Sync |
| **Cards** | decks, cards | Spaced Repetition, LLM | | **Cards** | decks, cards | Spaced Repetition, LLM |

View file

@ -16,7 +16,7 @@
| # | App | Modul | Routen | Status | | # | App | Modul | Routen | Status |
|---|-----|-------|--------|--------| |---|-----|-------|--------|--------|
| 1 | **calc** | collections, components (5 skins), engine, stores, queries | `/calc`, `/calc/standard` | **Done** | | 1 | **calc** | collections, components (5 skins), engine, stores, queries | `/calc`, `/calc/standard` | **Done** |
| 2 | **zitare** | collections, stores (5), components (2), queries | `/zitare` + 6 Sub-Routen | **Done** | | 2 | **quotes** | collections, stores (5), components (2), queries | `/quotes` + 6 Sub-Routen | **Done** |
| 3 | **clock** | collections, stores (6), components (2), queries | `/clock`, `/clock/alarms` | **Done** | | 3 | **clock** | collections, stores (6), components (2), queries | `/clock`, `/clock/alarms` | **Done** |
| 4 | **skilltree** | collections, stores (2), components (9), queries | `/skilltree`, `/skilltree/tree`, `/skilltree/achievements` | **Done** | | 4 | **skilltree** | collections, stores (2), components (9), queries | `/skilltree`, `/skilltree/tree`, `/skilltree/achievements` | **Done** |
| 5 | **moodlit** | collections, stores (2), components (3), queries | `/moodlit`, `/moodlit/moods`, `/moodlit/sequences` | **Done** | | 5 | **moodlit** | collections, stores (2), components (3), queries | `/moodlit`, `/moodlit/moods`, `/moodlit/sequences` | **Done** |
@ -97,7 +97,7 @@ Alle Apps die zum ManaCore-Ökosystem gehören und von Shared IndexedDB, Dashboa
| **chat** | AI-Chat, Cross-App-Referenzen | | **chat** | AI-Chat, Cross-App-Referenzen |
| **picture** | AI-Bilder, Cross-App-Referenzen | | **picture** | AI-Bilder, Cross-App-Referenzen |
| **cards** | Lernkarten, Cross-App-Links | | **cards** | Lernkarten, Cross-App-Links |
| **zitare** | Zitate, Dashboard-Widget | | **quotes** | Zitate, Dashboard-Widget |
| **clock** | Uhren/Timer, Dashboard-Widget | | **clock** | Uhren/Timer, Dashboard-Widget |
| **mukke** | Musik, eigenständig aber profitiert von shared Auth | | **mukke** | Musik, eigenständig aber profitiert von shared Auth |
| **storage** | Cloud-Dateien, Cross-App-Referenzen | | **storage** | Cloud-Dateien, Cross-App-Referenzen |
@ -247,7 +247,7 @@ src/lib/modules/
├── chat/ ├── chat/
├── picture/ ├── picture/
├── cards/ ├── cards/
├── zitare/ ├── quotes/
├── clock/ ├── clock/
├── mukke/ ├── mukke/
├── storage/ ├── storage/
@ -330,7 +330,7 @@ src/routes/
│ │ ├── deck/[id]/+page.svelte │ │ ├── deck/[id]/+page.svelte
│ │ └── study/[id]/+page.svelte │ │ └── study/[id]/+page.svelte
│ │ │ │
│ ├── zitare/ │ ├── quotes/
│ │ ├── +page.svelte │ │ ├── +page.svelte
│ │ └── favorites/+page.svelte │ │ └── favorites/+page.svelte
│ │ │ │
@ -463,7 +463,7 @@ import { CONTACTS_COLLECTIONS } from '$lib/modules/contacts/collections';
import { CHAT_COLLECTIONS } from '$lib/modules/chat/collections'; import { CHAT_COLLECTIONS } from '$lib/modules/chat/collections';
import { PICTURE_COLLECTIONS } from '$lib/modules/picture/collections'; import { PICTURE_COLLECTIONS } from '$lib/modules/picture/collections';
import { CARDS_COLLECTIONS } from '$lib/modules/cards/collections'; import { CARDS_COLLECTIONS } from '$lib/modules/cards/collections';
import { ZITARE_COLLECTIONS } from '$lib/modules/zitare/collections'; import { QUOTES_COLLECTIONS } from '$lib/modules/quotes/collections';
import { CLOCK_COLLECTIONS } from '$lib/modules/clock/collections'; import { CLOCK_COLLECTIONS } from '$lib/modules/clock/collections';
import { MUKKE_COLLECTIONS } from '$lib/modules/mukke/collections'; import { MUKKE_COLLECTIONS } from '$lib/modules/mukke/collections';
import { STORAGE_COLLECTIONS } from '$lib/modules/storage/collections'; import { STORAGE_COLLECTIONS } from '$lib/modules/storage/collections';
@ -509,7 +509,7 @@ db.version(1).stores({
// ... alle weiteren // ... alle weiteren
...PICTURE_COLLECTIONS, ...PICTURE_COLLECTIONS,
...CARDS_COLLECTIONS, ...CARDS_COLLECTIONS,
...ZITARE_COLLECTIONS, ...QUOTES_COLLECTIONS,
...CLOCK_COLLECTIONS, ...CLOCK_COLLECTIONS,
...MUKKE_COLLECTIONS, ...MUKKE_COLLECTIONS,
...STORAGE_COLLECTIONS, ...STORAGE_COLLECTIONS,
@ -566,7 +566,7 @@ export const SYNC_APP_MAP: Record<string, string[]> = {
chat: ['conversations', 'messages', 'templates'], chat: ['conversations', 'messages', 'templates'],
picture: ['images', 'boards', 'boardItems', 'tags', 'imageTags'], picture: ['images', 'boards', 'boardItems', 'tags', 'imageTags'],
cards: ['decks', 'cards'], cards: ['decks', 'cards'],
zitare: ['favorites', 'lists'], quotes: ['favorites', 'lists'],
clock: ['alarms', 'timers', 'worldClocks'], clock: ['alarms', 'timers', 'worldClocks'],
mukke: ['songs', 'playlists', 'playlistSongs', 'mProjects', 'markers'], mukke: ['songs', 'playlists', 'playlistSongs', 'mProjects', 'markers'],
storage: ['files', 'folders', 'sTags', 'fileTags'], storage: ['files', 'folders', 'sTags', 'fileTags'],
@ -756,7 +756,7 @@ Nach Komplexität sortiert — einfachste zuerst, um den Prozess einzuüben:
| # | App | Routes | Components | Priorität | Grund | | # | App | Routes | Components | Priorität | Grund |
|---|-----|--------|-----------|-----------|-------| |---|-----|--------|-----------|-----------|-------|
| 1 | **calc** | 4 | 8 | Starter | Minimal, keine Backend-Deps | | 1 | **calc** | 4 | 8 | Starter | Minimal, keine Backend-Deps |
| 2 | **zitare** | 8 | 12 | Starter | Einfach, wenig Stores | | 2 | **quotes** | 8 | 12 | Starter | Einfach, wenig Stores |
| 3 | **clock** | 8 | 15 | Starter | Eigenständig, keine API | | 3 | **clock** | 8 | 15 | Starter | Eigenständig, keine API |
| 4 | **skilltree** | 5 | 6 | Starter | Minimal | | 4 | **skilltree** | 5 | 6 | Starter | Minimal |
| 5 | **moodlit** | 6 | 4 | Starter | Minimal | | 5 | **moodlit** | 6 | 4 | Starter | Minimal |

View file

@ -233,19 +233,19 @@ GEMINI_API_KEY=AIzaSyBR9iP74hlo-mhI-Cl4QEvKprRzPPMb-GA
FOOD_S3_PUBLIC_URL=http://localhost:9000/food-storage FOOD_S3_PUBLIC_URL=http://localhost:9000/food-storage
# ============================================ # ============================================
# ZITARE PROJECT # QUOTES PROJECT
# ============================================ # ============================================
ZITARE_BACKEND_PORT=3007 QUOTES_BACKEND_PORT=3007
ZITARE_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform QUOTES_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
# ============================================ # ============================================
# ZITARE TELEGRAM BOT # QUOTES TELEGRAM BOT
# ============================================ # ============================================
ZITARE_BOT_PORT=3303 QUOTES_BOT_PORT=3303
ZITARE_BOT_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform QUOTES_BOT_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
ZITARE_BOT_TELEGRAM_TOKEN=8489424174:AAHHG_mlLVeu6xAWY6U2ZGXO0D8JKWnqBvg QUOTES_BOT_TELEGRAM_TOKEN=8489424174:AAHHG_mlLVeu6xAWY6U2ZGXO0D8JKWnqBvg
# ============================================ # ============================================
# TODO TELEGRAM BOT # TODO TELEGRAM BOT

View file

@ -367,7 +367,7 @@ jobs:
echo "skilltree-web=false" >> $GITHUB_OUTPUT echo "skilltree-web=false" >> $GITHUB_OUTPUT
fi fi
# zitare-backend: REMOVED — migrated to local-first # quotes-backend: REMOVED — migrated to local-first
# Check if any service needs building # Check if any service needs building
if grep -q "=true" $GITHUB_OUTPUT; then if grep -q "=true" $GITHUB_OUTPUT; then
@ -410,7 +410,7 @@ jobs:
echo "| food-web | ${{ steps.changes.outputs.food-web }} |" >> $GITHUB_STEP_SUMMARY echo "| food-web | ${{ steps.changes.outputs.food-web }} |" >> $GITHUB_STEP_SUMMARY
echo "| skilltree-backend | removed |" >> $GITHUB_STEP_SUMMARY echo "| skilltree-backend | removed |" >> $GITHUB_STEP_SUMMARY
echo "| skilltree-web | ${{ steps.changes.outputs.skilltree-web }} |" >> $GITHUB_STEP_SUMMARY echo "| skilltree-web | ${{ steps.changes.outputs.skilltree-web }} |" >> $GITHUB_STEP_SUMMARY
echo "| zitare-backend | removed |" >> $GITHUB_STEP_SUMMARY echo "| quotes-backend | removed |" >> $GITHUB_STEP_SUMMARY
# =========================================== # ===========================================
# Validation job - runs on PRs # Validation job - runs on PRs
@ -1263,4 +1263,4 @@ jobs:
cache-to: type=gha,mode=max cache-to: type=gha,mode=max
# =========================================== # ===========================================
# Zitare Backend: REMOVED — migrated to local-first # Quotes Backend: REMOVED — migrated to local-first

View file

@ -86,7 +86,7 @@ jobs:
# - mana-sync: covers Go service pattern # - mana-sync: covers Go service pattern
# - mana-media: covers Hono + Bun with Sharp/BullMQ # - mana-media: covers Hono + Bun with Sharp/BullMQ
# - todo-web: covers most shared-* web packages # - todo-web: covers most shared-* web packages
# - zitare-web: covers content packages, shared-pwa # - quotes-web: covers content packages, shared-pwa
# - calendar-web: covers calendar shared packages # - calendar-web: covers calendar shared packages
# - todo-backend: covers app backend pattern # - todo-backend: covers app backend pattern
# =========================================== # ===========================================
@ -114,8 +114,8 @@ jobs:
- service: todo-web - service: todo-web
dockerfile: apps/todo/apps/web/Dockerfile dockerfile: apps/todo/apps/web/Dockerfile
context: . context: .
- service: zitare-web - service: quotes-web
dockerfile: apps/zitare/apps/web/Dockerfile dockerfile: apps/quotes/apps/web/Dockerfile
context: . context: .
- service: calendar-web - service: calendar-web
dockerfile: apps/calendar/apps/web/Dockerfile dockerfile: apps/calendar/apps/web/Dockerfile

View file

@ -72,7 +72,7 @@ apps/chat/FEATURE_REQUIREMENTS.md
apps/cards/CI_CD_SETUP_GUIDE.md apps/cards/CI_CD_SETUP_GUIDE.md
apps/cards/MANA_CORE_INTEGRATION_CHECKLIST.md apps/cards/MANA_CORE_INTEGRATION_CHECKLIST.md
apps/picture/DEPLOYMENT_COMPLETE.md apps/picture/DEPLOYMENT_COMPLETE.md
apps/zitare/apps/web/THEMING.md apps/quotes/apps/web/THEMING.md
BACKEND_DESIGN_PATTERN_AUDIT.md BACKEND_DESIGN_PATTERN_AUDIT.md
COMPATIBILITY_MATRIX_AND_REMEDIATION.md COMPATIBILITY_MATRIX_AND_REMEDIATION.md
cicd/ cicd/

View file

@ -14,7 +14,7 @@ Monorepo containing all Mana projects — a self-hosted multi-app ecosystem with
| **contacts** | Contact management | NestJS backend, SvelteKit web | | **contacts** | Contact management | NestJS backend, SvelteKit web |
| **picture** | AI image generation | NestJS backend, Expo mobile, SvelteKit web, Astro landing | | **picture** | AI image generation | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| **cards** | Card/deck management | NestJS backend, Expo mobile, SvelteKit web | | **cards** | Card/deck management | NestJS backend, Expo mobile, SvelteKit web |
| **zitare** | Daily inspiration quotes | NestJS backend, Expo mobile, SvelteKit web, Astro landing | | **quotes** | Daily inspiration quotes | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| **mukke** | Music player | NestJS backend, SvelteKit web | | **mukke** | Music player | NestJS backend, SvelteKit web |
| **plants** | Plant care tracker | NestJS backend, SvelteKit web | | **plants** | Plant care tracker | NestJS backend, SvelteKit web |
| **storage** | Cloud storage | NestJS backend, SvelteKit web | | **storage** | Cloud storage | NestJS backend, SvelteKit web |

View file

@ -34,13 +34,13 @@ Common issues and solutions for the mana-monorepo.
**Root Cause:** **Root Cause:**
Parent workspace packages (e.g., `apps/zitare/package.json`, `apps/presi/package.json`) have scripts that call `turbo run <task>`, creating an **infinite recursion loop**. Parent workspace packages (e.g., `apps/quotes/package.json`, `apps/presi/package.json`) have scripts that call `turbo run <task>`, creating an **infinite recursion loop**.
### How It Happens ### How It Happens
``` ```
Root turbo → finds "build" script in apps/zitare/package.json Root turbo → finds "build" script in apps/quotes/package.json
→ runs "turbo run build" in zitare → runs "turbo run build" in quotes
→ finds "build" script again → finds "build" script again
→ runs "turbo run build" again → runs "turbo run build" again
→ (infinite loop!) → (infinite loop!)
@ -49,7 +49,7 @@ Root turbo → finds "build" script in apps/zitare/package.json
### ❌ WRONG - Causes Infinite Recursion ### ❌ WRONG - Causes Infinite Recursion
```json ```json
// apps/zitare/package.json - DON'T DO THIS! // apps/quotes/package.json - DON'T DO THIS!
{ {
"scripts": { "scripts": {
"build": "turbo run build", // ❌ WRONG "build": "turbo run build", // ❌ WRONG
@ -73,13 +73,13 @@ Root turbo → finds "build" script in apps/zitare/package.json
### ✅ CORRECT - Let Root Turbo Handle Orchestration ### ✅ CORRECT - Let Root Turbo Handle Orchestration
```json ```json
// apps/zitare/package.json - CORRECT // apps/quotes/package.json - CORRECT
{ {
"scripts": { "scripts": {
"dev": "turbo run dev", // ✅ OK for dev (persistent task, scoped) "dev": "turbo run dev", // ✅ OK for dev (persistent task, scoped)
// No build, lint, type-check scripts - handled by root turbo // No build, lint, type-check scripts - handled by root turbo
"db:push": "pnpm --filter @zitare/backend db:push", // ✅ OK "db:push": "pnpm --filter @quotes/backend db:push", // ✅ OK
"db:studio": "pnpm --filter @zitare/backend db:studio" // ✅ OK "db:studio": "pnpm --filter @quotes/backend db:studio" // ✅ OK
} }
} }
``` ```
@ -88,7 +88,7 @@ Root turbo → finds "build" script in apps/zitare/package.json
Using `turbo run dev` in parent packages is acceptable because: Using `turbo run dev` in parent packages is acceptable because:
1. It's typically run directly on that package (scoped: `pnpm zitare:dev`) 1. It's typically run directly on that package (scoped: `pnpm quotes:dev`)
2. Dev tasks are persistent (long-running) and turbo handles them differently 2. Dev tasks are persistent (long-running) and turbo handles them differently
3. Root never orchestrates `dev` across all packages simultaneously 3. Root never orchestrates `dev` across all packages simultaneously
@ -130,14 +130,14 @@ Tasks orchestrated from root (defined in `turbo.json`):
Parent packages are located at: Parent packages are located at:
- `apps/*/package.json` (e.g., `apps/zitare/package.json`) - `apps/*/package.json` (e.g., `apps/quotes/package.json`)
- `games/*/package.json` (e.g., `games/mana-games/package.json`) - `games/*/package.json` (e.g., `games/mana-games/package.json`)
**Do NOT add turbo scripts here!** **Do NOT add turbo scripts here!**
Child packages (these are fine): Child packages (these are fine):
- `apps/*/apps/*/package.json` (e.g., `apps/zitare/apps/backend/package.json`) - `apps/*/apps/*/package.json` (e.g., `apps/quotes/apps/backend/package.json`)
- `packages/*/package.json` (e.g., `packages/shared-theme/package.json`) - `packages/*/package.json` (e.g., `packages/shared-theme/package.json`)
--- ---
@ -163,7 +163,7 @@ pnpm run build 2>&1 | tee build.log
grep -A10 "error during build" build.log grep -A10 "error during build" build.log
# Build specific package to isolate issue # Build specific package to isolate issue
pnpm --filter @zitare/backend build pnpm --filter @quotes/backend build
``` ```
### Build Times Out in CI ### Build Times Out in CI

View file

@ -39,7 +39,7 @@ curl -X POST https://api.mana.how/v1/auth/login \
| Auth | `http://localhost:3001` | `https://auth.mana.how` | | Auth | `http://localhost:3001` | `https://auth.mana.how` |
| Chat | `http://localhost:3002` | `https://chat-api.mana.how` | | Chat | `http://localhost:3002` | `https://chat-api.mana.how` |
| Picture | `http://localhost:3006` | `https://picture-api.mana.how` | | Picture | `http://localhost:3006` | `https://picture-api.mana.how` |
| Zitare | `http://localhost:3007` | `https://zitare-api.mana.how` | | Quotes | `http://localhost:3007` | `https://quotes-api.mana.how` |
## Common Response Format ## Common Response Format
@ -148,4 +148,4 @@ Select a service from the sidebar to view its API documentation:
- **Auth API** - Authentication and user management - **Auth API** - Authentication and user management
- **Chat API** - Conversations and AI completions - **Chat API** - Conversations and AI completions
- **Picture API** - Image generation - **Picture API** - Image generation
- **Zitare API** - Quotes and favorites - **Quotes API** - Quotes and favorites

View file

@ -278,6 +278,6 @@ Never enable auth bypass in production!
|---------|---------|------| |---------|---------|------|
| Chat | `@mana-core/nestjs-integration` | 3002 | | Chat | `@mana-core/nestjs-integration` | 3002 |
| Picture | `@mana/shared-nestjs-auth` | 3006 | | Picture | `@mana/shared-nestjs-auth` | 3006 |
| Zitare | `@mana/shared-nestjs-auth` | 3007 | | Quotes | `@mana/shared-nestjs-auth` | 3007 |
| Cards | `@mana-core/nestjs-integration` | 3009 | | Cards | `@mana-core/nestjs-integration` | 3009 |
| Contacts | `@mana/shared-nestjs-auth` | 3015 | | Contacts | `@mana/shared-nestjs-auth` | 3015 |

View file

@ -113,7 +113,7 @@ Mana is a multi-app ecosystem with shared infrastructure, enabling rapid develop
| mana-core-auth | 3001 | Authentication | | mana-core-auth | 3001 | Authentication |
| chat-backend | 3002 | Chat API | | chat-backend | 3002 | Chat API |
| picture-backend | 3006 | Image generation | | picture-backend | 3006 | Image generation |
| zitare-backend | 3007 | Quotes API | | quotes-backend | 3007 | Quotes API |
| cards-backend | 3009 | Card management | | cards-backend | 3009 | Card management |
| contacts-backend | 3015 | Contacts API | | contacts-backend | 3015 | Contacts API |
| calendar-backend | 3014 | Calendar API | | calendar-backend | 3014 | Calendar API |

View file

@ -17,7 +17,7 @@ All landing pages and static sites are deployed to **Cloudflare Pages** using Di
| Picture | `@picture/landing` | `picture-landing` | picture.mana.how | | Picture | `@picture/landing` | `picture-landing` | picture.mana.how |
| Mana | `@mana/landing` | `mana-landing` | mana.how | | Mana | `@mana/landing` | `mana-landing` | mana.how |
| Cards | `@cards/landing` | `cards-landing` | cards.mana.how | | Cards | `@cards/landing` | `cards-landing` | cards.mana.how |
| Zitare | `@zitare/landing` | `zitare-landing` | zitare.mana.how | | Quotes | `@quotes/landing` | `quotes-landing` | quotes.mana.how |
| Docs | `@mana/docs` | `mana-docs` | docs.mana.how | | Docs | `@mana/docs` | `mana-docs` | docs.mana.how |
## Quick Deploy ## Quick Deploy

View file

@ -52,7 +52,7 @@ Mana uses multiple deployment strategies depending on the application type.
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────┐
│ Mac Mini Server │ │ Mac Mini Server │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ mana-core- │ │ chat- │ │ zitare- │ ... │ │ │ mana-core- │ │ chat- │ │ quotes- │ ... │
│ │ auth:3001 │ │ backend:3002│ │ backend:3007│ │ │ │ auth:3001 │ │ backend:3002│ │ backend:3007│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │ │ │ │ │ │
@ -72,7 +72,7 @@ Mana uses multiple deployment strategies depending on the application type.
# Deploy individual landing page # Deploy individual landing page
pnpm deploy:landing:chat pnpm deploy:landing:chat
pnpm deploy:landing:picture pnpm deploy:landing:picture
pnpm deploy:landing:zitare pnpm deploy:landing:quotes
# Deploy all landing pages # Deploy all landing pages
pnpm deploy:landing:all pnpm deploy:landing:all

View file

@ -17,7 +17,7 @@ Each backend service has its own database and schema:
|---------|----------|------| |---------|----------|------|
| mana-core-auth | mana_platform | 3001 | | mana-core-auth | mana_platform | 3001 |
| chat | chat | 3002 | | chat | chat | 3002 |
| zitare | zitare | 3007 | | quotes | quotes | 3007 |
| contacts | contacts | 3015 | | contacts | contacts | 3015 |
| calendar | calendar | 3014 | | calendar | calendar | 3014 |

View file

@ -98,11 +98,11 @@ The generator reads `.env.development` and creates app-specific `.env` files wit
| `PICTURE_BACKEND_PORT` | Backend port (3006) | | `PICTURE_BACKEND_PORT` | Backend port (3006) |
| `REPLICATE_API_KEY` | Replicate AI key | | `REPLICATE_API_KEY` | Replicate AI key |
</TabItem> </TabItem>
<TabItem label="Zitare"> <TabItem label="Quotes">
| Variable | Description | | Variable | Description |
|----------|-------------| |----------|-------------|
| `ZITARE_BACKEND_PORT` | Backend port (3007) | | `QUOTES_BACKEND_PORT` | Backend port (3007) |
| `ZITARE_DATABASE_URL` | PostgreSQL connection | | `QUOTES_DATABASE_URL` | PostgreSQL connection |
</TabItem> </TabItem>
</Tabs> </Tabs>

View file

@ -15,7 +15,7 @@ For any project with a backend, use the `dev:*:full` command:
```bash ```bash
pnpm dev:chat:full # Start chat with auth + database setup pnpm dev:chat:full # Start chat with auth + database setup
pnpm dev:zitare:full # Start zitare with auth + database setup pnpm dev:quotes:full # Start quotes with auth + database setup
pnpm dev:contacts:full # Start contacts with auth + database setup pnpm dev:contacts:full # Start contacts with auth + database setup
``` ```
@ -30,7 +30,7 @@ These commands automatically:
| Command | Database | Backend Port | Web Port | | Command | Database | Backend Port | Web Port |
|---------|----------|--------------|----------| |---------|----------|--------------|----------|
| `pnpm dev:chat:full` | chat | 3002 | 5173 | | `pnpm dev:chat:full` | chat | 3002 | 5173 |
| `pnpm dev:zitare:full` | zitare | 3007 | 5177 | | `pnpm dev:quotes:full` | quotes | 3007 | 5177 |
| `pnpm dev:contacts:full` | contacts | 3015 | 5184 | | `pnpm dev:contacts:full` | contacts | 3015 | 5184 |
| `pnpm dev:calendar:full` | calendar | 3014 | 5179 | | `pnpm dev:calendar:full` | calendar | 3014 | 5179 |
| `pnpm dev:clock:full` | clock | 3017 | 5187 | | `pnpm dev:clock:full` | clock | 3017 | 5187 |
@ -64,7 +64,7 @@ Before running any `dev:*:full` command:
```bash ```bash
pnpm setup:db:auth # Setup mana-core-auth database + schema pnpm setup:db:auth # Setup mana-core-auth database + schema
pnpm setup:db:chat # Setup chat database + schema pnpm setup:db:chat # Setup chat database + schema
pnpm setup:db:zitare # Setup zitare database + schema pnpm setup:db:quotes # Setup quotes database + schema
pnpm setup:db:contacts # Setup contacts database + schema pnpm setup:db:contacts # Setup contacts database + schema
pnpm setup:db:calendar # Setup calendar database + schema pnpm setup:db:calendar # Setup calendar database + schema
pnpm setup:db:clock # Setup clock database + schema pnpm setup:db:clock # Setup clock database + schema
@ -86,7 +86,7 @@ This is useful when setting up a fresh environment or after pulling new schema c
On first `pnpm docker:up`, the PostgreSQL container runs `docker/init-db/01-create-databases.sql` which creates all databases: On first `pnpm docker:up`, the PostgreSQL container runs `docker/init-db/01-create-databases.sql` which creates all databases:
- mana_platform, chat, zitare, contacts, calendar, clock, todo, cards - mana_platform, chat, quotes, contacts, calendar, clock, todo, cards
- storage, mail, moodlit, finance, inventory, techbase, voxel_lava, figgos - storage, mail, moodlit, finance, inventory, techbase, voxel_lava, figgos
### Setup Script ### Setup Script

View file

@ -42,7 +42,7 @@ Mana is designed to streamline the development of multiple interconnected applic
|---------|-------------|--------| |---------|-------------|--------|
| **Chat** | AI chat application with multiple models | Stable | | **Chat** | AI chat application with multiple models | Stable |
| **Picture** | AI image generation | Stable | | **Picture** | AI image generation | Stable |
| **Zitare** | Daily inspiration quotes | Stable | | **Quotes** | Daily inspiration quotes | Stable |
| **Cards** | Card/deck management | Beta | | **Cards** | Card/deck management | Beta |
| **Contacts** | Contact management | Beta | | **Contacts** | Contact management | Beta |
| **Calendar** | Calendar & scheduling | Alpha | | **Calendar** | Calendar & scheduling | Alpha |

View file

@ -21,7 +21,7 @@ Mana uses a pnpm workspace monorepo with Turborepo for build orchestration.
- landing/ Astro marketing page - landing/ Astro marketing page
- packages/ Chat-specific packages - packages/ Chat-specific packages
- picture/ - picture/
- zitare/ - quotes/
- contacts/ - contacts/
- calendar/ - calendar/
- ... - ...

View file

@ -61,9 +61,9 @@ Before you begin, ensure you have:
``` ```
Opens at `http://localhost:5173` (web) and `http://localhost:3002` (API) Opens at `http://localhost:5173` (web) and `http://localhost:3002` (API)
</TabItem> </TabItem>
<TabItem label="Zitare"> <TabItem label="Quotes">
```bash ```bash
pnpm dev:zitare:full pnpm dev:quotes:full
``` ```
Opens at `http://localhost:5174` (web) and `http://localhost:3007` (API) Opens at `http://localhost:5174` (web) and `http://localhost:3007` (API)
</TabItem> </TabItem>

View file

@ -35,7 +35,7 @@ pnpm dev:chat:full
Central auth service with EdDSA JWT tokens across all apps. Central auth service with EdDSA JWT tokens across all apps.
</Card> </Card>
<Card title="Multiple Apps" icon="puzzle"> <Card title="Multiple Apps" icon="puzzle">
Chat, Picture, Zitare, Cards, and more - all sharing infrastructure. Chat, Picture, Quotes, Cards, and more - all sharing infrastructure.
</Card> </Card>
<Card title="Modern Stack" icon="rocket"> <Card title="Modern Stack" icon="rocket">
SvelteKit, Expo, NestJS, Drizzle ORM, Tailwind CSS. SvelteKit, Expo, NestJS, Drizzle ORM, Tailwind CSS.
@ -51,7 +51,7 @@ pnpm dev:chat:full
|---------|-------------| |---------|-------------|
| **Chat** | AI chat with multiple models | | **Chat** | AI chat with multiple models |
| **Picture** | AI image generation | | **Picture** | AI image generation |
| **Zitare** | Daily inspiration quotes | | **Quotes** | Daily inspiration quotes |
| **Cards** | Card & deck management | | **Cards** | Card & deck management |
| **Contacts** | Contact management | | **Contacts** | Contact management |
| **Calendar** | Calendar & scheduling | | **Calendar** | Calendar & scheduling |

View file

@ -28,12 +28,12 @@ Mana contains multiple interconnected applications, each serving a specific purp
[View Details](/projects/picture) [View Details](/projects/picture)
</Card> </Card>
<Card title="Zitare" icon="quote"> <Card title="Quotes" icon="quote">
Daily inspiration quotes Daily inspiration quotes
**Stack**: NestJS, SvelteKit, Expo **Stack**: NestJS, SvelteKit, Expo
[View Details](/projects/zitare) [View Details](/projects/quotes)
</Card> </Card>
<Card title="Cards" icon="card"> <Card title="Cards" icon="card">
@ -67,7 +67,7 @@ Mana contains multiple interconnected applications, each serving a specific purp
|---------|---------|-----|--------|--------| |---------|---------|-----|--------|--------|
| Chat | 3002 | 5173 | Yes | Stable | | Chat | 3002 | 5173 | Yes | Stable |
| Picture | 3006 | 5175 | Yes | Stable | | Picture | 3006 | 5175 | Yes | Stable |
| Zitare | 3007 | 5177 | Yes | Stable | | Quotes | 3007 | 5177 | Yes | Stable |
| Cards | 3009 | 5178 | Yes | Beta | | Cards | 3009 | 5178 | Yes | Beta |
| Contacts | 3015 | 5184 | No | Beta | | Contacts | 3015 | 5184 | No | Beta |
| Calendar | 3014 | 5179 | No | Alpha | | Calendar | 3014 | 5179 | No | Alpha |
@ -91,7 +91,7 @@ Mana contains multiple interconnected applications, each serving a specific purp
# Use dev:*:full for the best experience # Use dev:*:full for the best experience
pnpm dev:chat:full pnpm dev:chat:full
pnpm dev:picture:full pnpm dev:picture:full
pnpm dev:zitare:full pnpm dev:quotes:full
pnpm dev:contacts:full pnpm dev:contacts:full
pnpm dev:calendar:full pnpm dev:calendar:full
``` ```

View file

@ -11,7 +11,7 @@ const ecosystemApps = [
{ label: 'Calendar', href: 'https://calendar.mana.how', status: 'beta' }, { label: 'Calendar', href: 'https://calendar.mana.how', status: 'beta' },
{ label: 'Contacts', href: 'https://contacts.mana.how', status: 'beta' }, { label: 'Contacts', href: 'https://contacts.mana.how', status: 'beta' },
{ label: 'Clock', href: 'https://clock.mana.how', status: 'beta' }, { label: 'Clock', href: 'https://clock.mana.how', status: 'beta' },
{ label: 'Zitare', href: 'https://zitare.mana.how', status: 'beta' }, { label: 'Quotes', href: 'https://quotes.mana.how', status: 'beta' },
{ label: 'Calc', href: 'https://calc.mana.how', status: 'beta' }, { label: 'Calc', href: 'https://calc.mana.how', status: 'beta' },
{ label: 'Arcade', href: 'https://arcade.mana.how', status: 'beta' }, { label: 'Arcade', href: 'https://arcade.mana.how', status: 'beta' },
// Alpha tier (accessible to alpha testers and above) // Alpha tier (accessible to alpha testers and above)

View file

@ -1,6 +1,6 @@
--- ---
title: Zitare title: Quotes
description: Intelligente Zitatverwaltung und Literaturrecherche für akademisches Arbeiten. Zitare revolutioniert wissenschaftliches Schreiben mit KI-gestützter Quellensuche und automatischer Formatierung. description: Intelligente Zitatverwaltung und Literaturrecherche für akademisches Arbeiten. Quotes revolutioniert wissenschaftliches Schreiben mit KI-gestützter Quellensuche und automatischer Formatierung.
category: productivity category: productivity
icon: 📚 icon: 📚
manaUsage: manaUsage:
@ -20,12 +20,12 @@ features:
status: available status: available
releaseDate: 15.03.2024 releaseDate: 15.03.2024
order: 4 order: 4
website: https://zitare.ai website: https://quotes.ai
--- ---
## Was ist Zitare? ## Was ist Quotes?
Zitare ist dein intelligenter Assistent für wissenschaftliches Arbeiten. Von der Literaturrecherche über die Zitatverwaltung bis zur perfekt formatierten Bibliografie Zitare nutzt KI, um dir die zeitraubenden Aspekte akademischen Schreibens abzunehmen, damit du dich auf den Inhalt konzentrieren kannst. Quotes ist dein intelligenter Assistent für wissenschaftliches Arbeiten. Von der Literaturrecherche über die Zitatverwaltung bis zur perfekt formatierten Bibliografie Quotes nutzt KI, um dir die zeitraubenden Aspekte akademischen Schreibens abzunehmen, damit du dich auf den Inhalt konzentrieren kannst.
## Hauptfunktionen ## Hauptfunktionen
@ -117,7 +117,7 @@ Der Mana-Verbrauch richtet sich nach der genutzten Funktion:
## Unterstützte Zitierstile ## Unterstützte Zitierstile
Zitare unterstützt alle gängigen Zitierstile: Quotes unterstützt alle gängigen Zitierstile:
- **APA** (American Psychological Association) - **APA** (American Psychological Association)
- **MLA** (Modern Language Association) - **MLA** (Modern Language Association)
@ -169,7 +169,7 @@ Mit Mana-Credits zahlst du nur für die KI-Features, die du tatsächlich nutzt.
## Verfügbarkeit ## Verfügbarkeit
Zitare ist verfügbar als: Quotes ist verfügbar als:
- **Web-App** (alle Browser) - **Web-App** (alle Browser)
- **Desktop-App** (Windows, Mac, Linux) - **Desktop-App** (Windows, Mac, Linux)
@ -179,7 +179,7 @@ Zitare ist verfügbar als:
## Vergleich zu Konkurrenz ## Vergleich zu Konkurrenz
| Feature | Zitare | Zotero | Mendeley | EndNote | | Feature | Quotes | Zotero | Mendeley | EndNote |
| -------------------- | ------ | ------ | -------- | ------- | | -------------------- | ------ | ------ | -------- | ------- |
| KI-Zusammenfassungen | ✅ | ❌ | ❌ | ❌ | | KI-Zusammenfassungen | ✅ | ❌ | ❌ | ❌ |
| Flexible Abrechnung | ✅ | ✅ | ❌ | ❌ | | Flexible Abrechnung | ✅ | ✅ | ❌ | ❌ |
@ -190,7 +190,7 @@ Zitare ist verfügbar als:
## Kostenlos starten ## Kostenlos starten
Die Basis-Funktionen von Zitare sind komplett kostenlos: Die Basis-Funktionen von Quotes sind komplett kostenlos:
- Unbegrenzte Quellen speichern - Unbegrenzte Quellen speichern
- Alle Zitierstile nutzen - Alle Zitierstile nutzen

View file

@ -138,7 +138,7 @@ Dieses Dokument analysiert den aktuellen Zustand der Mana-Infrastruktur auf dem
| Todo Bot | mana-matrix-todo-bot | 3314 | Task Management | | Todo Bot | mana-matrix-todo-bot | 3314 | Task Management |
| Calendar Bot | mana-matrix-calendar-bot | 3315 | Termine | | Calendar Bot | mana-matrix-calendar-bot | 3315 | Termine |
| Food Bot | mana-matrix-food-bot | 3316 | Nutrition | | Food Bot | mana-matrix-food-bot | 3316 | Nutrition |
| Zitare Bot | mana-matrix-zitare-bot | 3317 | Quotes | | Quotes Bot | mana-matrix-quotes-bot | 3317 | Quotes |
| Clock Bot | mana-matrix-clock-bot | 3318 | Time Tracking | | Clock Bot | mana-matrix-clock-bot | 3318 | Time Tracking |
| TTS Bot | mana-matrix-tts-bot | 3033 | Text-to-Speech | | TTS Bot | mana-matrix-tts-bot | 3033 | Text-to-Speech |
@ -260,7 +260,7 @@ api-gateway:
Viele Matrix-Bots teilen ähnlichen Code: Viele Matrix-Bots teilen ähnlichen Code:
- `matrix-todo-bot` und `matrix-calendar-bot` haben ähnliche Reminder-Logik - `matrix-todo-bot` und `matrix-calendar-bot` haben ähnliche Reminder-Logik
- `matrix-food-bot` und `matrix-zitare-bot` sind Wrapper für Backends - `matrix-food-bot` und `matrix-quotes-bot` sind Wrapper für Backends
- `matrix-mana-bot` sollte theoretisch alle anderen ersetzen - `matrix-mana-bot` sollte theoretisch alle anderen ersetzen
### 5. Volume-Fragmentierung ### 5. Volume-Fragmentierung
@ -275,7 +275,7 @@ volumes:
matrix_calendar_bot_data: matrix_calendar_bot_data:
matrix_todo_bot_data: matrix_todo_bot_data:
matrix_food_bot_data: matrix_food_bot_data:
matrix_zitare_bot_data: matrix_quotes_bot_data:
matrix_clock_bot_data: matrix_clock_bot_data:
matrix_tts_bot_data: matrix_tts_bot_data:
``` ```
@ -401,7 +401,7 @@ AKTUELL: 10 separate Bot-Container
│ matrix-mana-bot │ matrix-ollama-bot │ ... │ │ matrix-mana-bot │ matrix-ollama-bot │ ... │
│ matrix-stats-bot │ matrix-project-doc │ │ │ matrix-stats-bot │ matrix-project-doc │ │
│ matrix-todo-bot │ matrix-calendar-bot │ │ │ matrix-todo-bot │ matrix-calendar-bot │ │
│ matrix-food-bot │ matrix-zitare-bot │ │ │ matrix-food-bot │ matrix-quotes-bot │ │
│ matrix-clock-bot │ matrix-tts-bot │ │ │ matrix-clock-bot │ matrix-tts-bot │ │
└────────────────────────────────────────────────────────────┘ └────────────────────────────────────────────────────────────┘

View file

@ -136,7 +136,7 @@ export class AppModule {}
- todo-backend (Port 3004) - todo-backend (Port 3004)
- clock-backend (Port 3005) - clock-backend (Port 3005)
- picture-backend (Port 3006) - picture-backend (Port 3006)
- zitare-backend (Port 3007) - quotes-backend (Port 3007)
- presi-backend (Port 3008) - presi-backend (Port 3008)
- cards-backend (Port 3009) - cards-backend (Port 3009)
- contacts-backend (Port 3010) - contacts-backend (Port 3010)
@ -292,7 +292,7 @@ export async function GET() {
### Betroffene Apps ### Betroffene Apps
- calendar-web, clock-web, contacts-web - calendar-web, clock-web, contacts-web
- chat-web, picture-web, zitare-web - chat-web, picture-web, quotes-web
- todo-web, cards-web, manacore-web - todo-web, cards-web, manacore-web
- presi-web, storage-web, food-web - presi-web, storage-web, food-web

View file

@ -42,7 +42,7 @@ Außergewöhnlich produktiver Tag (und Nacht!) mit **74 Commits** und mehreren g
- **mana-search Microservice** - SearXNG Meta-Search + Content Extraction - **mana-search Microservice** - SearXNG Meta-Search + Content Extraction
- **@manacore/bot-services** - Shared Business Logic Package - **@manacore/bot-services** - Shared Business Logic Package
- **matrix-mana-bot** - Unified Gateway Bot für alle Features - **matrix-mana-bot** - Unified Gateway Bot für alle Features
- **4 neue Matrix Bots** - Todo, Food, Zitare, Clock - **4 neue Matrix Bots** - Todo, Food, Quotes, Clock
- **OIDC Provider** - Matrix SSO via mana-core-auth - **OIDC Provider** - Matrix SSO via mana-core-auth
- **VictoriaMetrics** - Monitoring Upgrade mit DuckDB Analytics - **VictoriaMetrics** - Monitoring Upgrade mit DuckDB Analytics
- **App Cleanup** - Demo Mode für Calendar, Todo, Contacts - **App Cleanup** - Demo Mode für Calendar, Todo, Contacts
@ -377,7 +377,7 @@ Ernährungs-Tracking via Matrix:
**Voice Transcription** via mana-stt für Sprachnachrichten. **Voice Transcription** via mana-stt für Sprachnachrichten.
### matrix-zitare-bot ### matrix-quotes-bot
Tägliche Inspirations-Zitate: Tägliche Inspirations-Zitate:
@ -571,7 +571,7 @@ apps/calendar/apps/web/src/lib/services/
| matrix-mana-bot | 3310 | NestJS | Gateway Bot | | matrix-mana-bot | 3310 | NestJS | Gateway Bot |
| matrix-todo-bot | 3315 | NestJS | Todo Bot | | matrix-todo-bot | 3315 | NestJS | Todo Bot |
| matrix-food-bot | 3316 | NestJS | Nutrition Bot | | matrix-food-bot | 3316 | NestJS | Nutrition Bot |
| matrix-zitare-bot | 3317 | NestJS | Quotes Bot | | matrix-quotes-bot | 3317 | NestJS | Quotes Bot |
| matrix-clock-bot | 3318 | NestJS | Timer Bot | | matrix-clock-bot | 3318 | NestJS | Timer Bot |
--- ---
@ -585,12 +585,12 @@ apps/calendar/apps/web/src/lib/services/
| Matrix Client | 1 | Phase 2 Features | | Matrix Client | 1 | Phase 2 Features |
| mana-search | 3 | SearXNG, Extraction, Cache | | mana-search | 3 | SearXNG, Extraction, Cache |
| Bot Services | 2 | Shared Package + Gateway | | Bot Services | 2 | Shared Package + Gateway |
| Matrix Bots | 8 | Todo, Food, Zitare, Clock | | Matrix Bots | 8 | Todo, Food, Quotes, Clock |
| OIDC | 6 | Matrix SSO Provider | | OIDC | 6 | Matrix SSO Provider |
| App Cleanup | 8 | Demo Mode, Feature Removal | | App Cleanup | 8 | Demo Mode, Feature Removal |
| Monitoring | 2 | VictoriaMetrics, DuckDB | | Monitoring | 2 | VictoriaMetrics, DuckDB |
| Food | 2 | Tests, Production Ready | | Food | 2 | Tests, Production Ready |
| Telegram Bots | 1 | Food, Todo, Zitare | | Telegram Bots | 1 | Food, Todo, Quotes |
| Bugfixes | 15+ | Auth, Matrix, Docker | | Bugfixes | 15+ | Auth, Matrix, Docker |
| Documentation | 5 | Monitoring, Services, DevLogs | | Documentation | 5 | Monitoring, Services, DevLogs |

View file

@ -217,7 +217,7 @@ Zentraler Notification-Service für Email, Push, Matrix und Webhooks.
``` ```
┌─────────────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────────────┐
│ Consumer Apps │ │ Consumer Apps │
│ Auth │ Calendar │ Chat │ Picture │ Zitare │ ... │ │ Auth │ Calendar │ Chat │ Picture │ Quotes │ ... │
└─────────────────────────┬───────────────────────────────────────────┘ └─────────────────────────┬───────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────────────┐
@ -492,7 +492,7 @@ import { HealthModule } from '@manacore/shared-nestjs-health';
``` ```
**Migrierte Backends (12):** **Migrierte Backends (12):**
calendar, chat, clock, contacts, food, picture, planta, presi, skilltree, storage, todo, zitare calendar, chat, clock, contacts, food, picture, planta, presi, skilltree, storage, todo, quotes
### @manacore/shared-nestjs-setup ### @manacore/shared-nestjs-setup
@ -514,7 +514,7 @@ await app.listen(process.env.PORT || 3002);
``` ```
**Migrierte Backends (8):** **Migrierte Backends (8):**
chat, calendar, contacts, zitare, clock, planta, presi, food chat, calendar, contacts, quotes, clock, planta, presi, food
### @manacore/shared-tsconfig ### @manacore/shared-tsconfig

View file

@ -212,7 +212,7 @@ services/
├── telegram-project-doc-bot/ # ENTFERNT ├── telegram-project-doc-bot/ # ENTFERNT
├── telegram-food-bot/ # ENTFERNT ├── telegram-food-bot/ # ENTFERNT
├── telegram-todo-bot/ # ENTFERNT ├── telegram-todo-bot/ # ENTFERNT
└── telegram-zitare-bot/ # ENTFERNT └── telegram-quotes-bot/ # ENTFERNT
``` ```
### Begründung ### Begründung

View file

@ -110,7 +110,7 @@ Alle Authentifizierungs-Seiten sind jetzt mehrsprachig.
- Questions Web - Questions Web
- SkillTree Web - SkillTree Web
- Todo Web - Todo Web
- Zitare Web - Quotes Web
### Implementierung ### Implementierung
@ -126,7 +126,7 @@ export const t = derived(locale, ($locale) => {
### Neue Auth Pages ### Neue Auth Pages
Fehlende Auth-Pages für Zitare und Planta hinzugefügt: Fehlende Auth-Pages für Quotes und Planta hinzugefügt:
- `/login` - `/login`
- `/register` - `/register`

View file

@ -98,7 +98,7 @@ Single Sign-On über alle ManaCore Web Apps.
| SkillTree | skilltree.mana.how | ✅ | | SkillTree | skilltree.mana.how | ✅ |
| Storage | storage.mana.how | ✅ | | Storage | storage.mana.how | ✅ |
| Todo | todo.mana.how | ✅ | | Todo | todo.mana.how | ✅ |
| Zitare | zitare.mana.how | ✅ | | Quotes | quotes.mana.how | ✅ |
| Manalink | manalink.mana.how | ✅ | | Manalink | manalink.mana.how | ✅ |
| Playground | playground.mana.how | ✅ | | Playground | playground.mana.how | ✅ |
@ -204,7 +204,7 @@ Neue Übersichtsseite mit allen 19 Matrix Bots in Manalink.
| matrix-contacts-bot | Productivity | Kontaktverwaltung | | matrix-contacts-bot | Productivity | Kontaktverwaltung |
| matrix-food-bot | Health | Ernährungs-Tracking | | matrix-food-bot | Health | Ernährungs-Tracking |
| matrix-picture-bot | AI | Bildgenerierung | | matrix-picture-bot | AI | Bildgenerierung |
| matrix-zitare-bot | Inspiration | Tägliche Zitate | | matrix-quotes-bot | Inspiration | Tägliche Zitate |
| matrix-skilltree-bot | Gamification | Skill-Tracking | | matrix-skilltree-bot | Gamification | Skill-Tracking |
| matrix-planta-bot | Lifestyle | Pflanzenpflege | | matrix-planta-bot | Lifestyle | Pflanzenpflege |
| matrix-cards-bot | Learning | Lernkarten | | matrix-cards-bot | Learning | Lernkarten |

View file

@ -191,7 +191,7 @@ services:
retries: 3 retries: 3
start_period: 40s start_period: 40s
zitare-backend: quotes-backend:
healthcheck: healthcheck:
test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3007/health'] test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3007/health']
# Korrigierter Pfad (vorher /api/health) # Korrigierter Pfad (vorher /api/health)

View file

@ -1,6 +1,6 @@
--- ---
title: 'Gift Codes, Stripe Integration & Zitare Deployment' title: 'Gift Codes, Stripe Integration & Quotes Deployment'
description: 'Neues Gift Code System mit Credit-Gutscheinen, Stripe Integration für Subscriptions und Credit-Käufe, Zitare Production Deployment mit multilingualer Quote-Datenbank, sowie Calendar Drag-to-Create und Matrix WhatsApp-Style Navigation' description: 'Neues Gift Code System mit Credit-Gutscheinen, Stripe Integration für Subscriptions und Credit-Käufe, Quotes Production Deployment mit multilingualer Quote-Datenbank, sowie Calendar Drag-to-Create und Matrix WhatsApp-Style Navigation'
date: 2026-02-13 date: 2026-02-13
author: 'Till Schneider' author: 'Till Schneider'
category: 'feature' category: 'feature'
@ -10,7 +10,7 @@ tags:
'stripe', 'stripe',
'subscriptions', 'subscriptions',
'credits', 'credits',
'zitare', 'quotes',
'calendar', 'calendar',
'matrix', 'matrix',
'avatar', 'avatar',
@ -38,7 +38,7 @@ Ein massiver Tag mit **55 Commits** und mehreren Major Features:
- **Gift Codes** - Credit-Gutscheine mit Code-Einlösung - **Gift Codes** - Credit-Gutscheine mit Code-Einlösung
- **Stripe Integration** - Subscriptions und Credit-Käufe - **Stripe Integration** - Subscriptions und Credit-Käufe
- **Zitare Deployment** - Production-Ready mit multilingualer Quote-DB - **Quotes Deployment** - Production-Ready mit multilingualer Quote-DB
- **Calendar UX** - Drag-to-Create, Resize Handles, Live Preview - **Calendar UX** - Drag-to-Create, Resize Handles, Live Preview
- **Matrix Mobile** - WhatsApp-Style Navigation für PWA - **Matrix Mobile** - WhatsApp-Style Navigation für PWA
- **Avatar Upload** - S3/MinIO Integration mit Onboarding - **Avatar Upload** - S3/MinIO Integration mit Onboarding
@ -210,42 +210,42 @@ async handleWebhook(@Req() req: Request) {
--- ---
## Zitare Production Deployment ## Quotes Production Deployment
Zitare ist jetzt live auf zitare.mana.how! Quotes ist jetzt live auf quotes.mana.how!
### Docker Infrastructure ### Docker Infrastructure
```yaml ```yaml
# docker-compose.macmini.yml # docker-compose.macmini.yml
zitare-backend: quotes-backend:
build: build:
context: . context: .
dockerfile: apps/zitare/apps/backend/Dockerfile dockerfile: apps/quotes/apps/backend/Dockerfile
ports: ports:
- '3007:3007' - '3007:3007'
environment: environment:
DATABASE_URL: ${ZITARE_DATABASE_URL} DATABASE_URL: ${QUOTES_DATABASE_URL}
MANA_CORE_AUTH_URL: http://mana-core-auth:3001 MANA_CORE_AUTH_URL: http://mana-core-auth:3001
healthcheck: healthcheck:
test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3007/health'] test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3007/health']
zitare-web: quotes-web:
build: build:
context: . context: .
dockerfile: apps/zitare/apps/web/Dockerfile dockerfile: apps/quotes/apps/web/Dockerfile
ports: ports:
- '5018:5018' - '5018:5018'
depends_on: depends_on:
- zitare-backend - quotes-backend
``` ```
### @zitare/content Package ### @quotes/content Package
Neues Package für shared Quotes: Neues Package für shared Quotes:
```typescript ```typescript
// packages/zitare-content/src/quotes.ts // packages/quotes-content/src/quotes.ts
export interface Quote { export interface Quote {
id: string; id: string;
text: string; text: string;
@ -588,7 +588,7 @@ Neues Dashboard auf mana.how.
## Settings Stores ## Settings Stores
Neue Settings-Stores für Zitare und Todo. Neue Settings-Stores für Quotes und Todo.
### Pattern ### Pattern
@ -610,10 +610,10 @@ export const settings = persisted<AppSettings>('app-settings', {
}); });
``` ```
### Zitare Settings ### Quotes Settings
```typescript ```typescript
interface ZitareSettings extends AppSettings { interface QuotesSettings extends AppSettings {
dailyNotificationTime: string; // "09:00" dailyNotificationTime: string; // "09:00"
favoriteCategories: string[]; favoriteCategories: string[];
showAuthorInfo: boolean; showAuthorInfo: boolean;
@ -699,12 +699,12 @@ Weitere Services auf lokale Builds umgestellt:
| --------------------- | ------- | ------------------------------- | | --------------------- | ------- | ------------------------------- |
| **Gift Codes** | 4 | Code-System, Matrix Integration | | **Gift Codes** | 4 | Code-System, Matrix Integration |
| **Stripe** | 3 | Subscriptions, Credit Purchases | | **Stripe** | 3 | Subscriptions, Credit Purchases |
| **Zitare** | 10 | Docker, Quotes, i18n | | **Quotes** | 10 | Docker, Quotes, i18n |
| **Calendar** | 6 | Drag-Create, Resize, Mobile UX | | **Calendar** | 6 | Drag-Create, Resize, Mobile UX |
| **Matrix** | 8 | WhatsApp-Nav, PWA, Swipe | | **Matrix** | 8 | WhatsApp-Nav, PWA, Swipe |
| **ManaCore** | 8 | Profile, Credits, Storage | | **ManaCore** | 8 | Profile, Credits, Storage |
| **Avatar/Onboarding** | 3 | S3 Upload, Wizard | | **Avatar/Onboarding** | 3 | S3 Upload, Wizard |
| **Settings** | 2 | Zitare, Todo Stores | | **Settings** | 2 | Quotes, Todo Stores |
| **Auth/Docker** | 8 | Healthchecks, Builds | | **Auth/Docker** | 8 | Healthchecks, Builds |
| **Devlog** | 3 | Activity Grid | | **Devlog** | 3 | Activity Grid |
@ -716,4 +716,4 @@ Weitere Services auf lokale Builds umgestellt:
2. **Gift Code UI** - Admin-Panel für Code-Erstellung 2. **Gift Code UI** - Admin-Panel für Code-Erstellung
3. **Subscription Emails** - Bestätigungen und Erinnerungen 3. **Subscription Emails** - Bestätigungen und Erinnerungen
4. **Matrix E2EE** - Verschlüsselung für DMs aktivieren 4. **Matrix E2EE** - Verschlüsselung für DMs aktivieren
5. **Zitare Push** - Daily Quote Notifications 5. **Quotes Push** - Daily Quote Notifications

View file

@ -435,7 +435,7 @@ Tracking IDs für alle Web-Apps aktualisiert.
| contacts-web | `contacts-prod` | | contacts-web | `contacts-prod` |
| todo-web | `todo-prod` | | todo-web | `todo-prod` |
| picture-web | `picture-prod` | | picture-web | `picture-prod` |
| zitare-web | `zitare-prod` | | quotes-web | `quotes-prod` |
--- ---

View file

@ -98,7 +98,7 @@ Progressive Web App Dependencies wurden zu allen SvelteKit Web-Apps hinzugefügt
| ManaCore | ✅ Aktiviert | | ManaCore | ✅ Aktiviert |
| Chat | ✅ Aktiviert | | Chat | ✅ Aktiviert |
| Picture | ✅ Aktiviert | | Picture | ✅ Aktiviert |
| Zitare | ✅ Aktiviert | | Quotes | ✅ Aktiviert |
| Calendar | ✅ Aktiviert | | Calendar | ✅ Aktiviert |
| Contacts | ✅ Aktiviert | | Contacts | ✅ Aktiviert |
| Todo | ✅ Aktiviert | | Todo | ✅ Aktiviert |

View file

@ -56,7 +56,7 @@ User loggt sich in Calendar ein → ✓
User öffnet Todo → ❌ Nicht eingeloggt (SSO fehlgeschlagen) User öffnet Todo → ❌ Nicht eingeloggt (SSO fehlgeschlagen)
``` ```
10 Apps fehlten in `trustedOrigins`: Mukke, Photos, Planta, Questions, Todo, Traces, Context, Docs, Cards, Zitare. 10 Apps fehlten in `trustedOrigins`: Mukke, Photos, Planta, Questions, Todo, Traces, Context, Docs, Cards, Quotes.
### Der Fix ### Der Fix
@ -112,7 +112,7 @@ const APPS_WITH_SSO = [
'storage', 'storage',
'todo', 'todo',
'traces', 'traces',
'zitare', 'quotes',
]; ];
it.each(APPS_WITH_SSO)('should include %s.mana.how in trustedOrigins', (appName) => { it.each(APPS_WITH_SSO)('should include %s.mana.how in trustedOrigins', (appName) => {
@ -271,7 +271,7 @@ GlitchTip (selbst-gehostete Sentry-Alternative) wurde für **alle 15 Backends**
| Skilltree | 3038 | #16 | | Skilltree | 3038 | #16 |
| Storage | 3035 | #17 | | Storage | 3035 | #17 |
| Todo | 3031 | #3 | | Todo | 3031 | #3 |
| Zitare | 3007 | #8 | | Quotes | 3007 | #8 |
### Grafana Dashboard ### Grafana Dashboard
@ -302,7 +302,7 @@ Alle 20 aktiven Apps wurden bewertet nach 8 Kategorien (Backend, Frontend, Datab
| **Matrix** | 68 | Production | E2E Encryption | | **Matrix** | 68 | Production | E2E Encryption |
| **Food** | 63 | Beta | Gemini AI Integration | | **Food** | 63 | Beta | Gemini AI Integration |
| **Photos** | 62 | Beta | mana-media Integration | | **Photos** | 62 | Beta | mana-media Integration |
| **Zitare** | 62 | Beta | Deployed auf mana.how | | **Quotes** | 62 | Beta | Deployed auf mana.how |
| **Context** | 60 | Beta | Neuer Backend (Port 3020) | | **Context** | 60 | Beta | Neuer Backend (Port 3020) |
| **Clock** | 58 | Beta | Kein CLAUDE.md, keine Tests | | **Clock** | 58 | Beta | Kein CLAUDE.md, keine Tests |
| **Skilltree** | 58 | Beta | Offline-first PWA | | **Skilltree** | 58 | Beta | Offline-first PWA |

View file

@ -203,7 +203,7 @@ export const handleError: HandleClientError = ({ error }) => {
| Apps | | Apps |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Calendar, Chat, Clock, Contacts, Context, Manacore, Cards, Matrix, Mukke, Food, Photos, Picture, Planta, Presi, Questions, Skilltree, Storage, Todo, Zitare | | Calendar, Chat, Clock, Contacts, Context, Manacore, Cards, Matrix, Mukke, Food, Photos, Picture, Planta, Presi, Questions, Skilltree, Storage, Todo, Quotes |
### API ### API

View file

@ -59,7 +59,7 @@ Das bestehende `ContextMenu`-Component aus `@manacore/shared-ui` wurde systemati
| **Cards** | Deck-Karten | Öffnen, Löschen | `28286d12` | | **Cards** | Deck-Karten | Öffnen, Löschen | `28286d12` |
| **Photos** | PhotoGrid | Anzeigen, Favorit toggle, Löschen | `28286d12` | | **Photos** | PhotoGrid | Anzeigen, Favorit toggle, Löschen | `28286d12` |
| **Photos** | AlbumGrid | Öffnen, Löschen | `28286d12` | | **Photos** | AlbumGrid | Öffnen, Löschen | `28286d12` |
| **Zitare** | Favoriten | Aus Favoriten entfernen, Kopieren, Teilen | `28286d12` | | **Quotes** | Favoriten | Aus Favoriten entfernen, Kopieren, Teilen | `28286d12` |
| **Calendar** | AgendaView | Bearbeiten, Duplizieren, Löschen | `ecda4535` | | **Calendar** | AgendaView | Bearbeiten, Duplizieren, Löschen | `ecda4535` |
| **Chat** | ConversationList | Umbenennen, Archivieren, Löschen | `ecda4535` | | **Chat** | ConversationList | Umbenennen, Archivieren, Löschen | `ecda4535` |
| **Contacts** | ContactGridView | Öffnen, Favorit, Anrufen, E-Mail, Löschen | `ecda4535` | | **Contacts** | ContactGridView | Öffnen, Favorit, Anrufen, E-Mail, Löschen | `ecda4535` |
@ -105,7 +105,7 @@ Neues monorepo-weites Package, das die LLM-Integration für alle Backends verein
``` ```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Chat Backend │ │ Zitare Backend│ │ Planta Backend│ │ Chat Backend │ │ Quotes Backend│ │ Planta Backend│
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
@ -123,7 +123,7 @@ Neues monorepo-weites Package, das die LLM-Integration für alle Backends verein
**48 Dateien geändert**, +2.477 / -1.298 Zeilen. Alle Backends migriert: **48 Dateien geändert**, +2.477 / -1.298 Zeilen. Alle Backends migriert:
- `@chat/backend` — Chat AI-Completions - `@chat/backend` — Chat AI-Completions
- `@zitare/backend` — Zitat-Analyse (vorher eigener Ollama-Service) - `@quotes/backend` — Zitat-Analyse (vorher eigener Ollama-Service)
- `@planta/backend` — Pflanzen-Vision-Analyse - `@planta/backend` — Pflanzen-Vision-Analyse
- `@food/backend` — Ernährungs-Analyse (Gemini) - `@food/backend` — Ernährungs-Analyse (Gemini)
- `mana-core-auth` — AI-Service für Auth-Features - `mana-core-auth` — AI-Service für Auth-Features

View file

@ -42,7 +42,7 @@ Extrem produktiver Vormittag mit **61 Commits** über **695 Dateien** und netto
- **Manalink Live** - Matrix-Chat-Client auf Production gebracht und auf link.mana.how deployed - **Manalink Live** - Matrix-Chat-Client auf Production gebracht und auf link.mana.how deployed
- **CityCorners** - City Guide für Konstanz mit PWA, i18n, mana-search Integration und 31 Backend-Tests - **CityCorners** - City Guide für Konstanz mit PWA, i18n, mana-search Integration und 31 Backend-Tests
- **Spiral-DB** - 174 Tests, kritische PNG-Bugs gefixt, in Zitare und Contacts integriert - **Spiral-DB** - 174 Tests, kritische PNG-Bugs gefixt, in Quotes und Contacts integriert
- **Auth-Migration** - 3 Mobile-Apps (ManaCore, Context, Cards) von Supabase auf mana-core-auth - **Auth-Migration** - 3 Mobile-Apps (ManaCore, Context, Cards) von Supabase auf mana-core-auth
- **Massive Cleanup** - 50+ Legacy-Dateien gelöscht, Hetzner-Artefakte entfernt, API-Keys bereinigt - **Massive Cleanup** - 50+ Legacy-Dateien gelöscht, Hetzner-Artefakte entfernt, API-Keys bereinigt
- **Observability** - Prometheus Metrics für mana-search, mana-media und Synapse - **Observability** - Prometheus Metrics für mana-search, mana-media und Synapse
@ -174,7 +174,7 @@ Umfassende Test-Suite und mehrere kritische Fixes:
| String zu lang | 511-Byte Max-Length Enforcement | | String zu lang | 511-Byte Max-Length Enforcement |
| Index-Ring-Count zu klein | 6 Bits (2 Pixel) statt 3 Bits für >7 Ring Support | | Index-Ring-Count zu klein | 6 Bits (2 Pixel) statt 3 Bits für >7 Ring Support |
### Zitare-Integration ### Quotes-Integration
Spiral-DB als zweite App (nach Todo) mit pixelbasierter Spiral-Visualisierung: Spiral-DB als zweite App (nach Todo) mit pixelbasierter Spiral-Visualisierung:
@ -395,7 +395,7 @@ Umami-Tracking in Todo, Calendar und Contacts erweitert. ANALYTICS.md aktualisie
| --------------- | ------- | ----------------------------------------------------------------- | | --------------- | ------- | ----------------------------------------------------------------- |
| Manalink | 7 | Prod-Ready, Security, Tests, E2EE-Warning, Live Deploy | | Manalink | 7 | Prod-Ready, Security, Tests, E2EE-Warning, Live Deploy |
| CityCorners | 8 | PWA, i18n, mana-search, Submission Form, 31 Tests | | CityCorners | 8 | PWA, i18n, mana-search, Submission Form, 31 Tests |
| Spiral-DB | 3 | 174 Tests, 8 kritische Bugs gefixt, Zitare + Contacts Integration | | Spiral-DB | 3 | 174 Tests, 8 kritische Bugs gefixt, Quotes + Contacts Integration |
| Auth-Migration | 6 | 3 Mobile-Apps, 20 Web-Stores, Supabase-Package entfernt | | Auth-Migration | 6 | 3 Mobile-Apps, 20 Web-Stores, Supabase-Package entfernt |
| Cleanup | 7 | 50+ Dateien gelöscht, Hetzner weg, API-Keys bereinigt | | Cleanup | 7 | 50+ Dateien gelöscht, Hetzner weg, API-Keys bereinigt |
| Observability | 5 | 3 neue Services, 15 Backend Metrics, GlitchTip Health | | Observability | 5 | 3 neue Services, 15 Backend Metrics, GlitchTip Health |

View file

@ -164,7 +164,7 @@ Neuer `getAllOpenTasks()` Service-Call, der `GET /tasks` nutzt und alle offenen
### Fehlende Packages in Dockerfiles ### Fehlende Packages in Dockerfiles
9 Web-App-Dockerfiles fehlte das `COPY packages/shared-app-onboarding` Statement, was zu Build-Fehlern führte. Betroffen: Chat, Clock, Mukke, Photos, Picture, Presi, Skilltree, Storage, Zitare. 9 Web-App-Dockerfiles fehlte das `COPY packages/shared-app-onboarding` Statement, was zu Build-Fehlern führte. Betroffen: Chat, Clock, Mukke, Photos, Picture, Presi, Skilltree, Storage, Quotes.
### Dockerfile Dependency Validator ### Dockerfile Dependency Validator

View file

@ -82,7 +82,7 @@ Help-Pages in 10+ bisher fehlende Apps nachgezogen, verbesserte Inhalte für all
- `dd5c0d50` — Calendar, Todo Help - `dd5c0d50` — Calendar, Todo Help
- `f0233b8d` — Storage, Chat, Picture Help - `f0233b8d` — Storage, Chat, Picture Help
- `7077c0a3` — Help-Pages in 10 Apps - `7077c0a3` — Help-Pages in 10 Apps
- `bdab2722` — Shared Translations, Zitare + Mukke Help - `bdab2722` — Shared Translations, Quotes + Mukke Help
--- ---
@ -148,7 +148,7 @@ Help-Pages in 10+ bisher fehlende Apps nachgezogen, verbesserte Inhalte für all
- ManaScore Extended Codebase-Metrics für alle App-Audits (`b9a9052a`) - ManaScore Extended Codebase-Metrics für alle App-Audits (`b9a9052a`)
- Fehlende prom-client Dependency in 4 Backends (`422b4f9f`) - Fehlende prom-client Dependency in 4 Backends (`422b4f9f`)
- Onboarding-Modal in 8 Apps aus Flex-Layout rausgeschoben (`491c71e2`) - Onboarding-Modal in 8 Apps aus Flex-Layout rausgeschoben (`491c71e2`)
- Fehlende Cloudflare-Tunnel-Routes für Zitare, SkillTree, Planta (`d8886346`) - Fehlende Cloudflare-Tunnel-Routes für Quotes, SkillTree, Planta (`d8886346`)
### Dokumentation ### Dokumentation

View file

@ -1,6 +1,6 @@
--- ---
title: 'Storage-Sprint, Passkeys & 2FA, Cross-App Tags, Zitare-Polish & Local-First Planung' title: 'Storage-Sprint, Passkeys & 2FA, Cross-App Tags, Quotes-Polish & Local-First Planung'
description: 'Massiver Tag mit 61 Commits: Storage auf ManaScore 87, WebAuthn/Passkeys und TOTP-2FA, Cross-App Tag-System, Zitare-Komplett-Polish, SvelteKit Base-Image, und Local-First Architekturplanung.' description: 'Massiver Tag mit 61 Commits: Storage auf ManaScore 87, WebAuthn/Passkeys und TOTP-2FA, Cross-App Tag-System, Quotes-Komplett-Polish, SvelteKit Base-Image, und Local-First Architekturplanung.'
date: 2026-03-26 date: 2026-03-26
author: 'Till Schneider' author: 'Till Schneider'
category: 'feature' category: 'feature'
@ -11,7 +11,7 @@ tags:
'passkeys', 'passkeys',
'2fa', '2fa',
'tags', 'tags',
'zitare', 'quotes',
'infrastructure', 'infrastructure',
'docker', 'docker',
'local-first', 'local-first',
@ -35,12 +35,12 @@ workingHours:
end: '2026-03-26T22:00' end: '2026-03-26T22:00'
--- ---
Massiver Tag mit **61 Commits** über **329 Dateien** und netto **+16.715 Zeilen** — Storage-Sprint, Auth-Features, Tag-System, Zitare-Polish, Infra und Architekturplanung: Massiver Tag mit **61 Commits** über **329 Dateien** und netto **+16.715 Zeilen** — Storage-Sprint, Auth-Features, Tag-System, Quotes-Polish, Infra und Architekturplanung:
- **Storage-App komplett** — Von Score 72 auf 87: Previews, Audio-Player, Skeleton Screens, Sharing, Tagging, i18n, E2E-Tests - **Storage-App komplett** — Von Score 72 auf 87: Previews, Audio-Player, Skeleton Screens, Sharing, Tagging, i18n, E2E-Tests
- **Auth: Passkeys & 2FA** — WebAuthn/Passkeys und TOTP-2FA in allen Apps, Google/Apple Login entfernt - **Auth: Passkeys & 2FA** — WebAuthn/Passkeys und TOTP-2FA in allen Apps, Google/Apple Login entfernt
- **Cross-App Tag-System** — Neues Tag-System mit Gruppen und Entity-Links in 18 Apps integriert - **Cross-App Tag-System** — Neues Tag-System mit Gruppen und Entity-Links in 18 Apps integriert
- **Zitare Komplett-Polish** — i18n, Display-Settings, Suche, Filter, Author-Bios, Loading States - **Quotes Komplett-Polish** — i18n, Display-Settings, Suche, Filter, Author-Bios, Loading States
- **Local-First Architektur** — Umfassende Planung für Dexie.js + Go Sync-Server + Hono/Bun - **Local-First Architektur** — Umfassende Planung für Dexie.js + Go Sync-Server + Hono/Bun
- **Infra** — SvelteKit Base-Image, build-app.sh Script, Dockerfile-Fixes - **Infra** — SvelteKit Base-Image, build-app.sh Script, Dockerfile-Fixes
@ -162,7 +162,7 @@ Neues, app-übergreifendes Tag-System mit:
--- ---
## 4. Zitare: Komplett-Polish ## 4. Quotes: Komplett-Polish
Umfassende Qualitätsverbesserungen für die Zitate-App: Umfassende Qualitätsverbesserungen für die Zitate-App:
@ -225,7 +225,7 @@ Neues `sveltekit-base:local` Docker-Image mit allen Shared Packages vorinstallie
- `9c8bae3d` — NestJS Auth: Multiple JWT-Issuers für Docker/Public URL Mismatch - `9c8bae3d` — NestJS Auth: Multiple JWT-Issuers für Docker/Public URL Mismatch
- `2b0b902b` — Credit-Operations Package Exports auf compiled `dist/` zeigend - `2b0b902b` — Credit-Operations Package Exports auf compiled `dist/` zeigend
- `5a3ee5c7` — Todo Task UI: Priority-Checkboxes, Drag-Styling, Route-Fix - `5a3ee5c7` — Todo Task UI: Priority-Checkboxes, Drag-Styling, Route-Fix
- Diverse Dockerfile-Fixes für Zitare, Storage, Todo (fehlende Dependencies, Node Heap Size) - Diverse Dockerfile-Fixes für Quotes, Storage, Todo (fehlende Dependencies, Node Heap Size)
--- ---
@ -236,7 +236,7 @@ Neues `sveltekit-base:local` Docker-Image mit allen Shared Packages vorinstallie
| **Storage** | Score 72 → 87: Previews, Audio-Player, Sharing, Tagging, E2E-Tests, i18n | | **Storage** | Score 72 → 87: Previews, Audio-Player, Sharing, Tagging, E2E-Tests, i18n |
| **Auth** | Passkeys + TOTP-2FA in allen Apps, Social Login entfernt, 35+ Tests | | **Auth** | Passkeys + TOTP-2FA in allen Apps, Social Login entfernt, 35+ Tests |
| **Tags** | Cross-App Tag-System in 18 Apps integriert, 37 Backend-Tests | | **Tags** | Cross-App Tag-System in 18 Apps integriert, 37 Backend-Tests |
| **Zitare** | Komplett i18n, Display-Settings, Suche, Filter, Author-Bios | | **Quotes** | Komplett i18n, Display-Settings, Suche, Filter, Author-Bios |
| **Architektur** | Local-First Planung: Dexie.js + Go Sync + Hono/Bun | | **Architektur** | Local-First Planung: Dexie.js + Go Sync + Hono/Bun |
| **Infra** | SvelteKit Base-Image, build-app.sh, Dockerfile-Fixes | | **Infra** | SvelteKit Base-Image, build-app.sh, Dockerfile-Fixes |
| **Gesamt** | 61 Commits, 329 Dateien, +19.553 / -2.838 Zeilen | | **Gesamt** | 61 Commits, 329 Dateien, +19.553 / -2.838 Zeilen |

View file

@ -48,7 +48,7 @@ Jeder Matrix-Bot lief als eigenständiger NestJS-Service mit eigenem Docker-Cont
| matrix-todo-bot | Aufgabenverwaltung | 4014 | | matrix-todo-bot | Aufgabenverwaltung | 4014 |
| matrix-calendar-bot | Kalender | 4015 | | matrix-calendar-bot | Kalender | 4015 |
| matrix-food-bot | Ernährungstracking | 4016 | | matrix-food-bot | Ernährungstracking | 4016 |
| matrix-zitare-bot | Zitate & Inspiration | 4017 | | matrix-quotes-bot | Zitate & Inspiration | 4017 |
| matrix-clock-bot | Timer, Alarme, Weltuhren | 4018 | | matrix-clock-bot | Timer, Alarme, Weltuhren | 4018 |
| matrix-tts-bot | Text-to-Speech | 4019 | | matrix-tts-bot | Text-to-Speech | 4019 |
| matrix-stt-bot | Speech-to-Text | 4021 | | matrix-stt-bot | Speech-to-Text | 4021 |
@ -129,7 +129,7 @@ services/mana-matrix-bot/ # 50 Dateien, 7.620 Zeilen Go
│ ├── calendar/ # !heute, !morgen, !woche, !termine │ ├── calendar/ # !heute, !morgen, !woche, !termine
│ ├── clock/ # !timer, !stop, !alarm, !zeit │ ├── clock/ # !timer, !stop, !alarm, !zeit
│ ├── contacts/ # !kontakte, !suche, !favoriten, !edit │ ├── contacts/ # !kontakte, !suche, !favoriten, !edit
│ ├── zitare/ # !zitat, !suche, !kategorie, !favoriten │ ├── quotes/ # !zitat, !suche, !kategorie, !favoriten
│ ├── planta/ # !pflanzen, !giessen, !fällig, !historie │ ├── planta/ # !pflanzen, !giessen, !fällig, !historie
│ ├── ollama/ # AI Chat, !models, !all, !mode │ ├── ollama/ # AI Chat, !models, !all, !mode
│ ├── stt/ # Audio→Text, !language, !model │ ├── stt/ # Audio→Text, !language, !model
@ -215,7 +215,7 @@ Neues Plugin hinzufügen = 3 Schritte:
| **calendar** | !heute, !morgen, !woche, !termine, !termin, !löschen, !kalender | Event creation, Date parsing | | **calendar** | !heute, !morgen, !woche, !termine, !termin, !löschen, !kalender | Event creation, Date parsing |
| **clock** | !timer, !stop, !resume, !reset, !timers, !alarm, !alarme, !zeit | Duration parsing (25m, 1h30m) | | **clock** | !timer, !stop, !resume, !reset, !timers, !alarm, !alarme, !zeit | Duration parsing (25m, 1h30m) |
| **contacts** | !kontakte, !suche, !favoriten, !kontakt, !neu, !edit, !fav, !delete | 16 editierbare Felder, Number-References | | **contacts** | !kontakte, !suche, !favoriten, !kontakt, !neu, !edit, !fav, !delete | 16 editierbare Felder, Number-References |
| **zitare** | !zitat, !heute, !suche, !kategorie, !kategorien, !motivation, !favorit, !favoriten, !listen | Categories, Favorites, Lists | | **quotes** | !zitat, !heute, !suche, !kategorie, !kategorien, !motivation, !favorit, !favoriten, !listen | Categories, Favorites, Lists |
| **planta** | !pflanzen, !pflanze, !neu, !giessen, !fällig, !historie, !intervall, !edit, !delete | Watering schedule, Health tracking | | **planta** | !pflanzen, !pflanze, !neu, !giessen, !fällig, !historie, !intervall, !edit, !delete | Watering schedule, Health tracking |
| **ollama** | AI Chat, !models, !model, !clear, !all, !mode | Chat history, System prompts, Model comparison | | **ollama** | AI Chat, !models, !model, !clear, !all, !mode | Chat history, System prompts, Model comparison |
| **stt** | Audio→Text, !language, !model, !status | Whisper/Voxtral, Language selection | | **stt** | Audio→Text, !language, !model, !status | Whisper/Voxtral, Language selection |

View file

@ -162,5 +162,5 @@ State wird in localStorage persistiert. Aktuell nur in der Todo-App, geplant als
## Nächste Schritte ## Nächste Schritte
- Debug-Borders als globales Shared-Package für alle Apps - Debug-Borders als globales Shared-Package für alle Apps
- Keyboard-Navigation Pattern in andere Apps übertragen (Zitare, Contacts) - Keyboard-Navigation Pattern in andere Apps übertragen (Quotes, Contacts)
- Tastatur-Shortcut-Hilfe (? oder Ctrl+/) mit Overlay - Tastatur-Shortcut-Hilfe (? oder Ctrl+/) mit Overlay

View file

@ -275,7 +275,7 @@ Drei Komponenten die über viele Apps hinweg dupliziert waren:
| Komponente | Apps (vorher) | Lösung | | Komponente | Apps (vorher) | Lösung |
| ------------------ | ------------------------------------------------------------- | ------------------------------------------------------- | | ------------------ | ------------------------------------------------------------- | ------------------------------------------------------- |
| `LanguageSelector` | contacts, zitare: Custom-Dropdown mit eigenem State | → `PillDropdown` aus shared-ui (wie die anderen 8 Apps) | | `LanguageSelector` | contacts, quotes: Custom-Dropdown mit eigenem State | → `PillDropdown` aus shared-ui (wie die anderen 8 Apps) |
| `ConfirmDialog` | context (4 Stellen), times (3 Stellen): lokale Kopien | → `ConfirmationModal` aus `@manacore/shared-ui` | | `ConfirmDialog` | context (4 Stellen), times (3 Stellen): lokale Kopien | → `ConfirmationModal` aus `@manacore/shared-ui` |
| `AppSlider` | todo, calendar, chat, contacts, presi: statisches `MANA_APPS` | → `getActiveManaApps()` (filtert inaktive Apps) | | `AppSlider` | todo, calendar, chat, contacts, presi: statisches `MANA_APPS` | → `getActiveManaApps()` (filtert inaktive Apps) |
@ -308,7 +308,7 @@ Das Arcade-Backend (AI Browser Games) war noch auf NestJS. Migration auf Hono/Bu
| Fix | Beschreibung | | Fix | Beschreibung |
| -------------- | ------------------------------------------------------------ | | -------------- | ------------------------------------------------------------ |
| Port-Konflikt | calc-web: Port 5026 → 5031 (kollidierte mit zitare-web) | | Port-Konflikt | calc-web: Port 5026 → 5031 (kollidierte mit quotes-web) |
| Cloudflared | Config mit tatsächlichen Container-Ports synchronisiert | | Cloudflared | Config mit tatsächlichen Container-Ports synchronisiert |
| Landings Nginx | `mkdir snippets` vor Copy, status.mana.how vhost hinzugefügt | | Landings Nginx | `mkdir snippets` vor Copy, status.mana.how vhost hinzugefügt |
| Prerender 404 | favicon.png 404s bei skilltree + food unterdrückt | | Prerender 404 | favicon.png 404s bei skilltree + food unterdrückt |
@ -347,5 +347,5 @@ Drei neue Planungs-/Guidelines-Dokumente:
- Memoro Production-Deploy + DNS - Memoro Production-Deploy + DNS
- Status-Page: Alert-Integration (Matrix-Benachrichtigung bei Downtime) - Status-Page: Alert-Integration (Matrix-Benachrichtigung bei Downtime)
- Todo: Keyboard-Navigation-Pattern auf andere Apps übertragen (Zitare, Contacts) - Todo: Keyboard-Navigation-Pattern auf andere Apps übertragen (Quotes, Contacts)
- Debug-Borders als globales Shared-Package - Debug-Borders als globales Shared-Package

View file

@ -139,7 +139,7 @@ spotlight.registerActions('todo', [
### Content-Search-Provider ### Content-Search-Provider
Spotlight kann jetzt **inhaltlich** suchen — über Provider, die IndexedDB-Tabellen abfragen. Erste Provider live für **picture, presi, mukke, zitare, clock**. Spotlight kann jetzt **inhaltlich** suchen — über Provider, die IndexedDB-Tabellen abfragen. Erste Provider live für **picture, presi, mukke, quotes, clock**.
```typescript ```typescript
spotlight.registerSearchProvider('picture', async (query) => { spotlight.registerSearchProvider('picture', async (query) => {

View file

@ -290,7 +290,7 @@ Heute war auch Aufräumtag. Mit den 25 archivierten Apps von gestern und der Sta
| Status-Page / Prometheus / Cloudflared | Configs für unified app aktualisiert | | Status-Page / Prometheus / Cloudflared | Configs für unified app aktualisiert |
| Race in status-page-gen | Lock-File während Generation | | Race in status-page-gen | Lock-File während Generation |
| Analytics Umami Website-ID | Nach DB-Reset neue ID gepflegt | | Analytics Umami Website-ID | Nach DB-Reset neue ID gepflegt |
| `getTagsByIds` | Fehlender `allTags` Param in zitare gefixt | | `getTagsByIds` | Fehlender `allTags` Param in quotes gefixt |
| ManaContacts → Kontakte | Branding-Rename | | ManaContacts → Kontakte | Branding-Rename |
| AppDrawer → new tab | Apps öffnen sich extern statt innerhalb der App | | AppDrawer → new tab | Apps öffnen sich extern statt innerhalb der App |
| `bindclient:Height` → calculated | Bottom-Chrome-Height berechnet, nicht gemessen | | `bindclient:Height` → calculated | Bottom-Chrome-Height berechnet, nicht gemessen |

View file

@ -71,7 +71,7 @@ Mana ist das **Herzstück des Monorepos** - das Multi-App Ecosystem Dashboard mi
- 25 Web-Routes in 2 Route-Groups ((auth) + (app)) - 25 Web-Routes in 2 Route-Groups ((auth) + (app))
- 36 Komponenten, 6 Svelte 5 Rune Stores (690 LOC) - 36 Komponenten, 6 Svelte 5 Rune Stores (690 LOC)
- 11 Dashboard-Widgets (Calendar, Clock, Contacts, Chat, Picture, Tasks, Credits, Storage, Transactions, Cards, Zitare) - 11 Dashboard-Widgets (Calendar, Clock, Contacts, Chat, Picture, Tasks, Credits, Storage, Transactions, Cards, Quotes)
- 5-Step Onboarding-Wizard (Welcome → Profile → Credits → Apps → Complete) - 5-Step Onboarding-Wizard (Welcome → Profile → Credits → Apps → Complete)
- App-Switcher (AppSlider) für Multi-App Navigation - App-Switcher (AppSlider) für Multi-App Navigation
- Skeleton Loading States, Error Boundaries auf Widgets - Skeleton Loading States, Error Boundaries auf Widgets
@ -117,7 +117,7 @@ Mana ist das **Herzstück des Monorepos** - das Multi-App Ecosystem Dashboard mi
- Todo Widget Service Tests (7 Tests) - Todo Widget Service Tests (7 Tests)
- Calendar Widget Service Tests (6 Tests) - Calendar Widget Service Tests (6 Tests)
- Chat Widget Service Tests (6 Tests) - Chat Widget Service Tests (6 Tests)
- Zitare Widget Service Tests (6 Tests) - Quotes Widget Service Tests (6 Tests)
**Lücken:** **Lücken:**

View file

@ -1,10 +1,10 @@
--- ---
title: 'Zitare: Production Readiness Audit' title: 'Quotes: Production Readiness Audit'
description: 'Bewertung der Zitat-App - schlankes Backend, deployed auf mana.how, aber keine Tests und fehlende Dokumentation' description: 'Bewertung der Zitat-App - schlankes Backend, deployed auf mana.how, aber keine Tests und fehlende Dokumentation'
date: 2026-03-19 date: 2026-03-19
app: 'zitare' app: 'quotes'
author: 'Till Schneider' author: 'Till Schneider'
tags: ['audit', 'zitare', 'production-readiness'] tags: ['audit', 'quotes', 'production-readiness']
score: 62 score: 62
scores: scores:
backend: 72 backend: 72
@ -45,7 +45,7 @@ stats:
## Zusammenfassung ## Zusammenfassung
Zitare ist die **einzige App neben Calendar die produktiv deployed** ist (zitare.mana.how). Schlankes Backend mit Favorites + Lists, solide Web-App mit Svelte 5 und PWA. Aber: **Null Tests**, kein CLAUDE.md, und das einfachste Schema aller Apps. Die App profitiert von der statischen Quote-Content-Bibliothek (64 Zitate in 6 Sprachen). Quotes ist die **einzige App neben Calendar die produktiv deployed** ist (quotes.mana.how). Schlankes Backend mit Favorites + Lists, solide Web-App mit Svelte 5 und PWA. Aber: **Null Tests**, kein CLAUDE.md, und das einfachste Schema aller Apps. Die App profitiert von der statischen Quote-Content-Bibliothek (64 Zitate in 6 Sprachen).
## Backend (72/100) ## Backend (72/100)
@ -102,7 +102,7 @@ Zitare ist die **einzige App neben Calendar die produktiv deployed** ist (zitare
**Stärken:** **Stärken:**
- **Produktiv deployed** auf zitare.mana.how - **Produktiv deployed** auf quotes.mana.how
- Multi-Stage Dockerfiles (Backend + Web) - Multi-Stage Dockerfiles (Backend + Web)
- Health Checks (30s Interval, 3 Retries) - Health Checks (30s Interval, 3 Retries)
- docker-compose.macmini.yml vollständig konfiguriert - docker-compose.macmini.yml vollständig konfiguriert
@ -115,7 +115,7 @@ Zitare ist die **einzige App neben Calendar die produktiv deployed** ist (zitare
## Documentation (20/100) ## Documentation (20/100)
**Kritische Lücke:** Kein `apps/zitare/CLAUDE.md` vorhanden. Keine API-Dokumentation. Kein README. Nur die Monorepo-Root-Doku referenziert Zitare. **Kritische Lücke:** Kein `apps/quotes/CLAUDE.md` vorhanden. Keine API-Dokumentation. Kein README. Nur die Monorepo-Root-Doku referenziert Quotes.
## Security (70/100) ## Security (70/100)

View file

@ -55,7 +55,7 @@ Die Architektur-Migration hat alle Apps gleichzeitig verbessert:
| **Contacts** | 78 | 87 | +9 | Local-First + vCard Import Server | | **Contacts** | 78 | 87 | +9 | Local-First + vCard Import Server |
| **Picture** | 76 | 85 | +9 | Local-First + Replicate Server | | **Picture** | 76 | 85 | +9 | Local-First + Replicate Server |
| **Cards** | 80 | 89 | +9 | Local-First + AI Card Gen Server | | **Cards** | 80 | 89 | +9 | Local-First + AI Card Gen Server |
| **Zitare** | 88 | 93 | +5 | Local-First, war schon solide | | **Quotes** | 88 | 93 | +5 | Local-First, war schon solide |
| **Clock** | 85 | 91 | +6 | Local-First + keine Backend-Dependency | | **Clock** | 85 | 91 | +6 | Local-First + keine Backend-Dependency |
| **Storage** | 72 | 82 | +10 | Local-First + S3 Server | | **Storage** | 72 | 82 | +10 | Local-First + S3 Server |
| **Food** | 70 | 82 | +12 | Local-First + Gemini Server | | **Food** | 70 | 82 | +12 | Local-First + Gemini Server |

View file

@ -194,7 +194,7 @@
}, },
{ {
"app": "mana", "app": "mana",
"file": "routes/(app)/zitare/lists/[id]/+page.svelte", "file": "routes/(app)/quotes/lists/[id]/+page.svelte",
"lines": 951 "lines": 951
}, },
{ {

View file

@ -70,7 +70,7 @@ export const ui = {
'app.maerchenzauber.description': 'Erstelle magische Kindergeschichten mit KI-Unterstützung', 'app.maerchenzauber.description': 'Erstelle magische Kindergeschichten mit KI-Unterstützung',
'app.moodlit.description': 'app.moodlit.description':
'Deine persönliche KI für emotionales Wohlbefinden und mentale Gesundheit', 'Deine persönliche KI für emotionales Wohlbefinden und mentale Gesundheit',
'app.zitare.description': 'app.quotes.description':
'Intelligente Zitatverwaltung und Literaturrecherche für akademisches Arbeiten', 'Intelligente Zitatverwaltung und Literaturrecherche für akademisches Arbeiten',
'app.cards.description': 'app.cards.description':
'KI-gestützte Karteikarten-App für effektives Lernen und Wissensmanagement', 'KI-gestützte Karteikarten-App für effektives Lernen und Wissensmanagement',
@ -150,7 +150,7 @@ export const ui = {
'AI-powered knowledge platform for intelligent learning and documentation', 'AI-powered knowledge platform for intelligent learning and documentation',
'app.maerchenzauber.description': "Create magical children's stories with AI support", 'app.maerchenzauber.description': "Create magical children's stories with AI support",
'app.moodlit.description': 'Your personal AI for emotional well-being and mental health', 'app.moodlit.description': 'Your personal AI for emotional well-being and mental health',
'app.zitare.description': 'app.quotes.description':
'Intelligent citation management and literature research for academic work', 'Intelligent citation management and literature research for academic work',
'app.cards.description': 'app.cards.description':
'AI-powered flashcard app for effective learning and knowledge management', 'AI-powered flashcard app for effective learning and knowledge management',
@ -230,7 +230,7 @@ export const ui = {
'Piattaforma di conoscenza basata su AI per apprendimento e documentazione intelligenti', 'Piattaforma di conoscenza basata su AI per apprendimento e documentazione intelligenti',
'app.maerchenzauber.description': "Crea storie magiche per bambini con il supporto dell'AI", 'app.maerchenzauber.description': "Crea storie magiche per bambini con il supporto dell'AI",
'app.moodlit.description': 'La tua AI personale per il benessere emotivo e la salute mentale', 'app.moodlit.description': 'La tua AI personale per il benessere emotivo e la salute mentale',
'app.zitare.description': 'app.quotes.description':
'Gestione intelligente delle citazioni e ricerca bibliografica per lavoro accademico', 'Gestione intelligente delle citazioni e ricerca bibliografica per lavoro accademico',
'app.cards.description': 'app.cards.description':
'App di flashcard basata su AI per apprendimento efficace e gestione della conoscenza', 'App di flashcard basata su AI per apprendimento efficace e gestione della conoscenza',
@ -315,7 +315,7 @@ export const ui = {
"Créez des histoires magiques pour enfants avec le soutien de l'IA", "Créez des histoires magiques pour enfants avec le soutien de l'IA",
'app.moodlit.description': 'app.moodlit.description':
'Votre IA personnelle pour le bien-être émotionnel et la santé mentale', 'Votre IA personnelle pour le bien-être émotionnel et la santé mentale',
'app.zitare.description': 'app.quotes.description':
'Gestion intelligente des citations et recherche bibliographique pour le travail académique', 'Gestion intelligente des citations et recherche bibliographique pour le travail académique',
'app.cards.description': 'app.cards.description':
"Application de cartes mémoire basée sur l'IA pour un apprentissage efficace et la gestion des connaissances", "Application de cartes mémoire basée sur l'IA pour un apprentissage efficace et la gestion des connaissances",
@ -398,7 +398,7 @@ export const ui = {
'Plataforma de conocimiento impulsada por IA para aprendizaje y documentación inteligentes', 'Plataforma de conocimiento impulsada por IA para aprendizaje y documentación inteligentes',
'app.maerchenzauber.description': 'Crea historias mágicas para niños con soporte de IA', 'app.maerchenzauber.description': 'Crea historias mágicas para niños con soporte de IA',
'app.moodlit.description': 'Tu IA personal para el bienestar emocional y la salud mental', 'app.moodlit.description': 'Tu IA personal para el bienestar emocional y la salud mental',
'app.zitare.description': 'app.quotes.description':
'Gestión inteligente de citas e investigación bibliográfica para trabajo académico', 'Gestión inteligente de citas e investigación bibliográfica para trabajo académico',
'app.cards.description': 'app.cards.description':
'App de tarjetas de memoria impulsada por IA para aprendizaje efectivo y gestión del conocimiento', 'App de tarjetas de memoria impulsada por IA para aprendizaje efectivo y gestión del conocimiento',

View file

@ -42,7 +42,7 @@ const sections: Section[] = [
apps: [ apps: [
{ name: 'Cards', icon: 'ph:cards-bold', tagline: 'KI Karteikarten', url: 'https://cards.mana.how' }, { name: 'Cards', icon: 'ph:cards-bold', tagline: 'KI Karteikarten', url: 'https://cards.mana.how' },
{ name: 'SkilltTree', icon: 'ph:tree-structure-bold', tagline: 'Skill-Tracking', url: 'https://skilltree.mana.how' }, { name: 'SkilltTree', icon: 'ph:tree-structure-bold', tagline: 'Skill-Tracking', url: 'https://skilltree.mana.how' },
{ name: 'Zitare', icon: 'ph:quotes-bold', tagline: 'Zitate & Inspiration', url: 'https://zitare.mana.how' }, { name: 'Quotes', icon: 'ph:quotes-bold', tagline: 'Zitate & Inspiration', url: 'https://quotes.mana.how' },
], ],
}, },
{ {

View file

@ -33,12 +33,12 @@ const apps = [
href: '/apps/moodlit', href: '/apps/moodlit',
}, },
{ {
name: 'Zitare', name: 'Quotes',
descriptionKey: 'app.zitare.description', descriptionKey: 'app.quotes.description',
logo: '📚', logo: '📚',
categoryKey: 'app.category.research', categoryKey: 'app.category.research',
color: 'from-emerald-500 to-teal-500', color: 'from-emerald-500 to-teal-500',
href: '/apps/zitare', href: '/apps/quotes',
}, },
{ {
name: 'Cards', name: 'Cards',

View file

@ -33,12 +33,12 @@ const apps = [
href: '/apps/moodlit', href: '/apps/moodlit',
}, },
{ {
name: 'Zitare', name: 'Quotes',
descriptionKey: 'app.zitare.description', descriptionKey: 'app.quotes.description',
logo: '📚', logo: '📚',
categoryKey: 'app.category.research', categoryKey: 'app.category.research',
color: 'from-emerald-500 to-teal-500', color: 'from-emerald-500 to-teal-500',
href: '/apps/zitare', href: '/apps/quotes',
}, },
{ {
name: 'Cards', name: 'Cards',

View file

@ -33,12 +33,12 @@ const apps = [
href: '/apps/moodlit', href: '/apps/moodlit',
}, },
{ {
name: 'Zitare', name: 'Quotes',
descriptionKey: 'app.zitare.description', descriptionKey: 'app.quotes.description',
logo: '📚', logo: '📚',
categoryKey: 'app.category.research', categoryKey: 'app.category.research',
color: 'from-emerald-500 to-teal-500', color: 'from-emerald-500 to-teal-500',
href: '/apps/zitare', href: '/apps/quotes',
}, },
{ {
name: 'Cards', name: 'Cards',

View file

@ -56,12 +56,12 @@ const apps = [
href: '/apps/moodlit', href: '/apps/moodlit',
}, },
{ {
name: 'Zitare', name: 'Quotes',
descriptionKey: 'app.zitare.description', descriptionKey: 'app.quotes.description',
logo: '📚', logo: '📚',
categoryKey: 'app.category.research', categoryKey: 'app.category.research',
color: 'from-emerald-500 to-teal-500', color: 'from-emerald-500 to-teal-500',
href: '/apps/zitare', href: '/apps/quotes',
}, },
{ {
name: 'Cards', name: 'Cards',

View file

@ -33,12 +33,12 @@ const apps = [
href: '/apps/moodlit', href: '/apps/moodlit',
}, },
{ {
name: 'Zitare', name: 'Quotes',
descriptionKey: 'app.zitare.description', descriptionKey: 'app.quotes.description',
logo: '📚', logo: '📚',
categoryKey: 'app.category.research', categoryKey: 'app.category.research',
color: 'from-emerald-500 to-teal-500', color: 'from-emerald-500 to-teal-500',
href: '/apps/zitare', href: '/apps/quotes',
}, },
{ {
name: 'Cards', name: 'Cards',

View file

@ -34,11 +34,11 @@ const MANA_APPS: AppInfo[] = [
link_web: 'https://picture.mana.how', link_web: 'https://picture.mana.how',
}, },
{ {
id: 'zitare', id: 'quotes',
name: 'Zitare', name: 'Quotes',
description: 'Tägliche Inspirationszitate', description: 'Tägliche Inspirationszitate',
icon: 'quote-left', icon: 'quote-left',
link_web: 'https://zitare.mana.how', link_web: 'https://quotes.mana.how',
}, },
{ {
id: 'cards', id: 'cards',

View file

@ -12,7 +12,7 @@ ENV PUBLIC_SYNC_SERVER_URL=$PUBLIC_SYNC_SERVER_URL
COPY apps/mana/apps/web ./apps/mana/apps/web COPY apps/mana/apps/web ./apps/mana/apps/web
COPY apps/calc/packages/shared ./apps/calc/packages/shared COPY apps/calc/packages/shared ./apps/calc/packages/shared
COPY apps/zitare/packages/content ./apps/zitare/packages/content COPY apps/quotes/packages/content ./apps/quotes/packages/content
COPY packages/shared-uload ./packages/shared-uload COPY packages/shared-uload ./packages/shared-uload
COPY packages/local-llm ./packages/local-llm COPY packages/local-llm ./packages/local-llm
COPY packages/local-stt ./packages/local-stt COPY packages/local-stt ./packages/local-stt
@ -22,7 +22,7 @@ RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \
pnpm install --no-frozen-lockfile --ignore-scripts pnpm install --no-frozen-lockfile --ignore-scripts
# Build dependencies that need compilation # Build dependencies that need compilation
WORKDIR /app/apps/zitare/packages/content WORKDIR /app/apps/quotes/packages/content
RUN pnpm build RUN pnpm build
WORKDIR /app/apps/mana/apps/web WORKDIR /app/apps/mana/apps/web

View file

@ -21,7 +21,7 @@ import { setSecurityHeaders } from '@mana/shared-utils/security-headers';
* *
* Per-app HTTP backends (todo-api, calendar-api, contacts-api, chat-api, * Per-app HTTP backends (todo-api, calendar-api, contacts-api, chat-api,
* storage-api, cards-api, mukke-api, food-api, picture-api, presi-api, * storage-api, cards-api, mukke-api, food-api, picture-api, presi-api,
* zitare-api, clock-api, context-api) were removed in the pre-launch * quotes-api, clock-api, context-api) were removed in the pre-launch
* ghost-API cleanup every product module now talks to mana-sync directly. * ghost-API cleanup every product module now talks to mana-sync directly.
*/ */
@ -54,7 +54,7 @@ const APP_SUBDOMAINS = new Set([
'chat', 'chat',
'calendar', 'calendar',
'contacts', 'contacts',
'zitare', 'quotes',
'skilltree', 'skilltree',
'plants', 'plants',
'cards', 'cards',

View file

@ -2,7 +2,7 @@
* API Services barrel. * API Services barrel.
* *
* Per-app HTTP backend services (todo, calendar, contacts, chat, storage, * Per-app HTTP backend services (todo, calendar, contacts, chat, storage,
* cards, music, picture, presi, zitare, clock, context) used to live here * cards, music, picture, presi, quotes, clock, context) used to live here
* but were removed in the pre-launch ghost-API cleanup every product * but were removed in the pre-launch ghost-API cleanup every product
* module now reads/writes the unified Dexie database via the local-first * module now reads/writes the unified Dexie database via the local-first
* sync layer (`mana-sync`), and `qr-export` queries Dexie directly. * sync layer (`mana-sync`), and `qr-export` queries Dexie directly.

View file

@ -552,13 +552,13 @@ registerApp({
}); });
registerApp({ registerApp({
id: 'zitare', id: 'quotes',
name: 'Zitare', name: 'Quotes',
color: '#EC4899', color: '#EC4899',
icon: Quotes, icon: Quotes,
views: { views: {
list: { load: () => import('$lib/modules/zitare/ListView.svelte') }, list: { load: () => import('$lib/modules/quotes/ListView.svelte') },
detail: { load: () => import('$lib/modules/zitare/views/DetailView.svelte') }, detail: { load: () => import('$lib/modules/quotes/views/DetailView.svelte') },
}, },
}); });

View file

@ -91,7 +91,7 @@ export const APP_CATEGORY_MAP: Record<string, AppCategory> = {
cards: 'creative', cards: 'creative',
skilltree: 'creative', skilltree: 'creative',
guides: 'creative', guides: 'creative',
zitare: 'creative', quotes: 'creative',
uload: 'creative', uload: 'creative',
playground: 'creative', playground: 'creative',

View file

@ -16,7 +16,7 @@ import TasksUpcomingWidget from './widgets/TasksUpcomingWidget.svelte';
import CalendarEventsWidget from './widgets/CalendarEventsWidget.svelte'; import CalendarEventsWidget from './widgets/CalendarEventsWidget.svelte';
import ChatRecentWidget from './widgets/ChatRecentWidget.svelte'; import ChatRecentWidget from './widgets/ChatRecentWidget.svelte';
import ContactsFavoritesWidget from './widgets/ContactsFavoritesWidget.svelte'; import ContactsFavoritesWidget from './widgets/ContactsFavoritesWidget.svelte';
import ZitareQuoteWidget from './widgets/ZitareQuoteWidget.svelte'; import QuoteWidget from './widgets/QuoteWidget.svelte';
import PictureRecentWidget from './widgets/PictureRecentWidget.svelte'; import PictureRecentWidget from './widgets/PictureRecentWidget.svelte';
import CardsProgressWidget from './widgets/CardsProgressWidget.svelte'; import CardsProgressWidget from './widgets/CardsProgressWidget.svelte';
import ClockTimersWidget from './widgets/ClockTimersWidget.svelte'; import ClockTimersWidget from './widgets/ClockTimersWidget.svelte';
@ -46,7 +46,7 @@ export const widgetComponents: Record<WidgetType, Component> = {
'chat-recent': ChatRecentWidget, 'chat-recent': ChatRecentWidget,
'contacts-favorites': ContactsFavoritesWidget, 'contacts-favorites': ContactsFavoritesWidget,
'contacts-recent': RecentContactsWidget, 'contacts-recent': RecentContactsWidget,
'zitare-quote': ZitareQuoteWidget, 'quotes-quote': QuoteWidget,
'picture-recent': PictureRecentWidget, 'picture-recent': PictureRecentWidget,
'cards-progress': CardsProgressWidget, 'cards-progress': CardsProgressWidget,
'clock-timers': ClockTimersWidget, 'clock-timers': ClockTimersWidget,

View file

@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
/** /**
* ZitareQuoteWidget - Random favorite quote (local-first) * QuotesQuoteWidget - Random favorite quote (local-first)
*/ */
import { _ } from 'svelte-i18n'; import { _ } from 'svelte-i18n';
@ -13,7 +13,7 @@
<div class="mb-3"> <div class="mb-3">
<h3 class="flex items-center gap-2 text-lg font-semibold"> <h3 class="flex items-center gap-2 text-lg font-semibold">
<span>💡</span> <span>💡</span>
{$_('dashboard.widgets.zitare.title')} {$_('dashboard.widgets.quotes.title')}
</h3> </h3>
</div> </div>
@ -22,16 +22,16 @@
{:else if !favorite.value} {:else if !favorite.value}
<div class="py-6 text-center"> <div class="py-6 text-center">
<div class="mb-2 text-3xl">💡</div> <div class="mb-2 text-3xl">💡</div>
<p class="text-sm text-muted-foreground">{$_('dashboard.widgets.zitare.empty')}</p> <p class="text-sm text-muted-foreground">{$_('dashboard.widgets.quotes.empty')}</p>
<a <a
href="/zitare" href="/quotes"
class="mt-3 inline-block rounded-lg bg-primary/10 px-4 py-2 text-sm font-medium text-primary hover:bg-primary/20" class="mt-3 inline-block rounded-lg bg-primary/10 px-4 py-2 text-sm font-medium text-primary hover:bg-primary/20"
> >
Zitate entdecken Zitate entdecken
</a> </a>
</div> </div>
{:else} {:else}
<a href="/zitare" class="block rounded-lg p-3 transition-colors hover:bg-surface-hover"> <a href="/quotes" class="block rounded-lg p-3 transition-colors hover:bg-surface-hover">
<p class="text-sm italic text-muted-foreground"> <p class="text-sm italic text-muted-foreground">
Favorit #{favorite.value.quoteId} Favorit #{favorite.value.quoteId}
</p> </p>

View file

@ -151,7 +151,7 @@ export const APP_POSITIONS: Record<string, { x: number; y: number; lakeId: strin
storage: { x: 160, y: 650, lakeId: 'db-left' }, storage: { x: 160, y: 650, lakeId: 'db-left' },
// Around Waldsee Mitte (db-center) // Around Waldsee Mitte (db-center)
zitare: { x: 640, y: 600, lakeId: 'db-center' }, quotes: { x: 640, y: 600, lakeId: 'db-center' },
music: { x: 850, y: 610, lakeId: 'db-center' }, music: { x: 850, y: 610, lakeId: 'db-center' },
clock: { x: 880, y: 680, lakeId: 'db-center' }, clock: { x: 880, y: 680, lakeId: 'db-center' },
food: { x: 650, y: 720, lakeId: 'db-center' }, food: { x: 650, y: 720, lakeId: 'db-center' },

View file

@ -202,8 +202,8 @@ const APP_DEFINITIONS: AppDefinition[] = [
}, },
}, },
{ {
id: 'zitare', id: 'quotes',
displayName: 'Zitare', displayName: 'Quotes',
score: 62, score: 62,
status: 'beta', status: 'beta',
categories: { categories: {

View file

@ -38,7 +38,7 @@
clock: 'https://clock.mana.how', clock: 'https://clock.mana.how',
food: 'https://food.mana.how', food: 'https://food.mana.how',
photos: 'https://photos.mana.how', photos: 'https://photos.mana.how',
zitare: 'https://zitare.mana.how', quotes: 'https://quotes.mana.how',
mana: 'https://mana.how', mana: 'https://mana.how',
cards: 'https://cards.mana.how', cards: 'https://cards.mana.how',
plants: 'https://plants.mana.how', plants: 'https://plants.mana.how',

View file

@ -29,7 +29,7 @@
redis: 'Schneller Cache-Speicher. Klein, kristallklar, sofort verfugbar.', redis: 'Schneller Cache-Speicher. Klein, kristallklar, sofort verfugbar.',
minio: 'Objekt-Speicher fur Dateien, Bilder und Medien aller Apps.', minio: 'Objekt-Speicher fur Dateien, Bilder und Medien aller Apps.',
'db-left': 'PostgreSQL-Datenbanken fur Calendar, Todo, Contacts, Storage.', 'db-left': 'PostgreSQL-Datenbanken fur Calendar, Todo, Contacts, Storage.',
'db-center': 'PostgreSQL-Datenbanken fur Zitare, Music, Clock, Food.', 'db-center': 'PostgreSQL-Datenbanken fur Quotes, Music, Clock, Food.',
'db-right': 'PostgreSQL-Datenbanken fur Photos, SkillTree, Context, Plants.', 'db-right': 'PostgreSQL-Datenbanken fur Photos, SkillTree, Context, Plants.',
}; };

View file

@ -44,8 +44,8 @@
category: 'AI', category: 'AI',
}, },
{ {
id: 'zitare', id: 'quotes',
name: 'Zitare', name: 'Quotes',
description: 'Tägliche Inspiration mit Zitaten', description: 'Tägliche Inspiration mit Zitaten',
icon: '💡', icon: '💡',
color: 'bg-yellow-500', color: 'bg-yellow-500',

View file

@ -423,9 +423,9 @@ export const appConfigs: Record<string, AppConfig> = {
// ============================================ // ============================================
// clock: consolidated into times // clock: consolidated into times
zitare: { quotes: {
name: 'zitare', name: 'quotes',
displayName: 'Zitare', displayName: 'Quotes',
tagline: 'Tägliche Inspiration', tagline: 'Tägliche Inspiration',
description: 'Entdecke inspirierende Zitate und Weisheiten für jeden Tag.', description: 'Entdecke inspirierende Zitate und Weisheiten für jeden Tag.',
logoEmoji: '💡', logoEmoji: '💡',
@ -458,7 +458,7 @@ export const appConfigs: Record<string, AppConfig> = {
}, },
], ],
dashboardRoute: '/', dashboardRoute: '/',
website: 'https://zitare.mana.how', website: 'https://quotes.mana.how',
}, },
storage: { storage: {
@ -584,7 +584,7 @@ export const defaultManaConfig: AppConfig = {
}, },
{ {
icon: '💡', icon: '💡',
title: 'Zitare', title: 'Quotes',
description: 'Tägliche Inspiration', description: 'Tägliche Inspiration',
color: '#F59E0B', color: '#F59E0B',
}, },
@ -631,6 +631,6 @@ export function getAppsByCategory(): {
appConfigs.contacts, appConfigs.contacts,
appConfigs.finance, appConfigs.finance,
], ],
utility: [appConfigs.clock, appConfigs.zitare, appConfigs.storage, appConfigs.moodlit], utility: [appConfigs.clock, appConfigs.quotes, appConfigs.storage, appConfigs.moodlit],
}; };
} }

View file

@ -13,7 +13,7 @@ import type { LocalTask } from '$lib/modules/todo/types';
import type { LocalTimeBlock } from '$lib/data/time-blocks/types'; import type { LocalTimeBlock } from '$lib/data/time-blocks/types';
import type { LocalContact } from '$lib/modules/contacts/types'; import type { LocalContact } from '$lib/modules/contacts/types';
import type { LocalConversation } from '$lib/modules/chat/types'; import type { LocalConversation } from '$lib/modules/chat/types';
import type { LocalFavorite } from '$lib/modules/zitare/types'; import type { LocalFavorite } from '$lib/modules/quotes/types';
import type { LocalImage } from '$lib/modules/picture/types'; import type { LocalImage } from '$lib/modules/picture/types';
import type { LocalAlarm, LocalCountdownTimer } from '$lib/modules/times/types'; import type { LocalAlarm, LocalCountdownTimer } from '$lib/modules/times/types';
import type { LocalFile } from '$lib/modules/storage/types'; import type { LocalFile } from '$lib/modules/storage/types';
@ -142,13 +142,13 @@ export function useRecentConversations(limit = 5) {
}, [] as LocalConversation[]); }, [] as LocalConversation[]);
} }
// ─── Zitare Queries ───────────────────────────────────────── // ─── Quotes Queries ─────────────────────────────────────────
/** A random favorite quote. */ /** A random favorite quote. */
export function useRandomFavorite() { export function useRandomFavorite() {
return useLiveQueryWithDefault( return useLiveQueryWithDefault(
async () => { async () => {
const all = await db.table<LocalFavorite>('zitareFavorites').toArray(); const all = await db.table<LocalFavorite>('quotesFavorites').toArray();
const active = all.filter((f) => !f.deletedAt); const active = all.filter((f) => !f.deletedAt);
if (active.length === 0) return null; if (active.length === 0) return null;
return active[Math.floor(Math.random() * active.length)]; return active[Math.floor(Math.random() * active.length)];

View file

@ -134,7 +134,7 @@ describe('module-registry — pre-refactor snapshot', () => {
chat: ['conversations', 'messages', 'chatTemplates', 'conversationTags'], chat: ['conversations', 'messages', 'chatTemplates', 'conversationTags'],
picture: ['images', 'boards', 'boardItems', 'imageTags'], picture: ['images', 'boards', 'boardItems', 'imageTags'],
cards: ['cardDecks', 'cards', 'deckTags'], cards: ['cardDecks', 'cards', 'deckTags'],
zitare: ['zitareFavorites', 'zitareLists', 'zitareListTags'], quotes: ['quotesFavorites', 'quotesLists', 'quotesListTags'],
music: ['songs', 'mukkePlaylists', 'playlistSongs', 'mukkeProjects', 'markers', 'songTags'], music: ['songs', 'mukkePlaylists', 'playlistSongs', 'mukkeProjects', 'markers', 'songTags'],
storage: ['files', 'storageFolders', 'fileTags'], storage: ['files', 'storageFolders', 'fileTags'],
presi: ['presiDecks', 'slides', 'presiDeckTags'], presi: ['presiDecks', 'slides', 'presiDeckTags'],
@ -180,8 +180,8 @@ describe('module-registry — pre-refactor snapshot', () => {
todoProjects: 'projects', todoProjects: 'projects',
chatTemplates: 'templates', chatTemplates: 'templates',
cardDecks: 'decks', cardDecks: 'decks',
zitareFavorites: 'favorites', quotesFavorites: 'favorites',
zitareLists: 'lists', quotesLists: 'lists',
mukkePlaylists: 'playlists', mukkePlaylists: 'playlists',
mukkeProjects: 'projects', mukkeProjects: 'projects',
storageFolders: 'folders', storageFolders: 'folders',

View file

@ -57,7 +57,7 @@ import { contactsModuleConfig } from '$lib/modules/contacts/module.config';
import { chatModuleConfig } from '$lib/modules/chat/module.config'; import { chatModuleConfig } from '$lib/modules/chat/module.config';
import { pictureModuleConfig } from '$lib/modules/picture/module.config'; import { pictureModuleConfig } from '$lib/modules/picture/module.config';
import { cardsModuleConfig } from '$lib/modules/cards/module.config'; import { cardsModuleConfig } from '$lib/modules/cards/module.config';
import { zitareModuleConfig } from '$lib/modules/zitare/module.config'; import { quotesModuleConfig } from '$lib/modules/quotes/module.config';
import { musicModuleConfig } from '$lib/modules/music/module.config'; import { musicModuleConfig } from '$lib/modules/music/module.config';
import { storageModuleConfig } from '$lib/modules/storage/module.config'; import { storageModuleConfig } from '$lib/modules/storage/module.config';
import { presiModuleConfig } from '$lib/modules/presi/module.config'; import { presiModuleConfig } from '$lib/modules/presi/module.config';
@ -108,7 +108,7 @@ export const MODULE_CONFIGS: readonly ModuleConfig[] = [
chatModuleConfig, chatModuleConfig,
pictureModuleConfig, pictureModuleConfig,
cardsModuleConfig, cardsModuleConfig,
zitareModuleConfig, quotesModuleConfig,
musicModuleConfig, musicModuleConfig,
storageModuleConfig, storageModuleConfig,
presiModuleConfig, presiModuleConfig,

View file

@ -30,7 +30,7 @@ function registerLocale(lang: SupportedLocale) {
chat, chat,
cards, cards,
picture, picture,
zitare, quotes,
memoro, memoro,
moodlit, moodlit,
storage, storage,
@ -66,7 +66,7 @@ function registerLocale(lang: SupportedLocale) {
import(`./locales/chat/${lang}.json`), import(`./locales/chat/${lang}.json`),
import(`./locales/cards/${lang}.json`), import(`./locales/cards/${lang}.json`),
import(`./locales/picture/${lang}.json`), import(`./locales/picture/${lang}.json`),
import(`./locales/zitare/${lang}.json`), import(`./locales/quotes/${lang}.json`),
import(`./locales/memoro/${lang}.json`), import(`./locales/memoro/${lang}.json`),
import(`./locales/moodlit/${lang}.json`), import(`./locales/moodlit/${lang}.json`),
import(`./locales/storage/${lang}.json`), import(`./locales/storage/${lang}.json`),
@ -104,7 +104,7 @@ function registerLocale(lang: SupportedLocale) {
chat: chat.default, chat: chat.default,
cards: cards.default, cards: cards.default,
picture: picture.default, picture: picture.default,
zitare: zitare.default, quotes: quotes.default,
memoro: memoro.default, memoro: memoro.default,
moodlit: moodlit.default, moodlit: moodlit.default,
storage: storage.default, storage: storage.default,

View file

@ -9,7 +9,7 @@
"chat": "Chat", "chat": "Chat",
"context": "Dokumente", "context": "Dokumente",
"times": "Zeiten", "times": "Zeiten",
"zitare": "Zitare", "quotes": "Zitate",
"cards": "Karten", "cards": "Karten",
"picture": "Bilder", "picture": "Bilder",
"music": "Musik", "music": "Musik",

View file

@ -9,7 +9,7 @@
"chat": "Chat", "chat": "Chat",
"context": "Documents", "context": "Documents",
"times": "Times", "times": "Times",
"zitare": "Zitare", "quotes": "Quotes",
"cards": "Cards", "cards": "Cards",
"picture": "Pictures", "picture": "Pictures",
"music": "Music", "music": "Music",

View file

@ -9,7 +9,7 @@
"chat": "Chat", "chat": "Chat",
"context": "Documentos", "context": "Documentos",
"times": "Tiempos", "times": "Tiempos",
"zitare": "Zitare", "quotes": "Quotes",
"cards": "Tarjetas", "cards": "Tarjetas",
"picture": "Imágenes", "picture": "Imágenes",
"music": "Música", "music": "Música",

View file

@ -9,7 +9,7 @@
"chat": "Chat", "chat": "Chat",
"context": "Documents", "context": "Documents",
"times": "Temps", "times": "Temps",
"zitare": "Zitare", "quotes": "Quotes",
"cards": "Cartes", "cards": "Cartes",
"picture": "Images", "picture": "Images",
"music": "Musique", "music": "Musique",

View file

@ -9,7 +9,7 @@
"chat": "Chat", "chat": "Chat",
"context": "Documenti", "context": "Documenti",
"times": "Tempi", "times": "Tempi",
"zitare": "Zitare", "quotes": "Quotes",
"cards": "Schede", "cards": "Schede",
"picture": "Immagini", "picture": "Immagini",
"music": "Musica", "music": "Musica",

View file

@ -51,7 +51,7 @@
"add_favorites": "Favoriten hinzufügen", "add_favorites": "Favoriten hinzufügen",
"view_all": "Alle anzeigen" "view_all": "Alle anzeigen"
}, },
"zitare": { "quotes": {
"title": "Inspiration", "title": "Inspiration",
"description": "Zitat des Tages", "description": "Zitat des Tages",
"empty": "Keine Favoriten", "empty": "Keine Favoriten",

View file

@ -51,7 +51,7 @@
"add_favorites": "Add favorites", "add_favorites": "Add favorites",
"view_all": "View all" "view_all": "View all"
}, },
"zitare": { "quotes": {
"title": "Inspiration", "title": "Inspiration",
"description": "Quote of the day", "description": "Quote of the day",
"empty": "No favorites", "empty": "No favorites",

View file

@ -51,7 +51,7 @@
"add_favorites": "Añadir favoritos", "add_favorites": "Añadir favoritos",
"view_all": "Ver todos" "view_all": "Ver todos"
}, },
"zitare": { "quotes": {
"title": "Inspiración", "title": "Inspiración",
"description": "Cita del día", "description": "Cita del día",
"empty": "Sin favoritos", "empty": "Sin favoritos",

View file

@ -51,7 +51,7 @@
"add_favorites": "Ajouter des favoris", "add_favorites": "Ajouter des favoris",
"view_all": "Tout voir" "view_all": "Tout voir"
}, },
"zitare": { "quotes": {
"title": "Inspiration", "title": "Inspiration",
"description": "Citation du jour", "description": "Citation du jour",
"empty": "Aucun favori", "empty": "Aucun favori",

View file

@ -51,7 +51,7 @@
"add_favorites": "Aggiungi preferiti", "add_favorites": "Aggiungi preferiti",
"view_all": "Vedi tutti" "view_all": "Vedi tutti"
}, },
"zitare": { "quotes": {
"title": "Ispirazione", "title": "Ispirazione",
"description": "Citazione del giorno", "description": "Citazione del giorno",
"empty": "Nessun preferito", "empty": "Nessun preferito",

View file

@ -2,7 +2,7 @@
"faq": { "faq": {
"what_is_mana": { "what_is_mana": {
"question": "Was ist Mana?", "question": "Was ist Mana?",
"answer": "<p><strong>Mana</strong> ist die zentrale Plattform des Mana-Ökosystems:</p><ul><li>Verwalte dein <strong>Konto</strong> und Profil an einem zentralen Ort</li><li>Greife auf alle Mana-Apps zu — Chat, Picture, Zitare, Clock und mehr</li><li>Nutze <strong>Single Sign-On (SSO)</strong>, um dich einmal anzumelden und überall eingeloggt zu sein</li><li>Erstelle und verwalte <strong>Organisationen</strong> für Teamarbeit</li></ul>", "answer": "<p><strong>Mana</strong> ist die zentrale Plattform des Mana-Ökosystems:</p><ul><li>Verwalte dein <strong>Konto</strong> und Profil an einem zentralen Ort</li><li>Greife auf alle Mana-Apps zu — Chat, Picture, Quotes, Clock und mehr</li><li>Nutze <strong>Single Sign-On (SSO)</strong>, um dich einmal anzumelden und überall eingeloggt zu sein</li><li>Erstelle und verwalte <strong>Organisationen</strong> für Teamarbeit</li></ul>",
"tags": "mana,plattform,ökosystem" "tags": "mana,plattform,ökosystem"
}, },
"sso": { "sso": {

View file

@ -2,7 +2,7 @@
"faq": { "faq": {
"what_is_mana": { "what_is_mana": {
"question": "What is Mana?", "question": "What is Mana?",
"answer": "<p><strong>Mana</strong> is the central platform of the Mana ecosystem:</p><ul><li>Manage your <strong>account</strong> and profile in one central place</li><li>Access all Mana apps — Chat, Picture, Zitare, Clock and more</li><li>Use <strong>Single Sign-On (SSO)</strong> to log in once and stay signed in everywhere</li><li>Create and manage <strong>organizations</strong> for teamwork</li></ul>", "answer": "<p><strong>Mana</strong> is the central platform of the Mana ecosystem:</p><ul><li>Manage your <strong>account</strong> and profile in one central place</li><li>Access all Mana apps — Chat, Picture, Quotes, Clock and more</li><li>Use <strong>Single Sign-On (SSO)</strong> to log in once and stay signed in everywhere</li><li>Create and manage <strong>organizations</strong> for teamwork</li></ul>",
"tags": "mana,platform,ecosystem" "tags": "mana,platform,ecosystem"
}, },
"sso": { "sso": {

View file

@ -2,7 +2,7 @@
"faq": { "faq": {
"what_is_mana": { "what_is_mana": {
"question": "Que es Mana?", "question": "Que es Mana?",
"answer": "<p><strong>Mana</strong> es la plataforma central del ecosistema Mana:</p><ul><li>Gestiona tu <strong>cuenta</strong> y perfil en un solo lugar</li><li>Accede a todas las apps de Mana: Chat, Picture, Zitare, Clock y mas</li><li>Usa <strong>Single Sign-On (SSO)</strong> para iniciar sesion una vez y estar conectado en todas partes</li><li>Crea y gestiona <strong>organizaciones</strong> para el trabajo en equipo</li></ul>", "answer": "<p><strong>Mana</strong> es la plataforma central del ecosistema Mana:</p><ul><li>Gestiona tu <strong>cuenta</strong> y perfil en un solo lugar</li><li>Accede a todas las apps de Mana: Chat, Picture, Quotes, Clock y mas</li><li>Usa <strong>Single Sign-On (SSO)</strong> para iniciar sesion una vez y estar conectado en todas partes</li><li>Crea y gestiona <strong>organizaciones</strong> para el trabajo en equipo</li></ul>",
"tags": "mana,plataforma,ecosistema" "tags": "mana,plataforma,ecosistema"
}, },
"sso": { "sso": {

View file

@ -2,7 +2,7 @@
"faq": { "faq": {
"what_is_mana": { "what_is_mana": {
"question": "Qu'est-ce que Mana ?", "question": "Qu'est-ce que Mana ?",
"answer": "<p><strong>Mana</strong> est la plateforme centrale de l'ecosysteme Mana :</p><ul><li>Gerez votre <strong>compte</strong> et votre profil depuis un seul endroit</li><li>Accedez a toutes les apps Mana — Chat, Picture, Zitare, Clock et plus encore</li><li>Utilisez le <strong>Single Sign-On (SSO)</strong> pour vous connecter une seule fois et rester connecte partout</li><li>Creez et gerez des <strong>organisations</strong> pour le travail en equipe</li></ul>", "answer": "<p><strong>Mana</strong> est la plateforme centrale de l'ecosysteme Mana :</p><ul><li>Gerez votre <strong>compte</strong> et votre profil depuis un seul endroit</li><li>Accedez a toutes les apps Mana — Chat, Picture, Quotes, Clock et plus encore</li><li>Utilisez le <strong>Single Sign-On (SSO)</strong> pour vous connecter une seule fois et rester connecte partout</li><li>Creez et gerez des <strong>organisations</strong> pour le travail en equipe</li></ul>",
"tags": "mana,plateforme,ecosysteme" "tags": "mana,plateforme,ecosysteme"
}, },
"sso": { "sso": {

View file

@ -2,7 +2,7 @@
"faq": { "faq": {
"what_is_mana": { "what_is_mana": {
"question": "Cos'e Mana?", "question": "Cos'e Mana?",
"answer": "<p><strong>Mana</strong> e la piattaforma centrale dell'ecosistema Mana:</p><ul><li>Gestisci il tuo <strong>account</strong> e il tuo profilo da un unico posto</li><li>Accedi a tutte le app Mana — Chat, Picture, Zitare, Clock e altre ancora</li><li>Usa il <strong>Single Sign-On (SSO)</strong> per accedere una volta e restare connesso ovunque</li><li>Crea e gestisci <strong>organizzazioni</strong> per il lavoro di squadra</li></ul>", "answer": "<p><strong>Mana</strong> e la piattaforma centrale dell'ecosistema Mana:</p><ul><li>Gestisci il tuo <strong>account</strong> e il tuo profilo da un unico posto</li><li>Accedi a tutte le app Mana — Chat, Picture, Quotes, Clock e altre ancora</li><li>Usa il <strong>Single Sign-On (SSO)</strong> per accedere una volta e restare connesso ovunque</li><li>Crea e gestisci <strong>organizzazioni</strong> per il lavoro di squadra</li></ul>",
"tags": "mana,piattaforma,ecosistema" "tags": "mana,piattaforma,ecosistema"
}, },
"sso": { "sso": {

View file

@ -1,6 +1,6 @@
{ {
"app": { "app": {
"name": "Zitare", "name": "Quotes",
"tagline": "Inspirierende Zitate jeden Tag" "tagline": "Inspirierende Zitate jeden Tag"
}, },
"nav": { "nav": {
@ -132,8 +132,8 @@
"fontSizeNormal": "Normal", "fontSizeNormal": "Normal",
"fontSizeLarge": "Groß", "fontSizeLarge": "Groß",
"fontSizeXLarge": "Sehr groß", "fontSizeXLarge": "Sehr groß",
"about": "Über Zitare", "about": "Über Quotes",
"aboutDescription": "Zitare bietet dir täglich inspirierende Zitate von den größten Denkern der Geschichte. Speichere deine Favoriten und erstelle eigene Listen.", "aboutDescription": "Quotes bietet dir täglich inspirierende Zitate von den größten Denkern der Geschichte. Speichere deine Favoriten und erstelle eigene Listen.",
"stats": "{quotes} Zitate · {categories} Kategorien · {languages} Sprachen" "stats": "{quotes} Zitate · {categories} Kategorien · {languages} Sprachen"
}, },
"auth": { "auth": {

View file

@ -1,6 +1,6 @@
{ {
"app": { "app": {
"name": "Zitare", "name": "Quotes",
"tagline": "Inspiring quotes every day" "tagline": "Inspiring quotes every day"
}, },
"nav": { "nav": {
@ -132,8 +132,8 @@
"fontSizeNormal": "Normal", "fontSizeNormal": "Normal",
"fontSizeLarge": "Large", "fontSizeLarge": "Large",
"fontSizeXLarge": "Extra large", "fontSizeXLarge": "Extra large",
"about": "About Zitare", "about": "About Quotes",
"aboutDescription": "Zitare offers you daily inspiring quotes from the greatest thinkers in history. Save your favorites and create your own lists.", "aboutDescription": "Quotes offers you daily inspiring quotes from the greatest thinkers in history. Save your favorites and create your own lists.",
"stats": "{quotes} quotes · {categories} categories · {languages} languages" "stats": "{quotes} quotes · {categories} categories · {languages} languages"
}, },
"auth": { "auth": {

View file

@ -1,6 +1,6 @@
{ {
"app": { "app": {
"name": "Zitare", "name": "Quotes",
"tagline": "Citas inspiradoras cada día" "tagline": "Citas inspiradoras cada día"
}, },
"nav": { "nav": {
@ -132,8 +132,8 @@
"fontSizeNormal": "Normal", "fontSizeNormal": "Normal",
"fontSizeLarge": "Grande", "fontSizeLarge": "Grande",
"fontSizeXLarge": "Muy grande", "fontSizeXLarge": "Muy grande",
"about": "Sobre Zitare", "about": "Sobre Quotes",
"aboutDescription": "Zitare te ofrece citas inspiradoras diarias de los más grandes pensadores de la historia. Guarda tus favoritas y crea tus propias listas.", "aboutDescription": "Quotes te ofrece citas inspiradoras diarias de los más grandes pensadores de la historia. Guarda tus favoritas y crea tus propias listas.",
"stats": "{quotes} citas · {categories} categorías · {languages} idiomas" "stats": "{quotes} citas · {categories} categorías · {languages} idiomas"
}, },
"auth": { "auth": {

View file

@ -1,6 +1,6 @@
{ {
"app": { "app": {
"name": "Zitare", "name": "Quotes",
"tagline": "Des citations inspirantes chaque jour" "tagline": "Des citations inspirantes chaque jour"
}, },
"nav": { "nav": {
@ -132,8 +132,8 @@
"fontSizeNormal": "Normale", "fontSizeNormal": "Normale",
"fontSizeLarge": "Grande", "fontSizeLarge": "Grande",
"fontSizeXLarge": "Très grande", "fontSizeXLarge": "Très grande",
"about": "À propos de Zitare", "about": "À propos de Quotes",
"aboutDescription": "Zitare vous propose chaque jour des citations inspirantes des plus grands penseurs de l'histoire. Sauvegardez vos favoris et créez vos propres listes.", "aboutDescription": "Quotes vous propose chaque jour des citations inspirantes des plus grands penseurs de l'histoire. Sauvegardez vos favoris et créez vos propres listes.",
"stats": "{quotes} citations · {categories} catégories · {languages} langues" "stats": "{quotes} citations · {categories} catégories · {languages} langues"
}, },
"auth": { "auth": {

View file

@ -1,6 +1,6 @@
{ {
"app": { "app": {
"name": "Zitare", "name": "Quotes",
"tagline": "Citazioni ispiratrici ogni giorno" "tagline": "Citazioni ispiratrici ogni giorno"
}, },
"nav": { "nav": {
@ -132,8 +132,8 @@
"fontSizeNormal": "Normale", "fontSizeNormal": "Normale",
"fontSizeLarge": "Grande", "fontSizeLarge": "Grande",
"fontSizeXLarge": "Molto grande", "fontSizeXLarge": "Molto grande",
"about": "Informazioni su Zitare", "about": "Informazioni su Quotes",
"aboutDescription": "Zitare ti offre ogni giorno citazioni ispiratrici dei più grandi pensatori della storia. Salva i tuoi preferiti e crea le tue liste.", "aboutDescription": "Quotes ti offre ogni giorno citazioni ispiratrici dei più grandi pensatori della storia. Salva i tuoi preferiti e crea le tue liste.",
"stats": "{quotes} citazioni · {categories} categorie · {languages} lingue" "stats": "{quotes} citazioni · {categories} categorie · {languages} lingue"
}, },
"auth": { "auth": {

View file

@ -1,21 +1,21 @@
<script lang="ts"> <script lang="ts">
/** /**
* QuoteOfTheDayWidget — Zufälliges Tageszitat aus Zitare-Favoriten. * QuoteOfTheDayWidget — Zufälliges Tageszitat aus Quotes-Favoriten.
* *
* Liest direkt aus der unified IndexedDB (zitareFavorites table). * Liest direkt aus der unified IndexedDB (quotesFavorites table).
* Zeigt eine zufällige Favoriten-ID — das vollständige Zitat stammt * Zeigt eine zufällige Favoriten-ID — das vollständige Zitat stammt
* aus dem eingebetteten Zitate-Katalog von Zitare. * aus dem eingebetteten Zitate-Katalog von Quotes.
*/ */
import { liveQuery } from 'dexie'; import { liveQuery } from 'dexie';
import { db } from '$lib/data/database'; import { db } from '$lib/data/database';
import type { BaseRecord } from '@mana/local-store'; import type { BaseRecord } from '@mana/local-store';
interface ZitareFavorite extends BaseRecord { interface QuotesFavorite extends BaseRecord {
quoteId: string; quoteId: string;
} }
let favorite: ZitareFavorite | null = $state(null); let favorite: QuotesFavorite | null = $state(null);
let totalFavorites = $state(0); let totalFavorites = $state(0);
let loading = $state(true); let loading = $state(true);
@ -33,7 +33,7 @@
$effect(() => { $effect(() => {
const sub = liveQuery(async () => { const sub = liveQuery(async () => {
const all = await db.table<ZitareFavorite>('zitareFavorites').toArray(); const all = await db.table<QuotesFavorite>('quotesFavorites').toArray();
return all.filter((f) => !f.deletedAt); return all.filter((f) => !f.deletedAt);
}).subscribe({ }).subscribe({
next: (val) => { next: (val) => {
@ -66,14 +66,14 @@
<div class="mb-2 text-3xl">&#128161;</div> <div class="mb-2 text-3xl">&#128161;</div>
<p class="text-sm text-muted-foreground">Noch keine Lieblingszitate gespeichert.</p> <p class="text-sm text-muted-foreground">Noch keine Lieblingszitate gespeichert.</p>
<a <a
href="/zitare" href="/quotes"
class="mt-3 inline-block rounded-lg bg-primary/10 px-4 py-2 text-sm font-medium text-primary hover:bg-primary/20" class="mt-3 inline-block rounded-lg bg-primary/10 px-4 py-2 text-sm font-medium text-primary hover:bg-primary/20"
> >
Zitate entdecken Zitate entdecken
</a> </a>
</div> </div>
{:else} {:else}
<a href="/zitare" class="block rounded-lg p-3 transition-colors hover:bg-surface-hover"> <a href="/quotes" class="block rounded-lg p-3 transition-colors hover:bg-surface-hover">
<p class="mb-2 text-sm italic text-foreground/80"> <p class="mb-2 text-sm italic text-foreground/80">
Favorit #{favorite.quoteId} Favorit #{favorite.quoteId}
</p> </p>

View file

@ -1,5 +1,5 @@
<!-- <!--
Zitare — Workbench ListView Quotes — Workbench ListView
Shows one quote at a time. Tap to cycle. Fav button inline. Shows one quote at a time. Tap to cycle. Fav button inline.
Supports tag drag-and-drop onto the current quote. Supports tag drag-and-drop onto the current quote.
--> -->
@ -7,16 +7,16 @@
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { liveQuery } from 'dexie'; import { liveQuery } from 'dexie';
import { db } from '$lib/data/database'; import { db } from '$lib/data/database';
import { quotesStore } from '$lib/modules/zitare/stores/quotes.svelte'; import { quotesStore } from '$lib/modules/quotes/stores/quotes.svelte';
import { favoritesStore } from '$lib/modules/zitare/stores/favorites.svelte'; import { favoritesStore } from '$lib/modules/quotes/stores/favorites.svelte';
import { isFavorite as checkIsFavorite, type Favorite } from '$lib/modules/zitare/queries'; import { isFavorite as checkIsFavorite, type Favorite } from '$lib/modules/quotes/queries';
import { Heart } from '@mana/shared-icons'; import { Heart } from '@mana/shared-icons';
import { dropTarget } from '@mana/shared-ui/dnd'; import { dropTarget } from '@mana/shared-ui/dnd';
import type { TagDragData } from '@mana/shared-ui/dnd'; import type { TagDragData } from '@mana/shared-ui/dnd';
import { useAllTags, getTagsByIds } from '@mana/shared-stores'; import { useAllTags, getTagsByIds } from '@mana/shared-stores';
import type { ViewProps } from '$lib/app-registry'; import type { ViewProps } from '$lib/app-registry';
import type { LocalFavorite } from './types'; import type { LocalFavorite } from './types';
import type { Quote } from '@zitare/content'; import type { Quote } from '@quotes/content';
let { navigate, goBack, params }: ViewProps = $props(); let { navigate, goBack, params }: ViewProps = $props();
@ -39,7 +39,7 @@
$effect(() => { $effect(() => {
const sub = liveQuery(async () => { const sub = liveQuery(async () => {
return db return db
.table<LocalFavorite>('zitareFavorites') .table<LocalFavorite>('quotesFavorites')
.toArray() .toArray()
.then((all) => all.filter((f) => !f.deletedAt)); .then((all) => all.filter((f) => !f.deletedAt));
}).subscribe((val) => { }).subscribe((val) => {
@ -83,13 +83,13 @@
if (!fav) { if (!fav) {
await favoritesStore.add(quote.id); await favoritesStore.add(quote.id);
// Re-fetch to get the new favorite // Re-fetch to get the new favorite
const all = await db.table<LocalFavorite>('zitareFavorites').toArray(); const all = await db.table<LocalFavorite>('quotesFavorites').toArray();
fav = all.find((f) => f.quoteId === quote!.id && !f.deletedAt); fav = all.find((f) => f.quoteId === quote!.id && !f.deletedAt);
if (!fav) return; if (!fav) return;
} }
const current = fav.tagIds ?? []; const current = fav.tagIds ?? [];
if (!current.includes(tagData.id)) { if (!current.includes(tagData.id)) {
await db.table('zitareFavorites').update(fav.id, { await db.table('quotesFavorites').update(fav.id, {
tagIds: [...current, tagData.id], tagIds: [...current, tagData.id],
updatedAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
}); });

View file

@ -1,5 +1,5 @@
/** /**
* Zitare module collection accessors and guest seed data. * Quotes module collection accessors and guest seed data.
*/ */
import { db } from '$lib/data/database'; import { db } from '$lib/data/database';
@ -7,21 +7,21 @@ import type { LocalFavorite, LocalQuoteList, LocalCustomQuote } from './types';
// ─── Collection Accessors ────────────────────────────────── // ─── Collection Accessors ──────────────────────────────────
export const favoriteTable = db.table<LocalFavorite>('zitareFavorites'); export const favoriteTable = db.table<LocalFavorite>('quotesFavorites');
export const listTable = db.table<LocalQuoteList>('zitareLists'); export const listTable = db.table<LocalQuoteList>('quotesLists');
export const customQuoteTable = db.table<LocalCustomQuote>('zitareCustomQuotes'); export const customQuoteTable = db.table<LocalCustomQuote>('customQuotes');
// ─── Guest Seed ──────────────────────────────────────────── // ─── Guest Seed ────────────────────────────────────────────
export const ZITARE_GUEST_SEED = { export const QUOTES_GUEST_SEED = {
zitareFavorites: [ quotesFavorites: [
{ id: 'fav-1', quoteId: 'mot-1' }, { id: 'fav-1', quoteId: 'mot-1' },
{ id: 'fav-2', quoteId: 'weis-3' }, { id: 'fav-2', quoteId: 'weis-3' },
{ id: 'fav-3', quoteId: 'mot-7' }, { id: 'fav-3', quoteId: 'mot-7' },
{ id: 'fav-4', quoteId: 'weis-1' }, { id: 'fav-4', quoteId: 'weis-1' },
{ id: 'fav-5', quoteId: 'liebe-1' }, { id: 'fav-5', quoteId: 'liebe-1' },
], ],
zitareLists: [ quotesLists: [
{ {
id: 'list-motivation', id: 'list-motivation',
name: 'Motivation & Antrieb', name: 'Motivation & Antrieb',

Some files were not shown because too many files have changed in this diff Show more