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.
| Port | Managed (our cloud) | Self-host default |
|---|---|---|
QueuePort | AWS SQS | NATS JetStream (or Redis Streams) |
StoragePort | S3 / R2 | MinIO |
LogStorePort | MongoDB | MongoDB, or single-Postgres mode |
CachePort | ElastiCache Redis | Redis / Valkey |
SecretsPort | AWS Secrets Manager | Vault / SOPS / env |
| ConfigDB | Postgres (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.
docker compose up
# brings up: emithook + Postgres + NATS + Redis + MinIOThat 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
- Security — the SSRF gate, signing, residency.
- Concepts → Destinations — the adapter framework.
- Roadmap & availability — what ships when.