Files
Synapsis/SWARM_CHAT.md
T
Christomatt 6b8eeb6814 feat(chat): Implement end-to-end encrypted swarm messaging system
- Add Swarm Chat documentation with architecture, API endpoints, and security considerations
- Create database schema for chat conversations, messages, and typing indicators
- Implement chat API endpoints for sending, receiving, and managing messages
- Add client-side encryption utilities using RSA-OAEP with SHA-256
- Create chat page UI for viewing conversations and messages
- Add chat type definitions for TypeScript support
- Update database schema with new chat tables and relationships
- Update sidebar navigation to include chat link
- Enable true end-to-end encrypted messaging across swarm nodes without ActivityPub limitations
2026-01-26 20:00:17 +01:00

161 lines
4.5 KiB
Markdown

# Swarm Chat
A real-time, end-to-end encrypted chat system built exclusively for the Synapsis Swarm network.
## Features
- **End-to-End Encryption**: Messages are encrypted using recipient's public key
- **Cross-Node Messaging**: Chat with users on any Synapsis node
- **Real-Time Delivery**: Messages delivered instantly via swarm inbox
- **Read Receipts**: See when messages are delivered and read
- **Typing Indicators**: Know when someone is typing (coming soon)
- **No ActivityPub Limitations**: Built specifically for swarm, not constrained by AP spec
## Architecture
### Database Schema
**chat_conversations**: Tracks conversations between users
- Stores participant info and last message preview
- Unique constraint ensures one conversation per user pair
**chat_messages**: Individual encrypted messages
- Content encrypted with recipient's public key
- Swarm message ID for deduplication
- Delivery and read status tracking
**chat_typing_indicators**: Real-time typing status (future)
### API Endpoints
**POST /api/swarm/chat/send**
- Send a message to any user (local or remote)
- Encrypts content with recipient's public key
- Delivers to remote nodes via swarm inbox
**POST /api/swarm/chat/inbox**
- Receives messages from other swarm nodes
- Validates and stores encrypted messages
- Updates conversation metadata
**GET /api/swarm/chat/conversations**
- Lists all conversations for current user
- Includes unread counts and last message preview
**GET /api/swarm/chat/messages**
- Fetches messages for a conversation
- Supports cursor-based pagination
- Returns encrypted content for client-side decryption
**PATCH /api/swarm/chat/messages**
- Marks messages as read
- Updates read receipts
### Encryption
Messages are encrypted using RSA-OAEP with SHA-256:
1. **Sending**: Message encrypted with recipient's public key
2. **Storage**: Only encrypted content stored in database
3. **Decryption**: Client-side decryption using user's private key
This ensures true end-to-end encryption - even the server cannot read messages.
## Usage
### Starting a Chat
```typescript
// Send a message to start a conversation
await fetch('/api/swarm/chat/send', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
recipientHandle: 'user@remote.node',
content: 'Hello!',
}),
});
```
### Receiving Messages
Messages are automatically received via the swarm inbox endpoint. The system:
1. Validates the sender and recipient
2. Checks for duplicate messages
3. Creates or updates the conversation
4. Stores the encrypted message
5. Returns success to the sender
### Client-Side Decryption
```typescript
import { decryptMessage } from '@/lib/swarm/chat-crypto';
// Decrypt a message using user's private key
const plaintext = decryptMessage(
message.encryptedContent,
userPrivateKey
);
```
## Security Considerations
1. **Private Key Storage**: User private keys should be encrypted at rest
2. **Key Derivation**: Consider using password-based key derivation
3. **Forward Secrecy**: Future enhancement - implement Signal protocol
4. **Message Signing**: Verify sender authenticity with signatures
5. **Rate Limiting**: Prevent spam and abuse
## Future Enhancements
- [ ] Group chats (multi-party encryption)
- [ ] Voice/video calls (WebRTC)
- [ ] File attachments (encrypted)
- [ ] Message reactions
- [ ] Message editing/deletion
- [ ] Typing indicators (real-time)
- [ ] Online/offline status
- [ ] Push notifications
- [ ] Desktop notifications
- [ ] Message search
- [ ] Conversation archiving
- [ ] Block/mute users
- [ ] Forward secrecy (Signal protocol)
## Migration
Run the migration to create the chat tables:
```bash
npm run db:generate
npm run db:migrate
```
## Testing
Test the chat system:
1. Create two accounts on different nodes
2. Navigate to `/chat` on one account
3. Click "New Chat" and enter the other user's handle
4. Send a message
5. Check the other account's `/chat` page
## Differences from ActivityPub DMs
Traditional ActivityPub direct messages are just posts with limited visibility. Swarm Chat is superior:
- **True E2E Encryption**: Not possible with ActivityPub
- **Real-Time**: Direct delivery, no polling required
- **Proper Chat UX**: Conversations, read receipts, typing indicators
- **Lightweight**: No heavyweight ActivityPub overhead
- **Swarm-Native**: Built for the swarm, not retrofitted
## Contributing
Contributions welcome! Priority areas:
- Client-side encryption implementation
- Real-time updates (WebSocket/SSE)
- Mobile-responsive UI improvements
- Group chat support