APP_NAME="TryPost" APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=http://localhost # Public base URL inbound webhooks (e.g. Telegram) are registered on. # Defaults to APP_URL; set a tunnel URL (e.g. ngrok) for local development. WEBHOOK_URL= # Self-hosted mode (skips payment requirements) SELF_HOSTED=true # Allow more than one connected account per social network in a workspace. # Independent of SELF_HOSTED (Cloud default is false). Self-hosted typically wants true. ALLOW_MULTIPLE_SOCIAL_ACCOUNTS=true # Rewrite links in the X version of a post as non-clickable (example(.)com), so # X does not bill them at the link-post rate. Self-hosted installs publish through # their own X app and pay their own bill, so set true only if you want it. X_DEFUSE_LINKS=false META_PAGE_WALK_SECONDS=20 # Passport OAuth keys (API tokens / MCP). Prefer env vars over key files so # every node behind a load balancer shares the same key pair. Use literal \n # for newlines in the PEM. When unset, Passport falls back to storage/oauth-*.key # (generate with: php artisan passport:keys). # PASSPORT_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----" # PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----" TELESCOPE_ENABLED=false APP_LOCALE=en APP_FALLBACK_LOCALE=en APP_FAKER_LOCALE=en_US APP_MAINTENANCE_DRIVER=file BCRYPT_ROUNDS=12 LOG_CHANNEL=stack LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug # Database (PostgreSQL or MySQL) # PostgreSQL: DB_CONNECTION=pgsql, DB_PORT=5432, DB_USERNAME=postgres # MySQL: DB_CONNECTION=mysql, DB_PORT=3306, DB_USERNAME=root DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=trypost DB_USERNAME=postgres DB_PASSWORD= # Session SESSION_DRIVER=database SESSION_LIFETIME=1440 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null # Broadcasting, Queue, Cache BROADCAST_CONNECTION=reverb QUEUE_CONNECTION=redis CACHE_STORE=redis # File Storage # Options: local, s3, r2 (or any S3-compatible: MinIO, DigitalOcean Spaces, etc.) FILESYSTEM_DISK=local # Redis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 # Mail MAIL_MAILER=smtp MAIL_HOST=127.0.0.1 MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="hello@example.com" MAIL_FROM_NAME="${APP_NAME}" # Reverb (WebSockets) REVERB_APP_ID=1001 REVERB_APP_KEY=your-reverb-key REVERB_APP_SECRET=your-reverb-secret REVERB_HOST="localhost" REVERB_PORT=8080 REVERB_SCHEME=http # AWS S3 (set FILESYSTEM_DISK=s3) AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=ap-south-2 AWS_BUCKET=trypostmedia AWS_URL=https://d28qhqo5myc2wf.cloudfront.net # Cloudflare R2 (set FILESYSTEM_DISK=r2) R2_ACCESS_KEY_ID= R2_SECRET_ACCESS_KEY= R2_ENDPOINT= R2_REGION=auto R2_BUCKET= R2_URL= # DigitalOcean Spaces (set FILESYSTEM_DISK=spaces) SPACES_ACCESS_KEY_ID= SPACES_SECRET_ACCESS_KEY= SPACES_ENDPOINT= SPACES_REGION= SPACES_BUCKET= # ============================================ # Social Platform Credentials # ============================================ # Get your API keys from each platform's developer portal # LinkedIn (https://developer.linkedin.com) LINKEDIN_CLIENT_ID= LINKEDIN_CLIENT_SECRET= LINKEDIN_CLIENT_REDIRECT="${APP_URL}/accounts/linkedin/callback" # LINKEDIN_SCOPES="openid,profile,email,w_member_social" # LINKEDIN_PAGE_SCOPES="openid,profile,email,w_organization_social,r_organization_social,rw_organization_admin,w_member_social" # X / Twitter (https://developer.twitter.com) X_CLIENT_ID= X_CLIENT_SECRET= X_CLIENT_REDIRECT="${APP_URL}/accounts/x/callback" # TikTok (https://developers.tiktok.com) TIKTOK_CLIENT_ID= TIKTOK_CLIENT_SECRET= TIKTOK_CLIENT_REDIRECT="${APP_URL}/accounts/tiktok/callback" # Facebook (https://developers.facebook.com) FACEBOOK_CLIENT_ID= FACEBOOK_CLIENT_SECRET= FACEBOOK_CLIENT_REDIRECT="${APP_URL}/accounts/facebook/callback" # Instagram (https://developers.facebook.com) INSTAGRAM_CLIENT_ID= INSTAGRAM_CLIENT_SECRET= INSTAGRAM_CLIENT_REDIRECT="${APP_URL}/accounts/instagram/callback" # Threads (https://developers.facebook.com) THREADS_CLIENT_ID= THREADS_CLIENT_SECRET= THREADS_CLIENT_REDIRECT="${APP_URL}/accounts/threads/callback" # Google (https://console.cloud.google.com) # Used for YouTube social account connection AND Google login/signup GOOGLE_AUTH_ENABLED=false GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= GOOGLE_CLIENT_REDIRECT="${APP_URL}/accounts/youtube/callback" GOOGLE_AUTH_CALLBACK="${APP_URL}/auth/google/callback" # GitHub (https://github.com/settings/developers) # Used for GitHub login/signup GITHUB_AUTH_ENABLED=false GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= GITHUB_AUTH_CALLBACK="${APP_URL}/auth/github/callback" # Pinterest (https://developers.pinterest.com) PINTEREST_CLIENT_ID= PINTEREST_CLIENT_SECRET= PINTEREST_CLIENT_REDIRECT="${APP_URL}/accounts/pinterest/callback" # Telegram (single shared bot — create one via https://t.me/BotFather) # After setting these, run: php artisan telegram:set-webhook TELEGRAM_BOT_TOKEN= TELEGRAM_BOT_USERNAME= TELEGRAM_WEBHOOK_SECRET= # Discord (single shared app+bot — create one via https://discord.com/developers/applications) # OAuth2 → add the redirect below; Bot → enable "Server Members Intent" for mention search. DISCORD_CLIENT_ID= DISCORD_CLIENT_SECRET= DISCORD_BOT_TOKEN= DISCORD_CLIENT_REDIRECT="${APP_URL}/accounts/discord/callback" # AI Services OPENAI_API_KEY= ANTHROPIC_API_KEY= GEMINI_API_KEY= OPENROUTER_API_KEY= ELEVENLABS_API_KEY= # Only needed if you point one of the AI_*_PROVIDER vars below at these providers. # XAI_API_KEY= # GROQ_API_KEY= # MISTRAL_API_KEY= # DEEPSEEK_API_KEY= # Ollama runs locally and needs no key — set the URL only if it isn't on the default port. # OLLAMA_URL=http://localhost:11434 # Any OpenAI-compatible endpoint (LM Studio, vLLM, LocalAI, ...) via AI_TEXT_PROVIDER=openai-compatible. # It has no built-in default model, so OPENAI_COMPATIBLE_TEXT_MODEL is required for that provider. # OPENAI_COMPATIBLE_URL= # OPENAI_COMPATIBLE_API_KEY= # OPENAI_COMPATIBLE_TEXT_MODEL= # AI Provider Selection # text: openai | anthropic | gemini | openrouter | xai | groq | mistral | deepseek | ollama | ... # image: openai | gemini | xai | openrouter | ... # audio: openai | elevenlabs | gemini | openrouter | ... # OpenRouter is a first-class laravel/ai provider (AI_TEXT_PROVIDER=openrouter + OPENROUTER_API_KEY). AI_TEXT_PROVIDER=openai AI_IMAGE_PROVIDER=openai AI_AUDIO_PROVIDER=elevenlabs # AI Model Overrides (optional) # Each provider picks a sensible default model per capability on its own - # these are NOT shared across capabilities, so overriding one (e.g. a text # model) never affects another (e.g. that same provider's image model). # Uncomment only the ones you want to override; every provider in play above # (AI_TEXT_PROVIDER / AI_IMAGE_PROVIDER / AI_AUDIO_PROVIDER) reads its own set. # The values below are laravel/ai's current defaults, shown as format examples - # they move with the package, so don't treat them as a contract. # OPENAI_TEXT_MODEL=gpt-5.4 # OPENAI_IMAGE_MODEL=gpt-image-2 # OPENAI_AUDIO_MODEL=gpt-4o-mini-tts # ANTHROPIC_TEXT_MODEL=claude-sonnet-5 # GEMINI_TEXT_MODEL=gemini-3.6-flash # GEMINI_IMAGE_MODEL=gemini-3.1-flash-image-preview # GEMINI_AUDIO_MODEL=gemini-2.5-flash-preview-tts # XAI_TEXT_MODEL=grok-4.20-non-reasoning # XAI_IMAGE_MODEL=grok-imagine-image # OPENROUTER_TEXT_MODEL=anthropic/claude-sonnet-4.6 # OPENROUTER_IMAGE_MODEL=google/gemini-3.1-flash-image-preview # OPENROUTER_AUDIO_MODEL=google/gemini-3.1-flash-tts-preview # ELEVENLABS_AUDIO_MODEL=eleven_multilingual_v2 # GROQ_TEXT_MODEL=openai/gpt-oss-120b # MISTRAL_TEXT_MODEL=mistral-medium-latest # DEEPSEEK_TEXT_MODEL=deepseek-v4-flash # OLLAMA_TEXT_MODEL=llama3.1:8b # Ollama has no image/audio-capable driver in laravel/ai - text only. # ============================================ # Stripe (Cashier — billing) # ============================================ # Required when SELF_HOSTED=false. Get keys at https://dashboard.stripe.com/apikeys STRIPE_KEY= STRIPE_SECRET= STRIPE_WEBHOOK_SECRET= # SaaS default (recipe A): 8-day Stripe trial with card, no coupon, no promo field. # REQUIRE_CARD_FOR_TRIAL=true forces Checkout before app access (no generic trial). REQUIRE_CARD_FOR_TRIAL=true # Trial length in days. Card-required Checkout uses trialDays for first-time # subscribers when no first-month coupon is applied; re-subscribers skip trial. # No-card mode uses this for accounts.trial_ends_at. 0 = off. CASHIER_TRIAL_DAYS=8 # Optional Stripe Coupon ID (amount_off, duration=once). When set for a qualifying # first-time single-workspace checkout, applies the coupon and SKIPS trialDays # (e.g. TRIAL1USD for a $1 first month). Empty = trial mode above. # XOR with CASHIER_ALLOW_PROMOTION_CODES only when the coupon would apply — # Stripe forbids both on one session (ConfigureSubscriptionCheckout throws). STRIPE_FIRST_MONTH_COUPON_ID= # Show Stripe Checkout promotion-code field when no coupon is applied. # Defaults to false (recipe A). Must be false when a first-month coupon applies. CASHIER_ALLOW_PROMOTION_CODES=false # Stripe Plan Price IDs (one per plan × interval). Used by PlanSeeder. STRIPE_WORKSPACE_MONTHLY= STRIPE_WORKSPACE_YEARLY= # Laravel Nightwatch (production telemetry — disabled by default in dev) NIGHTWATCH_ENABLED=false NIGHTWATCH_TOKEN= # Platform feature flags (all default to true; set to false to hide a platform) # TIKTOK_ENABLED=true # PINTEREST_ENABLED=true # MASTODON_ENABLED=true # BLUESKY_ENABLED=true # TELEGRAM_ENABLED=true # Media Services UNSPLASH_ACCESS_KEY= UNSPLASH_SECRET_KEY= GIPHY_API_KEY= # Google Tag Manager (optional - analytics) GTM_ID= # PostHog (optional - analytics; off by default, self-hosted installs can ignore) POSTHOG_ENABLED=false POSTHOG_API_KEY= POSTHOG_HOST=https://us.i.posthog.com # Vite VITE_APP_NAME="${APP_NAME}" VITE_REVERB_APP_KEY="${REVERB_APP_KEY}" VITE_REVERB_HOST="${REVERB_HOST}" VITE_REVERB_PORT="${REVERB_PORT}" VITE_REVERB_SCHEME="${REVERB_SCHEME}" VITE_POSTHOG_ENABLED="${POSTHOG_ENABLED}" VITE_POSTHOG_API_KEY="${POSTHOG_API_KEY}" VITE_POSTHOG_HOST="${POSTHOG_HOST}"