Skip to content

Feature Flags

Overview

Feature flags allow shipping code to production without immediately exposing features. For MVP, flags are implemented as environment variables — no external service needed until Phase 2.

Current Flags

FlagDefaultDescription
NEXT_PUBLIC_FEATURE_PODCASTfalsePodcast section on home + /podcast page
NEXT_PUBLIC_FEATURE_MEDIA_KITfalseEmail-gated media kit download
NEXT_PUBLIC_FEATURE_CALENDLYfalseCalendly embed on contact page
NEXT_PUBLIC_FEATURE_HUBSPOT_SYNCfalseSync leads to HubSpot CRM
NEXT_PUBLIC_FEATURE_PLAUSIBLEfalsePlausible analytics script
NEXT_PUBLIC_FEATURE_SENTRYfalseSentry error tracking

Usage

lib/flags.ts
export const flags = {
podcast: process.env.NEXT_PUBLIC_FEATURE_PODCAST === 'true',
mediaKit: process.env.NEXT_PUBLIC_FEATURE_MEDIA_KIT === 'true',
calendly: process.env.NEXT_PUBLIC_FEATURE_CALENDLY === 'true',
hubspotSync: process.env.NEXT_PUBLIC_FEATURE_HUBSPOT_SYNC === 'true',
plausible: process.env.NEXT_PUBLIC_FEATURE_PLAUSIBLE === 'true',
sentry: process.env.NEXT_PUBLIC_FEATURE_SENTRY === 'true',
} as const;
// In a component
import { flags } from '@/lib/flags';
export function PodcastSection() {
if (!flags.podcast) return null;
return <section>...</section>;
}

Environment Matrix

EnvironmentPodcastMedia KitCalendlyHubSpot
Developmenttruetruefalsefalse
Stagingtruetruetruetrue
Production (pre-launch)falsefalsefalsefalse
Production (post-launch)truetruetruetrue

Milestone Gates

MilestoneFlags Enabled
M4 — BookingNone (booking form is in main flow)
M5 — Media KitFEATURE_MEDIA_KIT
M6 — PodcastFEATURE_PODCAST
M7 — SEOFEATURE_PLAUSIBLE, FEATURE_SENTRY
M8 — LaunchAll flags enabled in production

Adding a Flag

  1. Add to .env.example with description and default value
  2. Add to lib/flags.ts
  3. Update this document
  4. Set in Vercel Environment Variables per environment