For one person or a small team answering support mail, the core is a shared inbox: poll a mailbox over IMAP, thread replies into tickets, set status and tags, answer through SMTP and keep saved replies. An agent can build that in a weekend. The risks sit outside the code: replies must pass SPF, DKIM and DMARC to avoid spam folders, threading has edge cases, and the ticket store holds customer data you now secure yourself. Chat, phone and SLAs aren't worth building; Zammad covers them and FreeScout is the lighter option.
Before you buildZendesk has no free plan, only a 14-day trial. For one person with little mail, a shared mailbox in your mail provider may already be enough.
Build me a shared support inbox to replace Zendesk. Requirements:
- Node.js 22 + TypeScript: a Fastify server and a React front end built with
Vite. `npm start` serves the agent interface on http://localhost:5100.
- Mail in: poll one IMAP mailbox every 60 seconds (`imapflow`, `mailparser`),
one ticket per conversation. Thread replies by Message-ID, In-Reply-To and
References, falling back to a [#123] token in the subject. Credentials in .env.
- Mail out: reply from the same address through nodemailer (SMTP from .env)
with In-Reply-To and References set. Strip quoted history from inbound
replies with `email-reply-parser`.
- Storage: better-sqlite3 in ./data/desk.db: tickets (subject, requester,
status new/open/pending/solved, priority, tags), messages and internal notes;
attachments in ./data/files/ (25 MB each). Sanitise HTML mail with
`sanitize-html` and block remote images.
- Agent interface: a ticket list with filters (status, tag) and full-text
search through SQLite FTS5; a ticket view with the thread, internal notes,
status and tag changes, and saved replies ("macros") with {{requester.name}}
placeholders that can also set status or tags.
- Rules: if the subject or sender matches X, set a tag or priority; one
auto-reply per new ticket; a customer reply reopens a pending ticket; solved
tickets close after 7 days. Auto-replies carry Auto-Submitted:
auto-generated, skip no-reply and list addresses, max 3 a day per sender.
- Single agent, one password in .env (signed cookie). No accounts, no
telemetry, local-first; the only connections are your IMAP and SMTP hosts.
- Out of scope: live chat, phone, social channels, SLA timers, a customer
portal, several agents, AI replies.
- README: SPF, DKIM and DMARC records to set before sending, running it on a
VPS, backing up ./data, and a note that stored customer email is personal
data you are now responsible for.Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Zendesk.
Add multiple agents to the support inbox in this folder. Requirements: - An agents table with name, email and bcrypt password hash; an admin page to add, disable and reset agents, replacing the single shared password. - Assign a ticket to an agent or leave it unassigned; filters for mine, unassigned and all. - @mention an agent in an internal note to email them a link. - Record who made each status or assignment change in a ticket history list. - Update the README.
Add a contact form endpoint to the support inbox in this folder. Requirements: - POST /api/contact accepts name, email, message and an optional attachment up to 10 MB, and opens a ticket with the requester set. - Hidden honeypot field, a 3-second minimum fill time, a rate limit per IP, and optional Cloudflare Turnstile through an env var. - Send the requester a receipt email containing the ticket token so their reply threads onto the ticket. - A small embeddable HTML snippet and CORS limited to an allow-list in .env. - Update the README.
Add a knowledge base to the support inbox in this folder. Requirements: - Articles written in Markdown with a title, category and published flag, stored in SQLite with FTS5 search. - A public, read-only /help site rendered on the server, with category pages and search. - In the reply box, a Suggest article button that searches the ticket subject and inserts a link to the chosen article. - Update the README.
Add reply targets to the support inbox in this folder. Requirements: - Settings for a first-reply target and a next-reply target in hours, plus business hours with a time zone and holidays. - Compute due times with `luxon`, pause the clock while a ticket is pending, and show a countdown badge in the ticket list. - A view of tickets due within 2 hours and breached tickets, and a daily summary email. - Tests that cross a weekend and a daylight-saving change. - Update the README.
A help desk becomes the record of every customer conversation, and a missed email costs more than a seat. Teams pay for the channels, automations and reporting that grow around the inbox, and for a vendor that answers for uptime, security and data handling. Leaving is slow because ticket history, triggers and macros all live inside it.
Estimate · Runs on a laptop or a $5 VPS, on top of the mailbox you already pay for. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Support Team | $25 | $19 | Email and ticketing, ticket routing, prebuilt analytics dashboards, pre-written responses, customer context, automations and triggers; 5 automated resolutions per agent a month. |
| Suite Team | $69 | $55 | Everything in Support Team plus AI agents, messaging and live chat, telephony, omnichannel routing and an AI knowledge base. |
| Suite Professional | $149 | $115 | Everything in Suite Team plus skills-based routing, IVR phone trees, AI writing tools and an admin copilot; 10 automated resolutions per agent a month. |
| Suite Enterprise + Copilot | custom | — | Everything in Suite Professional plus approval workflows, a sandbox, custom agent roles and AI triage. |
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Live chat, messaging and phone channels (Suite plans), AI agents, copilot and automated resolutions.
About $25 a month on the Support Team plan per seat, $300 a year (checked 2026-10-14).
Live chat, messaging and phone channels (Suite plans); AI agents, copilot and automated resolutions; Marketplace apps and connections to the rest of your stack; Skills-based routing and prebuilt analytics dashboards; Several agents working one queue with roles. If any of those matter to you, keep paying.
Yes: Zammad (open source), FreeScout (open source), Chatwoot (open source).