Port i18n strings from 22 standalone apps into unified per-module locale
structure. Each module now has 5 language files (de, en, es, fr, it).
Modules added: calendar, contacts, memoro, citycorners, times, zitare,
inventar, photos, skilltree, questions, uload, chat, cards, picture,
moodlit, storage, context, presi, nutriphi, planta, calc, matrix, guides
Total: 31 locale modules, 155 JSON files, all 5 languages complete.
German and English ported from standalone apps, ES/FR/IT generated.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Start createReminderScheduler with todoReminderSource on auth ready.
Request notification permission on app mount. Stop scheduler on destroy.
Todo reminders now fire browser notifications when dueDate - minutesBefore
is reached.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Upgrade shared-logger to dual-mode: JSON lines in production, console
in dev. Adds configureLogger() for service name + request ID.
- Add requestLogger middleware to shared-hono with request ID generation
and structured request/response logging.
- Align Promtail config with new JSON field names (requestId, ts, service).
- Add PUBLIC_GLITCHTIP_DSN + PUBLIC_UMAMI_WEBSITE_ID to mana-web docker config.
- Add /status page that polls all backend /health endpoints server-side.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add shared TagField component (ID-based wrapper for TagSelector).
Wire TagField into: calendar EventForm, times EntryForm, cards
CreateDeckModal, contacts detail page. Wire FavoriteButton into
contacts list (replaces inline Star toggle). Add ColorPicker to
cards CreateDeckModal for deck color selection.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Delete components and stores that are no longer imported after the
pages system and workbench refactor:
- MinimizedTabs.svelte (replaced by inline tabs in todo +page)
- TagStrip.svelte (old filter strip, unused)
- TodoToolbar.svelte (old Inbox/Today/Upcoming tabs, unused)
- minimized-pages.svelte.ts store (unused)
- view.svelte.ts store (only used by deleted components)
- AppRow.svelte (old home page grid, replaced by workbench)
- ActivityFeed.svelte (old home page feed, replaced by workbench)
- Remove viewStore + minimizedPagesStore from todo/index.ts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add analytics events to inventar, storage, memoro, mukke, presi,
moodlit, picture, calc, citycorners, and zitare stores. Also adds
new event helpers for calc, inventar, moodlit, and citycorners.
All 31 module store files now have analytics instrumentation,
up from 4 at the start of this session.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Complete rewrite of the calendar event detail modal:
- Color accent bar matching calendar color
- Date with weekday + time range + duration display
- Recurrence-aware delete dialog (this event / entire series)
- Tags display
- Copy to clipboard button
- Created/updated metadata
- Cleaner layout with better typography
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add analytics events to todo, calendar, contacts, chat, cards, and
photos module stores. All mutations (create, update, delete, complete,
favorite, archive) now fire the corresponding typed event helpers
with automatic module context.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Sync svelte-i18n locale from userSettings.locale (backend) via $effect
- Persist language changes to backend via userSettings.updateGlobal
- Add nav/ locale module with navigation labels in 5 languages
- Replace 6 hardcoded German strings in app layout with $_() calls:
"Alle Themes", "Menü", "Geschenke", "Profil", "Einstellungen", etc.
- Make baseNavItems reactive ($derived) so labels update on language change
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Split 5 monolithic JSON files (de/en/es/fr/it) into 7 per-module folders
(common, dashboard, credits, profile, subscription, todo, app_slider)
with 5 language files each = 35 files total.
- Rewrite i18n/index.ts with merge-registration pattern that dynamically
imports and merges per-module locale files at registration time
- Complete missing translations: IT (was 7% → now 100%), ES/FR (were 43% → now 100%)
- Generated missing IT translations for dashboard, credits, profile, subscription, todo
- Generated missing ES/FR translations for dashboard, credits, profile, subscription
- All 5 languages now have identical key structures across all modules
This enables scalable i18n: adding a new module = new folder + 5 JSON files + 1 line in registration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add web-vitals package with LCP/CLS/INP/FCP/TTFB → Umami tracking
- Set GlitchTip user context on login, clear on logout
- Add funnel events: first_content_created, user_return_visit,
second_module_used, guest_converted
- Track first content via Dexie creating hook (fires once per user)
- Track module usage via route navigation effect
- Track guest→registered conversion on signup
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
exportToJSON, exportToCSV (with BOM for Excel), importFromJSON,
downloadFile, timestampedFilename. Works with any Dexie table.
Supports filtering, column selection, custom formatters, ID
regeneration, and transform functions. 16 tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove standalone app Umami website IDs from .env.development and
generate-env.mjs. Remove injectUmamiAnalytics from all 21 standalone
app hooks.server.ts files. All analytics now flow through the single
ManaCore unified app website ID with module-level segmentation.
Landing page IDs are preserved (separate Astro sites).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add quick actions (call, email, SMS), work section (company, position,
website), address (street/city/postal/country), social media (LinkedIn,
Twitter, Instagram, GitHub), and mobile phone to both view and edit
modes. Edit form organized in card sections matching the view layout.
Extend Contact type and store with all new fields.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The pre-commit linter was stripping createGuestMode, GuestWelcomeModal,
and NotificationBar imports because it couldn't resolve them during
staged-file linting. Fix by creating a local re-export file at
$lib/stores/guest-mode.svelte.ts that the linter can resolve.
Also restore the GuestWelcomeModal and NotificationBar template blocks
that were removed by the linter.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Resolves event name collisions in the unified app (e.g. view_changed,
deck_created, search_performed) by adding a `module` property to every
tracked event via createModuleTracker. Also fixes duplicate tracking in
Planta routes (now only tracked in mutations.ts).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add URL validation (must be valid http/https), short code uniqueness check,
custom code format validation, maxClicks >= 1, expiresAt must be future
- Migrate uload-server click tracking from sync_changes to uload.clicks table
for performant analytics with SQL indexes on link_id, clicked_at, country
- Migrate analytics queries from JSON aggregation on sync_changes to direct
SQL on uload.clicks (typed columns instead of data->>'field' extraction)
- Make short URL domain configurable via PUBLIC_ULOAD_DOMAIN env var
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The uload-server reads links from sync_changes (local-first via mana-sync)
and never used the Drizzle schema tables (users, accounts, workspaces, links).
Strip uload-database package to only the clicks table which is needed for
performant analytics aggregation with proper SQL indexes.
- Remove 5 unused tables (users, accounts, workspaces, links, relations)
- Keep only uload.clicks with indexes on link_id, clicked_at, country, device_type
- Simplify uload-database package from ~190 LOC to ~40 LOC
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extract TagColorPicker logic into generic ColorPicker that accepts custom
color palettes. TagColorPicker is now a thin wrapper. Add COLORS_12 and
COLORS_16 standard palettes for consistent color selection across all
modules (projects, folders, calendars, categories, etc.). 10 new tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Major refactor of ManaCore's (app) layout for guest mode support:
- New createGuestMode() composable in shared-stores — encapsulates
welcome modal state, nudge timer, and notifications in one call
- Replace monolith onMount with AuthGate + handleAuthReady callback:
Phase A (auth-independent): DB init, migration, uload, dashboard
Phase B (auth-dependent): sync, user settings, onboarding
Phase C (guest-only): welcome modal + registration nudge
- Root route / always redirects to /home (no auth check)
- PillNav shows login button for guests, user email for auth users
- GuestWelcomeModal with manacore-specific features
- SessionWarning only renders for authenticated users
- Proper cleanup via onDestroy
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FavoriteButton: reusable heart/star/pin toggle with filled/outline states,
accessible labels, configurable colors. toggleField: generic boolean field
toggle for Dexie records (isFavorite, isPinned, etc.) with timestamp.
Includes 11 tests (6 FavoriteButton + 5 toggleField).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Every module now has a tag junction table in IndexedDB and a tag store
with createTagLinkOps for consistent tag-entity linking. Tags are shared
globally via globalTags; each module only manages its own junctions.
New junction tables: eventTags, contactTags, conversationTags, deckTags,
zitareListTags, songTags, presiDeckTags, invItemTags, skillTags,
ccLocationTags, entryTags, documentTags, questionTags, mealTags,
plantTags, moodTags, guideTags.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Port missing features from standalone uload app to unified ManaCore module:
- Add Tag Management page (/uload/tags) with CRUD, color picker, inline edit
- Replace analytics placeholder with full server dashboard (timeline chart,
device/country/referrer breakdowns, graceful fallback when server unavailable)
- Add Settings page (/uload/settings) with data overview, JSON export, clear data
- Fix bugs: missing LocalTag type, unregistered uloadTags table, wrong table
name in AppView (linkFolders → uloadFolders)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Migrate 7 modules (picture, photos, storage, memoro, times, uload, todo)
from module-specific tag tables to the shared globalTags system. Each
module now reads tags from the global pool and keeps only its junction
table for entity-tag linking via createTagLinkOps.
Removed: pictureTags, photoTags, storageTags, memoroTags, timeTags,
uloadTags, labels tables from IndexedDB schema and SYNC_APP_MAP.
Kept: all junction tables (imageTags, photoMediaTags, fileTags, etc.)
pointing to globalTags IDs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reusable factory for tag-entity junction operations (addTag, removeTag,
setTags, getTagIds, hasTag) used by all modules. Also loosen ViewStore
filter constraint from Record<string, unknown> to object for interface
compatibility. Includes 14 tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Mirrors the frontend unification (single IndexedDB) on the backend.
All services now use pgSchema() for isolation within one shared database,
enabling cross-schema JOINs, simplified ops, and zero DB setup for new apps.
- Migrate 7 services from pgTable() to pgSchema(): mana-user (usr),
mana-media (media), todo, traces, presi, uload, cards
- Update all DATABASE_URLs in .env.development, docker-compose, configs
- Rewrite init-db scripts for 2 databases + 12 schemas
- Rewrite setup-databases.sh for consolidated architecture
- Update shared-drizzle-config default to mana_platform
- Update CLAUDE.md with new database architecture docs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace ~230 LOC of duplicated view store boilerplate with 20-line
factory calls. Both modules had identical copy-pasted implementations.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Generic factory that eliminates ~110 LOC boilerplate per module for
view mode, sort, filters, and saved filter presets with localStorage
persistence. Includes 23 tests covering all store operations.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace todo's custom 87-line TagSelector with thin wrapper around
shared-ui TagSelector. Replace inline tag chip HTML in TaskItem,
KanbanTaskCard, and PhotoDetailModal with shared TagChip component.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add compact inline TagChip for list items/cards (smaller than TagBadge).
Set up vitest with jsdom for shared-ui package and add 44 tests covering
TagChip, TagBadge, TagColorPicker, TagSelector, and constants.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the static app-grid home page with a workbench carousel where
each app renders as a paper-sheet page that can be minimized, maximized,
reordered, and resized:
- AppPage.svelte: paper-sheet shell with lazy-loaded app modules
- AppPagePicker.svelte: picker showing all 23 available apps
- App component registry: maps appId to dynamic AppView imports
- Horizontal fokus-track carousel with snap-scroll
- Edit FAB with width pills (S/M/L/XL)
- Minimized tabs bar for collapsed apps
- Drag-and-drop reordering + arrow buttons in edit mode
- Workbench state persisted to IndexedDB via shared-stores
- Default layout: Todo + Calendar + Contacts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the full-screen modal with a compact floating popover that
appears directly at the drag-to-create position in the week grid.
Includes title, time display, location field, and "Weitere Optionen"
link to expand into the full EventForm modal. Mobile: bottom sheet.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Delete jest.config.js (no jest dependency in any package.json, was dead config)
- Vitest is the sole test runner (already used by all packages)
- Raise coverage thresholds from 50% to 70% (lines, functions, branches, statements)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Create packages/shared-python/manacore_auth/ with:
- auth.py: API key validation, rate limiting, local + external auth
- external_auth.py: mana-core-auth remote validation with caching
- create_auth_dependency(scope): factory for per-service auth deps
Migrated services:
- mana-stt: auth.py now wraps shared auth with scope="stt" (272→42 LOC)
- mana-tts: auth.py now wraps shared auth with scope="tts" (272→42 LOC)
The only difference between services was the scope parameter ("stt" vs "tts").
Both external_auth.py files were 100% identical and are now thin re-exports.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- shared-auth-stores: delete createSupabaseAuthStore (zero usage across monorepo,
all apps use createManaAuthStore). Remove export + types from index.ts.
- services: move ollama-metrics-proxy (stub — just a Grafana dashboard JSON) and
it-landing (Astro landing page, not a service) to services-archived/
- lint-staged: add services-archived/ to eslint ignore pattern
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Wire up the minimize/restore/maximize flow for todo pages:
- Minimized pages appear as a floating tab bar at the bottom
- Each tab shows color dot + title, with maximize and close buttons
- Click tab title to restore, click arrows-out to maximize
- Tab bar has paper-sheet aesthetic matching the pages
- Plus button on tab bar opens page picker
- Tabs slide up with animation when pages are minimized
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Expand the minimal 6-field contact form to include all sections from
the old contacts app: name, contact (email/mobile/phone), work
(company/position/website), address (street/city/postal/country),
birthday, notes, and social media (collapsible). Add mobile, street,
city, postalCode, country, and social fields to the data model.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Port the paper-sheet pages system from standalone todo app into the
ManaCore unified app's todo module at mana.how/todo:
- Paper-sheet horizontal carousel with snap-scroll
- Edit FAB (pencil icon) toggles inline edit mode
- Custom pages with configurable filter rules (priority, date range, completed)
- PageEditBar with icon picker, filter pills, reorder arrows
- Width pills (S/M/L/XL) in edit mode
- PagePicker with preset pages + "Eigene Seite" creation
- Custom pages persisted to todoSettings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add unified /ws endpoint that serves all app notifications over a single connection.
The server now includes appId in the sync-available message payload so the client
knows which app to pull. Legacy /ws/{appId} endpoint remains for backward compatibility.
Backend (Go):
- hub.go: Message struct gains AppId field, NotifyUser sends to all user clients
(unified clients receive everything, legacy clients filtered by appId)
- main.go: new GET /ws route (empty appId = unified mode)
Frontend (sync.ts):
- Single connectUnifiedWs() replaces 27 per-app connectWs() calls
- Parses msg.appId from server to pull only the affected app
- Reconnect/offline logic simplified to one WS
This reduces WebSocket connections from 27 per user to 1, cutting server
connection overhead by ~96%.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Clock app source is preserved in apps-archived/ for reference.
This directory is excluded from the pnpm workspace.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Position DateStrip fixed above PillNav with glass blur effect.
Remove MiniCalendar sidebar to give calendar view full width.
Restore @clock/shared package from archive (needed by clock module).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>