Build apps with Resend
Resend delivers transactional emails from Supabase Edge Functions: welcome sequences, password resets, and notification digests. Goodspeed generates Resend as a standard part of every app, so the output is a working codebase from day one, not a scaffold you have to finish yourself.
WHAT GETS GENERATED
Built into every Resend build
Every app Goodspeed generates with Resend includes these production-ready patterns, wired together from the first build.
| Item | Description | Strength |
|---|---|---|
| supabase/functions/send-email/handler.ts | A Supabase Edge Function that accepts a recipient, subject, and HTML body, then calls the Resend API to deliver the email. Used for welcome, reset, and digest flows. | Edge Function |
| Resend API key in Supabase secrets | RESEND_API_KEY is stored as a Supabase secret (not in gas.config.ts) so it is never included in the app bundle or client-side code. | Security |
| Email templates in HTML strings | Email HTML is generated inline in the Edge Function for each email type. Templates use the app name and branding from the function environment variables. | Templates |
| Supabase auth email overrides | Supabase's Auth email templates (confirm signup, reset password) are overridden to call the send-email Edge Function instead of Supabase's default mailer. | Auth |
Source: the Goodspeed generation pipeline · Transactional Email
REAL GENERATED CODE
A snippet from a Resend app the studio shipped
This pattern comes straight out of the production groundwork every Goodspeed app is generated on. The studio generates Resend code like this for every app in the pipeline, not a hello-world sample you have to grow into a real app.
Edge Function email send
// supabase/functions/send-email/handler.ts import { Resend } from 'npm:resend'; const resend = new Resend(Deno.env.get('RESEND_API_KEY')); Deno.serve(async (req) => { const { to, subject, html } = await req.json(); const { error } = await resend.emails.send({ from: 'Goodspeed <noreply@goodspeed.app>', to, subject, html, }); if (error) return new Response(JSON.stringify(error), { status: 400 }); return new Response(JSON.stringify({ ok: true })); });
Today's log