mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 20:21:09 +02:00
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:
parent
7a1f11c971
commit
851a281e5a
196 changed files with 891 additions and 776 deletions
|
|
@ -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`
|
||||||
|
|
|
||||||
|
|
@ -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) |
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
6
.github/workflows/ci.yml
vendored
6
.github/workflows/ci.yml
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
6
.github/workflows/docker-validate.yml
vendored
6
.github/workflows/docker-validate.yml
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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/
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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/
|
||||||
- ...
|
- ...
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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 │ │
|
||||||
└────────────────────────────────────────────────────────────┘
|
└────────────────────────────────────────────────────────────┘
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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`
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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` |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) => {
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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:**
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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') },
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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' },
|
||||||
|
|
|
||||||
|
|
@ -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: {
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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.',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)];
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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": {
|
||||||
|
|
|
||||||
|
|
@ -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": {
|
||||||
|
|
|
||||||
|
|
@ -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": {
|
||||||
|
|
|
||||||
|
|
@ -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": {
|
||||||
|
|
|
||||||
|
|
@ -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": {
|
||||||
|
|
|
||||||
|
|
@ -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": {
|
||||||
|
|
@ -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": {
|
||||||
|
|
@ -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": {
|
||||||
|
|
@ -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": {
|
||||||
|
|
@ -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": {
|
||||||
|
|
@ -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">💡</div>
|
<div class="mb-2 text-3xl">💡</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>
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
});
|
});
|
||||||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue