emb.chat Embeddable Real-Time Chat Your Backend Already Trusts
A self-hosted real-time chat service for your app. emb.chat handles messaging, presence, typing and channels. Your backend signs the auth tokens, and your services receive events as signed webhooks. It moves messages and leaves identity and business logic with you.
Features
Real-Time Messaging
Typed message events over WebSocket for new, edited, and deleted messages, with cursor-paginated history and soft deletes.
Presence & Typing
Online and offline status on a 15-second heartbeat, last-seen tracking, and typing indicators that stop automatically.
Role-Based Channels
Direct, group, and admin-created channels with owner, admin and member roles. Direct channels between two users are idempotent.
Flexible Group Modes
Choose external, internal, or hybrid group management per app, with per-channel locking.
Your Own Auth
Tokens are signed with RS256 or EdDSA using your private key. emb.chat only holds the public key, so it can verify tokens but never create them.
Signed Webhooks
HMAC-SHA256 signed deliveries with automatic retries, per-event delivery logs, and offline-member data for push notifications.
How It Works
Register Your Key
Register a public key with emb.chat. Your private key never leaves your backend.
Sign a Chat Token
Your backend signs a chat token for each user with the matching private key.
Connect & Chat
Clients connect with the token, emb.chat verifies it locally, and users exchange messages and presence in real time.
Receive Events
Events arrive at your endpoints as signed webhooks. Deploy everything with a single Docker Compose file.
Ship Real-Time Chat This Week
Messaging, presence and channels for your app. Identity and business logic stay in your backend.
Start Building