Skip to content

Self-hosting

Run the open core on your own infrastructure, with your own AWS account, in about five minutes.

The core is open source and runs single-tenant. This is the same code our cloud runs — there is no community edition with the useful parts removed.

What you need

  • Docker and Docker Compose
  • An AWS account with SES access, out of the sandbox
  • A domain you control

You are running the application. AWS is doing the actual sending, and that bill is yours.

Get it running

git clone https://github.com/martinbusinessconsultants/outsend.git
cd outsend

cp .env.example .env        # AWS credentials, sending domain, secret key base
docker compose up -d        # app, SMTP relay, queue worker

open http://localhost:3000

The first account to sign up becomes the owner. After that a single-tenant instance stops accepting signups — so an internet-facing deployment does not quietly become somebody else’s open relay.

What is running

ComponentWhat it is
ApplicationRails 8.1, Inertia, React. Serves the dashboard and the API.
QueueSolid Queue, for sending, event processing, and webhook delivery.
SMTP relayA standalone TypeScript service on STARTTLS 2587.
DatabaseSQLite. Yes, really — it is the right answer at this size.

Health checks live at /up, which returns 200 when the app boots cleanly.

Wiring up AWS

  1. Verify your sending identity in SES and request production access.
  2. Create an IAM user with SESv2 send permissions and SNS subscribe permissions.
  3. Point an SNS topic at https://your-instance/sns/notifications so delivery, bounce, and complaint events flow back in.

Without step 3 the mail still sends — but the events never arrive, which removes the entire reason to use this software.

Multi-tenant

Single-tenant is the default because it is the safe default. You can turn it off, and then abuse handling, reputation management, and support all become your job. That is a real job. Consider whether you want it.

Upgrading

git pull
docker compose build
docker compose up -d

Migrations run on boot. Breaking changes are called out in the changelog with the affected versions named.

Getting help

Open an issue on the repo. If you need a response with a commitment attached to it, a self-host support contract is the honest way to get one — community support is real but it is not an SLA, and we are not going to pretend otherwise.