People write when something breaks. Nothing should slip through.
Docket puts every customer message in one place, so your whole team can see what is happening and nobody is left waiting. It runs on your own server, which means your customers’ words stay with you.
For your customers
The single biggest reason people give up on a support portal is being asked to make an account. So Docket does not ask.
-
No account, no password
They send a request with a name and an email, and get a private link back to read replies, add files, or say it is sorted.
-
Formatted replies and files
JPG, PNG, PDF, ZIP and TXT up to 10 MB, five per request — from both sides of the conversation.
-
Their own history
Everything they have ever asked, reachable from the same emailed link. Nothing to remember, nothing to sign into.
For your team
One queue, and the tools to actually work it.
-
A queue you can work
Search, filter, sort and act in bulk. Stages, priorities, categories and tags are all named by you, and apply straight away with no rebuild.
-
Private notes
Sit in the conversation, clearly marked, and never reach the customer. Saved replies cover the answers you send twenty times a week.
-
Reply targets that are fair
Set them per priority. The clock pauses while you are waiting on the customer, so their delay is not counted against you.
-
Reports and an audit trail
Who answered what, how long it took, what people ask about most — with a spreadsheet download, an admin audit log and a per-request history.
-
An API for your own forms
Build “contact support” on your own site and let Docket handle the request, the emails and the customer’s reply page behind it.
-
Email that keeps trying
Outgoing mail is queued and retried rather than quietly dropped when your provider has a bad day.
Installing it
You need Docker, and nothing else. No Node.js, no PostgreSQL, no build step — the image is prebuilt and PostgreSQL comes with it.
-
Get the two files
A compose file and an environment file. That is the whole setup.
curl -O https://raw.githubusercontent.com/stack256org/docket/main/docker-compose.yml curl -o .env https://raw.githubusercontent.com/stack256org/docket/main/.env.docker.example -
Set two values
APP_SECRET(32+ random characters, fromopenssl rand -base64 36) andNEXT_PUBLIC_APP_URL. Everything else has a working default. -
Start it
This pulls the image, starts PostgreSQL, prepares the database, and leaves the app and its worker running.
docker compose up -d -
Make your own login
A separate, deliberate step, so you see whether it worked rather than it failing quietly inside a background service.
docker compose run --rm app \ pnpm create:admin you@example.com "Your Name" "a-strong-password"
No mail server yet? Every outgoing message — sign-in links included — is written to the worker log instead of sent. That is enough to try the whole product before configuring SMTP.
What it needs
| Host | Anything that runs containers — Compose, Coolify, Dokploy, Portainer, Kubernetes, Swarm, ECS |
|---|---|
| Image | ghcr.io/stack256org/docket |
| Architectures | amd64 and arm64, in every tag |
| Processes | The app, a worker (email does not send without it), and a one-off migrate step |
| Database | PostgreSQL — bundled, or point it at your own (Neon, Supabase, RDS) |
| File storage | Local disk, S3, or Cloudflare R2 — one setting |
| Health check |
GET /api/health, unauthenticated, reports database
reachability
|
| Migrating in | An importer for Zammad, safe to run more than once |
| Licence | MIT |
Have a look at the code
Docket is the second of 256. The README covers backups, the public API, deploying elsewhere, and everything else in detail.