managarten/apps/matrix/CLAUDE.md
Till-JS 352070fb2f docs(auth): add SSO documentation and test credentials
- Document cross-domain SSO with COOKIE_DOMAIN configuration
- Add production test credentials for automated testing
- Explain cookie-based SSO flow across *.mana.how subdomains

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 04:09:07 +01:00

259 lines
7.1 KiB
Markdown

# Manalink
Secure Matrix messaging client - a bridge to decentralized communication.
**Production URL:** https://link.mana.how
## Project Overview
Manalink is a privacy-focused Matrix client built with SvelteKit. It connects to Matrix homeservers (default: matrix.mana.how) and supports PWA installation for mobile devices.
### Tech Stack
| Layer | Technology |
|-------|------------|
| Frontend | SvelteKit 2, Svelte 5 (runes), Tailwind CSS 4 |
| Matrix SDK | matrix-js-sdk + matrix-sdk-crypto-wasm |
| State Management | Svelte 5 runes ($state, $derived) |
| Icons | @manacore/shared-icons (Phosphor) |
| PWA | @vite-pwa/sveltekit + Workbox |
| Date Handling | date-fns |
## Project Structure
```
apps/matrix/
├── apps/
│ └── web/ # SvelteKit web client (PWA)
│ ├── src/
│ │ ├── routes/
│ │ │ ├── (auth)/ # Login flow
│ │ │ ├── (app)/ # Protected chat routes
│ │ │ └── health/ # Health check endpoint
│ │ └── lib/
│ │ ├── matrix/ # Matrix SDK integration
│ │ │ ├── store.svelte.ts # Reactive Matrix store
│ │ │ ├── client.ts # Login/auth functions
│ │ │ ├── crypto.ts # E2EE utilities
│ │ │ ├── types.ts # TypeScript types
│ │ │ └── polyfills.ts # Browser polyfills
│ │ └── components/
│ │ ├── chat/ # Chat UI components
│ │ ├── call/ # VoIP call components
│ │ └── crypto/ # E2EE verification UI
│ ├── static/ # PWA icons and assets
│ ├── scripts/
│ │ └── generate-icons.mjs # Icon generation script
│ └── package.json
└── packages/
└── shared/ # Shared types
```
## Development
```bash
# Start the web client
pnpm dev:matrix:web
# Or from monorepo root
pnpm matrix:dev
# Generate PWA icons (after changing favicon.svg)
cd apps/matrix/apps/web && node scripts/generate-icons.mjs
```
The client runs on **http://localhost:5180**
## PWA Features
Manalink is a Progressive Web App with:
- **Installable** on iOS/Android homescreen
- **Offline support** via Service Worker caching
- **Push notifications** (Web Push API)
- **App shortcuts** for quick actions
### Caching Strategy
| Content | Strategy | TTL |
|---------|----------|-----|
| Matrix API | NetworkFirst | 5 min |
| Images/Avatars | CacheFirst | 30 days |
| Fonts | CacheFirst | 1 year |
| App Shell | StaleWhileRevalidate | - |
### Installation
1. Open https://[your-domain] in a mobile browser
2. Tap "Add to Home Screen" (iOS) or install prompt (Android/Chrome)
3. Launch from homescreen for fullscreen app experience
## Key Files
### Matrix Store (`src/lib/matrix/store.svelte.ts`)
Central reactive store using Svelte 5 runes:
```typescript
import { matrixStore } from '$lib/matrix';
// State
matrixStore.syncState // 'STOPPED' | 'PREPARED' | 'SYNCING' | etc.
matrixStore.isReady // boolean - client ready for use
matrixStore.rooms // SimpleRoom[] - all rooms
matrixStore.messages // SimpleMessage[] - current room messages
matrixStore.currentRoom // Room | null - selected room
// Actions
await matrixStore.initialize(credentials);
matrixStore.selectRoom(roomId);
await matrixStore.sendMessage('Hello!');
await matrixStore.sendTyping(true);
matrixStore.logout();
```
### Login Client (`src/lib/matrix/client.ts`)
```typescript
import { loginWithPassword, checkHomeserver } from '$lib/matrix';
const result = await loginWithPassword('matrix.mana.how', 'user', 'password');
if (result.success) {
await matrixStore.initialize(result.credentials);
}
```
## Features
### Phase 1 (Current)
- [x] Password login + SSO (Mana Core)
- [x] Room list (DMs and groups)
- [x] Message timeline with pagination
- [x] Send text messages
- [x] Typing indicators
- [x] Read receipts
- [x] Unread/highlight counts
- [x] Room creation
- [x] Room settings
- [x] Message search
- [x] PWA support
### Phase 2 (In Progress)
- [ ] End-to-end encryption (E2EE)
- [ ] File/image uploads
- [ ] Message editing/deletion
- [ ] User search/invite
- [ ] Message reactions
### Phase 3 (Future)
- [ ] VoIP calls (WebRTC)
- [ ] Video calls
- [ ] Screen sharing
- [ ] Capacitor native wrapper
## Configuration
### Environment Variables
No environment variables required for basic usage. The client stores credentials in localStorage.
### Default Homeserver
The login page defaults to `matrix.mana.how` but any Matrix homeserver can be used.
### Test Account
For testing the SSO login flow:
- **Email:** t@t.de
- **Password:** test1234
- **Auth URL:** https://auth.mana.how
- **Matrix Homeserver:** matrix.mana.how
- **Web Client:** https://link.mana.how
## Matrix SDK Notes
### Browser Polyfills
matrix-js-sdk requires polyfills for browser usage. These are automatically loaded in `src/lib/matrix/polyfills.ts`:
- `Buffer` from buffer package
- `global` mapped to `globalThis`
- `process.env` stub
### Vite Configuration
Special Vite config for Matrix SDK + PWA:
```typescript
// WASM headers for crypto
server: {
headers: {
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'require-corp',
},
},
// PWA plugin
plugins: [
SvelteKitPWA({
registerType: 'autoUpdate',
manifest: { ... },
workbox: { ... },
}),
],
```
### Client-Side Only
matrix-js-sdk only works client-side. Always guard with:
```typescript
import { browser } from '$app/environment';
if (browser) {
await matrixStore.initialize();
}
```
## Troubleshooting
### Can't see the login page / stuck on loading
The app auto-logs in if credentials are stored in localStorage. To reset:
1. **Browser console method:**
```javascript
localStorage.removeItem('matrix_credentials');
location.reload();
```
2. **Direct URL:** Navigate to `https://link.mana.how/login` directly
3. **If logged in:** Use the logout button in settings or navigation
### "super.off is not a function"
This is a known issue with typed-event-emitter. Make sure polyfills are loaded before any matrix-js-sdk imports.
### Login fails with network error
1. Check if homeserver is reachable: `curl https://matrix.mana.how/_matrix/client/versions`
2. Verify CORS is configured on Synapse
3. Try without https:// prefix in homeserver field
### Messages not loading
The initial sync can take time depending on room history. Check `matrixStore.syncState` for status.
### PWA not installing
1. Ensure HTTPS is enabled
2. Check manifest.json is served correctly
3. Verify icons exist at specified paths
4. Check DevTools > Application > Manifest for errors
## Related Documentation
- [Matrix Client-Server API](https://spec.matrix.org/latest/client-server-api/)
- [matrix-js-sdk docs](https://matrix-org.github.io/matrix-js-sdk/)
- [Synapse Admin API](https://element-hq.github.io/synapse/latest/admin_api/)
- [Vite PWA Plugin](https://vite-pwa-org.netlify.app/frameworks/sveltekit.html)