APP_NAME=Shoutrrr APP_ENV=local APP_KEY= APP_URL=http://127.0.0.1:8000 # Host the browser uses for Vite assets/HMR (not 0.0.0.0). Defaults to APP_URL host # when APP_URL is HTTP. HTTPS APP_URL (Cloudflare tunnel) cannot use Vite HMR — # public/hot is skipped and Laravel serves public/build. After frontend changes: # bun run build # Set VITE_HMR_HOST only for plain HTTP LAN access (browser host ≠ APP_URL host). VITE_HMR_HOST= # VITE_PORT=5173 # Disable social login unless OAuth credentials are configured. SOCIALITE_ENABLED=false # ---------------------------------------------------------------------- # Optional production / deployment overrides # ---------------------------------------------------------------------- # APP_URL=https://your-app.example # SESSION_SECURE_COOKIE=true # Trust reverse-proxy headers (X-Forwarded-Proto/-Host/-Port) so HTTPS redirects # and OAuth callback URLs are generated correctly behind Coolify/Traefik. Set to # `*` when the container is only reachable through the proxy, or a comma-separated # list of proxy IPs/CIDRs. Leave unset to trust no proxies. # TRUSTED_PROXIES=* # Passport keys for API/MCP tokens are generated on disk automatically the first # time an API key is issued. To manage the keypair yourself, set both # PASSPORT_PRIVATE_KEY and PASSPORT_PUBLIC_KEY, and/or set the flag below to # false so Shoutrrr never mints its own (issuing without keys then fails loudly). # PASSPORT_AUTO_GENERATE_KEYS=false # Disk used for all media (images + video). Use `public` for local/public # storage, or `s3` with the AWS_* values below for object storage. # FILESYSTEM_DISK=public # To store media on S3 (or S3-compatible: MinIO, R2, Spaces), set # FILESYSTEM_DISK=s3 and fill these in. Direct video uploads require bucket CORS # to allow PUT from APP_URL and expose ETag; client-side video editing also requires # GET from APP_URL (the editor fetches the source blob directly). Expire tmp/media/ after ~1 day. # AWS_ACCESS_KEY_ID= # AWS_SECRET_ACCESS_KEY= # AWS_DEFAULT_REGION=us-east-1 # AWS_BUCKET= # AWS_ENDPOINT= # AWS_URL= # AWS_USE_PATH_STYLE_ENDPOINT=true # Optionally store only profile photos and workspace logos on a separate public # S3-compatible disk, such as a Hetzner bucket behind Bunny CDN. When unset, # these images continue using FILESYSTEM_DISK and the AWS_* settings above. # PUBLIC_IMAGES_DISK=public-images # PUBLIC_IMAGES_BUCKET= # PUBLIC_IMAGES_URL=https://cdn.shoutrrr.com # Social login (Laravel Socialite). Supported: google, x, linkedin. # SOCIALITE_ENABLED=true # SOCIALITE_PROVIDERS=google,x,linkedin # GOOGLE_CLIENT_ID= # GOOGLE_CLIENT_SECRET= # GOOGLE_REDIRECT_URI="${APP_URL}/auth/google/callback" # Connected accounts (workspace-owned posting accounts). Register callbacks: # X: ${APP_URL}/accounts/callback/x # LinkedIn: ${APP_URL}/accounts/callback/linkedin # Facebook+Instagram: ${APP_URL}/accounts/callback/meta (one Meta app; IG discovered via linked Pages) # Threads: ${APP_URL}/accounts/callback/threads (a separate Meta app) # X — scopes: users.read, users.email, tweet.read, tweet.write, media.write, offline.access # X_CLIENT_ID= # X_CLIENT_SECRET= # X_REDIRECT_URI="${APP_URL}/accounts/callback/x" # X_BEARER_TOKEN= # LinkedIn — scopes: openid, profile, email, w_member_social # LINKEDIN_CLIENT_ID= # LINKEDIN_CLIENT_SECRET= # LINKEDIN_REDIRECT_URI="${APP_URL}/accounts/callback/linkedin" # Facebook + Instagram — one Meta app. Scopes: pages_show_list, pages_read_engagement, # pages_manage_posts, pages_read_user_content, pages_manage_engagement, read_insights, # business_management, instagram_basic, instagram_content_publish, # instagram_manage_comments, instagram_manage_insights. Publishing needs Meta App # Review + Business Verification for non-test accounts. # FACEBOOK_CLIENT_ID= # FACEBOOK_CLIENT_SECRET= # FACEBOOK_REDIRECT_URI="${APP_URL}/accounts/callback/meta" # FACEBOOK_GRAPH_VERSION=v25.0 # Threads — separate Meta app. Scopes: threads_basic, threads_content_publish, threads_delete, # threads_manage_replies, threads_manage_insights. # THREADS_CLIENT_ID= # THREADS_CLIENT_SECRET= # THREADS_REDIRECT_URI="${APP_URL}/accounts/callback/threads" # Docker / Octane knobs when overriding compose/image defaults. # Local-disk video uploads stream to storage and the app bounds the bytes it # writes, so memory/disk stay flat; post_max_size still needs headroom above the # 1 GiB video ceiling or Laravel rejects a legitimate large upload up front. If a # reverse proxy fronts the app, raise its request-body limit to >= 1.1 GiB too. # For large or production deployments, prefer S3/object storage (FILESYSTEM_DISK=s3) # — uploads then go direct-to-storage, never through PHP. # PHP_POST_MAX_SIZE=1100M # PHP_UPLOAD_MAX_FILE_SIZE=1100M # PHP_MEMORY_LIMIT=512M # QUEUE_WORKER_ENABLED=false # QUEUE_WORKER_COUNT=3 # SCHEDULER_ENABLED=false # INERTIA_SSR_ENABLED=true # Sentry error & performance monitoring. Entirely opt-in: leave the DSNs empty # to keep it disabled. Backend and frontend use separate DSNs (separate Sentry # projects) so server and browser issues route independently; the frontend DSN # is exposed to the browser, which is expected for a Sentry DSN. Release is # auto-derived from APP_VERSION and environment from APP_ENV unless # overridden. Tracing samples 20% by default; set the rates to 0 for errors-only. # SENTRY_LARAVEL_DSN= # SENTRY_FRONTEND_DSN= # SENTRY_TRACES_SAMPLE_RATE=0.2 # SENTRY_FRONTEND_TRACES_SAMPLE_RATE=0.2 # SENTRY_ENVIRONMENT= # SENTRY_RELEASE= FEEDBACK_DISCORD_WEBHOOK_URL= FEEDBACK_ENABLED=false KLIPY_API_KEY= KLIPY_SHARE_TRIGGER=true KLIPY_RATING=pg-13