Dashboard
✨ v3.0.0 Production
Messages This Month
0
of 1,000 messages
Days Remaining
30
until limit reset
Registered Projects
0
of 3 max (Free)
🔌
Relay Connection
Required for messaging to work
Checking...
🏗️
How This Works (v3.0)
Three trusted roles:
- SDK (your client) — Encrypts/decrypts. Never stores plaintext.
- Backend (this server) — Verifies crypto proofs, stores audit log.
- Relay — Routes encrypted messages (HTTP protocol, not WebSocket).
- Dashboard — Shows verified metrics only (read-only)
⚠️ The relay is untrusted — it cannot decrypt messages or forge metrics.
⚙️
v3.0: Storage Adapters Required (Prod)
Production mode hard-fails without these:
| Adapter | Purpose | Example |
| ReplayCache | Prevent replayed messages | Redis (5 min TTL) |
| TofuStore | Verify peer fingerprints | PostgreSQL |
| SessionStore | Persist encrypted state | PostgreSQL |
| IdentityStore | Store identity keypair | OS Keychain / KMS |
⚠️ Dev mode is optional and warns only. See docs for implementation examples.
🔑 API Keys
Generate keys for your projects. Each key is unique and can be revoked anytime.
🚀 Upgrade to Pro
Unlock unlimited messages and premium features.
✓ Unlimited messages
✓ 10 projects
✓ Priority support
✓ Custom relay server
✨
New in v3.0.0: Полностью переписанный крипто-модуль
- 0 внешних зависимостей: Только Node.js built-in
crypto— libsodium удалён - ECDSA P-256 подписи: Настоящие цифровые подписи SPK вместо HMAC
- AES-256-GCM + AAD: Заголовок аутентифицируется как associated data
- Symmetric X3DH: Обе стороны получают идентичный секрет
- 23 теста: Все проходят — X3DH, ECDSA, Double Ratchet, forward secrecy
📖 Quick Start (v3.0.0)
Production-ready E2EE — Signal Protocol на Node.js crypto. 0 внешних зависимостей.
import { createApp } from '@stvor/sdk';
import { RedisReplayCache } from './adapters';
const app = await createApp({
appToken: 'YOUR_API_KEY',
relayUrl: 'http://localhost:3002',
storageAdapters: {
replay: new RedisReplayCache(),
sessions: postgresSessionStore,
tofu: postgresTofuStore,
identity: keystoreIdentity
},
productionMode: true // Required!
});
const user = await app.connect('user@example.com');
await user.send('peer@example.com', 'E2EE! 🔐');