Support chat, error tracking, email, feedback, a changelog and feature flags, in one panel you host yourself. Ship as many apps as you like and run them all from the same place, instead of paying for six tools that each know a sixth of your product.
The demo is the real inbox with sample data: no sign-up, nothing saved. Runs on your own machines with docker compose up -d.
AAcmeMaya Chen
Each app you run is a project, and every project writes into the same inbox — colour-coded, filterable, one unread count. You are not signing in and out of four helpdesks.
Your users are already signed in to your app. Your server signs a short token and they are identified — no new account to make, no “please include your order ID”.
The chat attaches the page, record or item they were on when they wrote. It is sitting on the conversation before you have asked a single question.
Three steps. Your users never make an account, because they already have one with you — your server vouches for them with a token that lasts an hour.
One project per app. You get a public key pk_… that’s safe in a browser and a secret sk_… that never leaves your server. Set the name replies are signed with, the origins allowed to host the chat, and who gets emailed when someone writes.
One authenticated route on your server. Any JWT library works; here it is with none at all.
import { createHmac } from 'node:crypto'
// GET /api/support/token — only for a signed-in user of your app
export function mintSupportToken(user) {
const b64 = v => Buffer.from(JSON.stringify(v)).toString('base64url')
const now = Math.floor(Date.now() / 1000)
const head = b64({ alg: 'HS256', typ: 'JWT' })
const body = b64({ iss: process.env.HELP_BITES_PROJECT_KEY, sub: user.id, name: user.name, email: user.email, iat: now, exp: now + 3600 })
const sig = createHmac('sha256', process.env.HELP_BITES_SECRET).update(head + '.' + body).digest('base64url')
return head + '.' + body + '.' + sig
}A script tag and the function that fetches that token. That's the install.
<script src="/widget.js" data-project="pk_…" defer></script>
<script>
window.HelpBites = window.HelpBites || []
HelpBites.push(['init', {
getToken: () => fetch('/api/support/token').then(r => r.json()).then(r => r.token),
context: { type: 'page', id: location.pathname, label: document.title, url: location.href } // optional
}])
</script>Only the origins you listed can host it — anywhere else sees an error and never gets a token. Add data-mode="inline" with a target element and the same chat becomes a page of your app instead of a floating bubble.
The tour
Inbox
Reply as the team, leave notes the customer never sees, and see who they are and what broke for them without leaving the thread.

Errors
Connect GlitchTip or Bugsink and browse every issue with its stack trace, breadcrumbs and tags. Errors stay out of the inbox.

Feedback & roadmap
A public feedback page per project, and a private planning board behind it. Votes from linked posts add up on each card.

Changelog
Entries are drafted by AI from your GitHub commits or finished work, and wait for your review. Nothing is public until you approve it. When one ships, the people who asked for it hear about it.

A block designer that renders for Gmail, Apple Mail and Outlook, with an AI that turns pasted HTML into editable blocks.

Delivery
One entry per recipient, kept current by Mailgun. Bounces, complaints and unsubscribes are suppressed so you stop sending to them.

Flags
Off, on, or on for admins only, with an allow list. Your app reads them over the API, with a fallback for when we are unreachable.

And more
Connect a read-only key to see revenue, subscribers and each person’s payments next to their conversations.
Draft a privacy policy, terms, cookie and refund policy from reviewed clauses, then host them on a public page. A starting point for your lawyer, not legal advice.
OpenAI, Anthropic, Gemini, OpenRouter, Mistral, Groq, xAI, DeepSeek or any OpenAI-compatible endpoint. Off until you switch it on.
Send a project’s error alerts to a Telegram chat as well as email. HelpBites only sends.
Upload an FAQ and let an assistant answer from it, with routing rules that hand the rest to a person.
A native app for the inbox, the email editor and most of the panel, with push notifications.
Every feature
One script tag, no dependencies, about 10 KB.
One panel, however many apps and teammates.
Users tell you what to build. You tell them what shipped.
Off until you turn it on. Grounded in your docs when it is on.
Design once, brand per project, send from your server, see every delivery.
Roles, error tracking and flags that sit next to support.
A person reads it, and a person answers.
AI is off until you switch it on for an assistant, and when it is on it answers only from the knowledge you gave it. No bot in the way by default, no “did that answer your question?”, no deflection funnel measured in tickets avoided. For most products, a chat window with a human on the other end is the entire feature.
One docker compose up -d brings up the app, Mongo, Parse and Redis. Attachments go to any S3-compatible bucket you point it at. Your users’ conversations stay on infrastructure you control. Nothing phones home; the only outside services are the ones you connect, such as Mailgun or an LLM.
The widget is a convenience, not the product. Everything it does is on the API, and the API is documented down to the response shapes — build your own chat UI on it if you’d rather.
/v1/conversationsList/v1/conversationsStart one/v1/conversations/:id/messagesTranscript/v1/conversations/:id/messagesSend/v1/messages/:idUnsend/v1/attachmentsMultipart file/v1/eventsServer-sent eventsClick around the real panel with sample data, or run it yourself with one command.