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`
- ✅ `picture/apps/web`
- ✅ `zitare/apps/web`
- ✅ `quotes/apps/web`
- ✅ `contacts/apps/web`
- ✅ `calendar/apps/web`
- ✅ `clock/apps/web`

View file

@ -14,7 +14,7 @@
| # | App | Collections | Stores umgeschrieben? |
| --- | --------------- | ---------------------------------------------------- | ------------------------------------------------------------ |
| 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) |
| 4 | Clock | alarms, timers, worldClocks | 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 |
|---|---|---|
| **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 |
| **Clock** | alarms, timers, worldClocks | Nur Sync |
| **Cards** | decks, cards | Spaced Repetition, LLM |

View file

@ -16,7 +16,7 @@
| # | App | Modul | Routen | Status |
|---|-----|-------|--------|--------|
| 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** |
| 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** |
@ -97,7 +97,7 @@ Alle Apps die zum ManaCore-Ökosystem gehören und von Shared IndexedDB, Dashboa
| **chat** | AI-Chat, Cross-App-Referenzen |
| **picture** | AI-Bilder, Cross-App-Referenzen |
| **cards** | Lernkarten, Cross-App-Links |
| **zitare** | Zitate, Dashboard-Widget |
| **quotes** | Zitate, Dashboard-Widget |
| **clock** | Uhren/Timer, Dashboard-Widget |
| **mukke** | Musik, eigenständig aber profitiert von shared Auth |
| **storage** | Cloud-Dateien, Cross-App-Referenzen |
@ -247,7 +247,7 @@ src/lib/modules/
├── chat/
├── picture/
├── cards/
├── zitare/
├── quotes/
├── clock/
├── mukke/
├── storage/
@ -330,7 +330,7 @@ src/routes/
│ │ ├── deck/[id]/+page.svelte
│ │ └── study/[id]/+page.svelte
│ │
│ ├── zitare/
│ ├── quotes/
│ │ ├── +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 { PICTURE_COLLECTIONS } from '$lib/modules/picture/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 { MUKKE_COLLECTIONS } from '$lib/modules/mukke/collections';
import { STORAGE_COLLECTIONS } from '$lib/modules/storage/collections';
@ -509,7 +509,7 @@ db.version(1).stores({
// ... alle weiteren
...PICTURE_COLLECTIONS,
...CARDS_COLLECTIONS,
...ZITARE_COLLECTIONS,
...QUOTES_COLLECTIONS,
...CLOCK_COLLECTIONS,
...MUKKE_COLLECTIONS,
...STORAGE_COLLECTIONS,
@ -566,7 +566,7 @@ export const SYNC_APP_MAP: Record<string, string[]> = {
chat: ['conversations', 'messages', 'templates'],
picture: ['images', 'boards', 'boardItems', 'tags', 'imageTags'],
cards: ['decks', 'cards'],
zitare: ['favorites', 'lists'],
quotes: ['favorites', 'lists'],
clock: ['alarms', 'timers', 'worldClocks'],
mukke: ['songs', 'playlists', 'playlistSongs', 'mProjects', 'markers'],
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 |
|---|-----|--------|-----------|-----------|-------|
| 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 |
| 4 | **skilltree** | 5 | 6 | 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
# ============================================
# ZITARE PROJECT
# QUOTES PROJECT
# ============================================
ZITARE_BACKEND_PORT=3007
ZITARE_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
QUOTES_BACKEND_PORT=3007
QUOTES_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
# ============================================
# ZITARE TELEGRAM BOT
# QUOTES TELEGRAM BOT
# ============================================
ZITARE_BOT_PORT=3303
ZITARE_BOT_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
ZITARE_BOT_TELEGRAM_TOKEN=8489424174:AAHHG_mlLVeu6xAWY6U2ZGXO0D8JKWnqBvg
QUOTES_BOT_PORT=3303
QUOTES_BOT_DATABASE_URL=postgresql://mana:devpassword@localhost:5432/mana_platform
QUOTES_BOT_TELEGRAM_TOKEN=8489424174:AAHHG_mlLVeu6xAWY6U2ZGXO0D8JKWnqBvg
# ============================================
# TODO TELEGRAM BOT

View file

@ -367,7 +367,7 @@ jobs:
echo "skilltree-web=false" >> $GITHUB_OUTPUT
fi
# zitare-backend: REMOVED — migrated to local-first
# quotes-backend: REMOVED — migrated to local-first
# Check if any service needs building
if grep -q "=true" $GITHUB_OUTPUT; then
@ -410,7 +410,7 @@ jobs:
echo "| food-web | ${{ steps.changes.outputs.food-web }} |" >> $GITHUB_STEP_SUMMARY
echo "| skilltree-backend | removed |" >> $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
@ -1263,4 +1263,4 @@ jobs:
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-media: covers Hono + Bun with Sharp/BullMQ
# - 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
# - todo-backend: covers app backend pattern
# ===========================================
@ -114,8 +114,8 @@ jobs:
- service: todo-web
dockerfile: apps/todo/apps/web/Dockerfile
context: .
- service: zitare-web
dockerfile: apps/zitare/apps/web/Dockerfile
- service: quotes-web
dockerfile: apps/quotes/apps/web/Dockerfile
context: .
- service: calendar-web
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/MANA_CORE_INTEGRATION_CHECKLIST.md
apps/picture/DEPLOYMENT_COMPLETE.md
apps/zitare/apps/web/THEMING.md
apps/quotes/apps/web/THEMING.md
BACKEND_DESIGN_PATTERN_AUDIT.md
COMPATIBILITY_MATRIX_AND_REMEDIATION.md
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 |
| **picture** | AI image generation | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| **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 |
| **plants** | Plant care tracker | 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:**
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
```
Root turbo → finds "build" script in apps/zitare/package.json
→ runs "turbo run build" in zitare
Root turbo → finds "build" script in apps/quotes/package.json
→ runs "turbo run build" in quotes
→ finds "build" script again
→ runs "turbo run build" again
→ (infinite loop!)
@ -49,7 +49,7 @@ Root turbo → finds "build" script in apps/zitare/package.json
### ❌ WRONG - Causes Infinite Recursion
```json
// apps/zitare/package.json - DON'T DO THIS!
// apps/quotes/package.json - DON'T DO THIS!
{
"scripts": {
"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
```json
// apps/zitare/package.json - CORRECT
// apps/quotes/package.json - CORRECT
{
"scripts": {
"dev": "turbo run dev", // ✅ OK for dev (persistent task, scoped)
// No build, lint, type-check scripts - handled by root turbo
"db:push": "pnpm --filter @zitare/backend db:push", // ✅ OK
"db:studio": "pnpm --filter @zitare/backend db:studio" // ✅ OK
"db:push": "pnpm --filter @quotes/backend db:push", // ✅ 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:
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
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:
- `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`)
**Do NOT add turbo scripts here!**
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`)
---
@ -163,7 +163,7 @@ pnpm run build 2>&1 | tee build.log
grep -A10 "error during build" build.log
# Build specific package to isolate issue
pnpm --filter @zitare/backend build
pnpm --filter @quotes/backend build
```
### 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` |
| Chat | `http://localhost:3002` | `https://chat-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
@ -148,4 +148,4 @@ Select a service from the sidebar to view its API documentation:
- **Auth API** - Authentication and user management
- **Chat API** - Conversations and AI completions
- **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 |
| Picture | `@mana/shared-nestjs-auth` | 3006 |
| Zitare | `@mana/shared-nestjs-auth` | 3007 |
| Quotes | `@mana/shared-nestjs-auth` | 3007 |
| Cards | `@mana-core/nestjs-integration` | 3009 |
| 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 |
| chat-backend | 3002 | Chat API |
| picture-backend | 3006 | Image generation |
| zitare-backend | 3007 | Quotes API |
| quotes-backend | 3007 | Quotes API |
| cards-backend | 3009 | Card management |
| contacts-backend | 3015 | Contacts 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 |
| Mana | `@mana/landing` | `mana-landing` | 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 |
## Quick Deploy

View file

@ -52,7 +52,7 @@ Mana uses multiple deployment strategies depending on the application type.
┌─────────────────────────────────────────────────────────────┐
│ Mac Mini Server │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ mana-core- │ │ chat- │ │ zitare- │ ... │
│ │ mana-core- │ │ chat- │ │ quotes- │ ... │
│ │ auth:3001 │ │ backend:3002│ │ backend:3007│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │
@ -72,7 +72,7 @@ Mana uses multiple deployment strategies depending on the application type.
# Deploy individual landing page
pnpm deploy:landing:chat
pnpm deploy:landing:picture
pnpm deploy:landing:zitare
pnpm deploy:landing:quotes
# Deploy all landing pages
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 |
| chat | chat | 3002 |
| zitare | zitare | 3007 |
| quotes | quotes | 3007 |
| contacts | contacts | 3015 |
| 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) |
| `REPLICATE_API_KEY` | Replicate AI key |
</TabItem>
<TabItem label="Zitare">
<TabItem label="Quotes">
| Variable | Description |
|----------|-------------|
| `ZITARE_BACKEND_PORT` | Backend port (3007) |
| `ZITARE_DATABASE_URL` | PostgreSQL connection |
| `QUOTES_BACKEND_PORT` | Backend port (3007) |
| `QUOTES_DATABASE_URL` | PostgreSQL connection |
</TabItem>
</Tabs>

View file

@ -15,7 +15,7 @@ For any project with a backend, use the `dev:*:full` command:
```bash
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
```
@ -30,7 +30,7 @@ These commands automatically:
| Command | Database | Backend Port | Web Port |
|---------|----------|--------------|----------|
| `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:calendar:full` | calendar | 3014 | 5179 |
| `pnpm dev:clock:full` | clock | 3017 | 5187 |
@ -64,7 +64,7 @@ Before running any `dev:*:full` command:
```bash
pnpm setup:db:auth # Setup mana-core-auth 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:calendar # Setup calendar 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:
- 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
### 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 |
| **Picture** | AI image generation | Stable |
| **Zitare** | Daily inspiration quotes | Stable |
| **Quotes** | Daily inspiration quotes | Stable |
| **Cards** | Card/deck management | Beta |
| **Contacts** | Contact management | Beta |
| **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
- packages/ Chat-specific packages
- picture/
- zitare/
- quotes/
- contacts/
- calendar/
- ...

View file

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

View file

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

View file

@ -28,12 +28,12 @@ Mana contains multiple interconnected applications, each serving a specific purp
[View Details](/projects/picture)
</Card>
<Card title="Zitare" icon="quote">
<Card title="Quotes" icon="quote">
Daily inspiration quotes
**Stack**: NestJS, SvelteKit, Expo
[View Details](/projects/zitare)
[View Details](/projects/quotes)
</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 |
| Picture | 3006 | 5175 | Yes | Stable |
| Zitare | 3007 | 5177 | Yes | Stable |
| Quotes | 3007 | 5177 | Yes | Stable |
| Cards | 3009 | 5178 | Yes | Beta |
| Contacts | 3015 | 5184 | No | Beta |
| 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
pnpm dev:chat:full
pnpm dev:picture:full
pnpm dev:zitare:full
pnpm dev:quotes:full
pnpm dev:contacts:full
pnpm dev:calendar:full
```

View file

@ -11,7 +11,7 @@ const ecosystemApps = [
{ label: 'Calendar', href: 'https://calendar.mana.how', status: 'beta' },
{ label: 'Contacts', href: 'https://contacts.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: 'Arcade', href: 'https://arcade.mana.how', status: 'beta' },
// Alpha tier (accessible to alpha testers and above)

View file

@ -1,6 +1,6 @@
---
title: Zitare
description: Intelligente Zitatverwaltung und Literaturrecherche für akademisches Arbeiten. Zitare revolutioniert wissenschaftliches Schreiben mit KI-gestützter Quellensuche und automatischer Formatierung.
title: Quotes
description: Intelligente Zitatverwaltung und Literaturrecherche für akademisches Arbeiten. Quotes revolutioniert wissenschaftliches Schreiben mit KI-gestützter Quellensuche und automatischer Formatierung.
category: productivity
icon: 📚
manaUsage:
@ -20,12 +20,12 @@ features:
status: available
releaseDate: 15.03.2024
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
@ -117,7 +117,7 @@ Der Mana-Verbrauch richtet sich nach der genutzten Funktion:
## Unterstützte Zitierstile
Zitare unterstützt alle gängigen Zitierstile:
Quotes unterstützt alle gängigen Zitierstile:
- **APA** (American Psychological 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
Zitare ist verfügbar als:
Quotes ist verfügbar als:
- **Web-App** (alle Browser)
- **Desktop-App** (Windows, Mac, Linux)
@ -179,7 +179,7 @@ Zitare ist verfügbar als:
## Vergleich zu Konkurrenz
| Feature | Zitare | Zotero | Mendeley | EndNote |
| Feature | Quotes | Zotero | Mendeley | EndNote |
| -------------------- | ------ | ------ | -------- | ------- |
| KI-Zusammenfassungen | ✅ | ❌ | ❌ | ❌ |
| Flexible Abrechnung | ✅ | ✅ | ❌ | ❌ |
@ -190,7 +190,7 @@ Zitare ist verfügbar als:
## Kostenlos starten
Die Basis-Funktionen von Zitare sind komplett kostenlos:
Die Basis-Funktionen von Quotes sind komplett kostenlos:
- Unbegrenzte Quellen speichern
- 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 |
| Calendar Bot | mana-matrix-calendar-bot | 3315 | Termine |
| 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 |
| TTS Bot | mana-matrix-tts-bot | 3033 | Text-to-Speech |
@ -260,7 +260,7 @@ api-gateway:
Viele Matrix-Bots teilen ähnlichen Code:
- `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
### 5. Volume-Fragmentierung
@ -275,7 +275,7 @@ volumes:
matrix_calendar_bot_data:
matrix_todo_bot_data:
matrix_food_bot_data:
matrix_zitare_bot_data:
matrix_quotes_bot_data:
matrix_clock_bot_data:
matrix_tts_bot_data:
```
@ -401,7 +401,7 @@ AKTUELL: 10 separate Bot-Container
│ matrix-mana-bot │ matrix-ollama-bot │ ... │
│ matrix-stats-bot │ matrix-project-doc │ │
│ matrix-todo-bot │ matrix-calendar-bot │ │
│ matrix-food-bot │ matrix-zitare-bot │ │
│ matrix-food-bot │ matrix-quotes-bot │ │
│ matrix-clock-bot │ matrix-tts-bot │ │
└────────────────────────────────────────────────────────────┘

View file

@ -136,7 +136,7 @@ export class AppModule {}
- todo-backend (Port 3004)
- clock-backend (Port 3005)
- picture-backend (Port 3006)
- zitare-backend (Port 3007)
- quotes-backend (Port 3007)
- presi-backend (Port 3008)
- cards-backend (Port 3009)
- contacts-backend (Port 3010)
@ -292,7 +292,7 @@ export async function GET() {
### Betroffene Apps
- calendar-web, clock-web, contacts-web
- chat-web, picture-web, zitare-web
- chat-web, picture-web, quotes-web
- todo-web, cards-web, manacore-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
- **@manacore/bot-services** - Shared Business Logic Package
- **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
- **VictoriaMetrics** - Monitoring Upgrade mit DuckDB Analytics
- **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.
### matrix-zitare-bot
### matrix-quotes-bot
Tägliche Inspirations-Zitate:
@ -571,7 +571,7 @@ apps/calendar/apps/web/src/lib/services/
| matrix-mana-bot | 3310 | NestJS | Gateway Bot |
| matrix-todo-bot | 3315 | NestJS | Todo 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 |
---
@ -585,12 +585,12 @@ apps/calendar/apps/web/src/lib/services/
| Matrix Client | 1 | Phase 2 Features |
| mana-search | 3 | SearXNG, Extraction, Cache |
| 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 |
| App Cleanup | 8 | Demo Mode, Feature Removal |
| Monitoring | 2 | VictoriaMetrics, DuckDB |
| Food | 2 | Tests, Production Ready |
| Telegram Bots | 1 | Food, Todo, Zitare |
| Telegram Bots | 1 | Food, Todo, Quotes |
| Bugfixes | 15+ | Auth, Matrix, Docker |
| Documentation | 5 | Monitoring, Services, DevLogs |

View file

@ -217,7 +217,7 @@ Zentraler Notification-Service für Email, Push, Matrix und Webhooks.
```
┌─────────────────────────────────────────────────────────────────────┐
│ 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):**
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
@ -514,7 +514,7 @@ await app.listen(process.env.PORT || 3002);
```
**Migrierte Backends (8):**
chat, calendar, contacts, zitare, clock, planta, presi, food
chat, calendar, contacts, quotes, clock, planta, presi, food
### @manacore/shared-tsconfig

View file

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

View file

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

View file

@ -98,7 +98,7 @@ Single Sign-On über alle ManaCore Web Apps.
| SkillTree | skilltree.mana.how | ✅ |
| Storage | storage.mana.how | ✅ |
| Todo | todo.mana.how | ✅ |
| Zitare | zitare.mana.how | ✅ |
| Quotes | quotes.mana.how | ✅ |
| Manalink | manalink.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-food-bot | Health | Ernährungs-Tracking |
| 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-planta-bot | Lifestyle | Pflanzenpflege |
| matrix-cards-bot | Learning | Lernkarten |

View file

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

View file

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

View file

@ -56,7 +56,7 @@ User loggt sich in Calendar ein → ✓
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
@ -112,7 +112,7 @@ const APPS_WITH_SSO = [
'storage',
'todo',
'traces',
'zitare',
'quotes',
];
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 |
| Storage | 3035 | #17 |
| Todo | 3031 | #3 |
| Zitare | 3007 | #8 |
| Quotes | 3007 | #8 |
### Grafana Dashboard
@ -302,7 +302,7 @@ Alle 20 aktiven Apps wurden bewertet nach 8 Kategorien (Backend, Frontend, Datab
| **Matrix** | 68 | Production | E2E Encryption |
| **Food** | 63 | Beta | Gemini AI 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) |
| **Clock** | 58 | Beta | Kein CLAUDE.md, keine Tests |
| **Skilltree** | 58 | Beta | Offline-first PWA |

View file

@ -203,7 +203,7 @@ export const handleError: HandleClientError = ({ error }) => {
| 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

View file

@ -59,7 +59,7 @@ Das bestehende `ContextMenu`-Component aus `@manacore/shared-ui` wurde systemati
| **Cards** | Deck-Karten | Öffnen, Löschen | `28286d12` |
| **Photos** | PhotoGrid | Anzeigen, Favorit toggle, 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` |
| **Chat** | ConversationList | Umbenennen, Archivieren, 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:
- `@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
- `@food/backend` — Ernährungs-Analyse (Gemini)
- `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
- **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
- **Massive Cleanup** - 50+ Legacy-Dateien gelöscht, Hetzner-Artefakte entfernt, API-Keys bereinigt
- **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 |
| 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:
@ -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 |
| 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 |
| Cleanup | 7 | 50+ Dateien gelöscht, Hetzner weg, API-Keys bereinigt |
| 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
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

View file

@ -82,7 +82,7 @@ Help-Pages in 10+ bisher fehlende Apps nachgezogen, verbesserte Inhalte für all
- `dd5c0d50` — Calendar, Todo Help
- `f0233b8d` — Storage, Chat, Picture Help
- `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`)
- Fehlende prom-client Dependency in 4 Backends (`422b4f9f`)
- 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

View file

@ -1,6 +1,6 @@
---
title: 'Storage-Sprint, Passkeys & 2FA, Cross-App Tags, Zitare-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.'
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, Quotes-Komplett-Polish, SvelteKit Base-Image, und Local-First Architekturplanung.'
date: 2026-03-26
author: 'Till Schneider'
category: 'feature'
@ -11,7 +11,7 @@ tags:
'passkeys',
'2fa',
'tags',
'zitare',
'quotes',
'infrastructure',
'docker',
'local-first',
@ -35,12 +35,12 @@ workingHours:
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
- **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
- **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
- **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:
@ -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
- `2b0b902b` — Credit-Operations Package Exports auf compiled `dist/` zeigend
- `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 |
| **Auth** | Passkeys + TOTP-2FA in allen Apps, Social Login entfernt, 35+ 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 |
| **Infra** | SvelteKit Base-Image, build-app.sh, Dockerfile-Fixes |
| **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-calendar-bot | Kalender | 4015 |
| 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-tts-bot | Text-to-Speech | 4019 |
| 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
│ ├── clock/ # !timer, !stop, !alarm, !zeit
│ ├── contacts/ # !kontakte, !suche, !favoriten, !edit
│ ├── zitare/ # !zitat, !suche, !kategorie, !favoriten
│ ├── quotes/ # !zitat, !suche, !kategorie, !favoriten
│ ├── planta/ # !pflanzen, !giessen, !fällig, !historie
│ ├── ollama/ # AI Chat, !models, !all, !mode
│ ├── 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 |
| **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 |
| **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 |
| **ollama** | AI Chat, !models, !model, !clear, !all, !mode | Chat history, System prompts, Model comparison |
| **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
- 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

View file

@ -275,7 +275,7 @@ Drei Komponenten die über viele Apps hinweg dupliziert waren:
| 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` |
| `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 |
| -------------- | ------------------------------------------------------------ |
| 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 |
| Landings Nginx | `mkdir snippets` vor Copy, status.mana.how vhost hinzugefügt |
| Prerender 404 | favicon.png 404s bei skilltree + food unterdrückt |
@ -347,5 +347,5 @@ Drei neue Planungs-/Guidelines-Dokumente:
- Memoro Production-Deploy + DNS
- 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

View file

@ -139,7 +139,7 @@ spotlight.registerActions('todo', [
### 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
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 |
| Race in status-page-gen | Lock-File während Generation |
| 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 |
| AppDrawer → new tab | Apps öffnen sich extern statt innerhalb der App |
| `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))
- 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)
- App-Switcher (AppSlider) für Multi-App Navigation
- 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)
- Calendar 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:**

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'
date: 2026-03-19
app: 'zitare'
app: 'quotes'
author: 'Till Schneider'
tags: ['audit', 'zitare', 'production-readiness']
tags: ['audit', 'quotes', 'production-readiness']
score: 62
scores:
backend: 72
@ -45,7 +45,7 @@ stats:
## 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)
@ -102,7 +102,7 @@ Zitare ist die **einzige App neben Calendar die produktiv deployed** ist (zitare
**Stärken:**
- **Produktiv deployed** auf zitare.mana.how
- **Produktiv deployed** auf quotes.mana.how
- Multi-Stage Dockerfiles (Backend + Web)
- Health Checks (30s Interval, 3 Retries)
- 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)
**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)

View file

@ -55,7 +55,7 @@ Die Architektur-Migration hat alle Apps gleichzeitig verbessert:
| **Contacts** | 78 | 87 | +9 | Local-First + vCard Import Server |
| **Picture** | 76 | 85 | +9 | Local-First + Replicate 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 |
| **Storage** | 72 | 82 | +10 | Local-First + S3 Server |
| **Food** | 70 | 82 | +12 | Local-First + Gemini Server |

View file

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

View file

@ -70,7 +70,7 @@ export const ui = {
'app.maerchenzauber.description': 'Erstelle magische Kindergeschichten mit KI-Unterstützung',
'app.moodlit.description':
'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',
'app.cards.description':
'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',
'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.zitare.description':
'app.quotes.description':
'Intelligent citation management and literature research for academic work',
'app.cards.description':
'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',
'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.zitare.description':
'app.quotes.description':
'Gestione intelligente delle citazioni e ricerca bibliografica per lavoro accademico',
'app.cards.description':
'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",
'app.moodlit.description':
'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',
'app.cards.description':
"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',
'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.zitare.description':
'app.quotes.description':
'Gestión inteligente de citas e investigación bibliográfica para trabajo académico',
'app.cards.description':
'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: [
{ 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: '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',
},
{
name: 'Zitare',
descriptionKey: 'app.zitare.description',
name: 'Quotes',
descriptionKey: 'app.quotes.description',
logo: '📚',
categoryKey: 'app.category.research',
color: 'from-emerald-500 to-teal-500',
href: '/apps/zitare',
href: '/apps/quotes',
},
{
name: 'Cards',

View file

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

View file

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

View file

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

View file

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

View file

@ -34,11 +34,11 @@ const MANA_APPS: AppInfo[] = [
link_web: 'https://picture.mana.how',
},
{
id: 'zitare',
name: 'Zitare',
id: 'quotes',
name: 'Quotes',
description: 'Tägliche Inspirationszitate',
icon: 'quote-left',
link_web: 'https://zitare.mana.how',
link_web: 'https://quotes.mana.how',
},
{
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/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/local-llm ./packages/local-llm
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
# Build dependencies that need compilation
WORKDIR /app/apps/zitare/packages/content
WORKDIR /app/apps/quotes/packages/content
RUN pnpm build
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,
* 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.
*/
@ -54,7 +54,7 @@ const APP_SUBDOMAINS = new Set([
'chat',
'calendar',
'contacts',
'zitare',
'quotes',
'skilltree',
'plants',
'cards',

View file

@ -2,7 +2,7 @@
* API Services barrel.
*
* 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
* module now reads/writes the unified Dexie database via the local-first
* sync layer (`mana-sync`), and `qr-export` queries Dexie directly.

View file

@ -552,13 +552,13 @@ registerApp({
});
registerApp({
id: 'zitare',
name: 'Zitare',
id: 'quotes',
name: 'Quotes',
color: '#EC4899',
icon: Quotes,
views: {
list: { load: () => import('$lib/modules/zitare/ListView.svelte') },
detail: { load: () => import('$lib/modules/zitare/views/DetailView.svelte') },
list: { load: () => import('$lib/modules/quotes/ListView.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',
skilltree: 'creative',
guides: 'creative',
zitare: 'creative',
quotes: 'creative',
uload: 'creative',
playground: 'creative',

View file

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

View file

@ -1,6 +1,6 @@
<script lang="ts">
/**
* ZitareQuoteWidget - Random favorite quote (local-first)
* QuotesQuoteWidget - Random favorite quote (local-first)
*/
import { _ } from 'svelte-i18n';
@ -13,7 +13,7 @@
<div class="mb-3">
<h3 class="flex items-center gap-2 text-lg font-semibold">
<span>💡</span>
{$_('dashboard.widgets.zitare.title')}
{$_('dashboard.widgets.quotes.title')}
</h3>
</div>
@ -22,16 +22,16 @@
{:else if !favorite.value}
<div class="py-6 text-center">
<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
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"
>
Zitate entdecken
</a>
</div>
{: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">
Favorit #{favorite.value.quoteId}
</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' },
// 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' },
clock: { x: 880, y: 680, lakeId: 'db-center' },
food: { x: 650, y: 720, lakeId: 'db-center' },

View file

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

View file

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

View file

@ -29,7 +29,7 @@
redis: 'Schneller Cache-Speicher. Klein, kristallklar, sofort verfugbar.',
minio: 'Objekt-Speicher fur Dateien, Bilder und Medien aller Apps.',
'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.',
};

View file

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

View file

@ -423,9 +423,9 @@ export const appConfigs: Record<string, AppConfig> = {
// ============================================
// clock: consolidated into times
zitare: {
name: 'zitare',
displayName: 'Zitare',
quotes: {
name: 'quotes',
displayName: 'Quotes',
tagline: 'Tägliche Inspiration',
description: 'Entdecke inspirierende Zitate und Weisheiten für jeden Tag.',
logoEmoji: '💡',
@ -458,7 +458,7 @@ export const appConfigs: Record<string, AppConfig> = {
},
],
dashboardRoute: '/',
website: 'https://zitare.mana.how',
website: 'https://quotes.mana.how',
},
storage: {
@ -584,7 +584,7 @@ export const defaultManaConfig: AppConfig = {
},
{
icon: '💡',
title: 'Zitare',
title: 'Quotes',
description: 'Tägliche Inspiration',
color: '#F59E0B',
},
@ -631,6 +631,6 @@ export function getAppsByCategory(): {
appConfigs.contacts,
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 { LocalContact } from '$lib/modules/contacts/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 { LocalAlarm, LocalCountdownTimer } from '$lib/modules/times/types';
import type { LocalFile } from '$lib/modules/storage/types';
@ -142,13 +142,13 @@ export function useRecentConversations(limit = 5) {
}, [] as LocalConversation[]);
}
// ─── Zitare Queries ─────────────────────────────────────────
// ─── Quotes Queries ─────────────────────────────────────────
/** A random favorite quote. */
export function useRandomFavorite() {
return useLiveQueryWithDefault(
async () => {
const all = await db.table<LocalFavorite>('zitareFavorites').toArray();
const all = await db.table<LocalFavorite>('quotesFavorites').toArray();
const active = all.filter((f) => !f.deletedAt);
if (active.length === 0) return null;
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'],
picture: ['images', 'boards', 'boardItems', 'imageTags'],
cards: ['cardDecks', 'cards', 'deckTags'],
zitare: ['zitareFavorites', 'zitareLists', 'zitareListTags'],
quotes: ['quotesFavorites', 'quotesLists', 'quotesListTags'],
music: ['songs', 'mukkePlaylists', 'playlistSongs', 'mukkeProjects', 'markers', 'songTags'],
storage: ['files', 'storageFolders', 'fileTags'],
presi: ['presiDecks', 'slides', 'presiDeckTags'],
@ -180,8 +180,8 @@ describe('module-registry — pre-refactor snapshot', () => {
todoProjects: 'projects',
chatTemplates: 'templates',
cardDecks: 'decks',
zitareFavorites: 'favorites',
zitareLists: 'lists',
quotesFavorites: 'favorites',
quotesLists: 'lists',
mukkePlaylists: 'playlists',
mukkeProjects: 'projects',
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 { pictureModuleConfig } from '$lib/modules/picture/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 { storageModuleConfig } from '$lib/modules/storage/module.config';
import { presiModuleConfig } from '$lib/modules/presi/module.config';
@ -108,7 +108,7 @@ export const MODULE_CONFIGS: readonly ModuleConfig[] = [
chatModuleConfig,
pictureModuleConfig,
cardsModuleConfig,
zitareModuleConfig,
quotesModuleConfig,
musicModuleConfig,
storageModuleConfig,
presiModuleConfig,

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -2,7 +2,7 @@
"faq": {
"what_is_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"
},
"sso": {

View file

@ -2,7 +2,7 @@
"faq": {
"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"
},
"sso": {

View file

@ -2,7 +2,7 @@
"faq": {
"what_is_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"
},
"sso": {

View file

@ -2,7 +2,7 @@
"faq": {
"what_is_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"
},
"sso": {

View file

@ -2,7 +2,7 @@
"faq": {
"what_is_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"
},
"sso": {

View file

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

View file

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

View file

@ -1,6 +1,6 @@
{
"app": {
"name": "Zitare",
"name": "Quotes",
"tagline": "Citas inspiradoras cada día"
},
"nav": {
@ -132,8 +132,8 @@
"fontSizeNormal": "Normal",
"fontSizeLarge": "Grande",
"fontSizeXLarge": "Muy grande",
"about": "Sobre Zitare",
"aboutDescription": "Zitare te ofrece citas inspiradoras diarias de los más grandes pensadores de la historia. Guarda tus favoritas y crea tus propias listas.",
"about": "Sobre Quotes",
"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"
},
"auth": {

View file

@ -1,6 +1,6 @@
{
"app": {
"name": "Zitare",
"name": "Quotes",
"tagline": "Des citations inspirantes chaque jour"
},
"nav": {
@ -132,8 +132,8 @@
"fontSizeNormal": "Normale",
"fontSizeLarge": "Grande",
"fontSizeXLarge": "Très grande",
"about": "À propos de Zitare",
"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.",
"about": "À propos de Quotes",
"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"
},
"auth": {

View file

@ -1,6 +1,6 @@
{
"app": {
"name": "Zitare",
"name": "Quotes",
"tagline": "Citazioni ispiratrici ogni giorno"
},
"nav": {
@ -132,8 +132,8 @@
"fontSizeNormal": "Normale",
"fontSizeLarge": "Grande",
"fontSizeXLarge": "Molto grande",
"about": "Informazioni su Zitare",
"aboutDescription": "Zitare ti offre ogni giorno citazioni ispiratrici dei più grandi pensatori della storia. Salva i tuoi preferiti e crea le tue liste.",
"about": "Informazioni su Quotes",
"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"
},
"auth": {

View file

@ -1,21 +1,21 @@
<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
* aus dem eingebetteten Zitate-Katalog von Zitare.
* aus dem eingebetteten Zitate-Katalog von Quotes.
*/
import { liveQuery } from 'dexie';
import { db } from '$lib/data/database';
import type { BaseRecord } from '@mana/local-store';
interface ZitareFavorite extends BaseRecord {
interface QuotesFavorite extends BaseRecord {
quoteId: string;
}
let favorite: ZitareFavorite | null = $state(null);
let favorite: QuotesFavorite | null = $state(null);
let totalFavorites = $state(0);
let loading = $state(true);
@ -33,7 +33,7 @@
$effect(() => {
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);
}).subscribe({
next: (val) => {
@ -66,14 +66,14 @@
<div class="mb-2 text-3xl">&#128161;</div>
<p class="text-sm text-muted-foreground">Noch keine Lieblingszitate gespeichert.</p>
<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"
>
Zitate entdecken
</a>
</div>
{: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">
Favorit #{favorite.quoteId}
</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.
Supports tag drag-and-drop onto the current quote.
-->
@ -7,16 +7,16 @@
import { onMount } from 'svelte';
import { liveQuery } from 'dexie';
import { db } from '$lib/data/database';
import { quotesStore } from '$lib/modules/zitare/stores/quotes.svelte';
import { favoritesStore } from '$lib/modules/zitare/stores/favorites.svelte';
import { isFavorite as checkIsFavorite, type Favorite } from '$lib/modules/zitare/queries';
import { quotesStore } from '$lib/modules/quotes/stores/quotes.svelte';
import { favoritesStore } from '$lib/modules/quotes/stores/favorites.svelte';
import { isFavorite as checkIsFavorite, type Favorite } from '$lib/modules/quotes/queries';
import { Heart } from '@mana/shared-icons';
import { dropTarget } from '@mana/shared-ui/dnd';
import type { TagDragData } from '@mana/shared-ui/dnd';
import { useAllTags, getTagsByIds } from '@mana/shared-stores';
import type { ViewProps } from '$lib/app-registry';
import type { LocalFavorite } from './types';
import type { Quote } from '@zitare/content';
import type { Quote } from '@quotes/content';
let { navigate, goBack, params }: ViewProps = $props();
@ -39,7 +39,7 @@
$effect(() => {
const sub = liveQuery(async () => {
return db
.table<LocalFavorite>('zitareFavorites')
.table<LocalFavorite>('quotesFavorites')
.toArray()
.then((all) => all.filter((f) => !f.deletedAt));
}).subscribe((val) => {
@ -83,13 +83,13 @@
if (!fav) {
await favoritesStore.add(quote.id);
// 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);
if (!fav) return;
}
const current = fav.tagIds ?? [];
if (!current.includes(tagData.id)) {
await db.table('zitareFavorites').update(fav.id, {
await db.table('quotesFavorites').update(fav.id, {
tagIds: [...current, tagData.id],
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';
@ -7,21 +7,21 @@ import type { LocalFavorite, LocalQuoteList, LocalCustomQuote } from './types';
// ─── Collection Accessors ──────────────────────────────────
export const favoriteTable = db.table<LocalFavorite>('zitareFavorites');
export const listTable = db.table<LocalQuoteList>('zitareLists');
export const customQuoteTable = db.table<LocalCustomQuote>('zitareCustomQuotes');
export const favoriteTable = db.table<LocalFavorite>('quotesFavorites');
export const listTable = db.table<LocalQuoteList>('quotesLists');
export const customQuoteTable = db.table<LocalCustomQuote>('customQuotes');
// ─── Guest Seed ────────────────────────────────────────────
export const ZITARE_GUEST_SEED = {
zitareFavorites: [
export const QUOTES_GUEST_SEED = {
quotesFavorites: [
{ id: 'fav-1', quoteId: 'mot-1' },
{ id: 'fav-2', quoteId: 'weis-3' },
{ id: 'fav-3', quoteId: 'mot-7' },
{ id: 'fav-4', quoteId: 'weis-1' },
{ id: 'fav-5', quoteId: 'liebe-1' },
],
zitareLists: [
quotesLists: [
{
id: 'list-motivation',
name: 'Motivation & Antrieb',

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