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

📖 Миграция v2.4 → v3.0 →

📖 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! 🔐');
View Full Documentation →