Installation

Clone, install, configure, and run LaunchFst in under five minutes.

Prerequisites

  • Node.js 18+nodejs.org
  • pnpmnpm install -g pnpm
  • PostgreSQL — local install, Neon (recommended, free tier), or Supabase
LaunchFst uses pnpm exclusively. Do not mix with npm or yarn — the lockfile is pnpm-specific.

Quick Start

Clone and install

git clone https://github.com/your-org/launchfst.git my-app
cd my-app
pnpm install

Configure environment variables

cp .env.example .env.local

Only DATABASE_URL is required to start. Everything else is optional.

Set up the database

pnpm db:push       # push schema to database (no migration history)
pnpm db:generate   # generate Prisma client (run after schema changes)

For a local database using Docker:

pnpm docker:dev    # starts postgres:17-alpine on port 5432
# Use: DATABASE_URL="postgresql://launchfst:launchfst@localhost:5432/launchfst"

Start the dev server

pnpm dev           # starts on http://localhost:3000 with Turbopack

Create your first account

Go to http://localhost:3000/signup. To promote your account to SuperAdmin:

pnpm make-superadmin your@email.com

Environment Variables

All variables are documented here. Copy .env.example.env.local and fill in what you need.

Required

VariableDescription
DATABASE_URLPostgreSQL connection string
NEXTAUTH_URLYour app URL (http://localhost:3000 in dev)
AUTH_SECRETRandom secret for JWT signing — generate with openssl rand -base64 32
Never commit .env.local. It's already in .gitignore, but double-check before pushing.

Payments (choose one)

Set PAYMENT_PROVIDER to activate a provider. Leave empty to disable payments (billing page shows a setup guide).

PAYMENT_PROVIDER="lemonsqueezy"   # or "polar" or "stripe"

LemonSqueezy:

VariableDescription
LEMONSQUEEZY_API_KEYAPI key from app.lemonsqueezy.com → Settings → API
LEMONSQUEEZY_STORE_IDStore ID from Settings → Stores
LEMONSQUEEZY_WEBHOOK_SECRETWebhook signing secret

Polar:

VariableDescription
POLAR_ACCESS_TOKENAccess token from Polar Dashboard → Settings → API
POLAR_WEBHOOK_SECRETWebhook signing secret
POLAR_MODEsandbox for testing, production for live

Stripe:

VariableDescription
STRIPE_SECRET_KEYSecret key (sk_live_xxx or sk_test_xxx)
STRIPE_PUBLISHABLE_KEYPublishable key (pk_live_xxx or pk_test_xxx)
STRIPE_WEBHOOK_SECRETWebhook signing secret (whsec_xxx)

Email (choose one)

Set EMAIL_PROVIDER to activate email sending. Leave empty to log emails to console (local dev).

EMAIL_PROVIDER="resend"         # or "nodemailer"
EMAIL_FROM="YourSaaS <noreply@yourdomain.com>"

Resend:

VariableDescription
RESEND_API_KEYAPI key from resend.com → API Keys

Nodemailer (SMTP):

VariableDescription
SMTP_HOSTSMTP server hostname
SMTP_PORTSMTP port (default: 587)
SMTP_USERSMTP username
SMTP_PASSSMTP password
SMTP_SECUREUse TLS (true/false, default: false)

OAuth

Both providers default to disabled. Set NEXT_PUBLIC_*_ENABLED="true" and provide credentials to show the login button.

NEXT_PUBLIC_GOOGLE_ENABLED="true"
GOOGLE_CLIENT_ID="your-client-id"
GOOGLE_CLIENT_SECRET="your-client-secret"

NEXT_PUBLIC_GITHUB_ENABLED="true"
GITHUB_CLIENT_ID="your-client-id"
GITHUB_CLIENT_SECRET="your-client-secret"

Feature Flags

Toggle features on/off at build time. All default to enabled.

NEXT_PUBLIC_ENABLE_BLOG="true"
NEXT_PUBLIC_ENABLE_DOCS="true"
NEXT_PUBLIC_ENABLE_CONTACT="true"
NEXT_PUBLIC_ENABLE_NEWSLETTER="true"
NEXT_PUBLIC_ENABLE_ORGANIZATIONS="true"
NEXT_PUBLIC_ENABLE_WAITLIST="true"
NEXT_PUBLIC_ENABLE_FEEDBACK="true"
NEXT_PUBLIC_ENABLE_CHANGELOG="true"
NEXT_PUBLIC_ENABLE_SEARCH="true"
NEXT_PUBLIC_COMING_SOON="false"
NEXT_PUBLIC_DEMO_MODE="false"

Feature Add-ons

These are only needed when you enable the corresponding feature add-on.

AI Chat:

AI_PROVIDER="openai"        # or "anthropic"
OPENAI_API_KEY="sk-..."
# ANTHROPIC_API_KEY="sk-ant-..."

File Uploads (UploadThing):

UPLOADTHING_TOKEN="your-token"

Rate Limiting (Upstash Redis):

UPSTASH_REDIS_REST_URL="https://..."
UPSTASH_REDIS_REST_TOKEN="your-token"

Error Monitoring (Sentry):

NEXT_PUBLIC_SENTRY_DSN="https://...@sentry.io/..."
SENTRY_ORG="your-org"
SENTRY_PROJECT="your-project"

Analytics:

NEXT_PUBLIC_ANALYTICS_PROVIDER="posthog"   # or "google"
NEXT_PUBLIC_POSTHOG_KEY="phc_..."
NEXT_PUBLIC_POSTHOG_HOST="https://us.i.posthog.com"
# NEXT_PUBLIC_GA_ID="G-..."

Contact form email destination:

CONTACT_EMAIL="hello@yourdomain.com"

Available Scripts

ScriptDescription
pnpm devStart dev server (Turbopack, port 3000)
pnpm buildProduction build
pnpm startStart production server
pnpm lintRun ESLint
pnpm db:pushPush Prisma schema to database
pnpm db:generateGenerate Prisma client
pnpm db:studioOpen Prisma Studio GUI
pnpm make-superadminPromote user to SUPERADMIN by email
pnpm seed-demoCreate demo users and orgs
pnpm email:previewPreview email templates
pnpm docker:devStart local PostgreSQL with Docker
pnpm docker:downStop Docker PostgreSQL
pnpm docker:buildBuild Docker image
pnpm docker:prodRun production Docker container

Common Issues

DATABASE_URL not set — The app will crash on startup. Set it in .env.local.

Prisma client not generated — Run pnpm db:generate after cloning or after schema changes.

Auth error "AUTH_SECRET is not set" — Generate with openssl rand -base64 32 and add to .env.local.

OAuth redirect mismatch — Add http://localhost:3000/api/auth/callback/google (and /github) to your OAuth app's allowed redirect URIs.

Port 5432 in use — Another PostgreSQL instance is running. Stop it or change the Docker port mapping in docker-compose.yml.

Demo Mode — Explore freely. Some actions are restricted. demo@launchfst.dev / demo1234

Get LaunchFst →