mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 19:41:09 +02:00
Mirror of github.com/Memo-2023/mana-monorepo
The SYNC_DEBUG.md runbook tries to inspect window.unifiedSync from DevTools to figure out why pending changes aren't flushing on mana.how. The script can't work because (a) the unified sync instance is never exposed on window and (b) the two most likely failure modes — push for an unknown appId, getToken() returning null — both `return` silently with no error, no telemetry, no state change. The pending count climbs and there's nothing in the console to point at the cause. This commit makes those failures visible: push() unknown appId When a pending change lands for an appId that isn't in the registered channels map (almost always a registry/migration drift like renaming an appId without migrating the existing pending rows) we now log a warning that names the offending appId, lists the known ones for comparison, and emits a push:error telemetry event with errorCategory='unknown-appid'. The pending rows for that appId would otherwise accumulate forever — same symptom as the SYNC_DEBUG report. push() no token getValidToken() can return null if the local exp check failed and the refresh-on-online retry didn't yield a new token. This was the silent path that was hardest to diagnose: the existing health-check telemetry only fires after a successful fetch, so there was no signal at all. We now log a warning, set channel.lastError = 'no-token', flip status to 'error' and emit push:error with errorCategory='no-token'. sync-telemetry.ts Widens the errorCategory union to include 'no-token' and 'unknown-appid' so the new emits type-check. getDebugInfo() New method on the createUnifiedSync return value. Returns a flat, JSON-serializable snapshot of every channel's state (status, online, clientId, serverUrl, channels[appId] with lastError + timer flags, plus knownAppIds at top level) so the SYNC_DEBUG runbook (Schritt C) can compare what the server is being asked to sync vs. what's actually sitting in _pendingChanges. (app)/+layout.svelte Exposes the live unified-sync instance on window.__unifiedSync in the browser. Not a security concern: every method on the returned object is also reachable via Dexie + a fresh fetch from the same DevTools console, and a malicious user can't escalate anything by poking at it. This is the global the SYNC_DEBUG Schritt C script needs to exist. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .changeset | ||
| .claude | ||
| .github | ||
| .husky | ||
| apps | ||
| docker | ||
| docs | ||
| games/arcade | ||
| load-tests | ||
| NewAppIdeas/Roblox Reimagined | ||
| packages | ||
| patches | ||
| scripts | ||
| services | ||
| tests | ||
| .dockerignore | ||
| .editorconfig | ||
| .env.development | ||
| .env.macmini.example | ||
| .env.secrets.example | ||
| .gitignore | ||
| .npmrc | ||
| .nvmrc | ||
| .prettierignore | ||
| .prettierrc.json | ||
| CLAUDE.md | ||
| cloudflared-config.yml | ||
| docker-compose.dev.yml | ||
| docker-compose.macmini.yml | ||
| docker-compose.test.yml | ||
| eslint.config.mjs | ||
| gift-codes-2026-02-14.txt | ||
| lint-staged.config.js | ||
| package.json | ||
| playwright.config.ts | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| TROUBLESHOOTING.md | ||
| turbo.json | ||
| vitest.config.ts | ||
Mana Monorepo
Monorepo containing all Mana projects — a self-hosted multi-app ecosystem with shared packages and unified tooling.
Projects
| Project | Description | Apps |
|---|---|---|
| mana | Multi-app ecosystem platform | Expo mobile, SvelteKit web |
| chat | AI chat application | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| todo | Task management | NestJS backend, SvelteKit web, Astro landing |
| calendar | Calendar & scheduling | NestJS backend, SvelteKit web, Astro landing |
| clock | Pomodoro & time tracking | NestJS backend, SvelteKit web, Astro landing |
| contacts | Contact management | NestJS backend, SvelteKit web |
| picture | AI image generation | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| cards | Card/deck management | NestJS backend, Expo mobile, SvelteKit web |
| zitare | Daily inspiration quotes | NestJS backend, Expo mobile, SvelteKit web, Astro landing |
| mukke | Music player | NestJS backend, SvelteKit web |
| planta | Plant care tracker | NestJS backend, SvelteKit web |
| storage | Cloud storage | NestJS backend, SvelteKit web |
| questions | Q&A with web search | SvelteKit web |
| skilltree | Skill tree visualization | NestJS backend, SvelteKit web |
| nutriphi | Nutrition tracking | NestJS backend, SvelteKit web |
| citycorners | City guide | NestJS backend, SvelteKit web, Astro landing |
| presi | Presentation tool | NestJS backend, SvelteKit web |
| photos | Photo management | NestJS backend, SvelteKit web |
Getting Started
Prerequisites
- Node.js 20+
- pnpm 9.15.0+
- Docker (for PostgreSQL, Redis, MinIO)
Installation
pnpm install
Development
# Start infrastructure (PostgreSQL, Redis, MinIO)
pnpm docker:up
# Start any app with auto DB setup
pnpm dev:chat:full
pnpm dev:todo:full
pnpm dev:calendar:full
pnpm dev:contacts:full
# Build & quality
pnpm run build
pnpm run type-check
pnpm run format
See CLAUDE.md for comprehensive development documentation.
Architecture
mana-monorepo/
├── apps/ # Product applications
├── services/ # Microservices (auth, search, LLM, bots)
├── packages/ # Shared packages
├── docker/ # Docker configuration
└── scripts/ # Development & deployment scripts
Tooling
- Package Manager: pnpm 9.15.0
- Build System: Turborepo
- Formatting: Prettier (tabs, single quotes, 100 char width)
- Hosting: Mac Mini (self-hosted) via Docker + Cloudflare Tunnel
- Analytics: Umami (stats.mana.how)
License
Private - All rights reserved