Open source · MIT · npm

Your helpdesk, inside your app.

Quickstart$npm install better-helpdesk pg

An open-source support inbox, ticketing and lightweight CRM you install from npm. It runs in your Next.js app, on your Postgres, behind your login.

■ Mira Okafor is waiting · ACME-1042hover a face
MITno paid features in the package
4runtime dependencies
Postgres 14+a helpdesk schema in yours
Next.js 15+React 19, Node 20

One inbox for every conversation.

Widget, email and CRM, inside the app your team already signs in to.

4 conversations waiting
All inboxesAssigned to meUnassignedHigh & urgent · 2
Sort: Longest waiting
ConversationWaiting
jk move · ↵ open
agent-reminderto jonas@harbor.test
ACME-1036 has waited 26 hours

Kofi Mensah · Rechnung als PDF auf Deutsch?

Every conversation in one queue, with a reference like ACME-1042, a priority and a reminder email before anyone waits too long. Try j and k.

Recreated from <HelpdeskAdmin /> with its real labels and demo data, themed through --helpdesk-* custom properties.

It mounts. It doesn't deploy.

One route handler, one React component, one widget. Your session decides who is a customer and who is on the team.

your Next.js app
  1. <HelpdeskWidget />widget/*
  2. route.tsinbound · jobs
  3. helpdeskschema in your Postgres
  4. <HelpdeskAdmin />agent/*
· / 4One message, start to finish.
// app/layout.tsx
import { HelpdeskWidget } from 'better-helpdesk/widget';

export default function Layout({ children }) {
  return <>{children}<HelpdeskWidget inbox="support" /></>;
}
One route handlerOne componentOne widget

A widget you understand.

One web component, themed with your CSS variables. The customer sees the page, browser and last error it attaches, and can untick any of it.

Who is looking
Language
Help & support

We read every message and usually reply within two working days.

Everything a small support team needs.

Sized for any team answering customers. Every colleague can be an agent at no extra cost.

Shared inboxes

Support and sales side by side, priorities, tags, canned replies, snooze, keyboard navigation and a reminder email before anyone waits too long.

Inbox
  • KMACME-1036 · Rechnung als PDF auf Deutsch?de26h
  • TBACME-1041 · Export to CSV times out on large rangesbug1h 12m
  • MOACME-1042 · Invoice shows the old VAT numberbilling4m

Reminder sent to Jonas · ACME-1036 has waited 26 hours

AI that drafts

Your model, through one adapter, suggests type, priority and a reply. A person reads it and sends it.

Draft with AISuggested

A lightweight CRM

Contacts and companies from your app's own users, lead and deal stages you define, custom fields.

leadqualifiedcustomerchurned

Adapters for the rest

Leave one out and that feature stays off.

  • storage S3 bucket
  • email your sender
  • inbound Cloudflare relay
  • ai off
  • help your docs search
  • jobs cron, every 5 min

Four routes, one schema.

Visitors, your team, your mail relay and your scheduler each get one route group under your basePath.

widget/*

Visitors and customers

The widget, as a React component or widget.js on any site you own.

agent/*

Your support team

Open only when your identify says isAgent.

inbound

Your mail relay

Posts each raw email with a bearer secret.

jobs

Your scheduler

Reminders, retention and queued work, in process or over HTTP.

Stores no passwords and no sessions. Mutations are refused from any origin you haven't allowed. Inbound mail is checked against DKIM and marked verified or not. Identity tokens are signed and expire. Four runtime dependencies: drizzle-orm, zod, mailparser, mailauth.

No seats to count.

The engineer who reads one thread a week and the founder who checks in on Mondays are agents too.

5 agents
Intercom Essential$29 per agent per month$1,740/year
Zendesk Support Team$25 per agent per month$1,500/year
Freshdesk Growth$20 per agent per month$1,200/year
HubSpot$20 per agent per month$1,200/year
Better Helpdesk$0 per agent per month$0/year

List prices per agent per month on monthly billing, not annual, as published by each vendor in October 2026. Excludes add-ons, usage-based AI fees and discounts. Better Helpdesk costs nothing to license; you pay for hosting you already run and the engineering time to integrate and maintain it.

$npm install better-helpdesk pgUsing it, or planning to? Tell us your story

A library, not another app.

Hosted helpdesks keep your data and charge per seat. Self-hosted ones are a second app to run. This one is neither.

AspectBetter HelpdeskIntercom, ZendeskChatwoot, Libredesk
Runsinside your Next.js appon the vendor's serversas a separate app you operate
Customer datayour Postgresthe vendor's databaseits own database
Sign-inyour existing sessionseparate agent accountsseparate agent accounts
Look and feelyour CSS custom propertiesvendor themingvendor theming
CostMIT, freeper seat, per monthfree, plus the hosting

What we won't do

  • No hosted mode and no second login.
  • No AI that answers customers for you.
  • No phone, no social channels, no help-centre CMS.
  • No seats and no paid features in the package.

Young code, grown-up CI.

v0.3.0, first published on 28 September 2026. Nothing merges until it passes every check below, and the design partners about to run it in production decide what ships next.

  • Biome and tsc --noEmit
  • Unit tests
  • Integration tests on real Postgres
  • Packed tarball installed and imported
  • Demo app built on two Next.js majors

Releases publish to npm with provenance.

Read the changelog

Tell us your story

How are you using Better Helpdesk, or what are you planning to build with it? If you agree, we'll list you as a supporter.

This form runs on Better Helpdesk: your story goes straight into our inbox. How we handle it.

Not public yet

Support that stays up when your app doesn't.

We're quietly exploring a managed standby that keeps your widget and inbox reachable while your app is down, then hands everything back to your Postgres. Join the private list to hear about it first and help decide what it becomes.

Not built yet. The open-source package will never depend on it. No newsletter, only news about this. Privacy.

Before you depend on it.

What if the project stops?

It's MIT and lives in your repository and your Postgres, so your helpdesk keeps running and you can fork it. The schema is plain SQL in migrations/, and nothing calls home.

Can we move over from Intercom or Zendesk?

There is no importer yet. Today it fits teams starting fresh or willing to open a new inbox.

Does it work outside Next.js?

The handler is a plain function from Request to Response, so any server with that shape can mount it. Next.js is the one the examples and CI cover.

Is the AI an agent?

No. Here an agent is a person on your support team. AI only suggests a triage or drafts a reply, and a person decides what is sent.

What does the licence allow?

MIT. Use it commercially, change it, ship it inside your product. There are no paid features in the package.

Is this site running it?

Yes. The launcher in the corner and the supporter form both write into this site's own helpdesk schema, and we answer from <HelpdeskAdmin />.

Answer your first customer from your own app.

$npm install better-helpdesk pgQuickstart