Configuration
Configuration
Section titled “Configuration”This guide covers all configuration options for your Podcast Framework project, including environment variables, Astro configuration, and Sanity setup.
Environment Variables
Section titled “Environment Variables”Environment variables are stored in a .env file in your project root.
Required Variables
Section titled “Required Variables”These variables are required for the framework to work:
# Sanity CMS (Required)PUBLIC_SANITY_PROJECT_ID="your-sanity-project-id"PUBLIC_SANITY_DATASET="production"PUBLIC_SANITY_API_VERSION="2024-01-01"
# Site Configuration (Required)PUBLIC_SITE_URL="http://localhost:4321"Optional Variables
Section titled “Optional Variables”Add these as needed for additional features:
Newsletter (ConvertKit)
Section titled “Newsletter (ConvertKit)”CONVERTKIT_API_KEY="your-api-key"CONVERTKIT_FORM_ID="your-form-id"Where to get:
- Sign up at convertkit.com
- API Key: Settings → Advanced → API Secret
- Form ID: Forms → Select form → Form ID in URL
Contribution Emails (Resend)
Section titled “Contribution Emails (Resend)”RESEND_API_KEY="re_..."Where to get:
- Sign up at resend.com
- Create API key in dashboard
- Set notification email to where you want contributions sent
Analytics (Google Analytics 4)
Section titled “Analytics (Google Analytics 4)”PUBLIC_GA_MEASUREMENT_ID="G-XXXXXXXXXX"Where to get:
- Create GA4 property at analytics.google.com
- Admin → Data Streams → Web → Measurement ID
Error Tracking (Sentry)
Section titled “Error Tracking (Sentry)”SENTRY_ENVIRONMENT="production"Where to get:
- Create project at sentry.io
- Settings → Client Keys (DSN)
RSS Import
Section titled “RSS Import”RSS_FEED_URL="https://yourpodcast.com/feed.xml"Used by npm run import:episodes to import existing episodes.
Variable Naming
Section titled “Variable Naming”Podcast Framework follows Astro’s environment variable conventions:
Public Variables (accessible in browser):
PUBLIC_SANITY_PROJECT_ID="..."PUBLIC_SITE_URL="..."PUBLIC_GA_MEASUREMENT_ID="..."Private Variables (server-only):
RESEND_API_KEY="..."CONVERTKIT_API_KEY="..."SENTRY_DSN="..."Environment-Specific Configuration
Section titled “Environment-Specific Configuration”Use different .env files for different environments:
.env # Local development.env.production # Production (not committed).env.template # Template (committed to git)Production deployment:
- Don’t commit
.envor.env.production - Set variables in your hosting platform (Cloudflare, Netlify, etc.)
- Commit
.env.templateso team knows what’s needed
Astro Configuration
Section titled “Astro Configuration”Edit astro.config.mjs to configure Astro:
Basic Configuration
Section titled “Basic Configuration”import { defineConfig } from 'astro/config';import tailwind from '@astrojs/tailwind';
export default defineConfig({ site: 'https://yourpodcast.com', output: 'static', integrations: [tailwind()],});Key Options
Section titled “Key Options”Your production URL. Required for:
- Sitemap generation
- RSS feeds
- Canonical URLs
site: 'https://yourpodcast.com'output
Section titled “output”Rendering mode:
// Static Site Generation (recommended)output: 'static'
// Hybrid: SSG + on-demand renderingoutput: 'hybrid'
// Full server-side renderingoutput: 'server'build.inlineStylesheets
Section titled “build.inlineStylesheets”Control CSS inlining:
build: { inlineStylesheets: 'auto' // Auto-inline small CSS files}Options:
'auto'- Inline small stylesheets automatically'always'- Inline all stylesheets'never'- Never inline (separate CSS files)
Advanced Configuration
Section titled “Advanced Configuration”Custom Base Path
Section titled “Custom Base Path”Deploy to a subdirectory:
base: '/podcast',// Site will be at https://yoursite.com/podcastTrailing Slashes
Section titled “Trailing Slashes”trailingSlash: 'ignore' // /about or /about/ both worktrailingSlash: 'always' // Always /about/trailingSlash: 'never' // Always /aboutImage Optimization
Section titled “Image Optimization”image: { service: { entrypoint: 'astro/assets/services/sharp', config: { limitInputPixels: false, }, },}Tailwind Configuration
Section titled “Tailwind Configuration”Edit tailwind.config.mjs to customize Tailwind:
Default Configuration
Section titled “Default Configuration”export default { content: [ './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}', './node_modules/@rejected-media/podcast-framework-core/**/*.astro', ], theme: { extend: {}, }, plugins: [],};Custom Theme
Section titled “Custom Theme”Extend the default theme:
theme: { extend: { colors: { brand: { 50: '#f0f9ff', 100: '#e0f2fe', // ... more shades 900: '#0c4a6e', } }, fontFamily: { sans: ['Inter', 'sans-serif'], serif: ['Merriweather', 'serif'], }, },}Plugins
Section titled “Plugins”Add Tailwind plugins:
plugins: [ require('@tailwindcss/typography'), require('@tailwindcss/forms'),],Install first:
npm install @tailwindcss/typography @tailwindcss/formsTypeScript Configuration
Section titled “TypeScript Configuration”Edit tsconfig.json for TypeScript settings:
Recommended Configuration
Section titled “Recommended Configuration”{ "extends": "astro/tsconfigs/strict", "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "react", "baseUrl": ".", "paths": { "@components/*": ["src/components/*"], "@lib/*": ["src/lib/*"] } }}Path Aliases
Section titled “Path Aliases”Use path aliases for cleaner imports:
// Without aliasesimport { helper } from '../../../../lib/utils';
// With aliasesimport { helper } from '@lib/utils';Configure in tsconfig.json:
"paths": { "@components/*": ["src/components/*"], "@lib/*": ["src/lib/*"], "@layouts/*": ["src/layouts/*"]}Sanity Configuration
Section titled “Sanity Configuration”Edit sanity/sanity.config.ts for Sanity Studio:
Basic Configuration
Section titled “Basic Configuration”import { defineConfig } from 'sanity';import { structureTool } from 'sanity/structure';import { visionTool } from '@sanity/vision';import { schemaTypes } from './schemas';
export default defineConfig({ name: 'default', title: 'My Podcast',
projectId: process.env.PUBLIC_SANITY_PROJECT_ID!, dataset: process.env.PUBLIC_SANITY_DATASET || 'production',
plugins: [ structureTool(), visionTool(), ],
schema: { types: schemaTypes, },});Studio Customization
Section titled “Studio Customization”Custom Theme
Section titled “Custom Theme”import { defineConfig } from 'sanity';
export default defineConfig({ // ... other config theme: { fonts: { heading: { family: 'Inter, sans-serif', }, }, colors: { primary: '#3B82F6', }, },});Custom Document Actions
Section titled “Custom Document Actions”import { defineConfig } from 'sanity';
export default defineConfig({ // ... other config document: { actions: (prev, context) => { // Customize document actions return prev; }, },});Script Configuration
Section titled “Script Configuration”Add custom scripts to package.json:
Common Scripts
Section titled “Common Scripts”{ "scripts": { "dev": "astro dev", "dev:sanity": "cd sanity && npx sanity dev", "build": "astro check && astro build", "preview": "astro preview", "import:episodes": "node scripts/import-episodes.js", "init:theme": "node scripts/init-theme.js", "upload:photos": "node scripts/upload-guest-photos.js" }}Custom Scripts
Section titled “Custom Scripts”Create scripts in scripts/ directory:
import { getPodcast } from '@rejected-media/podcast-framework-core';
async function myScript() { const podcast = await getPodcast(); console.log(podcast);}
myScript();Run with:
node scripts/my-script.jsPlatform-Specific Configuration
Section titled “Platform-Specific Configuration”Cloudflare Pages
Section titled “Cloudflare Pages”Create _redirects in public/:
/api/* /api/:splat 200/old-page /new-page 301Netlify
Section titled “Netlify”Create netlify.toml:
[build] command = "npm run build" publish = "dist"
[[redirects]] from = "/old-page" to = "/new-page" status = 301Vercel
Section titled “Vercel”Create vercel.json:
{ "buildCommand": "npm run build", "outputDirectory": "dist", "devCommand": "npm run dev", "installCommand": "npm install"}Performance Configuration
Section titled “Performance Configuration”Optimize Images
Section titled “Optimize Images”export default defineConfig({ image: { service: { entrypoint: 'astro/assets/services/sharp', }, },});Prefetch Links
Section titled “Prefetch Links”export default defineConfig({ prefetch: { defaultStrategy: 'hover', prefetchAll: true, },});Build Optimization
Section titled “Build Optimization”export default defineConfig({ build: { inlineStylesheets: 'auto', assets: '_astro', }, vite: { build: { cssCodeSplit: true, rollupOptions: { output: { manualChunks: (id) => { if (id.includes('node_modules')) { return 'vendor'; } }, }, }, }, },});Configuration Best Practices
Section titled “Configuration Best Practices”1. Never Commit Secrets
Section titled “1. Never Commit Secrets”Add to .gitignore:
.env.env.local.env.productionCommit template:
.env.template # ✅ Safe to commit2. Use Environment Variables
Section titled “2. Use Environment Variables”Don’t hardcode:
// ❌ Badconst API_KEY = 'sk_live_abc123';
// ✅ Goodimport { getEnv } from '@rejected-media/podcast-framework-core';const API_KEY = getEnv('API_KEY');3. Document Requirements
Section titled “3. Document Requirements”Update .env.template with all variables:
# Required for CMSPUBLIC_SANITY_PROJECT_ID=
# Optional - NewsletterCONVERTKIT_API_KEY=CONVERTKIT_FORM_ID=4. Validate Configuration
Section titled “4. Validate Configuration”Check variables at build time:
import { getRequiredEnv } from '@rejected-media/podcast-framework-core';
export const config = { sanity: { projectId: getRequiredEnv('PUBLIC_SANITY_PROJECT_ID'), dataset: getRequiredEnv('PUBLIC_SANITY_DATASET'), },};getRequiredEnv() throws if variable is missing.
Troubleshooting
Section titled “Troubleshooting””Environment variable not found”
Section titled “”Environment variable not found””Check .env file exists and contains the variable:
cat .env | grep VARIABLE_NAME“Sanity client error”
Section titled ““Sanity client error””Verify PUBLIC_SANITY_PROJECT_ID matches your Sanity project:
npx sanity projects listTailwind styles not working
Section titled “Tailwind styles not working”Ensure tailwind.config.mjs includes framework paths:
content: [ './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}', './node_modules/@rejected-media/podcast-framework-core/**/*.astro', // ✅ Required]Build fails with type errors
Section titled “Build fails with type errors”Check TypeScript version:
npm list typescriptUpdate if needed:
npm install typescript@latestNext Steps
Section titled “Next Steps”- Components - Learn about framework components
- Sanity CMS - Set up content management
- Deployment - Deploy to production
- Customization - Customize your site