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
| Component | What it is |
|---|---|
| Application | Rails 8.1, Inertia, React. Serves the dashboard and the API. |
| Queue | Solid Queue, for sending, event processing, and webhook delivery. |
| SMTP relay | A standalone TypeScript service on STARTTLS 2587. |
| Database | SQLite. 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
- Verify your sending identity in SES and request production access.
- Create an IAM user with SESv2 send permissions and SNS subscribe permissions.
- Point an SNS topic at
https://your-instance/sns/notificationsso 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.