v1.0 · @pocketping/react shipped today

Reply to your visitors
from your phone,
not from yet another
dashboard.

PocketPing is an open-source chat widget. Each teammate replies from the messaging app they already use — one on Telegram, one on Slack, one on Discord — and replies sync to the visitor across all of them. No operator dashboard required.

$npm i @pocketping/widget
live · 4:32 PM · iOS · Telegram
4:32
Acme Supportnow
visitor-7c2a · /pricing
Hi — what plan fits a 3-person team?
AC
Acme Support
3 topics · 1 online
forum
visitor-7c2a/pricing
Paris · Chrome · macOS · returning
Hi — what plan fits a 3-person team?
Hey 👋 Pro covers up to 5 seats, $25/mo. ✓✓
Reply in topic…
each visitor → its own forum topic
Team · Channels

Your team. Your apps.

Bob replies from Telegram. Alice prefers Slack. Marketing watches the inbox in HubSpot. One conversation, native sync — and the visitor only ever sees the widget.

Native · OSS
Telegram
one forum topic per visitor
Reply on your phone, mute by topic, attachments included.
Native · OSS
Discord
forum channel thread per visitor
Each visitor lands as a thread in your support channel.
Native · OSS
Slack
threaded reply in #support
Routes visitor messages to the channel the CS team already lives in.
Hosted
HubSpot
conversation inbox on pocketping.io
Pulled into HubSpot via the hosted SaaS — keep CRM context next to chat.
Edit a message in Slack → it updates in Telegram and in the widget.
Reply from Discord → the visitor sees it instantly, no matter which bridge you used.
Add a teammate, pick their bridge. They join the same thread, on their own app.
Every event is also a webhook → pipe new chats and messages to Zapier, Make, n8n, or your backend.
Run !commands from your bridge — on-demand screen capture out of the box, plus a tiny registry to add your own.
Connect the MCP server → triage and answer chats straight from Claude or Cursor.
01 · Deploy

Three deployment shapes. Same widget API.

Start serverless. Move to the Go bridge later. Or skip both and embed the SDK in your own backend. The widget never knows the difference.

/liteFree

Serverless lite

Cloudflare Worker + KV

Zero database. Zero servers. A free Worker relays chat between your widget and a Telegram group where each visitor gets its own forum topic.

  • 60sone-click deploy from GitHub
  • $0fits in the Workers free tier
  • KVstate lives in Cloudflare KV
Deploy to Cloudflare
/bridgeSelf-hosted

Go bridge-server

docker run · one binary

A single Go binary that bridges your widget to Telegram, Discord and Slack at once. Full features — attachments, edit/delete, AI fallback, cross-bridge sync.

  • Dockeror any platform that runs Linux
  • SSElong-lived stream to the widget
  • Redisoptional, in-memory by default
Read the deploy guide
/sdkIn your backend

SDK integration

Node · Python · Go · PHP · Ruby

A library you mount into your existing backend. You own the routes, the database and the deploy. We provide the handlers and the bridges.

  • 5 langsExpress · FastAPI · Gin · Laravel · Rails
  • HookshandleConnect, handleMessage, handleEdit
  • BYO DBPostgres, sqlite, Mongo — your call
Browse the SDKs
02 · Integrate

Five lines.
One script tag, or one provider.

Drop the widget on your site, point it at your endpoint, and the chat opens in the corner. Same call signature whether the endpoint is the lite Worker, the bridge-server, your own backend, or the hosted SaaS.

1Pick a deploy mode (lite / bridge / SDK)
2Wire your Telegram / Discord / Slack bot
3Drop the widget — done
index.html
<script src="https://cdn.pocketping.io/widget.js"></script>
<script>
  PocketPing.init({
    endpoint: 'https://your-worker.workers.dev',
    operatorName: 'Acme Support',
  });
</script>
05 lines · valid + runnablewidget · ~60 kB gz
backend · express
import express from 'express';
import { PocketPing, TelegramBridge } from '@pocketping/sdk-node';

const pp = new PocketPing({
  bridges: [new TelegramBridge(process.env.TG_TOKEN!, process.env.TG_CHAT!)],
});

express()
  .use(express.json())
  .use('/pocketping', pp.middleware())
  .listen(3000);
03 · Why phone-first

You already keep your phone unlocked.
You don’t keep a dashboard open.

most chat widgetsintercom · crisp · drift
  • A separate dashboard you have to keep open
    Another browser tab, another desktop app, another login.
  • Their mobile app, not the one in your dock
    One more notification source competing for attention.
  • $29–$139/seat/month before you’ve talked to anyone
    Pricing meters scale with team size, not conversation volume.
  • Conversations live on their servers
    Closed source. Export your data when you can find the menu.
pocketpingtelegram · discord · slack
  • Reply from the messaging app you already use
    Each visitor becomes a Telegram forum topic, a Discord thread, or a Slack thread.
  • Notifications you’ve already triaged how to handle
    No new app on the home screen. No new badge to ignore.
  • Free on the Cloudflare Workers tier
    Or self-host the bridge-server. Or embed the SDK. Same widget.
  • MIT-licensed. Your data, your infra
    Self-host every byte. Fork the repo. Patch the widget.
04 · Architecture

Lite mode, end to end.

The widget speaks SSE to a Cloudflare Worker. The Worker speaks HTTP to the Telegram Bot API. State (visitor ↔ forum topic) lives in a KV namespace.

HTTP / SSE
visitor ↔ worker, long-lived stream
bridge call
worker → telegram bot api
KV namespace
visitor_id → forum_topic_id
webhook
telegram → worker, operator reply
05 · Pick a mode

Same widget, three trade-offs.

option 1 · /saas
SaaS
we host it
pocketping.io
option 2 · /bridgerecommended
Bridge-server
docker run
self-hosted
option 3 · /sdk
SDK in your backend
embed the lib
self-hosted
Setup time
minutes
Setup time
30–60 min
Setup time
1h+
Infra to manage
none
Infra to manage
1 container
Infra to manage
full stack
Customization
low
Customization
medium
Customization
full
Data residency
our cloud
Data residency
your box
Data residency
your box
Marginal cost
metered
Marginal cost
~zero
Marginal cost
~zero
06 · vs the field

The honest comparison.

channel = the tool ingests the app into its own inbox. native = you reply where you already are. native* (Intercom Slack) = reply from Slack supported, but Intercom remains the inbox.

Feature
PocketPing
MIT · OSS
Intercom
SaaS
Crisp
SaaS
Chatwoot
MIT · OSS
Tawk.to
SaaS
PricingFree / OSS$29+/seat/moFree / $45+/moFree / $19+/seatFree
Self-hosted
Reply from Telegramnativechannelchannelchanneladd-on
Reply from Discordnativechannel
Reply from Slacknativenative*add-onchannel
Cross-bridge sync
Bidirectional eventsoutbound onlyrule-basedrequested (4 yr)
Webhooks (events API)✓ HMACpaid✓ HMAC
MCP server (AI agents)✓ OSScommunity
AI fallbackBYO keyFin AIHugoCaptainAI Assist
AI cost per conv.~$0.001$0.99$0.05–0.10$0.02$0.02–0.03
LicenseMITclosedclosedMIT (CE)closed
AI economics

AI fallback at OpenAI's price. Not ours.

Bring your own OpenAI / Anthropic / Gemini key — PocketPing routes to it directly, no markup. With GPT-4o-mini, a typical resolution runs about $0.0004. Intercom Fin AI is $0.99 per outcome, no cap.

cost @ 1,000 conversations / month
Intercom Fin$990
Crisp Hugo$50–100
Tawk AI Assist$29–99
Chatwoot Captain~$20
PocketPing · BYO key~$0.40
Product-led growth

Events go both ways. Real-time, custom, scriptable.

The widget emits product events. Your server broadcasts UI events back. No other OSS chat widget ships this — Chatwoot has had the request open for 4 years.

widget → server
pp.emit('viewed_pricing')
pp.emit('cart_abandoned')
pp.emit('trial_day_13')
server → widget
broadcast('show_demo_offer')
broadcast('open_chat_proactive')
broadcast('highlight_pricing')

* Pricing snapshot from public pricing pages as of Nov 2026 — verified against each vendor's docs. AI cost per conv. = Intercom Fin AI ($0.99/outcome), Crisp Hugo ($0.05–0.10/conv), Chatwoot Captain ($20 / 1k credits), Tawk AI Assist ($29 / 1k msgs), PocketPing = direct OpenAI / Anthropic / Gemini pricing (varies by model and prompt size, GPT-4o-mini ≈ $0.0004 / resolution). Bidirectional events: Intercom Outbound fires on rule-based triggers (paid plans); Crisp triggers are declarative (fire on condition); Chatwoot's open request #2995 dates from 2021; Tawk's `onChatMessageSystem` is chat-bound only.