Now with headless React hooks

Ship chat in your app
not next quarter

Real-time messaging API and SDK for your product. Drop in a widget or go fully headless — 5 lines to a working chat, 23 hooks for a custom UI.

No credit card required  ·  Free tier with 1,000 MAU forever

JDAKMRSLTn
Join 2,400+ developers already building with OpinioM
CP

Support Chat

Online

A

Hey! How can I help you today?

10:32 AM

I need help setting up the SDK

10:33 AM

A

Sure! I'll walk you through it. 🚀

10:33 AM

A

5 lines of code

to a working chat

Real-time WebSocket
Headless or drop-in
Your auth, zero migration
5 built-in locales
35 KB gzipped bundle
Integration

From npm install to live chat

Use your existing user database. Sign a JWT on your backend, pass it to the SDK, and chat works. No user migration, no separate auth system.

1

Install the SDK

npm install @opiniom/react

2

Sign a JWT

HS256-sign your user's ID on your backend, pass it to the SDK

3

Render or go headless

Use <ChatWidget /> for instant UI, or hooks for a fully custom design

Full integration guide
App.tsx
import { OpinioMProvider, ChatWidget } from '@opiniom/react';

function App() {
  return (
    <OpinioMProvider
      projectKey="ok_live_your_key"
      jwt={userJwt}
    >
      <YourApp />
      <ChatWidget />   {/* That's it. Chat is live. */}
    </OpinioMProvider>
  );
}
Platform

What you don't have to build

Every feature below is handled by OpinioM's backend. You write zero infrastructure code.

Real-time delivery

Messages arrive over a persistent WebSocket. Optimistic UI updates show messages instantly before server confirmation.

Headless or drop-in

Use the pre-built widget for quick setup, or go fully headless with React hooks to build any UI you need.

Framework-agnostic

React hooks, Lit web components, or vanilla JS. Works with Next.js, Vue, Svelte, and any stack that runs JavaScript.

Your auth, your users

No separate user database. Sign a JWT with your existing users and OpinioM handles the rest. Zero migration needed.

Webhooks + events

React to chat events in your backend. HMAC-signed webhook delivery with automatic retries and a delivery log.

Analytics built in

Message volume, active users, and conversation metrics — aggregated daily with CSV export.

Use cases

Build any chat experience

Your customers' apps are unique — their chat should be too. OpinioM gives you the real-time engine; you decide what it looks and feels like.

💬

Customer support

Embed a support widget in your app. Customers message your team directly — no Zendesk or Intercom needed.

🛒

Marketplace messaging

Buyers and sellers chat about orders. You control who can talk to whom — OpinioM handles real-time delivery.

👥

In-app collaboration

Team chat, project discussions, or collaborative workspaces. Groups, channels, and DMs out of the box.

Production-ready

Built for production

Security, reliability, and compliance from day one.

AES-256 encryption

Secrets encrypted at rest, JWTs signed with HS256

Auto-reconnect

Redis-backed WebSocket with exponential backoff

GDPR ready

Data erasure endpoint, no third-party data sharing

Multi-node scaling

Socket.io Redis adapter for horizontal scale

Developer experience

Designed for developer experience

TypeScript-first. Every hook, every event, every response is fully typed. No runtime surprises, no "any" types, no guessing at payload shapes.

23 React hooks — 12 for reading state, 11 for actions
Optimistic UI updates — messages appear before the server confirms
Auto-debounced typing — one hook call, we handle the rest
IndexedDB caching — instant load on return visits
35 KB core + 21 KB widget, gzipped
Works with SSR — safe to import in Next.js, Remix, SvelteKit
// Every hook returns typed data + loading/error state
const { messages, loadMore, hasMore } = useMessages(convId);
const { send, isLoading, error } = useSendMessage(convId);
const { onKeystroke, stopTyping } = useSetTyping(convId);
const typingUserIds = useTyping(convId);    // string[]
const presence = usePresence(userId);       // "online" | "away" | "offline"
const unread = useUnreadCount();            // number
const reactions = useReactions(messageId);  // { "👍": ["user_1"] }

// Actions return loading + error — no manual state management
const { upload, isLoading } = useUploadFile();
const { create } = useCreateConversation();
const { edit } = useEditMessage(convId);
const { remove } = useDeleteMessage(convId);
const { addReaction } = useAddReaction();
Pricing

Free to start. Transparent to scale.

Start with 1,000 monthly active users — no credit card, no time limit. Upgrade when you're ready.

Starter

Free

1,000 MAU, 50K messages/mo

Most popular

Pro

$49/mo

10,000 MAU, 500K messages/mo

Enterprise

$199/mo

Unlimited MAU, dedicated infra

Compare all plan features
Comparison

Why OpinioM?

Sendbird and Stream are built for enterprises. OpinioM is built for the rest of us.

FeatureOpinioMSendbirdStreamTalkJS
Free tier MAU1,0001,000 (30d trial)2,000500
Paid entry price$49/mo$399–499/mo$499/mo$199/mo
MAU at entry price10,0001,0001,000~5,000
Headless / hooks SDK✓ FullPartialPartial
No "contact sales"
Bundle size (gzipped)35 KB core100 KB+80 KB+60 KB+

Ready to ship chat?

Your team just added "in-app messaging" to the sprint. You have a choice: three months, or five minutes.

No credit card required · Free tier forever · Setup in 5 minutes