[{"data":1,"prerenderedAt":446},["ShallowReactive",2],{"project-transend":3},{"id":4,"title":5,"body":6,"date":431,"description":432,"extension":433,"meta":434,"navigation":441,"path":442,"seo":443,"stem":444,"__hash__":445},"projects\u002Fprojects\u002Ftransend.md","Transend",{"type":7,"value":8,"toc":423},"minimark",[9,14,18,25,46,80,83,88,91,191,220,222,226,286,288,292,295,303,308,338,340,344,350,356,362,364,368,377,392,394,398,419],[10,11,13],"h1",{"id":12},"transend-email-delivery-without-the-drag","Transend - Email delivery without the drag",[15,16,17],"p",{},"Transend is a transactional email platform built as an open, developer-first alternative to Resend. It gives developers a clean HTTP API for sending email, verifying sending domains, managing API credentials, and inspecting delivery activity — backed by a Rust server and AWS SES for delivery.",[15,19,20,24],{},[21,22,23],"strong",{},"The goal:"," make sending transactional email feel like one simple API call — no SMTP wrangling, no deliverability guesswork, no vendor lock-in.",[15,26,27,35,36,35,41],{},[28,29,34],"a",{"href":30,"rel":31,"target":33},"https:\u002F\u002Ftransend.email",[32],"nofollow","_blank","Web App"," · ",[28,37,40],{"href":38,"rel":39,"target":33},"https:\u002F\u002Fgithub.com\u002Ftransend-email\u002Fmonorepo",[32],"GitHub",[28,42,45],{"href":43,"rel":44,"target":33},"https:\u002F\u002Fstatus.transend.email",[32],"Status",[15,47,48,51,52,35,56,35,59,35,62,35,65,35,68,35,71,35,74,35,77],{},[21,49,50],{},"Tech Stack:"," ",[53,54,55],"code",{},"Rust",[53,57,58],{},"Axum",[53,60,61],{},"SQLx",[53,63,64],{},"PostgreSQL",[53,66,67],{},"AWS SES",[53,69,70],{},"Nuxt 4",[53,72,73],{},"TypeScript",[53,75,76],{},"TailwindCSS",[53,78,79],{},"Docker",[81,82],"hr",{},[84,85,87],"h2",{"id":86},"one-request-to-send","One Request to Send",[15,89,90],{},"Send email with a standard JSON payload and a Bearer API key:",[92,93,98],"pre",{"className":94,"code":95,"language":96,"meta":97,"style":97},"language-bash shiki shiki-themes github-light github-dark github-dark","curl --request POST \\\n  --url https:\u002F\u002Fapi.transend.email\u002Fv1\u002Femails \\\n  --header \"Authorization: Bearer tsd_live_your_api_key\" \\\n  --header \"Content-Type: application\u002Fjson\" \\\n  --data '{\n    \"from\": \"hello@mail.example.com\",\n    \"to\": [\"you@example.com\"],\n    \"subject\": \"Hello from Transend\",\n    \"html\": \"\u003Ch1>It works.\u003C\u002Fh1>\"\n  }'\n","bash","",[53,99,100,120,131,142,152,161,167,173,179,185],{"__ignoreMap":97},[101,102,105,109,113,117],"span",{"class":103,"line":104},"line",1,[101,106,108],{"class":107},"shcOC","curl",[101,110,112],{"class":111},"suiK_"," --request",[101,114,116],{"class":115},"sfrk1"," POST",[101,118,119],{"class":111}," \\\n",[101,121,123,126,129],{"class":103,"line":122},2,[101,124,125],{"class":111},"  --url",[101,127,128],{"class":115}," https:\u002F\u002Fapi.transend.email\u002Fv1\u002Femails",[101,130,119],{"class":111},[101,132,134,137,140],{"class":103,"line":133},3,[101,135,136],{"class":111},"  --header",[101,138,139],{"class":115}," \"Authorization: Bearer tsd_live_your_api_key\"",[101,141,119],{"class":111},[101,143,145,147,150],{"class":103,"line":144},4,[101,146,136],{"class":111},[101,148,149],{"class":115}," \"Content-Type: application\u002Fjson\"",[101,151,119],{"class":111},[101,153,155,158],{"class":103,"line":154},5,[101,156,157],{"class":111},"  --data",[101,159,160],{"class":115}," '{\n",[101,162,164],{"class":103,"line":163},6,[101,165,166],{"class":115},"    \"from\": \"hello@mail.example.com\",\n",[101,168,170],{"class":103,"line":169},7,[101,171,172],{"class":115},"    \"to\": [\"you@example.com\"],\n",[101,174,176],{"class":103,"line":175},8,[101,177,178],{"class":115},"    \"subject\": \"Hello from Transend\",\n",[101,180,182],{"class":103,"line":181},9,[101,183,184],{"class":115},"    \"html\": \"\u003Ch1>It works.\u003C\u002Fh1>\"\n",[101,186,188],{"class":103,"line":187},10,[101,189,190],{"class":115},"  }'\n",[92,192,196],{"className":193,"code":194,"language":195,"meta":97,"style":97},"language-json shiki shiki-themes github-light github-dark github-dark","{\n    \"id\": \"01972e64-c32c-7ac9-9929-191cf71e26a4\"\n}\n","json",[53,197,198,204,215],{"__ignoreMap":97},[101,199,200],{"class":103,"line":104},[101,201,203],{"class":202},"slsVL","{\n",[101,205,206,209,212],{"class":103,"line":122},[101,207,208],{"class":111},"    \"id\"",[101,210,211],{"class":202},": ",[101,213,214],{"class":115},"\"01972e64-c32c-7ac9-9929-191cf71e26a4\"\n",[101,216,217],{"class":103,"line":133},[101,218,219],{"class":202},"}\n",[81,221],{},[84,223,225],{"id":224},"core-features","Core Features",[227,228,229,242],"table",{},[230,231,232],"thead",{},[233,234,235,239],"tr",{},[236,237,238],"th",{},"Capability",[236,240,241],{},"What it gives you",[243,244,245,254,262,270,278],"tbody",{},[233,246,247,251],{},[248,249,250],"td",{},"Sending API",[248,252,253],{},"Send one email or submit a batch over HTTPS.",[233,255,256,259],{},[248,257,258],{},"Domain Verification",[248,260,261],{},"Add a sending domain and verify its DKIM records.",[233,263,264,267],{},[248,265,266],{},"API Keys",[248,268,269],{},"Separate credentials for production, staging, and local.",[233,271,272,275],{},[248,273,274],{},"Webhooks",[248,276,277],{},"Register endpoints for delivery events.",[233,279,280,283],{},[248,281,282],{},"Dashboard",[248,284,285],{},"Nuxt 4 app for domains, keys, and delivery activity.",[81,287],{},[84,289,291],{"id":290},"architecture","Architecture",[15,293,294],{},"The backend is a Rust workspace, split into focused crates so domain logic stays pure and I\u002FO lives at the edges:",[92,296,301],{"className":297,"code":299,"language":300},[298],"language-text","transend\u002F\n├── crates\u002F\n│   ├── transend-core\u002F           shared domain types (no I\u002FO)\n│   ├── transend-mailer\u002F         Mailer trait + AWS SES implementation\n│   ├── transend-db\u002F             sqlx queries + migrations\n│   ├── transend-identity\u002F       auth, API keys, sessions\n│   ├── transend-notifications\u002F  webhooks & delivery events\n│   ├── transend-api\u002F            Axum HTTP server (the thing you deploy)\n│   └── transend-cli\u002F            dev CLI — send test emails, admin tasks\n│\n└── web\u002F                         Nuxt 4 frontend (marketing + dashboard)\n","text",[53,302,299],{"__ignoreMap":97},[15,304,305],{},[21,306,307],{},"Design decisions:",[309,310,311,322,332],"ul",{},[312,313,314,317,318,321],"li",{},[21,315,316],{},"Trait-based mailer"," — delivery is behind a ",[53,319,320],{},"Mailer"," trait, so AWS SES is an implementation detail. Other providers can be added without touching the API layer.",[312,323,324,327,328,331],{},[21,325,326],{},"Compile-time checked SQL"," — ",[53,329,330],{},"sqlx"," validates every query against the live Postgres schema at build time.",[312,333,334,337],{},[21,335,336],{},"Core crate has zero I\u002FO"," — shared domain types are dependency-free, keeping business rules testable and portable.",[81,339],{},[84,341,343],{"id":342},"tech-stack","Tech Stack",[15,345,346,349],{},[21,347,348],{},"Backend:"," Rust · Axum · Tokio · SQLx · PostgreSQL · AWS SES",[15,351,352,355],{},[21,353,354],{},"Frontend:"," Nuxt 4 · TypeScript · Nuxt UI · TailwindCSS v4 · TanStack Query",[15,357,358,361],{},[21,359,360],{},"Infrastructure:"," Docker · VitePress (docs)",[81,363],{},[84,365,367],{"id":366},"status-whats-next","Status & What's Next",[369,370,371],"blockquote",{},[15,372,373,376],{},[21,374,375],{},"Status:"," In active development. Sending API, domain verification, API keys, and the dashboard are built; deliverability tooling (SPF\u002FDKIM\u002FDMARC guidance, BIMI) and a Rust SDK are in progress.",[309,378,379,386,389],{},[312,380,381,382,385],{},"Rust SDK (",[53,383,384],{},"sdks\u002Ftransend-rust",") for typed, ergonomic integration",[312,387,388],{},"Delivery event webhooks with signed payloads",[312,390,391],{},"Batch sending and template support",[81,393],{},[84,395,397],{"id":396},"what-im-learning-building-transend","What I'm Learning Building Transend",[399,400,401,407,413],"ol",{},[312,402,403,406],{},[21,404,405],{},"Email is an infrastructure problem disguised as an API problem"," — deliverability, DNS, and reputation are the real product",[312,408,409,412],{},[21,410,411],{},"Rust's type system shines in billing-adjacent systems"," — making invalid states unrepresentable matters when every send costs money",[312,414,415,418],{},[21,416,417],{},"Crate boundaries are architecture"," — separating core types from I\u002FO forced cleaner design than any style guide could",[420,421,422],"style",{},"html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}",{"title":97,"searchDepth":122,"depth":122,"links":424},[425,426,427,428,429,430],{"id":86,"depth":122,"text":87},{"id":224,"depth":122,"text":225},{"id":290,"depth":122,"text":291},{"id":342,"depth":122,"text":343},{"id":366,"depth":122,"text":367},{"id":396,"depth":122,"text":397},"2026-06-11","An open, developer-first transactional email API — send emails, verify sending domains, manage credentials, and inspect delivery activity over a clean HTTP API.","md",{"tags":435,"live":30,"github":38,"status":440,"featured":441},[436,55,437,438,439],"Email Infrastructure","API","DevTools","SaaS","In Development",true,"\u002Fprojects\u002Ftransend",{"title":5,"description":432},"projects\u002Ftransend","lTbpRT3QdPNN97hS3JKxs-y8J2wD3WbzeXeAy7sT0bk",1781344604236]