I wanted to keep the latency as low as possible, ideally much faster than the typical "enterprise" email APIs. To do that, I built the backend in Go using gRPC and ConnectRPC (Buf).
Because it's built on gRPC instead of just standard REST, you get much better performance and fully typed SDKs. Right now, I have a TypeScript SDK live, and a Go SDK is in the works. But since I’m using Buf, you can basically generate a fully typed client for any language they support.
On Performance & Modes: I’ve implemented two ways to send:
Async (p50 ~34ms): This is for when you just want to fire and forget. You get an instant response, and our infrastructure handles the retries, queuing, and delivery in the background.
Sync: This is for when you need the Message-ID immediately (useful for threading replies or specific logging). You wait for the full handoff, but you get all the data you need for complex inbound flows.
The Plumbing: I’m using Amazon SES for the actual mail delivery to ensure high deliverability from day one. On top of that, I’ve built the logic to automatically handle reputation management, bounces, and complaints. You just add a domain, drop in two lines of code, and you’re done.
I really tried to strip away the "over-engineered" parts of email. No complex CRM-style contact syncing—just a high-performance pipe to send and receive mail.
I wanted to keep the latency as low as possible, ideally much faster than the typical "enterprise" email APIs. To do that, I built the backend in Go using gRPC and ConnectRPC (Buf).
Because it's built on gRPC instead of just standard REST, you get much better performance and fully typed SDKs. Right now, I have a TypeScript SDK live, and a Go SDK is in the works. But since I’m using Buf, you can basically generate a fully typed client for any language they support.
On Performance & Modes: I’ve implemented two ways to send:
Async (p50 ~34ms): This is for when you just want to fire and forget. You get an instant response, and our infrastructure handles the retries, queuing, and delivery in the background.
Sync: This is for when you need the Message-ID immediately (useful for threading replies or specific logging). You wait for the full handoff, but you get all the data you need for complex inbound flows.
The Plumbing: I’m using Amazon SES for the actual mail delivery to ensure high deliverability from day one. On top of that, I’ve built the logic to automatically handle reputation management, bounces, and complaints. You just add a domain, drop in two lines of code, and you’re done.
I really tried to strip away the "over-engineered" parts of email. No complex CRM-style contact syncing—just a high-performance pipe to send and receive mail.
Happy to answer any questions about the setup!