.env.local file (or Vercel environment settings) for frontend variables.
Convex backend
Set the following variables in your Convex project’s Settings → Environment Variables dashboard.Required
RSA private key used by Convex Auth to sign JWTs. Generate an RSA key pair and paste the private key here. The value should begin with
-----BEGIN PRIVATE KEY-----.OpenRouter API key used by Convex actions to call the Vision Language Model for automatic image analysis. This is the primary variable name checked by the backend.
OPENROUTER_API_KEY is also accepted as a fallback — set either one.fal.ai API key used by Convex actions to generate cinematic image variations via fal.ai Nano Banana Pro.
Bearer token that protects the Discord ingest HTTP endpoints (
/ingestExternal, /discordQueue, /discordModerate). Set the same value in your Discord bot’s environment.Base URL of your NextCloud WebDAV endpoint, including the user path. Example:
https://cloud.example.com/remote.php/dav/files/usernameNextCloud username used for WebDAV authentication.
NextCloud app password for WebDAV authentication. Generate this in NextCloud under Settings → Security → App passwords.
Google OAuth client ID. Create credentials at console.cloud.google.com. Required if Google sign-in is enabled.
Google OAuth client secret corresponding to
AUTH_GOOGLE_ID.GitHub OAuth App client ID. Create an OAuth App at github.com/settings/developers. Required if GitHub sign-in is enabled.
GitHub OAuth App client secret corresponding to
AUTH_GITHUB_ID.Public URL of your deployed Pindeck app, without a trailing slash. Used by Convex Auth to construct OAuth redirect/callback URLs. Example:
https://pindeck.appOptional
The OpenRouter model ID to use for Vision Language Model image analysis. Defaults to
qwen/qwen3-vl-8b-instruct if not set.Controls provider selection order when calling OpenRouter. Accepted values:
price, throughput, or latency.Discord webhook URL for posting status notifications when images are queued, approved, rejected, or generated. Create a webhook in your Discord channel under Integrations → Webhooks.
Storage path prefix inside your NextCloud instance where uploaded files are written. Defaults to
pindeck/media-uploads. Uploaded files are organized as <prefix>/YYYY/MM_DD/original/<file>.Public share token for the upload root folder in NextCloud. When set, Pindeck derives browser-safe image URLs from this token using
public.php/dav/files/<token>/... paths, avoiding per-file share creation.A separate write-enabled share token used by the backend for uploading files. Recommended when you want to keep the public read token separate from the write token.
Optional override for the shared root path. Defaults to the value of
NEXTCLOUD_UPLOAD_PREFIX when not set.Optional override for the NextCloud base URL used when constructing public image URLs. Set this when NextCloud is served behind a reverse proxy with a different hostname.
Other optional backend variables
Google AI (Gemini) API key. Reserved for potential future use with Google’s generative AI models. Not required for current image analysis or generation features.
Frontend
Set the following variables in your.env.local file for local development, or in your Vercel project’s environment variable settings for deployed builds.
Your Convex production deployment URL. Must be the
.convex.cloud URL — not the .convex.site URL. This value is read by the Vite frontend at build time and validated before every build, serve, and deploy:convex command.Optional Convex site URL (the
.convex.site domain). Used when frontend tooling or integrations need to reference Convex HTTP action endpoints directly.The short deployment name (e.g.
tremendous-jaguar-953). Used by CI systems and Vercel to identify the target deployment during convex deploy runs. Set this alongside CONVEX_DEPLOY_KEY when automating deployments.Convex deploy key for CI-based deployments. Generate this in the Convex dashboard under Settings → Deploy Key. Not required for local development with the Convex CLI.