Skip to content
Skip to content
Goodspeed

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.

ItemDescriptionStrength
supabase/functions/send-email/handler.tsA 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 secretsRESEND_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 stringsEmail 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 overridesSupabase'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.

  1. 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

START WITH RESEND

Your Resend app, generated