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 Expo SecureStore to your Goodspeed app

Encrypted key-value storage for auth tokens, session data, and user credentials. The secure layer under every Goodspeed auth flow on native. Goodspeed wires Expo SecureStore 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 Expo SecureStore build

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

ItemDescriptionStrength
The keychain as the token storeOn phones the Supabase session lives in the device keychain rather than in ordinary app storage.Auth
An unavailable keychain degradesReads and writes are wrapped, so a device that refuses keychain access signs the person out instead of crashing.Reliability
Never loaded on webA platform guard keeps the module out of the browser bundle, where it does not exist.Setup
Refresh handled for youSupabase refreshes the token on its own, reading the encrypted session straight from the keychain.Auth

Source: the Goodspeed app foundation · identity/auth

REAL GENERATED CODE

A snippet from a Expo SecureStore integration the pipeline ships

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

  1. SecureStore adapter

    // lib/supabase.ts: ExpoSecureStore auth adapter
    const ExpoSecureStoreAdapter = {
      getItem: async (key: string) => {
        try {
          return await SecureStore.getItemAsync(key);
        } catch {
          return null;
        }
      },
      setItem: async (key: string, value: string) => {
        try {
          await SecureStore.setItemAsync(key, value);
        } catch { /* ignore write failures */ }
      },
      removeItem: async (key: string) => {
        try {
          await SecureStore.deleteItemAsync(key);
        } catch { /* ignore */ }
      },
    };
GDaily Allergens

Today's log

Gluten
Tree nuts
Shellfish
Dairy
HomeScanLogProfile

START WITH EXPO SECURESTORE

Your Expo SecureStore integration, generated