Skip to content

Self-hosting

Emithook is Apache-2.0, open-core: the complete engine — ingest, router, delivery, all adapters, console, CLI, MCP server, and SDKs — is open source and genuinely self-hostable. You can run the whole thing with no AWS or Cloudflare account — the one exception is inbound email (SES today; see the caveat below).

Pre-release

The engine and its container images ship with the roadmap phases. This page describes the intended self-host model from the architecture; treat it as the design contract, not a download link yet.

Ports & adapters

The TypeScript/Node core depends only on a handful of interfaces — never on a cloud SDK directly. AWS and Cloudflare are just one set of implementations; swapping them is configuration, not a fork.

PortManaged (our cloud)Self-host default
QueuePortAWS SQSNATS JetStream (or Redis Streams)
StoragePortS3 / R2MinIO
LogStorePortMongoDBMongoDB, or single-Postgres mode
CachePortElastiCache RedisRedis / Valkey
SecretsPortAWS Secrets ManagerVault / SOPS / env
ConfigDBPostgres (RDS)Postgres (container)

The same hard logic (verify, sign, route, backoff, SSRF guard) ships as one shared @emithook/core package, run two ways — as a serverless handler in our cloud, and as a long-running worker in a container — so there is never a second implementation that can drift.

Inbound email needs AWS (SES) today

Webhooks (HTTPS edge + queue ingestion) and Send are fully self-hostable with no AWS or Cloudflare account. Inbound email is the one exception: the MX engine currently parses mail from an Amazon SES inbound feed, so self-hosting inbound email today means pointing the MX worker at your own SES (your AWS account, your region). The receiver sits behind an InboundEmailPort seam, so a provider-agnostic path — your own SMTP receiver, or a Cloudflare Email Workers adapter — can drop in without touching the consumer; that adapter is on the roadmap. If you don't need inbound email, none of this applies.

Quickstart (Docker Compose)

A first-class requirement, not an afterthought: one command brings up a working instance.

bash
docker compose up
# brings up: emithook + Postgres + NATS + Redis + MinIO

That gives you ingest, routing, delivery, the console, CLI and MCP server against local infrastructure. An optional Bun/Node single-binary build is provided for bare-metal convenience, and a Helm chart for Kubernetes.

What's managed-only

Self-hosters get a genuinely complete product, not a crippled teaser. The hosted service adds operational value that isn't required to run Emithook yourself: multi-region / DR, the hosted global edge, our SLA, the hosted consumer portal at scale, and usage billing.

Spec-compatible on the wire

Outbound signing follows Standard Webhooks verbatim, so receivers and tooling stay portable — you are never locked to a self-host or the managed service.

Next

Apache-2.0 licensed · a Finnoto product