Skip to content
Skip to content
Goodspeed

Build apps with TypeScript

All generated app code is TypeScript, from Zod schemas and Supabase types through to every component and route file. Goodspeed generates TypeScript 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 TypeScript build

Every app Goodspeed generates with TypeScript includes these production-ready patterns, wired together from the first build.

ItemDescriptionStrength
tsconfig.json with strict modeGenerated tsconfig.json sets strict: true, noImplicitAny, and noUncheckedIndexedAccess to catch the largest class of generated-code bugs at compile time.Configuration
tsc --noEmit gate in release scriptscripts/release.mjs runs tsc --noEmit before EAS Build; any type error in generated code fails the build rather than shipping silently.Quality
Zod schemas for runtime validationlib/validation.ts exports emailSchema, passwordSchema, displayNameSchema, and feedbackSchema. The DevAgent generates additional app-specific schemas.Validation
Typed event cataloglib/events.ts exports a string-literal-union EVENTS catalog so every PostHog captureEvent call is checked against the declared event names at compile time.Analytics
Supabase generated typessupabase gen types --project-id produces a Database type. All Supabase queries reference it so missing columns surface as type errors, not runtime 404s.Backend

Source: gas-template repository · Language

REAL GENERATED CODE

A snippet from a TypeScript app the studio shipped

This pattern comes directly from the gas-template codebase, the foundation every Goodspeed app is generated on. The studio generates TypeScript code like this for every app in the pipeline, not just a hello-world scaffold.

  1. Zod validation

    // lib/validation.ts: common Zod schemas
    export const emailSchema =
      z.string().email('Invalid email address').trim().toLowerCase();
    
    export const passwordSchema = z
      .string()
      .min(8, 'Password must be at least 8 characters')
      .max(128, 'Password must be at most 128 characters')
      .regex(/[A-Z]/, 'Password must contain an uppercase letter')
      .regex(/[0-9]/, 'Password must contain a number');
GDaily Allergens

Today's log

Gluten
Tree nuts
Shellfish
Dairy
HomeScanLogProfile

START WITH TYPESCRIPT

Your TypeScript app, generated