Added to: clock, photos, storage, mukke, planta, picture, skilltree,
nutriphi, chat. Now all 13 web apps show a re-login banner when
token refresh permanently fails.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New script generates COPY blocks between marker comments, eliminating
manual maintenance. All 17 web Dockerfiles updated with markers.
Supports --check flag for CI validation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 5 - Interactivity:
- Hover tooltip with score, status, category bars on every plant
- Click opens slide-in detail panel with 8-axis radar chart
- Panel shows all category scores, app links, ManaScore link
- Escape key and backdrop click close the panel
- Pan vs click distinction (no panel on drag)
Phase 6 - Atmosphere:
- Dynamic sky that follows real time of day (sunrise/noon/sunset/night)
- Stars with twinkling animation at night
- Sun glow during golden hour
- Birds flying across the scene (daytime)
- Dragonflies circling over lakes
- Butterflies near plants
- Fireflies at night (glowing, drifting)
- Time updates every minute
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Base parser: multilingual (DE/EN/FR/ES/IT) date, time, weekday, month parsing
- Base parser: fuzzy/typo tolerance (Levenshtein), recurrence (RRULE), relative time
- Base parser: timezone extraction, date ranges, ordinal dates, confidence scoring
- Base parser: past dates (gestern/yesterday), this/next week distinction
- Base parser: compose helper (createAppParser), multiple @references
- Calendar: event-parser with duration, time ranges, location, all-day, calendar ref
- Calendar: wire up UnifiedBar with onCreate/onParseCreate for quick event creation
- Todo: task-parser multilingual priority keywords (urgent/important/normal/later)
- Planta: plant-parser with acquisition keywords (gekauft/bought/acheté)
- Mukke: song-parser with Artist-Title format, BPM, genre, playlist/project creation
- NutriPhi: meal-parser with meal type detection, add QuickInputBar to layout
- All parsers: 210 tests across 7 test suites, all passing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
TasksTodayWidget imports date-fns but it wasn't in package.json,
causing Docker build failure.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Users now see an amber banner with a re-login button instead of a
broken empty page when their session expires. Uses pub/sub events
from tokenManager, integrated in todo, calendar, zitare, contacts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replaced Tailwind utility classes with inline styles for the container
and SVG element to prevent CSS purging issues in production build.
Added explicit preserveAspectRatio and xmlns attributes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Validates Dockerfiles and builds 5 representative images in parallel
on PRs. Catches missing COPY statements and build errors before deploy.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The tasks widget only showed tasks with dueDate=today, so tasks without
a date appeared as "no tasks". Now fetches all open tasks via GET /tasks,
sorted by due date (today/overdue first, then future, then no date).
- Add getAllOpenTasks() to todo service
- Update widget to use getAllOpenTasks()
- Show due date label next to task title (with overdue highlighting)
- Update i18n: "Aufgaben heute" → "Aufgaben"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4-column categorized footer showcasing the entire Mana ecosystem:
- Ecosystem: All 15 apps with status dots and expandable list
- Platform: Dashboard, Observatory, Playground, monitoring, community
- Insights: Devlog, ManaScore, Release Plan, Blueprints, landing pages
- Legal: Privacy, DSGVO, AI models, Impressum
Responsive: 4 cols desktop, 2 cols tablet, 1 col mobile.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The reorder endpoint used @Body('taskIds') without a DTO, which caused
"property taskIds should not exist" when the global ValidationPipe with
forbidNonWhitelisted rejected the request body.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace createRemoteJWKSet (HTTP to localhost) with local DB-backed
JWKS cache. Keys are read from auth.jwks table and cached in memory
with 5-minute TTL. Eliminates HTTP roundtrip per token validation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
setupFetchInterceptor now accepts a urls[] array instead of wrapping
globalThis.fetch twice (once for auth URL, once for backend URL).
Backward compatible - backendUrl still works, mapped to urls internally.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New script validates that all workspace deps in package.json have
matching COPY statements in Dockerfiles. Fixed missing shared-pwa,
shared-vite-config, patches/, and project-specific package COPYs
across 7 web app Dockerfiles.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sections are now always open with clean minimal headers:
- Remove chevron toggle icon
- Remove task count from section headers
- Remove collapsible behavior (sections always visible)
- Reduce icon size from 20 to 18
- Remove count from upcoming day subheaders
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Interactive SVG lake landscape that visualizes all ManaCore apps as plants
around interconnected lakes. Plant type and health reflects ManaScore:
- Oaks/Birches for mature/production apps (85+)
- Young trees and reeds for beta apps
- Sprouts for alpha/prototype apps
- Animated water (waves, river flow particles)
- Pan & zoom navigation
- 6 lakes representing infrastructure (Auth, Redis, MinIO, 3x PostgreSQL)
- 20 apps with real ManaScore data
Accessible at /observatory in the ManaCore web dashboard.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
hooks.server.ts imports @manacore/shared-utils/analytics-server but
shared-utils wasn't listed as a dependency. pnpm doesn't create the
symlink without it, causing Rollup to fail during Docker builds.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
500ms long press on a task item opens the expanded form with all fields.
Touch move or release before 500ms cancels the long press.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Click on task title to edit it directly inline instead of opening the
expanded form. Enter to save, Escape to cancel, blur to save.
Title shows subtle hover background to indicate editability.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Swap positions: checkbox now before priority indicator (drag → check → prio → content)
- Increase priority dot size from 0.5rem to 0.625rem
- Remove expand/collapse chevron icon on the right side
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace hamburger icon with standard 6-dot grip icon for drag handles
- Increase drag handle icon size (1rem → 1.25rem) and hit area
- Fix reorder bug: handleDndFinalize was not calling reorderTasks(),
so reordered items were never persisted and would revert on refresh
- Add optimistic update with rollback on error in reorderTasks store
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The prerendered /offline page referenced /favicon.png which didn't exist,
causing Docker build failure. Added favicon.svg, generated all PWA icons,
and added proper PWA meta tags to app.html.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The pnpm lockfile references patches (e.g., react-native-reanimated)
which need to be present for --frozen-lockfile to succeed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update about page with Score Trend, Lighthouse, Dependency Health,
API Conformity, and Cross-App Consistency documentation. Add
ManaScore section to root CLAUDE.md for discoverability.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. SEO Slugs: Auto-generated from name (ä→ae, ö→oe, etc.), unique with
-2/-3 suffix. Routes accept both UUID and slug. Seed data includes slugs.
2. Opening Hours + Contact: website, phone, openingHours fields in schema.
Displayed on detail page, editable in add/edit forms.
3. Landing Page with API: Fetches locations from backend at build time,
falls back to hardcoded JSON if API unreachable.
4. Frontend Tests: Vitest setup with api.test.ts (50 backend + web tests).
5. Marker Clustering: leaflet.markercluster for 10+ locations on map,
direct markers for fewer.
6. Favorite Collections: New collections table with CRUD endpoints.
Favorites page has tabs for favorites vs collections. Create, view,
delete collections with location management.
7. Rate Limiting: In-memory guard (10 req/min) on write endpoints.
Returns 429 with retryAfter.
8. Soft Deletes: deletedAt field, all reads filter deleted records.
POST /locations/:id/restore endpoint for owners.
50 backend tests passing, 0 type errors.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove unnecessary wrapper div in WidgetContainer
- Increase grid gap from gap-4 to gap-5 for breathing room
- Add auto-rows-fr for equal row heights
- Add min-h on widget content so empty widgets aren't tiny
- Change default layout to 3 equal columns (small)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Full-stack achievement system for SkillTree with backend (NestJS) and frontend (SvelteKit):
- 26 achievements across 7 categories (XP, Skills, Levels, Activities, Streak, Branches, Special)
- 5 rarity tiers (Common → Legendary) with distinct styling
- Auto-unlock after XP gain, skill creation, and activity logging
- Celebration animation on unlock with sparkle effects
- Achievements page with category filters and progress tracking
- IndexedDB offline support with local condition evaluation
- Backend seeds achievements on startup, checks conditions after mutations
- Stats overview extended with achievement counter
- i18n translations (DE + EN)
Also adds docs/MONETIZATION_REPORT.md with ranked analysis of all apps.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
In Svelte, child onMount fires before parent onMount. Pages that fetch
data in onMount race against the layout's authStore.initialize(). Added
appReady state gate to layouts so children don't mount until auth is
confirmed. Affects: todo, contacts, clock, photos, zitare, planta.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two infrastructure improvements for tech independence:
1. Cloudflare Fallback Documentation (docs/CLOUDFLARE_FALLBACK.md):
- Plan B: WireGuard + Caddy on Hetzner VPS (€3.79/mo)
- Complete Caddyfile with all 30+ subdomains
- Step-by-step failover checklist (~15 min to switch)
- Plan C: Direct IP with ISP
2. Self-Hosted Landing Pages (eliminates Cloudflare Pages dependency):
- Nginx container (mana-infra-landings) on port 4400
- Multi-site config: each subdomain → separate dist/ folder
- Build script: scripts/mac-mini/build-landings.sh
- Cloudflare Tunnel ingress rules for 10 landing page domains
- Storage: /Volumes/ManaData/landings/ on external SSD
- Domains: it, chats, pics, zitares, presis, clocks,
manadeck, nutriphi, citycorners, docs
Migration path: Build landings locally, set Cloudflare DNS to
tunnel instead of Pages, then decommission CF Pages projects.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The animate:flip wrapper div in DashboardGrid was not passing through
the col-span classes, causing all widgets to render at minimum width.
Moved size classes from WidgetContainer to the grid wrapper div.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add optional lighthouse scores (performance, accessibility, best
practices, SEO) to schema. Display as inline badges on overview
and circular gauges on detail page with average score.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The config_file override replaced the entire default PostgreSQL config
including listen_addresses, breaking inter-container communication.
Use inline -c flags instead which only override specific parameters.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add history array to schema for tracking score changes over time.
Index page shows inline sparkline + delta, detail page shows larger
area chart with score labels on each data point.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allows Vite/SvelteKit to import the package without a prior build step,
matching the pattern used by other shared packages like shared-credit-ui.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Prevents postinstall from triggering premature builds before shared
packages are compiled.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Photo Gallery:
- New `images` JSONB array field in locations schema
- POST /locations/:id/images endpoint to add photos (auth required)
- Gallery with thumbnail strip and image counter on detail page
- Any authenticated user can add photos to any location
- "Add photo" button inline with thumbnails
2. Nearby Locations:
- GET /locations/:id/nearby endpoint with Haversine distance query
- Configurable radius (default 2km, max 10km)
- Returns up to 5 nearby locations sorted by distance
- Horizontal scroll card strip on detail page showing distance
3. Search Suggestions + History:
- GET /locations/suggestions endpoint (prefix matching, fast)
- Search history stored in localStorage (max 8 entries)
- Empty search shows recent history with clock icon
- Selected locations automatically saved to history
- Falls back to full-text search if no prefix matches
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>