mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-15 22:19:40 +02:00
- 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>
259 lines
7.1 KiB
Markdown
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)
|