Get started
Self-host in 10 minutes
Install Opensend with one command and prebuilt Docker images.
Before you begin
Use a server with Docker Engine and the Compose v2 plugin. See requirements for sizing and network access. The server does not need Node.js, pnpm, or a source checkout. AWS approvals and DNS propagation can take longer than the installation.
For Caddy HTTPS, point three DNS A records (and AAAA records if using IPv6) at the server:
| Hostname example | Purpose |
|---|---|
mail.example.com | Opensend dashboard |
api.mail.example.com | REST API (your SDK base URL), sign-in, SES callbacks, tracking and unsubscribe links |
realtime.mail.example.com | The dashboard’s live updates |
Allow inbound ports 80 and 443. Caddy needs those ports available and gets certificates for the three hostnames. If your platform already provides HTTPS, choose no for Caddy and route the three origins through your proxy. See reverse proxy and TLS.
Run the installer
curl -fsSL https://opensend.cc/install.sh | shThe prompts ask whether to use Caddy, then for the app, API, and realtime hostnames. Enter hostnames without https://. The API and realtime defaults are api.<app hostname> and realtime.<app hostname>. Prompts read from your terminal even when the script is piped.
For an unattended install, also pass --domain mail.example.com --api-domain api.mail.example.com --realtime-domain realtime.mail.example.com --yes. For localhost testing, use --local; it disables Caddy.
The installer downloads the release Compose files and Caddyfile into ./opensend, writes .env with mode 0600, generates secrets and the Convex admin key, pulls images, and starts the stack. The images support Linux amd64 and arm64. The one-shot migrate service sets the backend environment and deploys functions before the app starts, then exits. Re-running install preserves existing values and secrets; it backs up replaced Compose files.
Use --dir PATH for another directory, --version TAG to select a release, --caddy no for your own proxy, or --no-start to write configuration without starting the stack. --source-url URL changes the compose asset base URL. Run curl -fsSL https://opensend.cc/install.sh | sh -s -- help for all flags and their environment variables.
Claim the installation
Open the app URL printed by the installer and visit /signup. The first account becomes the installation administrator. From the installation directory, read its verification and sign-in links in the Convex function logs:
cd opensend
docker compose run --rm migrate logs --history 50Verify the address and sign in. Keep log access private: bootstrap links grant account access. Before a system sender is configured, only the first administrator's account links are logged. Later accounts need an invitation matching their email and a working account sender.
Send your first email
Follow AWS SES setup, create a team, and add a sending domain. Configure a verified system sender in Amazon SES settings before inviting other users. Then create an API key and follow a quickstart. Your REST base URL is the API origin, such as https://api.mail.example.com, without an /api suffix.
Keep .env and the persistent convex-data volume backed up. See upgrading before changing releases. To stop the stack while keeping data, run the installer with uninstall --dir ./opensend from its parent directory. uninstall --purge deletes the volumes and always requires typing PURGE at a terminal, even with --yes.
Prefer to do it by hand?
Follow the manual Docker Compose guide to download the release assets and configure the stack yourself.