Commit graph

647 commits

Author SHA1 Message Date
Till-JS
431957ca05 📝 chore(zitare): complete metadata for all quotes
- Add missing year, source, and authorBio fields to all quotes
- Fix incorrect weis-1 quote (was Konfuzius, now Laozi with Tao Te King)
- Add new quotes: weis-9 (Konfuzius), liebe-6 (Saint-Exupéry), leben-7 (Horaz),
  erfolg-5/6 (Goethe, Sassoon), glueck-6 (Aristoteles), freund-5 (Cicero),
  mut-6 (Vergil), hoff-4/5 (Tutu, Cicero), natur-5/6 (Muir, Heraklit)
- Total: 60 quotes with complete multilingual metadata
- All author bios now include birth/death years
2026-02-13 13:40:36 +01:00
Till-JS
742aa0e046 feat(zitare): add multilingual support and expanded quote metadata
- Add 6-language support: original, de, en, it, fr, es
- Add quote metadata: source, year, tags, imageUrl, authorBio, verified
- Add originalLanguage field to preserve original quote language (la, el, zh, sa, etc.)
- Update all 50 quotes with full translations and metadata
- Add new utility functions: getQuoteText, getQuotesByTag, getAllTags,
  getQuotesByAuthor, getVerifiedQuotes, getQuotesByYearRange,
  getQuotesByOriginalLanguage
- Update matrix-zitare-bot to use new multilingual schema
2026-02-13 12:42:50 +01:00
Till-JS
d961508a81 🩹 fix(zitare): use proper German umlauts in quotes
Replace ASCII representations with actual umlauts:
- ae → ä, oe → ö, ue → ü, ss → ß
- Also fix author names (Saint-Exupéry, Kierkegaard, Linné)
2026-02-13 12:35:41 +01:00
Till-JS
74c1cfed4f feat(zitare): add @zitare/content package for shared quotes
- Create new @zitare/content package with 50 German quotes
- Include 10 categories: motivation, weisheit, liebe, leben, erfolg,
  glueck, freundschaft, mut, hoffnung, natur
- Add utility functions: getRandomQuote, getDailyQuote, searchQuotes,
  getQuotesByCategory, formatQuote, etc.
- Migrate matrix-zitare-bot to use the shared package
- Remove hardcoded quotes from bot configuration
2026-02-13 12:30:41 +01:00
Till-JS
e06622af30 🩹 fix(matrix): add mobile-web-app-capable meta tag 2026-02-13 12:23:01 +01:00
Till-JS
a373784954 💄 style(devlog): improve activity page design
- Show 90-day grid instead of 365 for better visibility
- Add month labels above the contribution grid
- Use European week start (Monday)
- Add animated hero section with gradient backgrounds
- Improve stat cards with hover effects and shadows
- Add secondary stats: Active Days, Commits/Day, Max Streak
- Make grid cells clickable to open respective devlog
- Add crown icon for top contributor
- Show percentage in contributor progress bars
- Add date badges to recent activity items
- Use glassmorphism effects and smooth animations
2026-02-13 12:21:01 +01:00
Till-JS
435d06a756 feat(matrix): implement WhatsApp-style mobile navigation
Mobile users now get a separate room list and chat view:
- /chat shows full-screen room list on mobile
- /chat/[roomId] shows full-screen chat with back button
- Desktop retains side-by-side layout unchanged
- Last room restore only happens on desktop
2026-02-13 12:08:23 +01:00
Till-JS
f4c2663122 feat(devlog): add activity grid page and extended stats
Add GitHub-style activity grid showing development contributions:
- Activity grid with color-coded commit intensity
- Total stats: commits, files changed, lines added/removed
- Contributors section with commit counts
- Recent activity list

Extended devlog schema with:
- stats: filesChanged, linesAdded, linesRemoved
- contributors: name, handle, commits per contributor
- workingHours: start/end timestamps

Updated all 9 devlogs with accurate git stats.
Added link to activity page from devlog index.
2026-02-13 12:07:23 +01:00
Till-JS
f5debee867 fix(matrix): increase FAB z-index and bottom position 2026-02-13 11:54:41 +01:00
Till-JS
49e619d68f feat(matrix): add FAB to open sidebar on mobile
Add a floating action button in the bottom-left corner that appears
when the sidebar is closed on mobile/tablet devices. Shows unread
message count badge.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 14:35:34 +01:00
Till-JS
8768d6276c debug(matrix): add logging for room restoration 2026-02-12 14:32:46 +01:00
Till-JS
5cd067ae6f fix(matrix): check _rooms array for last room restoration
Use _rooms.some() instead of getRoom() to check if the last selected
room exists, as the client's internal room cache may not be populated
yet at PREPARED state.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 14:28:57 +01:00
Till-JS
aa13473b94 🐛 fix(calendar): change user ID fields to text type
Changed sharedWithUserId and invitedBy from UUID to TEXT type
in calendar_shares table to match Mana Core Auth user ID format.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 14:12:24 +01:00
Till-JS
027d3d2140 feat(matrix): restore last selected chat on app load
Save the last selected room ID to localStorage and automatically
restore it when the app loads and sync is prepared.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 14:07:05 +01:00
Till-JS
7a2acd4bbe 🐛 fix(admin): remove api/v1 prefix from admin controllers
All backends with setGlobalPrefix('api/v1') were registering routes
as /api/v1/api/v1/admin instead of /api/v1/admin. Changed all admin
controllers to use @Controller('admin') instead of @Controller('api/v1/admin').

Affected backends:
- calendar
- contacts
- picture
- presi
- todo
- zitare
- chat

Note: storage backend still uses @Controller('api/v1/admin') as it has
no global prefix.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 14:03:00 +01:00
Till-JS
650f4f6986 fix(matrix): add missing props to Message.svelte interface
Add isSameSender and isLastInGroup props to fix type-check errors
when passing these values from Timeline.svelte.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 14:02:09 +01:00
Till-JS
cdb6e25885 fix(admin): storage backend needs api/v1 prefix in controller
Storage backend doesn't use setGlobalPrefix, so controller
needs full path @Controller('api/v1/admin')

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:59:33 +01:00
Till-JS
42c0069553 fix(admin): remove duplicate api/v1 prefix from controller routes
Photos, clock, storage backends use setGlobalPrefix('api/v1'),
so controller should use @Controller('admin') not @Controller('api/v1/admin')

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:49:52 +01:00
Till-JS
02a5172c7c feat(admin): add GDPR user-data endpoints to photos, clock, storage backends
- Add admin modules with GET/DELETE /api/v1/admin/user-data/:userId
- Photos: albums, favorites, tags counting and deletion
- Clock: alarms, timers, world clocks, presets counting and deletion
- Storage: files, folders, shares, tags counting and deletion
- Update UserDataService to include photos, clock, storage backends
- Add ADMIN_SERVICE_KEY env var to all backends in docker-compose
- Build storage-backend locally instead of using GHCR image

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:43:16 +01:00
Till-JS
d5e18c9c27 🔧 fix(mac-mini): update health checks and disable missing services
- Disable api-gateway and skilltree-web (no working images/Dockerfiles)
- Fix mana-search Dockerfile healthcheck port and endpoint
- Update health-check.sh to skip disabled services
- Fix search service health endpoint (/api/v1/health)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:28:55 +01:00
Till-JS
177e4eea88 fix(docker): add missing shared packages to manacore-web Dockerfile
Add shared-vite-config and shared-stores packages that were missing
from the Docker build context.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:26:45 +01:00
Till-JS
9881e84ee3 feat(auth): add GDPR self-service endpoints for user data
Add /api/v1/me/data endpoints for users to view, export, and delete
their own data without admin privileges (GDPR compliance).

Backend:
- New MeModule with MeController and MeService
- GET /api/v1/me/data - view own data summary
- GET /api/v1/me/data/export - download as JSON
- DELETE /api/v1/me/data - delete all own data

Frontend:
- New /settings/my-data page with full data overview
- Export button for JSON download
- DeleteConfirmationModal with email verification
- Link from settings page to my-data

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:20:08 +01:00
Till-JS
03c9267a69 🐛 fix(admin): use PostgresJsDatabase instead of NodePgDatabase
All backends use postgres-js driver, not node-postgres. The admin
services incorrectly imported from drizzle-orm/node-postgres which
caused runtime errors: "Cannot find module 'pg'"

Fixed in: chat, todo, calendar, contacts, picture, zitare
2026-02-12 02:34:00 +01:00
Till-JS
8b6ff0c679 feat(auth): add API key management for STT/TTS services
- Add api_keys schema in mana-core-auth with SHA-256 hashing
- Create NestJS module with CRUD endpoints and validation
- Add external auth module to STT/TTS for sk_live_ key validation
- Create web UI page at /api-keys for key management
- Support rate limiting per key with configurable limits
- Cache validation results for 5 minutes to reduce auth service load

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 02:12:05 +01:00
Till-JS
552dc10f25 🔧 fix(docker): add --ignore-scripts to pnpm install in all backend Dockerfiles
The root package.json postinstall script runs scripts/generate-env.mjs
which doesn't exist in the Docker build context. Using --ignore-scripts
skips this postinstall step since env generation isn't needed in Docker.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 02:10:45 +01:00
Till-JS
fc2ee7ab76 🐛 fix(photos-backend): correct path to main.js
NestJS outputs to dist/src/ not dist/

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 01:59:02 +01:00
Till-JS
741c5bc00c 🐛 fix(photos): use valid Svelte 5 event syntax
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 01:49:11 +01:00
Till-JS
36563f4459 🔧 fix(photos): remove unused nestjs-integration dependency
Photos doesn't use credits, so ManaCoreModule is not needed.
Use shared-nestjs-auth directly instead.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 01:43:44 +01:00
Till-JS
5ce4e42c20 🚀 feat(photos): add Docker deployment configuration
- Add Dockerfile for photos-backend (port 3039)
- Add Dockerfile for photos-web (port 5019)
- Add docker-entrypoint.sh for database migrations
- Add health endpoint for photos-web
- Add photos services to docker-compose.macmini.yml
- Update CORS_ORIGINS for mana-auth and mana-media
- Update CLAUDE.md with production URLs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 18:21:19 +01:00
Till-JS
91f175c8f6 🐛 fix(deps): add missing shared-stores dependency to web apps
storage-web and manacore-web both use shared-stores but it wasn't declared
as a dependency in their package.json files.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 18:19:38 +01:00
Till-JS
4130823281 🔧 fix(docker): add shared-stores and shared-types to storage-web
shared-stores is used for navigation stores, shared-types is needed by
shared-auth at build time.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 18:09:40 +01:00
Till-JS
8ddc4eb907 🔧 fix(docker): build shared-vite-config in storage-web Dockerfile
The vite config package exports from dist/ and needs to be built before
the web app can be built.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 18:05:07 +01:00
Till-JS
4f9d992263 🔧 fix(docker): add missing shared packages to storage-web Dockerfile
Added shared-vite-config and shared-api-client, removed unused shared-types.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 18:00:51 +01:00
Till-JS
90c2f8573e feat(photos): add Photos app with mana-media EXIF integration
- Add Photos NestJS backend (port 3019) with albums, favorites, tags
- Add Photos SvelteKit web app (port 5189) with gallery, upload, filters
- Extend mana-media with EXIF extraction service using exifr
- Add cross-app photo listing endpoint to mana-media
- Add photo stats endpoint to mana-media
- Add photos to setup-databases.sh

Backend features:
- Albums CRUD with cover image and items management
- Favorites toggle with status check
- Tags CRUD with photo-tag associations
- Photo proxy to mana-media with local data enrichment

Web features:
- Photo grid with infinite scroll
- Photo detail modal with EXIF display
- Album grid and detail views
- Upload dropzone with progress tracking
- Filter bar (app, date range, location, sort)
- i18n support (de/en)
- Svelte 5 runes mode

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 17:58:44 +01:00
Till-JS
e7e6281d54 🔧 fix(docker): add missing shared packages to all backend Dockerfiles
All backend Dockerfiles were missing required shared package dependencies,
causing CI builds to fail with TypeScript compilation errors.

Fixed Dockerfiles:
- chat: added credit-operations, nestjs-integration, health, metrics, setup, tsconfig
- todo: added credit-operations, nestjs-integration, health, metrics, tsconfig
- contacts: added health, metrics, setup, tsconfig
- calendar: added credit-operations, nestjs-integration, health, metrics, setup, tsconfig
- presi: added health, setup, tsconfig
- picture: added credit-operations, nestjs-integration, health, storage, tsconfig
- clock: added health, metrics, setup, tsconfig
- storage: added health, tsconfig
- manadeck: added credit-operations, tsconfig
- skilltree: added health, metrics, tsconfig

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 16:47:00 +01:00
Till-JS
a2e2a5b73c feat(admin): add user data dashboard for cross-project data visualization
Add comprehensive admin dashboard to view and manage user data across all projects:

Backend:
- Add admin endpoints to Chat, Todo, Contacts, Calendar, Picture, Zitare, Presi
- Each backend exposes GET/DELETE /api/v1/admin/user-data/:userId
- Service-to-service auth via X-Service-Key header

Aggregation (mana-core-auth):
- GET /api/v1/admin/users - Paginated user list with search
- GET /api/v1/admin/users/:userId/data - Aggregated data from all backends
- DELETE /api/v1/admin/users/:userId/data - GDPR deletion across all projects

Frontend (ManaCore web):
- New User Data tab in admin navigation
- User search page at /admin/user-data
- User detail page with ProjectDataCard components
- GDPR deletion dialog with email confirmation

Presi:
- Migrate user_id from UUID to TEXT for Better Auth compatibility
- Add SQL migration script
2026-02-11 14:59:18 +01:00
Till-JS
5b6f231e1a 🐛 fix(todo,matrix): improve click targets and type safety
- todo: Make task-content button fill full height for better click target
- matrix: Fix TypeScript errors by using Boolean() for template expressions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 14:53:49 +01:00
Till-JS
bf0e788cba ♻️ refactor(todo,contacts): remove sidebar mode from PillNavigation
Simplify navigation by removing unused sidebar mode from both apps:

Todo App:
- Remove isSidebarMode state, handlers, and localStorage persistence
- Remove sidebar-related CSS classes and styles
- Simplify TodoToolbar to pure wrapper component

Contacts App:
- Remove isSidebarMode state, handlers, and localStorage persistence
- Remove sidebar-related CSS from ContactsToolbar and ContactAlphabetView
- Always show view-mode-pill (no longer conditional on sidebar mode)

This removes ~250 lines of unused code across 5 files.
2026-02-02 19:16:56 +01:00
Till-JS
12a900346c ♻️ refactor(calendar): remove sidebar mode from PillNavigation
Simplify the bottom bars by removing the unused sidebar mode:
- Remove isSidebarMode prop from all components
- Remove sidebar-related CSS classes and styles
- Simplify CalendarToolbar to pure wrapper component
- Remove localStorage persistence for sidebar mode

This removes ~230 lines of unused code across 8 files.
2026-02-02 19:06:32 +01:00
Till-JS
bd9bd556f4 🚸 feat(calendar): hide tasks by default and scroll to midday on load
- Add showTasksInCalendar setting (default: false) to hide task blocks
- Auto-scroll time-grid views to 12:00 on initial load for better UX
- Tasks can be re-enabled via settings toggle
2026-02-02 18:54:05 +01:00
Till-JS
171cf7a854 fix(contacts-web): use runtime URLs instead of build-time baked values
- user-settings.svelte.ts: use getAuthUrl() for settings API
- contacts.ts: use getAuthUrl() for tags API client
- feedback.ts: use getAuthUrl() for feedback service

This fixes Mixed Content errors where the app was trying to reach
internal Docker URLs (http://mana-auth:3001) instead of production
URLs (https://auth.mana.how).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 17:22:59 +01:00
Till-JS
30f0dbef5d feat(contacts-web): add hooks.server.ts for runtime URL injection
Fixes contacts-web using localhost URLs instead of production URLs.
SvelteKit bakes environment variables at build time, so we need to
inject runtime URLs via hooks.server.ts for Docker deployments.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 17:14:03 +01:00
Till-JS
ad22d264aa fix(nutriphi): add shared-drizzle-config and make db:push non-fatal
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 16:17:22 +01:00
Till-JS
ac477aae24 fix(nutriphi): add missing shared packages to Dockerfile
Added shared-tsconfig, shared-nestjs-setup, and shared-nestjs-health
packages required for the backend build.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 16:14:04 +01:00
Till-JS
509bbb9920 fix(nutriphi): add shared-nestjs-setup to Dockerfile
The package is required for the bodyLimit configuration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 16:09:44 +01:00
Till-JS
b404ddc9a8 fix(nutriphi): increase body size limit to 50mb for image uploads
The NutriPhi bot was failing with 413 "request entity too large" when
analyzing images via Base64. Added configurable bodyLimit option to
shared-nestjs-setup and set NutriPhi backend to 50mb.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 16:08:14 +01:00
Till-JS
9d7e6c670e fix(matrix-web): change bots page to single column layout
More readable and cleaner UX with narrower max-width

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 15:46:35 +01:00
Till-JS
23852cf605 feat(matrix-web): add bots page with all 19 Matrix bots
- Add /bots route with bot overview grid
- Create BotCard component with expandable details
- Implement search and category filtering (AI, Productivity, Media, Lifestyle, Tools)
- Add bot data structure with commands, descriptions, and metadata
- Support starting chat with bots (creates DM or navigates to existing room)
- Add German and English translations
- Add robot icon to PillNavigation component

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 15:36:49 +01:00
Till-JS
feaf27dd14 feat(auth): implement cross-subdomain SSO for all web apps
Add Single Sign-On (SSO) support across all mana.how subdomains:

- Add trySSO() method to @manacore/shared-auth that exchanges session
  cookies for JWT tokens
- Add /api/v1/auth/session-to-token endpoint to mana-core-auth service
- Update all 15 web apps to try SSO during auth initialization

SSO Flow:
1. User logs in on any app (e.g., calendar.mana.how)
2. Session cookie is set with Domain=.mana.how
3. When visiting another app (e.g., todo.mana.how), it checks for
   local tokens first
4. If no local tokens, tries SSO via session cookie
5. Session cookie is exchanged for JWT tokens via new endpoint
6. User is automatically authenticated

Apps updated: calendar, chat, clock, contacts, manacore, manadeck,
nutriphi, picture, planta, presi, questions, skilltree, storage,
todo, zitare

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 13:17:04 +01:00
Till-JS
352070fb2f docs(auth): add SSO documentation and test credentials
- Document cross-domain SSO with COOKIE_DOMAIN configuration
- Add production test credentials for automated testing
- Explain cookie-based SSO flow across *.mana.how subdomains

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 04:09:07 +01:00