HowlCastHowlCast
Reference

Environment variables

Every env var HowlCast reads, where it's read, and what breaks without it.

The authoritative source is packages/env/src/server.ts and packages/env/src/web.ts. This page is the cheat sheet.

See also Secrets for setup steps.

Server (tv-api worker)

VarRequired?What breaks without it
BETTER_AUTH_SECRETyesAuth refuses to boot
BETTER_AUTH_URLyesMagic-link callbacks point at wrong host
CORS_ORIGINyesAPI rejects browser requests
STREAM_API_KEYfor livestream.* procedures throw
STREAM_API_SECRETfor liveWebhook HMAC verification fails
TWITCH_CLIENT_IDfor setupSetup wizard + emote pipeline disabled
TWITCH_CLIENT_SECRETfor setupSame
RESEND_API_KEYfor prodMagic-link emails fall through to console
MAIL_FROMfor prodResend rejects
SMTP_URLdev onlymailpit fallback

Web (tv worker)

VarRequired?What breaks without it
NEXT_PUBLIC_SERVER_URLyestRPC client points at wrong host
BETTER_AUTH_SECRETyesAuth client refuses to boot
BETTER_AUTH_URLyesBetter Auth couldn't compute callback URL
CORS_ORIGINyesCross-origin tRPC calls rejected
NEXT_PUBLIC_PUBLIC_BUCKET_URLoptionalBranding logos fall back to default mark

Build / deploy

VarWherePurpose
CLOUDFLARE_API_TOKENlocal + GH ActionsAlchemy auth
CLOUDFLARE_ACCOUNT_IDlocal + GH ActionsAlchemy account binding
ALCHEMY_PASSWORDlocal + GH ActionsAlchemy state encryption
ALCHEMY_STATE_TOKENGH ActionsAlchemy reads its state Worker
ALCHEMY_TELEMETRY_DISABLEDoptionalSet to 1 to silence telemetry

Runtime-only (not env vars, but adjacent)

These are bound by alchemy on each worker and aren't strings — they're objects.

BindingWorkerTypePurpose
DBbothD1 databasehowlcast-db
PUBLIC_BUCKETwebR2 buckethowlcast-public
ISR_BUCKETwebR2 buckethowlcast-isr
EMOTES_KVapiKV namespaceEmote map + analytics + throttle

Catalog versions

The repo package.json has a workspace catalog. Run bun install to refresh after editing.

Next: tRPC routes.

On this page