Skip to main content
All configuration for a self-hosted PostSider instance is managed through environment variables. Copy the repository’s .env.example to .env and fill in the values relevant to your deployment. The bundled Compose stack requires the database, Redis, Temporal, and MinIO variables shown below; some application checks are diagnostic rather than startup validation.
This page is for people running their own PostSider instance. On PostSider Cloud, the instance is already configured - you only manage your account, channels, and API keys.

Core and URLs

Required secrets and database

Docker storage (MinIO)

Cloudflare R2 (STORAGE_PROVIDER=cloudflare): CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_ACCESS_KEY, CLOUDFLARE_SECRET_ACCESS_KEY, CLOUDFLARE_BUCKETNAME, CLOUDFLARE_BUCKET_URL, CLOUDFLARE_REGION.

Temporal

Self-hosting flags

Leave NOT_SECURED unset in production. Do not set NOT_SECURED=false: some startup checks treat any non-empty value as insecure, while middleware checks vary by path. This mode is intended only for isolated local development.

Email

Invitations, password resets, activation links, and approval notifications are sent through the configured provider. If email is not configured, deliver invite and reset links manually.

AI

Self-hosted instances can instead let each organization provide its own key under Settings → Post Checker. See AI Assistant.

Social platform credentials

Each OAuth platform reads its app credentials from environment variables. Configure only the platforms you use and register each callback at https://your-domain.com/integrations/social/<provider>: X_API_KEY/X_API_SECRET, LINKEDIN_CLIENT_ID/LINKEDIN_CLIENT_SECRET, GITHUB_CLIENT_ID/GITHUB_CLIENT_SECRET, FACEBOOK_APP_ID/FACEBOOK_APP_SECRET, INSTAGRAM_APP_ID/INSTAGRAM_APP_SECRET, THREADS_APP_ID/THREADS_APP_SECRET, YOUTUBE_CLIENT_ID/YOUTUBE_CLIENT_SECRET, GOOGLE_GMB_CLIENT_ID/GOOGLE_GMB_CLIENT_SECRET, TIKTOK_CLIENT_ID/TIKTOK_CLIENT_SECRET, PINTEREST_CLIENT_ID/PINTEREST_CLIENT_SECRET, DRIBBBLE_CLIENT_ID/DRIBBBLE_CLIENT_SECRET, DISCORD_CLIENT_ID/DISCORD_CLIENT_SECRET/DISCORD_BOT_TOKEN_ID, SLACK_ID/SLACK_SECRET, TWITCH_CLIENT_ID/TWITCH_CLIENT_SECRET, WHOP_CLIENT_ID, MASTODON_URL/MASTODON_CLIENT_ID/MASTODON_CLIENT_SECRET, TELEGRAM_TOKEN/TELEGRAM_BOT_NAME/NEXT_PUBLIC_TELEGRAM_BOT_NAME, NEYNAR_CLIENT_ID/NEYNAR_SECRET_KEY. Credential-based platforms (Bluesky, Nostr, WordPress, Medium, and other token/username-password providers) are connected directly in the dashboard and need no environment variable. See the Channels guides for per-platform details.

Billing (Polar)

Leaving POLAR_ACCESS_TOKEN empty keeps a self-hosted instance unlimited. To enable managed billing, configure the token, server (sandbox or production), webhook secret, and all eight product mappings for Standard/Team/Pro/Ultimate monthly and yearly products (POLAR_PRODUCT_*). On Cloud these are set for you. See Billing.

Generic OIDC / SSO

Connect an external identity provider (for example Authentik): POSTSIDER_GENERIC_OAUTH, POSTSIDER_OAUTH_URL, POSTSIDER_OAUTH_AUTH_URL, POSTSIDER_OAUTH_TOKEN_URL, POSTSIDER_OAUTH_USERINFO_URL, POSTSIDER_OAUTH_CLIENT_ID, POSTSIDER_OAUTH_CLIENT_SECRET, NEXT_PUBLIC_POSTSIDER_OAUTH_DISPLAY_NAME, NEXT_PUBLIC_POSTSIDER_OAUTH_LOGO_URL. DUB_TOKEN/DUB_API_ENDPOINT/DUB_SHORT_LINK_DOMAIN, KUTT_API_KEY/KUTT_API_ENDPOINT/KUTT_SHORT_LINK_DOMAIN, SHORT_IO_SECRET_KEY, LINK_DRIP_API_KEY/LINK_DRIP_API_ENDPOINT/LINK_DRIP_SHORT_LINK_DOMAIN.

Monitoring and analytics (optional)

Media and content

Public API rate limiting

Frontend build arguments

NEXT_PUBLIC_* values are baked into the frontend bundle at build time: NEXT_PUBLIC_BACKEND_URL, NEXT_PUBLIC_SELF_HOSTED, NEXT_PUBLIC_DISABLE_REGISTRATION, NEXT_PUBLIC_VERSION, NEXT_PUBLIC_TELEGRAM_BOT_NAME. Changing any of these requires rebuilding the image.

Other

Full example

A minimal production-ready .env: