.env.example

# Cloudflare, for every stage: Alchemy deploys and runs dev against real
# D1 and R2.
CLOUDFLARE_API_TOKEN=
CLOUDFLARE_ACCOUNT_ID=

# Better Auth
# Only the production stage (plan/deploy) needs this; dev stages mint their own.
BETTER_AUTH_SECRET=
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
# Non-production staging login key; generate with: openssl rand -hex 32
# Uncomment after generating; an empty value fails secret validation.
# TEST_LOGIN_KEY=

# Polar organization access token. Production uses the live organization
# (POLAR_ACCESS_TOKEN); every other stage uses the sandbox organization
# (POLAR_SANDBOX_ACCESS_TOKEN). Scopes: products, webhooks, checkouts,
# customers and customer sessions, read and write.
POLAR_SANDBOX_ACCESS_TOKEN=
POLAR_ACCESS_TOKEN=
# Paid plans default to open on every stage but production, which waits for
# PAID_PLANS_OPEN=true (docs/PRODUCT.md). Set false to see a stage closed.
# A closed stage never reads its Polar token.
# PAID_PLANS_OPEN=false

# Staging and preview stages email only these addresses (comma-separated) and
# log the rest. Production emails anyone; local dev writes .eml files instead.
# EMAIL_ALLOWLIST=you@example.com

# Axiom, for traces. Production and staging deploys need both:
# AXIOM_TOKEN is a personal access token and AXIOM_ORG_ID is the org id from
# Axiom settings. Alchemy creates the traces dataset and an ingest-only token per
# stage. PR previews export into staging's dataset and dev stages ship
# nothing, so neither needs these.
# AXIOM_TOKEN=
# AXIOM_ORG_ID=

# Web origin the API worker trusts; cookies and OAuth callbacks live there
APP_URL=https://tranzfer.localhost