- Fix datenschutz link to point to manacore-landing.pages.dev
- Update hosting info to reflect own infrastructure in Germany
- Add Cloudflare CDN section
- Update analytics section with Umami details (no cookies)
- Change email domain from mana.ai to mana.how
- Remove archived Memoro app section
- Update date to February 2026
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change sidebarCollapsed default to true (tasks hidden by default on mobile)
- Add leftAction snippet slot to InputBar component
- Move VoiceRecordButton inside InputBar instead of floating position
- Remove obsolete voice-button-wrapper styles
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Dockerfile for production build
- Add docker-entrypoint.sh for runtime config
- Add hooks.server.ts for client-side env injection
- Add zitare-web service to docker-compose.macmini.yml
- Port 5012
- Depends on zitare-backend
- Health check on /health endpoint
- Add Dockerfile for zitare-backend (multi-stage build, port 3007)
- Add docker-entrypoint.sh for database setup
- Add zitare-backend service to docker-compose.macmini.yml
- Update matrix-zitare-bot to depend on zitare-backend
- Add zitare-backend to CI workflow (change detection + build job)
- Add account deletion confirmation email
- Extend data export with sessions, security events, transactions
- Add DSGVO info banner with privacy policy link
- Add data retention periods section
- Add cookie info (no tracking cookies)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 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
- 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
- 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
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
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>
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>
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>
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>
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>
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>
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>
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>
- 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>
- 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>
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>
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>
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
- 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>
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>
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>
- 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>
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>
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>
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>
- 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>
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
- 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>
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.
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.
- 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
- 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>
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>