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: gas-template repository · Transactional Email
REAL GENERATED CODE
A snippet from a Resend app the studio shipped
This pattern comes directly from the gas-template codebase, the foundation every Goodspeed app is generated on. The studio generates Resend code like this for every app in the pipeline, not just a hello-world scaffold.
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 })); });
GDaily Allergens
Today's log
Gluten
Tree nuts
Shellfish
Dairy
HomeScanLogProfile