A help desk for one to three people, with no per-agent fee.

Support Desk is the open-source shared inbox for a small product or shop. Forward your support address and your contact form to your own server and get tickets, a reply box with suggested saved replies, first-reply targets that tighten for angry or money-related mail, and a link where customers follow their ticket. Below, paste a customer email to see how it would be triaged. Everything on this page runs in your browser, so nothing is uploaded.

Try the triage

 

Suggested saved replies

The server uses this exact code. A ticket flagged high gets a quarter of your target, low gets double. Suggestions rank saved replies against the message by keyword weight; you always press Send yourself.

Why someone would use this

TodayCatchSupport Desk
Help Scout, Front, Zendesk, FreshdeskPriced per agent per month; conversations live with them; most features beyond a basic inbox sit on higher tiersYour server, unlimited mailboxes and tickets, no seat fee
A shared Gmail inbox or a group aliasNo owner, no status, replies collide, nothing shows what is overdueStatus, assignee, notes, reply targets and an overdue list
Open-source desks (Chatwoot, FreeScout, Zammad)Full products that need a database, a queue and real operations workOne Node process and one JSON file; deploys in a click

Honest limits: no live chat, no file attachments, no mobile app, one admin key shared by the team (assignee is a name, not a login), and a keyword-based suggester rather than a language model. For more than a few agents or high volume, use a full help desk.

Run it yourself

git clone https://github.com/Duncan-Haywood/fp-monorepo && cd fp-monorepo/ventures/support-desk
node --test
ADMIN_KEY=$(openssl rand -hex 16) COMPANY_NAME=Acme node server.mjs

Open http://localhost:8080/admin (any user name, ADMIN_KEY as the password), create a mailbox, and point your email forwarder at its inbound URL. One-click Render deploy, Fly.io and Docker are in the README.

Questions

Why not just use Help Scout, Front, Crisp or Zendesk?

Those are polished and the right call if you need live chat, a mobile app, a knowledge base or a team of agents with separate logins. They charge per agent per month, and customer conversations live on their servers. Support Desk is one small Node server in your own account: unlimited tickets and mailboxes within your disk, a shared inbox, saved replies, first-reply targets and a customer portal, with no per-seat fee. If you are a team of one to three answering email, it covers the job; if you need more, keep the hosted tool.

How does email get in?

Create a mailbox and you get an inbound webhook URL. Point Postmark inbound, Mailgun routes, Resend inbound or any email-to-webhook forwarder at it, then forward your support address there. Postmark JSON, Mailgun form posts and plain JSON with from, subject and text are understood. Replies thread by the ticket number in the subject, or by In-Reply-To, and only when the sender is the original requester.

How are replies sent?

Through your own Resend account with your verified sending domain. It starts in dry-run mode: replies are saved on the ticket but nothing is emailed until you set DRY_RUN=false with RESEND_API_KEY and MAIL_FROM. Customers answer your support address, so keep forwarding it to the inbound webhook.

What does the priority and spam guess do?

Each new ticket is scored from visible signals: words like refund, charged twice, outage or locked out raise it, feature requests lower it, and obvious spam phrases or link floods go to the Spam tab. Every flag shows its reason on the ticket and you can change it. It decides the first-reply target: a quarter of your target for high priority, double for low. It is a heuristic, not a model.

How are saved replies suggested?

Each saved reply has a title, optional trigger words and a body. The ticket page ranks them against the customer's message with keyword weighting (rare words count more) and fills the reply box when you pick one, with the customer's name, ticket number and your company name substituted. Nothing is sent without you pressing Send.

What does it store?

Tickets, messages and the sender's email address and name in one JSON file you control. File attachments are not stored. IP addresses are held in memory only for rate limiting. Set RETENTION_DAYS to delete closed tickets after a while and AUTO_CLOSE_DAYS to close tickets waiting on the customer. You are the operator and responsible for your privacy notice and data-protection duties.