Commit graph

1187 commits

Author SHA1 Message Date
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
210969a67f 🔧 chore(docker): build mana-web locally on Mac Mini
Switch manacore-web from GHCR image to local build for faster
deployment of frontend changes (self-service /settings/my-data).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-13 12:04:30 +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
cb08931330 🔧 chore(docker): build presi-backend locally on Mac Mini
Changed from GHCR image to local build to pick up admin
controller prefix fix.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 14:09:46 +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
acc8de36ee feat(monitoring): add alerting stack and maintenance scripts
Medium priority stability improvements:

Alerting:
- Add vmalert for evaluating Prometheus alert rules
- Add alertmanager for alert routing and grouping
- Add alert-notifier service for Telegram/ntfy notifications
- Enable cadvisor scraping in prometheus config

Disk Monitoring:
- Add check-disk-space.sh for hourly disk monitoring
- Alert on 80% (warning) and 90% (critical) thresholds
- Auto-cleanup Docker when disk is critical
- Add com.manacore.disk-check.plist for LaunchD

Weekly Reports:
- Add weekly-report.sh for system health summary
- Includes: backup status, disk usage, container health,
  database stats, error log summary
- Runs every Sunday at 10 AM via LaunchD

Health Check Updates:
- Add checks for vmalert, alertmanager, alert-notifier

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:46:57 +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
3de2f25552 feat(mac-mini): add stability improvements
High priority stability features:
- Add all LaunchD plists to Git for version control
- Handle crash-looping containers (Restarting status) in ensure-containers.sh
- Add database backup script with daily/weekly rotation
- Add Docker log rotation setup (50MB max, 3 files per container)

New files:
- scripts/mac-mini/backup-databases.sh - Daily pg_dump with rotation
- scripts/mac-mini/setup-docker-logging.sh - Configure daemon.json
- scripts/mac-mini/launchd/*.plist - All 8 LaunchD service configs
- scripts/mac-mini/launchd/README.md - Documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:33:44 +01:00
Till-JS
7d409465b6 fix(docker): add backend URLs to auth service for GDPR data aggregation
Configure mana-auth with internal Docker network URLs to query
project backends for user data (Chat, Todo, Calendar, Contacts,
Picture, Presi).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:33:33 +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
6548d83e18 🐛 fix(mana-search): use pnpm deploy to fix symlink issue in Docker
pnpm creates symlinks in node_modules that point to ../../node_modules/.pnpm/
These symlinks break when only the service node_modules are copied.

Using pnpm deploy creates a standalone version with all dependencies
copied (no symlinks), which works correctly in Docker.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:24:55 +01:00
Till-JS
bc8cd98a27 fix(auth): correct MeController route prefix
Remove duplicate api/v1 prefix - NestJS already adds it globally.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:22:58 +01:00
Till-JS
3e3700338b 🔧 fix(docker): build mana-search and skilltree-web locally
- mana-search: GHCR image is broken (missing node_modules)
- skilltree-web: GHCR image doesn't exist
- api-gateway: disabled (no image, no Dockerfile)

All three now build locally on Mac Mini instead of pulling from GHCR.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:22:42 +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
759b227355 🔧 fix(mac-mini): correct user path in LaunchD plist
Server user is 'mana', not 'till'.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:15:06 +01:00
Till-JS
2fe7f842c6 🔧 fix(mac-mini): add container recovery and update health check ports
- Add ensure-containers-running.sh to detect and auto-start stuck containers
- Add LaunchD plist for automatic container health checks every 5 minutes
- Update health-check.sh with correct ports (3031/5011 for todo, etc.)
- Update deploy.sh health checks to match docker-compose.macmini.yml
- Fix container name references (mana-infra-postgres instead of manacore-postgres)

This prevents 502 errors when containers get stuck in "Created" status.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 12:51:49 +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
ba3d2a121a 🔧 chore(docker): build backends locally on Mac Mini
Switch 5 backends from pulling ghcr.io images to building locally:
- chat-backend
- todo-backend
- calendar-backend
- clock-backend
- contacts-backend

This ensures Dockerfiles with shared-drizzle-config are used directly.
2026-02-12 02:23:52 +01:00
Till-JS
10502b5627 fix(photos): re-enable mana-media dependency
mana-media Dockerfile is now fixed, so photos-backend can depend on it again.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 02:21:39 +01:00
Till-JS
22a6a6496c fix(mana-media): fix Dockerfile pnpm symlinks for production
Keep same directory structure in production stage so pnpm symlinks
resolve correctly. Copy the .pnpm store and app's node_modules
separately.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 02:19:19 +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
3353ceb962 feat(photos): add Cloudflare Tunnel routes for photos app
- photos.mana.how → localhost:5019 (web frontend)
- photos-api.mana.how → localhost:3039 (backend API)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 02:06:56 +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
aa56ec844b 🔧 fix(photos): temporarily disable mana-media dependency
mana-media Dockerfile has a pre-existing bug with pnpm symlinks
that needs to be fixed separately.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 01:58:21 +01:00
Till-JS
4452d371fa 🐛 fix(mana-media): correct path to main.js in Dockerfile
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 01:55:48 +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
16a7532253 🔧 chore: update lockfile after removing nestjs-integration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 01:45:26 +01:00
Till-JS
898f5d2112 🔧 chore(stt,tts): update launchd plists to load .env files
Source .env file before starting uvicorn to enable API key auth
and other environment-based configuration.

Removes hardcoded PORT values in favor of .env configuration.
2026-02-12 01:44:46 +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
aab304fc95 🔒️ feat(stt,tts): add API key authentication with rate limiting
Add auth.py module to both STT and TTS services with:
- API key validation via X-API-Key header
- Rate limiting with sliding window (requests per minute)
- Internal API key option for unlimited access
- Environment variable configuration

All protected endpoints now require authentication.
Public endpoints (/health, /docs) remain accessible.
2026-02-11 18:04:22 +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
d3392f69a9 🔧 fix(ci): disable ARM64 for storage-backend due to QEMU issues
Storage-backend build was failing on ARM64 due to QEMU emulation
"Illegal instruction" crash when building native dependencies.
Same approach used for matrix-mana-bot and matrix-tts-bot.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 17:51:26 +01:00
Till-JS
5cd8b63862 🐛 fix(infra): correct TTS API port to 3022 2026-02-11 17:41:27 +01:00
Till-JS
99a23d04d2 🚀 feat(infra): expose STT and TTS APIs externally
- Add stt-api.mana.how -> localhost:3020
- Add tts-api.mana.how -> localhost:3021

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 17:39:59 +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