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

1

Register Your Key

Register a public key with emb.chat. Your private key never leaves your backend.

2

Sign a Chat Token

Your backend signs a chat token for each user with the matching private key.

3

Connect & Chat

Clients connect with the token, emb.chat verifies it locally, and users exchange messages and presence in real time.

4

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