Required
- DatabasePostgreSQL is connected
DATABASE_URL - App URLhttps://postlume-app-demo.templates.codememory.com
APP_URL - App secretSet · 64 characters
APP_SECRET - Publishing workerRunning · last heartbeat 3 s ago
Optional services
- Email (SMTP)Turned off on the demo
SMTP_HOST - Payments (Stripe)STRIPE_SECRET_KEY is not set. Checkout runs in demo mode.
STRIPE_SECRET_KEY - File storageLocal folder /app/uploads is writable
S3_BUCKET - AI providerDemo writer (the live demo never spends AI credits)
OPENAI_API_KEY
Social networks
- No live networks yetAdd app keys in Admin → AI and network keys
- X, LinkedIn, Facebook, Instagram, Threads, Bluesky, YouTube, TikTok, PinterestDemo provider in use until keys are added: posts appear in the demo feed only
Sample data
The Fernwood Coffee workspace and 14 sample customers are loaded
Remove it before you launch. Only sample workspaces, their files and sample people are deleted; your own data stays.
Every key in .env
Restart the app and the worker after changing .env
Required
DATABASE_URLrequiredPostgreSQL connection string. The Docker stack builds it from the POSTGRES_* keys.APP_URLrequiredPublic address of your site without a trailing slash, e.g. https://social.example.com. Used in emails, OAuth callbacks and media links.APP_SECRETrequiredA long random string (32+ characters) that encrypts saved keys and tokens. Generate one with `openssl rand -hex 32`. Never change it after launch.
Docker stack
POSTGRES_DBrequiredDatabase name the Docker stack creates.POSTGRES_USERrequiredDatabase user the Docker stack creates.POSTGRES_PASSWORDrequiredDatabase password (letters and digits only; it goes into a URL).WEB_PORTHost port for the website (default 3000).DOMAINYour domain for automatic HTTPS with the optional Caddy profile.
Email
SMTP_HOSTSMTP server for invites, approvals and password resets. Empty = emails are written to the server log.SMTP_PORTSMTP port, usually 587 (STARTTLS) or 465 (SSL).SMTP_USERSMTP user name.SMTP_PASSSMTP password or API key.SMTP_SECURE"true" for SSL on port 465. Leave empty to decide from the port.MAIL_FROMSender, e.g. "Postlume <hello@example.com>".
File storage
S3_BUCKETS3-compatible bucket for media. Empty = the local uploads folder (a Docker volume).S3_ENDPOINTEndpoint for MinIO, Cloudflare R2 or Backblaze B2. Leave empty for AWS S3.S3_REGIONBucket region (default us-east-1; R2 uses auto).S3_ACCESS_KEY_IDAccess key for the bucket.S3_SECRET_ACCESS_KEYSecret key for the bucket.UPLOAD_DIRLocal uploads folder when no bucket is set (default ./uploads).MAX_UPLOAD_MBLargest video upload in MB (default 200; images are capped at 20).
Payments
STRIPE_SECRET_KEYStripe secret key (dashboard.stripe.com → Developers → API keys). Empty = demo checkout.STRIPE_WEBHOOK_SECRETSigning secret of the webhook pointing at <APP_URL>/api/stripe/webhook.CURRENCYThree-letter currency for new Stripe prices (default usd).
AI
AI_PROVIDERopenai, anthropic or gemini. Can also be chosen in Admin → AI and network keys.OPENAI_API_KEYOpenAI key (platform.openai.com → API keys): captions and images.ANTHROPIC_API_KEYAnthropic key (console.anthropic.com): captions. Images then use the OpenAI or Gemini key if set.GEMINI_API_KEYGoogle AI Studio key (aistudio.google.com): captions and images.AI_TEXT_MODELOverride the text model (defaults: gpt-5-mini, claude-opus-5-5, gemini-2.5-flash).AI_IMAGE_MODELOverride the image model (defaults: gpt-image-1, gemini-2.5-flash-image).
Sign-in
GOOGLE_CLIENT_IDGoogle OAuth client for “Continue with Google”. Empty = the button is hidden.GOOGLE_CLIENT_SECRETSecret of the Google OAuth client.
Social networks
X_CLIENT_IDX app ID / client ID (developer.x.com). Empty = the demo provider for X.X_CLIENT_SECRETX app secret. Can also be saved in Admin → AI and network keys.LINKEDIN_CLIENT_IDLinkedIn app ID / client ID (linkedin.com/developers). Empty = the demo provider for LinkedIn.LINKEDIN_CLIENT_SECRETLinkedIn app secret. Can also be saved in Admin → AI and network keys.FACEBOOK_CLIENT_IDFacebook and Instagram app ID / client ID (developers.facebook.com). Empty = the demo provider for Facebook and Instagram.FACEBOOK_CLIENT_SECRETFacebook and Instagram app secret. Can also be saved in Admin → AI and network keys.THREADS_CLIENT_IDThreads app ID / client ID (developers.facebook.com, Threads use case). Empty = the demo provider for Threads.THREADS_CLIENT_SECRETThreads app secret. Can also be saved in Admin → AI and network keys.YOUTUBE_CLIENT_IDYouTube app ID / client ID (console.cloud.google.com). Empty = the demo provider for YouTube.YOUTUBE_CLIENT_SECRETYouTube app secret. Can also be saved in Admin → AI and network keys.TIKTOK_CLIENT_IDTikTok app ID / client ID (developers.tiktok.com, the client key). Empty = the demo provider for TikTok.TIKTOK_CLIENT_SECRETTikTok app secret. Can also be saved in Admin → AI and network keys.PINTEREST_CLIENT_IDPinterest app ID / client ID (developers.pinterest.com). Empty = the demo provider for Pinterest.PINTEREST_CLIENT_SECRETPinterest app secret. Can also be saved in Admin → AI and network keys.TIKTOK_PRIVACYSELF_ONLY until TikTok audits your app, then PUBLIC_TO_EVERYONE.BLUESKY_SERVICEBluesky server (default https://bsky.social). Bluesky needs no app keys.
Advanced
DEMO_MODELeave empty. "true" turns on the public-demo mode: one-click demo sign-in, demo providers everywhere, no outgoing email.NEXT_PUBLIC_APP_NAMELocks the product name (otherwise set in Admin → Branding).WORKER_INTERVAL_SECONDSHow often the worker looks for due posts (default 15).