Bring your own infrastructure
The same three connections the desk has always run on — plus the operational care that makes them safe to hand over.
Both mongodb:// and mongodb+srv:// are understood, including several seed hosts. Every rejection is a 400 that explains itself — missing host, malformed SRV, bad scheme — because this is a value a person types, and "invalid connection string" is how you end up with a ticket.
One pool per organization: five sockets, nothing kept warm, a five-second server-selection timeout so a slow cluster fails its own request instead of tying up a worker, an idle eviction, and an LRU ceiling that bounds the process no matter how many organizations exist.
Agents upload with a presigned PUT and read with a five-minute presigned GET. HavnDesk stores a name, a type, a size and an object key — nothing else — and file names are sanitized against path traversal before a key is built.
Settings → File storage has a Check button that writes and deletes a probe object, so a wrong key fails on the settings screen rather than the first customer screenshot.
Postmark keeps attachment content for 30 days. Connect a bucket late and the panel tells you how many files are still recoverable, recovers them in the background, and reports what came back alongside what is permanently gone. A cron nudges organizations that never open the screen.
Your Postmark token has to be used, not just verified, so it is the one secret stored reversibly — encrypted with AES-256-GCM under a deployment key and write-only through the API. Rotating that key re-encrypts everything without anyone re-entering a token.