Skip to content

Goodspeed is in closed beta. Enter your email and we check your invite on the spot: invited accounts start free today, and everyone else joins the waitlist in one click. Get started

Skip to content
Goodspeed

Connect Cloudflare R2 to your Goodspeed app

Binary-safe object storage for user-generated media, app assets, and exports, accessed from Supabase Edge Functions with zero egress fees. Goodspeed wires Cloudflare R2 into every app that needs it at generation time, so you start with a working integration, not a blank config and a documentation tab.

WHAT GETS WIRED IN

Built into every Cloudflare R2 build

Every app Goodspeed generates with Cloudflare R2 includes these wired integrations from the first build. No manual setup required.

ItemDescriptionStrength
Credentials held as secretsThe R2 access key and secret live as Supabase secrets and never appear in the app bundle.Auth
Uploads run server-sidelib/media.ts uses the S3-compatible API from Edge Functions to store profile photos and user-generated content.Data
Binary-safe transferBlobs are base64-encoded on the way through, so a file is not corrupted crossing a JSON boundary.Data
Time-limited linksPre-signed URLs are generated server-side, so a client can read a private file for a bounded window and no longer.Auth
Per-user access enforcedThe Edge Function layer checks ownership, so one person cannot read or overwrite another's files.Auth

Source: the Goodspeed app foundation · object-storage

REAL GENERATED CODE

A snippet from a Cloudflare R2 integration the pipeline ships

This pattern is lifted from the engineered plumbing that ships inside every Goodspeed app. The studio generates Cloudflare R2 integration code like this for every app that includes it, not a placeholder you have to fill in yourself.

  1. Binary-safe R2 upload

    // supabase/functions/upload-media/handler.ts
    const r2 = new S3Client({
      region: 'auto',
      endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`,
      credentials: {
        accessKeyId: Deno.env.get('R2_ACCESS_KEY_ID')!,
        secretAccessKey: Deno.env.get('R2_SECRET_ACCESS_KEY')!,
      },
    });
    
    async function uploadBinary(key: string, body: Uint8Array) {
      await r2.send(new PutObjectCommand({ Bucket: BUCKET, Key: key, Body: body }));
    }
GDaily Allergens

Today's log

Gluten
Tree nuts
Shellfish
Dairy
HomeScanLogProfile

START WITH CLOUDFLARE R2

Your Cloudflare R2 integration, generated