Gate the "Shared from your device" label and the hidden download affordance on whether this device actually holds the file bytes, not on whether the current user uploaded it. uploaderPeerId is the user id, so the old check claimed ownership on every device of the uploader, blocking view/download on second devices that only synced metadata. Also include attachment metadata in the account_sync chat-sync-batch so sibling devices learn about synced attachments at all. Co-authored-by: Cursor <cursoragent@cursor.com>
Product Client
Angular 21 renderer for MetoYou / Toju. This package is managed from the repository root, so the main build, test, lint, and Electron integration commands are run there rather than from a local package.json.
Commands
npm run startstarts the Angular dev server.npm run buildbuilds the client todist/client.npm run watchruns the Angular build in watch mode.npm run testruns the product-client Vitest suite.npm run lintruns ESLint across the repo.npm run formatformats Angular HTML templates.npm run sort:propssorts Angular template properties.npm run electron:devornpm run devruns the client with Electron.
Structure
| Path | Description |
|---|---|
src/app/domains/ |
Bounded contexts and public domain entry points |
src/app/infrastructure/ |
Shared technical runtime such as persistence and realtime |
src/app/shared-kernel/ |
Cross-domain contracts and shared models |
src/app/features/ |
App-level composition and transitional feature shells |
src/app/core/ |
Platform adapters, compatibility entry points, and cross-domain technical helpers |
src/app/shared/ |
Shared UI primitives and utilities |
src/app/store/ |
NgRx reducers, effects, selectors, and actions |
public/ |
Static assets copied into the Angular build |
Key Docs
- src/app/domains/README.md
- src/app/shared-kernel/README.md
- src/app/infrastructure/persistence/README.md
- src/app/infrastructure/realtime/README.md
- ../docs/architecture.md
- AGENTS.md
Notes
angular.jsondefines build, serve, and lint targets for the product client.- Product-client tests currently run through the root Vitest setup instead of an Angular
testarchitect target. - If the renderer-to-desktop contract changes, update the Angular bridge, Electron preload API, and IPC handlers together.