Stack256 · 002

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.

  1. 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
  2. Set two values

    APP_SECRET (32+ random characters, from openssl rand -base64 36) and NEXT_PUBLIC_APP_URL. Everything else has a working default.

  3. Start it

    This pulls the image, starts PostgreSQL, prepares the database, and leaves the app and its worker running.

    docker compose up -d
  4. 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.